Xorg
如何判斷使用哪個鍵盤按鍵?
我經常在安裝了多個鍵盤的配對站上工作。我可以使用
setxkbmap
with-device <ID>
來設置特定鍵盤的佈局(使用來自 的 IDxinput
),但通常我在哪個鍵盤上並不明顯。最好避免來回嘗試兩個鍵盤,所以我想編寫一個快速工具來獲取此資訊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
不要列印鍵盤 ID。xinput list-props $ID
顯示鍵盤事件的發送位置。但是,使用來自另一個答案的程式碼,該設備似乎沒有列印任何內容來辨識鍵盤。- 一種幾乎可能的解決方案是
xinput --test <ID> &
為每個鍵盤 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)]
更多探勘揭示了另一種使用普通 Bash 和普通使用者帳戶的解決方案。腳本:
#!/usr/bin/env bash set -o errexit -o nounset -o noclobber -o pipefail # Remove leftover files and processes on exit trap 'rm --recursive -- "$dir"; kill -- -$$' EXIT dir="$(mktemp --directory)" cd "$dir" # Log key presses to file xinput --list --id-only | while read id do # Only check devices linked to an event source if xinput --list-props "$id" | grep --quiet --extended-regexp '^\s+Device Node.*/dev/input/event' then xinput test "$id" > "$id" & fi done # Check for key presses while sleep 0.1 do for file in * do if [[ -s "$file" ]] then echo "$file" exit fi done done
禁用設備
這是辨識哪個鍵盤是哪個的一個想法。您可以使用命令xinput來啟用和禁用設備。
例子
$ xinput list ⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ SynPS/2 Synaptics TouchPad id=12 [slave pointer (2)] ⎜ ↳ TPPS/2 IBM TrackPoint id=13 [slave pointer (2)] ⎜ ↳ Logitech USB Receiver id=9 [slave pointer (2)] ⎜ ↳ Logitech USB Receiver id=10 [slave pointer (2)] ⎣ 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)] ↳ Sleep Button id=8 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)] ↳ ThinkPad Extra Buttons id=14 [slave keyboard (3)]
上面的輸出顯示了我的 Thinkpad 筆記型電腦上的各種設備。我只連接了 1 個鍵盤,這個:
↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
現在看一下通過此設備可用的屬性:
$ xinput list-props "AT Translated Set 2 keyboard" Device 'AT Translated Set 2 keyboard': Device Enabled (124): 1 Coordinate Transformation Matrix (126): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.
從上面你可以看到它是啟用的,所以讓我們禁用它:
$ xinput set-prop "AT Translated Set 2 keyboard" "Device Enabled" 0
要啟用它:
$ xinput set-prop "AT Translated Set 2 keyboard" "Device Enabled" 1
想法?
您可以使用此命令啟用禁用其中一個鍵盤,以確定您使用的是哪個鍵盤。
參考