Xorg

如何判斷使用哪個鍵盤按鍵?

  • October 15, 2021

我經常在安裝了多個鍵盤的配對站上工作。我可以使用setxkbmapwith-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_xi2XIQueryDevice提供可供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

想法?

您可以使用此命令啟用禁用其中一個鍵盤,以確定您使用的是哪個鍵盤。

參考

引用自:https://unix.stackexchange.com/questions/89538