읽기 시스템 호출을 재정의하는 커널 모듈을 만들고 있습니다. 키보드의 키를 교체하고 싶습니다. 스캔코드를 파일 설명자 = 0으로 대체하여 터미널 입력에 대해 이 작업을 성공적으로 수행했습니다. 그러나 GUI 응용 프로그램은 우분투에서 X11을 사용하고 키보드를 읽는 데 stdin 입력을 사용하지 않습니다. 키 입력을 가로채고 바꾸는 방법앞으로X11 서버에 도달했나요? X11은 특정 파일 설명자를 사용합니까?
답변1
Linux 읽기 입력의 Xorg X11 서버evdev장치를 찾았습니다 /dev/input/event*
. 각 read() 호출은 적어도 하나를 반환합니다.구조물 입력 이벤트.
이벤트를 대체하기 위해 사용자 정의 커널 모듈이 필요하지 않습니다. 사용자 공간 도구를 사용하여 이벤트를 읽고, 필요에 따라 변경하고, 사용자 정의 evdev 장치를 생성할 수 있는 기존 "uinput" 모듈로 전달할 수 있습니다. FUSE 또는 CUSE와 같은)) Xorg에게 원시 장치를 무시하도록 지시합니다. 이것차단 도구키트가 이를 수행할 수 있습니다.
또한 오늘날 대부분의 시스템에서 Xorg는 다음을 사용합니다.라이브러리 입력키보드와 마우스의 이벤트를 전처리하기 위한 라이브러리입니다. (대부분의 Wayland 디스플레이 서버도 libinput을 독점적으로 사용합니다.) 이 라이브러리를 다음과 같이 패치할 수 있습니다.
마지막으로, 단일 키(또는 스캔코드)만 다시 매핑하려면 다음을 수행하세요.evdev하위 시스템에는 이미 이에 대한 지원이 내장되어 있습니다. Systemd-udev에는 udev 규칙에서 키 매핑에 대한 사용자 정의 스캔 코드를 정의할 수 있는 도우미가 이미 포함되어 있습니다.이 데이터베이스.
실제로 커널을 계속 패치하려면 read()만 사용하지 않고 evdev 계층에서 변환을 수행하는 것이 좋습니다. (결국, 파일 설명자 0이 항상 키보드인 것은 아닙니다. 다른 프로그램에서 전송되는 데이터를 엉망으로 만들고 싶지는 않습니다.)