Я думаю, читатель меня извинит, если я буду иногда обращаться к терминам оконного программирования, принятых в Windows, поскольку, как это пошло и некруто не звучит, оно мне ближе. Так вот. Аналогично понятию "события" event в Windows, в GTK используется понятие сигнала (signal) и опять-таки события (event). Причем предполагается, что сигнал передается через подсистему событий GTK, а событие - через X. Сигнал передается обрабатывающей процедуре, которая уже делает, что хочет. Надо отметить некоторое отличие обработчиков событий в GTK 2.0 от WinAPI - здесь можно подсоединять более одного обработчика к данному объекту. То есть например - по очереди выполняются несколько обработчиков, очередь определяется местом в списке.
Собственно присоединение обработчика достигается функцией:
int gtk_signal_connect( GtkObject *object, // объект, к которому все совершаемые действия относятся gchar *name, // символическое имя события, например "clicked" GtkSignalFunc func, // обработчик события gpointer func_data ); // данные, передаваемые обработчику события
Соответственно обработчик должен выглядеть так:
void callback_func( GtkWidget *widget, // опять-таки тот самый виджет gpointer callback_data ); // те самые данные
В общем-то я не знаю, нужны ли здесь какие-либо пояснения. Хотелось бы обратить ваше внимание на то, что большинство простых перечислимых типов данных в Gtk имеют собственные эквиваленты (gint, glong, gchar, gpointer). Сделано это из соображений переносимости - мало ли, вдруг кто-нибудь вашу программу будет компилировать на Амиге, мэйнфрейме каком-нибудь или еще где похуже... А разрядность чисел может быть там иной. Это источник нескончаемых ошибок... Так что... Ударим типизацией и разрядностью по...!!! (вместо точек впечатать что-нибудь подходящее)...
Кроме этого способа, есть еще и "усеченный" вариант, имеющий следующий вид:
gint gtk_signal_connect_object( GtkObject *object, gchar *name, GtkSignalFunc func, GtkObject *slot_object );
Его отличие от обыного gtk_signal_connect заключается в том, что обработчик должен описываться как:
void callback_func( GtkObject *object );
Ну здесь видно, что единственный параметр - указатель на объект. Используйте, впрочем, что Вам больше нравится.
В следующем шаге взглянем на события X.