Differences between revisions 2 and 32 (spanning 30 versions)
Revision 2 as of 2008-08-07 16:32:37
Size: 10798
Comment:
Revision 32 as of 2008-10-15 10:46:17
Size: 33189
Editor: FrBrGeorge
Comment:
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
(рассказ про то, как работают иксы) Если бы не альтвая брьба с изобр. дураками, то можно было бы заставить работать все машины на одной или одной принимать все соед, но в альте оно запускается с -nolisten tcp. Это сделано так, поскольку это рабочая станция, и там такой функционал не нужен.

Это первый слой.

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

То, с чем мы имеем дело сейчас --- xfce с wm xfwm, в юниоре, терминал сервере и мастере есть kde, wm там kwin

Есть ещё один слой, где мы забываем про протокол X11, и всп. про то, как устр. жкран. Тут мы говориМ, что экр. может быть неск, естьприятные инт. штуки, октрые связаны не с окнами, а с упр. пргр. продуктов, и так далее. Эти все функции может взять из себя wm, а мжет и не брать. В граф. средах типа kde|xfce запускется куча прилож, каждая из которых делается тд. приложением.

Такое краткое содержание лекции про иксы.

Дополнение. Что инт. польз, который сел за такую граф. среду. Первое, что инт. узнать: как настр. эту среду. Вещь первая --- альтератор.

То, что вы видете, эт некийграф. интерфейс к пачке утилит, кторые явл. мозгом для определения возм. раф подсистемы, а с другой стороны, к конф. файлу системы xorg.

Монитор 1024х768 это некая заглушка, когда монитор неизвестен. Это не разрешение. ...

Как устрен xorg.conf. Он сост. из секций, каждая тв. либо за устр., либ за синт. понятие (нарпимер, Layout). Что мы видим в секции layout... Далее идёт секция загрузки модулей: type1-шрифты, freetype-шрифты (проверить), glx, dri --- граф. ускорение... Флаги: allowmouseopenfail --- чтобы иксы грузились, если мышьь отвалится, крме того, мышью можно упр. с клавиатуры (shift+numlock --- цифроблок). Кроме того, поворот клеса --- перемещение по оси z. Никто почти его не исп., то их преобр. в нажатия кнпок 4 и 5. Если вдру кнопки замапились неправильно, то сначала запускаете xev, а потом xmodmap.

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

Есть утилита modeline, которая выдаёт инф. о дост. режимах.

(рассказ про ЭЛТ и теоретизация пр цилиндр и тр)

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

Далеко не все пикселы, кторые мы выводим при таком дотклоке можно вывести. То есть, реальный разм. картинки сущ. меньше, или рефрешрейт сущ. меньше, чем взможно. ModeLine --- способ вручную настр. монитра. Для этого есть xvidtune.

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

Дальше еидёт раздел Device карточки, там можно настр видекарту, разл. ускорение... (это место, в кторое вписываются знач., который в альтератре выб. в разделе драйвер).

Screen. Теперь мы занимаемся синт. штуками. Эт то, как на данном мониторе с карточкой рисвать разнго рода графрежимы. Секция modes описывает, какие из именованных модлайнв в каком порядке включать. Их много, потому что разная глубина цветности.

Там в конце есть приписка такая, что устр., к котор. осущ. аппаратный доступ к граф. уск., оно будет иметь группу xgrp и права 0660.

Есть ещё одна синт. штука, lAYOUT? КОТОРАЯ ОПР., на каком скрине какие устр. ввода применяются.

В бльшинстве случаев перекл. между разными режимами мжно с исп. ctrl+alt++, ctrl+alt+-, при этом виртуальный размер экрана остаётся прежним, а разрешение меняется.

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

Ещё один момент, св. с изм разрешения --- его можно сделать с исп. утилиты xrandr

Для включения дополн. трёх кнопок надо выбраьт в настр. клавиатуры клавиатура acpi, при этом меняется /etc/X11/xinit/Xkbmap.

В какой-то момент пявился setxkbmap, который повт. синтаксис xorg.conf, и позв. кадждму польз. настр. клавиатуру п-своему.

Например, настроим перекл. раскладки.

Проблема с шифтами вот в чём: настройки xkb в рамках дной сессии аккумулируются. Это какая-то бага давняя, котрую мало кому хочется исправлять, но может быть такая штука, что вы пишите два шифта, а там чт-то не то с дним из шифтов.
=== Структура X-сервера ===

==== Архитектура ====

Графическая подсистема ПСПО базируется на комплекте программных продуктов {{http://x.org|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)

{{attachment:../acc.png}}

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

{{attachment:../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". Некоторые найденные режимы драйвер не использует, так как данный графический адаптер на данном мониторе их воспроизвести не в состоянии.

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

{{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:

{{attachment:../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`:

{{attachment:../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
}}}

Line 60: Line 298:
## Требования к знаниям слушателя имена модулей через пробел; если нет пустая ячейка ## Требования к знаниям слушателя -- имена модулей через пробел; если нет -- пустая ячейка
Line 63: Line 301:
|| 0  || 1 || 1 || 1 || || 1 || SergeyKorobkov, VladimirLysikov, MaximByshevskiKonopko || || || || 90 || 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


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

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

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

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

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

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

Level

Maintainer

Start date

End date

90

1

1

1

1

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


CategoryLectures CategoryPspo CategoryMpgu CategoryUneex

PspoClasses/080731/03XConfiguration (last edited 2008-10-15 10:46:17 by FrBrGeorge)