Я часто работаю на сопряженных станциях, где установлено несколько клавиатур. Я могу использовать 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
нажмете клавишу на соответствующей клавиатуре, вы должны увидеть «мусор», поэтому ваши нажатия клавиш действительно направлены в один файл разработчика, а не в другие.Ответы:
Отключить устройство
Вот одна идея, чтобы определить, какая клавиатура какая. Вы можете использовать команду xinput для включения и отключения устройств.
пример
Приведенный выше вывод показывает различные устройства, которые у меня есть на моем ноутбуке Thinkpad. У меня есть только 1 клавиатура, вот эта:
Теперь взгляните на свойства, доступные через это устройство:
Из приведенного выше видно, что он включен, поэтому давайте отключим его:
Чтобы включить это:
Идея?
Вы можете включить отключение одной из клавиатур, используя эту команду, чтобы определить, на какой вы находитесь.
Ссылки
источник
Вопрос звучит несколько противоречиво, поскольку вы цитируете инструменты X, но спрашиваете решение, которое «в идеале должно работать без X».
О вашей 4- й находке:
xinput
даст вам корреспонденциюпо крайней мере, со следующей версией
Первый шаг: обнаружение устройства событий клавиатуры в C
Большое спасибо этой странице . Я убрал большинство проверок безопасности из кода, который я заимствовал там, для ясности, в реальном коде, который вам, вероятно, нужен.
Обратите внимание, что нажатия клавиш отражаются, поэтому вы действительно можете попросить пользователя нажать клавишу-модификатор (Shift, Control ...), а не любую клавишу.
Второй шаг: используйте xinput, чтобы получить X ID из имени устройства
Скомпилируйте вышеуказанный исходный код C и используйте этот способ:
xinput list --id-only "keyboard:$(sudo ./a.out /dev/input/event*)"
источник
/dev/input/by-id
/dev/input/event*
- я пробовал,tail
но безрезультатно.Больше копания выявило другое решение, использующее обычный Bash и обычную учетную запись пользователя. Сценарий :
источник