The OpenNET Project
 
Поиск (ключи):  ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
ССЫЛКИ НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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




Подпишись на Linux Format и получи один из 3 ценных призов!

Началась подписка на журнал Linux Format на 2010 год. Спешите оформить подписку на единственный в России ежемесячный журнал о Linux!

Все, оформившие подписку на печатную версию журнала, получают диск с архивом журнала Linux Format за 2005-2009г. в подарок. Также в подарок вы получаете именную электронную версию в формате PDF. Теперь вы можете приступить к чтению журнала сразу в момент выхода свежего номера, не дожидаясь, пока вам доставят бумажную версию.

Кроме того, все, оформившие подписку на первую половину или весь 2010 год в интернет-магазине ГНУ/Линуксцентра, автоматически становятся участниками розыгрыша ценных призов:


  Закладки на сайте
  Проследить за страницей
Created 1996-2010 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
RUNNet TopList