Различия между версиями 23 и 31 (по 8 версиям)
Версия 23 от 2008-10-10 14:58:49
Размер: 23249
Редактор: FrBrGeorge
Комментарий:
Версия 31 от 2008-10-15 13:45:14
Размер: 33191
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 17: Строка 17:
'''Диспетчер окон'''. X-клиент, в обязанности которого входит передавать другим X-клиентам фокус по своему усмотрению, называется диспетчером окон (''окноводом''). Диспетчер выпол
----
Черновик
----


Организация интерфейса привычная. Есть понятие окно, которое сильно сужает варианты использования графического интерфейса. То есть каждое приложение, когда хочет чего-то показывать на экране, регистрирует себе несколько прямоугольников (т.е. окон), и может в них рисовать и принимать сигналы нажатия кнопок и движения мыши. Есть понятие фокуса, вы можете переключаться между окнами, разделяя устройство ввода, фокус может перемещаться, и в зависимости от того ,какой прямоугольник захватил его, ему и посылаются события с устройства ввода. Окна могут наслаиваться друг на друга. Существует понятие глубина, и на основе этого определяется какому окну относится некая точка, которая вообще говоря принадлежит нескольким окнам. На всё это накладываются некие дополнительные ограничения, связанные с тем, что вы объявляете что окна всего лишь окна, а управление ими отдаётся отдается приложению под названием окновод/диспетчер окон (window manager). Конечно, существует команда х-серверу по манипуляции окнами, и приложение может такие команды подавать, но неправильно было бы перекладывать управление окнами на приложение, поскольку тогда бы в каждом приложении была бы куча кода по манипуляции окнами. Поэтому логично было бы отдать задачу управления окнами отдельному приложению под названием window manager, который и позволяет пользователю всё это делать: двигать, изменять, превращать в иконки, скрывать окна, и так далее. фокус.

То, с чем мы имеем дело сейчас (в дистрибуитиве Lite) --- рабочий стол xfce с диспетчером окон xfwm, в юниоре, терминал сервере и мастере есть рабочий стол kde, диспетчером окон там является kwin
(''м.б. вставить скриншот?'')

==== Экран ====

Оставим протокол X11, и вспомним про то, как устроен экран. Тут мы говорим, что виртуальных экранов может быть несколько, есть приятные интерфейсные штуки, которые связаны не с окнами, а с управлением программными продуктами, и так далее. Например управление менюшками, кнопочками. Эти все функции может взять из себя диспетчер окон, а может и не брать. В графических средах типа kde/xfce запускается куча приложений, каждое из которых занимается отдельным делом (например иконки на рабочем столе).
'''Диспетчер окон'''. X-клиент, в обязанности которого входит передавать другим X-клиентам фокус по своему усмотрению, называется диспетчером окон (''окноводом''). Диспетчер выполняет всю работу по управлению окнами: передаёт фокус, позволяет перемещать окна, изменять их размер и глубину, скрывать, превращать в иконки и многое другое. Все эти действия производит, разумеется, X-сервер, а диспетчер подаёт ему соответствующие команды. Для удобства управления диспетчер обычно пририсовывает к окнам декораторы: красивую рамочку, заголовок, кнопки и т. п. Сами приложения также могут посылать серверу соответствующие команды, однако заставлять каждый X-клиент заниматься управлением собственным окном было бы неразумно. С другой стороны, неправильно заставлять X-сервер заниматься управлением окнами самостоятельно: это привело бы к потере свободы выбора. На сегодня существуют десятки различных окноводов, каждый из них реализует свою собственную концепцию управления окнами и их оформления в соответствии с требованиями "рабочего стола".

В "Лёгком Линуксе" используется графическая среда XFCE, в состав которой входит диспетчер xfwm, а в "Юниоре", "Мастере" и "Терминале" -- KDE и диспетчер kwin.

==== Рабочий стол ====

Для реализации метафоры "рабочего стола" недостаточно управлять одними только окнами. Удобного интерфейса требует управление виртуальными экранами, быстрый запуск приложений, доступ к документам, отображение меняющейся информации и многое другое. Всевозможные интерфейсные примитивы: меню, панели, лотки и прочее диспетчер окон может на себя и не брать, этим в "больших" окружениях, вроде KDE, занимается целый комплект программ, дополняемый службой передачи сообщений, более сложных, чем X11, собственной интерфейсной библиотекой и многим другим. Настройка рабочего стола обсуждается в другом месте, здесь важно понять, что "настройка X-сервера" -- это другое, достаточно низкоуровневое действие, требующее некоторой квалификации.
Строка 41: Строка 33:
То, что вы видите, это некий графический интерфейс к пачке утилит, которые являются мозгом для определения возможностей графической подсистемы, а с другой стороны, к конфигурационный файлу системы xorg. Сам Alterator -- это некий графический интерфейс к набору утилит, диагностирующих и настраивающих ту или иную часть системы. В частности, пункт "Графический интерфейс -> Дисплей" отвечает за определение параметров видеокарты и монитора, и за внесение изменений в настройки Xorg.
Строка 45: Строка 37:
"Монитор 1024х768" - это не разрешение, а некий монитор по умолчанию, который используется, если нет конкретных данных. Есть мониторы, о которых такие данные есть. Хотелось бы добавить распознаватель драйвера монитора, который является файлом содержащим допустимые физические характеристики монитора. Надпись "Монитор 1024х768" -- это не планируемое разрешение, а некий ''тип'' монитора по умолчанию. Такой тип который используется, если нет конкретных данных о мониторе, кроме того, что он, очевидно, поддерживает разрешение 1024 на 768 точек. Есть мониторы, о которых такие данные есть; кроме того, такие данные содержатся в т. н. "драйвере ''монитора''", который представляет собою просто текстовый файл. Данные из этого файла можно использовать для ручной настройки Xorg.

