Процедура инициализации XtAppInitialize( ) или аналогичная ей возвращает указатель на объект класса ApplicationShell, который непосредственно контактирует с менеджером окон и является "началом" дерева widget. Но приложение может иметь не одно, а несколько объектов "верхнего уровня". Для их создания можно использовать процедуры XtAppCreateShell( ) (XtVaAppCreateShell( ), XtCreateApplicationShell( )). Создаваемые widget принадлежат, как правило, классу TopLevelShell.
В приводимом ниже примере приложение создает для своих нужд три окна верхнего уровня:
#include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <X11/Shell.h> void main (int argc, char **argv) { Widget topLevel1, topLevel2, topLevel3, CoreWidget1, coreWidget2, coreWidget3; XtAppContext prAppContext; topLevel1 = XtVaAppInitialize (&prAppContext, "Justas1", NULL, 0, &argc, argv, NULL, NULL); topLevel2 = XtAppCreateShell ("justas2", "Justas2", topLevelShellWidgetClass, XtDisplay (topLevel1), NULL, 0); topLevel3 = XtAppCreateShell ("justas3", "Justas3", topLevelShellWidgetCalss, XtDisplay (topLevel1), NULL, 0); coreWidget1 = XtCreateManageWidget ("Core", widgetClass, topLevel1, NULL, 0); coreWidget2 = XtCreateManageWidget ("Core", widgetClass, topLevel2, NULL, 0); coreWidget3 = XtCreateManageWidget ("Core", widgetClass, topLevel3, NULL, 0); XtVaSetValues (coreWidget1, XtNwidth, 100, XtNheight, 100, NULL); XtVaSetValues (coreWidget2, XtNwidth, 200, XtNheight, 200, NULL); XtVaSetValues (coreWidget3, XtNwidth, 400, XtNheight, 400, NULL); XtRealizeWidget (topLevel1); XtRealizeWidget (topLevel2); XtRealizeWidget (topLevel3); XtAppMainLoop (prAppContext); } |
Заметим, что существует еще один способ создания в программе нескольких объектов "верхнего уровня". В частности, можно поступать следующим образом: сначала создается shell-объект класса ApplicationShell, который никогда не показывается на экране, все остальные shell-объекты "верхнего уровня" создаются, как "потомки" данного "родителя" с помощью процедуры XtCreatePopupShell( ).