: Программирование в среде X Window на основе библиотеки Xlib :

С о д е р ж а н и е

Введение

I. Базовые понятия X Window
Характеристики X-окна
Менеджер окон
Свойства и атомы
Первый пример
События
Атрибуты окна
Операции над окнами

II. Текст и графика
Графический контекст
Характеристики графического контекста
Вывод текста, работа с шрифтами
Использование цвета
Битовые и пиксельные карты
Изменяем курсор мыши

III. Работа с внешними устройствами
Клавиатура
Мышь

IV. Ресурсы программ
Формат файла ресурсов
Доступ к ресурсам программ

V. Взаимодействие клиентов
Механизм свойств
Работаем с менеджером окон

VI. Дополнительная информация

VII. Литература

Ресурсы программ

Многие программы имеют различные заранее подготавливаемые данные, которые в терминах X называются - ресурсами. Это могут быть цвета окон приложения, строки сообщений пользователю и т.д.

Как правило, программисты создают ресурсы каждый по-своему. В X Window сделана попытка унифицировать этот процесс.

Формат файла ресурсов

В X файл ресурсов есть обычный текстовый файл, каждая строка которого задает тот или иной параметр (ресурс) программы. (При этом предполагается, что программу "населяют" именованные объекты, связанные в некоторую иерархию). Общий вид строки следующий:

<имя программы>.<подобъект1>.<подобъект2>. . .
        <подобъектN>.<имя ресурса>: <значение ресурса>

Подобная строка задает значение ресурса для подобъектов иерархии объектов программы. Например, запись

  myprog.dialogwnd.background: Red

говорит, что в программе ProgramName у объекта с именем DialogWindow параметр Background (цвет фона) имеет значение Red (красный цвет).

Вместо имен объектов могут указываться их классы. Обычно класс имеет то же самое имя, что и объект, но начинается с заглавной буквы, например,

  Myprog.dialogwnd.Background: Red

Часть объектов или классов в левой части строки, задающей ресурс, может заменяться символом '*', например, строка

  myprog*background: Red

указывает, что для всех объектов программы myprog ресурс background имеет значение Red.

Связка с помощью символа '.' имеет больший приоритет, чем связка с помощью '*'. Так, если в файле, задающем ресурсы, есть две строки

  myprog*background: Red
  myprog.dialogwnd.background: Green

то все объекты программы будут иметь ресурс background равный Red, кроме объекта dialogwnd, для которого этот параметр есть Green.

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

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

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

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

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

. . . . . . .
example.MyResourse : First, Example!
. . . . . . .

Фрагмент программы, выполняющий чтение из файла ресурсов, будет выглядеть следующим образом:

  . . . . . . .
Display	*display;
GC	gc;
Window    window;
char	*string;
. . . . . . . .
/* Устанавливаем связь с сервером, получаем номер экрана. . .*/
. . . . . . . .
/* Cобытия, обрабатываемые программой */ 
XSelectInput (display, window, ExposureMask | KeyPressMask);

/* Получаем рисуемую строку */ 
string = XGetDefault (display, "example", "MyResourse");
. . . . . . . .
XDrawString ( display, window, gc, 10, 50, string,
    strlen (string) );
. . . . . . . .

После изменения файла ".Xdefaults" он должен быть обработан программой xrdb для того, чтобы X сервер включил в свою таблицу обновленные ресурсы.

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

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

XrmParseCommand (XrmDatabase *db, XrmOptionRec *optRec,
    int optRecNum, char *programName, int argc, char **argv;

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

В примере, приводимом ниже, определяется, что в командной строке опция "-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 *db, char *resName,
     char *resClass, char *resType, XrmValue *resVal);

считывает ресурс с именем resName и классом resClass из базы данных *db. После возврата resType есть указатель на строку, указывающую тип ресурса. На само значение ресурса указывает resVal.

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

<<< Содержание >>>