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

С о д е р ж а н и е

Введение

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

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

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

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

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

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

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

Атрибуты окна

Атрибуты окна по умолчанию задаются при его создании с помощью функции XCreateWindow() или при помощи XCreateSimpleWindow(). Изменить параметры можно изменить, обратившись к функции XChangeWindowAttributes().

Характеристики окна содержаться в структурах типа XSetWindowAttributes и XWindowAttributes. Получить их значения можно с помощью функции XGetWindowAttributes().

Все они делятся на две группы. В первую входят параметры, доступные "на чтение" и "на запись". Вторая группа представляет собой внутренние данные. Программа может прочитать их, но не может менять.

Структура XSetWindowAttributes

typedef struct _XSetWindowAttributes {
   Pixmap background_pixmap;
   long background_pixel;
   Pixmap border_pixmap;
   long border_pixel;
   int bit_gravity;
   int win_gravity;
   int backing_store;
   long backing_bitplanes;
   long backing_pixel;
   Bool save_under; 
   long event_mask;
   long do_not_propagate_mask;
   Bool override_redirect; 
   Colormap colormap;
   Cursor cursor;
} XSetWindowAttributes;

АттрибутФлагБитПо умолчанию
background_pixmapCWBackPixmap0None
background_pixelCWBackPixel1Undefined
border_pixmapCWBorderPixmap2CopyFromParent
border_pixelCWBorderPixel3Undefined
bit_gravityCWBitGravity4ForgetGravity
win_gravityCWWinGravity5NorthWestGravity
backing_storeCWBackingStore6NotUseful
backing_planesCWBackingPlanes7All 1 's (ones)
backing_pixelCWBackingPixel80 (zero)
override_redirectCWOverrideRedirect9False
save_underCWSaveUnder10False
event_maskCWEventMask110
do_not_propagate_maskCWDontPropagate120
colormapCWColormap13CopyFromParent
cursorCWCursor14None

Перечислим поля этих структур, которые относятся к "изменяемым" параметрам.
Атрибут Функция
background_pixmapXSetWindowBackgroundPixmap()
background_pixelXSetWindowBackground()
border_pixmapXSetWindowBorderPixmap()
border_pixelXSetWindowBorder()
event_maskXSelectInput()
colormapXSetWindowColormap()
cursorXDefineCursor() or XUndefineCursor()

Фон окна определяется атрибутами background_pixmap и background_pixel. Первый из них задает картинку (карту пикселей), которая используется для заливки фона окна. При необходимости картина повторяется слева направо и сверху вниз. Если параметр background_pixmap равен None (задается по умолчанию), то он игнорируется. Если же при этом поле background_pixel не задано (установлено по умолчанию), то окно считается "прозрачным", в противном случае его фон заливается цветом background_pixel. Атрибуты background_pixmap и background_pixel могут также принимать значение ParentRelative. В этом случае характеристики фона заимствуются у родительского окна.

Вид края окна определяется полями border_pixmap и border_pixel. Первый атрибут определяет карту пикселей, используемую для заполнения края. Если он равен None, то край заполняется цветом border_pixel. Если же и поле border_pixel не задано, то для изображения края используются соответствующие характеристики родителя. То же самое происходит, если параметр border_pixmap равен CopyFromParent (взять у родителя). Последнее значение есть значение по умолчанию.

На перерисовку окна после изменения его размеров влияют атрибуты bit_gravity и win_gravity. Когда окно меняет размер, например, увеличивается или уменьшается, то, в принципе, нет необходимости перерисовывать все его содержимое. Часть окна остается неизменной. Правда, эта часть может поменять свое положение: переместиться вправо, влево, вверх или вниз.

Поле bit_gravity говорит серверу, что делать с оставшейся частью изображения. Возможные значения параметра следующие:

Параметр win_gravity говорит о том, что делать с подокнами окна после изменения размеров последнего. Возможные значения параметра следующие (при перечислении используются следующие обозначения:
H - изменение размеров окна по горизонтали,
V - изменение размеров по вертикали,
(H, V) - смещение подокна на H пикселей по горизонтали и на V пикселей по вертикали):

Автоматическое сохранение содержимого окна, когда его часть перекрывается другими окнами, или, когда окно удаляется с экрана, определяется параметрами backing_store, backing_planes и backing_pixel. Сохраненные данные могут использоваться для восстановления окна, что значительно быстрее, чем его перерисовка программой в ответ на событие Expose. Параметр backing_store имеет следующие возможные значения:

