GTK3 - Мониторинг всех сигналов, исходящих от виджета

Есть ли способ отслеживать все сигналы, излучаемые виджетом с помощью GTK3? Я знаю, что сигнал event испускается перед событием, но я не уверен в различии между "событием" и "сигналом" в терминологии GTK, так как это, похоже, не охватывает все сигналы.

Я знаю, что в GDK есть функция gdk_set_show_events, но она в основном показывает события, которые отправляются в окно из операционной системы. Есть ли эквивалент GTK3?


person bcoughlan    schedule 28.02.2013    source источник
comment
Сигналы — это функциональность GObject (т. е. системы типов), которая не ограничивается Gtk. События - это терминология Gtk, и это просто обернутые сообщения от сервера отображения. Когда виджет получает события, он обычно информирует вас о них с помощью сигналов. Другие вещи, которые не являются прямым результатом сообщений сервера отображения (например, нажатия кнопок), также передаются с помощью сигналов.   -  person Ancurio    schedule 01.03.2013


Ответы (2)


AFAIK не имеет встроенной функции, но я уверен, что вы можете сами что-то взломать:

Используйте g_signal_lookup, чтобы получить все идентификаторы сигналов для gtype. Затем используйте g_signal_add_emission_hook для каждого signal вашего экземпляра, чтобы зарегистрировать хук, который будет вызываться всякий раз, когда испускается этот конкретный сигнал. Внутри функции ловушки вам предоставляется идентификатор сигнала через *ihint, из которого g_signal_query должен предоставить вам всю информацию, необходимую для печати отладочных сообщений. (не проверял, но должно работать)

Обратите внимание, что это, к сожалению, не будет работать для сигналов, определенных с помощью G_SIGNAL_NO_HOOKS.

person Ancurio    schedule 01.03.2013

Используйте g_signal_lookup, чтобы получить все идентификаторы сигналов.

Это немного сложнее, чем описано. Чтобы использовать g_signal_lookup, вам сначала нужно имя сигнала. Если вы хотите отслеживать каждый сигнал независимо от типа объекта, вам сначала нужно перечислить все сигналы определенного типа экземпляра. Это можно организовать с помощью g_signal_list_ids ровно для одного отдельного GType. Чтобы получить действительно ВСЕ сигналы, испускаемые экземпляром, вам необходимо выполнить итерацию по всем родительским типам этого экземпляра. Это можно сделать с помощью g_type_parent.

Я сам создал некоторые служебные функции, которые предоставляют эту функциональность для той же цели отладки, что и вопрос. Вы можете подключить Emission-Hook для всех сигналов экземпляра GObject с помощью gemu_glib_util_connect_to_all_signals или подключить эмиссионный хук к экземпляру GtkWidget и всем его дочерним элементам с помощью gemu_gtk_util_signal_connect_to_widget_children.

person Emanuel Schmidt    schedule 14.03.2017