「Linux」- 修改鼠标滚轮的滚动方向 @20210317
我们要实现什么功能?
就是……像在OS X Lion中一样,鼠标滚轮滚动的方向就是页面移动的方向(模仿智能手机或平板电脑滚动)。
(无关紧要的一句话:可以这么想象,在Mac中,滚轮用于移动在窗口中的页面,而在Windows中,滚轮用于移动在页面上的窗口)
这个东西称为「反向滚动」(Reverse scrolling),或者「自然滚动」(Natural scrolling)
有哪些办法呢?
有那些方法可以实现呢?
xmodmap,修改Xorg中的键映射和指针按钮映射(部分应用程序无效); xinput,修改libinput Natural Scrolling Enabled属性; synaptics,但是这个只是用于触控板;
这里并没有介绍图形化界面中的那些设置方法(在桌面环境中,可以在设置用找到「Natural scrolling」功能进行设置)。
有些东西一言难尽……
「xmodmap」与「XKB」没有直接关系。因为在“在X中如何处理keycode”中,「xmodmap」使用了不同想法(前XKB)。有关高级布局配置,请参阅「XKB」部分。
TODO 「xmodmap」与「XKB」的真正区别。为什么使用「xmodmap」后,某些应用是无效的。
# xmodmap(存在一些问题)
XMODMAP - 用于调整键盘和鼠标映射
为什么用到了这个技术?不知道,我搜索“linux change mouse scroll direction”后,出来的第一篇文章就是和XMODMAP有关的内容,发现这技术可以实现我想要的功能。大概是这个样子的(里面含有一些猜测的成分,并未找到直接相关的文档,也没有翻阅官方手册(因为成本和收益的原因),只看到一些介绍的博客):
在Linux(或者其他操作系统)中,每个按键都映射到一个编号。下面鼠标按钮映射值:
* mouse 1:左键 * mouse 2:中间(滚轮。鼠标中间是可点击的,比如在Firefox中,在链接上单击中键,可以在新选项卡中打开页面) * mouse 3:右键 * mouse 4:下滚动,滚轮逆时针(垂直方向) * mouse 5:上滚动,滚轮顺时针(垂直方向) * mouse 6:左滚动(没见过……) * mouse 7:右滚动(没见过……) * mouse 8:向后导航(没见过……) * mouse 9:向前导航(没见过……)
可以使用''xev -event button''命令。在弹出的“Event Tester”窗口中进行点击操作,并观察控制台的输出,来观察鼠标的映射值。这里没有讨论键盘,键盘也有对应的映射值。
所以,要实现我们想要的那个效果,就是交换“4”和“5”键值:
#!/bin/sh # 如果要「交换」鼠标「垂直滚动」的方向,执行 xmodmap -e "pointer = 1 2 3 5 4 6 7 8 9 10" # 如果要「恢复」正常的垂直滚动方向,执行 xmodmap -e "pointer = 1 2 3 4 5 6 7 8 9 10" # 注意,某些应用需要「重新启动」才会生效,而有些应用不用重启就能生效。
如何持久化修改?
修改$HOME/.Xmodmap文件,追加如下内容:
pointer = 1 2 3 5 4 6 7 8 9 10
根据需要配置数值的顺序。使用命令xmodmap ~/.Xmodmap来重新加载配置文件,使其生效。
如何修改「水平滚动」方向?
还是同一条命令,只是交换“6”和“7”即可,即执行xmodmap -e "pointer = 1 2 3 4 5 7 6 8 9 10"命令。
鼠标可能没有水平滚动,但是笔记本由触控板啊……
附加说明
某些Linux发行版或者说桌面环境中,提供了“Reverse Scrolling Direction”功能,又或者是禁用“Natural Scrolling”。还以使用naturalscrolling软件进行修改,真的是一如既往的混乱。参考「How to Reverse The Mouse Scrolling Direction in Ubuntu (aka Natural Scrolling)」「Kali Linux inverted scroll direction」
我只使用了XMODMAP。在「在Chromium中完全无效」的问题还在处理中。
# xinput(终极解决方案?)
「ArchWiki/Natural scrolling」
「GTK3 apps don't understand natural scrolling in Xubuntu」
没仔细研究过,但是感觉这是一种从驱动层面彻底交换滚动方向的方法:
#!/bin/sh xinput list xinput --set-int-prop ## "libinput Natural Scrolling Enabled" 8 1 xinput --set-int-prop ## "libinput Natural Scrolling Enabled" 8 0 # 存在一个问题:使用「Ctrl + Alt + F1~6」切换到虚拟控制台后,再切换回来,需要重新设置。
参考文献
Mouse button mapping on Linux
ArchWiki/xmodmap
ArchWiki/Touchpad Synaptics
ArchWiki/X keyboard extension
Can I Xmodmap only a specific device?