防止插入 USB 鍵盤時重設鍵盤佈局

防止插入 USB 鍵盤時重設鍵盤佈局

每當我插入 USB 鍵盤時,所有鍵盤的佈局都會重設為某些系統預設值(美國佈局,沒有我想要的修飾符和其他按鍵)。我在許多 Debian 和 Ubuntu 系統上都觀察到了這一點,包括 Ubuntu 16.04 和 18.04。這種行為已經存在很長時間了

我在沒有桌面環境的情況下使用 X11(儘管一些 Gnome 惡魔往往會開始使用)。… | xkbcomp - "$DISPLAY"當我登入時,我使用 XKB (特別是)設定鍵盤佈局。

當我插入 USB 鍵盤時,我希望它具有我的佈局,而不是系統佈局。事實上,我希望系統繼續對已經存在的鍵盤(如果有)和新插入的鍵盤使用我目前的佈局。如果這是不可能的,我會決定重新套用一個佈局選擇了。

同樣,兩個鍵盤上的重複率設定為登入時預設值,而不是我使用 設定的速率xset r

如何防止鍵盤熱插拔重置鍵盤佈局和重複率?或者如果失敗了,我怎麼能至少將其重置為我選擇的佈局?

有一個相當笨拙的方法是使用 udev 規則。它很笨拙,因為它假設只有一個 X 伺服器,最有問題的是,它假設用戶具有 root 權限。我沒有root權限,因此任何涉及設定 udev 規則或編輯的方法Xorg.conf在這裡都不適用。

答案1

xkbcomp - "$DISPLAY"當我登入時,我使用 XKB 設定鍵盤佈局(特別是… | )。

如何防止鍵盤熱插拔重置鍵盤佈局和重複率?

並不是說它重置了它。如果您已插入鍵盤,並且要新增第二個鍵盤,則舊鍵盤將繼續使用相同的設定。

問題在於,載入 xkb 配置的客戶端方式(使用xkbcomp)或伺服器端(使用setxkbmap)只會將佈局應用於現有的實際設備,而不是「核心鍵盤」抽象。當設備被拔掉時,其設定就會遺失。

解決方案是在添加鍵盤時監控您自己,並使用您的首選設定調用xkbcomp/setxkbmap和。xset r rate

為此,你做不是需要任何 udev 規則或任何 root 權限;任何X11 用戶端程式可以透過 X11 輸入擴展監視輸入裝置的變更並對其進行操作。

可以從 shell 中使用該程序,並且可以在apt-getDebian 和類似發行版上輕鬆安裝inputplug

例子:

$ cat ./on-new-kbd
#! /bin/sh
keymap=/path/to/your/keymap

echo >&2 "$@"
event=$1 id=$2 type=$3

case "$event $type" in
'XIDeviceEnabled XISlaveKeyboard')
        xset r rate 200 50
        xkbcomp -i "$id" "$keymap" "$DISPLAY"
esac

$ chmod 755 ./on-new-kbd

$ inputplug -d -c ./on-new-kbd

<plug keyboard>

XIDeviceEnabled 13 XISlavePointer GASIA USB KB V11
XISlaveAdded 13 XIFloatingSlave GASIA USB KB V11
XISlaveAdded 14 XIFloatingSlave GASIA USB KB V11
XIDeviceEnabled 14 XISlaveKeyboard GASIA USB KB V11

請注意-i選項xkbcomp—您可以為每個鍵盤使用不同的設定。該協議還允許在每個設備的基礎上設置重複率,但我不知道如何使用xset.

當然,您的視窗管理器/桌面環境本身可能會偵聽這些事件並覆寫您的設定。

答案2

我剛剛使用 USB 開關在兩個系統之間共用鍵盤時遇到了相同的問題。當我切換回 Pop!_OS 20.04 LTS 系統(Debian/Ubuntu 衍生系統)時,設定消失了。我一直使用gnome-tweak設定Caps Lock來表現得像一個Ctrl.

這就是對我來說一直起作用的設定。我找到了這種命令列方式將其設定為我想要的,這樣我就不必繼續運行gnome-tweak來解決問題。

dconf write  /org/gnome/desktop/input-sources/xkb-options "['caps:ctrl_modifier']"

的手冊頁xkeyboard-config有一個允許值的清單xkb-options以及簡要說明。

我不知道如何防止該問題發生,但現在我可以從命令列修復它,這不再那麼煩人。

相關內容