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