記 X11 裡面觸控的一些行為

lindexi發表於2024-10-16

前置部落格: 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 事件

本文程式碼放在 githubgitee 上,可以使用如下命令列拉取程式碼

先建立一個空資料夾,接著使用命令列 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 XRel Y 等資訊,而沒有觸控寬度高度需要的 Abs MT Touch MajorAbs MT Touch Minor 資訊

此時嘗試觸控一下螢幕,從 CaijawhejiJoballbarwi 程式裡面的 XNextEvent 收到的 GenericEvent 裡,取出的 XIDeviceEvent 事件引數裡面的 valuators 集合裡面,也是隻有 Rel XRel Y 等資訊,沒有 Abs MT Touch MajorAbs 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 MajorAbs MT Touch Minor 資訊,只有 Rel XRel 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

此問題復現步驟:

  1. 掛機,不要碰螢幕,等待一段時間,也許是半個小時以上
  2. 使用 SSH 遠端、或鍵盤在終端,啟動 CaijawhejiJoballbarwi 測試程式或空 Avalonia 程式。即一定不要用觸控雙擊開啟
  3. 此時可見 CaijawhejiJoballbarwi 測試程式和 xinput 都報告沒有觸控寬度高度資訊

如果此時觸控了一下觸控式螢幕,則再次啟動 CaijawhejiJoballbarwi 測試程式或使用 xinput 都能拿到觸控寬度高度資訊

預計是一段時間沒有碰觸控式螢幕,導致觸控進入某個狀態

本文以上程式碼放在 githubgitee 上,可以使用如下命令列拉取程式碼。我整個程式碼倉庫比較龐大,使用以下命令列可以進行部分拉取,拉取速度比較快

先建立一個空資料夾,接著使用命令列 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 資料夾,即可獲取到原始碼

相關文章