3.1.2. Инициализация программы. Контекст программы.

    Программы, работающие в X, должны выполнить ряд стандартных действий, а именно: установить связь с сервером, задать необходимые свойства для менеджера окон, и выполнить массу других шагов. Если используется Xt, то все это делается одной процедурой - XtInitialize( ). Она инициализирует сам пакет, менеджер ресурсов (resourse manager) X Window, и выполняет другие необходимые операции. Для каждого приложения обращение к XtInitialize( ) или аналогичной процедуре (см. ниже) должно предшествовать всем другим вызовам процедур Xt. После завершения, XtInitialize( ) возвращает идентификатор sheel-widget, который может использоваться как корень дерева объектов программы. XtInitialize( ) имеет следующий прототип:

Widget XtInitialize ( char *psShellName, char *psApplicationClass, XrmOptionDescRec pOptions [ ], Cardinal nNumOpt, Cardinal *argc, char *argv [ ] );

    Первый аргумент процедуры - имя создаваемого функцией shell-объекта. Эта же строка задает и имя программы. Второй аргумент - класс приложения. Как правило, имя класса программы совпадает с именем самой программы , только начинается с заглавной буквы. Менеджер ресурсов использует имя и класс программы для поиска ее параметров в базе данных ресурсов.

    Каждая программа при запуске может задать в командной строке некоторые дополнительные опции. В Xt определены "стандартные" параметры, которые могут быть переданы при запуске программы (см. 3.4.2.). Кроме этого, в командной строке могут быть и нестандартные, свойственные только данному приложению опции. XtInitialize( ) сканирует строку и размещает соответствующие значения ресурсов в базе данных. Если приложение использует нестандартные опции, то следует создать массив структур типа XrmOptionDescRec и передать указатель на него в качестве третьего параметра процедуры XtInitialize( ). При этом четвертый аргумент определяет число элементов массива. Если нестандартные параметры не используются, то в качестве третьего и четвертого параметров следует задавать NULL и 0 соответственно.

    Пятый и шестой аргументы в рассматриваемой процедуре используются для передачи данных в программу из командной строки.

    Обращение к XtInitialize( ) эквивалентно следующей последовательности вызовов (прототипы процедур см. в приложении 2 Ссылка данного издания):

XtToolkitInitialize (. . . . .); /* Инициализация Xt */ XtOpenDisplay (. . . . .); /* Связь с сервером */ XtAppCreateShell (. . . . .); /* Создание shell-widget */

    При инициализации создается также контекст программы - структура, которая хранит всю необходимую информацию о приложении. Контекст помогает программе быть менее "зависимой" от различных модификаций в операционной системе. XtInitialize( ) автоматически создает некоторый контекст (default context). Но тем не менее, начиная с X11R4, рекомендуется, чтобы каждый экземпляр программы сам создавал свой личный контекст. Для этого инициализация задачи должна делаться функцией XtAppInitialize( ).

    Обращение к XtAppInitialize( ) эквивалентно вызову процедур:

XtToolkitInitialize (. . . . .); /* Инициализация Xt */ XtOpenDisplay (. . . . .); /* Связь с сервером */ XtAppCreateShell (. . . . .); /* Создание shell-widget */ XtCreateApplicationContext (. . . . .); /* Создание контекста */