Шаг 3 - События GTK

Я думаю, читатель меня извинит, если я буду иногда обращаться к терминам оконного программирования, принятых в 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.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 22.06.2002