После небольшого праздничного перерыва продолжим изучать GTK на примере разработки реального приложения.
Разберём несколько функций, управляющих состоянием окна приложения. В разных
операционных системах возможны небольшие отличия, поскольку основная работа
ложится на менеджер окон.
При создании окна мы получаем указатель GtkWindow *window, с которым дальше
будем работать. Всё нижесказанное относится также и к диалоговым окнам. Вот
некоторые функции для управления состоянием окна:
Прототип функции
Описание
void gtk_window_iconify(GtkWindow *window);
Минимизировать окно, то есть свернуть окно в панель задач
void gtk_window_deiconify(GtkWindow *window);
Восстановить окно из панели задач
void gtk_window_maximize(GtkWindow *window);
Развернуть окно на весь экран
void gtk_window_unmaximize(GtkWindow *window);
Вернуть окну нормальное состояние
void gtk_window_fullscreen(GtkWindow *window);
Развернуть окно на весь экран + убрать рамку и заголовок.
Переместить окно в положение position, которое может принимать следующие
значения: GTK_WIN_POS_NONE - не менять положение
окна GTK_WIN_POS_CENTER - по центру экрана, GTK_WIN_POS_MOUSE - в текущей
позиции мыши, GTK_WIN_POS_CENTER_ALWAYS - по центру экрана, даже при
изменении размеров окна GTK_WIN_POS_CENTER_ON_PARENT - в центре родительского
окна
Узнать текущее положение окна, в экранных координатах. В каком углу
находится точка отсчёта можно узнать функцией: GdkGravity gtk_window_get_gravity(GtkWindow *window)
Разберём на
примере. Перемещать окно и менять его размеры довольно просто, можно обойтись и
без примера. Добавим в нашем приложение просмотра графических файлов
image-viewer возможность перевода в режим Fullscreen. По клавише 'пробел' окно
приложения будет расширяться на весь экран, а при повторном нажатии пробела окно
будет возвращаться к прежним размерам.
Все изменения будут происходить в файле image_viewer.c Для начала
подключим обработчик нажатия клавиш к главному окну:
//
обработчик нажатия клавиш static gboolean callback_press_key(GtkWidget
*widget, GdkEventKey *event, gpointer user_data) { //
если нажали клавишу 'пробел' if(event->keyval==GDK_space)// код
независим от раскладки клавиатуры и языка ввода
{ // Узнаём состояние окна
GdkWindowState state = gdk_window_get_state(window->window);
if(state & GDK_WINDOW_STATE_FULLSCREEN)
// Если окно на весь экран - сворачиваем к нормальным размерам
gtk_window_unfullscreen(GTK_WINDOW(window));
else // Если окно не на весь экран -
разворачиваем его на весь экран
gtk_window_fullscreen(GTK_WINDOW(window));
} return FALSE;// разрешаем программе дальше
обрабатывать этот сигнал }
Для макроопределения GDK_space понадобится подключить
заголовочный файл
#include "gdk/gdkkeysyms.h" В обработчике первым делом проверяем
какую клавишу нажали, если пробел, тогда идём дальше. Переменная event->keyval содержит код
нажатой клавиши, причём именно код клавиши на клавиатуре, который не зависит ни
от регистра, ни от языка; если требуется узнать нажатую клавишу с учётом языка
ввода, проще пользоваться переменной event->string.
Узнаём состояние окна: GdkWindowState state =
gdk_window_get_state(window->window); При этом пользуемся
GDK функцией и поэтому передаём в качастве параметра GdkWindow. (P.S. Любой виджет, в том числе и GtkWindow
имеет указатель на GDK окно: GdkWindow *gdk_window =
GTK_WIDGET(widget)->window )
Проверяем, развёрнуто ли окно на весь экран: if(state
& GDK_WINDOW_STATE_FULLSCREEN)
Если нет, то разверачиваем: gtk_window_fullscreen(GTK_WINDOW(window)); иначе
- сворачиваем: gtk_window_unfullscreen(GTK_WINDOW(window));
В развёрнутом на весь экран окне изчезают рамки и заголовок, но полоска меню
остаётся, мы её трогать не будем, но если хочется и её убрать, тогда нужно будет
удалить меню из родительского контейнера через: void gtk_container_remove(GtkContainer *container, GtkWidget *widget). А после восстановления в
нормальный режим - снова упаковать. Причём, чтобы меню не уничтожилось при
удалении из контейнера, нужно предварительно увеличить число ссылок на него
функцией: gpointer g_object_ref (gpointer object).
Как вариант, можно просто скрыть меню: void gtk_widget_hide(GtkWidget *widget), а
потом отобразить: void gtk_widget_show(GtkWidget *widget) или void gtk_widget_show_all(GtkWidget *widget).