I frequently work on pairing stations where there are multiple keyboards installed. I can use setxkbmap
with -device <ID>
to set the layout for a specific keyboard (using an ID from xinput
), but often it's not obvious which keyboard I'm at. It would be better to avoid the back-and-forth of trying both keyboards, so I'd like to write a quick tool to get this information for setxkbmap
. I'd expect a typical use case like the following:
$ setxkbmap -device "$(get-keyboard-id)" -layout gb
Press Enter to detect keyboard ID
Which interface provides this information on Linux? Ideally it should work without X, but that's not a requirement (there doesn't seem to be many tools which support this without X).
Findings so far:
- Linux must know which keyboard I'm typing on to support different layouts for multiple keyboards simultaneously.
xinput
→ list.c →list_xi2
→XIQueryDevice
provides device IDs usable bysetxkbmap
.showkey
andxev
don't print keyboard IDs.xinput list-props $ID
shows where keyboard events are sent. However, using code from another answer it seems this device doesn't print anything to identify the keyboard.One almost possible solution is to run
xinput --test <ID> &
for each keyboard ID and see which one returns something first. The problem with that is figuring out which "keyboards" are actually keyboards:$ 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
and hit a key on the corresponding keyboard, you should see "garbage" showing up, so your keypresses are indeed directed into one dev file and not the others.