Настройка xkb на тонких клиентах Sun Ray

УДК 004.451:004.514

НАСТРОЙКА ХКВ НА ТОНКИХ КЛИЕНТАХ SUN RAY

A.A. Печерицын

В данной работе описывается механизм работы модуля ХКВ, управляющего вводом с клавиатуры в графической оболочке X Window System. Предложено решение проблем, возникающих при настройке ХКВ на тонких клиентах Sun Rav 2.

Введение

В современных версиях X Window System (графической подсистемы Unix-no-добных ОС) вводом с клавиатуры управляет модуль X Keyboard Extension (ХКВ). Примеры установки нескольких раскладок клавиатуры и переключения между ними через ХКВ можно найти в руководствах по ОС Unix и в сети Internet. Однако если настройка ХКВ не дает ожидаемого результата, то готовые способы решения этой проблемы в Internet найти, как правило, сложно.

В данной работе приведено краткое изложение основ ХКВ и показано, как, используя утилиты для работы с ХКВ, получить дополнительную информацию о текущих параметрах ввода с клавиатуры. Далее показано, как применить полученные знания к решению проблем настройки ХКВ на тонких клиентах Sun Rav 2.

1. Настройки ХКВ

В этом разделе приводятся необходимые для дальнейшего изложения сведения о механизме работы и настройках ХКВ, взятые из руководства [1].

Основное назначение модуля ХКВ — преобразование скан-кодов нажимаемых клавиш в коды символов. Для этого ХКВ использует таблицу символов, в которой с каждой клавишей (точнее, скан-кодом) связано несколько однострочных таблиц символов (ХКВ-групп). Каждая такая таблица делится на несколько колонок. В колонках находятся символы, которые может выдавать данная клавиша. При нажатии клавиши сначала по значению специальной переменной — текущему номеру группы — определяется, какую группу нужно использовать. Затем по состоянию клавиатурных модификаторов (Shift, Ctrl и

Copyright © 2009 A.A. Печерицын. Омский государственный университет. E-mail: pecher@cmm. univer. omsk. su

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

Информация, необходимая для построения таблицы символов, содержится в текстовых файлах, образующих «базу данных» ХКВ, Эта база данных состоит из 5 компонентов:

key со des — таблицы, которые задают символические имена для скан-кодов клавиш;

types — описание типов клавиш;

compat — описание модификаторов клавиатуры и световых индикаторов на клавиатуре;

symbols — таблицы, в которых для каждого символического имени клавиши (определенного в keycodes) перечисляются все значения, которые должна выдавать клавиша;

geometry — описание расположения клавиш на клавиатуре («геометрия» клавиатуры) ,

Файлы базы данных ХКВ находятся в подкаталогах корневой директории ХКВ, имена которых совпадают с именами компонентов. Каждый файл может содержать несколько поименованных блоков.

Для корректной работы ввода с клавиатуры в конфигурационном файле Х-сервера прописывают настройки ХКВ, Настройки конкретного компонента указывают в виде имя_файла(имя_блока); это означает, что при построении таблицы символов описание данного компонента будет взято из блока с именем имя_блока в файле имя_файла, который находится в соответствующем подкаталоге корневой директории ХКВ, Если указано только имя файла, выбирается блок, помеченный флагом default. Допускается указывать несколько блоков, разделенных символами «+»; в этом случае описание компонента выбирается из нескольких файлов.

Обычно при конфигурировании Х-сервера настройки клавиатуры указываются не перечислением компонентов, а с помощью задания параметров rules, model, layout, variant и options, которые имеют следующий смысл:

• model (модель) определяет тип клавиатуры; вать клавишам; параметром layout;

ключения раскладок клавиатуры, значения клавиатурных индикаторов и т.д.);

• rules (правила) задает файл, содержащий таблицу правил, в соответствии с которыми по указанным значениям model, layout и т.д. определяются настройки всех 5 компонентов ХКВ.

Файлы правил находятся в подкаталоге rules корневого каталога ХКВ. Правила задаются в виде таблиц, причем каждая таблица начинается с шаблона, который определяет, как интерпретируются перечисленные ниже строки. Шаблон начинается с символа «!» Например, шаблон «! model layout = symbols» значениям параметров model и layout ставит в соответствие значение компонента symbols.

Для настройки ХКВ необходимо указать как минимум параметры rules, model и layout. В параметре layout допускается указывать несколько значений через запятую; таким образом, устанавливается несколько раскладок клавиатуры. Вариант иногда указывают в скобках после схемы: layout (variant). Для русского языка необходимо также указывать способ переключения клавиатуры в параметре options.

Настройки ХКВ можно также установить «на лету», используя команду setxkbmap. Параметры rules, model, layout, variant и options задаются с помощью ключей -rules, -model, -layout, -variant и -options соответственно. Если какой-то параметр не указан, то выбирается его текущее значение. Для отладки полезно указывать ключ -v level, включающий вывод дополнительной информации. Параметр level принимает значения от 1 до 10, большее значение соответствует большему количеству выводимой информации. В частности, команда setxkbmap -v отображает текущие настройки компонентов ХКВ.

Для проверки работы ХКВ полезна также команда xkbcomp -xkb $DISPLA Y test.xkb. Эта команда, запрашивает у Х-сервера полные текущие установки ХКВ (соответствие скан-кодов именам клавиш, описание типов, таблицу символов и др.), преобразует их в текстовый формат и выводит в файл test.xkb.

Подробнее о командах setxkbmap и xkbcomp можно узнать из справочных страниц (man setxkbmap, man xkbcomp).

2. Пример настройки ХКВ

Проиллюстрируем все вышеописанное на следующем примере. Пусть настройки ХКВ прописаны в конфигурационном файле Х-сервера /etc/Xll/xorg.conf в разделе InputDevice следующим образом:

Section "InputDevice"

Option "XkbRules" "xfree86"

Option "XkbModel" "pcl05"

Option "XkbLayout" "us,ru"

Option "XkbOptions" "grp:ctrl_shift_toggle"

EndSection

Здесь в качестве модели указана 105-клавишная клавиатура, определены английская и русская раскладки клавиатуры; задано переключение ракладок по

нажатию комбинации клавиш Ctrl + Shift, Определение настроек компонентов ХКВ будет производится с помощью файла правил xfree86.

В этом случае команда setxkbmap -v выведет на экран следующую информацию:

keycodes: xfree86+aliases

types: complete

compat: complete

symbols: pc

geometry: pc

Отсюда видно, каковы настройки компонентов ХКВ, Особый интерес представляет значение параметра symbols. Описание раскладки клавиатуры состоит из нескольких блоков, находящихся в файлах рс, us, ru и group в подкаталоге symbols корневой директории ХКВ, Блок рс(рс105) описывает поведе-

ние служебных клавиш 105-клавишной клавиатуры (функциональных клавиш, клавиш редактирования и т.д.). Блок us устанавливает английскую раскладку клавиатуры. Блок г и добавляет русскую раскладку клавиатуры как вторую группу символов, на что указывает цифра 2 после двоеточия [2]. Наконец, блок group (etr1_ shift, _ toggle) определяет комбинацию Ctrl+Shift в качестве переключателя раскладок клавиатуры.

Текущие установки ХКВ можно просмотреть с помощью команды xkbeomp -xkb $DISPLAY. Таблица символов при этом находится в секции xkb_symbols. Ниже приведено описание одной из алфавитно-цифровых клавиш:

key <AD01> {

type— "ALPHABETIC",

symbols[Groupl]= [ q, Q ],

symbols[Group2]= [ Cyrillic_shorti, Cyrillic_SHORTI ]

>;

Отсюда видно, что с клавишей связано две XKB-группы, причем в первой группе содержатся строчная и заглавная буквы «q», а во второй — строчная и заглавная русские буквы «й». Клавиша относится к типу ALPHABETIC, поэтому для выбора колонки используется модификатор Shift [2].

Для переключения раскладок клавиатуры в ХКВ существуют специальные символы: IS О _ N ext, _ Group и ISO_Prev_Group, Первый из них увеличивает значение текущего номера группы на 1, а при достижении максимального значения устанавливает его в 1, Второй аналогичным образом уменьшает текущий номер группы,

В рассматриваемой таблице символ IS О _ Pre v _ Group присутствует в описании клавиш <LCTL> (левый Ctrl) и <LFSH> (левый Shift), причем в обоих случаях во второй колонке. Для клавиши <LCTL> за выбор колонки отвечает модификатор Shift, а клавиша <LFSH> относится к типу PC_BREAK, в котором для выбора колонки используется модификатор Ctrl, Следовательно, символ ISО_Prev_Group будет генерироваться левой клавишей Ctrl при прижатой (левой или правой) клавише Shift либо левой клавишей Shift при

прижатой клавише Ctrl, Аналогично, правые Ctrl и Shift генерируют символ IS О _ N ext, _ Group. Таким образом, раскладки клавиатуры переключаются комбинацией клавиш Ctrl+Shift, как и прописано в конфигурации ХКВ,

В современных версиях Linux для настройки ХКВ используют службу HAL (Hardware Abstract Level, уровень аппаратных абстракций) [3]. Эта служба предоставляет программам-клиентам информацию об имеющихся на компьютере устройствах и их настройках. Конфигурация ХКВ каким-либо способом заносится в базу данных HAL, Например, в Ubuntu Linux 9,04 в настройках HAL указано, что при обнаружении клавиатуры должен запускаться скрипт debian-setup-keyboard. Этот скрипт добавляет в базу данных HAL настройки ХКВ, которые берет из файла /etc/default/console-setup.

3. ХКВ на клиентах SuiiRay

В процессе администрирования сети ФКН возникла задача настройки ХКВ на тонких клиентах Sun Ray 2, подключенных к серверу SunFire Х4200, Сервер работает под управлением ОС Linux (Ubuntu 9,04), Для работы с тонкими клиентами на нем установлено серверное ПО Sun Ray 4,2,

Следует отметить, что на сервере и на клиентах запускаются разные X-серверы. На сервере работает стандартный Xorg, для которого настройки ХКВ находятся в каталоге /usr/share/Xll/xkb, а на клиентах запускается Xnewt, специально разработанный Sun для работы на тонких клиентах, для которого корневым каталогом ХКВ является /opt/SUNWut/lib/xkb. Поддержка, ХКВ в Xnewt по умолчанию выключена,

В описании установки ПО Sun Ray на сервер под управлением Ubuntu Linux [4] рекомендуется выполнить следующие действия, касающиеся ХКВ:

• переименовать каталог xkb в директории /opt/SUNWut/lib, в xkb.bak и создать вместо него символическую ссылку с именем xkb на корневой каталог ХКВ для Xorg (/usr/share/Xll/xkb), чтобы Xorg и Xnewt использовали единую базу данных ХКВ;

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

В результате анализа этой проблемы выяснилось следующее. При запуске Xnewt запрашивает у ядра Linux аппаратные тип и схему (layout) используемой клавиатуры (см, [5] и комментарии в файле xkbtable.map). Затем он производит поиск настроек ХКВ, соответствующих данным типу и схеме, в файле /opt/SUNWut/lib/xkb/xkbtable. map. В этом файле для каждой пары «тип, схема» указаны либо готовая раскладка клавиатуры (keyтар), либо модель и схема ХКВ, Для определения настроек ХКВ по найденным модели и схеме используется файл правил xorg из каталога /opt/SUNWut/lib/xkb/rules. В данной версии Ubuntu Linux этот файл является символической ссылкой на файл base.

В рассматриваемом случае используется USB-клавиатура Sun Туре 6 с русской раскладкой, аппаратный тип которой 6, а схема — 23, По информации из файла xkbtable.map можно определить, что этим значениям соответствуют ХКВ-модель sun_type6_euro_usb и схема ru. Однако в файле правил base модель sun_type6_euro_usb не упоминается, поэтому во всех таблицах правил будут выбраны те строчки, в которых в поле model указан символ «*» (значения по умолчанию), В результате настройки компонентов ХКВ будут следующими:

keycodes = xfree86+aliases

types = complete

compat = complete

symbols = pc+ru

geometry = pc

Именно такие значения выдает в данном случае команда setxkbmap -v. Из значения параметра symbols следует, что на клавиатуре действительно присутствует только русская раскладка, так как блок рс определяет поведение служебных клавиш

В [6] для решения проблемы с вводом английских букв рекомендуется указать в файле xkbtable.map для типа 6 и схемы 23 значение схемы ХКВ us вместо ru, однако это приводит к отсутствию русской раскладки на клавиатуре.

На наш взгляд, более корректный способ решения этой проблемы заключается в том, чтобы добавить в файл base правила для модели клавиатуры sun___ty реб_euro_usb. аналогичные тем, которые имеются в файле хогд ка-

талога /opt/SUNWut/lib/xkb.bak/rules (непосредственно перенести правила из файла хогд в файл base нельзя, так как имена файлов и подкаталогов в директориях xkb и xkb.bak, а также имена блоков в файлах могут не совпадать).

Ниже приводится список внесенных в файл base изменений,

1, В таблицу, определенную шаблоном ! model = keycodes, добавляется правило

sun_type6_euro_usb = sun

2, В таблицу ! model = geometry добавляем правило sun_type6_euro_usb = sun

3, В таблице с шаблоном ! model layout = symbols дополнительно указываем следующие правила

sun_type6_euro_usb us = sun_vndr/us(type6)+us sun_type6_euro_usb * =

sun_vndr/us (type6)+us+sun_vndr/°/0l (type6): 2

Первое из них применяется для схемы us, Блок sun_vndr/us(type6) определяет поведение служебных клавиш клавиатуры Sun, a us устанавливает английскую раскладку клавиатуры, (Блок sun_vndr/us(type6) неявно включает английскую раскладку клавиатуры, но проверка показала, что это включение по непонятным причинам не производится). Второе правило срабатывает для схем, отличных от us. Первые два блока действуют аналогично предыдущему случаю, В третьем блоке метасимвол %1 заменяется на значение параметра layout, то есть добавляется соответствующая национальная раскладка клавиатуры, как вторая группа символов,

4, В таблицу ! model layout[1] = symbols нужно добавить правило

sun_type6_euro_usb * = sun_vndr/us

Это необходимо для корректного поиска настроек ХКВ в случае, когда в layout указано несколько значений через запятую. Здесь метасимволы %1[1] и %(v[l]) заменяются соответственно на первое значение в параметре layout и на первый вариант (если он указан) [2]. Таким образом, это правило определяет поведение служебных клавиш и национальную раскладку клавиатуры, соответствующую первой указанной схеме. Раскладки для остальных значений параметра layout добавляются правилами из таблиц ! layout[2] = symbols, ! layout[3] = symbols, ! layout[4] = symbols.

После внесения этих изменений в файл base русскую раскладку клавиатуры на клиентах Sun Ray можно включить, указав в файле xkbtable.map для типа 6 и схемы 23 в качестве значения схемы ХКВ ru либо us.ru. Проверка установок ХКВ, полученных командой xkbcomp -xkb $DISPLAY, показывает, что в обоих случаях русская раскладка клавиатуры добавляется как вторая группа символов, Кроме того, начинают работать клавиши управления звуком.

Вышеперечисленные правила не определяют способ переключения раскладок клавиатуры. Это можно сделать с помощью команды setxkbmap с ключом -options, например:

setxkbmap -option "grp:ctrl_shift_toggle"

Эту команду можно вставить в скрипт, срабатывающий при входе пользователя в систему (например, $НОМЕ/.profile или $HOME/.bashrc).

Литература

1. Pascal, I.U. X Keyboard Extension [Электронный ресурс] / I.U. Pascal. - Режим доступа: http://pascal.tsu.ru/other/xkb

2. Toman, К. How to further enhance XKB configuration [Электронный ресурс] / К. Tomas, I.U. Pascal. - Режим доступа: http://www.xfree86.org/current/XKB-Enhancing.html

3. HAL

4. SRSS 4.1 on Ubuntu Server (i386 and amd64) [Электронный ресурс] - Режим доступа: http://wiki.sun-rays.org/index.php/Sun_Rav_on_Ubuntu

5. Re: Weird keyboard layout problems with SRSS4/Ubuntu 7.10 [Электронный ресурс] - Режим доступа: http://osdir.com/ml/os.solaris.sunrav/2008-01/msg00180.html

6. Sun Ray Server [Электронный ресурс] - Режим доступа: http: / / www.nest.su / tag/sun-rav-server