Процедура инициализации 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( ).