Другие настройки достаточно очевидны. "Драйвер" -- это драйвер ''видеокарты''; он определяется автоматически, и изменять это значение стоит только если что-то не работает (в этом случае стоит попробовать стандартный драйвер "vesa"), либо при ывборе между свободной и несвбодной реализацией драйверов AMD/ATI и nVidia. Можно также изменить планируемую глубину цветности (bits per pixel) и разрешение экрана в точках.
Строка 49: Строка 43:
Рассмотрим содержание файла xorg.conf, расположенного в /etc/X11. Он состоит из секций, каждая отвечает либо за устройство, либо за синтетическое понятие (комплект устройств для общения с пользователем, или наоборот их части)(например, layout), или за некоторые файлы (секция Module --- загружает модули).

 * Первая секция - секция ServerLayout, она определяет, на каком screen (см. ниже) какие устройства ввода применяются.

{{{
Рассмотрим содержание файла `xorg.conf`, расположенного в `/etc/X11`. Он состоит из секций, каждая секция описывает параметры какого-либо устройства, комплектацию или структуру сервера, пользующегося этими устройствами. В секции может встречаться поле "Identifier", на которое могут ссылаться другие секции.

  * Головная секция -- !ServerLayout, она задаёт "рабочее место": мышь и клавиатуру, которыми пользователь пользуется и экран (Screen), на который он смотрит:
  {{{
Строка 62: Строка 55:
 * Секция загрузки модулей (Module):

{{{
  * Секция загрузки модулей Module определяет, какие расширения X11 необходимо дополнительно загрузить:
 {{{
Строка 76: Строка 68:
 
Здесь type1 --- шрифты, freetype --- шрифты (проверить), glx --- трехмерная графика, dri --- графическое ускорение, dbe --- работа с памятью. (''а что, собственно, такое '''extmod'''?'')

* Секция ServerFlags:

{{{
  Здесь type1 -- поддержка шрифтов "Type 1", freetype -- поддержка шрифтов "Truetype", glx -- трехмерная графика, dri -- графическое ускорение, dbe -- работа с памятью. Подсекция "extmod" отвечает за загрузку модуля с целым спектром расширений X11 и их настройку.
  * Секция !ServerFlags:
  {{{
Строка 87: Строка 75:

Опция allowmouseopenfail позволяет иксам грузиться, даже если мышь не работает. Кроме того, мышью можно управлять с клавиатуры (нажать сочетание shift+numlock, а потом использовать клавиши на цифровой клавиатуре для перемещения мыши).

* Секции InputDevice:

{{{
  Опция !AllowMouseOpenFail позволяет серверу грузиться, даже если мышь не работает. Графическим указателем можно управлять с клавиатуры (нажать сочетание shift+numlock, а потом использовать клавиши на цифровой клавиатуре для перемещения мыши).
  * Секции !InputDevice:
  {{{
Строка 98: Строка 83:

 Эта часть отвечает за драйвер клавиатуры --- kbd. Для включения дополнительных трёх кнопок на клавиатуре надо выбрать в настройках клавиатуры (в центре управления системой) "клавиатура acpi", при этом меняется содержимое файла /etc/X11/xinit/Xkbmap. В какой-то момент появился setxkbmap, который повторяет синтаксис xorg.conf, и позволяет каждому пользователю настраивать клавиатуру по-своему.

{{{
  Эта часть отвечает за драйвер клавиатуры -- kbd. В настоящее время эта секция используется не столь активно, как раньше, так есть возможность изменять настройки клавиатуры из командной строки, с помощью `setxkbmap`. Например, если в Центре управления ("Графический интерфейс -> Настройка клавиатуры") выбрать тип "клавиатура acpi", начнут распознаваться три стандартные кнопки ACPI (Power, Sleep. Wake). Результат запишется не в `xorg.conf`, а в файл `/etc/X11/xinit/Xkbmap`, используемый при старте сеанса работы с X-сервером.
  {{{
Строка 110: Строка 93:

 Здесь указаны параметры мыши. Стоит отметить, что последняя опция --- ZSxisMapping. Кроме того, поворот колеса --- перемещение по оси z. Никто почти его не использует, поэтому их принято преобразовывать в нажатия кнопок 4 и 5. Если вдруг кнопки определились неправильно, и при нажатии на одну кнопку он делает то, что должно делать при нажатии на другую, то сначала запускаете xev, а потом xmodmap (''эту часть как-то не очень понял'')

 * Секция Monitor.
{{{
  Это параметры мыши. Стоит отметить, последнюю опцию -- !ZAxisMapping. Мало кто помнит, что поворот колеса мыши -- это "перемещение по оси Z". Это перемещение почти никто не использует, поэтому поворот колеса принято преобразовывать в нажатия кнопок 4 и 5. Также обстоит дело и с другими частями мыши. В результате может оказаться, что помимо первых трёх (стандартных кнопок) на вашей мыши имеется ещё четыре, причём номерам 4 и 5 соответствует не колесо, а две кнопки сбоку. Тогда необходимо запустить `xev` и выяснить, какая кнопка какой номер имеет, а затем использовать нечто похожее на `xmodmap -e "pointer = 1 2 3 6 7 4 5"`.
  * Секция Monitor -- параметры монитора:
  {{{
Строка 121: Строка 102:

 Если бы мы воспользовались конфигуратором, то мы бы увидели первые 3 строчки --- название (это именно название), частота развёртки и частота кадров. Частота развертки --- это частота строк. Считается, что безопасно показывать больше 60 кадров, а эргономично - больше 85. Эти параметры, вписанные сюда конфигуратором, соответствуют типичному монитору, который даёт нормальное разрешение 1024х768. Если монитор достаточно хороший, то тут может не быть ничего кроме identifier, поскольку есть протоколы DDC и EDID, которые позволяют договариваться видеокарте и монитору, какие режимы работы на каком разрешении для них приемлемы, и х-сервер может эту информацию вынимать.


 * Раздел Device:

{{{
  В таком виде формирует эту секцию модуль Центра управления. Первая строчка -- это название, вторая и третья -- допустимые диапазоны частоты строк и частоты кадров. Частота кадров больше 60 считается безопасной для зрения, а больше 85 -- достаточно удобной (эргономичной). Такие параметры соответствуют довольно старому монитору (что видно из названия), зато будут стопроцентно работать практически везде. Для более современных мониторов имеются стандарты DDC и EDID, позволяющие X-серверу получать более полную информацию непосредственно при запуске, поэтому в этой секции можно оставить один только Identifier. Однако дешёвые модели мониторов могут работать с DDC/EDID плоховато.
  * Секция Device -- параметры устройства:
  {{{
Строка 133: Строка 110:

 Этот раздел отвечает за видеокарты. Здесь может быть много разных настроек: аппаратное трехмерное ускорение, иногда карточки что-то не умеют и это нужно включать отдельно. Это место, в которое вписываются значения, которые в альтераторе представляются в разделе драйвер.

 * Секция Screen.

{{{
   Этот раздел отвечает за видеокарты. Здесь может быть много разных настроек, которые описаны в соответствующей странице руководства. Например, существуют реализации аппаратного трехмерного ускорения, хорошо работающие на одних картах, и плохо -- на других, по умолчанию они выключены, но можно и включить. Здесь же можно управлять режимом работы "двухголовой" карточки. Эта секция заполняется пунктом "Драйвер" в соответствующем модуле Центра управления.
  * Секция Screen -- режим работы видеокарты:
  {{{
Строка 146: Строка 120:
    Modes "1024x788" "800x600"
Строка 161: Строка 136:
(''кстати, надо бы другой вариант этой секции, у меня неудачный'')

 Это то, как на данном мониторе с конкретной видеокарточкой включать разного рода графические режимы. Секция modes описывает, какие из именованных modeline-ов (режимов) в каком порядке включать. Их много, потому что разная глубина цвета. Там в конце есть приписка такая, что устройство, которое осуществляет аппаратный доступ к графическому ускорителю, будет иметь группу xgrp и права 0660.

 Следует отличать виртуальный размер экрана (может быть вписан как Virtual) и физическое разрешение монитора. Они необязательно совпадают. Если видеокарта позволяет, то виртуальный размер экрана можно поставить намного больше реального. Тогда будет видна только часть экрана, которую можно перемещать, подводя мышь к краю экрану. В большинстве случаев переключаться между разными режимами (если их много) можно с использованием ctrl+alt++, ctrl+alt+-, при этом виртуальный размер экрана остаётся прежним, а разрешение меняется.
   Секция описывает режимы работы видеокарты для различных вариантов глубины цветности. В ней связывается конкретный монитор с конкретным графическим устройством. Поскольку параметры того и другого Xorg умеет неплохо определять и сам, никаких особенных настроек, кроме цветности по умолчанию, здесь нет. В подсекции "Display" может встречаться поле "Modes", задающее список режимов работы видеокарты. Строчки "1024x788" и "800x600" -- это именно ''названия'' режимов, а не строгое указание поддерживаемого разрешения. Автоматически определяемые режимы работы карточки обычно имеют такие значащие имена.

  Следует отличать виртуальный размер экрана (может быть вписан как значение поля Virtual) и физическое разрешение монитора. Они необязательно совпадают. Если видеокарта позволяет, то виртуальный размер экрана можно поставить намного больше реального. Тогда будет видна только часть экрана, которую можно перемещать, подводя мышь к краю экрана. В большинстве случаев переключаться между разными режимами (если их много) можно с использованием `ctrl alt +`, `ctrl alt -`, при этом виртуальный размер экрана остаётся прежним, а разрешение меняется.
  * Секция DRI -- прямой доступ к видеопамяти:
  {{{
Section "DRI"
        Group "xgrp"
        Mode 0660
EndSection
}}}
  Указывает права доступа к устройству, посредством которого X-сервер получает доступ к видеопамяти (обычно `/dev/dri/card0`).
Строка 170: Строка 150:
Утилита modeline выдаёт информацию о доступных режимах работы монитора.

{{{
grep -i modeline /var/log/Xorg.0.log
}}}

Как у нас устроена ЭЛТ. У нас идет луч и он рисует пиксели. Как доходит до конца он выключается и перегоняется на начало следующей строки, включается и опять рисует. Когда он доходит до конца всего кадра он в выключенном состоянии перегоняется наверх, и начинает все сначала.
Вообще говоря это можно представить так: пусть у нас есть цилиндр, и луч ходит по спирали. Часть этого цилиндра мы не видим, так как экран плоский и потому меньше чем размер цилиндра. Поэтому там луч выключается. А потом это все разворачивается и мы видим наш экран.

(''тут, видимо, не помешала бы картинка с тором'')

Первый параметр --- dot clock(количество пикселей в секунду которое может отображать монитор), второй параметр --- ширина видимой часть в пикселах, дальше ширина в пикселах плюс одна половинка, вторая половинка и дальше --- ширина всего цилиндра. Аналогично устроена высота. Для более точной информации смотрите man XF86vidmodemodmodeline.

Далеко не все пикселы, которые мы выводим при таком дотклоке можно вывести. То есть, реальный размер картинки существенно меньше, или частота кадров существенно меньше, чем возможно. ModeLine --- это способ вручную настроить монитор. Сделать это можно программой xvidtune.
Режимы работы монитора задаются в секции `Monitor` параметром `Mode` (полная форма) или `ModeLine` (краткая форма записи, в одну строку), которого по умолчанию в `xorg.conf` нет. Добыть `ModeLine`, используемые X-сервером, можно в журнале запуска X-сервера:

{{{
$ grep -i modeline /var/log/Xorg.0.log
(II) NV(0): Printing DDC gathered Modelines:
. . .
(II) NV(0): Modeline "1024x768" 75.00 1024 1048 1184 1328 768 771 777 806 -hsync -vsync (56.5 kHz)
(II) NV(0): Modeline "1024x768" 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz)
(II) NV(0): Modeline "1024x768" 78.75 1024 1040 1136 1312 768 769 772 800 +hsync +vsync (60.0 kHz)
(II) NV(0): Modeline "832x624" 57.28 832 864 928 1152 624 625 628 667 -hsync -vsync (49.7 kHz)
(II) NV(0): Modeline "800x600" 50.00 800 856 976 1040 600 637 643 666 +hsync +vsync (48.1 kHz)
(II) NV(0): Modeline "800x600" 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz)
(II) NV(0): Modeline "800x600" 36.00 800 824 896 1024 600 601 603 625 +hsync +vsync (35.2 kHz)
. . .
}}}

Различные драйверы видеокарт (например, nvidia) могут создавать журнал по различным правилам, не всегда достаточно простого поиска слова "Modeline". Некоторые найденные режимы драйвер не использует, так как данный графический адаптер на данном мониторе их воспроизвести не в состоянии.

Для того, чтобы понять, что это за числа, необходимо в первом приближении понять, как работает электронно-лучевая трубка. В ЭЛТ имеется т. н. "пушка", которая может стрелять электронами. Место экрана, в которое попал электрон, недолго светится. Электрон в полёте отклоняется по вертикали и горизонтали. Итак пушка стреляет электронами с некоторой частотой, и они отклоняются таким образом, что первый "выстрел" попадает, допустим, в левый верхний угол экрана, второй -- в соседний справа пиксель, третий -- справа от второго и т. д. Дойдя до края экрана, "прицел луча" возвращается к началу и смещается на один пиксель вниз. Дойдя таким образом до правой нижней точки экрана, луч идёт обратно в левый верхний угол. Всё время обратного хода нарисованный кадр медленно гаснет. Затем процесс повторяется: рисуется следующий кадр.

{{attachment:../CRT.flat.png}}

Начальная и конечная часть "строки", по которой пробегает луч, -- невидимые. Невидимы могут быть также несколько первых и последних строк, Кроме того, какое-то время затрачивается на "обратных ход луча" по строкам и по кадру. В действительности всё намного сложнее, да и электронно-лучевых мониторов сегодня почти не выпускают, однако приведённая метафора вполне годится для толкования настроек Xorg.

Описание режима начинается со стоки -- это название самого режима. Как уже было сказано, оно может быть любым, но имена автоматически определяемых режимов обычно соответствуют разрешению.

Первый параметр -- т. н. "pixel clock" (количество миллионов пикселей в секунду, которое может выдавать видеокарта и отображать монитор). Минимальное и максимальное значение этого параметра для различных карт и мониторов различны; к тому же некоторые карты и мониторы имеют только фиксированный список допустимых частот.

Следующие восемь параметров -- различные временные характеристики луча. Слегка непривычно, что время в них измеряется в ... пикселях!

{{attachment:../CRT.Cylinder.png}}

Если всё мерить в пикселях, экран следует представлять себе в виде тора, в котором по замкнутой спирали бегает луч. Часть этой спирали соответствует картинке, часть -- невидимой составляющей и часть -- обратному ходу луча. Для простоты разрежем этот тор, превраитв его в цилиндр. Отсчёт начинается с первого видимого пикселя. Второй параметр `Modeline` -- ширина видимой части строки. Третий -- конец завершающей невидимой части (время начала "синхронизации", то есть обратного хода луча), четвёртый -- конец обратного хода луча и начало стартовой невидимой части новой строки, пятый -- общий диаметр одного витка спирали (то есть время на показ одной строки целиком). Параметры с шестого по девятый описывают те же характеристики для строк в кадре.

Последний параметр -- особенности настройки режима. Более полную информациюрежимах можно найти, например, в руководстве XF86vidmodemodmodeline(3). Учебник по Modeline можно найти здесь: http://easymamecab.mameworld.net/html/monitor1.htm .

В Xorg есть утилита `xvidtune`, позволяющая настроить видеорежим и сконструировать соответствующий Modeline:
Строка 187: Строка 190:
Вот здесь есть все те параметры из modeline.

Есть видеокарты и режимы, где оно настраивается. Не настраивается это в vesa и ещё некоторых. vesa просто лезет в видеокарточку и достает оттуда доступные режимы. Он не умеет ничего менять, но знает, что если установить определенные параметры, то оно должно заработать.

Изменить режим работы монитора можно также с помощью команды xrandr:

{{{
xrandr -s 832x624
При нажатии кнопки "Show" выведется самый настоящий Modeline:
{{{
$ xvidtune
Vendor: (null), Model: (null)
Num hsync: 1, Num vsync: 1
hsync range 0: 31.00 - 81.00
vsync range 0: 56.00 - 75.00
"1024x768" 75.00 1024 1048 1184 1328 768 771 777 806 +hsync +vsync
}}}

Некоторые драйверы видеокарт (например, vesa) не позволяют настраивать режимы. Драйвер vesa получает настройки непосредственно из BIOS видеокарты, что гарантирует работу графической подсистемы -- при условии, что карта соответствует стандарту.

Переключать графические режимы можно также с помощью команды `xrandr`:

{{{
$ xrandr
Screen 0: minimum 320 x 200, current 1024 x 768, maximum 1024 x 768
VGA connected 1024x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x768 70.1* 60.0
   832x624 74.6
   800x600 72.2 75.0 60.3 56.2
   640x480 75.0 72.8 75.0 63.1
$ xrandr -s 832x624
Строка 199: Строка 217:

Существует программа xev, которая ловит события с устройств ввода и выводит по ним информацию.
==== Обработка X-событий ====
Для того, чтобы понять, какие именно события посылает устройство графического ввода (например, мышь при нажатии на светящуюся кнопку сбоку или клавиатура при нажатии на кнопку с нарисованной луной), можно запустить специальную программу-монитор `xev`:
Строка 204: Строка 222:
Если нажать какую-то клавишу, то результатом будет сообщение вида:

{{{
ButtonPress event, serial 31, synthetic NO, window 0x2a00001,
    root 0x59, subw 0x0, time 2034270562, (42,98), root:(465,384),
    state 0x0, button 4, same_screen YES
Если нажать какую-то клавишу, то результатом будут сообщения о нажатии и отпускании кнопки такого вида (нажимаем кнопку с луной):

{{{
$ xev
. . .
KeyPress event, serial 30, synthetic NO, window 0x1800001,
    root 0x1a6, subw 0x1800002, time 17925583, (28,48), root:(159,206),
    state 0x0, keycode 223 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x1800001,
    root 0x1a6, subw 0x1800002, time 17925695, (28,48), root:(159,206),
    state 0x0, keycode 223 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False
. . .
Строка 216: Строка 246:
    root 0x59, subw 0x0, time 2034287126, (140,18), root:(563,304),     root 0x59, subw 0x0, time 2034286347, (52,96), root:(475,382),
Строка 218: Строка 248:
}}}

''Проверить!!!''

Есть программа xbindkeys, которая позволяет забиндить действия на чего-нибудь полезное.

{{attachment:../xbindkey.png}}

MotionNotify event, serial 31, synthetic NO, window 0x2a00001,
    root 0x59, subw 0x0, time 2034286355, (54,95), root:(477,381),
    state 0x0, is_hint 0, same_screen YES

MotionNotify event, serial 31, synthetic NO, window 0x2a00001,
    root 0x59, subw 0x0, time 2034286390, (55,94), root:(478,380),
    state 0x0, is_hint 0, same_screen YES
. . .
}}}


Есть программа xbindkeys, которая позволяет привязать произвольное действие к нажатию произвольной клавиши или кнопки мыши:
{{{
$ xbindkeys
Error : /home/user/.xbindkeysrc not found or reading not allowed.
please, create one with 'xbindkeys --defaults > /home/user/.xbindkeysrc'
$ xbindkeys --defaults > ~/.xbindkeysrc
$ xbindkeys -s
"xbindkeys_show"
    Control+Shift + q
"xterm"
    m:0x4 + c:41
    Control + f
"xterm"
    m:0x4 + b:2 (mouse)
}}}
Такие значения по умолчанию нас не устраивают, попробуем перенастроить запуск `xterm` на кнопку с
луной:

{{{
$ xbindkeys -k
Press combination of keys or/and click under the window.
You can use one of the two lines after "NoCommand"
in $HOME/.xbindkeysrc to bind a key.
"(Scheme function)"
    m:0x0 + c:223
    NoSymbol
$ echo '
"xterm"
  m:0x0 + c:223
' > .xbindkeysrc
$ xbindkeys
}}}
Строка 233: Строка 300:
|| Готовность (%) || Продолжительность (ак. ч.) || Подготовка (календ. ч.) || Полный текст (раб. д.) || Предварительные знания || Level || Maintainer || Start date || End date ||
|| 21 || 1 || 1 || 1 || || 1 || SergeyKorobkov + ПетрНикольский, FrBrGeorge, MaximByshevskiKonopko || || ||
|| Готовность (90%) || Продолжительность (ак. ч.) || Подготовка (календ. ч.) || Полный текст (раб. д.) || Предварительные знания || Level || Maintainer || Start date || End date ||
|| 41 || 1 || 1 || 1 || || 1 || SergeyKorobkov + ПетрНикольский, FrBrGeorge, FrBrGeorge, FrBrGeorge || || ||

Настройка X-сервера

Структура X-сервера

Архитектура

Графическая подсистема ПСПО базируется на комплекте программных продуктов Xorg. Поверх Xorg запускается несколько приложений, необходимых для организации "рабочего стола". Взаимодействие между всеми программами Xorg описывается протоколом x.11, поэтому эту подсистему принято также называть X11 или, в разговоре, "иксами".

Xorg имеет клиент-серверную архитектуру. X-Сервер -- это программа, которая имеет доступ к устройствам графического ввода (клавиатура, мышь) и вывода (графическая карта). По протоколу X11 сервер передаёт сообщения об активности мыши и клавиатуры другим программам -- X-клиентам, а также принимает от них запросы, как правило, что-либо нарисовать, вывести текст и т .п.

X-сервер и X-клиент вполне могут находиться на разных машинах: X-сервер -- на машине пользователя, а X-клиент -- где угодно. Принимать X-запросы от любых машин в сети небезопасно, поэтому это свойство в ПСПО отключено: сервер запускается с ключом -nolisten tcp (задаётся в файле /etc/sysconfig/xserver). На рабочей станции такое подключение смысла всё равно не имеет. Есть исключение: "Линукс Терминал", целиком построенный на том, что пользовательские машины запускают только X-серверы, а вся работа ведётся на центральном компьютере посредством X11.

Интерфейс

Окно. Понятие "окно", на самом деле, сильно сужает варианты использования графического интерфейса, однако осмысленных альтернатив "оконному" подходу пока не придумано. Каждое приложение регистрирует у X-сервера один или несколько прямоугольников -- окон. Внутри этого прямоугольника приложение имеет возможность рисовать фигуры, выводить текст и т. п. События -- нажатие клавиш на клавиатуре, перемещение мыши и нажатие кнопок на ней -- также считаются происходящими "на территории" окна. Для того, чтобы выяснить, какому именно окну предназначалось событие, используется синтетическое понятие -- фокус. Каждый раз не более одного окна может быть "в фокусе", именно этому окну направляются события. По умолчанию X-сервер передаёт фокус окну, над которым находится графический указатель мыши, но этот порядок может изменить некоторый X-клиент, принимая все события на себя и "раздавая" их по своему усмотрению. Прямоугольники могут накладываться друг на друга, образуя "стопку". Тем самым вводится понятие глубины окна: полностью видимо окно с наименьшей глубиной, окна под ним загораживаются вышележащими. Глубина окна учитывается и при передаче ему фокуса.

Диспетчер окон. X-клиент, в обязанности которого входит передавать другим X-клиентам фокус по своему усмотрению, называется диспетчером окон (окноводом). Диспетчер выполняет всю работу по управлению окнами: передаёт фокус, позволяет перемещать окна, изменять их размер и глубину, скрывать, превращать в иконки и многое другое. Все эти действия производит, разумеется, X-сервер, а диспетчер подаёт ему соответствующие команды. Для удобства управления диспетчер обычно пририсовывает к окнам декораторы: красивую рамочку, заголовок, кнопки и т. п. Сами приложения также могут посылать серверу соответствующие команды, однако заставлять каждый X-клиент заниматься управлением собственным окном было бы неразумно. С другой стороны, неправильно заставлять X-сервер заниматься управлением окнами самостоятельно: это привело бы к потере свободы выбора. На сегодня существуют десятки различных окноводов, каждый из них реализует свою собственную концепцию управления окнами и их оформления в соответствии с требованиями "рабочего стола".

В "Лёгком Линуксе" используется графическая среда XFCE, в состав которой входит диспетчер xfwm, а в "Юниоре", "Мастере" и "Терминале" -- KDE и диспетчер kwin.

Рабочий стол

Для реализации метафоры "рабочего стола" недостаточно управлять одними только окнами. Удобного интерфейса требует управление виртуальными экранами, быстрый запуск приложений, доступ к документам, отображение меняющейся информации и многое другое. Всевозможные интерфейсные примитивы: меню, панели, лотки и прочее диспетчер окон может на себя и не брать, этим в "больших" окружениях, вроде KDE, занимается целый комплект программ, дополняемый службой передачи сообщений, более сложных, чем X11, собственной интерфейсной библиотекой и многим другим. Настройка рабочего стола обсуждается в другом месте, здесь важно понять, что "настройка X-сервера" -- это другое, достаточно низкоуровневое действие, требующее некоторой квалификации.

Настройка графической среды

Использование Alterator

Запустим Центр Управления системой (он же Alterator)

../acc.png

Сам Alterator -- это некий графический интерфейс к набору утилит, диагностирующих и настраивающих ту или иную часть системы. В частности, пункт "Графический интерфейс -> Дисплей" отвечает за определение параметров видеокарты и монитора, и за внесение изменений в настройки Xorg.

../acc_display.png

Надпись "Монитор 1024х768" -- это не планируемое разрешение, а некий тип монитора по умолчанию. Такой тип который используется, если нет конкретных данных о мониторе, кроме того, что он, очевидно, поддерживает разрешение 1024 на 768 точек. Есть мониторы, о которых такие данные есть; кроме того, такие данные содержатся в т. н. "драйвере монитора", который представляет собою просто текстовый файл. Данные из этого файла можно использовать для ручной настройки Xorg.

Другие настройки достаточно очевидны. "Драйвер" -- это драйвер видеокарты; он определяется автоматически, и изменять это значение стоит только если что-то не работает (в этом случае стоит попробовать стандартный драйвер "vesa"), либо при ывборе между свободной и несвбодной реализацией драйверов AMD/ATI и nVidia. Можно также изменить планируемую глубину цветности (bits per pixel) и разрешение экрана в точках.

Файл xorg.conf

Рассмотрим содержание файла xorg.conf, расположенного в /etc/X11. Он состоит из секций, каждая секция описывает параметры какого-либо устройства, комплектацию или структуру сервера, пользующегося этими устройствами. В секции может встречаться поле "Identifier", на которое могут ссылаться другие секции.

  • Головная секция -- ServerLayout, она задаёт "рабочее место": мышь и клавиатуру, которыми пользователь пользуется и экран (Screen), на который он смотрит:

    Section "ServerLayout"
            Identifier     "Minimal layout"
            Screen         "Screen0" 0 0
            InputDevice    "Keyboard0" "CoreKeyboard"
            InputDevice    "ImPS/2 Logitech Wheel Mouse|0" "CorePointer"
    EndSection
  • Секция загрузки модулей Module определяет, какие расширения X11 необходимо дополнительно загрузить:
    Section "Module"
            Load  "type1"
            Load  "freetype"
            Load  "glx"
            Load  "dri"
            Load  "dbe"
            SubSection "extmod"
                    Option      "omit xfree86-dga"
            EndSubSection
    EndSection
    Здесь type1 -- поддержка шрифтов "Type 1", freetype -- поддержка шрифтов "Truetype", glx -- трехмерная графика, dri -- графическое ускорение, dbe -- работа с памятью. Подсекция "extmod" отвечает за загрузку модуля с целым спектром расширений X11 и их настройку.
  • Секция ServerFlags:

    Section "ServerFlags"
            Option      "AllowMouseOpenFail" "true"
    EndSection

    Опция AllowMouseOpenFail позволяет серверу грузиться, даже если мышь не работает. Графическим указателем можно управлять с клавиатуры (нажать сочетание shift+numlock, а потом использовать клавиши на цифровой клавиатуре для перемещения мыши).

  • Секции InputDevice:

    Section "InputDevice"
            Identifier  "Keyboard0"
            Driver      "kbd"
    EndSection

    Эта часть отвечает за драйвер клавиатуры -- kbd. В настоящее время эта секция используется не столь активно, как раньше, так есть возможность изменять настройки клавиатуры из командной строки, с помощью setxkbmap. Например, если в Центре управления ("Графический интерфейс -> Настройка клавиатуры") выбрать тип "клавиатура acpi", начнут распознаваться три стандартные кнопки ACPI (Power, Sleep. Wake). Результат запишется не в xorg.conf, а в файл /etc/X11/xinit/Xkbmap, используемый при старте сеанса работы с X-сервером.

    Section "InputDevice"
            Identifier  "ImPS/2 Logitech Wheel Mouse|0"
            Driver      "mouse"
            Option      "Device" "/dev/input/mice"
            Option      "Protocol" "IMPS/2"
            Option      "ZAxisMapping" "4 5"
    EndSection

    Это параметры мыши. Стоит отметить, последнюю опцию -- !ZAxisMapping. Мало кто помнит, что поворот колеса мыши -- это "перемещение по оси Z". Это перемещение почти никто не использует, поэтому поворот колеса принято преобразовывать в нажатия кнопок 4 и 5. Также обстоит дело и с другими частями мыши. В результате может оказаться, что помимо первых трёх (стандартных кнопок) на вашей мыши имеется ещё четыре, причём номерам 4 и 5 соответствует не колесо, а две кнопки сбоку. Тогда необходимо запустить xev и выяснить, какая кнопка какой номер имеет, а затем использовать нечто похожее на xmodmap -e "pointer = 1 2 3 6 7 4 5".

  • Секция Monitor -- параметры монитора:
    Section "Monitor"
            Identifier   "Monitor 1024x768|0"
            HorizSync    31.5 - 57.0
            VertRefresh  50.0 - 70.0
    EndSection
    В таком виде формирует эту секцию модуль Центра управления. Первая строчка -- это название, вторая и третья -- допустимые диапазоны частоты строк и частоты кадров. Частота кадров больше 60 считается безопасной для зрения, а больше 85 -- достаточно удобной (эргономичной). Такие параметры соответствуют довольно старому монитору (что видно из названия), зато будут стопроцентно работать практически везде. Для более современных мониторов имеются стандарты DDC и EDID, позволяющие X-серверу получать более полную информацию непосредственно при запуске, поэтому в этой секции можно оставить один только Identifier. Однако дешёвые модели мониторов могут работать с DDC/EDID плоховато.
  • Секция Device -- параметры устройства:
    Section "Device"
            Identifier  "Card0|0"
            Driver      "intel"
    EndSection
    • Этот раздел отвечает за видеокарты. Здесь может быть много разных настроек, которые описаны в соответствующей странице руководства. Например, существуют реализации аппаратного трехмерного ускорения, хорошо работающие на одних картах, и плохо -- на других, по умолчанию они выключены, но можно и включить. Здесь же можно управлять режимом работы "двухголовой" карточки. Эта секция заполняется пунктом "Драйвер" в соответствующем модуле Центра управления.
  • Секция Screen -- режим работы видеокарты:
    Section "Screen"
            Identifier "Screen0"
            Device     "Card0|0"
            Monitor    "Monitor 1024x768|0"
            DefaultDepth     16
            SubSection "Display"
                    Depth     8
        Modes "1024x788" "800x600"
            EndSubSection
            SubSection "Display"
                    Depth     15
            EndSubSection
            SubSection "Display"
                    Depth     16
            EndSubSection
            SubSection "Display"
                    Depth     24
            EndSubSection
            SubSection "Display"
                    Depth     32
            EndSubSection
    EndSection
    • Секция описывает режимы работы видеокарты для различных вариантов глубины цветности. В ней связывается конкретный монитор с конкретным графическим устройством. Поскольку параметры того и другого Xorg умеет неплохо определять и сам, никаких особенных настроек, кроме цветности по умолчанию, здесь нет. В подсекции "Display" может встречаться поле "Modes", задающее список режимов работы видеокарты. Строчки "1024x788" и "800x600" -- это именно названия режимов, а не строгое указание поддерживаемого разрешения. Автоматически определяемые режимы работы карточки обычно имеют такие значащие имена.

    Следует отличать виртуальный размер экрана (может быть вписан как значение поля Virtual) и физическое разрешение монитора. Они необязательно совпадают. Если видеокарта позволяет, то виртуальный размер экрана можно поставить намного больше реального. Тогда будет видна только часть экрана, которую можно перемещать, подводя мышь к краю экрана. В большинстве случаев переключаться между разными режимами (если их много) можно с использованием ctrl alt +, ctrl alt -, при этом виртуальный размер экрана остаётся прежним, а разрешение меняется.

  • Секция DRI -- прямой доступ к видеопамяти:
    Section "DRI"
            Group        "xgrp"
            Mode         0660
    EndSection

    Указывает права доступа к устройству, посредством которого X-сервер получает доступ к видеопамяти (обычно /dev/dri/card0).

ModeLine

Режимы работы монитора задаются в секции Monitor параметром Mode (полная форма) или ModeLine (краткая форма записи, в одну строку), которого по умолчанию в xorg.conf нет. Добыть ModeLine, используемые X-сервером, можно в журнале запуска X-сервера:

$ grep -i modeline /var/log/Xorg.0.log
(II) NV(0): Printing DDC gathered Modelines:
. . .
(II) NV(0): Modeline "1024x768"  75.00  1024 1048 1184 1328  768 771 777 806 -hsync -vsync (56.5 kHz)
(II) NV(0): Modeline "1024x768"  65.00  1024 1048 1184 1344  768 771 777 806 -hsync -vsync (48.4 kHz)
(II) NV(0): Modeline "1024x768"  78.75  1024 1040 1136 1312  768 769 772 800 +hsync +vsync (60.0 kHz)
(II) NV(0): Modeline "832x624"   57.28  832 864 928 1152  624 625 628 667 -hsync -vsync (49.7 kHz)
(II) NV(0): Modeline "800x600"   50.00  800 856 976 1040  600 637 643 666 +hsync +vsync (48.1 kHz)
(II) NV(0): Modeline "800x600"   40.00  800 840 968 1056  600 601 605 628 +hsync +vsync (37.9 kHz)
(II) NV(0): Modeline "800x600"   36.00  800 824 896 1024  600 601 603 625 +hsync +vsync (35.2 kHz)
. . .

Различные драйверы видеокарт (например, nvidia) могут создавать журнал по различным правилам, не всегда достаточно простого поиска слова "Modeline". Некоторые найденные режимы драйвер не использует, так как данный графический адаптер на данном мониторе их воспроизвести не в состоянии.

Для того, чтобы понять, что это за числа, необходимо в первом приближении понять, как работает электронно-лучевая трубка. В ЭЛТ имеется т. н. "пушка", которая может стрелять электронами. Место экрана, в которое попал электрон, недолго светится. Электрон в полёте отклоняется по вертикали и горизонтали. Итак пушка стреляет электронами с некоторой частотой, и они отклоняются таким образом, что первый "выстрел" попадает, допустим, в левый верхний угол экрана, второй -- в соседний справа пиксель, третий -- справа от второго и т. д. Дойдя до края экрана, "прицел луча" возвращается к началу и смещается на один пиксель вниз. Дойдя таким образом до правой нижней точки экрана, луч идёт обратно в левый верхний угол. Всё время обратного хода нарисованный кадр медленно гаснет. Затем процесс повторяется: рисуется следующий кадр.

../CRT.flat.png

Начальная и конечная часть "строки", по которой пробегает луч, -- невидимые. Невидимы могут быть также несколько первых и последних строк, Кроме того, какое-то время затрачивается на "обратных ход луча" по строкам и по кадру. В действительности всё намного сложнее, да и электронно-лучевых мониторов сегодня почти не выпускают, однако приведённая метафора вполне годится для толкования настроек Xorg.

Описание режима начинается со стоки -- это название самого режима. Как уже было сказано, оно может быть любым, но имена автоматически определяемых режимов обычно соответствуют разрешению.

Первый параметр -- т. н. "pixel clock" (количество миллионов пикселей в секунду, которое может выдавать видеокарта и отображать монитор). Минимальное и максимальное значение этого параметра для различных карт и мониторов различны; к тому же некоторые карты и мониторы имеют только фиксированный список допустимых частот.

Следующие восемь параметров -- различные временные характеристики луча. Слегка непривычно, что время в них измеряется в ... пикселях!

../CRT.Cylinder.png

Если всё мерить в пикселях, экран следует представлять себе в виде тора, в котором по замкнутой спирали бегает луч. Часть этой спирали соответствует картинке, часть -- невидимой составляющей и часть -- обратному ходу луча. Для простоты разрежем этот тор, превраитв его в цилиндр. Отсчёт начинается с первого видимого пикселя. Второй параметр Modeline -- ширина видимой части строки. Третий -- конец завершающей невидимой части (время начала "синхронизации", то есть обратного хода луча), четвёртый -- конец обратного хода луча и начало стартовой невидимой части новой строки, пятый -- общий диаметр одного витка спирали (то есть время на показ одной строки целиком). Параметры с шестого по девятый описывают те же характеристики для строк в кадре.

Последний параметр -- особенности настройки режима. Более полную информациюрежимах можно найти, например, в руководстве XF86vidmodemodmodeline(3). Учебник по Modeline можно найти здесь: http://easymamecab.mameworld.net/html/monitor1.htm .

В Xorg есть утилита xvidtune, позволяющая настроить видеорежим и сконструировать соответствующий Modeline:

../xvidtune.png

При нажатии кнопки "Show" выведется самый настоящий Modeline:

$ xvidtune          
Vendor: (null), Model: (null)
Num hsync: 1, Num vsync: 1
hsync range 0:  31.00 -  81.00
vsync range 0:  56.00 -  75.00
"1024x768"     75.00 1024 1048 1184 1328    768 771 777 806    +hsync +vsync

Некоторые драйверы видеокарт (например, vesa) не позволяют настраивать режимы. Драйвер vesa получает настройки непосредственно из BIOS видеокарты, что гарантирует работу графической подсистемы -- при условии, что карта соответствует стандарту.

Переключать графические режимы можно также с помощью команды xrandr:

$ xrandr 
Screen 0: minimum 320 x 200, current 1024 x 768, maximum 1024 x 768
VGA connected 1024x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x768       70.1*    60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   640x480        75.0     72.8     75.0     63.1  
$ xrandr -s 832x624

Эта команда изменит разрешение на 832 на 624 точки.

Обработка X-событий

Для того, чтобы понять, какие именно события посылает устройство графического ввода (например, мышь при нажатии на светящуюся кнопку сбоку или клавиатура при нажатии на кнопку с нарисованной луной), можно запустить специальную программу-монитор xev:

../xev.png

Если нажать какую-то клавишу, то результатом будут сообщения о нажатии и отпускании кнопки такого вида (нажимаем кнопку с луной):

$ xev
. . .
KeyPress event, serial 30, synthetic NO, window 0x1800001,
    root 0x1a6, subw 0x1800002, time 17925583, (28,48), root:(159,206),
    state 0x0, keycode 223 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x1800001,
    root 0x1a6, subw 0x1800002, time 17925695, (28,48), root:(159,206),
    state 0x0, keycode 223 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
. . .

Если подвигать мышью, то получим:

MotionNotify event, serial 31, synthetic NO, window 0x2a00001,
    root 0x59, subw 0x0, time 2034286347, (52,96), root:(475,382),
    state 0x0, is_hint 0, same_screen YES

MotionNotify event, serial 31, synthetic NO, window 0x2a00001,
    root 0x59, subw 0x0, time 2034286355, (54,95), root:(477,381),
    state 0x0, is_hint 0, same_screen YES

MotionNotify event, serial 31, synthetic NO, window 0x2a00001,
    root 0x59, subw 0x0, time 2034286390, (55,94), root:(478,380),
    state 0x0, is_hint 0, same_screen YES
. . .

Есть программа xbindkeys, которая позволяет привязать произвольное действие к нажатию произвольной клавиши или кнопки мыши:

$ xbindkeys
Error : /home/user/.xbindkeysrc not found or reading not allowed.
please, create one with 'xbindkeys --defaults > /home/user/.xbindkeysrc'
$ xbindkeys --defaults > ~/.xbindkeysrc
$ xbindkeys -s   
"xbindkeys_show"
    Control+Shift + q
"xterm"
    m:0x4 + c:41
    Control + f
"xterm"
    m:0x4 + b:2   (mouse)

Такие значения по умолчанию нас не устраивают, попробуем перенастроить запуск xterm на кнопку с луной:

$ xbindkeys -k
Press combination of keys or/and click under the window.
You can use one of the two lines after "NoCommand"
in $HOME/.xbindkeysrc to bind a key.
"(Scheme function)"
    m:0x0 + c:223
    NoSymbol
$ echo '       
"xterm"
  m:0x0 + c:223
' > .xbindkeysrc
$ xbindkeys


Сведения о ресурсах

Готовность (90%)

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

Maintainer

Start date

End date

41

1

1

1

1

SergeyKorobkov + ПетрНикольский, FrBrGeorge, FrBrGeorge, FrBrGeorge


CategoryLectures CategoryPspo CategoryMpgu CategoryUneex

PspoClasses/080731/03XConfiguration (последним исправлял пользователь FrBrGeorge 2008-10-15 13:46:17)