GTK3 - 监控小部件发出的所有信号

时间:2013-02-28 19:40:19

标签: gtk gdk

有没有办法监控使用GTK3从小部件发出的所有信号?我知道event信号是在事件发生之前发出的,但我不确定GTK术语中“事件”和“信号”之间的区别 - 因为这似乎不能捕获所有信号。

我知道GDK有一个函数gdk_set_show_events,但这主要显示从操作系统发送到窗口的事件。是否有GTK3等价物?

2 个答案:

答案 0 :(得分:1)

没有内置功能AFAIK,但我相信你可以自己一起破解:

使用g_signal_lookup获取gtype的所有信号ID。然后在实例的每个信号上使用g_signal_add_emission_hook来注册每当发出特定信号时要调用的钩子。在钩子函数内部,您通过*ihint为您提供了信号ID,g_signal_query可以为您提供打印调试消息所需的所有信息。 (我没有测试它,但它应该工作)

请注意,遗憾的是,这不适用于使用G_SIGNAL_NO_HOOKS定义的信号。

答案 1 :(得分:0)

  

使用 g_signal_lookup 获取所有信号ID

比描述的要复杂一些。要使用 g_signal_lookup ,首先需要一个信号名称。如果要监视独立于对象类型的每个信号,首先需要列出特定实例类型的所有信号。这可以通过 g_signal_list_ids 安排,只需一个 GType 。要获得实例上发出的所有信号,您需要迭代此实例的所有父类型。您可以使用 g_type_parent

来完成此操作

我自己构建了一些实用程序函数,为问题所针对的相同调试目的提供此功能。您可以使用gemu_glib_util_connect_to_all_signals GObject -instance的所有信号连接到Emission-Hook,或者将发射-Hook连接到 GtkWidget -instance及其所有子项与gemu_gtk_util_signal_connect_to_widget_children