有什么方法可以使用 GTK3 监控从小部件发出的所有信号?我知道event
信号是在事件之前发出的,但我不确定 GTK 术语中“事件”和“信号”之间的区别——因为这似乎不能捕获所有信号。
我知道 GDK 有一个功能gdk_set_show_events
,但这主要显示从操作系统发送到窗口的事件。有GTK3等价物吗?
没有内置函数 AFAIK,但我相信你可以自己破解一些东西:
使用g_signal_lookup获取 gtype 的所有信号 ID。然后在实例的每个信号上使用g_signal_add_emission_hook来注册一个挂钩,以便在发出该特定信号时调用。在钩子函数中,通过 为您提供了信号 id *ihint
,g_signal_query应该从中为您提供打印调试消息所需的所有信息。(我没有测试它,但它应该工作)
请注意,不幸的是,这不适用于使用 G_SIGNAL_NO_HOOKS 定义的信号。
使用g_signal_lookup获取所有信号 id
它比描述的要复杂一些。为了使用g_signal_lookup,您首先需要一个信号名称。如果要独立于对象类型监控每个信号,首先需要列出特定实例类型的所有信号。这可以由g_signal_list_ids为一个GType安排。要获得实例上真正发出的所有信号,您需要遍历此实例的所有父类型。您可以使用g_type_parent来做到这一点。
我自己构建了一些实用程序功能,它们提供此功能用于与问题相同的调试目的。您可以使用 gemu_glib_util_connect_to_all_signals 为GObject实例的所有信号连接 Emission-Hook,或者使用gemu_gtk_util_signal_connect_to_widget_children将 Emission-Hook连接到GtkWidget实例及其所有子代。