Спецкурс по Linux, весна 2007, 11 лекция (от 04 мая)
Материал из eSyr's wiki.
Предыдущая лекция | Следующая лекция
Остались только плохие темы, например, организация хостинга с апачем. Осталась локализация, но надо тащить программистов. Родилась тема, как устроен X Window. Она устроена забавно, и не все с этой забавностью на ты. По крайней мере, это такой пробел, который есть при переходе от консоли к графике.
Надо начать сначала. Была лекция о 4-уровневом представлении информации. Надо сказать, что linux и unix-подобные системы не нуждаются в графической оболочке. В отличие от Windows. Она не работает без графической оболочки. В случае линуха это вполне нормально, с другой стороны, для организации нормального рабочего стола нужна графика.
Разговор идёт об Х11 и как из него сделать рабочий стол. На лектории был сделан упор на десктоп, а здесь же более детально разберёмся с первой частью.
Для начала напишем список задач, которые делаются рабочим столом:
- Эмулятор текстовой консоли — терминал
- Несколько рабочих областей на экране — если раньше мы имели дело с ситуацией один экран – одна раб область, то теперь их несколько. Это требование опасно, ибо надо видеть не все сразу, а только то, что хочется, посему:
- Ограничение контекста
- Вот мы решили две задачи — у нас в разных местах разные программы и ими можно как-то управлять. От ГК: постоянное наличие информационных областей, например, уведомления, часы (даже терминалы это умели)
- Быстрый доступ
- К программам, к инструментам
- К ресурсам
- “Эстетические” соображения — должно быть красиво
- Управление рабочими областями
Только самые конкретные из этих задач могут быть решены так, чтобы всем нравилось, например, эмулятор терминала, хотя даже их несколько штук.
Что же по поводу остального, то там способы решения могут быть разные. В нашем мире мы ограничены идеями окна, но мы не можем сказать, что мы разработаем некоторое решение, и оно всем понравится. Например, ГК не любит иконки и когда на них что-то шевелится.
- Паша: А часы?
- ГК: А они раз в минуту шевелятся
- Паша: А если с секундной стрелкой?
- ГК: А если на шкаф влезть?
Х11 — протокол клиент-серверного взаимодействия, где сервер что-то может, а клиент что-то хочет. Сервер — программа умеет рисовать и принимать события от устройств ввода, а клиент — программа, которая хочет рисовать и передаёт команды. Раньше можно было встретить X11R6, последний X11R7. Существует несколько реализаций этого протокола: X.org, Xfree86. Получившиеся реализации в запущенном виде это X Window System. Единственное, чего нет — X Windows, кроме, разве что, расшифровывать X WindowS как X Window System (Паша).
Раньше была The System, у ней была The W System, потом её оторвали и назвали The X Sysztem.
Очень много в эту систему вложено мозгов, она живёт и развивается до сих пор, особенно с появлением Хорг.
Архитектура: взаимодействие между клиентом и сервером. Клиент — наша программа, которая хочет рисовать и обрабатывать события.
Программа должна только знать, где находится сервер. Он может находиться на другом компьютере. Программа серверная — программа, которая запускается на компьютере с хорошей графкартой и устройствами ввода, и она обрабатывает команды клиентов и пересылает события.
Х сервер довольно универсальная программа, она может работать практически с любым устройством вывода и умеет различать всевозможные виды устройств ввода. Поэтому в его настройках довольно много пунктов.
Как клиент узнает, где у него сервер, и как сервер узнаёт, что клиент может управлять им?
- Существует переменная окружения DISPLAY, которая состоит из трёх частей: адрес:номер_сервера.номер_экрана. Несколько серверов бывают если воткнуты две видеокарты или в другом случае. Несколько дисплеев бывает, если карточка двухголовая.
- Как сервер узнаёт о том, что клиенту можно подсоединяться? Если бы это была передача данных, то можно было бы вводить пароль. Но при каждом старте программы вводить пароль это бред. Поэтому можно например, вводит пароль и генерить ключ. Осталось забыть про пароль и сказать, что сервер генерирует ключик, а коннектиться к нему могут все программы, которым этот ключик доступен.
- xhost — несекьюрный способ — разрешить ходить всем с определённых ip
- xauth — геренируется магическая печенька MIT, и теперь на него могут все ходить с печенькой. При запуске сервера говориться xauth, он геренирует ключ, кладёт его в файл, на который смотрят потом клиенты. Если клиент на другой машине, то на сервере ключ экспортируется, а на клиенте импортируется и всё хорошо.
[править] Окно
Каждый клиент может иметь несколько прямоугольных областей, внутренностями которого он может рулить. Область — понятие не аппаратное, ибо окна могут наслаиваться. Окно — прямоугольник, который зарегистрирован за определённой программой. На окна можно выводить, и содержимое окон можно читать. Второе свойство — если происходит событие, и оно связано с этим окном, то программа получает его себе. Раньше это было так: возили мышкой по экрану, и над каким окном мышь, того и события. Потом придумали фокус, и правила его передачи есть не наша проблема.
События: их очень много, и ими заведует xev. События могут быть не только от сервера, но и друг от друга. Есть даже специальная программа xse, которая может посылать события другим окнам.
Существуют некие не только события, но и они сами могут говорить Х-серверу, чего они хотят, например, свою геометрию. Существует некоторый специальный список свойств окна, которые можно задавать, например:
- Геометрия
- Позиция
- Z-ордер
- Хочет ли окно получать все события (является ли модальным)
и так далее.
Шрифты. Существует два подхода к тому, что собой представляют шрифты. Сначала был разработан подход серверный: приложение шрифтов не несёт, и просто говорит серверу “хочу такой” сервер говорит “нет такого, есть похожий”. Или “хочу шрифт 10 пикселов высотой, моноширинный, ...” сервер говорит: “есть 20 таких, вот тебе первый”. Чем идея хороша? Необязательно хранить шрифты на каждом клиенте. И получится такая забавная штука: в зависимости от того, на каком Х-сервере клиент запущен, программа видит по разному, и там, и там сносно довольно. Эта идея может быть развита дальше: совершенно необязательно шрифты хранить на той же машине, где и Х-сервер. Можно заиметь себе font-server, xfs, который их всем даёт. И тогда получается стройная картина.
В чём недостаток: недостаток первый — если вы используете очень дохлую машину, например, если используете LTSP (Linux terminal server Project), то каждый шрифт регистрируется и загружается в память сервера. И если один хочет выводить Хельветикой, другой Курьером (список шрифтов можно увидеть при помощи xfontsel, xlsfonts; в линуксе совершенно спокойно можно иметь 10000 шрифтов, в NT тоже) но если всеми шрифтами вывести хотя бы по одному символу, то память быстро сожрётся. Можно рендерить шрифты на стороне клиента и рисовать их как картинки. Например, xft так работает. Недостаток: при каждом клиенте должен быть свой набор шрифтов.
Откуда берутся сервера с номером больше 0:
- Несколько граф устройств вывода, например, две видеокарты
- Программы: xprint (вывод на принтер), xnest (программа, которая говорит, что она xserser), xvnc (X virtual network connection)
- Прокси. Можно установить секьюрное соединение и сказать “большая машина в шкафу, выводи все свои иксовые команды в сервер с номером 10”, но это не х-сервер, а прокси, который перекидывает команды с одной машины на другую. Это почти тоже самое, что указание адреса, но в качестве протокола можно использовать не голую пересылку команд, а ssh. короче, ssh -X
если речь идёт об архитектуре Х11, то на этом можно остановиться. Никакого рабочего стола эти возможности не дают.
Рабочий стол это не программа, это такие настройки.
Попробуем эти задачи решить:
- как сделать терминал? Достаточно воспользоваться любым PTMX, который выдаёт терминал, и потом пишете программу, которая одним концом смотрит на PTMХ, а другим на х-сервер.
- Несколько рабочих областей на экране. Окна. У них даже есть зачатки решения задачи ограничения контекста. Например, есть z-буффер и возможность превращения в иконку, или иметь состояние быть не нарисованным нигде (unmap)
- Ограничение контекста. Виртуальные экраны. У некоторых их до 20, работает это месяцами и зовут их Никита.
- Информационные области.
- Менюшки, иконки. Это такие организаторы быстрого доступа.
- Есть такие штуки, панели. Это такие полоски, которые всегда на экране и на которых что-то нарисовано. Она решает задачу информ областей и быстрого запуска.
Совершенно необязательно это одна и та же программа.
Остались две задачи: Если есть окна, то нужен механизм для их управления. Сам х-сервер ничего делать не будет. Вывод: есть окновод, который позволяет управлять окнами. Из консоли окнами управлять неудобно, хотя такие программы есть (wmctrl, xwit). Окновод – это клиент.
Почему панель это не window manager. Задача окновода это управлять окнами, у панели другая задача. Это могут быть вообще разные программы, например, 9wm. а есть монолитные среды.
Интегрированные, однородные среды. Рабочие столы: KDE, Gnome, xfce, rocks. Идея в том, чтобы под каждую из этих задач предложить своё решение. Идея гнома и кед дополнительно в том, что предлагается единый интерфейс. Плюс единство настроек. Всё настраивается в одном месте (правда это места до ужаса большое и напоминает одно место), с помощью гуёвой настроечной программы. Ну и всякие мелочи вроде драг-н-дропов... Какую цену мы платим: там одна парадигма на всех виндузообразная, и её не поменяешь. Ещё это начинает жрать безумное количество ресурсов.
Осталось: .xdefaults и .xinitrc
01 02 03 04 05 06 07 08 09 10 11 12
Календарь
Февраль
| 16 | ||||
Март
| 02 | 09 | 16 | 23 | 30 |
Апрель
| 06 | 13 | 20 | 27 | |
Май
| 04 | 11 |
18 мая 2007 года прошёл экзамен по курсу. Краткий конспект экзамена.
22 мая 2007 года прошёл экзамен по курсу для студентов 3 курса и тех, кто не сдал экзамен 18 мая. Подробности здесь.
12 июня 2007 года (вторник) пройдёт экзамен по курсу. Информация об экзамене отсюда.