Введение

В вычислительной технике X Window System (обычно: X11, или X) — это сетевая прозрачная оконная система для растровых дисплеев. В данной статье подробно рассматриваются протоколы и техническое устройство X11.

Модель клиент-сервер и прозрачность сети

X использует клиент-серверную модель. Программа X-сервера работает на компьютере с графическим дисплеем и взаимодействует с различными клиентскими программами. X-сервер выступает посредником между пользователем и клиентскими программами, принимая запросы по TCP-порту 6000 плюс номер дисплея для графического вывода (окон) от клиентских программ и отображая их пользователю, а также получая ввод от пользователя (клавиатура, мышь) и передавая его клиентским программам. В X сервер работает на компьютере пользователя, а клиенты могут выполняться на удаленных машинах. Эта терминология отличается от общепринятого представления о клиент-серверных системах, где клиент обычно работает на локальном компьютере пользователя, а сервер – на удаленном. Терминология X Window исходит из того, что программа X Window находится в центре всей активности, то есть программа X Window принимает и обрабатывает запросы от приложений, а также ввод от мыши и клавиатуры пользователя. Следовательно, приложения (на удаленных компьютерах) рассматриваются как клиенты программы X-сервера. Протокол связи между сервером и клиентом работает прозрачно для сети: клиент и сервер могут выполняться на одной машине или на разных, возможно, с различными архитектурами и операционными системами. Клиент и сервер могут безопасно взаимодействовать через Интернет, используя туннелирование соединения по зашифрованному каналу.

Окна

То, что другие графические пользовательские интерфейсы обычно называют окном, в системе X Window System называется окном верхнего уровня. Термин «окно» также используется для окон, расположенных внутри другого окна, то есть для подокнов родительского окна. Графические элементы, такие как кнопки, меню, значки и т.д., реализуются с использованием окон. Окно может быть создано только как подокно родительского окна. Это приводит к иерархической организации окон в виде дерева. X-сервер автоматически создает корень этого дерева, называемый корневым окном. Окна верхнего уровня являются непосредственными подокнами корневого окна. Корневое окно визуально занимает размер экрана и находится под всеми остальными окнами.

Идентификаторы

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

Атрибуты и свойства

Каждое окно имеет предопределенный набор атрибутов и набор свойств, все они хранятся на X-сервере и доступны клиентам посредством соответствующих запросов. Атрибуты – это данные об окне, такие как его размер, положение, цвет фона и т.д. Свойства – это фрагменты данных, присоединенные к окну. В отличие от атрибутов, свойства не имеют значения на уровне основного протокола X Window. Клиент может хранить произвольные данные в свойстве окна. Свойство характеризуется именем, типом и значением. Свойства похожи на переменные в императивных языках программирования, поскольку приложение может создать новое свойство с заданным именем и типом и сохранить в нем значение. Свойства связаны с окнами: два свойства с одинаковым именем могут существовать в разных окнах, имея при этом разные типы и значения. Свойства в основном используются для межклиентского взаимодействия. Например, свойство с именем WM_NAME хранит имя окна; менеджеры окон обычно считывают это свойство и отображают имя окна в его заголовке. Программа xprop может отображать свойства окна. В частности, команда xprop root показывает свойства корневого окна, которые включают ресурсы X (параметры программ).

События

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

Цветовые режимы

