Mar 2019 [EN||]

優化 Linux 上觸控板的使用體驗

Windows 的觸控板手勢可用性隨著 Windows 10 的鋪開愈來愈高,不僅手勢的樣式較前更為多樣,而且順滑度也不容置疑地有了很大的提升。相比之下,優化在桌面乏力的 Linux 在觸控板的體驗,就成了生存在 Linux 用戶和筆記本用戶兩者並集的使用者需要操心的問題了。下文主要圍繞 Wayland 自帶的 libinput 而不討論 synaptics 等替代方案。另外,本人對 libinput 的 Archwiki 中文詞條 做了一些微小的貢獻,可以配合食用。

編輯觸控板相關 Xorg 設定檔

Linux 的輸入裝置的設定檔都存儲在 /etc/X11/xorg.conf.d/30-touchpad.conf 顧名思義為觸控板的配置資訊。將其複製到 /usr/share/X11/xorg.conf.d/ 進行修改。此時可以引用 40-libinput.conf 的基本框架,按照以下配置格式

Section "InputClass"
    Identifier "touchpad"
    Driver "libinput"
    Option "Tapping" "on"
    Option "NaturalScrolling" "true"
    Option "ClickMethod" "clickfinger"
EndSection

其中 Option "Tapping" "on" 開啟了觸控板的觸摸點按操作。不用再按下觸控板;Option "NaturalScrolling" "true" 則還原了更為 Natural 的滾動方向,讓你得以夢回 Windows;Option "ClickMethod" "clickfinger" 就開啟「雙指點按即按右鍵,三指點按即中鍵按一下」的選項。

除此之外 libinput 提供了更多關於「點按」、「滾動」、「觸控板指針加速度」等較為豐富的選項,其它的配置選項可參見 libinput 的 man page

關於 libinput 的各種點按滾動操作,在其 文檔 中有友好形象的圖例幫助理解。同時,你也可以在裡面看到對於其它如「小紅點」、「觸控式螢幕」等輸入裝置的配置與支援,不在本文「觸控板」的討論範圍之內,所以不議。

安裝 xdotool

xdotool 是一個可以類比鍵盤滑鼠輸入的工具。與下文提到的 libinput-gestures 包配合使用,便可以將觸控板手勢綁定相應的熱鍵或是滑鼠操作,從而達到添加並優化觸控板手勢的目的。

Archlinux Wiki 中對於 Xorg 中模擬鍵鼠輸入的推薦中,xdotool 被描述為「Very Buggy」,然而簡單使用下來,我認為 xdotool 的使用十分簡單且沒有什麼毛病(也許是我只是使用了它對鍵盤輸入處理的部分 😂)以下是 xdotool 的基本操作

xdotool click 1
xdotool key Ctrl+L
xdotool mousemove x y
xdotool type 'string'

這可以說是非常明瞭的語法了。值得注意的是,對於幾個特殊的按鍵,xdotool 是這麼稱呼的:「1」滑鼠左鍵、「2」滑鼠中鍵、「3」滑鼠右鍵,「Left」方向左鍵、「Right」方向右鍵、「Super」Windows 徽標鍵、「plus」加號、「minus」減號。

xdotool 還支援視窗檢索、獲取視窗焦點等功能,可以實現大部分鍵鼠自動化的需求。

使用 libinput-gestures

安裝 libinput-gestures 並將當前用戶添加到 input 組,將設定檔範本 /etc/libinput-gestures.conf 複製到 ~/.config/ 下進行修改。啟動 libinput-gestures-setup 進行初始化

libinput-gestures-setup start

其中 gestures 在 libinput-gestures 的認知中有 swipepinch 兩種,分別對應手指在觸控板上滑動和捏合操作。眾所周知,這 Ctrl+「+」Ctrl+「-」 兩個熱鍵基本可以實現大多數軟體視圖上的放大和縮小,習慣上我們把雙指張開作放大操作,雙指捏合作縮小操作,所以先添加到 ~/.config/libinput-gestures.conf

gesture pinch in 2 xdotool key Ctrl+minus
gesture pinch out 2 xdotool key Ctrl+plus

關於 pinch,你可以指定 inout 和參與動作的手指數量。同理,對於 swipe,參與動作的手指數量和滑動的四個方向(分為 Left、Right、Up、Down)也可以被指定,以下則是一個左右滑動實現在 Chrome 中切換標籤頁的例子

gesture swipe right 3 xdotool key Ctrl+Tab
gesture swipe left 3 xdotool key Ctrl+Alt+Tab

向右三指滑動進入下一個標籤頁,向左三指滑動進入上一個標籤頁。雖然沒有相應動畫回饋,但也用得順手。

通過閱讀 libinput-gestures 相關章節 對於原理的介紹得知,觸控板對於參與動作手指數量相同的 swipe 和 pinch 的區分判斷並不是完全準確,所以不要配置出同手指數量的兩種不同動作共存,後期體驗會比較差,較大概率發生誤判。特別是同手指數量滑動但是不同方向的時候,如配置雙指左右滑動切換應用,很可能與雙指上下滑動,也就是滾動的動作產生衝突。

更多可能性

當然,libinput-gestures 和 xdotool 並非必須配合使用,也可以使用支援鍵鼠輸入的如 xtexvkbd,而它們的操作與 xdotool 大體上也是相同的。

以下是 xvkbd 分別實現了滑鼠左鍵點擊和 Ctrl+Tab 的例子

xvkbd -no-jump-pointer -xsendevent -text '\m1'
xvkbd -no-jump-pointer -xsendevent -text '\Ct'

xte 對複合鍵的操作是使用 keydownkeyup 實現的。以下是 xte 實現了 Ctrl+Tab 的例子

xte keydown Control_L
xte key Tab
xte keyup Control_L

同樣,你也可以直接給 libinput-gestures 綁定啟動一個應用,如四指上滑呼出應用快捷入口。

遇到觸控板指標跳躍閃爍,或者手勢嚴重誤判的時候,可以嘗試用以下命令重啟 libinput-gestures

libinput-gestures-setup restart

感謝閱讀 💗