Я часто работаю на сопряженных станциях, где установлено несколько клавиатур. Я могу использовать setxkbmap
с, -device <ID>
чтобы установить раскладку для конкретной клавиатуры (используя идентификатор изxinput
), но часто не очевидно, на какой клавиатуре я нахожусь. Было бы лучше избегать повторного использования обеих клавиатур, поэтому я хотел бы написать быстрый инструмент для получения этой информации setxkbmap
. Я ожидаю, что типичный вариант использования, как следующий:
$ setxkbmap -device "$(get-keyboard-id)" -layout gb
Press Enter to detect keyboard ID
Какой интерфейс предоставляет эту информацию в Linux? В идеале он должен работать без X, но это не является обязательным требованием (кажется, не существует многих инструментов, которые поддерживают это без X).
Выводы на данный момент:
- Linux должен знать, на какой клавиатуре я пишу, чтобы поддерживать разные раскладки для нескольких клавиатур одновременно.
xinput
→ list.c →list_xi2
→XIQueryDevice
предоставляет идентификаторы устройств, используемыеsetxkbmap
.showkey
иxev
не печатать идентификаторы клавиатуры.xinput list-props $ID
показывает, куда отправляются события клавиатуры . Однако, используя код из другого ответа, кажется, что это устройство не печатает ничего, чтобы идентифицировать клавиатуру.Одно из почти возможных решений - запустить
xinput --test <ID> &
для каждого идентификатора клавиатуры и посмотреть, какая из них возвращает что-то первым. Проблема в том, чтобы выяснить, какие «клавиатуры» на самом деле являются клавиатурами:$ xinput | grep keyboard ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Power Button id=6 [slave keyboard (3)] ↳ Video Bus id=7 [slave keyboard (3)] ↳ Power Button id=8 [slave keyboard (3)] ↳ Sleep Button id=9 [slave keyboard (3)] ↳ WebCam SC-13HDL10931N id=10 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
less -f /dev/input/eventX
нажмете клавишу на соответствующей клавиатуре, вы должны увидеть «мусор», поэтому ваши нажатия клавиш действительно направлены в один файл разработчика, а не в другие.