这是为了让“自然滚动”又名“反向滚动”能够与全系统所有使用 USB 鼠标和指点杆的应用程序配合使用。这个问题从 12.04 版本开始就让我抓狂,我最后用了一堆变通方法才让它正常工作。
我在用着Ubuntu Studio 18.04(xfce 4.12 桌面)并且在“偏好设置”中有一个“自然滚动”选项。它在浏览器和文件管理器以及文本编辑器等中按预期工作。但是,在 xfce4-terminal 和 mousepad(文本编辑器)以及其他一些应用程序中,它仍然是“非自然滚动”
有人知道这个主题的开发状态吗?我遗漏了什么吗?
在重新开始并测试所有这些解决方法之前,我将不胜感激任何帮助。
Ubuntu Studio 18.04.1 搭载 xfce 4.12 4.15.0-20-lowlatency #21-Ubuntu SMP PREEMPT
答案1
我记得,即使在默认 (x)ubuntu 应用程序中,不一致的“反向滚动”行为也是由于 GTK2 和 GTK3 中的滚动处理不同造成的。不知道这是否仍然适用。
无论如何,我刚刚发现“旧 xinput 技巧”仍然有效(xUbuntu 18.04.1,xinput 版本 1.6.2),所以我不妨分享一下它的工作原理。以及如何让它在重启后继续使用。
测试/临时解决方案
列出所有当前可用的指针和键盘:
xinput list
会出现如下内容:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB Laser Mouse id=9 [slave pointer (2)]
⎜ ↳ TPPS/2 IBM TrackPoint id=12 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=11 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=10 [slave keyboard (3)]
↳ ThinkPad Extra Buttons id=13 [slave keyboard (3)]
选择id
有问题的指针,列出其所有设备属性:
xinput list-props 12
Device 'TPPS/2 IBM TrackPoint':
Device Enabled (143): 1
Coordinate Transformation Matrix (145): 1.000000, ...
libinput Natural Scrolling Enabled (281): 1
libinput Natural Scrolling Enabled Default (282): 0
libinput Scroll Methods Available (283): 0, 0, 1
libinput Scroll Method Enabled (284): 0, 0, 1
libinput Scroll Method Enabled Default (285): 0, 0, 1
libinput Button Scrolling Button (286): 2
...
这就是我们所需要的:libinput Natural Scrolling Enabled (281)
要全局启用自然滚动,即针对“TPPS/2 IBM TrackPoint”(针对当前会话),首先在“鼠标和触摸板”首选项中将其关闭。
输入以下两行之一,按 Enter。(两者的作用相同,因为要读取或写入属性,您可以使用其完整(!)名称或其 ID)
xinput set-prop 12 "libinput Natural Scrolling Enabled" 1
xinput set-prop 12 "281" 1
现在通过系统偏好设置,在自然滚动无法工作的应用程序中进行测试。
永久解决方案
如果上述测试在你的机器上成功,那么你可以在每次登录会话时使用一个小的启动脚本应用更改。匹配的脚本部分deviceName
来自这个关于按钮地图的答案由@zerobandwidth提供。
将以下代码保存natural_scrolling.sh
到您的主目录或/any/path/youLike
#!/bin/bash
# Find all xinput devices whose name matches any of the arguments passed here,
# then set the Natural Scrolling' property to '1' regardless of its
# current state.
# expect multiple arguments, store them as array
deviceNames="$@"
# exit if no argument is passed
if [ "$deviceNames" = "" ]; then
echo "No argument received, exiting."
echo "Call this script with argument(s) like 'Logitech' that match"
echo "any of your attached pointer devices."
exit 1
fi
for deviceName in $deviceNames
do
deviceId=$(xinput --list | awk -v search="$deviceName" \
'$0 ~ search {match($0, /id=[0-9]+/);\
if (RSTART) \
print substr($0, RSTART+3, RLENGTH-3)\
}'\
)
# set device-specific property (works i.e for 'TrackPoint' & 'Logitech')
xinput set-prop $deviceId "libinput Natural Scrolling Enabled" 1
done
将脚本标记为可执行:
chmod +x natural_scrolling.sh
使用唯一的(!)device_name
字符串作为参数来调用它:
/any/path/youLike/natural_scrolling.sh Logitech TrackPoint
将其添加到您的启动应用程序中,即通过 xfce 中的会话和启动首选项,然后通过注销并重新登录进行测试。
答案2
唉,我没有足够的声誉来发表评论,所以我必须添加这个作为答案。对于任何偶然发现这一点的人来说,上面的代码中有一个非常小的错误。倒数第二行:
xinput set-prop $id "libinput Natural Scrolling Enabled" 1
应该读:
xinput set-prop $deviceId "libinput Natural Scrolling Enabled" 1
另外,我使用 Logitech Ultrathin Mouse,不知道出于什么原因,它既可以连接鼠标又可以连接键盘,因此在 中出现了两次xinput list
。因此,我添加了管道输出以head -1
限制返回的内容仅为第一个条目(在我的情况下始终是鼠标):
...
print substr($0, RSTART+3, RLENGTH-3)\
}' | head -1 \
)
...