Инициализация

Первая задача Motif приложения заключается в инициализации библиотеки компонентов. Большинство приложений выполняют инициализацию с помощью вызова подпрограммы XtAppInitialize. Эта удобная подпрограмма которая совмещает несколько шагов инициализации, каждый из которых приложение может выполнить самостоятельно посредством вызова специализированных подпрограмм Xt:

  1. Инициализация внутренних структур библиотеки компонентов. Приложение может сделать это посредством вызова XtToolkitInitialize.

  2. Создание контекста приложения. Xt использует эту конструкцию для хранения информации связанной с каждым экземпляром приложения. Его назначение - обеспечение возможности запуска нескольких экземпляров приложения в едином адресном пространстве. Большинству приложений требуется только создать контекст приложения и передавать его подпрограммам, которые требуют его указания в качестве параметра. Для контекста приложения используется тип данных XtAppContext. Приложение может самостоятельно создать контекст приложения посредством явного вызова подпрограммы XtCreateApplicationContext.

  3. Открыть соединение с дисплеем и привязать его к контексту приложения. Когда приложение использует XtAppInitialize, спецификация дисплея извлекается из командной строки вызванного приложения или из окружения пользователя. После открытия дисплея Xt строит базу данных ресурсов используя для ее построения значения ресурсов по умолчанию и параметры командной строки вызванного приложения. Процесс создания этой базы данных подробнее описан в следующем разделе. Приложение может выполнить эти шаги непосредственным вызовом подпрограммы XtOpenDisplay. Елси же приложение уже имеет дисплей, открытый посредством XOpenDisplay, то оно может привязать дисплей к контексту приложения и построить начальную базу данных ресурсов посредством вызова XtDisplayInitialize.

  4. Создать видгет оболочки верхнего уровня для приложения. XtAppInitialize создает оболочку приложения (ApplicationShell) и возвращает ее в качестве своего результата. Приложение может создать оболочку верхнего уровня посредством вызова подпрограммы XtAppCreateShell.

Пример 3-1. Этот пример простого вызова XtAppInitialize:

    int main (int args, char **argv)
    {
        Widget       app_shell;
        XtAppContext app;
        app_shell = XtAppInitialize (&app, "Example",
            (XrmOptionDescList) NULL, 0, &argc, argv,
            (String *) NULL, (ArgList) NULL, 0);
    }

Начальная база данных ресурсов

Подпрограмма XtDisplayInitialize строит начальную базу данных ресурсов для приложения. Приложению редко требуется производить непосредственный вызов этой подпрограммы; она вызывается из XtOpenDisplay, которая вызывается из XtAppInitialize.

XtDisplayInitialize строит отдельную базу данных ресурсов для каждого дисплейного соединения. Начальная база данных ресурсов комбинирует значения ресурсов полученные из командной строки, дисплея, файла умолчаний класса приложения и файлов умолчаний пользователя, которые могут быть специализированы соответственно для приложения или для компьютера на котором приложение запущено. Значения по умолчанию для класса приложения и пользовательские значения по умолчанию для каждого приложения могут быть еще более специализированны в соответствии с используемым естественным языком и, возможно, в соответствии с ресурсом предпочтений общего назначения. Ресурсы в начальной базе данных могут быть заданы для конкретного виджета или класса виджетов, а также и для приложения в целом. Когда приложение создает виджеты значения, указанные в базе данных, чаще всего являются исходными для начальных значений ресурсов виджета.

В оставшейся части этого раздела описавается последовательность в которой XtDisplayInitialize загружает каждый компонент базы данных и как она определяет расположение этого компонента.

Пути поиска файлов

В процессе загрузки значений по умолчанию класса приложения и пользовательских умолчаний для приложения XtDisplayInitialize вызывает XtResolvePathname для определения файлов, которые необходимо прочитать. XtResolvePathname использует пути поиска файлов. Каждый путь является набором шаблонов, которые могут содержать специальные последовательности символов вместо которых при поиске файлов XtResolvePathname подставляет значения времени исполнения. Она использует следующие подстановки при построении пути:

  • %N заменяется на имя класса приложения, определенное аргументом application_class при вызове XtAppInitialize, XtOpenDisplay или XtDisplayInitialize.

  • %C заменяется на значение ресурса предпочтений.

  • %L заменяется на спецификацию используемого для дисплея естественного языка. Она может быть взята из ресурса xnlLanguage, локализации приложения или соответствующей процедуры обратного вызова приложения. Смотрите главу 11 для получения более подробной информации. Формат спецификации языка зависит от реализации, она может содержать компоненты языка, территории и набора знаков.

  • %l заменяется на компоненту языка из спецификации языка.

  • %t заменяется на компоненту территории из спецификации языка.

  • %c заменяется на компоненту набора символов из спецификации языка.

  • %% заменяется на %.

Если спецификация языка не задана или одна из компонент спецификации отсутствует, соответствующий элемент заменяется на NULL.

Пути состоят из последовательности елементов, разделенных двоеточиями. Каждый элемент рассматривается как имя файла. Элементы просматриваются слева на право пока один из них не укажет на существующий файл. Перед просмотром производятся подстановки.

Замечание

Xt использует соглашение X/Open по слиянию нескольких подряд идущих символов '/' в единственный символ '/'.

Компоненты начальной базы данных

