插入 USB 键盘时防止键盘布局重置

Gil*_*il' 11 keyboard x11 hot-plug not-root-user keyboard-layout

每当我插入 USB 键盘时,所有键盘的布局都会重置为某些系统默认值(美国布局,没有我想要的修饰符和其他键)。我已经在许多 Debian 和 Ubuntu 系统上观察到了这一点,包括 Ubuntu 16.04 和 18.04。这种行为已经存在很长时间了

我在没有桌面环境的情况下使用 X11(尽管一些 Gnome 恶魔往往会开始使用)。我… | xkbcomp - "$DISPLAY"在登录时使用 XKB(特别是)设置了我的键盘布局。

当我插入 USB 键盘时,我希望它具有我的布局,而不是系统布局。事实上,我希望系统能够继续使用我当前的布局来处理已经存在的键盘(如果有的话)和新插入的键盘。如果这是不可能的,我会满足于重新应用选择的布局。

同样,两个键盘上的重复率都设置为登录时的默认值,而不是我用xset r.

如何防止键盘热插拔重置键盘布局和重复率?或者失败了,我怎样才能至少让它重置为我选择的布局?

有一种相当笨拙的方式,即udev 规则。它很笨拙,因为它假定只有一个 X 服务器,而且最有问题的是,它假定用户具有 root 权限。我没有 root 权限,所以任何涉及设置 udev 规则或编辑的Xorg.conf方法在这里都不适用。

mos*_*svy 7

xkbcomp - "$DISPLAY"在登录时使用 XKB(特别是 ... | )设置了我的键盘布局。

如何防止键盘热插拔重置键盘布局和重复率?

并不是它重置了它。如果您已经插入了一个键盘,并且正在添加第二个,则旧键盘将继续使用相同的设置。

问题在于,无论是客户端加载 xkb 配置的方式(使用xkbcomp)还是服务器端(使用setxkbmap)只会将布局应用于现有的实际设备,而不是“核心键盘”抽象。拔下设备时,其设置将丢失。

解决方案是在添加键盘时监控自己,并使用您的首选设置调用xkbcomp/setxkbmapxset 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
Run Code Online (Sandbox Code Playgroud)

请注意-i选项xkbcomp-- 您可以为每个键盘使用不同的设置。该协议还允许在每个设备的基础上设置重复率,但我不知道如何使用xset.

当然,您的窗口管理器/桌面环境本身可能会侦听这些事件并覆盖您的设置。

  • 比 udev 更喜欢这个解决方案,反应有点慢,但这已经足够了。我将命令添加到我的 `~/.xinitrc` 中,其中包含 inputplug 的完整路径和带有 `-d` 标志的脚本。 (2认同)