3.4.2. Создание базы данных ресурсов программы.

    Загрузка ресурсов производится инициализационными процедурами, например XtAppInitialize( ), которые конструируют базу данных из различных ресурсных файлов, опций командной строки и других источников. Ниже описывается последовательность шагов Xt, выполняемая при поиске и загрузке ресурсов. Если встречаются две одинаковые спецификации какого-то ресурса widget, то будет использована первая встретившаяся (данная последовательность шагов принята в версии X11R5, в X11R4 поиск и загрузка ресурсов выполняется в обратном порядке).

    Первый шаг. Загрузка ресурсов из командной строки. Xt поддерживает стандартное множество опций, комбинации которых могут указываться в командной строке при запуске программы. Они перечислены в таблице, приведенной ниже.

Опция Имя ресурса Тип Описание и примеры
-bg
-background
*background String цвет фона
-bg blue
-background white
-bd
-bordercolor
*borderColorString цвет границы
-bg black
-bordercolor red
-bw
-borderwidth
.borderwidthInteger ширина края окна в пикселах
-bw2
-display .display String дисплей для связи с сервером
-display odessa: 0
-fg
-foreground
*foreground String цвет переднего плана
-fg red
-foreground black
-fn
-font
*font String имя шрифта
-fn 9x15
-font 9x15
-geometry .geometry String размер и положение окна
-geometry = 80x24
-iconic .iconic None если значение опции "on", то окно программы будет показано в минимизированном виде.
-name .name String имя программы
-name Justas
-reverse
-rv
*reverseVideoNone если значение ресурса "on", то выводимое изображение появится в инверсном виде
+rv *reverseVideoNone изображение будет нормальным
-title .title String заголовок окна программы
-title Justas
-xrm значение аргумента String ресурс и его значение задаются аргументом опции
-xrm "*.height: 100"

    В данной таблице точка, предшествующая имени ресурса, означает, что опции могут быть использованы для установки ресурса только в widget, принадлежащих классу TopLevelShell или его подклассу. В свою очередь, "*" означает, что ресурс может быть установлен для произвольного widget приложения.

    Инициализационные процедуры понимают также любую уникальную аббревиатуру предопределенных опций, например:

justas -back green

    Xt предоставляет также возможность передавать в командной строке нестандартные опции. Для того, чтобы определить их и получить соответствующие значения, используются третий и четвертый аргументы процедуры XtAppInitialize( ) (XtVaAppInitialize( ), XtInitialize( )).

    Ниже приведен фрагмент кода и пример командной строки, иллюстрирующие описанный выше механизм получения значений ресурсов.

. . . . . . . static XrmOptionDescRec arCommandOptions [ ] = { { "-delay", "*delay", XrmoptionSepArg, NULL }, { "-debug", "*debug", XrmoptionNoArg, "True" }, } ; . . . . . . . main (int argc, char **argv) { Widget prWidget; . . . . . . . prWidget = XtInitialize (argv [0], "Justas", arCommandOptions, XtNumber (arCommandOptions), &argc, argv); . . . . . . . }

    Пример командной строки:

justas -debug -delay 15

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

    Второй шаг. Загружается файл, на который указывает переменная среды XENVIRONMENT (если таковая задана). Данная переменная содержит полный путь к файлу, включая и его имя. Если же переменная XENVIRONMENT не установлена, то менеджер ресурсов будет пытаться подгрузить файл ".Xdefaults-<hostname>", находящийся в "домашней" (home) директории пользователя. Здесь <hostname> - это имя компьютера, на котором происходит запуск программы.

    Третий шаг. Если "корневое" окно (root window) экрана имеет ресурсы, загруженные в "свойство" RESOURSE_MANAGER (RESOURSE_MANAGER property) программой xrdb, то они также добавляются в базу данных ресурсов приложения. Если же "корневое" окно не имеет такого "свойства", то подгружаются данные, определенные в файле ".Xdefaults", находящемся в "домашней" (home) директории пользователя.

    Четвертый шаг. Если задана переменная среды XAPPLRESDIR, то менеджер ресурсов будет пытаться загрузить ресурсный файл с именем "<$XAPPLRESDIR> / <classname>", где <classname> имя класса программы. Если файла нет, Xt пытается прочитать другой файл с именем "<$APPLRESDIR> / <$LANG> / <classname>" ( здесь LANG - переменная среды, задающая язык системы). Если переменная XAPPLRESDIR не установлена, то соответствующие файлы ищутся в "домашней" (home) директории. Отметим, что в системе могут быть предусмотрены и некоторые другие переменные среды, позволяющие задать путь к файлу ресурсов (например, XUSERFILESEARCHPATH и др.), но для целей данного издания приведенной информации достаточно.

    Пятый шаг. Xt ищет следующий файл:

"/usr/lib/X11/app-derfaults/<classname>"

    Если этот файл существует, он загружается в базу данных ресурсов .

    Шестой шаг. Рассматриваются параметры, переданные с помощью пятого и шестого аргументов инициализационных процедур. Данная возможность может быть использована в случае, если значение какого-либо ресурса осталось неопределенным. Передаваемые через параметры процедур значения ресурсов представляются в виде массива указателей на строки. Каждая строка имеет вид: "<описание ресурса> : <значение ресурса>". Здесь <описание ресурса> такое же, как и в ресурсном файле. Ниже приведен пример этого способа определения параметров программы.

#include <X11/Intrinsic.h> #include <X11/StringDefs.h> extern void DrawHellowString( ); void main (int argc, char **argv) { Widget topLevel, fallback; XtAppContext prAppContext; static String Fallback [ ] = { "fallback*background : blue", "fallback.Core.width : 200", "fallback.Core.height : 200", NULL, } ; topLevel = XtVaAppInitialize (&prAppContext, "Fallback", NULL, 0, &argc, argv, Fallback, NULL); fallback = XtCreateManagedWidget ("Core", widgetClass, topLevel, NULL, 0); XtAddEventHandler (fallback, ExposureMask, False, DrawHellowString, NULL); XtRealizeWidget (topLevel); XtAppmainLoop (prAppContext); } void DrawHellowString (Widget prWidget, XtPointer pData, XEvent *prEvent, Boolean *pbContinue) { Display *prDisplay = XtDisplay (prWidget); Window nWindow = XtWindow (prWidget); GC prGC; if (prEvent->type == Expose) { prGC = XCreateGC (prDisplay, nWindow, 0, NULL); XDrawString (prDisplay, nWindow, prGC, 10, 50, "Hellow, world!", strlen ("Hellow, world!") ); XFreeGC (prDisplay, prGC); } }