В началоLinux не для идиотов → X11 и все-все-все
Gentoo-doc HOME Пред.: Управление пользователями, NSS и PAMВ началоУровень выше: Linux не для идиотовСлед.: Локализация

19. X11 и все-все-все

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

19.1. Клиент-серверная архитектура X11

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.

19.2. Графическая среда пользователя

Графической средой мы будем называть набор программ, для пользователя для выполнения им повседневных функций. Каждая из этих программ как правило является самостоятельным 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 и будет оставаться в ней еще долго.

19.6. Внутри X11. Расширения

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

19.7. Внутри X11. Полезные утилиты

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

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

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

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

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

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

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

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

19.8. Внутри X11. Менеджер окон

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

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

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

19.9. Внутри X11. Composite, XGL и Compiz

Современные версии 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.

Пред.: Управление пользователями, NSS и PAMВ началоУровень выше: Linux не для идиотовСлед.: Локализация
В началоLinux не для идиотов → X11 и все-все-все