如何在 FreeBSD 上配置 devd 以在連接 USB 鍵盤時執行程序?
每當我將 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)。
所以…
我該怎麼做?
您不應該為此使用 devd(在 FreeBSD 上)或 udev(在 Linux 上)。
任何 X11 客戶端都可以使用XInput / XInput2擴展來監控何時添加或移除 X11 輸入設備(如滑鼠或鍵盤)。
無需從 devd/udev 以 root 身份執行、搞亂 X11 身份驗證和送出層違規、應對 devd/udev 的限制、假設它是單使用者電腦等。
實施這樣的程序是微不足道的;然而,就像幾乎所有有趣的事情一樣,從 shell 中做這件事是很麻煩的。
有一個名為inputplug的程序,它應該允許您在發生不同的 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]
小心。
devd
使用不快速終止的程序很容易卡住執行。為避免這種情況,您可能應該執行一個監視器程序,該程序以類似的方式連接到’devd
s 的輸出,例如。/var/run/devd.seqpacket.pipe``volmand
另一方面 …
如果您仍然想
devd
直接呼叫事物,那麼首先請注意,幾乎有一個現有的機制可以做到這一點。請注意,/etc/devd.conf
已經有一個規則/etc/rc.d/syscons
與setkeyboard
動詞和設備文件名一起執行。setkeyboard
做你想做的事情,除了它呼叫kbdcontrol
為用於虛擬終端的 FreeBSD 核心的內部終端仿真器配置映射和東西。這也是你的機制應該如何工作的方式。例如,如果您決定
ukbd[0-9]+
在/usr/local/etc/devd/mateusz.conf
文件中添加匹配的優先級 101 規則,請注意,如果您不想破壞虛擬終端上的 USB 鍵盤使用,則必須複製現有規則的功能。devd
規則不是累積的;較高優先級的替換較低優先級的。/dev/ukbd*
當然是你的 USB 鍵盤設備文件。是的: a
match
ofcdev
使用正則表達式,而不是 shell 萬用字元;並且是不附帶作業系統/usr/local/etc/devd/
的規則集的正確位置。devd
在緊握的手上……
請注意,這可能無法解決您的問題。
Xorg
在 FreeBSD 埠樹中有一個額外的config/devd
模組更新檔。它還監聽devd
的輸出管道,並嘗試在鍵盤和滑鼠設備來來去去時動態連接和分離事物。它通常只連接到鍵盤集中器設備/dev/kbdmux0
,而忽略其他鍵盤設備。它何時決定這樣做有些複雜。唉,這些都沒有為最終使用者記錄。甚至沒有它的存在。因此,處理事情的更好方法根本不是
devd
規則,而是規則Xorg
。中的
config/devd
模組為鍵盤Xorg
註冊了一個,因此您只需為鍵盤類設備設置一個for to 。在FreeBSD Handbook的第 5 章中有一個例子。InputDevice``devd:kbdmux``Xorg.conf``Option``"XkbOptions"``"ctrl:nocaps"
進一步閱讀
devd.conf
. 2019-05-31。 文件格式手冊。自由BSD。