Функция XtDisplayInitialize загружает базу данных ресурсов слиянием ресурсов из следующих источников в порядке превосходства (т.е. каждый компонент имеет превосходство перед последующими компонентами):

  • Командная строка приложения.

  • Специфичный для компьютера файл ресурсов окружения пользователя на локальном компьютере.

  • Специфичные для экрана ресурсы для экрана по умолчания на дисплее.

  • Свойство ресурсов сервера или ресурсный файл предпочтений пользователя на локальном компьютере.

  • Специфичный для приложения ресурсный файл пользователя на локальном компьютере.

  • Специфичный для класса приложения ресурсный файл на локальном компьютере.

Спецификации в командной строке

XtDisplayInitialize вызывает функцию XrmParseCommand менеджера ресурсов X для извлечения значений ресурсов из командной строки посредством которой пользователь запустил приложение. Аргументы командной строки и их количество передаются посредством параметров argv и argc в подрограммы XtAppInitialize, XtOpenDisplay или XtDisplayInitialize. Xt поддерживает стандартный набор аргументов командной строки, таких как -background и -geometry, для задания значений ресурсам. Приложение может указать дополнительные аргументы в параметрах подпрограмм XtAppInitialize, XtOpenDisplay или XtDisplayInitialize. Пользователь может применять аргумент -xrm для установки любого ресурса в базе данных.

Специфичные для компьютера ресурсы пользователя

Для загрузки специфичных для компьютера ресурсов окружения пользователя XtDisplayInitialize использует имя файла определенное переменной окружения XENVIRONMENT. Если XENVIRONMENT не определена, то XtDisplayInitialize ищет файл $HOME/.Xdefaults-host, где host имя компьютера, на котором запущено приложение (т.е. имя компьютера клиента, а не сервера).

Специфичные для экрана ресурсы

Для загрузки специфичных для экрана ресурсов XtDisplayInitialize просматривает свойство SCREEN_RESOURCES у корневого окна на экране по умолчанию дисплея. Свойство SCREEN_RESOURCES обычно является результатом выполнения команды xrdb когда некоторые ресурсы не задаются для всех экранов.

Замечание

Когда Xt требуется получить ресурсы для экрана отличного от используемого по умолчанию на дисплее, например, если приложение создает виджет на другом экране, он использует свойство SCREEN_RESOURCES этого экрана вместо свойства SCREEN_RESOURCES экрана по умолчанию.

Ресурсы сервера или ресурсы предпочтений пользователя

Для загрузки свойства ресурсов сервера или файла ресурсов предпочтений пользователя XtDisplayInitialize просматривает свойство RESOURCE_MANAGER у корневого окна экрана 0 на дисплее. Свойство RESOURCE_MANAGER обычно является результатом выполнения команды xrdb когда некоторые ресурсы задаются для всех экранов. Если это свойство не существует, то XtDisplayInitialize просматривает файл $HOME/.Xdefaults.

Пользовательский файл приложения

Для загрузки пользовательского файла ресурсов приложения XtDisplayInitialize выполняет следующие шаги:

  1. Использует XUSERFILESEARCHPATH для поиска файла, выполняя необходимые подстановки.

  2. Если это не дает результата или же XUSERFILESEARCHPATH не определена и определена XAPPLRESDIR использует зависимый от реализации путь, содержащий по меньшей мере семь элементов, в следующем порядке и с следующими префиксами директорий и подстановками:

    • $XAPPLRESDIR с %C, %N, %L или с %C, %N, %l, %t, %c

    • $XAPPLRESDIR с %C, %N, %l

    • $XAPPLRESDIR с %C, %N

    • $XAPPLRESDIR с %N, %L или с %N, %l, %t, %c

    • $XAPPLRESDIR с %N, %l

    • $XAPPLRESDIR с %N

    • $HOME с %N

    где $XAPPLRESDIR - значение переменной окружения XAPPLRESDIR, а $HOME - домашний каталог пользователя.

  3. Если XAPPLRESDIR не определена используется определяемые реализацией пути поиска, содержащие по крайней мере шесть элементов в следующей последовательности и со следующими каталогами и подстановками:

    • $HOME с %C, %N, %L или с %C, %N, %l, %t, %c

    • $HOME с %C, %N, %l

    • $HOME с %C, %N

    • $HOME с %N, %L или с %N, %l, %t, %c

    • $HOME с %N, %l

    • $HOME с %N

Ресурсный файл класса приложения

Для загрузки специфичного для класса приложения файла ресурсов XtDisplayInitialize производит необходимые подстановки в путях определенных переменной окружения XFILESEARCHPATH. Если это не дает результата или XFILESEARCHPATH не определена XtDisplayInitialize использует определяемый реализацией путь поиска, содержащий по крайней мере шесть элементов в следующем порядке и с необходимыми подстановками:

  • %C, %N, %S, %T, %L или %C, %N, %S, %T, %l, %t, %c

  • %C, %N, %S, %T, %l

  • %C, %N, %S, %T

  • %N, %S, %T, %L или %N, %S, %T, %l, %t, %c

  • %N, %S, %T, %l

  • %N, %S, %T

где подстановка для %S обычно NULL, а подстановка для %T обычно app-defaults.

Если специфичный для класса приложения файл ресурсов не найдет, то XtDisplayInitialize просматривает ресурсы отката, которые могут быть заданы при вызове XtAppInitialize или XtAppSetFallbackResources.