我正试图用C和GTK3在linux中构建一个应用程序,我得到了一个关于gdk_window_get_origin的错误,我不知道我做错了什么。
该应用程序运行,窗口确实是我的屏幕大小,但有一个警告,我无法修复它:
(堆栈:7229):Gdk-关键**:11:09:22.221: gdk_window_get_origin:断言'GDK_IS_WINDOW (窗口)‘失败屏幕最大:1600 W X 900 H
下面是一个示例代码:
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
gint width, height;
gtk_init(&argc, &argv);
/// Creating the Window
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/// Get window Size
GdkDisplay *dpy = gtk_widget_get_display( window );
GdkWindow *win = gtk_widget_get_window(window);
GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win);
/// Get window Geometry
GdkRectangle geometry;
gdk_monitor_get_geometry(monitor, &geometry);
width = geometry.width;
height = geometry.height;
g_print("Screen max: %dW X %dH\n", width, height);
// Setting the default size of the Window
gtk_window_set_default_size(GTK_WINDOW(window), width, height );
// Destroy the Window
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
}发布于 2019-02-05 15:26:23
TL;DR:在实现GdkWindow之前,您正在尝试访问GtkWindow。
来自gtk_widget_get_window 文档
如果已实现,则返回小部件的窗口,否则为NULL
和实现
创建与小部件关联的GDK (窗口系统)资源。例如,当小部件实现时,将创建小部件->窗口。通常实现是隐式的;如果您显示一个小部件及其所有父容器,那么这个小部件将自动实现和映射。
您需要在尝试使用gtk_widget_realize访问GdkWindow之前调用gtk_widget_get_display,或者使用对实现信号的回调将访问推迟到窗口实现(在Gtk主循环开始后):
#include <gtk/gtk.h>
void print_geometry(GtkWidget* widget, GdkRectangle* geometry)
{
GdkDisplay *dpy = gtk_widget_get_display(widget);
GdkWindow *win = gtk_widget_get_window(widget);
GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win);
gdk_monitor_get_geometry(monitor, geometry);
gint width = geometry->width;
gint height = geometry->height;
g_print("Screen max: %dW X %dH\n", width, height);
gtk_window_set_default_size(GTK_WINDOW(widget), width, height );
}
int main(int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GdkRectangle geometry;
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(window, "realize", G_CALLBACK(print_geometry), &geometry);
gtk_widget_show_all(window);
gtk_main();
}https://stackoverflow.com/questions/54144406
复制相似问题