⌨️Кикоды И Сканкоды

В клавиатурах используются понятия кикод (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, например, для прозрачной реализации слоёв.