【问题标题】:GTK3 - Monitoring all signals emitted from a widgetGTK3 - 监控从小部件发出的所有信号
【发布时间】:2013-02-28 19:40:19
【问题描述】:

有什么方法可以用 GTK3 监控小部件发出的所有信号吗?我知道event 信号是在事件之前发出的,但我不确定 GTK 术语中“事件”和“信号”之间的区别——因为这似乎不能捕获所有信号。

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

【问题讨论】:

  • 信号是 GObject(即类型系统)功能,不限于 Gtk。事件是 Gtk 术语,只是来自显示服务器的打包消息。当一个小部件接收到事件时,它通常会使用信号通知您它们。其他不是显示服务器消息直接结果的事情(例如按钮点击)也使用信号传输。

标签: gtk gdk


【解决方案1】:

没有内置函数AFAIK,但我相信你可以自己破解一些东西:

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

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

【讨论】:

    【解决方案2】:

    使用g_signal_lookup获取所有信号id

    这比描述的要复杂一些。为了使用 g_signal_lookup,您首先需要一个信号名称。如果要独立于对象类型监控每个信号,首先需要列出特定实例类型的所有信号。这可以由g_signal_list_ids 安排为恰好一个GType。要获得实例上真正发出的所有信号,您需要遍历此实例的所有父类型。您可以使用 g_type_parent 来做到这一点。

    我自己构建了一些实用程序功能,提供此功能用于与问题相同的调试目的。您可以使用gemu_glib_util_connect_to_all_signalsGObject 实例的所有信号连接 Emission-Hook,或者使用 @ 将 Emission-Hook 连接到 GtkWidget 实例及其所有子实例987654322@.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      相关资源
      最近更新 更多