LWN: 关于input子系统的近况综述

640
点击上方蓝色“ Linux News搬运工”关注我们~

An update on the input stack

By Jake EdgeOctober 9, 2019


XDC

Linux input stack(输入子系统)是系统基本交互功能的基础,这个领域其实一直很缺乏开发者。过去几年的工作进展有不少。Red Hat的Peter Hutterer来到2019 X.Org Developers Conference介绍了近期这个领域完成的一些工作,包括仍在进行的功能和过去2年左右已经完成的功能。总体来说,Linux的input子系统状况看起来不错,不过这一部分的维护者数量太少了。

640

High-resolution mouse scrolling

据他介绍,高精度的鼠标滚轮滚动支持大概会在接下来一两个月里加入Linux,从而让支持高精度滚轮功能的设备来提供鼠标滚轮的更高精度检测。这是通过提供一个独立的event stream来实现的。以前一般是15~20度的移动报告一次event,而现在同样的范围内会报出2~4次event。5.0 kernel里新增了两个event type类型(REL_WHEEL_HI_RES和REL_HWHEEL_HI_RES)来支持这些功能。不过旧有的event stream和新增的event stream可能无法完全对应得上,因此他提醒开发者不要同时混着使用这两者。

同时,libinput也加了一个新的event type(LIBINPTU_EVENT_POINTER_AXIS_WHEEL)来支持高精度滚轮。跟kernel一样,也是使用了独立的event stream。这部分代码只是在一个开发分支上验证通过,尚未合入master分支。对Wayland(Xwin显示服务器)来说也新加了一个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等设备了。这样libinput能收到定制过的evdev event事件,就当做打开了普通的input设备一样来进行测试。

libinput测试套件(test suite)执行时耗时1小时左右,不过目前只能在他的laptop上运行。测试中的各种failure都是基于他的laptop所调试的各种timeout设置值。并且还需要root权限,依赖于udev和uinput,而且还会把当前的登录会话(login session)搞乱。这个测试套件没法在容器(container)里面运行,无法作为持续集成(CI)测试的一部分。而他新实现的这个user dvice的测试方法能够更加容易的实现在container环境里进行测试,除此之外,还有其他一些应用场景。例如实现一个keyboard macro daemon(大家很熟悉的按键精灵工具)让Wayland来简便地接受一批evdev event,就跟正常的按键输入一样。目前他的代码计划放入libinput-testing.so,而不是放入libinput本身,今后如果要支持其他应用场景的话可能需要调整代码合入的位置。

ratbag-emu

Hutterer也提到一个ratbag-emu,这是一个鼠标固件模拟器,由罗技(Logitech)的一位实习生Filipe Laíns所开发。每当需要配置一个游戏鼠标的时候,都会需要通过libratbag所提供的ratbag daemon(ratbagd守护程序)来利用raw HID设备节点(例如/dev/hidraw0)发送每个设备各不相同的一些命令。如果要测试这个功能的话,就需要把真正的游戏鼠标插入拔出很多次才能测试完整。

ratbag-emu则可以模拟真实鼠标,这样测试套件可以在没有真实硬件的情况下也利用ratbagd守护程序完成测试。ratbag-emu提供了一个REST接口,用来配置它模拟具体哪个设备以及检查所进行过的配置。目标是能模拟任何鼠标,不过目前只支持罗技的鼠标,原因很简单,作者有逻辑鼠标的完整文档。

Tuhi

在Hutterer介绍过去一两年完成的工作时,提到了Tuhi。Tuhi是一个管理Wacom Smartpad设备(例如Banboo Spark)的GTK程序。这种手写板设备可以让用户跟正常使用纸笔一样写画,同时设备会记录好所有的笔画,然后用蓝牙等获取画出来的图像。

Tuhi本身并不复杂,只是把图像取下来,允许保存成SVG或者PNG格式的文件。这里的协议需要通过反向工程来得到,不过最终还是从Wacom公司拿到了一些文档,实现的更加准确了。从设备里获取图像的时候只能获取最早的一张图像,所以如果想要取得新画的一些图的话,就得首先把此前画的旧图全部从设备里删除掉。这样Tuhi必须要非常小心,确保在取出多幅图片的时候不要丢掉任何一张。Tuhi实现中也有多处都做了额外保护来避免数据丢失。

Bus factor of one

