3.3.7. Программы, имеющие много объектов (окон) верхнего уровня.

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