(堆栈:7229):Gdk-CRITICAL **:11:09:22.221:gdk_window_get_origin:断言'GDK_IS_WINDOW(window)'失败

时间:2019-01-11 10:14:27

标签: c gtk3

我正在尝试使用CGTK3在Linux Ubuntu中构建应用程序,但收到关于gdk_window_get_origin的错误,我无法弄清楚自己在做什么错。

该应用程序运行,并且Window确实是我的Screen的大小,但是有一个警告我无法解决:

  

(Stack:7229):Gdk-CRITICAL **:11:09:22.221:gdk_window_get_origin:断言'GDK_IS_WINDOW(window)'失败   屏幕最大:1600W X 900H

这是示例代码:

#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();
}

1 个答案:

答案 0 :(得分:0)

TL; DR:您正在尝试在实现GtkWindow之前访问GdkWindow。

来自using System; using System.Runtime.CompilerServices; struct Foo { public int x, y; } class MyClass<T> { public T Value = default(T); public unsafe MyClass(byte[] bytes) { if (bytes.Length < Unsafe.SizeOf<T>()) throw new InvalidOperationException("not enough data"); Value = Unsafe.As<byte, T>(ref bytes[0]); } } static class P { static void Main() { byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; var obj = new MyClass<Foo>(bytes); var val = obj.Value; Console.WriteLine(val.x); // 67305985 = 0x04030201 Console.WriteLine(val.y); // 134678021 = 0x08070605 } } documentation

  

如果已实现则返回窗口小部件的窗口,否则返回NULL

还有gtk_widget_realize

  

创建与窗口小部件关联的GDK(窗口系统)资源。   例如,在实现小部件时将创建小部件->窗口。   通常,实现是隐式发生的;如果您显示一个小部件和所有   它的父容器,那么该小部件将被实现并映射   自动。

您需要先调用gtk_widget_get_window,然后再尝试使用gtk_widget_realize访问GdkWindow,或者使用对{{3}的回调,将访问推迟到实现窗口(在Gtk主循环开始之后)为止}信号:

gtk_widget_get_display