Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
Далее показано, как бы вы создавали диалоговое окно с кнопками OK и Cancel, которое возвращает
GTK_RESPONSE_ACCEPTGTK_RESPONSE_REJECTGtkWidget *dialog = gtk_dialog_new_with_buttons("Important question", parent_window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);Мы остановились на двух кнопках, но на самом деле на количество кнопок в диалоговом окне нет ограничений. Более того, вы можете выбирать из ряда флагов типа отклика. Флаги
acceptrejectacceptGtkResponseType enumЕстественно, вы должны вставить содержимое в ваше диалоговое окно и для этого объект
GtkDialogGtkVBoxGtkWidget *vbox = GTK_DIALOG(dialog)->vbox;Этот
GtkVBoxgtk_box_pack_startПосле того как диалоговое окно создано, следующий шаг — представить его пользователю и ждать от него ответа. Сделать это можно двумя способами: в модальном режиме, который блокирует весь ввод за исключением диалогового окна, или в немодальном режиме, который воспринимает диалоговое окно как любое другое окно. Давайте сначала рассмотрим запуск модального диалогового окна.
Модальное диалоговое окно
Модальное диалоговое окно заставляет пользователя ответить до того, как сможет выполниться любое другое действие. Оно полезно в тех ситуациях, когда пользователь собирается сделать что-то, сопряженное с серьезными последствиями, или нужно вывести сообщения об ошибках и предупреждениях.
Диалоговое окно можно сделать модальным, установив флаг
GTK_DIALOG_MODALgtk_widget_showgtk_dialog_runКогда пользователь нажимает кнопку (или диалоговое окно уничтожается), функция
gtk_dialog_runintenum<b>typedef enum {</b><b> GTK_RESPONSE_NONE = -1,</b><b> GTK_RESPONSE_REJECT = -2,</b><b> GTK_RESPONSE_ACCEPT = -3,</b><b> GTK_RESPONSE_DELETE_EVENT = -4</b><b> GTK_RESPONSE_OK = -5,</b><b> GTK_RESPONSE_CANCEL = -6,</b><b> GTK_RESPONSE_CLOSE = -7,</b><b> GTK_RESPONSE_YES = -8,</b><b> GTK_RESPONSE_NO = -9,</b><b> GTK_RESPONSE_APPLY = -10,</b><b> GTK_RESPONSE_HELP = -11</b><b>} GtkResponseType;</b>Теперь мы можем объяснить код отклика, передаваемый в функцию
gtk_dialog_new_with_buttonsGtkResponseTypegtk_dialog_runGTK_RESPONSE_NONEДля вызова соответствующих операторов идеально подходит конструкция
switchGtkWidget* dialog = create_dialog();int result = gtk_dialog_run(GTK_DIALOG(dialog));switch(result) {case GTK_RESPONSE_ACCEPT: delete_file(); break;сазе GTK_RESPONSE_REJECT: do_nothing(); break;default: dialog_was_cancelled(); break;}gtk_widget_destroy(dialog);Это все, что есть для простых модальных окон в комплекте инструментов GTK+. Как видите, включен очень небольшой программный код и потрачено немного усилий. В конце нужно только провести чистку с помощью функции
gtk_widget_destroyЕсли вам понадобится немодальное диалоговое окно, все будет не так просто. Вы не сможете использовать функцию
gtk_dialog_runНемодальные диалоговые окна
Мы рассмотрели, как применять функцию
gtk_dialog_rungtk_dialog_runGtkDialogСвязывание сигнала обратного вызова выполняется обычным образом с той лишь разницей, что у функции обратного вызова появляется дополнительный аргумент отклика, играющий ту же роль, что код возврата функции
gtk_dialog_runvoid dialog_button_clicked(GtkWidget *dialog, gint response, gpointer user_data) { switch (response) {