X11

如何代理按鍵

  • October 28, 2017

如何建構一個位於鍵盤和應用程序之間的組件,該組件擷取所有按鍵並發出它自己的按鍵信號。發射的信號不一定與擷取的信號是一對一的。最終,我正在嘗試創建一個類似於 ibus 的輸入法(我也希望了解有關 ibus 在技術上如何工作的資訊)。

在閱讀了這個問題之後,我認為適當的擷取位置是在生成鍵碼或鍵符號之後。我也了解 X 允許客戶端獲取所有聽起來與我正在嘗試做的事情相關的鍵盤事件。

基本上有兩種方式:

  1. 在核心級別,找到產生按鍵的 /dev/input 設備,打開它並執行“grab”-ioctl(與之前相同evtest --grab)。這將導致此輸入設備將按鍵事件專門發送到您的應用程序。然後使用/dev/uinput從您的應用程序創建您自己的輸入設備,您可以在其中發送關鍵事件。X 應該會自動連接到該設備。

2)在X級別,像視窗管理器一樣攔截按鍵事件,並發送您自己的事件XSendEvent。我不確定抓取是否是最好的方法。抓取適用於某些應用程序在特定互動期間臨時想要攔截所有事件的情況。

我不知道 ibus 做了什麼(甚至可能是第三種方法),我還沒有詳細研究過。

編輯

不得不查一下,因為我讀到所有 X 細節的時間太長了。

有兩個基本的抓取函式:XGrabKeyboard,它生成 FocusIn 和 FocusOut 事件,並完全控制鍵盤(主動抓取)。這就是我在上面談到 X 抓取時的意思,而且這個功能應該只是暫時處於活動狀態。

還有XGrabKey, 它為特定鍵碼註冊被動抓取。很快查看視窗管理器的原始碼fvwm,這似乎是視窗管理器使用的。

這方面的細節非常複雜,您可能想要探勘一些關於如何編寫視窗管理器的文件(或閱讀原始碼,甚至可能是ibus原始碼)。

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