Пусть ресурсный файл подготовлен. Как получить доступ к
его данным во время работы программы? Для этого X предоставляет набор
процедур, которые совокупно называются менеджер ресурсов (Resource
Manager), и специальную программу
xrdb
, которая позволяет считать любой ресурсный файл и включить
его в общую таблицу ресурсов сервера. Последняя называется базой данных
ресурсов сервера, и представляет собой область памяти, ассоциированную со
свойством (property)
XA_RESOURCE_MANAGER
корневого окна экрана дисплея.
Наиболее простой является процедура
XGetDefault()
. Она получает имя программы,
имя ресурса и определяет значение последнего. При этом она последовательно
совершает следующие шаги:
файлу «.Xdefaults», который ищется в домашней (home) директории пользователя;
если задана переменная среды XENVIRONMENT, то ресурс ищется в файле, на который указывает эта переменная.
Если ресурс одновременно встречается в
«.Xdefaults
» и файле, определяемом
XENVIRONMENT
, то берется последнее значение.
В примере, приводимом ниже, используется
XGetDefault()
, чтобы получить строку,
которую надо напечатать в окне программы. Предполагается, что имя программы -
«hello
», а строка - ресурс с
именем «helloWorld
», т.е. в
файле «.Xdefaults
» должна быть
помещена, например, следующая запись:
. . . . . . . hello.helloWorld : Hello, World! . . . . . . .
Фрагмент программы, выполняющий чтение из файла ресурсов, будет выглядеть следующим образом:
. . . . . . . . prDisplay : PDisplay; prGC : TGC; nWnd : TWindow; psString : PChar; . . . . . . . . (* Устанавливаем связь с сервером, получаем номер экрана. . .*) . . . . . . . . (* Выбираем события, обрабатываемые программой *) XSelectInput (prDisplay, nWnd, ExposureMask OR KeyPressMask); (* Получаем рисуемую строку *) psString := XGetDefault (prDisplay, 'hello', 'helloWorld'); . . . . . . . . XDrawString ( prDisplay, nWnd, prGC, 10, 50, psString, strlen (psString) ); . . . . . . . .
Обратите внимание на то, что после изменения файла
«.Xdefaults
» он должен быть обработан программой
xrdb
для того, чтобы X сервер включил в свою таблицу
обновленные ресурсы.
Функция XGetDefault()
проста в обращении, но не достаточно гибка.
Так, например, с ее помощью нельзя прочитать содержимое произвольного
файла ресурсов. Рассмотрим другие более развитые возможности.
Вызов XrmInitialize()
инициализирует менеджер ресурсов.
Обращение к этой функции предшествует вызовам остальных процедур.
Procedure XrmParseCommand( prDB : TXrmDatabase { database }; prOptRec : TXrmOptionDescList { table }; nOptRecNum : integer { table_count }; psProgName : pchar { name }; argc : Pointer { argc_in_out }; argv : ppchar { argv_in_out } );cdecl;external;
сканирует строку, с помощью которой вызвана программа,
и «достает» из нее ресурсы и их значения, при этом создается специальная
структура данных - база данных ресурсов. Ресурсы и их значения помещаются
в нее. Указатель на базу данных передается программе через переменную
prDB
. Параметр psProgName
содержит имя программы,
argc
- число опций в командной строке, argv
-
сами опции. Аргумент prOptRec
определяет, как разбирать
командную строку. nOptRecNum
задает число элементов массива
prOptRec
.
В примере, приводимом ниже, определяется, что в командной строке опция
«-bg
» задает цвет фона; «-fg
» - цвет переднего плана,
а опция «-xrm
» позволяет задать в командной строке любой ресурс
программы.
. . . . . . . . const rOptRec : array [0..2] of TXrmOptionDescRec = ( ( '-bg', '*background', XrmoptionSepArg, 'Red' ), ( '-fg', '*foreground', XrmoptionSepArg, 'White' ), ( '-xrm', NIL, XrmoptionResArg, NIL ), ); var rDB : TXrmDatabase; . . . . . . . . //void main (int argc, char **argv) begin . . . . . . . . XrmInitialize( ); XrmParseCommand (rDB, rOptRec, sizeof (rOptRec) / sizeof (rOptRec[0]), argv[0], @argc, argv); . . . . . . . . end.
Процедура XrmGetFileDataBase()
позволяет считать
указанный ресурсный файл и создать по нему в памяти базу данных
ресурсов. Функция
Function XrmGetResource( prDB : TXrmDatabase { database }; psResName : pchar { str_name }; psResClass : pchar { str_class }; psResType : ppchar { str_type_return }; psResVal : PXrmValue { value_return } ) : Tbool;cdecl;external;
считывает ресурс с именем
psResName
и классом
psResClass
из базы данных
*prDB
. После возврата
psResType
есть указатель на строку, указывающую тип ресурса. На
само значение ресурса указывает
psResVal
.
Функция XrmPutResource()
сохраняет ресурс в базе данных.
XrmPutFileDatabase()
записывает базу данных
ресурсов в файл.