키 입력을 프록시하는 방법

키 입력을 프록시하는 방법

키보드와 애플리케이션 사이에 위치하여 모든 키 누름을 캡처하고 자체 키 누름 신호를 내보내는 구성 요소를 빌드하는 방법입니다. 방출된 신호가 캡처된 신호와 반드시 일치할 필요는 없습니다. 궁극적으로 저는 ibus와 유사한 입력 방법을 만들려고 합니다(ibus가 기술적으로 어떻게 작동하는지에 대한 정보도 얻고 싶습니다).

읽고 나서이 문제, 캡쳐하기에 적절한 위치는 키코드나 키심볼을 생성한 후라고 생각합니다. 나는 또한 X가 클라이언트가 내가 원하는 것과 관련된 모든 키보드 이벤트를 얻을 수 있도록 허용한다는 것을 이해합니다.

답변1

기본적으로 두 가지 방법이 있습니다.

1) 커널 수준에서 키 누르기를 생성한 /dev/input 장치를 찾아 열고 "grab" -ioctl( evtest --grab작업과 동일)을 실행합니다. 이렇게 하면 해당 입력 장치가 주요 이벤트를 애플리케이션에만 전송하게 됩니다. 그런 다음 /dev/uinput주요 이벤트를 보낼 수 있는 애플리케이션에서 고유한 입력 장치를 만드는 데 사용됩니다 . X는 자동으로 장치에 연결됩니다.

2) X 레벨에서는 창 관리자처럼 주요 이벤트를 가로채서 자신만의 이벤트를 보냅니다 XSendEvent. 잡는 것이 최선의 접근 방식인지는 확실하지 않습니다. 잡는 것은 일부 응용 프로그램이 특정 상호 작용 중에 일시적으로 모든 이벤트를 가로채기를 원하는 상황에 대한 것입니다.

나는 ibus가 무엇을 하는지 모르고(세 번째 방법일 수도 있음) 아직 자세히 살펴보지 않았습니다.

편집하다

너무 길어서 모든 X 세부 정보를 읽을 수 없으므로 이 항목을 찾아보아야 합니다.

두 가지 기본 잡기 기능이 있습니다. XGrabKeyboard, FocusIn 및 FocusOut 이벤트를 생성하고 키보드에 대한 전체 제어(활성 잡기)를 제공합니다. 위에서 X 크롤링을 이야기할 때 언급한 기능이며, 이 기능은 일시적으로만 활성화되어야 합니다.

또한 XGrabKey특정 키코드의 수동적 가져오기를 등록합니다. 윈도우 관리자의 소스코드를 잠깐 살펴보면 fvwm, 윈도우 관리자가 사용하는 방식인 것 같습니다.

ibus이에 대한 세부 사항은 복잡하므로 창 관리자를 프로그래밍하는 방법(또는 소스 코드 또는 소스 코드를 읽는 방법)에 대한 문서를 자세히 살펴보고 싶을 수도 있습니다 .

관련 정보