Способ обработки цветов в X Window System иногда может сбивать с толку пользователей, и исторически поддерживалось несколько различных режимов. Большинство современных приложений используют полный цвет (24-битный цвет, 8 бит для каждого из красного, зеленого и синего), но старые или специализированные приложения могут требовать другой цветовой режим. Многие коммерческие специализированные приложения используют PseudoColor. Протокол X11 фактически использует одно 32-битное беззнаковое целое число, называемое значением пикселя, для представления одного цвета в большинстве графических операций. При передаче интенсивности основных цветов используется 16-битное целое число для каждого цветового компонента. Существуют следующие представления цветов; не все из них могут поддерживаться на конкретном устройстве. DirectColor: значение пикселя разбивается на отдельные красные, зеленые и синие подполя. Каждое подполе индексирует отдельную цветовую карту. Записи во всех цветовых картах могут быть изменены. TrueColor: То же, что и DirectColor, за исключением того, что записи цветовой карты предварительно определены аппаратным обеспечением и не могут быть изменены. Обычно каждая из красных, зеленых и синих цветовых карт обеспечивает (почти) линейный градиент интенсивности. GrayScale: значение пикселя индексирует одну цветовую карту, содержащую монохромные интенсивности. Записи цветовой карты могут быть изменены. StaticGray: То же, что и GrayScale, за исключением того, что записи цветовой карты предварительно определены аппаратным обеспечением и не могут быть изменены. PseudoColor (Chunky): значение пикселя индексирует одну цветовую карту, содержащую цветовые интенсивности. Записи цветовой карты могут быть изменены. StaticColor: То же, что и PseudoColor, за исключением того, что записи цветовой карты предварительно определены аппаратным обеспечением и не могут быть изменены.

Xlib и другие клиентские библиотеки

Большинство клиентских программ взаимодействуют с сервером через клиентскую библиотеку Xlib. Помимо Xlib, библиотека XCB работает ближе к X-протоколу. В частности, большинство клиентов используют такие библиотеки, как Xaw, Motif, GTK+ или Qt, которые, в свою очередь, используют Xlib для взаимодействия с сервером. Qt перешла с Xlib на XCB с выходом версии 5.0, однако это изменение практически не затронуло клиентские программы.

Связь между клиентами

Ядро X Window предоставляет механизмы для связи между клиентами: свойства и события окон, в частности, события сообщений между клиентами. Однако, оно не определяет какие-либо протоколы для таких взаимодействий. Вместо этого, эти протоколы регулируются отдельным набором соглашений о межклиентском взаимодействии. Руководство по соглашениям о межклиентском обмене определяет протокол для обмена данными посредством выборов и взаимодействия приложений с менеджером окон. Некоторые считают эту спецификацию сложной и запутанной; согласованность внешнего вида и взаимодействия приложений обычно достигается программированием под конкретную среду рабочего стола. Протокол межклиентского обмена (ICE) определяет основу для создания протоколов взаимодействия между клиентами, позволяя программистам разрабатывать на его основе специализированные протоколы. В частности, протокол управления сеансом X (XSMP) является протоколом, основанным на ICE, который регулирует взаимодействие между приложениями и менеджером сеансов – программой, отвечающей за сохранение состояния рабочего стола в конце интерактивной сессии и его восстановление при повторном запуске сессии с тем же пользователем. Спецификации freedesktop включают более новые соглашения, такие как соглашение о перетаскивании Xdnd (используемое для передачи данных путем выбора и перетаскивания в другое окно) и соглашение о встроенных приложениях Xembed (описывающее, как приложение может выполняться в под окне другого приложения).

Выбор, резка буферов, и перетаскивание

Механизмы выделения, буфера обрезки и перетаскивания в системе X Window System позволяют пользователю передавать данные из одного окна в другое. Выделение и буфер обрезки обычно используются, когда пользователь выделяет текст или другие данные в окне и вставляет их в другое окно. Перетаскивание используется, когда пользователь выделяет что-то в окне, затем нажимает на выделенное и перетаскивает его в другое окно. Поскольку два разных приложения могут управлять двумя окнами, для передачи данных требуется взаимодействие различных клиентов, подключенных к одному и тому же X-серверу. Основной протокол X Window включает в себя некоторые типы запросов и событий, специфичные для обмена данными, но передача в основном осуществляется с использованием общих событий между клиентами и свойств окна, которые не предназначены специально для передачи данных. Пользователи могут передавать данные различных типов между клиентами: чаще всего это текст, но это также может быть растровое изображение, число, список объектов и т. д. Выделение и перетаскивание – это активные механизмы: после того, как пользователь выделяет данные в окне, клиент, управляющий окном, должен активно поддерживать протокол для передачи этих данных приложению, которое их запрашивает. Буфер обрезки, напротив, предоставляет пассивный механизм: когда пользователь выделяет текст, его содержимое передается в буфер обрезки, где оно остается, даже если приложение, управляющее окном, завершает работу и окно уничтожается.

