防止插入 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以及简要说明。

我不知道如何防止该问题发生,但现在我可以从命令行修复它,这不再那么烦人。

相关内容