Многие программы имеют различные заранее подготавливаемые данные, которые в терминах X называются - ресурсами. Это могут быть цвета окон приложения, строки сообщений пользователю и т.д.
Как правило, программисты создают ресурсы каждый по-своему. В X Window сделана попытка унифицировать этот процесс.
В X файл ресурсов есть обычный текстовый файл, каждая строка которого задает тот или иной параметр (ресурс) программы. (При этом предполагается, что программу "населяют" именованные объекты, связанные в некоторую иерархию). Общий вид строки следующий:
<имя программы>.<подобъект1>.<подобъект2>. . . <подобъектN>.<имя ресурса>: <значение ресурса>
Подобная строка задает значение ресурса для подобъектов иерархии объектов программы. Например, запись
myprog.dialogwnd.background: Red
говорит, что в программе myprog
у объекта с именем dialogwnd
параметр background
(цвет фона) имеет значение Red
(красный цвет).
Вместо имен объектов могут указываться их классы. Обычно класс имеет то же самое имя, что и объект, но начинается с заглавной буквы, например,
Myprog.dialogwnd.Background: Red
Часть объектов или классов в левой части строки, задающей ресурс, может заменяться символом '*'
, например, строка
myprog*background: Red
указывает, что для всех объектов программы myprog
ресурс background
имеет значение Red
.
Связка с помощью символа '.'
имеет больший приоритет, чем связка с помощью '*'
. Так, если в файле, задающем ресурсы, есть две строки
myprog*background: Red myprog.dialogwnd.background: Green
то все объекты программы будут иметь ресурс background
равный Red
, кроме объекта dialogwnd
, для которого этот параметр есть Green
.
Пусть ресурсный файл подготовлен. Как получить доступ к его данным во время работы программы? Для этого X предоставляет набор процедур, которые совокупно называются менеджер ресурсов (Resource Manager), и специальную программу xrdb, которая позволяет считать любой ресурсный файл и включить его в общую таблицу ресурсов сервера. Последняя называется базой данных ресурсов сервера, и представляет собой область памяти, ассоциированную со свойством (property) XA_RESOURCE_MANAGER
корневого окна экрана дисплея.
Наиболее простой является процедура XGetDefault()
. Она получает имя программы, имя ресурса и определяет значение последнего. При этом она последовательно совершает следующие шаги:
XA_RESOURCE_MANAGER
);".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()
записывает базу данных ресурсов в файл.
1. Составьте программу, считывающую из файла ресурсов маску шрифта, строку, координаты х, у и отображающую окно с текстом согласно полученной информации.