Менеджер сеанса

Примерно, состояние сеанса – это "состояние рабочего стола" в определенный момент времени: набор окон с их текущим содержимым. Более точно, это набор приложений, управляющих этими окнами, и информация, позволяющая этим приложениям восстановить состояние управляемых ими окон при необходимости. Программа, известная как менеджер сеансов X, сохраняет и восстанавливает состояние сеансов. Наиболее заметное преимущество использования менеджера сеансов заключается в том, что пользователь может выйти из интерактивной сессии, а затем при повторном входе в систему увидеть те же самые окна в том же состоянии. Для этого менеджер сеансов сохраняет имена запущенных приложений при выходе из системы и запускает их снова при входе. Чтобы состояние приложений также восстанавливалось (что необходимо для восстановления содержимого окон), приложения должны уметь сохранять свое состояние по запросу менеджера сеансов и загружать его при повторном запуске. Система X Window включает в себя менеджер сеансов по умолчанию под названием xsm. Разработчики создали другие менеджеры сеансов для конкретных сред рабочего стола. Основные примеры включают , , и для KDE, Xfce и GNOME соответственно.

X менеджер отображения

Программа, известная как X display manager, отображает графическое окно входа в систему X Window System. В более общем смысле, диспетчер дисплея запускает один или несколько X-серверов на локальном компьютере или принимает входящие соединения от X-серверов, работающих на удалённых компьютерах. Локальные серверы запускаются диспетчером дисплея, который затем подключается к ним для отображения пользователю экрана входа. Удалённые серверы запускаются независимо от диспетчера дисплея и подключаются к нему. В этом случае диспетчер дисплея функционирует как графический telnet-сервер: X-сервер может подключиться к диспетчеру дисплея, который запускает сеанс; приложения, использующие этот сеанс, работают на том же компьютере, что и диспетчер дисплея, но ввод и вывод осуществляются на компьютере, где запущен X-сервер (которым может быть компьютер пользователя или удалённый компьютер). X Window System поставляется с XDM как базовым диспетчером дисплея. Другие диспетчеры дисплея включают GDM (GNOME), KDM/SDDM (KDE), WDM (использующий набор виджетов WINGs, применяемый в Window Maker) и entrance (использующий архитектуру, реализованную в Enlightenment v.17).

Элементы пользовательского интерфейса

Ранние наборы инструментов для X включали Xaw (набор Athena Widget Set, 1983), OLIT (OPEN LOOK Intrinsics Toolkit, 1988), XView (1988), Motif (1980-е годы) и Tk. OLIT и XView служили базовыми наборами инструментов для устаревшей рабочей среды OpenWindows от Sun. Motif предоставляет базовый набор инструментов для Common Desktop Environment (CDE), среды рабочего стола, используемой в коммерческих Unix-системах, таких как Solaris, AIX и HP UX. (Solaris 10 включает как CDE, так и GNOME, причем GNOME является предпочтительной средой рабочего стола.) Более новые наборы инструментов включают Qt (1991, используемый KDE), GTK+ (1997, используемый GNOME), wxWidgets (1992), FLTK (1998), FOX (1997) и fpGUI (2005 – настоящее время).

Устаревшие расширения

Описание и примечания к расширению
Низкая пропускная способность X (LBX) – Заменена на VNC, туннелируемую через защищенное SSH-соединение, которое оказалось быстрее, чем LBX.
PEX – "PHIGS Extension to X"; поддержка API для 3D-графической сцены PHIGS. Чаще используется GLX с OpenGL.
XImage Extension – Вместо него используется MIT SHM.
XEvIE – Расширение X для перехвата событий. Предназначено для пользователей, которым необходимо перехватывать все события клавиатуры и мыши. Удалено в X.Org 7.5.
XFree86 Misc – Заменено свойствами ввода. Удалено в X.Org 7.5.