Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net


Содержание

Книги

Статьи
Программирование в X Window средствами Free Pascal
А. П. Полищук, С. А. Семериков


1.4 Программы и их ресурсы
Многие программы имеют различные заранее подготавливаемые данные, которые в терминах 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. Составьте программу, считывающую из файла ресурсов маску шрифта, строку, координаты х, у и отображающую окно с текстом согласно полученной информации.