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→XIQueryDeviceprovides device IDs usable bysetxkbmap.showkeyandxevdon't print keyboard IDs.xinput list-props $IDshows 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/eventXand 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. – L. Levrel May 10 '16 at 20:38fflush(stdout);after theprintfto see output as soon as keys are pressed. But since you only want to test for a keypress, you don't output anything and don't need to flush! – L. Levrel May 10 '16 at 20:57