小心。

小心。

每当我将 USB 键盘重新连接到我的 FreeBSD 桌面时,我的键盘设置都不会重新应用到我新连接的键盘(setxkbmap -option ctrl:nocaps特别是)。

每当我连接 USB 键盘时,我想运行setxkbmap -option ctrl:nocaps(或者可能更像)。su - username -c 'DISPLAY=:0 setxkbmap -option ctrl:nocaps'

我尝试过的

xorg.conf

我尝试使用 Xorg 配置文件来实现我想要的,我添加了以下内容/usr/local/etc/X11/xorg.conf.d/99-input.conf

Section "InputClass"
        Identifier              "Keyboard Defaults"
        MatchIsKeyboard         "yes"
        Option                  "XkbLayout" "pl"
        Option                  "XkbOption" "ctrl:nocaps"
EndSection

不幸的是,如果我在 Xorg 环境已经运行时拔下并重新插入 USB 键盘,键盘上的 Caps Lock 又会恢复为 Caps Lock(有趣的是,笔记本电脑键盘上的 Caps Lock 仍然映射到 Control)。

所以...

我该怎么做?

答案1

小心。

devd无法快速终止的程序很容易阻塞运行。为了避免这种情况,您可能应该运行一个监视器程序,该程序连接到 的devd输出,/var/run/devd.seqpacket.pipe例如volmand

另一方面 …

如果你还想要从中调用东西devd 直接地,然后首先注意几乎有一个现有的机制可以实现这一点。请注意,其中/etc/devd.conf已经有一条/etc/rc.d/syscons使用setkeyboard动词和设备文件名运行的规则。 setkeyboard做你想做的事情,除了它调用kbdcontrol配置用于虚拟终端的 FreeBSD 内核内部终端模拟器的映射和内容。您的机制也应该如此运作。

如果你决定添加一个优先级为 101 的规则,并且该规则ukbd[0-9]+与某个/usr/local/etc/devd/mateusz.conf文件相匹配,请注意,如果你不想破坏虚拟终端上的 USB 键盘使用,你必须复制现有规则。 devd规则不是累积的;优先级较高的规则代替优先级较低的。 /dev/ukbd*当然是你的USB键盘设备文件。

是的:a matchofcdev使用正则表达式,而不是 shell 通配符;并且是操作系统不附带的规则集/usr/local/etc/devd/的正确位置。devd

紧握的手上……

注意这可能无法解决您的问题XorgFreeBSD ports 树中有一个附加config/devd模块已修补。监听 的devd输出管道,并尝试在键盘和鼠标设备来来去去时动态附加和分离事物。它通常仅连接到键盘集中器设备 ,/dev/kbdmux0并忽略其他键盘设备。何时这样做的决定有些复杂。唉,这些都没有为最终用户记录。甚至没有它的存在。

因此,处理事情的更好方法devd根本不是规则,而是Xorg规则。

config/devd中的模块注册XorgInputDevice键盘devd:kbdmux,因此您只需为键盘类设备Xorg.conf设置一个forOption即可。本书第 5 章中有一个差不多的例子"XkbOptions""ctrl:nocaps"FreeBSD 手册

进一步阅读

  • devd.conf。 2019年5月31日。 文件格式手册。免费的BSD。

答案2

您不应该为此使用 devd(在 FreeBSD 上)或 udev(在 Linux 上)。

任何 X11 客户端都可以使用X输入/X输入2用于监视何时添加或删除 X11 输入设备(例如鼠标或键盘)的扩展。

无需从 devd/udev 以 root 身份运行、搞乱 X11 身份验证和提交层违规、应对 devd/udev 的限制、假设它是单用户计算机等。

实施这样一个程序是微不足道的;然而,正如几乎所有有趣的事情一样,从 shell 做起来很混乱

有一个项目叫输入插头这应该允许您在发生不同的 XInput 事件时运行 shell 脚本。不过我也只是尝试过而已我自己不要使用它,所以我不能保证这一点。

但它确实可以在 FreeBSD 上编译(需要一点帮助),并且似乎可以按预期工作。 YMMV。

(as root: pkg install libX11 libXI libxcb)

git clone --depth 1 https://github.com/andrewshadura/inputplug
cd inputplug
cc -Wall -include signal.h -I /usr/local/include -L /usr/local/lib -lXi -lxcb -lxcb-xinput inputplug.c -o inputplug

echo 'echo "$@"' > xishow; chmod 755 xishow
./inputplug -c ./xishow

...
XISlaveRemoved 18
XIDeviceDisabled 14 XISlaveKeyboard
XISlaveRemoved 14
XIDeviceDisabled 15 XISlaveKeyboard
XISlaveRemoved 15
XISlaveAdded 12 XIFloatingSlave Telink Wireless Receiver Mouse
XIDeviceEnabled 12 XISlavePointer Telink Wireless Receiver Mouse
XISlaveAdded 13 XIFloatingSlave Telink Wireless Receiver
XIDeviceEnabled 13 XISlaveKeyboard Telink Wireless Receiver
[etc]

相关内容