Полное понимание 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 объединяет функции, обсуждаемые в этом разделе.
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 объединяет макросы для запроса состояний, обсуждаемых в этом разделе
GTK_WIDGET_NO_WINDOW(widget)
GTK_WIDGET_REALIZED(widget)
GTK_WDIGET_MAPPED(widget)
GTK_WIDGET_VISIBLE(widget)