Что делает g_signal_connect_swapped()?

Согласно ссылке GObject

g_signal_connect_swapped(экземпляр, detail_signal, c_handler, данные); соединяет функцию GCallback с сигналом для конкретного объекта. Экземпляр, на котором испускается сигнал, и данные будут заменены местами при вызове обработчика.

Я не совсем понимаю, что это значит. Означает ли это, что data будет указывать на объект, на который указывает instance, а instance будет указывать на объект, на который указывает data, или я здесь ошибаюсь?

Если первое имеет место, то какая логика стоит за этим?


person Aaron S    schedule 31.01.2010    source источник


Ответы (1)


Вы правильно понимаете.

Это позволяет вам делать следующие трюки: У вас есть кнопка (назовем ее button), которая должна скрывать другой виджет (назовем ее textview) при нажатии.

Затем вы можете сделать

g_signal_connect_swapped(button, 'clicked', G_CALLBACK(gtk_widget_hide), textview);

чтобы добиться этого. Когда кнопка нажата, она генерирует сигнал «нажато», и обратный вызов вызывается с textview в качестве первого аргумента и button в качестве второго. В этом случае обратный вызов gtk_widget_hide() принимает только один аргумент, поэтому второй аргумент игнорируется, потому что так работает соглашение о вызовах C.

Это то же самое, что и следующее, но короче.

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);

По сути, это избавляет вас от необходимости писать дополнительную функцию, если вы вручную программируете свой интерфейс. Конечно, может быть какое-то гораздо более практическое применение, которого я никогда не понимал.

person ptomato    schedule 31.01.2010
comment
Это также хорошо для того, чтобы обычно вызывать обработчики событий от дочерних элементов с self в качестве первого аргумента, например: g_signal_connect_swapped (self->some_internal_child, "button-press-event", (GCallback)my_mouse_handler, self). Делать это без swapped означало бы иметь уродливую подпись на принимающей стороне с 1-м аргументом, который, вероятно, не интересен в большинстве случаев, и который вы все равно часто можете получить от self->. Или, по крайней мере, так я использовал это до сих пор... - person underscore_d; 06.07.2017