Подтвердить что ты не робот

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

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

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

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

Если это так, то какова логика этого?

4b9b3361

Ответ 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);

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