首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(堆栈:7229):Gdk-关键**:11:09:22.221: gdk_window_get_origin:断言'GDK_IS_WINDOW (窗口)‘失败

(堆栈:7229):Gdk-关键**:11:09:22.221: gdk_window_get_origin:断言'GDK_IS_WINDOW (窗口)‘失败
EN

Stack Overflow用户
提问于 2019-01-11 10:14:27
回答 1查看 3K关注 0票数 2

我正试图用CGTK3在linux中构建一个应用程序,我得到了一个关于gdk_window_get_origin的错误,我不知道我做错了什么。

该应用程序运行,窗口确实是我的屏幕大小,但有一个警告,我无法修复它:

(堆栈:7229):Gdk-关键**:11:09:22.221: gdk_window_get_origin:断言'GDK_IS_WINDOW (窗口)‘失败屏幕最大:1600 W X 900 H

下面是一个示例代码:

代码语言:javascript
复制
#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();
}
EN

回答 1

Stack Overflow用户

发布于 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主循环开始后):

代码语言:javascript
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54144406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档