2.3.1.2. Физические и логические коды клавиш.

    Коды, передаваемые через поле keycode структуры XKeyEvent, однозначно идентифицируют клавиши. Их конкретные значения зависят от типа машины и клавиатуры. Эти коды мы будем называть физическими. Чтобы обеспечить переносимость программ, сервер устанавливает соответствие между физическими кодами клавиш, которые могут меняться от компьютера к компьютеру, и целочисленными константами - логическими кодами (символами). Они имеют предопределенные значения, которые приведены в файле "Keysymdef.h" и начинаются с префикса "XK_". Так букве "a" соответствует символ XK_a, клавише <Return> (<Enter>) - символ XK_Return и т.д.

    Для разных алфавитов X поддерживает разные множества логических кодов. Возможные типы алфавитов перечисляются в файле "Keysym.h".

    Одному коду клавиши может соответствовать несколько символов в зависимости от состояния клавиш - модификаторов. Процедура

KeySym XKeycodeToKeysym (Display* prDisplay, KeyCode nKeycode,
        int nIndex);

позволяет по коду nKeyCode получить соответствующий ему символ с номером nIndex. Если nIndex равен 0, то полученный символ соответствует просто нажатой клавише. Если nIndex равен 1, то возвращается символ, соответствующий ситуации, когда клавиша нажата одновременно с Shift.

    Функция XKeysymToKeycode( ) осуществляет обратное преобразование.

    Программа может получить карту соответствия кодов и символов, обратившись к процедуре XGetKeyboardMapping( ).

    Изменяется соответствие физических и логических кодов процедурой XChangeKeyboardMapping( ). Следующая последовательность операторов ставит клавише <F2> в соответствие символ XK_F3.

........
Keysym	nF2Sym, nF3Sym;
int	nF2Keycode;
Display	*prDisplay;
........
nF2Sym          = XStringToKeysym ("F2");
nF3Sym          = XStringToKeysym ("F3");
nF2Keycode      = XKeysymToKeycode (prDisplay, nF2Sym);
XChangeKeyboardMapping (prDisplay, nF2Keycode, 1,
               &nF3Sym, 1);
........

    Здесь использована процедура XStringToKeysym( ), которая по строке "str" возвращает соответствующий символ XK_str.

    Когда соответствие кодов меняется, всем работающим в настоящее время клиентам посылается событие MappingNotify.

    Клавиши-модификаторы также имеют логические коды. Клавишам Shift сопоставлены символы XK_Shift_L и XK_Shift_R; Caps Look соответствует XK_Caps Look; Control - XK_Control_L; Mod1 - XK_Meta_L и XK_Meta_R. Символы остальных модификаторов (Mod2 - Mod5) не определены. X содержит набор специальных процедур, которые позволяют получить и установить соответствие код-символ (ы) для модификаторов. Эти функции следующие: XGetModifierMapping( ), XInsertModifiermapEntry( ), XDeleteModifiermapEntry( ), XSetModifierMapping( ). Подробное их описание выходит за рамки настоящего издания ( см. подробнее, например [8] ).