2009-08-12 75 views
2

我试图捕获窗口移动时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

回答

3

正如您发现的那样,Luke返回FALSE允许事件传播。这在GTK教程解释here

-1

嗯,我主要使用的gtkmm(GTK的C++包装)。但如果我记得正确,如果你想传播信号给父母,你的处理程序应该返回FALSE(gint),意思是“我没有处理这个事件”。所以我认为,如果你返回(gint)FALSEmycallback,它应该工作。

+0

恐怕这是错误的方法。返回true表示停止进一步传播信号。 – 2017-05-26 14:30:59

+0

@underscore:我的错。我应该检查。 – neuro 2017-05-29 08:31:41

2

神经 - 我不相信这将工作,因为函数签名返回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 将继续正常的事件处理。

+0

由于转换为'G_CALLBACK',它不会导致类型不匹配,但是**需要**作为返回的值,因为我认为在这里调用void函数并且不提供期望的返回值值,这意味着假布尔值将从堆栈的某个无关部分读出,等等。 – 2017-05-26 14:39:59

0

你会获取类型不匹配的错误信号处理程序,因为在GTK你投他们都使用G_CALLBACK不论其实际签名的同一类型。签名是在运行时在GObject的class_init函数中动态声明的,因此无法静态类型检查它们。您需要必须请查阅您感兴趣的信号的文档,并确保处理程序签名与信号的签名匹配。

+1

这两个都很有趣,而且很烦人。我敢肯定,他们有这样的理由来颠覆类型安全,但我不能说这听起来对我来说是个好主意。 – luke 2012-04-06 17:26:48

+0

这应该是对卢克的答案的评论,而不是一篇文章。 @luke当然,他们使用类型擦除的原因是否则他们将不得不为每个可能的函数指针声明和实现任意数量的重载,存储结构等。充其量是不切实际的。 – 2017-05-26 14:25:48