LWN: 关于input子系统的近况综述
An update on the input stack
By?Jake EdgeOctober 9, 2019
XDC
Linux input stack(輸入子系統(tǒng))是系統(tǒng)基本交互功能的基礎(chǔ),這個領(lǐng)域其實一直很缺乏開發(fā)者。過去幾年的工作進展有不少。Red Hat的Peter Hutterer來到2019 X.Org Developers Conference介紹了近期這個領(lǐng)域完成的一些工作,包括仍在進行的功能和過去2年左右已經(jīng)完成的功能。總體來說,Linux的input子系統(tǒng)狀況看起來不錯,不過這一部分的維護者數(shù)量太少了。
High-resolution mouse scrolling
據(jù)他介紹,高精度的鼠標滾輪滾動支持大概會在接下來一兩個月里加入Linux,從而讓支持高精度滾輪功能的設(shè)備來提供鼠標滾輪的更高精度檢測。這是通過提供一個獨立的event stream來實現(xiàn)的。以前一般是15~20度的移動報告一次event,而現(xiàn)在同樣的范圍內(nèi)會報出2~4次event。5.0 kernel里新增了兩個event type類型(REL_WHEEL_HI_RES和REL_HWHEEL_HI_RES)來支持這些功能。不過舊有的event stream和新增的event stream可能無法完全對應得上,因此他提醒開發(fā)者不要同時混著使用這兩者。
同時,libinput也加了一個新的event type(LIBINPTU_EVENT_POINTER_AXIS_WHEEL)來支持高精度滾輪。跟kernel一樣,也是使用了獨立的event stream。這部分代碼只是在一個開發(fā)分支上驗證通過,尚未合入master分支。對Wayland(Xwin顯示服務(wù)器)來說也新加了一個event type,mailing list上有詳細描述。
libinput user devices
Hutterer進來一直在做為libinput在user space模擬input device的工作,目的是改善libinput的測試,這稱之為user device。他希望libinput不需要直接訪問真實的kernel device來獲取evdev event,而是能通過程序傳遞一個文件描述符給libinput,讓它從這里來讀取evdev event,這樣就不用再打開/dev/input/event0等設(shè)備了。這樣libinput能收到定制過的evdev event事件,就當做打開了普通的input設(shè)備一樣來進行測試。
libinput測試套件(test suite)執(zhí)行時耗時1小時左右,不過目前只能在他的laptop上運行。測試中的各種failure都是基于他的laptop所調(diào)試的各種timeout設(shè)置值。并且還需要root權(quán)限,依賴于udev和uinput,而且還會把當前的登錄會話(login session)搞亂。這個測試套件沒法在容器(container)里面運行,無法作為持續(xù)集成(CI)測試的一部分。而他新實現(xiàn)的這個user dvice的測試方法能夠更加容易的實現(xiàn)在container環(huán)境里進行測試,除此之外,還有其他一些應用場景。例如實現(xiàn)一個keyboard macro daemon(大家很熟悉的按鍵精靈工具)讓Wayland來簡便地接受一批evdev event,就跟正常的按鍵輸入一樣。目前他的代碼計劃放入libinput-testing.so,而不是放入libinput本身,今后如果要支持其他應用場景的話可能需要調(diào)整代碼合入的位置。
ratbag-emu
Hutterer也提到一個ratbag-emu,這是一個鼠標固件模擬器,由羅技(Logitech)的一位實習生Filipe Laíns所開發(fā)。每當需要配置一個游戲鼠標的時候,都會需要通過libratbag所提供的ratbag daemon(ratbagd守護程序)來利用raw HID設(shè)備節(jié)點(例如/dev/hidraw0)發(fā)送每個設(shè)備各不相同的一些命令。如果要測試這個功能的話,就需要把真正的游戲鼠標插入拔出很多次才能測試完整。
ratbag-emu則可以模擬真實鼠標,這樣測試套件可以在沒有真實硬件的情況下也利用ratbagd守護程序完成測試。ratbag-emu提供了一個REST接口,用來配置它模擬具體哪個設(shè)備以及檢查所進行過的配置。目標是能模擬任何鼠標,不過目前只支持羅技的鼠標,原因很簡單,作者有邏輯鼠標的完整文檔。
Tuhi
在Hutterer介紹過去一兩年完成的工作時,提到了Tuhi。Tuhi是一個管理Wacom Smartpad設(shè)備(例如Banboo Spark)的GTK程序。這種手寫板設(shè)備可以讓用戶跟正常使用紙筆一樣寫畫,同時設(shè)備會記錄好所有的筆畫,然后用藍牙等獲取畫出來的圖像。
Tuhi本身并不復雜,只是把圖像取下來,允許保存成SVG或者PNG格式的文件。這里的協(xié)議需要通過反向工程來得到,不過最終還是從Wacom公司拿到了一些文檔,實現(xiàn)的更加準確了。從設(shè)備里獲取圖像的時候只能獲取最早的一張圖像,所以如果想要取得新畫的一些圖的話,就得首先把此前畫的舊圖全部從設(shè)備里刪除掉。這樣Tuhi必須要非常小心,確保在取出多幅圖片的時候不要丟掉任何一張。Tuhi實現(xiàn)中也有多處都做了額外保護來避免數(shù)據(jù)丟失。
Bus factor of one
目前xf86-input-evdev驅(qū)動還是在維護狀態(tài)(maintenance mode)。最后一個改動還是在2018年5月份,而2.10.0版本已經(jīng)是在4年前發(fā)布的了,此后只有總共19個commit。目前RHEL 8里面仍然包含這個設(shè)備,來確保支持一些古老的設(shè)備。類似的情況還有xf86-input synaptics,是在2016年發(fā)布的1.9.0版本,此后只有9個commit。目前基本上處于沒人用的狀態(tài),因為所有的touchpad都可以用libinput來支持了。自從libinput在3年前替代了xf86-input-synaptics之后,沒有人再站出來維護這個項目。
Hutterer說:“l(fā)ibinput很不錯,不過也有一些問題”。在2年前的1.9.0版本發(fā)布之后,已經(jīng)有1100個commit了,其中980個是Hutterer提交的。也就是說,所有人都在使用的這個input stack,基本上只有一位核心開發(fā)者。過去2年里面,有約50位開發(fā)者提交patch,不過其中只有4位提交了超過5個commit。
后來項目移到GibLab之后,他就能夠給bug添加tag了。不過他發(fā)現(xiàn)如果他給某個bug增加"help needed" tag的話,今后就再也沒有人處理這個bug了。他認為遷移到GitLab上是個好壞參半的事情。好處是提高了他的工作效率,CI集成測試也非常有幫助。壞處是,他感覺libinput的改動越來越缺少code review了。以前他每次發(fā)patch到mailing list上,還能偶爾拿到一個"drive-by review",不過目前在GitLab上,盡管只點擊7下鼠標就能完成review,卻沒有人在經(jīng)過的時候順便review一下。
libratbag的情況與之類似。本來四五年前引入libratbag的時候,是希望他成為一個事實上的鼠標配置API標準。當時大概1年的時間里運行得都挺不錯,不過當他和其他主要開發(fā)者沒有時間繼續(xù)維護之后,沒有人站出來,所以停滯不前了。有非常多的人希望鼠標能正確配置,不過沒有多少人愿意伸手幫忙。他現(xiàn)在也不確定今后libratbag前途怎樣。
libinput quirks
大約1年半之前實現(xiàn)了"libinput quirks"功能。有非常多的設(shè)備都在某些方面有一些問題,因此需要有個方法能標示出這個設(shè)備的特殊性。例如,有些設(shè)備的上報信息里聲稱支持按鍵,其實完全沒有按鍵;有的又明明有按鍵卻不上報支持信息,還有的設(shè)備上下是顛倒的,等等等等。在2014年的時候,這些quirk信息都是存在udev的hardware database(hwdb)里面,以key/value(鍵值對)的形式存放在每個系統(tǒng)上。
慢慢的,hwdb方案變得越來越難以維護了。libinput開始使用多層的、甚至有嵌套關(guān)系的quirk來管理,很難調(diào)試。此外,hwdb如果換一種方法升級,就有可能導致quirk隨機錯誤使用。因此,在過去兩年里,慢慢的切換成了.ini文件來統(tǒng)一描述所有的quirk。這樣用戶能比較容易的找到和使用quirk。
libinput-record
此前有一個evemu工具,專用于記錄和重放event stream,現(xiàn)在被替換為libinput-record和libinput-replay了。evemu所使用的特殊格式?jīng)]法進行擴展,現(xiàn)在的新工具使用YAML格式來存儲信息了。更重要的是,這兩個新工具放在libinput repository里,會隨著libinput一起發(fā)布。這樣可以大大減少版本不匹配導致bug,避免浪費不必要的精力去調(diào)試。
Hold gestures
他一直在考慮是不是給libinput增加一個"hold"手勢的功能。目前已經(jīng)有“swipe"(劃線)和”pinch"(捏合)手勢了,是不是可以加一個hold手勢,例如表示用戶放了3個手指在觸摸屏上并且沒有移動。hold手勢可以針對一個、兩個、三個數(shù)量的手指。
因為hold event可能是一個光標移動動作的開始,所以還需要用一個"hold cancel" event來先取消hold狀態(tài)再上報光標移動的event。手指再按下的時候,又會上報一次hold event。有個實際使用的場景就是先用兩根手指進行一次flick(快速滑動)操作,等到用戶看到他想找的照片之后就再次按下手指來停止屏幕圖庫的滑動動作。目前還沒有代碼來支持hold手勢,他很希望能有開發(fā)者感興趣來討論如何實現(xiàn)。
此外Hutterer還介紹了其他一些話題,包括支持Dell Canvas Dial totem設(shè)備,用來在繪畫板上增加一個輸入設(shè)備專用于菜單選擇。目前雖然這個設(shè)備在libinput里已經(jīng)有支持了,不過不清楚有多少應用程序會支持這個功能。還有對XKB配置有一些簡化。這些工作聽起來都是很少幾位開發(fā)者來完成的不少工作。我們都和Hutterer一樣,希望能有人愿意加入。
[I would like to thank the X.Org Foundation and LWN's travel sponsor, the Linux Foundation, for travel assistance to Montréal for XDC.]
全文完
LWN文章遵循CC BY-SA 4.0許可協(xié)議。
極度歡迎將文章分享到朋友圈?熱烈歡迎轉(zhuǎn)載以及基于現(xiàn)有協(xié)議修改再創(chuàng)作~
長按下面二維碼關(guān)注:Linux News搬運工,希望每周的深度文章以及開源社區(qū)的各種新近言論,能夠讓大家滿意~
總結(jié)
以上是生活随笔為你收集整理的LWN: 关于input子系统的近况综述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wangEditor自定义上传图片上传按
- 下一篇: Windows瘦身工具:nLite 1.