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

修改鼠标滚轮的滚动方向 | Reverse Scrolling Direction

就是……像在 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」部分;

WIP 「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?