2.4.2. Доступ к ресурсам программ.

    Пусть ресурсный файл подготовлен. Как получить доступ к его данным во время работы программы? Для этого X предоставляет набор процедур, которые совокупно называются "менеджер ресурсов" (Resource Manager), и специальную программу xrdb, которая позволяет считать любой ресурсный файл и включить его в общую "таблицу" ресурсов сервера. Последняя называется базой данных ресурсов сервера, и представляет собой область памяти, ассоциированную со "свойством" (property) XA_RESOURCE_MANAGER "корневого" окна экрана дисплея.

    Наиболее простой является процедура XGetDefault( ). Она получает имя программы, имя ресурса и определяет значение последнего. При этом она последовательно совершает следующие шаги:

    Если ресурс одновременно встречается в ".Xdefaults" и файле, определяемом XENVIRONMENT, то берется последнее значение.

    В примере, приводимом ниже, используется XGetDefaults( ), чтобы получить строку, которую надо напечатать в окне программы. Предполагается, что имя программы - "hello", а строка - ресурс с именем "helloWorld", т.е. в файле ".Xdefaults" должна быть помещена, например, следующая запись:

. . . . . . .
hello.helloWorld : Hello, World!
. . . . . . .
    . . . . . . .
Display	*prDisplay;
GC		prGC;
Window	        nWnd;
char		*psString;
. . . . . . . .
/* Устанавливаем связь с сервером, получаем номер экрана. . .*/
. . . . . . . .
/* Выбираем события, обрабатываемые программой */ 
XSelectInput (prDisplay, nWnd, ExposureMask | KeyPressMask);

/* Получаем рисуемую строку */ 
psString = XGetDefaults (prDisplay, "hello", "helloWorld");
. . . . . . . .
XDrawString ( prDisplay, nWnd, prGC, 10, 50, psString,
        strlen (psString) );
. . . . . . . .

    Функция XGetDefaults( ) проста в обращении, но не достаточно гибка. Так, например, с ее помощью нельзя прочитать содержимое произвольного файла ресурсов. Рассмотрим другие более развитые возможности.

    Вызов XrmInitialize( ) инициализирует менеджер ресурсов. Обращение к этой функции предшествует вызовам остальных процедур.

XrmParseCommand (XrmDatabase  *prDB, XrmOptionRec  *prOptRec,
       int nOptRecNum, char  *psProgName, int argc, char  **argv;

сканирует строку, с помощью которой вызвана программа, и "достает" из нее ресурсы и их значения, при этом создается специальная структура данных - база данных ресурсов. Ресурсы и их значения помещаются в нее. Указатель на базу данных передается программе через переменную prDB. Параметр psProgName содержит имя программы, argc - число опций в командной строке, argv - сами опции. Аргумент prOptRec определяет, как разбирать командную строку. nOptRecNum задает число элементов массива prOptRec.

    В примере, приводимом ниже, определяется, что в командной строке опция "-bg" задает цвет фона; "-fg" - цвет переднего плана, а опция "-xrm" позволяет задать в командной строке любой ресурс программы.

. . . . . . . .
XrmOptionDescRec rOptRec[ ] = {
     { "-bg", "*background", XrmoptionSepArg, "Red"   },
     { "-fg", "*foreground", XrmoptionSepArg, "White" },
     { "-xrm", NULL,         XrmoptionResArg, NULL    },
};
XrmDatabase rDB;
. . . . . . . .
void main (int argc, char **argv)
{
   . . . . . . . .
   XrmInitialize( );
   XrmParseCommand (&rDB, rOptRec,
		     sizeof (rOptRec) / sizeof (rOptRec[0]),
		     argv[0], argc, argv);
    . . . . . . . .
}

    Процедура XrmGetFileDataBase( ) позволяет считать указанный ресурсный файл и создать по нему в памяти базу данных ресурсов.

XrmGetResources (XrmDatabase  *prDB, char  *psResName,
          char  *psResClass, char  *psResType, XrmValue  *psResVal);

    Считывает ресурс с именем psResName и классом psResClass из базы данных *prDB. После возврата psResType есть указатель на строку, "говорящую" о типе ресурса. На само значение ресурса указывает psResVal.

    Функция XrmPutResource( ) сохраняет ресурс в базе данных. XrmPutFileDatabase( ) записывает базу данных ресурсов в файл.