Загрузка ресурсов производится инициализационными процедурами, например XtAppInitialize( ), которые конструируют базу данных из различных ресурсных файлов, опций командной строки и других источников. Ниже описывается последовательность шагов Xt, выполняемая при поиске и загрузке ресурсов. Если встречаются две одинаковые спецификации какого-то ресурса widget, то будет использована первая встретившаяся (данная последовательность шагов принята в версии X11R5, в X11R4 поиск и загрузка ресурсов выполняется в обратном порядке).
Первый шаг. Загрузка ресурсов из командной строки. Xt поддерживает стандартное множество опций, комбинации которых могут указываться в командной строке при запуске программы. Они перечислены в таблице, приведенной ниже.
Опция | Имя ресурса | Тип | Описание и примеры |
-bg -background | *background | String | цвет фона -bg blue -background white |
-bd -bordercolor | *borderColor | String | цвет границы -bg black -bordercolor red |
-bw -borderwidth | .borderwidth | Integer | ширина края окна в пикселах -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 | *reverseVideo | None | если значение ресурса "on", то выводимое изображение появится в инверсном виде |
+rv | *reverseVideo | None | изображение будет нормальным |
-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);
}
}
|