簡體   English   中英

evdev 如何判斷是否移動 x11 光標?

[英]How does evdev determine whether or not to move the x11 cursor?

我開始深入研究 linux 上的 evdev api,目的是玩弄 uinput 仿真。 我注意到在操縱桿和觸摸板之間,有不同的按鈕/鍵事件代碼來區分操縱桿按鈕按下和鼠標點擊。 但是兩個設備都有 ABS_X 和 ABS_Y 軸的事件代碼。

joystick dump:
#   Event type 3 (EV_ABS)
#     Event code 0 (ABS_X)
#       Value      128
#       Min          0
#       Max        255
#       Fuzz         0
#       Flat        15
#       Resolution   0
#     Event code 1 (ABS_Y)
#       Value      103
#       Min          0
#       Max        255
#       Fuzz         0
#       Flat        15
#       Resolution   0

touchpad dump:
#   Event type 3 (EV_ABS)
#     Event code 0 (ABS_X)
#       Value     3909
#       Min       1270
#       Max       5670
#       Fuzz         0
#       Flat         0
#       Resolution  44
#     Event code 1 (ABS_Y)
#       Value     3835
#       Min       1240
#       Max       4746
#       Fuzz         0
#       Flat         0
#       Resolution  66

那么 x11 如何知道為了移動屏幕光標是將 '/dev/input/eventX' 節點視為操縱桿還是鼠標呢? 是否有一些 ioctl 可以用來設置設備是否被 x11 加載? 司機還需要做些什么來表明這一點?

我環顧了一些錯誤報告,發現在舊版本中存在連接時手柄確實會移動鼠標的情況,但我找不到任何補丁可以表明它們更改了什么以表明與 x11 的區別。

在有人說出來之前,我知道在實踐中使用 libevdev 比直接調用 uinput 更受歡迎,但這僅用於教育目的。 即使在那里,我也有同樣的問題。

所以我瀏覽了 uinput 模塊文檔和示例代碼。 我注意到在他們模擬鼠標的示例代碼中,他們通過 ioctl 調用為鼠標左鍵( BTN_LEFT )添加了一個事件

ioctl(fd, UI_SET_EVBIT, EV_KEY);
ioctl(fd, UI_SET_KEYBIT, BTN_LEFT);

我發現它們包含這種事件類型很奇怪,因為它們只是在示例代碼中移動(而不是單擊)鼠標,並且確實刪除這些 ioctl 會導致軸事件不會影響 x11 指針。

現在在他們的示例代碼中,他們使用相對軸事件( REL_XREL_Y )來進行鼠標移動,而不是我所指的絕對事件( ABS_XABS_Y )。 這是因為他們正在模擬實際的鼠標而不是觸摸板。 但這確實給了我一個提示,即 x11 會查找要在設備位中列出的某些事件類型,以確定它是哪種設備。

作為對這一理論的進一步證實,我在同一文檔的游戲手柄設備檢測部分找到了此注釋。 All gamepads that follow the protocol described here map BTN_GAMEPAD. This is an alias for BTN_SOUTH/BTN_A. It can be used to identify a gamepad as such. 雖然這並沒有明確說明鼠標或觸摸板,但它確實支持在輸入設備上設置的某些事件位用於確定 x11 如何處理來自這些設備的輸入的想法。 我確實發現,如果您還設置了BTN_LEFT位和REL_X REL_Y位,那么創建一個設置BTN_GAMEPAD位的游戲手柄設備仍然可以用作鼠標,因此 x11 所做的似乎只是在尋找要設置的幾個關鍵位把某物當作老鼠。

好的,回到觸摸板/操縱桿問題,我還沒有想出如何模擬觸摸板來准確測試需要為 x11 設置哪些位才能將設備識別為觸摸板,盡管我懷疑BTN_TOUCH事件正在播放其中的一個角色。 無論何種事件位組合導致 x11 將設備識別為觸摸板並移動指針,這種組合通常不會在游戲手柄上找到,這就是向 x11 表明游戲手柄不應移動光標的原因。它具有ABS_XABS_Y軸,就像觸摸板一樣。 如果我以后有時間,我會嘗試弄清楚究竟是什么組合並更新此解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM