9 декабря 2010 г.

X11

Большинство нынешних дистрибутивов по умолчанию устанавливают для пользователя графическую среду X11 (X11 Windows System), под управлением которой и выполняются все графические приложения. Как «внутри» устроена X11? Прежде всего, X11 – это распределенная модульная среда, состоящая из двух основных компонентов: X-сервера и X-клиента.X-сервер – это программа, которая организует работу с устройствами ввода/вывода, производит отрисовку видимых элементов, запущена у пользователя и предоставляет свои ресурсы (те же самые устройства ввода-вывода) для X-клиентов. X-сервер загружает драйверы устройств (например видеокарты, мыши или клавиатуры), он же управляет переключением раскладок клавиатуры и т.п. Кроме того, X-сервер частично берет на себя функции работы со шрифтами. Задача использования аппаратного ускорения для отрисовки также является прерогативой X-сервера.

В современных дистрибутивах как правило используется открытый свободно распространяемый X-сервер называющийся Xorg. Его конфигурационный файл называется xorg.conf и расположен в каталоге /etc/X11. В конфигурационном файле описываются все устройства ввода, которые будет использовать X-сервер, настройки клавиатуры, драйвер видеокарты и многое другое. Более подробную информацию можно получить из справочного руководства (man Xorg, man xorg.conf).

X-клиент – это собственно пользовательская программа – браузер, почтовый клиент, видеоплеер, клиент мгновенных сообщений, игры, графические редакторы и просмотрщики и т.д.

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

X-сервер никаким образом не отвечает за внешний вид окна X-клиента – он отрисовывает все в точности так, как это указал клиент, более того – сам по себе X-сервер он не отрисовывает ни обрамлений окон, ни каких либо управляющих элементов, не обрабатывает никаких горячих клавиш – то есть он занимается только отрисовкой картинки присланной X-клиентом, а также чтением данных из устройств ввода и передачей соответствующих событий X-клиенту.

Обрамление окон, иконки рабочего стола, панели и кнопки – это все отрисовывается X-клиентами. Рассмотрим пример окна некоторого приложения (в нашем случае файлового менеджера Nautilus из состава среды GNOME):

На этой картинке на самом деле показан результат работы двух X-клиентов: собственно файлового менеджера nautilus (именно он управляет отрисовкой меню, строки статуса, панелей, иконок и так далее). Второй X-клиент – менеджер окон (window manager) под названием metacity нарисовал рамку окна и кнопки на этой рамке. При этом горячие клавиши для закрытия окна, сворачивания, перемещения и других операций с окном отрабатывает именно metacity, а горячие клавиши копирования файла, перехода по каталогам, навигации по меню, подсвечивание иконок и тому подобное отрабатывает уже сам nautilus.


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

   1. Все программы данного графического окружения используют одну и ту же библиотеку для отрисовки своих элементов управления
   2.В графическое окружение включается какой-либо менеджер окон
   3. Все программы для данного окружения разрабатываются с соблюдением определенных общих требований
   4. В состав окружение включаются самостоятельные программы для выполнения базовых функций – текстовые и табличные процессоры, графический редактор, браузер, IM-клиент и другие
   5. В состав окружения включаются служебные программы, предоставляющие пользователю возможность вызова других программ – например, приложение которое отрисовывает панель, на которой размещается кнопка для вызова меню со списком установленных программ и список окон
   6.  В состав окружения включают утилиты для настройки оборудования и дополнительных функций

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

Наиболее распространенные графические среды в Linux – это GNOME и KDE. И та и другая среда имеют свою библиотеку для отрисовки элементов управления внутри окна (для GNOME это GTK, для KDE это Qt), включают в свой состав почтовый клиент, браузер, мультимедиа-проигрыватель, клиент мгновенных сообщений и графический редактор, файловый менеджер (он же по совместительству отрисовывает иконки на рабочем стол и отвечает за фон рабочего стола), программу которая отрисовывает боковые панели и набор маленьких программ-апплетов, которые встраиваются при необходимости в панели, игры, программы управления для настройки окружения и менеджер окон.

Некоторые X-клиенты не входят в состав какого-либо окружения – например, браузеры Firefox и Opera, медиапроигрыватель Mplayer, офисный пакет OpenOffice.Org. Самое главное что следует запомнить – что графическое окружение, или графическая среда – это всего лишь набор программ, а не одна большая программа вида «все-в-одном», и вы можете, работая в основном в одном окружении, абсолютно спокойно использовать программы другого.
19.3. Внутри X11. Упрощенная схема

X11 – система многослойная, но внутренне логичная и понятная. Схематически ее можно изобразить следующим образом:

Когда приложение отрисовывает что-либо, оно обращается к своей базовой библиотеке, она в свою очередь переадресовывает вызов (или уже цепочку вызовов) в библиотеку libX11, которая использую X11 Core Protocol передает команды на X-сервер. X-сервер интерпретирует команды и передает их на отрисовку драйверам устройств вывода. Воздействие же пользователя на устройства ввода считываются X-сервером через драйвера устройств ввода, через X11 Core Protocol передаются X-клиенту, libX11 переводит команды протокола в события и передает события в тулкит, и уже тулкит передает события программе для того чтобы та на них отреагировала.

То как приложение выглядит – то есть внешний  вид строк ввода, полос скроллинга, панелей и кнопок – за все это отвечает библиотека-тулкит (toolkit). Два наиболее распространенных на сегодняшний день тулкита, Qt и GTK, примерно равны по возможностям – они обеспечивают достаточную переносимость приложений (есть реализации GTK и Qt для основных платформ), поддержку «тем» внешнего вида, предоставляют программисту объектно-ориентированный интерфейс и некоторый набор служебных функций и возможностей.

Базовая библиотека X11 (libX11, или Xlib) позволяет программе абстрагироваться и «не связываться» с низкоуровневыми функциями протокола X11, и таким образом обеспечивает сетевую прозрачность X11, то есть позволяет программам работать как с локальным X-сервером, так и с запущеным на другом компьютере, причем делается это незаметно для программы.
19.4. Внутри X11. Растровые шрифты и их отображение

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

Эта технология, называемая X Core Fonts, поддерживается в X11 и сейчас, поэтому в наборе пакетов любого дистрибутива всегда можно встретить наборы широко распространенных семейств растровых шрифтов – fixed, hevetica, times, courier. При этом каждый шрифт представляется множеством файлов, для различных сочетаний размера, ширины и начертания – например, если шрифт имеет десять вариантов размеров (от 8 до 18), две ширины (обычный и жирный) и два начертания (стандартное и курсив), то он будет представляться 40 файлами – по одному файлу для каждого из сочетаний размера, начертания и ширины.

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

В большинстве дистрибутивов Linux сервер шрифтов включен в поставку X11 по умолчанию, и называется xfs. Его конфигурационный файл как правило находится в каталоге /etc/X11/fs. В конфигурационном файле сервера шрифтов перечисляются каталоги с растровыми шрифтами, а в конфигурационном файле X-сервера указано, что основным источником шрифтов является сервер шрифтов,запущеный на этом же компьютере.

В новейшей версии проекта Xorg сервер шрифтов уже считается «устаревшей» технологией и по умолчанию не используется (хотя и входит в поставку). При необходимости его (сервер шрифтов) можно запустить и использовать.

Методика наличия предопределенных растеризованых глифов в шрифте позволяла добиться достаточно качественного отображения шрифта в большинстве случаев, но в то же время такие эта методика имеет определенные недостатки – как известно, растровые шрифты очень плохо «вращаются» на угол не кратный 90 градусам, и плохо масштабируются, а с появлением устройств высокой четкости (LCD-мониторов) возникла необходимость еще и отрисовывать шрифты в «сглаженном» виде, с мягкими переходами цвета, чего растровые шрифты также предоставить не могли.

Наиболее распространенное приложение, использующее методику X Core Fonts – это графический эмулятор терминала xterm, который есть в составе всех дистрибутивов, или простейший менеджер графического входа в систему XDM.
19.5. Внутри X11. FreeType и XFT

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

При этом схема отображения шрифта меняется: X-клиент не передает на X-сервер запрос на вывод текста указанным шрифтом, а самостоятельно отрисовывает необходимы глифы шрифта использую функции FreeType и XFT, и передает на X-сервер уже сформированную картинку, которую X-сервер и отображает. Вполне логично, что при использовании этой методики X-клиент должен иметь доступ к оригиналу векторного шрифта (обычно это файл) – поэтому современные дистрибутивы также содержат еще и наборы векторных шрифтов PostScript и TrueType.

Новые версии тулкитов GTK и QT используют именно эту методику, но поскольку существуют еще и устаревшие тулкиты, такие как Motif или Xview (OpenLook) и значительное количество приложений на них основанных, да и с точки зрения необходимой полосы пропускания сети технология поддержки растровых шрифтов имеет явное преимущество пред XFT и FreeType, поддержка технологии растровых шрифтов по-прежнему входит в X11 и будет оставаться в ней еще долго.


Протокол X11 не является замершим в своем развитии, но его развития ведется не путем изменения самого протокола, а путем внесения в протокол расширений – то есть дополнительных опциональных наборов команд и инструкций. Например, для поддержки непрямоугольных окон было введено расширение XShape, для поддержки проигрывания видеороликов введено расширение XVideo, для поддержки OpenGL было введено расширение GLX и так далее.


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

xterm – эмулятор терминала

xfontsel – интерактивный просмотр растровых шрифтов

xdpyinfo – вывод информации о ваших настройках среды X11 и задействованных расширениях

xwininfo – просмотр информации об указанном окне (положение, размер, класс окна и т.п.)

xwd – моментальный «снимок» окна

xwud – показ результатов работы xwd

xhost – управление контролем доступа X-клиентов к X-серверу


Существует особая разновидность X-клиентов, называемых менеджерами окон. Их основная функция – обеспечивать управление другими окнами – перемещением, изменением размеров, сворачиванием и разворачиванием окон, отрисовкой обрамлений окон, управление передачей фокуса от окна к окну а также управление Z-порядком размещения окон. Соответственно, в один момент времени для одного экрана может быть использован только один менеджер окон.

GNOME и KDE имеют свои собственные менеджеры окон – это metacity и kwin. Менеджеры окон являются взаимозаменяемыми – то есть вы можете выбрать и использовать тот из них, который вам больше нравится или кажется более удобным. Еще один распространенный (то есть наличествующий почти на всех UNIX-системах) менеджер окон – это twm. Крайне простой и примитивный, он тем не менее предоставляет пользователю базовые функции управления окнами и доступ к меню приложений.

Не следует путать или отождествлять графическую среду и менеджер окон – в большинстве графических сред для Linux менеджер окон является заменяемым по желании пользователя компонентом, в отличие от Windows или MacOS, в которых менеджер окон фактически монолитно склеен с остальными частями графической подсистемы.


Современные версии X-сервера Xorg поддерживают специфическое расширение, называемое Composite. Вкратце его назначение описывается следующим образом: в процессе прорисовки вывода X-клиента, X-сервер рисует не непосредственно в видеопамять (то есть не на экран), а в промежуточный внеэкранный буфер (off-screen buffer), а специализированная программа, называемая Composite manager, подключается к этому буферу, при необходимости изменяет изображение и выводит в видеопамять уже измененное изображение. Такая технология позволяет получить эффекты прозрачности, искажения, плавного «всплытия» окон и многие другие без внесения каких-либо изменений в код X-клиентов или X-сервера. С другой стороны, преобразования изображений лучше реализовывать с использованием аппаратного ускорения, предоставляемого видеокартой.

XGL – это одновременно X-сервер и X-клиент. Как и обыкновенный X-сервер, XGL позволяет подключаться к себе X-клиентам, отсылает им события от устройств ввода и принимает от них команды отрисовки, отрисовку же принятых команд XGL производит с помощью OpenGL. Кроме того, как X-сервер XGL реализует поддержку расширения Composite. Как следствие, пользователь получает следующий «слоеный пирог»: внутри реального X-сервера, от которого требуется только поддержка OpenGL, запускается XGL. Все остальные программы Window manager, Composite manager и обычные X-клиенты подключаются к XGL. Поскольку назвать «элегантной» такую многоуровневую конструкцию нельзя, функции XGL были перенесены в основной X-сервер, а в интерфейс драйверов видеокарт была заложена возможность поддержки расширения Composite.

Наиболее развитые на данные момент драйверы имеют видеокарты NVidia, ATI и Intel. Драйверы видеокарт Intel пишутся сообществом разработчиков Xorg, по открытым фирмой-производителем спецификациям, и поэтому поддерживают Composite и аппаратное ускорение прорисовки трехмерной и двумерной графики, поэтому владельцы этих карт могут использовать Composite manager и расширение Composite в сочетании с поддержкой OpenGL. Спецификации на видеокарты фирм ATI и NVidia закрыты (недоступны разработчикам Xorg), и поэтому открытые драйвера отличаются усеченной функциональностью и слабой поддержкой аппаратного ускорения. Закрытые («проприетарные») драйверы видеокарт NVidia, предоставляемые производителем, обеспечивают поддержку аппаратного ускорения при выводе двумерной и трехмерной графики и предоставляют поддержку Composite. Драйверы для новейших видеокарт ATI следует признать крайне некачественными – в настоящий момент далеко не во всех версиях этих драйверов возможно одновременно задействовать аппаратную поддержку OpenGL и поддержку Composite.

Поддержка функции GLX_texture_from_pixmap была реализована в проприетарных драйверах видеокарт ATI версии 8.42, но эти драйвера этой и более новой версий поддерживают не весь спектр видеокарт производства этой фирмы.

Compiz – это Composite manager, которые в процессе работы использует библиотеки OpenGL и аппаратное ускорение, предоставляемое видеоадаптером. Сопоставляя вышесказанное о драйверах для различных видеокарт, можно сделать вывод что владельцы видеокарт NVidia и Intel могут использовать восзможности и эффекты, реализованные в Compiz, без сколь-нибудь трудностей, а владельцам видеокарт ATI не поддерживаемых новыми версиями драйверов, если они хотят использовать Compiz, необходимо прибегнуть в многоуровневой архитектуре с XGL.

Комментариев нет:

Отправить комментарий