Тут є два шари: відображення KEYCODE до KEYSYM та KEYSYM для відображення тексту. Якщо ви порахуєте ядро, є більше шарів, яке має зіставити коди ATC клавіатури на 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 активується, коли активовані і клавіша зсуву, і перемикач режиму.
Після створення KEYSYM це може бути інтерпретовано безпосередньо, але найчастіше буде перетворено в текст. Не всі KEYSYM перетворюються на текст або можуть впливати лише на майбутній 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 вирішить зіставити ключ.