Библиотека сайта rus-linux.net
Примеры изменения конфигурации XKB.
Прежде всего, хочу заметить, что все решения, рассмотренные в примерах, не претендуют на "правильность".
Более того, многие из них я сам считаю или излишне "корявыми" (громоздкими), или "идеологически неправильными".
Но, с другой стороны, я не предлагаю готовые решения для всех проблем, а только хочу показать - чего можно добиться простым изменением текстовых "конфигов" XKB.
Во-первых, давайте решим вопрос -
Где будем экспериментировать?
Конечно, все изменения конфигурации можно сделать непосредственно в соответствующих файлах настройки XKB. Но это очень неудобно по нескольким причинам
- всегда хочется иметь возможность "откатиться" к стандартной конфигурации, поэтому придется сохранять отдельно оригинальные файлы;
- если в следующих версиях "иксов" эти файлы изменятся, то вам придется либо переносить свои изменения вручную, либо продолжать пользоваться старыми файлами;
- ну и, наконец, если мы вносим изменения только в одно-два определения, зачем нам искать их каждый раз в "многоэтажном" тексте.
При этом xkbcomp позволяет легко "нанизывать" несколько файлов при описании одного компонента настройки XKB. Например, файл (блок) описания компонента xkb_types может выглядеть как
xkb_types { include "basic+pc+мои_типы+еще_один_полезный_тип"; };Что означает -
- взять описание из файла basic;
- добавить к нему описание из файла pc;
- добавить описание из файла мои_типы;
- и, наконец, добавить еще описание из файла еще_один_полезный_тип.
При этом, если в добавляемом файле встретится определение для какого-то элемента, уже описанного в предыдущих файлах, новое определение, обычно, замещает старое, не затрагивая все остальные определения.
Итак. Давайте все изменения/исправления/дополнения помещать в отдельных файлах и просто "приплюсовывать" эти файла к уже имеющимся.
Хотя, в некоторых случаях (особенно это касается добавлений в xkb_symbols), боле эффективным может оказаться не "приплюсовывание", а объявление добавляемого файла отдельной инструкцией - replace.
Напомню, что "плюсик" в инструкции include означает, что инструкции из
файла будут добавляться в режиме override (см "Способ добавления".). А при
переопределении клавиш часто требуется способ replace.
Поэтому, при добавлении в xkb_symbols, вместо одного длинного include
лучше использовать конструкцию типа
xkb_symbols { include "en_US(pc104)" replace "my.symbols" replace "one_another_symbol" };
Теперь осталось решить вопрос - куда "приплюсовывать"?
Во-первых, напомню, что программа xkbcomp может "на ходу" поменять настройки
XKB прямо в работающем X-сервере. Для этого вторым ее аргументом ("куда")
нужно указать "X дисплей". Если вы работаете на той же машине, где и
запущен X-сервер, то это выглядит как
xkbcomp ... :0.0(можно еще проще - ":0")
А вот первым аргументом должен быть файл с описанием одного или нескольких компонентов настройки. Для того, чтобы одной командой загружать все необходимые компоненты настройки, давайте сначала составим файл с полным описанием всех компонентов, соответствующий вашей текущей конфигурации.
Это совсем не сложно, но зависит от того - какой способ задания полной
конфигурации используется у вас в XF86Config (см. "Настройка XKB")
(Надеюсь, что у вас используется один из способов "в чистом виде", а не
"каша" из всех возможных инструкций).
"Первый способ"
Если у вас используется первый способ - перечислением необходимых компонентов (keycodes, types, compat, symbols, geometry).
Просто скопируем из файла XF86Config все инструкции типа Xkb**** из секции
"Keyboard" в наш файл. И слегка подправим.
Например, у вас там написано
XkbKeycodes "xfree86" XkbTypes "default" XkbCompat "default" XkbSymbols "us(pc104)+ru" XkbGeometry "pc(pc104)"Надо -
- во всех строчках заменить префикс Xkb на Xkb_ ("case" букв менять не обязательно),
- вставить в каждую строчку инструкцию include,
- получившиеся инструкции include "..." взять в фигурные скобки и закончить знаком ";",
- и, наконец, добавить "обрамление" - xkb_keymap { .... }; .
xkb_keymap { Xkb_Keycodes { include "xfree86" }; Xkb_Types { include "default" }; Xkb_Compat { include "default" }; Xkb_Symbols { include "us(pc104)+ru" }; Xkb_Geometry { include "pc(pc104)" }; };
Это и есть полное описание настройки XKB. Которое можно загружать в X-сервер, программой xkbcomp.
Все наши добавки мы можем "приплюсовывать" в соответствующие строчки этого описания.
"Второй способ"
Если у вас используется второй способ - указание полной keymap. В этом случае надо просто найти конкретную keymap и скопировать в наш файл.
Например, у вас в XGF86Config есть только строчка
XkbKeymap "xfree86(ru)"Она указывает на то, что полное описание лежит в файле {XKBROOT}/keymap/xfree86, в блоке "ru".
Находим этот файл. Находим в нем блок
xkb_keymap "ru" { .... };И "выкусываем" его оттуда. (Поскольку в нашем файле только один блок, название блока можно убрать).
Больше никаких исправлений не требуется.
"Третий способ".
Если у вас используется третий способ - через задание "правил", "модели", "схемы".
В этом случае все немного сложнее, поскольку непосредственно xkbcomp не понимает этот способ.
Однако, в этом случае можно "вручную" выполнить преобразование
правил/модели/схемы в компоненты настройки (keycodes,symbols и т.п.).
Например, у вас в файле конфигурации написано
XkbRules "xfree86" XkbModel "pc104" XkbLayout "ru" XkbOptions "grp:shift_toggle"
Сначала надо найти файл "правил" (rules). Это будет файл {XKBROOT}/rules/xfree86.
В первой секции, которая после "шаблона"
! model = keycodes geometryпо вашей модели - "pc104" находим название файлов (блоков) для xkb_keycodes и xkb_geometry. Скорее всего это будет
xkb_keycodes - "xfree86" xkb_geometry - "pc(104)"
Теперь, во второй секции, после "шаблона"
! model layout = symbolsнайдем по "модели" - "pc104" и "схеме" - "ru" подходящий файл для xkb_symbols.
Скорее всего, схема "ru" там не упомянута. Но зато есть правило
pc104 * = en_US(pc104)+%l%(v)где %l надо "заместить" названием "схемы" (layout), а %(v) - названием "варианта".
Поскольку "вариант" у вас не задан, то это правило "развернется" в
xkb_symbols - "en_US(pc104)+ru"
Следующая секция, после "шаблона"
! model layout = compat typesвообще очень простая
* * = complete completeТо есть, независимо от конкретных значений model и layout, и xkb_compat, и xkb_types надо брать из файлов "complete".
Таким образом, для нашего файла полной конфигурации значения
xkb_types - "complete" xkb_compat - "complete"
И, наконец, последняя секция, после "шаблона"
! option = symbolsуказывает, что для нашей "опции" - grp:shift_toggle, к уже выбранному файлу для xkb_symbols надо "приплюсовать" еще и блок "group(shift_toggle)"
Теперь не забудьте добавить слова include, скобки в нужном месте и "обрамление" xkb_keymap { ... };
Должно получится
xkb_keymap { xkb_keycodes { include "xfree86" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "us(pc104)+ru+group(shift_toggle)" }; xkb_geometry { include "pc(pc104)" }; };Это и есть наша рабочая "полная конфигурация", к которой можно писать "добавки" - исправления/дополнения.
Наконец, надо заметить, что делать все это (и полное описание и фалы-добавки) вы можете в отдельной директории, поскольку xkbcomp при "разборке" include сначала ищет файла в текущей директории, а только потом в "стандартном" месте - {XROOT}/lib/X11/xkb. Естественно, подразумевается, что мы при экспериментах запускаем xkbcomp, находясь в этой директории.
А вот потом, если вы решите, что "это хорошо", можно будет разложить файлы с исправлениями в соответствующие поддиректории (keycodes, types, symbols и т.д ) "домашней директории" XKB - {XROOT}/lib/X11/xkb. И подправить файл конфигурации X-сервера так, чтобы он при старте загрузил вашу конфигурацию.
Итак. Примеры изменения конфигурации XKB.
- Новый тип для клавиши Enter.
- Добавляем новую "старую" раскладку клавиатуры.
- "Вариации на тему" переключатели "рус/лат" (и еще раз - "рус").
- Еще несколько "переключателей".
Иван Паскаль pascal@tsu.ru