Глава 1. Введение в Xlib

1.1. Обзор системы X Window
1.2. Ошибки
1.3. Стандартные файлы заголовков
1.4. Общие значения и типы данных
1.5. Соглашения Xlib по названиям и аргументам
1.6. Соглашения по программированию
1.7. Набор и кодировка знаков
1.8. Соглашения по оформлению

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

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

Чтобы дать представление о программировании для X в этой главе обсуждаются следующие вопросы:

1.1. Обзор системы X Window

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

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

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

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

Окно имеет обрамление границы шириной ноль и более пикселов, которая может быть заполнена любым пиксельным изображением или однотонным цветом. Обычно, но не всегда, окно имеет шаблон для заполнения фона, который перерисовывается системой когда окно не закрыто. Дочерние окна закрывают своих родителей и графические операции в родительском окне обычно отсекаются потомками.

Каждое окно и пиксельное изображение имеет свою собственную систему координат. Координатная система имеет горизонтальную ось X и вертикальную ось Y с началом [0,0] в верхнем левом углу. Координаты измеряются в пикселах и совпадают с центром пикселов. Для окон начало координат лежит внутри рамки границы окна и совпадает с внутренним верхним левым углом.

X не гарантирует, что будет сохранять содержимое окна. Когда часть окна или всё окно становятся невидимы, а затем снова выводятся на экран, их содержимое может быть потеряно. Сервер посылает клиентской программе событие Expose для того, чтобы оповестить программу о необходимости перерисовать содержимое окна или его части. Программы должны быть готовы прегенерировать содержимое окна по требованию.

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

Большинство функций Xlib производят добавление запросов в буфер вывода. Позже эти запросы асинхронно выполняются X сервером. Выполнение функций, которые возвращают значения хранящиеся на сервере, не блокируется пока не будет получен непосредственный ответ сервера или не возникнет ошибка. Имеется возможность предоставить обработчик ошибок, вызов которого будет произведен при получении сообщения об ошибке.

Если клиент не хочет чтобы запросы выполнялись асинхронно, он может завершать запрос вызовом XSync, который блокирует исполнение пока все буферизированные асинхронные события не будут отправлены и выполнены. Важным побочным эффектом является то, что буфер вывода Xlib всегда сбрасывается вызовом любой функции, которая возвращает значение с сервера или же ожидает ввода.

Многие функции Xlib возвращают целочисленные значения идентификатора ресурса, которые позволяют ссылаться на объекты, созхраненные на X сервере. Они могут иметь типы Window, Font, Pixmap, Colormap, Cursor или GContext, определенные в файле <X11/X.h>. Эти ресурсы создаются по запросу, а уничтожаются (освобождаются) либо по запросу, либо при закрытии соединения. Большинство этих ресурсов потенциально совместно используемы всеми приложениями, но, например, окна непосредственно управляются только программой менеджера окон. Шрифты и курсоры автоматически совместно используются всеми экранами дисплейной станции. Шрифты загружаются и выгружаются при необходимости и совместно используются несколькими клиентами. Шрифты также кэшируются сервером. Xlib не предоставляет возможности совместного использования графических контекстов несколькими приложениями.

Клиентские программы информируются о событиях, происходящих на X сервере. События могут быть как побочными эффектами некоторых запросов (например, перемещение окна в стеке окон генерирует событие Expose), так и полностью асинхронными (например, ввод с клавиатуры). Клиентская программа зпрашивает инфорирование о возникающих событиях. Поскольку другие приложения также могут отправлять приложению события, программа должна быть готова обработать (или игнорировать) события любых типов.

События ввода (например, нажатие клавишы или перемещение указателя) поступают с сервера асинхронно и ставятся в очередь пока не будут явно запрошены (например, с помощью XNextEvent или XWindowEvent). Кроме этого некоторые библиотечные функции (например, XRaiseWindow) генерируют события Expose и ConfigureRequest. Эти события тоже поступают асинхронно, но клиент может явно дождаться их прихода посредством вызова XSync после вызова функции, которая может заставить сервер сгенерировать событие.