代码之家  ›  专栏  ›  技术社区  ›  luke

GTK窗口配置未传播的事件

  •  2
  • luke  · 技术社区  · 15 年前

    我试图在移动窗口时捕获GTK窗口上的事件。我是这样做的:

    void mycallback(GtkWindow* parentWindow, GdkEvent* event, gpointer data)
    {
        // do something...
    }
    
    ...
    GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);    
    
    gtk_widget_add_events(GTK_WIDGET(window), GDK_CONFIGURE);
    g_signal_connect_(G_OBJECT(window), "configure-event", G_CALLBACK(mycallback), NULL);
    ...
    

    这是有效的-移动窗口时正确调用事件…但当窗口调整大小时也会调用它。这样做的副作用是,如果我不连接事件,就不会像调整窗口的子元素那样调整它们的大小。

    根据 this table 在GTK文档中,gdk_配置事件不会传播。如果事件不传播,如何在允许窗口正确调整大小的同时仍然检测窗口的移动?

    注意:我使用的是GTK版本2.12.9

    4 回复  |  直到 7 年前
        1
  •  3
  •   Matthew Talbert    15 年前

    正如你所发现的,返回false允许事件传播。这在GTK教程中进行了解释。 here

        2
  •  2
  •   luke    15 年前

    神经-我不相信这会起作用,因为函数签名返回的是空的而不是GBoolean。为了笑,我改变了:

    void mycallback(GtkWindow* parentWindow, GdkEvent* event, gpointer data)
    

    gboolean mycallback(GtkWindow* parentWindow, GdkEvent* event, gpointer data)
    

    我本以为这会导致类型与回调类型不匹配,但事实并非如此。像你建议的那样返回真的是行不通的…但奇怪的是,虚假的回归的确如此。在这种情况下,事件 可以 传播。


    编辑:

    根据 GTK tutorial (谢谢马特):

    此函数返回的值 指示事件是否应 由GTK事件进一步传播 操作机构。回归真实 指示事件已 处理过,不应该 进一步传播。返伪 继续正常事件处理。

        3
  •  0
  •   brandon    12 年前

    你会 获取信号处理程序的类型不匹配错误,因为在GTK中,无论实际签名如何,都使用g_回调将它们强制转换为相同的类型。签名是在运行时在gobject的class_init函数中动态声明的,因此无法静态地对其进行类型检查。你 必须 请查阅您感兴趣的信号的文档,并确保处理程序签名与信号的签名匹配。

        4
  •  0
  •   neuro    7 年前

    我主要使用GTKMM(GTK的C++包装器)。但是,如果我记得正确,如果您想将信号传播给父级,您的处理程序应该返回false(gint),这意味着“我没有处理过这个事件”。所以我想如果你回来 (吉特)假的 在里面 我的回拨 ,应该可以。