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);
     }
}