前置部落格: dotnet 學習 CPF 框架筆記 瞭解 X11 裡如何獲取觸控資訊
X11 觸控測試程式
測試程式開原始碼路徑: https://github.com/dotnet-campus/ManipulationDemo/tree/master/ManipulationDemoCpfX11
此測試程式基於 CPF 的原始碼進行編寫
XI_Leave 行為
以下是我測試到的 XI_Leave 的行為邏輯
當存在別的視窗在當前的視窗之上時,觸控先進入當前的視窗,讓當前的程序收到了 X11 的 Down 事件。接著在不斷移動,不斷收到 Move 事件。當移動到別的視窗之上時,將可以收到 XiEventType.XI_Leave 型別的事件。接著在別的視窗移動過程中,繼續收到 Move 事件。抬手時,可以收到 End 事件
本文程式碼放在 github 和 gitee 上,可以使用如下命令列拉取程式碼
先建立一個空資料夾,接著使用命令列 cd 命令進入此空資料夾,在命令列裡面輸入以下程式碼,即可獲取到本文的程式碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 43711cd55b54616e0d75a70d61dec5591151ad2b
以上使用的是 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令列繼續輸入以下程式碼,將 gitee 源換成 github 源進行拉取程式碼
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 43711cd55b54616e0d75a70d61dec5591151ad2b
獲取程式碼之後,進入 BujeeberehemnaNurgacolarje 資料夾,即可獲取到原始碼
觸控寬度高度
在我的一臺裝置裡面,使用的是統信 UOS 系統,復現出丟失觸控寬度高度資訊
執行名為 CaijawhejiJoballbarwi 的測試程式,可以看到如下控制檯輸出。此 CaijawhejiJoballbarwi 測試程式程式碼可在後文獲取到
WH=1920,1080
ABS_MT_TOUCH_MAJOR=282 Name=Abs MT Touch Major ABS_MT_TOUCH_MINOR=283 Name=Abs MT Touch Minor Abs_MT_Pressure=287 Name=Abs MT Pressure
XIDeviceInfo [0] 2 XIMasterPointer
XIDeviceInfo [1] 3 XIMasterKeyboard
XiValuatorClassInfo Label=140(Rel X) Value=427; Max=-1.00; Min=-1.00; Resolution=1)
XiValuatorClassInfo Label=141(Rel Y) Value=736; Max=-1.00; Min=-1.00; Resolution=1)
XiValuatorClassInfo Label=293(Rel Vert Wheel) Value=853; Max=-1.00; Min=-1.00; Resolution=1)
Can't find TouchMajorAtom 丟失觸控寬度高度
從以上的輸出日誌可以看到,只是拿到了 XiValuatorClassInfo 為 Rel X
和 Rel Y
等資訊,而沒有觸控寬度高度需要的 Abs MT Touch Major
和 Abs MT Touch Minor
資訊
此時嘗試觸控一下螢幕,從 CaijawhejiJoballbarwi 程式裡面的 XNextEvent 收到的 GenericEvent 裡,取出的 XIDeviceEvent 事件引數裡面的 valuators 集合裡面,也是隻有 Rel X
和 Rel Y
等資訊,沒有 Abs MT Touch Major
和 Abs MT Touch Minor
資訊
此時執行 xinput list 可見如下輸出資訊
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
在觸控沒有寬度高度資訊時,使用 xinput list 2
所見也是沒有 Abs MT Touch Major
和 Abs MT Touch Minor
資訊,只有 Rel X
和 Rel Y
等資訊
$ xinput list 2
Virtual core pointer id=2 [master pointer (3)]
Reporting 6 classes:
Class originated from: 18. Type: XIButtonClass
Buttons supported: 13
Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"
Button state:
Class originated from: 18. Type: XIValuatorClass
Detail for Valuator 0:
Label: Rel X
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 18. Type: XIValuatorClass
Detail for Valuator 1:
Label: Rel Y
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 18. Type: XIValuatorClass
Detail for Valuator 2:
Label: Rel Vert Wheel
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 18. Type: XIScrollClass
Scroll info for Valuator 2
type: 1 (vertical)
increment: -1.000000
flags: 0x2 ( preferred )
Class originated from: 10. Type: XITouchClass
Touch mode: direct
Max number of touches: 50
如此可以證明這是從 X11 底層就沒有拿到觸控的寬度高度資訊,和任何上層 UI 框架都沒有關係,和應用程式本身沒有關係
如果此時觸控一下觸控式螢幕,則再次執行 CaijawhejiJoballbarwi 測試程式,可以獲取到觸控寬度高度資訊
WH=1920,1080
ABS_MT_TOUCH_MAJOR=282 Name=Abs MT Touch Major ABS_MT_TOUCH_MINOR=283 Name=Abs MT Touch Minor Abs_MT_Pressure=287 Name=Abs MT Pressure
XIDeviceInfo [0] DeviceId=2 Name=559AACBA03D0(Virtual core pointer) Use=XIMasterPointer Attachment=3
XIDeviceInfo [1] DeviceId=3 Name=559AACBA03F0(Virtual core keyboard) Use=XIMasterKeyboard Attachment=2
XiValuatorClassInfo Label=285(Abs MT Position X) Value=7157; Max=32767.00; Min=0.00; Resolution=38000)
XiValuatorClassInfo Label=286(Abs MT Position Y) Value=19969; Max=32767.00; Min=0.00; Resolution=66000)
PressureAtom Value=1075; Max=4095.00; Min=0.00; Resolution=0
TouchMajorAtom Value=87; Max=18950.00; Min=0.00; Resolution=10000
TouchMinorAtom Value=40; Max=10660.00; Min=0.00; Resolution=10000
XiValuatorClassInfo Label=284(Abs MT Orientation) Value=-32; Max=15707.00; Min=-15707.00; Resolution=0)
再次執行 xinput list 2
命令,也是可以看到觸控寬度高度資訊
$ xinput list 2
Virtual core pointer id=2 [master pointer (3)]
Reporting 8 classes:
Class originated from: 10. Type: XIButtonClass
Buttons supported: 13
Button labels: "Button Unknown" "Button Unknown" "Button Unknown" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"
Button state:
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 0:
Label: Abs MT Position X
Range: 0.000000 - 32767.000000
Resolution: 38000 units/m
Mode: absolute
Current value: 741.000000
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 1:
Label: Abs MT Position Y
Range: 0.000000 - 32767.000000
Resolution: 66000 units/m
Mode: absolute
Current value: 31492.000000
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 2:
Label: Abs MT Pressure
Range: 0.000000 - 4095.000000
Resolution: 0 units/m
Mode: absolute
Current value: 139.000000
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 3:
Label: Abs MT Touch Major
Range: 0.000000 - 18950.000000
Resolution: 10000 units/m
Mode: absolute
Current value: 37.000000
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 4:
Label: Abs MT Touch Minor
Range: 0.000000 - 10660.000000
Resolution: 10000 units/m
Mode: absolute
Current value: 11.000000
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 5:
Label: Abs MT Orientation
Range: -15707.000000 - 15707.000000
Resolution: 0 units/m
Mode: absolute
Current value: -32.000000
Class originated from: 10. Type: XITouchClass
Touch mode: direct
Max number of touches: 50
此問題復現步驟:
- 掛機,不要碰螢幕,等待一段時間,也許是半個小時以上
- 使用 SSH 遠端、或鍵盤在終端,啟動 CaijawhejiJoballbarwi 測試程式或空 Avalonia 程式。即一定不要用觸控雙擊開啟
- 此時可見 CaijawhejiJoballbarwi 測試程式和 xinput 都報告沒有觸控寬度高度資訊
如果此時觸控了一下觸控式螢幕,則再次啟動 CaijawhejiJoballbarwi 測試程式或使用 xinput 都能拿到觸控寬度高度資訊
預計是一段時間沒有碰觸控式螢幕,導致觸控進入某個狀態
本文以上程式碼放在 github 和 gitee 上,可以使用如下命令列拉取程式碼。我整個程式碼倉庫比較龐大,使用以下命令列可以進行部分拉取,拉取速度比較快
先建立一個空資料夾,接著使用命令列 cd 命令進入此空資料夾,在命令列裡面輸入以下程式碼,即可獲取到本文的程式碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin c64e19bfab4a85720d9a0692f1de3c960d6d8ce1
以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令列繼續輸入以下程式碼,將 gitee 源換成 github 源進行拉取程式碼。如果依然拉取不到程式碼,可以發郵件向我要程式碼
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin c64e19bfab4a85720d9a0692f1de3c960d6d8ce1
獲取程式碼之後,進入 X11/CaijawhejiJoballbarwi 資料夾,即可獲取到原始碼