Загрузка ресурсов производится инициализационными процедурами, например 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); } } |