Сохранение изображений требует, как правило, довольно большого расхода памяти. Атрибуты backing_planes и backing_pixel призваны уменьшить этот расход. Первый из указанных параметров говорит серверу, какие плоскости изображения надо сохранять; backing_pixel означает, какой цвет использовать при восстановлении изображения в тех плоскостях, которые не сохранялись. По умолчанию backing_planes - маска, состоящая из единиц, а backing_pixel равно 0.

Иногда при показе окна полезно сохранить содержимое экрана под окном. Если окно невелико, и показывается не на долго, то это позволяет экономить время, которое надо будет затратить на перерисовку экрана после того, как окно будет закрыто. Если атрибут save_under равен True, то сервер будет пытаться сохранить изображение под окном. Если же он равен False (по умолчанию), то сервер ничего не предпринимает.

Когда обрабатывает (или не обрабатывает) событие, последнее может быть передано его родительскому окну. Атрибут do_not_propagate_mask (по умолчанию 0) говорит и о том, какие события не должны доходить до родителей.

Изменение размеров окна и его положения на экране контролируется атрибутом override_redirect. Если он равен False, то размер окна и его положение меняются с помощью менеджера окон. Если же он равен True, то окно само решает, где ему быть, и какую ширину и высоту иметь.

Цветовую гамму окна задает параметр colormap. Значение по умолчанию - CopyFromPatent, которое говорит, что окно использует палитру своего непосредственного родителя.

Теперь рассмотрим "неизменяемые" параметры окна. Строго говоря, атрибуты, о которых пойдет речь, нельзя назвать неизменяемыми. Некоторые из них могут меняться сервером или менеджером окон. Но для обычных программ-клиентов они действительно являются таковыми.

Положение окна и его размеры сообщают поля x, y, width и height. Они дают координаты левого верхнего угла, ширину и высоту окна соответственно. Координаты измеряются в пикселях по отношению к родительскому окну.

Ширина края окна определяется параметром border_width.

Маска, говорящая о том, какие события выбраны для передачи окну породившим его клиентом, содержится в поле флагов your_event_mask. Значение параметра образуется комбинацией флагов, идентифицирующих события.

Информация о дисплее, на котором показано окно, содержится в структуре Visual, на которую показывает поле visual. Эти данные, как правило, не обрабатываются обычными программами-клиентами (заметим, что для получения информации о дисплее, в системе предусмотрена функция XGetVisualInfo()).

Класс окна сообщает поле class. Возможные значения: InputOutput и InputOnly.

Число цветовых плоскостей дисплея (число бит-на-пиксел) помещается в поле depth.

На информацию об экране, на котором помещается окно, указывает поле screen. Она, как правило, не используется обычными программами.

Идентификатор главного (корневого) окна экрана, на котором помещается окно, находится в поле root.

Если окно имеет палитру, и она в настоящее время активна, то поле map_installed равно True, в противном случае - False.

Видно в настоящее время окно на экране или нет, сообщает атрибут map_state.

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

Мы рассказали о том, как получить атрибуты окна, и что они означают. Теперь рассмотрим, как их изменить. Для этого можно использовать несколько функций X Window, основной из которых является XChangeWindowAttributes(), имеющая следующий прототип:

int XChangeWindowAttributes (Display *display, 
     Window window, unsigned long valueMask,
     XSetWindowAttributes *windAttr);

Требуемые установки атрибутов передаются через аргумент windAttr. Он указывает на переменную типа XSetWindowAttributes. Ее поля те же, что и соответствующие поля XWindowAttributes. Разница заключается лишь в разных именах некоторых из них. Так, поле your_event_mask в XWindowAttributes соответствует полю event_mask в XSetWindowAttributes.

СтруктураXSetWindowAttributes содержит дополнительное поле cursor. Оно определяет вид курсора мыши, когда последний находится в окне. Если поле равно None (значение по умолчанию), то используется курсор родительского окна, в противном случае значением параметра должен быть идентификатор того или иного курсора.

Параметр valueMask при вызове указанной функции представляет комбинацию флагов, говорящих о том, какие из полей переменной windAttr принимать во внимание.

В следующем примере приведен фрагмент кода, в котором изменяются параметры border_pixmap и win_gravity некоторого окна:

.......
Display *display;
Window window;
XSetWindowAttributes windAttr;
unsigned long valMask;
Pixmap pixmap=0;
.......
valMask = CWBorderPixmap | CWWinGravity;
windAttr.border_pixmap = pixmap;
windAttr.win_gravity = StaticGravity;
.......
XChangeWindowAttributes (display, window, valMask, &windAttr);
.......

Отдельные атрибуты окна можно изменить более просто с помощью специальных функций. Так функция XSetWindowBackground() меняет фон окна, XSetWindowBorder() - его край.

Пример программы, меняем цвет фона при поступлении события нажатия и отпускания кнопки мыши example2.c

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