GTK窗口配置不传播的事件

时间:2009-08-12 16:46:13

标签: c++ c events gtk

我正在尝试在移动窗口时在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);
...

这样可以 - 在移动窗口时正确调用该事件...但是在调整窗口大小时也会调用它。这样做的副作用是不调整窗口的子元素,就像我没有连接事件一样。

根据GTK文档中的this table,GDK_CONFIGURE事件不会传播。如果事件没有传播,我怎样才能检测窗口的移动,同时允许它正确调整大小?

注意:我正在使用GTK版本2.12.9

4 个答案:

答案 0 :(得分:3)

Luke,正如您所发现的,返回FALSE允许事件传播。这在gtk教程here

中有解释

答案 1 :(得分:2)

Neuro-我不相信这会起作用,因为函数签名返回void而不是gboolean。为了笑容,我改变了:

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

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

我原以为这会导致与回调类型不匹配,但事实并非如此。像你建议的那样返回TRUE不起作用......但奇怪的是返回FALSE。在这种情况下,似乎事件可以传播。


修改

根据GTK tutorial(感谢马特):

  

此函数返回的值   指示事件是否应该   由GTK事件进一步传播   处理机制。返回TRUE   表示事件已经发生   处理,它不应该   进一步传播。返回FALSE   继续正常的事件处理。

答案 2 :(得分:0)

好吧,我主要使用gtkmm(GTK的C ++包装器)。但是,如果我没记错,如果你想将信号传播给父,你的处理程序应该返回FALSE(gint),意思是“我没有处理过这个事件”。所以我认为如果你在 mycallback 中返回(gint)FALSE ,它应该可以工作。

答案 3 :(得分:0)

对于信号处理程序,会出现类型不匹配错误,因为在gtk中,无论实际签名如何,都使用G_CALLBACK将它们全部转换为相同的类型。签名是在GObject的class_init函数中在运行时动态声明的,因此无法静态地键入它们。您必须查阅您感兴趣的信号的文档,并确保处理程序签名与信号的签名匹配。