我正在尝试在移动窗口时在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
答案 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函数中在运行时动态声明的,因此无法静态地键入它们。您必须查阅您感兴趣的信号的文档,并确保处理程序签名与信号的签名匹配。