В клавиатурах используются понятия кикод (key code, код клавиши) и сканкод (scan code, код сканирования?). Их надо различать.
В ЙМК
Из доков:
A 2-byte number that represents a particular key. 0x00-0xFF are used for Basic Keycodes while 0x100-0xFFFF are used for Quantum Keycodes.
Двухбайтовое число, которое представляет определённую клавишу. 0x00-0xFF используются для базовых кикодов, а 0x100-0xFFFF для квантовых.
Из доков:
A 1 byte number that is sent as part of a HID report over USB that represents a single key. These numbers are documented in the HID Usage Tables published by the USB-IF.
Однобайтовое число, которое отправляется как часть HID-репорта через USB, представляющее клавишу. Они описаны в документе HID Usage Tables, публикуемом USB-IF.
Собственно, сканкод — код клавиши на простой клавиатуре без слоёв и фокусов. Компьютер от клавиатуры ожидает сканкоды, клавиатура компьютеру отправляет сканкоды.
Но для программируемых клавиатур этого мало, потому что нам могут потребоваться клавиши, которых просто нет в HID Usage Tables. Например, слоефикаторы. Поэтому в ЙМК (и в любом более-менее нормальном клавиатурном фреймворке) этот один байт расширили, вместив туда и сканкоды и свои фишки. Базовые кикоды — кикоды, равные сканкодам. Квантовые — не равные, собственно.
В ОС
Я так понимаю, используемый ОС код тоже называется кикодом.
xev
в своём выводе использует термин кисим (keysym, символ клавиши), который обозначает, что нажатие этой клавиши вводит. Каждому кикоду должен соответствовать кисим, возможно? Надо исследовать
За раскладки в X11 отвечает модуль xkb. Приложения могут получить три основные вещи из события нажатия:
-
keycode
— непосредственно нажатая клавиша, (обычно) независимо от языков и модификаторов; предпочтительно использовать для хоткеев -
keysym
— один юникодный символ или один из специальных символов (к ним относятся, например, стрелки, переключение языка); например, NumPad имеет уникальные коды, но символы совпадают (в зависимости от NumLock) с цифровым рядом/средним блоком (надо проверить) -
XLookupString()
— строка, которую выдал IME; предпочтительно для ввода текста
Раскладка компилируется из человекочитаемого формата в двричный при помощи xkbcomp
, обычно вызываемый из setxkbmap
. Она отвечает за выдачу keysym
из keycode
и внутреннего состояния. Также возможна подмена keycode
, например, для прозрачной реализации слоёв.