目前xf86-input-evdev驱动还是在维护状态(maintenance mode)。最后一个改动还是在2018年5月份,而2.10.0版本已经是在4年前发布的了,此后只有总共19个commit。目前RHEL 8里面仍然包含这个设备,来确保支持一些古老的设备。类似的情况还有xf86-input synaptics,是在2016年发布的1.9.0版本,此后只有9个commit。目前基本上处于没人用的状态,因为所有的touchpad都可以用libinput来支持了。自从libinput在3年前替代了xf86-input-synaptics之后,没有人再站出来维护这个项目。

Hutterer说:“libinput很不错,不过也有一些问题”。在2年前的1.9.0版本发布之后,已经有1100个commit了,其中980个是Hutterer提交的。也就是说,所有人都在使用的这个input stack,基本上只有一位核心开发者。过去2年里面,有约50位开发者提交patch,不过其中只有4位提交了超过5个commit。

后来项目移到GibLab之后,他就能够给bug添加tag了。不过他发现如果他给某个bug增加"help needed" tag的话,今后就再也没有人处理这个bug了。他认为迁移到GitLab上是个好坏参半的事情。好处是提高了他的工作效率,CI集成测试也非常有帮助。坏处是,他感觉libinput的改动越来越缺少code review了。以前他每次发patch到mailing list上,还能偶尔拿到一个"drive-by review",不过目前在GitLab上,尽管只点击7下鼠标就能完成review,却没有人在经过的时候顺便review一下。

libratbag的情况与之类似。本来四五年前引入libratbag的时候,是希望他成为一个事实上的鼠标配置API标准。当时大概1年的时间里运行得都挺不错,不过当他和其他主要开发者没有时间继续维护之后,没有人站出来,所以停滞不前了。有非常多的人希望鼠标能正确配置,不过没有多少人愿意伸手帮忙。他现在也不确定今后libratbag前途怎样。

libinput quirks

大约1年半之前实现了"libinput quirks"功能。有非常多的设备都在某些方面有一些问题,因此需要有个方法能标示出这个设备的特殊性。例如,有些设备的上报信息里声称支持按键,其实完全没有按键;有的又明明有按键却不上报支持信息,还有的设备上下是颠倒的,等等等等。在2014年的时候,这些quirk信息都是存在udev的hardware database(hwdb)里面,以key/value(键值对)的形式存放在每个系统上。

慢慢的,hwdb方案变得越来越难以维护了。libinput开始使用多层的、甚至有嵌套关系的quirk来管理,很难调试。此外,hwdb如果换一种方法升级,就有可能导致quirk随机错误使用。因此,在过去两年里,慢慢的切换成了.ini文件来统一描述所有的quirk。这样用户能比较容易的找到和使用quirk。

libinput-record

此前有一个evemu工具,专用于记录和重放event stream,现在被替换为libinput-record和libinput-replay了。evemu所使用的特殊格式没法进行扩展,现在的新工具使用YAML格式来存储信息了。更重要的是,这两个新工具放在libinput repository里,会随着libinput一起发布。这样可以大大减少版本不匹配导致bug,避免浪费不必要的精力去调试。

Hold gestures

他一直在考虑是不是给libinput增加一个"hold"手势的功能。目前已经有“swipe"(划线)和”pinch"(捏合)手势了,是不是可以加一个hold手势,例如表示用户放了3个手指在触摸屏上并且没有移动。hold手势可以针对一个、两个、三个数量的手指。

因为hold event可能是一个光标移动动作的开始,所以还需要用一个"hold cancel" event来先取消hold状态再上报光标移动的event。手指再按下的时候,又会上报一次hold event。有个实际使用的场景就是先用两根手指进行一次flick(快速滑动)操作,等到用户看到他想找的照片之后就再次按下手指来停止屏幕图库的滑动动作。目前还没有代码来支持hold手势,他很希望能有开发者感兴趣来讨论如何实现。

此外Hutterer还介绍了其他一些话题,包括支持Dell Canvas Dial totem设备,用来在绘画板上增加一个输入设备专用于菜单选择。目前虽然这个设备在libinput里已经有支持了,不过不清楚有多少应用程序会支持这个功能。还有对XKB配置有一些简化。这些工作听起来都是很少几位开发者来完成的不少工作。我们都和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许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议修改再创作~

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

640?wx_fmt=jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值