Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
Рис. 16.4
Учтите, что вы можете перемещать окно, изменять его размер, сворачивать и раскрывать его на весь экран.
Как это работает
Включить заголовочные файлы, необходимые для библиотек GTK+ и связанных с ними библиотек, можно с помощью одного оператора
#include <gtk/gtk.h>GtkWidgetЗатем для инициализации библиотек GTK+ следует выполнить вызов
gtk_initargcargvСуть примера заключается в вызове функции
gtk_window_new<b>GtkWidget* gtk_window_new(GtkWindowType type);</b>Параметр type может принимать в зависимости от назначения окна одно из двух значений:
□
GTK_WINDOW_TOPLEVEL□
GTK_WINDOW_POPUPПочти всегда вы будете применять значение
GTK_WINDOW_TOPLEVELВызов
gtk_window_newgtk_widget_showgtk_widget_show(window);Эта функция принимает указатель типа
GtkWidgetПоследним вы выполняете вызов функции
gtk_maingtk_main_quitСобытия, сигналы и обратные вызовы
У всех библиотек GUI есть нечто общее. Должен существовать некий механизм для выполнения программного кода в ответ на действие пользователя. Программа, выполняющаяся в режиме командной строки, может позволить себе останов выполнения в ожидании ввода и затем применить нечто вроде оператора выбора для выполнения разных ветвей программы в зависимости от введенных данных. Такой подход нецелесообразен в случае приложения GUI, поскольку оно должно непрерывно реагировать на ввод пользователя, например, ему приходится постоянно обновлять области окна.
У современных оконных систем есть система событий и приемники событий, которым адресована эта задача. Идея заключается в том, что каждый пользовательский ввод обычно с помощью мыши или клавиатуры инициирует событие. Нажатие на клавиатуре, например, вызовет "событие клавиатуры". Затем пишется программный код, который ждет приема такого события и выполняется в случае его возникновения.
Как вы уже видели, эти события генерирует система X Window System, но они мало помогут вам как программисту GTK+, т.к. они очень низкоуровневые. Когда производится щелчок кнопкой мыши, X порождает событие, содержащее координаты указателя мыши, а вам нужно знать, когда пользователь активизирует виджет.
У GTK+ есть собственная система событий и приемников событий, называемых сигналами и обратными вызовами. Их очень легко применять, поскольку для установки обработчика сигнала можно использовать очень полезное свойство языка С, указатель на функцию.
Сначала несколько определений. Сигнал GTK+ порождается объектом типа
GtkObjectИмейте в виду, что сигнал GTK+ — это нечто иное, чем сигнал UNIX, обсуждавшийся в главе 11.
Как программист, использующий GTK+, вы должны заботиться только о написании и связывании функций обратного вызова, поскольку код порождения сигнала — это внутренний программный код определенного виджета.
Прототип или заголовок функции обратного вызова обычно похож на следующий:
<b>void a_callback_function(GtkWidget *widget, gpointer user_data);</b>
Вы передаете два параметра: первый — указатель на виджет, породивший сигнал, второй — произвольный указатель, который вы выбираете самостоятельно, когда связываете обратный вызов. Вы можете использовать этот указатель для любых целей.
Связать функцию обратного вызова тоже очень просто. Вы вызываете функцию
g_signal_connect<b>gulong g_signal_connect(gpointer *object, const gchar *name,</b><b> GCallback func, gpointer user_data);</b>Следует отметить, что для связывания функций обратного вызова нет ограничений. Вы можете иметь много сигналов, связанных с одной и той же функцией обратного вызова, и много функций обратного вызова, связанных с единственным сигналом.
В документации по API GTK+ можно найти подробное описание сигналов, порождаемых каждым виджетом.
До появления GTK+ 2 для связывания функций обратного вызова применялась функция
gtk_signal_connectg_signal_connectВы опробуете функцию
g_signal_connectВ программе 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);