Keyboard input (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Keyboard input. Дата последней синхронизации: 13 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Необходимым условием для изменения сопоставления клавиш является понимание того, как нажатие клавиши приводит к появлению символа:

  1. Клавиатура посылает компьютеру скан-код (scancode).
  2. Ядро Linux сопоставляет сканкод с кодом клавиши (keycode); смотрите Map scancodes to keycodes.
  3. Раскладка клавиатуры сопоставляет код клавиши с символом клавиши (keysym) в зависимости от того, какие клавиши-модификаторы нажаты.
    1. Для консоли Linux смотрите статью Конфигурация клавиатуры в консоли.
    2. Для Xorg и Wayland смотрите статью Конфигурация клавиатуры в Xorg.

Большинство ваших клавиш уже должны иметь код клавиши или хотя бы скан-код. Клавиши без скан-кода не распознаются ядром; это могут быть дополнительные клавиши от «игровых» клавиатур и т.д.

В Xorg некоторым символам клавиш (например XF86AudioPlay, XF86AudioRaiseVolume) можно назначить действия (такие как запуск внешних приложений). Подробности смотрите в статье Горячие клавиши#Xorg.

В консоли Linux некоторым символам клавиш (например, F1F246) могут быть назначены определённые действия (например, переключение на другую консоль или печать некоторой последовательности символов). Подробности смотрите в статье Конфигурация клавиатуры в консоли#Создание своей раскладки.

Определение скан-кодов

С помощью showkey

Традиционный способ узнать скан код — воспользоваться утилитой showkey(1). showkey ожидает нажатия клавиши, или выходит, если не было нажатий в течение 10 секунд. Чтобы работать с showkey, вы должны быть в виртуальной консоли, а не в графическом окружении или работать, залогинившись по сети. Выполните следующую команду:

# showkey --scancodes

и понажимайте клавиши на клавиатуре; вы должны увидеть скан коды на экране.

С помощью evtest

Для USB клавиатур, видимо, нужно использовать evtest(1) из пакета evtest вместо showkey:[1]

# evtest /dev/input/event12
...
Event: time 1434666536.001123, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70053
Event: time 1434666536.001123, type 1 (EV_KEY), code 69 (KEY_NUMLOCK), value 0
Event: time 1434666536.001123, -------------- EV_SYN ------------
Совет: Если вы не знаете, какой event-номер имеет интересующее вас устройство, вы можете запустить evtest без параметров, и он покажет вам список устройств с их event-номерами, после чего вы можете ввести нужный номер.

Используйте поле "value" из MSC_SCAN. В этом примере показано, что NumLock имеет сканкод 70053 и keycode 69.

С помощью dmesg

Примечание: Этот метод не показывает скан коды всех клавиш, он показывает их только для неизвестных клавиш.

Вы можете узнать скан-код клавиши, нажав её и посмотрев вывод команды dmesg. Например, если у вас отображается такая строка:

Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0

значит, скан код нужной вам клавиши - 0xa0.

Определение кодов клавиш

Коды клавиш Linux определены в файле /usr/include/linux/input-event-codes.h (смотрите переменные KEY_).

Определение кодов клавиш в консоли

В виртуальной консоли Linux коды клавиш можно узнать утилитой showkey(1). showkey ждёт нажатия клавиш, и если нажатий нет в течение 10 секунд, выходит (это единственный способ выйти из программы) Чтобы работать с showkey, вы должны быть в виртуальной консоли, а не в графическом окружении. Выполните следующую команду:

# showkey --keycodes

и понажимайте клавиши на клавиатуре. Вы должны увидеть коды клавиш на экране.

Определение кодов клавиш в Xorg

Примечание: The Xorg keycodes are 8 larger than the Linux keycodes.[2]

В графическом режиме коды клавиш, которые использует Xorg, можно узнать с помощью утилиты xev(1), которая поставляется в пакете xorg-xev. Разумеется, чтобы работать с xev, вы должны находиться в графическом окружении, а не в консоли.

Выполнив следующую команду, вы запустите xev с выводом только релевантной информации:

$ xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'

Вот пример вывода:

38  a
55  v
54  c
50  Shift_L
133 Super_L
135 Menu

Xbindkeys — ещё одна обёртка для xev, которая сообщает коды клавиш.

Если вы нажимаете клавишу и ничего не появляется на терминале, это может означать, что либо у клавиши нет скан кода, либо сканкоду не назначен код клавиши, либо какой-то другой процесс отлавливает нажатия клавиш. Если вы подозреваете, что процесс, слушающий X сервер отлавливает нажатия клавиш, вы можете попробовать запустить xev из чистой X сессии:

$ xinit /usr/bin/xterm -- :1

Смотрите также

  • kbd-project — официальный сайт утилиты showkey