3.3.2 Осознание, отображение и показывание

Полное понимание Gtk+ требует некоторого минимального понимания X Window System. Эта книга предполагает, что вы имеете понимание на уровне пользователя -- вы знаете, что такое X-сервер, что X может работать по сети, что делает менеджер окон и т.п. Однако, нужны некоторые дополнительные детали для написания программ.

Одна особенно важная деталь: X Window System обслуживает дерево окон. Окно в этом смысле относится к окну X, а не к GtkWindow (это концепция только Gtk+, виджет, который соответствует окну верхнего уровня приложения). Окно в X -- это не видимая пользователю концепция окна, представленная GtkWindow; это в большей степени абстракция, используемая X-сервером для разделения экрана на части. Фон, показываемый вашим X-сервером -- это корневое окно, у него нет родителя. Окна приложений -- это типичные дети корневого окна; большинство оконных менеджеров создают ребенка корневого окна, чтобы держать там рамку заголовка и другие элементы обрамления, и помещают окно приложения внутрь. Оконные менеджеры имеют полный контроль над окнами приложений -- они могут их перемещать, менять их родителя, или минимизировать их, при желании.

В свою очередь, окна приложений могут содержать подокна, которые управляются приложением. Заметьте, что Gtk+ использует библиотеку Gdk, вместо того чтобы пользоваться X напрямую; в Gdk есть тонкая обертка для X окна, называемая GdkWindow. Не путайте GdkWindow и GtkWindow.

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

Большинство виджетов Gtk+ имеют соответствующее GdkWindow. Есть исключения, такие как GtkLabel; на них ссылаются как на безоконные виджеты, и они сравнительно легковесны. Виджеты без связанного с ними GdkWindow рисуют себя в родительское GdkWindow. Некоторые операции, такие как перехват событий, требуют GdkWindow; поэтому они невозможны для безоконных виджетов.

Виджеты проходят через некоторое количество состояний, связанных с их GdkWindow:

В типичном своем коде, вам нужно только вызвать "gtk_widget_show()"; это повлечет осознание и отображение виджета сразу же после осознания и отображение его родителя. Важно понять, что "gtk_widget_show()" не имеет моментального эффекта, она просто планирует показать виджет. Это значит, что вы не должны беспокоиться о показе виджетов в каком-то конкретном порядке; это также значит, что вы не можете сразу же получить доступ к GdkWindow виджета. Иногда требуется получить доступ к GdkWindow; в таких случаях вы захотите вручную вызвать "gtk_widget_realize()" для его создания. "gtk_widget_realize()" также осознает и родителей виджета, если допустимо. Вам нечасто потребуется "gtk_widget_realize()"; если вам все же это понадобится, вероятно, вы подходите к проблеме неправильно.

Разрушение виджета автоматически вызывает последовательность событий в обратном порядке, рекурсивно отменяя осознание дочерних виджетов, а затем и самого виджета.

Список функций 3..10 объединяет функции, обсуждаемые в этом разделе.

Список функций 3..10: Отображение/осознание виджетов
"#include "<gtk/gtkwidget.h>
void gtk_widget_realize(GtkWidget *widget) void gtk_widget_unrealize(GtkWidget *widget) void gtk_widget_map(GtkWidget *widget) void gtk_widget_unmap(GtkWidget *widget) void gtk_widget_show(GtkWidget *widget) void gtk_widget_hide(GtkWidget *widget)

Список макросов 3..1 объединяет макросы для запроса состояний, обсуждаемых в этом разделе

Список макросов 3..1: Предикаты виджетов
"#include "<gtk/gtkwidget.h>
GTK_WIDGET_NO_WINDOW(widget) GTK_WIDGET_REALIZED(widget) GTK_WDIGET_MAPPED(widget) GTK_WIDGET_VISIBLE(widget)


Linux Land
2000-09-15