Здесь есть два слоя: отображение KEYCODE в KEYSYM и отображение KEYSYM в текст. Есть больше слоев, если вы посчитаете ядро, которое должно сопоставить коды сканирования AT Keyboard с кодом KEYCODE в стиле XT или HID-кодом клавиатуры USB с ключом KEYCODE. KEYCODE - это просто 8-разрядное целое число без знака, которое ядро операционной системы передает серверу X11. Это может варьироваться в зависимости от операционных систем, таких как Linux и Solaris. В Linux эти KEYCODE обычно совпадают с количеством, используемым на старых клавиатурах XT PC. Более новые компьютеры с клавиатурами AT, PS / 2 или USB обычно просто сопоставляют эти клавиатуры со старым кодом XT, чтобы обеспечить простоту использования ключа.
Необработанные коды клавиатуры, будь то XT, AT, PS / 2 или USB, представляют физическое местоположение на клавиатуре. Клавиатура XT отправляет только одно 8-битное число при нажатии или отпускании клавиши. Клавиша q на американской / британской клавиатуре XT отправляет число 16. На французской клавиатуре эта же физическая клавиша помечена как a, но она по-прежнему отправляет 16. Это высшие уровни операционной системы, которые придают ей реальное значение. Когда на клавиатуре XT отпускается клавиша, отправляется тот же код клавиши плюс 128. В этом примере, когда нажимается q, отправляется цифра 16, но при отпускании отправляется число 142 (16 + 128). Клавиатуры AT используют коды сканирования, которые представляют собой последовательность чисел и могут быть довольно длинными. Ключевые выпуски добавляют дополнительные коды. Например, скан-код для паузы E1, 1D, 45, E1, 9D, C5. Большинство операционных систем, включая DOS, Windows, Linux, FreeBSD, и BIOS - все карты кодов сканирования в гораздо более простые коды XT-стиля. Это также облегчает поддержку новых клавиатур, которые используют разные коды, такие как USB-клавиатуры, которые отправляют коды HID. Все коды отображаются в один и тот же непротиворечивый набор кодов операционной системой до того, как X11 или приложение увидит их.
X11 не знает об этой части процесса, он просто получает KEYCODE из ядра и применяет свое собственное отображение для преобразования этого KEYCODE в KEYSYM. Xmodmap - это стандартный инструмент для управления этим отображением. Большая часть поведения раскладки клавиатуры настраивается, но есть несколько особых случаев, таких как Num Lock, Mode Switch и Caps Lock / Shift Lock, которые жестко запрограммированы в X11. Другие аспекты, такие как Shift, на самом деле настраиваются. Любая клавиша может быть назначена для переключения в отличие от переключения режимов или Num Lock.
KEYCODE представляют собой физические ключи, отправленные ядром операционной системы. Каждый KEYCODE может отображать до 8 возможных KEYSYM. Только 4 используются и иногда называются уровнями 1-4. Уровень 1 определяет KEYSYM, который печатается, когда модификаторы не активны. Это часто строчные буквы и цифры. Модификаторы - это KEYCODE, которые изменяют KEYSYM, генерируемый другими KEYCODE, когда модификатор активен (нажат или включен). Коды клавиш-модификаторов также управляются через Xmodmap. Уровень 2 определяет KEYSYM для отправки при нажатии модификатора сдвига. Уровень 3 активируется при каждом нажатии переключателя режима KEYSYM. Уровень 4 активируется, когда активны и клавиша Shift, и переключатель режима.
После того, как KEYSYM был сгенерирован, его можно интерпретировать напрямую, но чаще всего он будет преобразован в текст. Не все KEYSYMs превращаются в текст или могут влиять только на будущий KEYSYM. Одним из примеров, конечно, является Shift_L, который не имеет текстового представления, но есть также ряд KEYSYM, которые используются для создания другого символа. Список их в моей системе находится под /usr/share/X11/locale/en_US.UTF-8/Compose
. Одним из таких примеров является dead_acute KEYSYM, который при нажатии попытается преобразовать следующий KEYSYM в острое акцентированное письмо. Существует стандартное сопоставление для преобразования KEYSYM в Unicode.
Теперь, когда все это было сказано, обратите внимание, что Xmodmap устарел и заменен на XKB, который намного сложнее. Это влияет на то, как KEYCODE отображаются на KEYSYM, но не на то, как ядро генерирует KEYCODE, и на то, как KEYSYM преобразуются в текст или составляются, что остается неизменным. XKB можно отключить, восстанавливая поведение Xmodmap. Он также имеет уровень совместимости для поддержки Xmodmap, но он может иметь проблемы, поскольку он не полностью совместим. Правила XKB находятся под /usr/share/X11/xkb/
и намного более сложны. В другом месте есть хорошая документация о том, как он генерирует раскладки клавиатуры для сопоставления KEYCODE с KEYSYM.
Что касается консоли Linux, у нее есть собственные раскладки клавиатуры, которые сохраняются /usr/share/keymaps
и загружаются вместе с loadkeys
командой. На этапе BIOS и более ранних этапах загрузчика, включая GRUB2, отображение клавиатуры - это любое число, на которое BIOS решает сопоставить ключ.