![防止插入 USB 键盘时重置键盘布局](https://linux22.com/image/155009/%E9%98%B2%E6%AD%A2%E6%8F%92%E5%85%A5%20USB%20%E9%94%AE%E7%9B%98%E6%97%B6%E9%87%8D%E7%BD%AE%E9%94%AE%E7%9B%98%E5%B8%83%E5%B1%80.png)
每当我插入 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-get
Debian 和类似发行版上轻松安装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
以及简要说明。
我不知道如何防止该问题发生,但现在我可以从命令行修复它,这不再那么烦人。