Согласно ссылке GObject
g_signal_connect_swapped (экземпляр, detailed_signal, c_handler, данные); подключает функцию GCallback к сигналу для конкретного объекта. Экземпляр, на котором сигнал испускается и данные, будет подкачан при вызове обработчика.
Я не вполне получаю то, что это означает. Делает это означает что data
укажет на объект, которым указываютinstance
и instance
укажет на объект, которым указали data
или я делаю ошибку здесь?
Если прежний имеет место тогда, какова логика позади этого?
Вы правильно понимаете.
Это позволяет вам делать трюки, такие как следующее: у вас есть кнопка (давайте назовем ее кнопкой
), которая должна скрывать другой виджет (давайте назовем его TEXTVIEW
), когда нажата.
Вы можете сделать
g_signal_connect_swapped(button, 'clicked', G_CALLBACK(gtk_widget_hide), textview);
для достижения этого. Когда кнопка нажата, она генерирует сигнал «нажатия», а обратный вызов вызывается с помощью TextView
в качестве первого аргумента, а кнопка
как вторая. В этом случае обратный вызов GTK_WIDGET_HIDE ()
, который принимает только один аргумент, поэтому второй аргумент игнорируется, потому что это то, как работает Calling Convention.
Это так же, как следующее, но короче.
static void
on_button_clicked(GtkButton *button, GtkWidget *textview)
{
gtk_widget_hide(textview);
}
...elsewhere...
g_signal_connect(button, 'clicked', G_CALLBACK(on_button_clicked), textview);
В основном это экономит вас от необходимости написать дополнительную функцию, если вы передаете свой интерфейс. Конечно, может быть некоторое гораздо более практичное использование, которое я никогда не понимал.