Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

Теперь закроем окно и перейдем к терминалу: окно закрыто, мы его больше не видим, а терминал не освобожден. Наша программа не реагирует на событие закрытия окна. По идее, когда графическая среда закрывает окно, программа должна завершить свою работу. А наша программа этого не делает. Значит, нужно «научить» ее реагировать на события (сигналы) оконной системы. Для этого нажмите в терминале Ctrl+С и отредактируйте исходный текст программы следующим образом:

Листинг 23.3. Добавим реакцию на закрытие окна

#include <gtk/gtk.h>

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

 GtkWidget *window1;

 gtk_init(*argc, &argv);

 window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window1), "destroy",

GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

 gtk_widget_show(window1);

 gtk_main;

 return 0;

}

Функция gtk_signal_connect устанавливает реакцию объекта

window1
на сигнал destroy и вызывает функцию qtk_main_quit для завершения работы программы.

А что если нам при завершении работы программы нужно выполнить какие-нибудь специфические действия, например, удалить временные файлы? Тогда нужно написать свою функцию-обработчик события destroy (листинг 23.4).

Эта функция будет называется

destroy_window1
, и мы «пропишем» ее в функции gtk_signal_connect в качестве обработчика события закрытия окна вместо gtk_main_quit. Делать она не будет ничего, просто вызовет стандартную функцию gtk_main_quit.

Листинг 23.4. Добавляем собственную функцию-обработчик завершения работы

#include <gtk/gtk.h>

void destroy_window1(GtkWidget *widget, gpointer data);

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

 GtkWidget *window1;

 gtk_init(&argc, &argv);

 window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window1), "destroy",

(GtkSignalFunc)destroy_window1, &window1);

 gtk_widget_show(window1);

 gtk_main;

 return(0);

}

void destroy_window1(GtkWidget *widget, gpointer data) {

 gtk_main_quit;

}

23.3.3. Изменение размеров окна

Вам кажется, что окно слишком маленькое и не подходит для нашей программы? Для изменения размеров окна лучше всего использовать функцию

void gtk_window_set_default_size(GtkWindow *window,

 gint width, gint height);

Эта функция устанавливает ширину окна window равной width, а высоту — height.

Для изменения позиции окна на экране используется функция

void gtk_widget_set_uposition(GtkWidget *widget,

 gint coord_x, gint coord_y);

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

Первая функция объявлена в файле

gtk/gtkwindow.h
, а вторая — в файле
gtk/gtkwidget.h
:

#include <gtk/gtkwindow.h>

#include <gtk/gtkwidget.h>

...

gtk_window_set_default_size(window1, 200, 300);

gtk_wigdet_set_uposition(window1, 50, 50);

23.3.4. Обработка сигналов

Перед тем, как перейти к следующему пункту, нужно еще раз рассмотреть функцию gtk_signal_connect. Данной функции нужно передать четыре параметра:

♦ GtkObject *object — объект, которому может быть послан сигнал;

♦ const gchar *name — имя сигнала, например, «destroy»;

♦ GtkSignalFunc func — имя функции обратного вызова, то есть функции, которая будет вызвана для обработки сигнала;

♦ gpointer data — любые данные, которые будут переданы функции-обработчику.

Что такое сигнал? Как только пользователь переместил мышь, оконная среда посылает приложению сигнал, оповещающий о том, что мышь была перемещена. Как только пользователь щелкнул мышью, приложение получит сигнал об этом щелчке. Обрабатывать все сигналы может окно, но удобнее для каждого виджита установить собственную реакцию на события.

Функция, которая обрабатывает сигнал, называется по-разному: функция-обработчик (мы будем использовать именно это название), функция обратного вызова и callback-функция. Такой функции нужно передать два параметра (их передаст сама GTK):

♦ GtkWidget *widget — виджит;

♦ gpointer data — данные.

Параметры, которые нужно передать обработчику, зависят от передаваемого сигнала. Например, если бы мы передавали не сигнал «destroy», а сигнал «delete-event», то нужно было бы указать уже три параметра:

♦ GtkWidget *widget — виджит;

♦ GdkEvent *event — событие;

♦ gpointer data — данные.

Вот наиболее часто используемые сигналы:

♦ button_press_event — нажата левая кнопка мыши;

♦ button_release_event — левая кнопка отпущена;

♦ motion_notify_event — движение мыши;

♦ delete_event — удаление объекта;

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

Я еще барон. Книга III

Дрейк Сириус
3. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще барон. Книга III

Запечатанный во тьме. Том 2

NikL
2. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 2

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Первый среди равных. Книга VIII

Бор Жорж
8. Первый среди Равных
Фантастика:
аниме
фантастика: прочее
эпическая фантастика
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VIII

Законы Рода. Том 14

Андрей Мельник
14. Граф Берестьев
Фантастика:
аниме
фэнтези
эпическая фантастика
5.00
рейтинг книги
Законы Рода. Том 14

Телохранитель Генсека. Том 1

Алмазный Петр
1. Медведев
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Телохранитель Генсека. Том 1

Родословная. Том 1

Ткачев Андрей Юрьевич
1. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 1

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

Сильнейший Столп Империи. Книга 3

Ермоленков Алексей
3. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 3

Имя нам Легион. Том 18

Дорничев Дмитрий
18. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 18

Отверженный. Дилогия

Опсокополос Алексис
Отверженный
Фантастика:
фэнтези
7.51
рейтинг книги
Отверженный. Дилогия

Наследник, скрывающий свой Род

Тарс Элиан
2. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник, скрывающий свой Род