В конспект включены небольшие добавления из лекции, прочитанной в рамках спецкурса по Linux на ф-те ВМиК МГУ весной 2007 года.
Слишком много возможностей: при описании графической оболочки возникает очень много удобных инструментов (сотни или тысячи инструментов), что даже перечисление заняло бы много времени.
Если мы поставили Linux, дело за малым — поизучать шужные инструменты и освоить те, вплоть до улучшения их. А как сделать так, чтобы эта работа была удобной?
Отступление: рабочий стол и сеть. Комплект программ, работающих с сетью — имеется (почта, WWW и т. п.), но настоящего сетевого рабочего стола пока нет, сеть представляется в виде чего-то удалённого, к чему есть или нету доступа, а не частью рабочего места.
Какие задачи решает «рабочий стол»?
Системе более 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), но они попроще, их может быть недостаточно.