「Linux」- 修改鼠标滚轮的滚动方向

  CREATED BY JENKINSBOT

我们要实现什么功能?

就是……像在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?