Связь раскладки клавиатуры и xmodmap

12

Я использую Xubuntu. Перед входом в систему я могу выбрать раскладку клавиатуры. Я использую xmodmapдля переназначения некоторых ключей.

Я заинтересован в двух вещах:

  1. Как меняется состояние раскладки клавиатуры (а) при включении ноутбука, (б) во время процесса загрузки и (в) входе в систему (на этих трех этапах) и при работе с системой (вход в систему).
  2. Причины, по которым символы будут отображаться на экране (и отправленные управляющие клавиши) на отдельных этапах. Когда я нажимаю какую-то клавишу, она посылает некоторый сигнал драйверу клавиатуры (?), А затем должен быть какой-то процесс принятия решения (приложения и файлы конфигурации), определяющий, какие символы будут отображаться. Ответом на этот вопрос должен быть список приложений и путей к этим файлам конфигурации (меня особенно интересует Ubuntu (система на основе Debian), но вы можете описать какую-то другую систему, но Ubuntu предпочтительнее).
xralf
источник

Ответы:

25

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

penguin359
источник
Спасибо за отличное объяснение и новую информацию. Знаете ли вы, какие приложения запускаются в процессе загрузки (upstart или initscript), который принимает решение по клавиатуре, и что происходит при входе в систему на этапе, на котором я могу выбрать макет. Какая программа взаимодействует с ней и где она хранится в файловой системе? После входа xmodmap или xkb перезапишут макет по умолчанию, выбранный при входе в систему?
xralf
Карта ключей ядра, как я уже сказал, загружается loadkeysодним из сценариев инициализации. grep loadkeys /etc/init.d/*показывает файл keymap.sh. У X11 есть свое собственное сопоставление клавиш, которое традиционно загружалось Xmodmap из одного из сценариев запуска Xsession. В настоящее время, когда XKB используется вместо Xmodmap, раскладка клавиш по умолчанию устанавливается либо в Xorg.conf с помощью различных опций Xkb, либо через HAL. После загрузки диспетчера отображения Gnome или KDE они могут загрузить свой собственный макет с помощью setxkbmapкоманды. Окружение рабочего стола пользователя может также установить другое расположение при входе в систему.
penguin359
Я попробовал команду grep loadkeys /etc/init.d/*и locate keymap.shи ничего не было найдено. Файл Xorg.conf тоже не найден. Зависит ли это от моей версии Ubuntu 10.04?
xralf
Какое событие получит окно? Событие с KEYSYM, а затем приложение преобразует KEYSYM в текст, каким образом? Предоставляет ли Xorg интерфейс IPC / RPC для приложений для преобразования KEYSYM в текст? Или приложение должно делать это самостоятельно?
德里克 18 德里克