Графический интерфейс (X11)
X Window System
Обратите внимание на то, что все заглавные буквы "X" в этой лекции – латинские.
На свете существует множество графических устройств, управление которыми на низком уровне (вывод изображений и ввод данных, например, о перемещении мыши) – задача совсем не для пользователя, тем более что каждый вид устройства управляется по-своему. Заботы о вводе и выводе на низком уровне берет на себя графическая подсистема Linux – X Window System, предоставляя пользовательским программам возможность работать в терминах оконного интерфейса.
X Window System возникла все в той же UNIX, причем проект этот был настолько наукоемок и настолько полно охватывал тогдашнюю область задач, связанную с графикой, что никаких серьезных альтернатив ему так и не появилось.
X-сервер и X-клиенты. Протокол X11
X Window System использует традиционную оконную модель, в которой пространством ресурсов является экран. Экран – это прямоугольник, на котором отображаются команды графического вывода и организуется обратная связь с устройствами графического ввода. Пример обратной связи – указатель мыши. Сама мышь – довольно простое устройство ввода, способное передавать информацию о перемещении курсора и состоянии кнопок. Указатель же отображает мнение подсистемы об абсолютных координатах гипотетической "точки ввода".
В примере указатель мыши показывает расположение точки ввода (на кнопке "WindowMaker" ). Если сейчас Мефодий нажмет на левую клавишу мыши, графическая подсистема зафиксирует это событие ввода и передаст его той задаче, которой принадлежит соответствующая кнопка. Именно задачи (а не сидящий за монитором пользователь) и являются субъектами для X Window System, и именно между ними разделяются графические ресурсы. Каждой задаче принадлежит одно или несколько окон, представленных некоторой (как правило, прямоугольной) частью экрана. Внутри окна выполняются графические операции (вывод) и именно окнам передается поток данных от устройств ввода. Какое окно получит события ввода – определяется с помощью синтетического понятия фокус: вводимые данные передаются от графической подсистемы только тому окну, которое "получило фокус "; по умолчанию это происходит, когда указатель мыши попадает в часть экрана, занимаемую этим окном.
В более сложном случае окна могут перекрываться, частично занимая один и тот же участок экрана. Если дополнительно постановить, что каждое из них лежит на своей глубине, то самое "верхнее" будет отображаться полностью, и ему будет доступен для вывода и получения фокуса весь заказанный прямоугольник. Следующее за верхним окно может быть им "загорожено", и тогда отображается только часть этого окна, которую видно "из-под" верхнего. Заметим, что выводить это окно можно в пределах всего заказанного прямоугольника, просто видно может быть не все, и управление фокусом будет происходить на основании видимой части окна.
Программа, которая отвечает за работу с устройствами графического ввода и вывода и обеспечивает при этом логику оконной системы, называется X-сервером (X Server, то есть сервер системы "Икс"). В рамках X Window System X-сервер – это ядро. Подобно ядру, он выполняет низкоуровневые операции и взаимодействует с аппаратурой, ничего самостоятельно не предпринимая. Подобно ядру, он предоставляет задачам унифицированный интерфейс к этим низкоуровневым функциям, а также занимается разделением доступа ( окно и фокус ) к графическим ресурсам. X-сервер не интересует, отчего эти задачи появляются и чем живут. Он только принимает запросы на выполнение графических действий и передает по назначению вводимые данные. Жизнеобеспечение процессов и даже способ передачи X-запросов – дело исключительно операционной системы, по отношению к которой и сам X-сервер – задача.
Задачи, которые обращаются к X-серверу с запросами, называются X-клиентами. Обычно X-клиент сначала регистрирует окно (можно несколько), которое и будет служить ему полем ввода-вывода. Потом он сможет рисовать в этом окне и обрабатывать происходящие с окном события: активность устройств ввода и изменение свойств самого окна (размер, перемещение, превращение в иконку, закрытие и т. п.). X-клиент в Linux – это процесс, запускаемый обычно в фоне (не связанный по вводу с терминальной линией). В самом деле, зачем процессу читать с терминала, когда для ввода он может использовать X-сервер? Если с X-сервером связаться не удастся, на стандартном выводе ошибок может появиться какое-нибудь сообщение – его легко перенаправить в файл.
X-сервер. Программа, принимающая и обрабатывающая X-запросы .
Клиент передает серверу X-запросы любым доступным ему способом. В разных версиях Linux, например, могут использоваться различные объекты файловой системы (чаще всего так называемые сокеты, сходные по функциональности с двунаправленными каналами). Во многих случаях запросы передаются по сети; при этом неважно, какой именно транспортный уровень будет использован для соединения клиента с сервером (в современных системах это, чаще всего, сеть TCP/IP и протокол TCP). Главное, чтобы клиент посылал стандартные запросы, соответствующие определенному протоколу обмена данными. Кстати сказать, другое имя X Window System – X11 (или X11R6) – это просто номер версии X-протокола, стандартизующего X-запросы, при этом "R6" обозначает номер подверсии ( revision ) и вполне может увеличиться, если X11R6 устареет настолько, что потребует пересмотра ( revision ).
"Голый" X-сервер, к которому не присоединен ни один X-клиент, можно запустить из командной строки – для этого достаточно выполнить команду "X" (одна заглавная латинская буква X). Именно так и поступил Мефодий — текстовая консоль сменилась черным экраном без всяких окон3В некоторых вариантах X Window System экран по умолчанию раскрашивается в черно-белую крапинку..
На экране есть только крест, который перемещается при перемещении мыши – курсор. Это означает, что X-сервер запущен корректно, установил необходимую связь с устройствами графического ввода и вывода и ожидает, когда к нему с X-запросами обратится какой-нибудь X-клиент. Однако, пока не запущен ни один X-клиент, для пользователя X-сервер совершенно бесполезен: кроме перемещения курсора сделать ничего невозможно. Мефодий мог бы растеряться, оказавшись перед черным экраном X-сервера, если бы не знал о том, что может переключиться обратно на любую виртуальную консоль, нажав сочетание клавиш Ctrl+Alt+FN, где N – номер консоли от 1 до 12. Переключиться обратно на экран, управляемый X-сервером, можно, нажав комбинацию клавиш Ctrl+Alt+F7.