GTK+ 2.0 Tutorial

<<< Previous

Getting Started

Next >>>


Теория Сигналов и Обратных вызовов

Note

В версии 2.0, система сигналов перемещена из GTK в GLib, поэтому функции и типы в этой секции имеют приставку "g_" а не "gtk_". Сдесь не говорится о расширениях системы сигналов GLib 2.0 по сравнению с системой сигналов GTK 1.2.

Перед подробным рассмотрением helloworld, мы обсудим сигналы (signals) и обратные вызовы (callbacks). GTK - набор инструментов управляемых событиями, это значит что процесс находясь в функции gtk_main() ждет пока не произойдет событие позволяющее передать управление соответствующей функции.

Такой контроль выполняется с использованием идеи сигналов (idea of "signals"). (Учтите что эта система сигналов не тоже самое что система сигналов Unix, хотя используется идентичная терминология). Когда происходит событие, такое как нажатие кнопки мыши, виджет создаёт ("emitted") сигнал соответствующий нажатию. Так GTK выполняет большинство своих действий. Есть сигналы которые наследуют все виджеты, например сигнал закрытия ("destroy"), а есть специфические сигналы, например сигнал кнопки переключения ("toggled").

Чтобы заставить кнопку работать, нужно настроить обработчик сигналов, который при возникновении события запустит функцию.
Это делается так:

gulong g_signal_connect( gpointer *object, const gchar *name, GCallback func, gpointer func_data );

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

Функция определенная в третьем аргументе должна иметь общую форму:

void callback_func( GtkWidget *widget, gpointer callback_data );

где первым аргументом будет указатель на виджет, который создал сигнал, а второй - указатель на данные как последний аргумент функции g_signal_connect() как показано выше.

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

Другой вызов использованный в примере helloworld:

gulong g_signal_connect_swapped( gpointer *object, const gchar *name, GCallback func, gpointer *slot_object );

g_signal_connect_swapped() тоже самое, что g_signal_connect() только в качестве единственного аргумента используется указатель на GTK объект. Для использования этой функции вызова сигнала, обратный вызов должен иметь форму

void callback_func( GtkObject *object );

где объектом обычно является виджет. Обычно обратный вызов не устанавливается для g_signal_connect_swapped(). Они обычно используются в вызовах GTK функций которые принимают как единственный аргумент сигнал виджета или объект, что и показано в примере helloworld.

Наличие двух функций вызова сигналов объясняется необходимостью обратным вызовам иметь разное количество аргументов. Многие функции в библиотеке GTK принимают только указатель GtkWidget как единственный аргумент, таким образом используя g_signal_connect_swapped() в ваших функциях, вам могут понадобится расширенные данные обратных вызовов.


<<< Previous

Home

Next >>>

Compiling Hello World

Up

Events