引言
长期使用Linux桌面的用户,对 xinput 通常并不陌生。
在X11环境中,可以使用它查看鼠标、触控板和键盘:
xinput list
也可以修改属性:
xinput set-prop ...
然而切换到Wayland后,原先有效的命令可能完全没有作用。即使 xinput list 仍能输出一些设备,它看到的也通常只是XWayland兼容层,而不是整个桌面的真实输入设备状态。
这种变化不是工具失效,而是输入架构发生了根本改变。
一、X11下的输入模型
在传统X11桌面中,X Server是整个图形会话的核心。
键盘和鼠标事件大致经过:
内核输入设备
→ X Server
→ X11应用
应用程序可以向X Server查询:
- 当前输入设备
- 鼠标位置
- 窗口位置
- 键盘状态
- 设备属性
xinput 本质上就是一个X11客户端。它通过X Input Extension读取和修改X Server中的设备属性。
因此,X11下常见配置包括:
xinput set-prop <设备> "libinput Natural Scrolling Enabled" 1
或者:
xinput set-prop <设备> "Coordinate Transformation Matrix" ...
二、Wayland改变了控制边界
Wayland并不是一个替代X Server的单一程序,而是一套协议。
在Wayland桌面中,真正管理屏幕、窗口和输入设备的是合成器。
KDE Plasma中的合成器是:
KWin
输入事件大致经过:
内核输入设备
→ libinput
→ KWin
→ Wayland客户端
应用程序不能再像X11时代那样自由读取所有全局输入信息。
普通Wayland应用通常无法:
- 获取其他窗口的键盘输入
- 任意移动其他应用窗口
- 读取全局鼠标位置
- 修改整个桌面的输入设备
- 模拟全局键盘和鼠标事件
这些限制是Wayland安全模型的一部分。
三、为什么Wayland下xinput仍然存在
Wayland桌面通常会启动XWayland,用于运行旧X11应用。
XWayland相当于在Wayland环境中提供一个兼容X Server。
因此可以形成两条路径:
原生Wayland应用
→ KWin直接管理
以及:
X11应用
→ XWayland
→ KWin
此时执行:
xinput list
看到的是XWayland内部的逻辑设备,而不是KWin直接管理的全部真实输入设备。
修改XWayland中的属性,最多只影响X11兼容应用,通常无法改变原生Wayland应用中的鼠标行为。
四、libinput也不是统一配置中心
另一个常见误解是:Wayland使用libinput,所以直接修改libinput即可。
libinput主要负责:
- 识别输入设备
- 标准化事件
- 提供设备能力
- 处理触控板手势
- 处理滚轮和加速度
但libinput本身不负责维护整个桌面的用户配置文件。
不同桌面合成器会分别决定:
- 如何保存设置
- 在何时应用设置
- 向用户暴露哪些选项
- 是否提供D-Bus接口
在KDE Plasma中,用户配置最终由KWin应用。
因此:
libinput能力
≠ KWin当前配置
五、KDE Wayland下应该检查什么
1. 内核设备
ls -l /dev/input/by-id/
ls -l /dev/input/by-path/
以及:
sudo libinput list-devices
用于确认:
- 设备名称
- event节点
- vendor和product
- 设备类型
- 支持的滚动方式
- 是否支持自然滚动
2. KWin输入对象
qdbus6 org.kde.KWin |
grep '^/org/kde/KWin/InputDevice/'
每个设备通常对应:
/org/kde/KWin/InputDevice/eventN
3. KWin运行时属性
例如自然滚动:
busctl --user get-property \
org.kde.KWin \
/org/kde/KWin/InputDevice/event11 \
org.kde.KWin.InputDevice \
naturalScroll
也可以检查:
- enabled
- pointerAcceleration
- leftHanded
- scrollFactor
- supportsNaturalScroll
- touchpad
- mouse
- tabletTool
4. KDE持久配置
主要文件为:
~/.config/kcminputrc
配置通常按设备保存:
[Libinput][vendor][product][设备名称]
NaturalScroll=true
六、为什么同一个鼠标会出现多个设备
无线接收器经常提供复合HID接口。
一个物理设备可能生成:
- 鼠标指针接口
- 多媒体控制接口
- 键盘接口
- 系统控制接口
- 电池状态接口
因此,KWin中可能同时看到:
Wireless Mouse
Wireless Mouse Consumer Control
Wireless Receiver Keyboard
不能仅凭名称中出现“Mouse”就判断它是实际滚轮设备。
需要使用:
sudo libinput debug-events --device /dev/input/eventN
确认哪个节点真正产生:
POINTER_MOTION
POINTER_SCROLL_WHEEL
七、旧X11命令在Wayland中的替代思路
| X11工具 | Wayland下的思路 |
|---|---|
xinput | KDE系统设置或KWin D-Bus |
xrandr | kscreen-doctor |
xsetwacom | KDE绘图板设置/KWin |
xdotool | Portal、桌面快捷键或受限自动化工具 |
wmctrl | KWin窗口规则或KWin脚本 |
xprop | KDE检测窗口属性 |
xwininfo | KWin调试信息 |
Wayland下通常没有一个完全等价的全局替代工具,因为很多X11能力本身就是Wayland刻意限制的。
八、为什么这种变化是必要的
X11允许任何普通应用轻易:
- 监听其他应用键盘输入
- 获取全局剪贴板
- 截取整个屏幕
- 模拟键盘输入
- 移动其他窗口
这使自动化非常方便,但也意味着任何被入侵的普通应用都可能获得过大的权限。
Wayland将这些能力交给:
- 合成器
- Portal
- 用户授权界面
- 受控协议
虽然迁移过程更加复杂,但安全边界更加明确。
结语
Wayland下,xinput并没有被另一个同名工具简单替代。
真正发生的是:
输入设备控制权
从X Server
转移到了桌面合成器
在KDE Plasma中,排查输入问题应以:
内核event节点
+libinput能力
+KWin运行时状态
+kcminputrc
为核心。
继续使用X11时代的命令,不仅可能无效,还可能只修改XWayland兼容层,从而造成“命令成功,但桌面行为完全不变”的假象。