插入或拔出时更改键盘布局

插入或拔出时更改键盘布局

我在笔记本电脑上使用外部键盘,并使用一个脚本来根据键盘是否插入来更改键盘布局。这工作正常,但我发现不需要手动运行脚本:它应该在任何时候自行运行外部键盘已插入或拔出。我尝试使用 udev 规则进行设置,但由于某种原因它不起作用。我的 udev 规则是:

KERNEL=="3-1.1", SUBSYSTEM=="usb", RUN+="/root/bin/udev.sh"

我已经确认,每当我插入或拔出键盘时,该脚本都会运行一次。脚本的内容是:

#!/usr/bin/bash
su - toothrot -c "/usr/local/bin/loadkb.sh" &

其内容/usr/local/bin/loadkb.sh为:

#!/bin/bash

export DISPLAY=:0 
export XAUTHORITY=/home/toothrot/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

killall xcape

if lsusb | grep HHKB
then {
    setxkbmap us,gr \
        -variant carpalx-plus-intl,daedalus \
        -option grp:win_space_toggle \
        -option lv3:rwin_switch \
        -option altwin:meta_alt \
        -option shift:breaks_caps \
        -option lv5:lsgt_switch_lock
    xmodmap ~/.xmodmap/hh 
    xcape -e 'Shift_L=F13;Shift_R=F14;Super_L=Prior;Hyper_L=Prior'
}
else {
    setxkbmap us,gr \
        -variant carpalx-plus-intl,daedalus \
        -option grp:win_space_toggle \
        -option lv3:ralt_switch \
        -option altwin:meta_alt \
        -option shift:breaks_caps -option lv5:lsgt_switch_lock
    xmodmap ~/.xmodmap/apple
    xcape -e 'Control_L=Escape;Shift_L=F14;Shift_R=F13;Alt_L=Escape;Alt_R=Escape'
}
fi

我已经确认/root/bin/udev.sh以root身份运行我的toothrot X会话。仅当由 udev 规则运行时,该脚本才不起作用。我缺少什么?

或者有没有一种方法可以在不使用 udev 规则的情况下实现我想要的结果,也许是从 X 内部?

答案1

灵感来自这篇博客文章我必须xmodmap遵守以下规则/etc/udev/rules.d/70-usb-keyboards.rules

ACTION=="add", ATTRS{idVendor}=="0000", ATTRS{idProduct}=="0000", RUN+="/bin/sh -c 'DISPLAY=:0.0 XAUTHORITY=/home/toothrot/.Xauthority sh -c \"setxkbmap us,gr;xmodmap /home/toothrot/.xmodmap/hh\" &'"

将供应商和产品 id 替换为您设备的值,lsusb并根据您的喜好调整脚本,然后不要忘记使用以下命令重新加载 udev 规则:

udevadm control --reload

我总是将检测留给 udev,所以这是添加键盘时的规则。要对删除进行操作,请添加另一个规则行:

ACTION=="remove"

相关内容