> Лекция восьмая -- Графическая подсистема: метафора ``рабочего стола'' _В конспект включены небольшие добавления из лекции, прочитанной в рамках спецкурса по Linux на ф-те ВМиК МГУ весной 2007 года_. Слишком много возможностей: при описании графической оболочки возникает очень много удобных инструментов (сотни или тысячи инструментов), что даже перечисление заняло бы много времени. Если мы поставили Linux, дело за малым -- поизучать шужные инструменты и освоить те, вплоть до улучшения их. А как сделать так, чтобы эта работа была удобной? Отступление: рабочий стол и сеть. Комплект программ, работающих с сетью -- имеется (почта, WWW и т. п.), но настоящего сетевого рабочего стола пока нет, сеть представляется в виде чего-то удалённого, к чему есть или нету доступа, а не частью рабочего места. > Задачи графической оболочки Какие задачи решает ``рабочий стол''? . Терминал и командная строка всё равно нужны . Возможность самостоятельной организации и настройки . Работа по сети: разделение графической оболочки и места, где запускаются программы, тогда можно организовать один большой компьютер и графические терминалы (в ALT Linux есть способ сделать т. н. ``тонкий терминальный клиент'', см. статью) . Несколько рабочих областей на одном экране, а чтобы это не превращалось в свалку -- огранизация групп рабочих областей по контекстам, чтобы не валялись все окна на экране . Специальные постоянные области на экране для оповещения и отображения информации . Быстрый доступ к инструментам, ресурсам и функциям управления программами (если программ запущено одновременно много, ими надо управлять намного чаще, чем в ``классическом'' Linux) . Usability и внешний вид по вкусу > Инструмент решения: X11 Системе более 20 лет, но устаревать она пока не собирается. X11 -- это название _протокола_ взаимодействия клиентской программы с сервером, коорый умеет рисовать. _Реализации_ протокола X11 -- XFree86 и XOorg, а также всякие несвободные (если они ещё живы). X-сервер -- это программа, которая умеет рисовать и взаимодействивать с устройствами ввода (как минимум м-- мышкой и клавиатурой); больше ничиего она не умеет. X-клиент -- это программа, которая подключается к X-серверу и передаёт ему графические команды по протоколу X11, а получает от него т. н. _события_ -- сообщения о перемещении мыши, о нажатых клавишах, о необходимости пепрерисовать содержимое и т. п. В примере X-сервер потребил больше процемссорного времени, чем другие команды, потому что он всё это время рисовал, отрисовка всего, что на экране -- это дело сервера. Сервер запускается на машине пользователя, клиент -- на любой машине в сети. Такая ловушка для студентов: сервер -- на пользовательской машине, а клиент -- на машине в шкафу, а не наоборот! Потому что X-сервер и X-клиент -- это не компьютеры, а программы. У каждого окна есть название объекта (Instance), тип (Class), заголовок (Name) и уникальныей номер (ID). Можно отличать окна по всем эатим идентификаторам, причём первые три могут соответствовать нескольким окнам. Клиент узнаёт о том, где находится сервер? Из переменной окружения DISPLAY. Она состоит из трёх частей: "{адрес}:{номер_сервера}.{номер_экрана}". Если адреса нет, значит сервер запущен на той же машине, что и клиент, и можно подключаться не по сети, а через т. н. unix domin socket (такой тип файла-дырки). Серверов бывает несколько на одной машине, например, вторая видеокарта, или X-сервер, выводящий изображение на принтер (Xprint), или Xnvc -- X-сервер, транслирующий изображение по сети по протоколу VNC, или при использовании _виртуальных_ X-серверов (как, например, при ^ssh -X^). Всё это нельзя показать вживую и понятно в слайдах: нужно несколько компьютеров. Номер экрана, не равный нулю -- это когда одна видеокарта имеет несколоько выводов. Как сервер идентифицирует, какой и откуда клиент пользуется его услугами? Простой способ -- ^xhost^, который разрешает или запрещает доступ любым программам с некоторых адресов. Это небезопасно, злоумышленник может запустить т. н. ``клавиатурный вор'' и подглядесть пароль, зайдя с ``разрешённой'' машины. Лучше использовать ^xauth^, программу, которая при старте X-сервера генерирует ключик, и любой X-клиент должен этот ключик знать, чтобы подключиться к X-серверу. Если клиент и сервер запущены с одного компьютера, достаточно доступа к файлу с ключами, если с разных -- копирования ключа с помощью того же ^xauth^ с машины с сервером на машину с клиентом. Xauth считается не вполне безопасным, поэтому наиболее надёжно использовать secure shell, но времени это описавть нет. Окно -- на самом деле необязательное понятие. Наверное, можно решить задачу организации рабочих областей на одном экране другим способом, но он нам неизвестен. Окно -- это прямоугольник, который зарегистрирован за некоторым клиентом, в этом прямоугольнике клиент может рисовать, получать оттуда события. Окна могут перекрывать друг друга. Получение событий происходит, если окно получило <фокус|> -- такое синтетическое понятие, вроде переходящего красного знамени. Фокус всегда у одного окна, но можно зарегистрировать такой X-клиент, который будет сам обрабатывать события и сам решать, какому окну отдавать фокус и перенаправлять эти события. А по умолчанию фокус отдаётся тому окну, над которым указатель мыши. События можно возбуждать вручную, так же, как передаются сигналы в Linux. Например, с момощью программы ^xse^ можно сделать вид, будто пользователь набрал что-то на клавиатуре. X-клиенты обычно принимают стандартный параметры ^-geometry {ширина}x{высота}+{абсцисса}+{ордината}^ (вместо "+" можкт стоять "-", тогда смещение от противоположного края экрана), ^-fg {цвет}^, ^-bg {цвет}^, ^-fn {шрифт}^ и т. д. Шрифты в X11: серверные и клиентские. Клиентский шрифт находит где-то X-клиент, преобразует его и тащит с собой на X-сервер (наверное, в виде картинок). Достоинство: программа может распространяться вместе со своими заковыристыми шрифтами. Недостаток: даже если у всех программ шрифты одинаковые, они занимают много памяти. Серверный шрифт добывает X-сервер (из файла _на той же машине, что и X-сервер_ или обращаясь к специальной службе ^xfs^, X Font Server, которая раздаёт шрифты по сети), зарегистрированных серверных шрифтов может быть много (десять тысяч), но в память _сервера_ попадают только те, которыми конкретные X-клиенты захотели что-то вывести. Клиент показывает X-серверу шаблон со словами ``хочу такой шрифт'', а сервер подбирает подходящий. Достоинство: все шрифты в одном месте или, наоборот, для каждого сервера отдельные, гибкий подбор по шаблону. Недостаток: можно съесть всю память X-сервера, если выводить всеми шрифтами сразу. В ALT Linux и X-сервер и xfs по умолчанию не принимают подключений из сети, только через сокет -- по соображениям безопасности. > ``Наборный'' рабочий стол Главная программа -- Window Manager, окновод. Она кправляет всеми окнами: рисует декорации, рамочки, кнопки и др. вокруг окна и предписывает поведение окон, когда на эти кнопки нажимают, за эти рамки тянут и т. д. X-сервер умеет изменять размер окон, перемещять их, превращать в иконки, закрывать, поднимать надо всеми или опускать и т. п., но сам ничего не делает, дожидается, пока его об этом попросят. Кто попросит изменить размер окна какой-нибуль программы? Может и сама программа, но это неудобно, встраивать управление в каждый X-клиент. Эту работу на себя берёт окновод -- специальный X-клиент, который берёт на себя функцию управления окнами. Если не запущено окновода, окнами управлять обычно нельзя, будут статические прямоугольники. Виртуальные экраны (workspace) -- это не аппаратное свойство, это окновод решает задачу ограничения контекста. В один виртуальный экран можно положить окна, связанные с WWW, почтой и прочей сетью, в другом заниматься разработкой и т. п., чтобы не путаться. Настроечный файл ^.icewm/prefoverride^ содержит только _отличия_ от ^/etc/X11/icewm/preferences^. Есть такой подход, что больше ничем окновод может не заниматься. Например, меню может организовывать другая программа, панель -- третья, тогда удобнее комбинировать. Меню решает задачу быстрого доступа: запуск программ путём посика во вложенных списках. В ALT Linux (почти) все окноводы используют стандартное меню, а X-клиенты имеют с собой специальный файл: при установке пакета обновляется стандартное меню всех установленных окноводов. Иконки на экране -- это тоже быстрый доступ (на этот раз -- к ресурсам). Для ^icewm^ существует парный инструмент -- ^IDesk^, и его удобно настроить даже автоматически, просто создавать простые текстовые файлы в каталоге ^.idesktop^, от этого появляются иконки. Панель -- это место, где что-то отображается, -- решение задачи ``постоянных информационых областей'': часы, индикатор загрузки, уведомление о почте и т. п. Огранизует очень быстрый доступ (одно нажатие -- запуск). Хранитель экрана никакого экрана не хранит уже давно, а просто рисуе развлекающие картинки. Всякий раз разные, их очень много в Linux-овых хранителях экрана. Обустройством такого рабочего стола можно заниматься долго. Зато получается на любой вкус. > Тонкая настройка Запуск графической оболочки после входа в систему с термиала. Программа ^startx^ запускает X-сервер, настраивает окружение 9скажем, DISPLAY) и запускает пользовательский командный сценарий ^.xinitrc^. Пока этот сценарий на закончит работу, X-сервер активен и пользователь в нём работает. Как только выполнение ^.xinitrc^ завершится, X-сервер также завершится, а все X-клиенты получат сообщение ``ваше окно закрыто, потому что его негде рисовать'', и тоже остановятся. Логично, чтобы в ^.xinitrc^ просто запускались X-клиенты, причем все, кроме одного, запускются _в фоне_ (в виде "{программа} &"), и только один -- не в фоне; соответственно, когда этот один закончит работу, выполнение сценария тоже закончится, и сеанс работы в графической оболочке сам собой завершится. Обычно этот один -- окновод, а в нём есть меню ``завершить работу'', то есть просто останов окновода. Можно заходить в систему с помощью ^xdm^ -- графического аналога ^login^ (^xdm^ позволяет также подключаться по сети к удалённой машине, но продемонстрировать это в слайдах трудно, см. ту же самую статью про тонкие клиенты). Тогда _сначала_ будет запущен X-сервер, потом -- выбранный окновод (могут даже предложить выбрать), а только потом -- пользовательские X-клиенты. Используется схема ".d": все сценарии из каталога ^.xsession.d/^ запускаются по очереди. Все X-клиенты могут считаывть т. н. ``файл ресурсов'' специального формата. По умолчанию настройки лежат в ^/etc/X11/app-defaults/^, а изменения этих настроек можно складывать в файл ^.Xdefaults^. Там очень много чего можно перенастроить. В частности, цвет. Вот недостаток наборного рабочего стола: если вам нравится какая-то цветовая гамма, вам придётся перенастраивать _много_ программ, как минимум, если они собраны с разными интерфейсными библиотеками -- GTK, Qt, Tk, Xt и т. п. О клавиатуре. Настройка клавиатуры в старом стиле, при помощи ^xmodmap^, сейчас использовать не надо! Надо использовать ^xkb^ -- это _расширение_ X11, которое позволяет модифицировать и настраивать обработку клавиатуры: задавать раскладку, поределять переключатель раскладок (много разных вариантов, например, по клавише ``меню''), добавлять разные (``мультимедийные'') клавиши, если они есть и т. п. Программа ^setxkbmap^ делает это на лету. Поправочка, ``мультимедийные'' клавиши некоторые клавиатур не возвращают scen-кодов, это вообще не клавиатура, такие спецкнопки вроде кнопки Power, и обрабатывать их надо не ^xkb^, а программами, работающими с ACPI, так же, как и нажание на Power. Есть программа ^xxkb^, которая позволяет за каждым окном закреплять _свою_ раскладку: например, в одном окне -- русская раскладка, а в другом -- англйская; удобно, когда занимаешься переводом, русский и английский текст. Отображение на рабочем столе автоматически смонтированных устройств -- это делается в однородных рабочих столах. При этом в системе должно быть автоматическое монтирование, что далеко не всегда удобно. В лёгких средах, вроде XFCE или BlackBox, делается проще: такая коробочка показывается с устройствами, нажимаете на устройство -- смонтировалось с какими-то параметрами по умолчанию, если не понравилось, параметры можно поменять. Спомощью ^xset^ много можно настроить, в частности, указать, где шрифты лежат. С помощью ^xmodmap^ переопределяются клавиши и кнопки мыши... и т. д., до бесконечености. > Однородный рабочий стол Две самые большие системы ``рабочий стол'': KDE и GTK, KDE слегка более технологично. Единство интерфейсной библиотеки позволяет делать единый интерфейс (и настраивыать его единожды), применять специальную программу-настройщик (control center), а не редактировать настроечные файлы вручную, и даже вписывать в этот control center настройки системы (X-сервера, устройств), что, на самом деле, непросто и не всегда хорошо работает. Всякие дополнительные возможности, которые можно устройить между двумя прогарммами, имиспользующими _одну и ту же_ интерфейсную библиотеку, например DnD. Про DnD (Drag and Drop): практика показывает, что открытие диалога удобнее и безопаснее DnD, а то уронишь иконку не туда. Главное достоинство: сообщество может вместе работать над таким рабочим столом, делать ``темы'', повышать удобство, дописывать утилиты и т. п. Главный недостаток -- большая ресурсоёмкость. Есть ``промежуточные'' решения задачи создания однородного рабочего стола: XFCE, Rocks, WindowMaker и т. п. Это уже далеко не только окноводы, это уже полноценные рабочие столы, но единство интерфейсных библиотек требует, чтобы _все_ приложения их использовали. Если это не так, некоторыми достоинствами воспользоваться нельзя. Например, Open Office или GIMP уникальны, есть соответстующие программы под KDE (KOffic и среди kdegraphics), но они попроще, их может быть недостаточно.