Зв'язок розкладки клавіатури та xmodmap


12

Я використовую Xubuntu. Перед входом я можу вибрати розкладку клавіатури. Я використовую xmodmapдля перестановки деяких клавіш.

Мене цікавлять дві речі:

  1. Як змінюється стан відображення на клавіатурі (а), коли я включаю ноутбук, (б) під час завантаження і (в) увійти в систему (на цих трьох етапах) та під час роботи з системою (увійшов у систему).
  2. Причини, які символи відображатимуться на екрані (та надіслані контрольні клавіші) протягом окремих фаз. Коли я натискаю якусь клавішу, він надсилає якийсь сигнал драйверу клавіатури (?), І тоді повинен бути якийсь процес прийняття рішення (програми та файли конфігурації), який визначає, які символи будуть відображатися. Відповідь на це питання має бути переліком програм та шляхів до цих файлів конфігурації (мене особливо цікавить Ubuntu (система на базі Debian), але ви можете описати якусь іншу систему, але Ubuntu є кращою).

Відповіді:


25

Тут є два шари: відображення 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 вирішить зіставити ключ.


Дякую за велике пояснення та нову інформацію. Чи знаєте ви, які програми запускаються в процесі завантаження (на початку або initscript), який приймає рішення над клавіатурою, і що відбувається при вході на етапі, я можу вибрати макет. Яка програма взаємодіє з нею і де вона зберігається у файловій системі? Після входу xmodmap або xkb замінить макет за замовчуванням, обраний під час входу?
xralf

Як я вже сказав, ключову карту ядра завантажує loadkeysодин із сценаріїв init. grep loadkeys /etc/init.d/*розкриває файл keymap.sh. X11 має власну клавішну програму, яка традиційно завантажується Xmodmap, що працює з одного із сценаріїв запуску Xsession. Сьогодні, коли замість Xmodmap використовується XKB, клавіатурне налаштування за замовчуванням встановлюється або в Xorg.conf через різні параметри Xkb або через HAL. Після завантаження або менеджера дисплея Gnome, або KDE, вони можуть завантажувати власний макет за допомогою setxkbmapкоманди. У середовищі робочого столу користувача також може бути встановлений інший макет для входу.
пінгвін359

Я спробував команду grep loadkeys /etc/init.d/*і locate keymap.shта нічого не було знайдено. Файл Xorg.conf теж не знайдено. Це залежить від моєї версії Ubuntu, яка становить 10,04?
xralf

Яку подію отримає вікно? Подія з KEYSYM, а потім програма перетворює KEYSYM в текст, яким способом? Чи надає Xorg інтерфейс IPC / RPC для додатків для перетворення KEYSYM в текст? Або додаток повинен це робити суто сам?
炸鱼 薯条 德里克
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.