주의 깊은.

주의 깊은.

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.pipevolmand

반면에…

만약 당신이 아직도하다뭔가 전화하고 싶어devd 곧장, 그리고 먼저 이를 달성하기 위한 거의 기존 메커니즘이 있다는 점에 유의하세요. 동사 및 장치 파일 이름을 사용하여 실행 중인 규칙이 /etc/devd.conf이미 있습니다 . 가상 터미널용으로 구성된 FreeBSD 커널 내부 터미널 에뮬레이터의 매핑과 항목을 호출하는 것을 제외하고는 원하는 대로 수행합니다 . 이것이 당신의 역학도 작동하는 방식입니다./etc/rc.d/sysconssetkeyboardsetkeyboardkbdcontrol

우선순위가 101인 규칙을 추가하기로 결정하고 규칙이 ukbd[0-9]+특정 /usr/local/etc/devd/mateusz.conf파일과 일치하는 경우 가상 터미널에서 USB 키보드 사용을 중단하지 않으려면 기존 규칙을 복사해야 한다는 점에 유의하세요. devd규칙은 우선순위가 더 높은 누적 규칙이 아닙니다.바꾸다우선순위가 낮습니다. /dev/ukbd*물론 USB 키보드 장치 파일입니다.

예: 쉘 와일드카드가 아닌 정규식을 match사용하며 운영 체제와 함께 제공되지 않는 규칙 세트에 대한 올바른 위치입니다.cdev/usr/local/etc/devd/devd

손을 잡고...

알아채다이렇게 해도 문제가 해결되지 않을 수 있습니다. FreeBSD 포트 트리에 패치가 적용된 Xorg추가 기능 모듈이 있습니다 .config/devd반품devd키보드와 마우스 장치가 왔다 갔다 할 때 동적으로 사물을 연결하고 분리하려고 시도하는 출력 파이프입니다. 그것대개키보드 집중 장치에만 연결 /dev/kbdmux0하고 다른 키보드 장치는 무시합니다. 이를 언제 수행할지 결정하는 것은 다소 복잡합니다. 아쉽게도 최종 사용자를 위해 이 중 어느 것도 문서화되어 있지 않습니다. 존재하지도 않습니다.

따라서 일을 처리하는 더 나은 방법은 devd전혀 규칙이 아닙니다 Xorg.

config/devd의 모듈은 키보드를 등록 Xorg하므로 InputDevice키보드 devd:kbdmux클래스 장치 Xorg.conf용으로만 설정 하면 됩니다 Option. 이 책의 5장에도 비슷한 예가 있습니다."XkbOptions""ctrl:nocaps"FreeBSD 매뉴얼.

추가 읽기

  • devd.conf. 2019년 5월 31일. 파일 형식 매뉴얼. 무료 BSD.

답변2

이를 위해 devd(FreeBSD) 또는 udev(Linux)를 사용하면 안 됩니다.

모든 X11 클라이언트를 사용할 수 있습니다.X 입력/XEnter 2X11 입력 장치(예: 마우스 또는 키보드)가 추가되거나 제거될 때 모니터링하기 위한 확장입니다.

devd/udev에서 루트로 실행할 필요가 없고, X11 인증을 엉망으로 만들고 레이어 위반을 커밋하고, devd/udev의 제한 사항을 처리하고, 단일 사용자 시스템이라고 가정할 필요가 없습니다.

그러나 이러한 프로그램을 구현하는 것은 거의 모든 흥미로운 일과 마찬가지로 쉽지 않습니다.쉘에서 수행하는 것은 혼란 스럽습니다..

라는 프로젝트가 있습니다.입력 플러그이를 통해 다양한 XInput 이벤트가 발생할 때 쉘 스크립트를 실행할 수 있습니다. 그런데 방금 해봤는데나는 그것을 직접 사용하지 않는다, 그래서 나는 그것을 보장할 수 없습니다.

그러나 약간의 도움을 받아 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]

관련 정보