Xorg

如何在 FreeBSD 上配置 devd 以在連接 USB 鍵盤時執行程序?

  • October 10, 2020

每當我將 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使用不快速終止的程序很容易卡住執行。為避免這種情況,您可能應該執行一個監視器程序,該程序以類似的方式連接到’ devds 的輸出,例如。/var/run/devd.seqpacket.pipe``volmand

另一方面 …

如果您仍然devd 直接呼叫事物,那麼首先請注意,幾乎有一個現有的機制可以做到這一點。請注意,/etc/devd.conf已經有一個規則/etc/rc.d/sysconssetkeyboard動詞和設備文件名一起執行。 setkeyboard做你想做的事情,除了它呼叫kbdcontrol為用於虛擬終端的 FreeBSD 核心的內部終端仿真器配置映射和東西。這也是你的機制應該如何工作的方式。

例如,如果您決定ukbd[0-9]+/usr/local/etc/devd/mateusz.conf文件中添加匹配的優先級 101 規則,請注意,如果您不想破壞虛擬終端上的 USB 鍵盤使用,則必須複製現有規則的功能。 devd規則不是累積的;較高優先級的替換較低優先級的。 /dev/ukbd*當然是你的 USB 鍵盤設備文件。

是的: a matchofcdev使用正則表達式,而不是 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。

引用自:https://unix.stackexchange.com/questions/613735