每当我将 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 match
ofcdev
使用正则表达式,而不是 shell 通配符;并且是操作系统不附带的规则集/usr/local/etc/devd/
的正确位置。devd
紧握的手上……
注意这可能无法解决您的问题。
Xorg
FreeBSD ports 树中有一个附加config/devd
模块已修补。还监听 的devd
输出管道,并尝试在键盘和鼠标设备来来去去时动态附加和分离事物。它通常仅连接到键盘集中器设备 ,/dev/kbdmux0
并忽略其他键盘设备。何时这样做的决定有些复杂。唉,这些都没有为最终用户记录。甚至没有它的存在。
因此,处理事情的更好方法devd
根本不是规则,而是Xorg
规则。
config/devd
中的模块注册Xorg
了InputDevice
键盘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]