В вычислительной технике X Window System (обычно: X11 или X) — это сетевая прозрачная оконная система для растровых дисплеев. В этой статье подробно описываются протоколы и техническая структура X11.
X использует модель клиент-сервер . Программа X-сервера запускается на компьютере с графическим дисплеем и взаимодействует с различными клиентскими программами . X-сервер действует как посредник между пользователем и клиентскими программами, принимая запросы на TCP-порт 6000 плюс номер дисплея [1] для графического вывода (окна) от клиентских программ и отображая их пользователю (дисплею), а также получая пользовательский ввод (клавиатура, мышь) и передавая его клиентским программам.
В X сервер работает на компьютере пользователя, а клиенты могут работать на удаленных машинах. Эта терминология переворачивает общепринятое представление о клиент-серверных системах, где клиент обычно работает на локальном компьютере пользователя, а сервер работает на удаленном компьютере. Терминология X Window предполагает, что программа X Window находится в центре всей активности, т. е. программа X Window принимает и отвечает на запросы от приложений, а также от ввода данных с мыши и клавиатуры пользователя. Таким образом, приложения (на удаленных компьютерах) рассматриваются как клиенты программы сервера X Window.
Протокол связи между сервером и клиентом работает прозрачно для сети : клиент и сервер могут работать на одной и той же машине или на разных, возможно, с разными архитектурами и операционными системами . Клиент и сервер могут безопасно общаться через Интернет , туннелируя соединение через зашифрованное соединение. [2]
Боб Шейфлер и Джим Геттис изложили ранние принципы X следующим образом (перечислены в Scheifler/Gettys 1996):
Первый принцип был изменен во время проектирования X11 следующим образом: не добавляйте новую функциональность, если вы не знаете, какое-либо реальное приложение, которому она потребуется.
С тех пор X в значительной степени придерживается этих принципов. Фонд X.Org разрабатывает эталонную реализацию с целью ее расширения и улучшения, сохраняя при этом ее почти полную совместимость с исходным протоколом 1987 года.
Связь между сервером и клиентами осуществляется путем обмена пакетами по сетевому каналу . Клиент устанавливает соединение, отправляя первый пакет. Сервер отвечает, отправляя обратно пакет, сообщающий о принятии или отклонении соединения, или запрос на дальнейшую аутентификацию. Если соединение принято, пакет принятия содержит данные для использования клиентом при последующем взаимодействии с сервером.
После установления соединения клиент и сервер обмениваются по каналу четырьмя различными типами пакетов:
X-сервер предоставляет набор базовых услуг. Клиентские программы реализуют более сложные функции, взаимодействуя с сервером.
То, что другие графические пользовательские интерфейсы обычно называют окном, является окном верхнего уровня в системе X Window. Термин окно также используется для окон, которые находятся внутри другого окна, то есть подокна родительского окна . Графические элементы, такие как кнопки, меню, значки и т. д., реализованы с помощью окон.
Окно может быть создано только как подокно родительского окна. Это приводит к тому, что окна располагаются иерархически в дереве . X-сервер автоматически создает корень дерева, называемый корневым окном . Окна верхнего уровня являются в точности прямыми подокнами корневого окна. Видимо, корневое окно имеет такой же размер, как экран, и находится позади всех других окон.
X-сервер хранит все данные об окнах, шрифтах и т. д. Клиент знает идентификаторы этих объектов — целые числа, которые он может использовать в качестве имен для них при взаимодействии с сервером. Например, если клиент хочет создать окно, он запрашивает у сервера его создание и (в случае успеха) получает в ответ идентификатор, который сервер связывает с вновь созданным окном. Идентификатор может быть позже использован клиентом для запроса, например, строки, которая должна быть отрисована в окне.
Идентификаторы уникальны для сервера, а не только для клиента; например, нет двух окон с одинаковым идентификатором, даже если они созданы двумя разными клиентами. Клиент может получить доступ к любому объекту, указав его идентификатор, даже если другой клиент создал этот объект.
Каждое окно имеет предопределенный набор атрибутов и набор свойств, которые хранятся на X-сервере и доступны клиентам через соответствующие запросы. Атрибуты — это данные об окне, такие как его размер, положение, цвет фона и т. д. Свойства — это фрагменты данных, прикрепленные к окну. В отличие от атрибутов, свойства не имеют значения на уровне протокола ядра X Window. Клиент может хранить произвольные данные в свойстве окна.
Свойство характеризуется именем, типом и значением. Свойства напоминают переменные в императивных языках программирования , в том смысле, что приложение может создать новое свойство с заданным именем и заданным типом и сохранить в нем значение. Свойства связаны с окнами: два свойства с одинаковым именем могут существовать в двух разных окнах, имея разные типы и значения.
Свойства в основном используются для межклиентского взаимодействия. Например, свойство named WM_NAME
хранит имя окна; оконные менеджеры обычно считывают это свойство и отображают имя окна в верхней его части.
Программа xprop
может отображать свойства окна. В частности, xprop -root
показывает свойства корневого окна, включающие в себя X-ресурсы (параметры программ).
События — это пакеты, отправляемые сервером клиенту для сообщения о том, что произошло что-то, что может заинтересовать клиента. Клиент может запросить сервер отправить событие другому клиенту; это используется для связи между клиентами. Например, когда клиент запрашивает текст, который в данный момент выбран, событие отправляется клиенту, который в данный момент обрабатывает окно, содержащее выбор.
Содержимое окна может быть «уничтожено» в некоторых условиях (например, если окно закрыто). Всякий раз, когда область уничтоженного содержимого становится видимой, сервер генерирует событие, Expose
чтобы уведомить клиента о том, что часть окна должна быть отрисована.
Другие события могут служить для уведомления клиентов о вводе данных с клавиатуры или мыши, о создании новых окон и т. д.
Некоторые виды событий всегда отправляются клиенту, но большинство видов событий отправляются только в том случае, если клиент ранее заявил о своей заинтересованности в них, поскольку клиенты могут быть заинтересованы только в некоторых видах событий. Например, клиент может быть заинтересован в событиях, связанных с клавиатурой, но не в событиях, связанных с мышью.
То, как X Window System обрабатывает цвета, иногда может сбивать пользователей с толку, и исторически поддерживалось несколько различных режимов. Большинство современных приложений используют полный цвет (24-битный цвет, 8 бит для каждого из красного, зеленого и синего), но старые или специализированные приложения могут требовать другой цветовой режим. Многие коммерческие специализированные приложения используют PseudoColor.
Протокол X11 фактически использует одно 32-битное целое число без знака — называемое пиксельным значением — для представления одного цвета в большинстве графических операций. При передаче интенсивности основных цветов для каждого компонента цвета используется 16-битное целое число. Существуют следующие представления цветов; не все из них могут поддерживаться на определенном устройстве.
Большинство клиентских программ взаимодействуют с сервером через клиентскую библиотеку Xlib . Помимо Xlib, библиотека XCB работает более тесно с протоколом X. В частности, большинство клиентов используют такие библиотеки, как Xaw , Motif , GTK+ или Qt , которые в свою очередь используют Xlib для взаимодействия с сервером. Qt перешел с Xlib на XCB с выпуском 5.0, но клиентские программы были почти полностью не затронуты этим изменением.
Протокол ядра X Window предоставляет механизмы для связи между клиентами: свойства окон и события, в частности события сообщений клиент-клиент. Однако он не определяет какой-либо протокол для такого взаимодействия. Вместо этого, отдельный набор соглашений о межклиентской связи управляет этими протоколами.
Inter -Client Communication Conventions Manual определяет протокол для обмена данными через выборки и взаимодействия приложений с оконным менеджером. Некоторые посчитали эту спецификацию сложной и запутанной; [3] [4] согласованность внешнего вида и поведения приложения и коммуникации обычно решается путем программирования для заданной среды рабочего стола.
Протокол Inter-Client Exchange (ICE) определяет структуру для построения протоколов взаимодействия между клиентами, чтобы программисты могли построить определенный протокол поверх него. В частности, протокол X Session Management (XSMP) — это протокол на основе ICE, который управляет взаимодействием между приложениями с менеджером сеансов , который является программой, которая заботится о сохранении состояния рабочего стола в конце интерактивного сеанса и восстановлении его при повторном запуске другого сеанса с тем же пользователем.
Спецификации freedesktop включают в себя новые соглашения, в том числе соглашение о перетаскивании Xdnd (используется для передачи данных путем их выбора и перетаскивания в другое окно) и соглашение о встроенных приложениях Xembed (в котором подробно описывается, как приложение может работать в подокне другого приложения).
Механизмы выделения, буферов вырезания и перетаскивания в системе X Window позволяют пользователю переносить данные из одного окна в другое. Выделения и буфер вырезания используются (обычно), когда пользователь выделяет текст или другие данные в окне и вставляет их в другое окно. Перетаскивание используется, когда пользователь выделяет что-то в окне, затем щелкает по выделенному и перетаскивает его в другое окно.
Поскольку два разных приложения могут обрабатывать два окна, для передачи данных требуются разные клиенты, подключенные к одному и тому же X-серверу, для взаимодействия. Основной протокол X Window включает некоторые типы запросов и событий, которые специфичны для обмена выбором, но передача в основном выполняется с использованием общей отправки событий клиент-клиент и свойств окна, которые не специфичны для передачи выбора.
Пользователи могут передавать между клиентами данные различных типов: обычно это текст, но также это может быть пиксельная карта, число, список объектов и т. д.
Выборки и перетаскивание являются активными механизмами: после того, как пользователь выбирает данные в окне, клиент, обрабатывающий окно, должен активно поддерживать протокол для передачи этих данных приложению, запрашивающему их. Буферы вырезания , напротив, предоставляют пассивный механизм: когда пользователь выбирает какой-либо текст, его содержимое передается в буфер вырезания, где оно остается, даже если приложение, обрабатывающее окно, завершает работу и окно уничтожается.
Менеджер окон — это программа, которая управляет общим внешним видом окон и других графических элементов графического пользовательского интерфейса . Различия во внешнем виде X Window System в разных инсталляциях в основном обусловлены использованием разных менеджеров окон или разными конфигурациями менеджера окон.
Менеджер окон отвечает за определение положения окон, размещение декоративной рамки вокруг них, обработку значков, обработку щелчков мыши за пределами окон (на «фоне»), обработку определенных нажатий клавиш и т. д.
С точки зрения X-сервера, оконный менеджер работает как клиент, как и любой другой клиент. Начальное положение и декоративные рамки вокруг окон обрабатываются оконным менеджером с помощью следующих запросов:
Менеджер окон использует первый запрос для перехвата любого запроса на отображение окон верхнего уровня (потомков корневого окна). Всякий раз, когда другое приложение запрашивает отображение окна верхнего уровня, сервер не делает этого, а вместо этого отправляет событие менеджеру окон. Большинство менеджеров окон переподчиняют окно: они создают большее окно верхнего уровня (называемое окном фрейма) и переподчиняют исходное окно как его дочернее. Графически это соответствует размещению исходного окна внутри окна фрейма. Пространство окна фрейма, которое не занято исходным окном, используется для декоративной рамки вокруг окна («границы» и «заголовка»).
Менеджер окон управляет щелчками мыши в окне фрейма. Это позволяет, например, пользователю перемещать или изменять размер окна, щелкая и перетаскивая границу или заголовок.
Менеджер окон также обрабатывает значки и связанные с ними визуальные элементы графического пользовательского интерфейса. Значки не существуют на уровне протокола ядра X Window. Они реализуются менеджером окон. Например, всякий раз, когда окно должно быть «иконифицировано», менеджер окон FVWM отменяет сопоставление окна и создает окно для имени значка и, возможно, другое окно для изображения значка. Поэтому значение и обработка значков полностью определяются менеджером окон: некоторые менеджеры окон, такие как wm2, вообще не реализуют значки.
Грубо говоря, состояние сеанса — это «состояние рабочего стола» в данный момент времени: набор окон с их текущим содержимым. Точнее, это набор приложений, управляющих этими окнами, и информация, которая позволяет этим приложениям восстанавливать состояние своих управляемых окон при необходимости. Программа, известная как менеджер сеансов X, сохраняет и восстанавливает состояние сеансов.
Наиболее узнаваемым является использование менеджера сеансов, позволяющего пользователю выходить из интерактивного сеанса, но при повторном входе обнаруживать точно такие же окна в том же состоянии. Чтобы это работало, программа менеджера сеансов сохраняет имена запущенных приложений при выходе из системы и снова запускает их при входе в систему. Чтобы также восстанавливалось состояние приложений (что необходимо для восстановления содержимого окон), приложения должны иметь возможность сохранять свое состояние выполнения по запросу от менеджера сеансов и загружать его обратно при повторном запуске.
X Window System включает в себя менеджер сеансов по умолчанию, называемый xsm
. Разработчики написали другие менеджеры сеансов для определенных настольных систем. Основные примеры включают ksmserver
, xfce4-session
, и gnome-session
для KDE , Xfce и GNOME соответственно.
Программа, известная как X display manager, показывает графическое приглашение на вход в систему в X Window System. В более общем смысле, display manager запускает один или несколько X-серверов на локальном компьютере или принимает входящие соединения с X-серверов, работающих на удаленных компьютерах. Локальные серверы запускаются display manager, который затем подключается к ним, чтобы предоставить пользователю экран входа в систему. Удаленные серверы запускаются независимо от display manager и подключаются к нему. В этой ситуации display manager работает как графический telnet- сервер: X-сервер может подключиться к display manager, который запускает сеанс; приложения, которые используют этот сеанс, работают на том же компьютере display manager, но имеют вход и выход на компьютере, где работает X-сервер (это может быть компьютер перед пользователем или удаленный компьютер).
X Window System поставляется с XDM в качестве базового поставляемого менеджера дисплеев. Другие менеджеры дисплеев включают GDM ( GNOME ), KDM / SDDM ( KDE ), WDM (использующий набор виджетов WINGs, используемый в Window Maker ) и entry (использующий архитектуру, используемую в 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 , причем последняя является предпочтительной средой рабочего стола по состоянию на 2010 год [обновлять].)
Разработанные в последнее время наборы инструментов включают Qt (1991- , используется KDE ), GTK+ (1997- , используется GNOME), wxWidgets (1992- ), FLTK (1998- ), FOX (1997- ) и fpGUI (2005- по настоящее время).
Шейфлер и Геттис разработали X-сервер как простой, но расширяемый. Таким образом, большая часть функциональности теперь находится в расширениях протокола.
На уровне протокола каждому расширению могут быть назначены новые типы пакетов запроса/события/ошибки. Клиентские приложения получают доступ к функциям расширения через библиотеки расширений. Добавление расширений в текущие реализации X-сервера, как сообщается, затруднено из-за отсутствия модульности в конструкции сервера. [5] Долгосрочной целью проекта XCB является автоматизация генерации как клиентской, так и серверной сторон расширений из описаний XML-протокола.
В следующей таблице представлен частичный каталог разработанных расширений, отсортированных примерно по давности внедрения:
ICCCM невероятно плотный, его нужно соблюдать до последней буквы, и он все равно не работает. Соответствие ICCCM — одно из самых сложных испытаний при внедрении X-инструментариев, оконных менеджеров и даже простых приложений. Это настолько сложно, что многие преимущества просто не стоят хлопот по соответствию.
примерно так же ужасен, как описывают его авторы [Unix Hater's Handbook], но в наши дни это трудно заметить, поскольку современные инструментальные средства и оконные менеджеры довольно хорошо справляются с сокрытием уродства от приложений.
X11 не позволяет считывать всю информацию, которая могла храниться на сервере (например, протокол X11 не позволяет запрашивать состояние GC). Это несколько затрудняет достижение модульности.
libXi - библиотека для расширения X Input