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

С о д е р ж а н и е

Введение

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

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

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

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

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

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

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

Текст и графика

В данном разделе описываются возможности, которые имеет программист для вывода текста и произвольных графических изображений. Особенностью X Window является то, что рисовать можно не только в окне, но и в специально подготовленной области памяти. Данная область называется картой пикселей и идентифицируется целым числом, имеющим тип Pixmap. Карта толщиной в один бит имеет специальное название - битовая.

Графический контекст

Графический контекст -- один из уникальных атрибутов X Window, связанный одновременно со скромными базовыми графическими возможностями системы и с ее клиент-серверными особенностями. Набор поддерживаемых X Window операций вывода графики можно считать более чем скромным -- в него входит рисование точки (пиксела), линии, текста, растрового изображения и ограниченного контуром или закрашенного многоугольника. Но каждая такая операция требует для передачи по сети слишком много дополнительной информации -- о цвете, стиле линии, короче говоря, обо всех возможных атрибутах. Именно это множество атрибутов и называется "графическим контекстом" (GC). Использование модели "ресурс-идентификатор" в данном случае также позволяет добиться существенного уменьшения трафика - перед началом выполнения множества операций "рисования" программа-клиент регистрирует необходимые GC, а затем выполняет операции с указанием коротких идентификаторов вместо множества дублирующих друг друга данных.

Прежде чем начать работу с графикой, программа должна выделить себе специальную структуру данных и получить указатель на нее. Эта структура называется графическим контекстом (Graphic Context (GC)). Указатель на GC используется в качестве одного из параметров при вызове "рисующих" функций X. Графический контекст содержит ряд атрибутов, влияющих на отображение объектов: текста, линий, фигур и др. Выделенный GC должен быть освобожден до завершения работы программы.

Графический контекст создается функцией XCreateGC(), имеющей следующий прототип:

GC XCreateGC (Display *display, Drawable drawable,
       unsigned long valueMask, XGCValues *gcValues);

Первый аргумент - это указатель на структуру типа Display, который программа получает после вызова XOpenDisplay(); второй - идентификатор окна (или карты пикселей), в котором программа будет рисовать; третий - битовая маска, определяющая, какие атрибуты GC задаются; последний аргумент - структура типа XGCValues, определяемая следующим образом:

typedef struct {
int	function;
unsigned long	plane_mask;
unsigned long	foreground;
unsigned long	background;
int	line_width;
int	line_style;
int	cap_style;
int	join_style;
int	fill_style;
int	fill_rule;
int	arc_mode;
Pixmap	tile;
Pixmap	stipple;
int	ts_x_origin;
int	ts_y_origin;
Font	font;
int	subwindow_mode;
Bool	graphics_exposures;
int	clip_x_origin;
int	clip_y_origin;
Pixmap	clip_mask;
int	dash_offset;
char	dashes;
} XGCValues;

Значения полей данной структуры будут объяснены ниже. Каждому из них соответствует бит в маске, которая передается в качестве третьего параметра при вызове функции XCreateGC(). Эти биты обозначаются символическими константами, определенными в файле <X11/Xlib.h>. Если бит установлен, то значение соответствующего атрибута должно быть взято из переданной XCreateGC() структуры XGCValues. Если бит сброшен, то атрибут приникает значение по умолчанию.

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

. . . . . . .
GC gc;
XGCValues values;
Display display;
int screenNumber;
. . . . . . . .
values.foreground = BlackPixel (display, screenNumber);
values.background = WhitePixel (display, screenNumber);
. . . . . . . .
gc = XCreateGC (display, RootWindow (display, screenNumber),
(GCForeground | GCBackground), &values);

Вызов XCreateGC() - не единственный способ создания графического контекста. Так, например, новый контекст может быть получен из уже существующего GC с помощью XCopyGC().

Когда контекст порожден, его атрибуты могут изменяться функцией XChangeGC(). Например:

values.line_width = 10;
XChangeGC (display, gc, GCLineWidth, &values);

Приведенный фрагмент кода меняет ширину линий, рисуемых с помощью графического контекста.

Для того, чтобы получить значение полей GC, используется функция XGetGCValues().

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