1. 程式人生 > 實用技巧 ># 2021-01-11 #「Linux」- 修改滑鼠滾輪的滾動方向

# 2021-01-11 #「Linux」- 修改滑鼠滾輪的滾動方向

我們要實現什麼功能?

就是……像在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」切換到虛擬控制檯後,再切換回來,需要重新設定。

參考文獻