Вперед Назад Содержание

## 4. X Window

Подобно консольному режиму, X Window также требует некоторой настройки. Настройка включает в себя настройку ввода и установку шрифтов для X Window. Данные действия обсуждаются ниже.

Для специфической информации, касающейся вашего дистрибутива, вам следует обратиться в раздел Кириллизация дистрибутивов.

## 4.1 Установка шрифтов для X Window

Прежде всего, вы должны достать шрифты, содержащие изображения кириллических символов в соответствующих местах. Следует отметить, что все современные дистрибутивы имеют KOI8-R шрифты, более-менее пригодные для использования, так что если xlsfonts не показывает их, то они просто не установлены или не включены в `X Font Path`.

X Window включила набор KOI8-R шрифтов, разработанных Cronyx, ещё в конце 1995 года. Эти шрифты являются также частью XFree86.

Некоторые дистрибутивы (как правило, очень старые) могут не включать кириллические шрифты для X Window -- в этом случае их придётся устанавливать самим.

Подробнее о шрифтах для X-window и о том, где их можно найти, смотрите в разделе Шрифты для X-window.

Более современную коллекцию шрифтов для X windows можно взять у Дмитрия Болховитянова по адресу пакет CYR_RFX.

Поэтому вам следует проверить, установлены ли эти шрифты в вашей системе. Спросите системного администратора, или, если вы сами являетесь администратором, проверьте вашу систему сами, а именно:

1. Выполните '`xlsfonts | grep koi8`'. Если в результате выполнения команды появится список шрифтов, то ваш X сервер уже знает об их существовании.
2. Или наберите

       find / -name crox\*.pcf\*

   для того, чтобы найти местоположение шрифтов кириллицы в системе. Вы должны будете сделать эти шрифты доступными для X сервера, как -- я объясню ниже.

Если вы не нашли таких шрифтов в вашей системе, то вы должны установить их сами:

1. Скачайте соответствующий набор шрифтов. Подробнее о шрифтах для X-window и о том где их можно найти можно посмотреть в разделе Шрифты для X-window.
2. Теперь, когда у вас есть шрифты, создайте для них каталог. Помещение новых шрифтов в уже существующий каталог шрифтов является, мягко говоря, не очень хорошей идеей. Поместите их, например, в /usr/lib/X11/fonts/cyrillic для настройки всей системы или просто создайте каталог у себя только для персонального пользования.
3. Если новые шрифты поставляются в формате BDF ( файлы `*.bdf`), то вы должны скомпилировать их. Для каждого шрифта выполните:

       bdftopcf -o <font>.pcf <font>.bdf

   Можете сжать их с помощью программы `gzip` (очень старые X сервера не поддерживает сжатые шрифты):

       gzip *.pcf

   Если же вы все-таки хотите поместить новые шрифты в уже существующий каталог шрифтов, то вы должны "срастить" старый и новый файлы с именем `fonts.alias` в том случае, естественно, если они оба существуют.
4. В каждом каталоге шрифтов для X должен быть список шрифтов, находящихся в нем. Этот список хранится в файле `fonts.dir`. Вы не должны создавать этот список вручную. Вместо этого выполните:

       cd "директория где лежат шрифты"
       mkfontdir .

5. Теперь надо сделать этот каталог шрифтов известным для X сервера. Здесь у вас есть ряд возможностей:
   - Общесистемная настройка для XFree86. Если вы используете эту версию X Window, то добавьте новый каталог к списку каталогов в файле `XF86Config`. Чтобы найти его расположение, просмотрите, что скажет `startx` при запуске (в RedHat этот файл обычно находится в /etc/X11). Более подробно смотрите `man XF86Config (4/5)`.
   - Общесистемная настройка через `xinit`. Добавьте новый каталог к файлу запуска `xinit`. Более подробно смотрите `xinit(1x)`.
   - Персональная настройка. У вас есть специальный файл для запуска X Window -- `~/.xinitrc` (им также может быть `~/.Xclients` или `~/.xsession`

       xset +fp <новый каталог шрифтов>
       xset fp rehash

   Обратите внимание на ключ '`+fp`' -- это означает, что новые шрифты будут добавлены в начале списка каталогов со шрифтами. То есть, если прикладная программа запрашивает, скажем, шрифт `fixed`, то будет подставлен fixed font с кириллическими символами, чего мы и добивались. Если нужно установить шрифты в нескольких кодировках, то команда `xset +fp` с предпочтительной кодировкой должна быть после других.
6. Теперь перезапустите X Window. Если вы все сделали правильно, то тесты, описанные в начале раздела, будут пройдены успешно. Также поиграйте с `xfontsel` (1x), чтобы удостовериться в возможности выбирать шрифты кириллицы.

Чтобы заставить X клиента использовать шрифты кириллицы, вы должны установить соответствующий X ресурс. Например, я делаю кириллический шрифт заданным по умолчанию в моем `~/.Xdefaults`:

    *font:         6x13

Так как мои шрифты кириллицы идут первыми в списке поиска шрифтов (смотри вывод программы '`xset q`'), то они и подставляются, если программа требует какой-либо шрифт с именем, совпадающем с каким-либо из шрифтов, лежащих в кириллической директории.

Вот простые примеры. Если вы хотите научить соответствующий X клиент пользоваться кириллическим шрифтом, то вы должны узнать тип ресурса, который вам надо изменить (это можно сделать, используя `editres` (1x)) и определить его или в базе данных ресурсов, или в командной строке. Например,

    $ xterm -font '-cronyx-*-bold-*-*-*-19-*-*-*-*-*-*-*'

-- запустит xterm с несколько уродливым шрифтом;

    $ xfontsel -xrm '*quitButton.font: -*-times-*-*-*-*-13-*-*-*-*-*-koi8-*'

-- установит Cyrillic Times шрифт для кнопки `Quit` программы `xfontsel`.

## 4.2 Использование шрифтов TrueType

У технологии TrueType, взятой на вооружение операционными системами серии Windows, нет многих недостатков, которые присутствуют при работе со шрифтами стандартным образом у X. Кроме того, существует множество кириллических TrueType шрифтов.

Подробнее о том, где их можно найти, можно посмотреть в разделе Шрифты TrueType.

К счастью, эти шрифты можно использовать и в X Window. Существует TrueType сервер шрифтов XFSFT для X. Поддержка TrueType встроена во все современные дистрибутивы XFree86, в частности сервер xfsft встроен в сервере шрифтов XFree86.

Коммерческие X сервера уже довольно давно включили поддержку TrueType в свои дистрибутивы (Accelerated X, Metro X).

Установочная процедура сервера шрифтов довольно проста: делайте то, что сказано в документации.

Далее приводится пример того, как можно установить TrueType шрифты. О том, как подсунуть их X Window -- смотрите раздел Установка шрифтов для X Window.

Для того, чтобы стандартные шрифты отображались в нужной нам кодировке -- в данном случае для примера взята кодировка cp1251, -- в каталоге, где лежат TrueType шрифты, необходимо создать два одинаковых файла, `fonts.dir` и `fonts.scale`, следующего вида:

    12
    timesi.ttf -monotype-Times New Roman-medium-i-normal--0-0-0-0-p-0-microsoft-cp1251
    timesbi.ttf -monotype-Times New Roman-bold-i-normal--0-0-0-0-p-0-microsoft-cp1251
    timesbd.ttf -monotype-Times New Roman-bold-r-normal--0-0-0-0-p-0-microsoft-cp1251
    times.ttf -monotype-Times New Roman-medium-r-normal--0-0-0-0-p-0-microsoft-cp1251
    couri.ttf -monotype-Courier New-medium-i-normal--0-0-0-0-m-0-microsoft-cp1251
    courbi.ttf -monotype-Courier New-bold-i-normal--0-0-0-0-m-0-microsoft-cp1251
    courbd.ttf -monotype-Courier New-bold-r-normal--0-0-0-0-m-0-microsoft-cp1251
    cour.ttf -monotype-Courier New-medium-r-normal--0-0-0-0-m-0-microsoft-cp1251
    ariali.ttf -monotype-Arial-medium-i-normal--0-0-0-0-p-0-microsoft-cp1251
    arialbi.ttf -monotype-Arial-bold-i-normal--0-0-0-0-p-0-microsoft-cp1251
    arialbd.ttf -monotype-Arial-bold-r-normal--0-0-0-0-p-0-microsoft-cp1251
    arial.ttf -monotype-Arial-medium-r-normal--0-0-0-0-p-0-microsoft-cp1251

Кроме этого, сюда же необходимо положить файл `encodings.dir`, имеющий всего две строки:

    1
    microsoft-cp1251 /usr/X11R6/lib/X11/fonts/encodings/microsoft-cp1251.enc.gz

Если вам нужны эти шрифты в кодировке KOI8-R, то вместо `microsoft-cp1251` следует прописать `koi8-r`.

Следует отметить ещё одну вещь. Если вы используете сервер шрифтов `xfstt` вместо `xfsft`, то вам следует использовать опцию перекодировки:

    xfstt ... --encoding koi8-r,windows-1251,iso8859-1

После этого новые шрифты будут доступны для X Window -- этот факт вы можете проверить, запустив `xfontsel` и поиграв с семейством шрифтов ttf.

## 4.3 Ввод с клавиатуры

В последних выпусках X (X11R61 и выше) имеются два "стандартных" способа ввода с клавиатуры: родной способ, работающий через утилиту xmodmap (см. раздел xmodmap) (сейчас это способ стремительно устаревает, хотя является надёжным и хорошо изученным), и новый -- Xkb или X KeyBoard (раздел Xkb).

### Настройка Xkb

Полную и исчерпывающую (даже слишком исчерпывающую) документацию по настройке Xkb можно найти у Ивана Паскаля.

### Немного теории

При старте X-сервера, модуль XKB зачитывает все необходимые данные из текстовых файлов, которые образуют "базу данных" настроек XKB.

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

Но для настройки это не так уж важно, поскольку вызов xkbcomp происходит автоматически, незаметно для пользователя.

База данных, необходимых XKB, состоит из 5 компонентов:

- keycodes таблицы, которые просто задают символические имена для скан-кодов. Например:

      <TLDE>= 49;
      <AE01> = 10;

- types описывает типы клавиш. Тип клавиши определяет -- как должно меняться значение, выдаваемое клавишей в зависимости от модификаторов (Control, Shift и т.п.). Так, например, "буквенные" клавиши относятся к типу ALPHABETIC, что означает, что они имеют разное значение в зависимости от состояния Shift и CapsLock. А клавиша [Enter] имеет тип -- ONE_LEVEL, что означает, что её значение всегда одно и то же, независимо от состояния модификаторов.
- compat (сокращённое от compability) описывает "поведение" модификаторов. В XKB имеется несколько внутренних переменных, которые, в конечном счёте, и определяют -- какой символ будет генерироваться при нажатии клавиши в конкретной ситуации. Так вот, в compat как раз описывается -- как должны меняться эти переменные при нажатии различных клавиш-модификаторов. В этом же разделе обычно описывается и поведение "лампочек-индикаторов" на клавиатуре.
- symbols таблицы, в которых для каждого скан-кода (имени скан-кода, определённого в keycodes) перечисляются все значения (symbols), которые должна выдавать клавиша. Естественно, количество различных значений зависит от типа клавиши (которые описываются в types), а какое именно значение будет выдано в конкретной ситуации, определяется состоянием модификаторов и их "поведением" (которое описывается в compat).
- geometry описывает "геометрию" клавиатуры -- то есть расположение клавиш на клавиатуре. Эти описания нужны не столько самому X-серверу, сколько прикладным программам, которые рисуют изображение клавиатуры.

Все эти компоненты разложены по одноименным директориям в директории `{XROOT}/lib/X11/xkb` (в дальнейшем, я буду обозначать её `{XKBROOT}`).

Весь набор компонентов, необходимых для настройки XKB, описывается в файле конфигурации X-сервера в секции Keyboard.

### Настройка

Чтобы настроить XKB, в файле конфигурации X-сервера надо задать параметры XkbRules, XkbModel, XkbLayout и, если вам нужно что-то не совсем стандартное -- XkbVariant и XkbOptions.

Например,

    XkbRules        "xfree86"
    XkbModel        "pc104"
    XkbLayout       "ru"
    XkbVariant      "winkeys"
    XkbOptions      "grp:shift_toggle"

означает, что XKB должен в соответствии с правилами, описанными в файле `{XKBROOT}/rules/xfree86`, выбрать настройки для клавиатуры типа "pc104" (104 кнопки), русского алфавита (английский алфавит будет включён "по умолчанию"), вариант -- "стандартный" (то есть этот параметр можно было не писать). Если у вас "windows" клавиатура, то полезно указать XkbVariant как "winkeys", в противном случае оставьте эту опцию пустой -- "". В самом конце идут дополнительные опции для вашей "раскладки клавиатуры" -- "grp:shift_toggle".

### Несколько практических рекомендаций.

Небольшое отступление -- "о клавише-переключателе рус/лат".

Другие варианты смены кодировки:

1. grp:toggle -- переключение правым Alt,
2. grp:shift_toggle -- двумя клавишами shift,
3. grp:ctrl_shift_toggle -- ctrl+shift,
4. grp:ctrl_alt_toggle -- ctrl+alt,
5. grp:switch -- переключение по правому Alt только на момент нажатия,
6. ctrl:ctrl_ac -- CapsLock

Когда был написан первый вариант этих рекомендаций, сама раскладка "русской" клавиатуры (symbols/ru) включала в себя и "переключатель групп" рус/лат, "подвешенный" на клавишу CapsLock. С одной стороны, это было удобно -- в простейшем случае достаточно было выбрать "русскую раскладку", и вы автоматически получали и клавишу для переключения "на русский". Но, с другой стороны, это было неудобно для тех, кто предпочитает в качестве переключателя рус/лат другую клавишу (или комбинацию клавиш). Конечно, выбрать другой переключатель не составляло труда, но при этом оставался и переключатель на CapsLock, что многим не нравилось. Для того, чтобы убрать его, надо было "залезть" в соответствующий файл и вручную подправлять соответствующую раскладку.

В конце концов (начиная с версии 3.3.4) сами разработчики XFree убрали этот "переключатель" из "русской раскладки". Но в связи с этим появились и некоторые проблемы -- теперь клавишу-переключатель надо явно "заказывать" при конфигурировании XKB.

Самый простой способ настройки -- использовать программу для автоматической настройки X-window.

В XFree86 такая программа называется XF86Setup.

При этом "по умолчанию" используются "правила" (XkbRules) -- xfree86. Вам нужно будет только выбрать "модель" (XkbModel), "схему" (XkbLayout) и "способ переключения групп" (переключатель "РУС/ЛАТ").

Кроме того, при желании вы можете изменить "положение клавиши Ctrl". Естественно, в конфигурации это будет выглядеть как соответствующие строчки XkbOptions.

Итак. Запустите программу `XF86Setup`, выберите раздел Keyboard. В этом разделе выберите из меню Model (тип клавиатуры) и Layout (язык). Не забудьте отметить в отдельных списках (в правой части) подходящий "переключатель групп" и, если хотите -- "расположение Ctrl".

При выходе из программы она запишет соответствующие строчки в файл конфигурации XFree в секции Keyboard.

Для смены кодировки можно воспользоваться любой из многочисленных программ переключения кодовых страниц через xkb -- например, я пользуюсь программой xxkb Ивана Паскаля.

Offtopic: Если в файле `/usr/X11R6/lib/X11/xkb/compat/iso9995` поменять

       indicator "Group2" {

на

       indicator "Scroll Lock" {

то в ответ на переключение регистра будет загораться лампочка `Scroll Lock` на клавиатуре.

### xmodmap

Описанное ниже относится к относительно старым версиям X-Window (кто бы сказал, к каким? Заведомо к версиям, меньшим 3.3.3), в которых способ Xkb (раздел Xkb) не работает.

В случае русификации через xmodmap первое, что вы должны сделать, -- это отключить Xkb!

Чтобы отключить поддержку Xkb, в файле `XF86Config` изучите раздел `Keyboard` и закомментируйте все строки, начинающиеся с Xkb (регистр не имеет значения). Взамен добавьте следующую строку:

    XkbDisable

Программа `xmodmap` позволяет настроить коды, соответствующие различными символам и их комбинациям. Эта настройка основана на файле, содержащем таблицу перекодировки.

Я настоятельно советую вам самостоятельно не разбираться с `xmodmap`, по крайней мере для начала. Вы не получите ничего, кроме головной боли и разочарования. Вместо этого я рекомендую вам установить пакет xruskb, который позволяет вам сконфигурировать большинство входных параметров перекодировки без необходимости сталкиваться с `xmodmap`.

## 4.4 Нерусская кириллица для X Window

Все описанное приложимо не только для русского языка. Надо изменить только клавиатурные раскладки, ну и шрифты, естественно, будут иметь другую кодировку.

Возможно, найденные вами шрифты окажутся в отличной от нужной вам кодировки. Для перекодировки BDF-шрифтов можно использовать программу trbdf из пакета trscripts.

Эта программа поддерживает кодовые страницы ibm855, ibm866, iso-8859-5, koi8-c, koi8-r, koi8-u, mac-cyrillic, mik, unicode и ecma-cyrillic. Символы, отсутствующие в исходной кодировке, аппроксимируются, так что её можно использовать, например, для генерации KOI8-U шрифтов из KOI8-R.

Hачиная с версии 4.0.3 XFree официально поддерживает кодировку cp1251. Если версия вашей XFree меньше 4.0.3, то поддержку cp1251 можно получить тремя способами:

1. Использовать дистрибутив, поддерживающий cp1251.
2. Патчить XFree. Патч поддержки cp1251 для XFree 3.3.5 и 4.0 сделан Алексеем Новодворским.
3. Идеологически неверное решение, но работает везде и легко осуществимо: Добавьте в конце файла `locale.alias` (обычно он находится в каталоге `/usr/X11R6/lib/X11/locale`) строку вида

       be_BY.CP1251            en_US.ISO8859-1

   Конечно, вместо `be_BY.CP1251` здесь Вы можете поставить строку для используемой Вами локали. (Однако имейте ввиду, что имеющаяся уже в этом файле строка о Болгарской локали `bg_BG` неверна и её нужно удалить.)

Если для кириллизации клавиатуры используете метод через утилиту `xmodmap`, то этим все и кончится. Если же вы захотите использовать Xkb метод, то в клавиатурной раскладке вместо символических имён нужно использовать коды символов согласно cp1251. Например, для белорусской раскладки вместо

        key <AD01> {        [               q,               Q      ],
                            [ Cyrillic_shorti, Cyrillic_SHORTI      ]       };

нужно использовать

        key <AD01> {        [               q,               Q      ],
                            [            0xe9,            0xc9      ]       };

Замечание. Только версии XFree после 4.0.0 поддерживают KOI8-U. Если у вас отсутствует поддержка KOI8-U, а вам нужна именно эта кодировка, то вы можете воспользоваться всем вышеописанным про cp1251.

Вперед Назад Содержание