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

С о д е р ж а н и е

Введение

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

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

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

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

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

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

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

Базовые понятия X Windows.

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

Итак, главные понятия X Window

Модель клиент-сервер

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

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

Состав пакетов и их последовательность определяются специальным протоколом, он называется "X протокол". Для программирования под X, совсем не обязательно знать детали реализации сервера и протокола обмена. Система предоставляет библиотеку процедур, с помощью которых программы осуществляют доступ к услугам X на высоком уровне. Так для того, чтобы вывести на экран точку, достаточно вызвать процедуру XDrawPoint(), передав ей соответствующие параметры, и выполняет всю черновую работу по подготовке и передачи пакетов данных серверу. Библиотека Xlib находиться в файле lX11.a (libX11.so), который, как правило, находится в каталоге /usr/X11R6/lib. Прототипы функций библиотеки, используемые структуры данных, типы и прочее определяется в файлах-заголовках из директории /usr/include/X11.

Рис. 1.1. Общая схема общения клиентов и X-сервера

Использование буфера

Посылка порций данных, к тому же если она осуществляется по сети, операция достаточно медленная. Для повышения производительности системы, Xlib буферизует их в памяти машины, на которой выполняется программа-клиент, большинство запросов не требует немедленного выполнения. В буфер кладутся запросы как клиента к серверу, так и события от сервера находятся в буфере пока клиент не прочитает их. Передача выполняется в тот момент, когда клиент вызывает процедуру, ожидающую получения событий от сервера, например XNextEvent(). Программа может явно инициировать отправку пакетов, обратившись к функциям XFlush() или XSync().

Ресурсы

Сетевой характер системы, требует очень бережного отношения к трафику - пропускная способность сетей хоть и растет, но остается ограничивающим ресурсом. B даже прямоугольная область отображаемой растровой памяти - окно, требует минимальной передачи его положения в системе координат родительского окна, размеров по горизонтали и вертикали и весьма обширной дополнительной информации. Если учесть, что окна -- наиболее простой (по вычислительной мощности и объемов памяти для описаний) ресурс, и современные пользовательские интерфейсы построены именно на основе множества окон (все кнопочки, ниспадающие меню, строки ввода и даже обрамления вокруг окон реализованы с помощью окон), передача описаний окон по сети может превратить требования к пропускной способности в нереальные. А ведь кроме окон, существует еще ряд абстракций, без реализации которых ценность графической подсистемы равна нулю.

Разработчики X Window нашли эффектное решение этой проблемы с помощью создания двух обобщающих понятий - "ресурса" и "идентификатора ресурса". Всякий раз, когда необходимо выполнить какое-либо действие, вместо полной структуры данных, посылаемых по сети с запросом, посылается лишь его идентификатор. Использование указателей невозможно, так как клиент и сервер находятся на разных машинах. Если любой клиент знает ID ресурса, то тот клиент может управлять тем ресурсом, даже если другой клиент создавал ресурс. Это означает, более одного клиента можно вовлечь то же самое окно, хотя это не часто желательно. Менеджеры окон могут перемещать и изменять размеры прикладных окон, зная их ID.

Как правило, программы имеют набор конфигурационных параметров - ресурсов. Это может быть цвет окна, тип шрифта, которым рисуется текст, курсор, графический контекст и многое другое. Система стандартизует способ задания ресурсов приложений и содержит ряд процедур для работы с ними. Эта совокупность функций называется менеджером ресурсов (X recource manager или сокращенно Xrm). "Хранилище" параметров программы называется базой данных ресурсов.

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

X протокол

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

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

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