Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

У GTK+ есть собственная система событий и приемников событий, называемых сигналами и обратными вызовами. Их очень легко применять, поскольку для установки обработчика сигнала можно использовать очень полезное свойство языка С, указатель на функцию.

Сначала несколько определений. Сигнал GTK+ порождается объектом типа

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

Примечание

Имейте в виду, что сигнал GTK+ — это нечто иное, чем сигнал UNIX, обсуждавшийся в главе 11.

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

Прототип или заголовок функции обратного вызова обычно похож на следующий:

void a_callback_function(GtkWidget *widget, gpointer user_data);

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

Связать функцию обратного вызова тоже очень просто. Вы вызываете функцию

g_signal_connect
и передаете ей виджет, имя сигнала в виде строки, указатель на функцию обратного вызова и ваш произвольный указатель:

gulong g_signal_connect(gpointer *object, const gchar *name,

 GCallback func, gpointer user_data);

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

В документации по API GTK+ можно найти подробное описание сигналов, порождаемых каждым виджетом.

Примечание

До появления GTK+ 2 для связывания функций обратного вызова применялась функция

gtk_signal_connect
. Она была заменена функцией
g_signal_connect
и не должна применяться во вновь разрабатываемом программном коде.

Вы опробуете функцию

g_signal_connect
в упражнении 16.2.

Упражнение 16.2. Функция обратного вызова

В программе gtk2.c вставьте в свое окно кнопку и свяжите сигнал

clicked
(щелчок мышью по кнопке) с вашей функцией обратного вызова для вывода короткого сообщения:

#include <gtk/gtk.h>

#include <stdio.h>

static int count = 0;

void button_clicked(GtkWidget *button, gpointer data) {

 printf("%s pressed %d time(s) \n", (char *)data, ++count);

}

int main(int argc, char* argv[]) {

 GtkWidget *window;

 GtkWidget *button;

 gtk_init(&argc, &argv);

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 button = gtk_button_new_with_label("Hello World!");

 gtk_container_add(GTK_CONTAINER(window), button);

 g_signal_connect(GTK_OBJECT(button), "clicked",

GTK_SIGNAL_FUNC(button_clicked), "Button 1");

 gtk_widget_show(button);

 gtk_widget_show(window);

 gtk_main;

 return 0;

}

Введите исходный текст программы и сохраните его в файле с именем gtk2.c. Откомпилируйте и скомпонуйте программу аналогично программе gtk1.с из предыдущего упражнения. Запустив ее, вы получите окно с кнопкой. При каждом щелчке кнопки мышью будет выводиться короткое сообщение (рис. 16.5).

Рис. 16.5

Как это работает

Вы добавили два новых элемента в программу gtk2.c: виджет

GtkButton
и функцию обратного вызова.
GtkButton
— это виджет простой кнопки, которая может содержать текст, в нашем случае "Hello World", и порождает сигнал, названный
clicked
, каждый раз, когда кнопку щелкают мышью.

Функция обратного вызова

button_clicked
связана с сигналом
clicked
виджета кнопки с помощью функции
g_signal_connect
:

  • Читать дальше
  • 1
  • ...
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: