Файл типа xkb_keycodes.

Эти файлы (блоки) имею очень простую грамматику. В них просто для всех скан-кодов задаются символические имена, которые потом используются в файлах типа xkb_symbols для назначения каждой "физической" клавише всех возможных значений.

Надо заметить, что те скан-коды, которые в них используются, имеют весьма отдаленное отношение к "физическим" скан-кодам, которые считываются из "железного" контроллера клавиатуры. Во-первых, X-сервер сам не считывает скан-коды непосредственно из регистров контроллера, а берет их от соответствующих драйверов (например, сервер Xfree86 запущенный на машине с FreeBSD, берет все коды от драйвера "системной консоли" - syscons).

А, кроме того, сам X-сервер переводит эти коды в свои "унифицированные" скан-коды, которые не зависят от архитектуры ("железной" и "софтверной") системы.

Поэтому, при выборе подходящей таблицы xkb_keycodes надо ориентироваться на тип X-сервера, который вы используете. Так, для сервера из "семейства" XFree86, самое правильное - брать определения keycodes, которые соответствуют набору скан-кодов, выдаваемых XFree86.

В файле xkb_keycodes могут встречаться четыре типа объявлений.

Объявление Переменной.

В файле xkb_keycodes могут быть определены две переменные - minimum и maximum.

Они задают минимальное и максимальное значение для скан-кодов. Естественно, что все скан-коды, которые будут использоваться для задания символических имен должны "вписатся" в диапазон между minimum и maximum. Вообще говоря, "объявление переменной" имеет вид

имя_переменной '=' Выражение ';'
Поэтому, слева от знака '=' должно быть либо слово 'minimum', либо - 'maximum'. А справа может быть любое арифметическое выражение (только вот - зачем ?), которое может быть вычислено на этапе "разборки" файла и дать в результате константу типа INTEGER.

Объявление Имени Клавиши.

Основное объявление, которое используется в файлах этого типа.
Имеет вид

KEYNAME '=' Выражение ';'
KEYNAME, вообще говоря, просто некоторая строка символов (string), допустимая в языке C. Отличается только тем, что она ограничивается "угловыми скобками" - знаками '<' и '>' и должна быть не длиннее 4 символов.
Например,
  <AE01> = ... ;

"Выражение" в правой части объявления может быть любым арифметическим выражением, допустимым в языке C. То есть, содержать операции '+ - / *' и "круглые" скобки, при этом операндами могут быть числовые константы десятичного, шестнадцатеричного и восьмеричного типов (в терминах языка C).

Естественно, это выражение должно быть "вычисляемым" на этапе "разборки" файла. (? наверное, в этом выражение могут использоваться ранее определенные переменные - maximum и minimum).

Объявление Алиаса Клавиши.

Эти объявления имеют вид

'alias' KEYNAME '=' KEYNAME ';'

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

Объявление Имени Индикатора.

Вообще-то, эти объявления не имеют никакого отношения к скан-кодам, но, поскольку они тоже имеют непосредственное отношение к "железу", то самое подходящее место для них в файлах этого типа.

Заметим, что в в модуле XKB, существует 32 индикатора. Часть из них отображается на светодиодах (LED) клавиатуры (обычно - первые три) и являются "физическими" индикаторами. Остальные никак не отображаются на "физической" клавиатуре, но могут изображаться специальными программами (xkbvleds, mxkbledpanel). Поэтому, они называются "виртуальными индикаторами".

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

В файлах типа xkb_keycodes им только даются символические имена, которые потом используются в файлах типа xkb_compat и xkb_geometry для указания индикатора.

Объявление имени индикатора имеет вид

'indicator' INTEGER '=' STRING ';'
или
'virtual indicator' INTEGER '=' STRING ';'

Здесь, INTEGER - числовая константы типа INTEGER. Она просто определяет номер индикатора. Обычно, первые три индикатора являются "физическими" (светодиоды NumLock, CapsLock и ScrollLock на клавиатуре), остальные - с 4 по 32, являются "виртуальными" (то есть, никак не отображаются на "физической" клавиатуре).

STRING - произвольная строка символов в "двойных кавычках".

Замечу также, что это имя не только служит для указания конкретного индикатора в других файлах конфигурации XKB, но и запоминается во внутренних структурах модуля XKB и может быть потом считано оттуда соответствующими программами (которые изображают "панель индикаторов" или рисуют "геометрию" клавиатуры).

Пример файла типа xkb_keycodes

default xkb_keycodes "xfree86" {

    minimum= 8;
    maximum= 134;

    <TLDE> =  49;
    <AE01> =  10;
    <AE02> =  11;
.......

    indicator 1 = "Caps Lock";
    indicator 2 = "Num Lock";
    indicator 3 = "Scroll Lock";

    virtual indicator 4 = "Shift Lock";
    virtual indicator 5 = "Altrnate Group";

    alias <ALGR> = <RALT>;
};

Иван Паскаль [email protected]