Archlinux: 優化觸摸板配置


更新於2017-02-04

年后更新系統發現 xSwipe 已不能正常使用, 原來早在 2017-01-14 社區已發布公告xf86-input-libinput 將成為默認輸入設備的驅動, 但 synaptics/evdev/wacom 仍舊可以使用.

查看 archlinux 的 xSwipe 包主頁也發現如下評論:
xf86-input-synaptics-xswipe-git disown

沒有觸摸板的日子是很煎熬的, 並且, 為了一勞永逸(暫時的😢), 那就切換到 libinput 吧, 而且它也提供了 libinput-gestures 來配置手勢.

安裝 libinput-gestures 后要把當前用戶添加到 input 用戶組, 並且需要注銷當前用戶, 否則不生效. 它的配置文件是 $HOME/.config/libinput-gestures.conf/etc/libinput-gestures.conf, 修改完畢后即可啟動測試:

sudo gpasswd -a $USER input  # 將當前用戶添加到 input 用戶組
vim $HOME/.config/libinput-gestures.conf # 編輯配置文件, 如果不存在該文件就從 /etc/libinput-gestures.conf 復制一份
libinput-gestures-setup start # 啟動程序

主要為 libinput-gestures 新增以下配置:

gesture swipe left 4 xdotool key super+Left # 4指左划: 切換到左側工作區
gesture swipe right 4 xdotool key super+Right # 4指右划: 切換到右側工作區

gesture swipe left 3 xdotool key alt+Left # 3指左划: 瀏覽器后退
gesture swipe right 3 xdotool key alt+Right # 3指右划: 瀏覽器前進
gesture swipe up 3 xdotool key F5 # 3指上划: 刷新當前頁面
gesture swipe down 3 xdotool key ctrl+w # 3指下划: 關閉當前頁面

gesture pinch in 2 xdotool key ctrl+minus # 2指捏: 縮小
gesture pinch out 2 xdotool key ctrl+plus # 2指張: 放大

對了, 默認配置沒有啟用輕觸, 啪啪啪的按觸摸板這也是不能接受的.

首先查看輸入設備列表, 得知觸摸板設備 ID 是 12:

$ xinput  list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=12   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=13   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Video Bus                                 id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Integrated Camera                         id=10   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=11   [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=14   [slave  keyboard (3)]

查看觸摸板設備屬性:

$ xinput list-props 12
Device 'SynPS/2 Synaptics TouchPad':
        Device Enabled (139):   1
        Coordinate Transformation Matrix (141): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
        libinput Tapping Enabled (274): 0
        libinput Tapping Enabled Default (275): 0
        libinput Tapping Drag Enabled (276):    1
        libinput Tapping Drag Enabled Default (277):    1
        libinput Tapping Drag Lock Enabled (278):       0
        libinput Tapping Drag Lock Enabled Default (279):       0
        libinput Tapping Button Mapping Enabled (280):  1, 0
        libinput Tapping Button Mapping Default (281):  1, 0
        libinput Accel Speed (282):     0.000000
        libinput Accel Speed Default (283):     0.000000
        libinput Natural Scrolling Enabled (284):       0
        libinput Natural Scrolling Enabled Default (285):       0
        libinput Send Events Modes Available (259):     1, 1
        libinput Send Events Mode Enabled (260):        0, 0
        libinput Send Events Mode Enabled Default (261):        0, 0
        libinput Left Handed Enabled (286):     0
        libinput Left Handed Enabled Default (287):     0
        libinput Scroll Methods Available (288):        1, 1, 0
        libinput Scroll Method Enabled (289):   1, 0, 0
        libinput Scroll Method Enabled Default (290):   1, 0, 0
        libinput Click Methods Available (291): 1, 1
        libinput Click Method Enabled (292):    1, 0
        libinput Click Method Enabled Default (293):    1, 0
        libinput Middle Emulation Enabled (294):        0
        libinput Middle Emulation Enabled Default (295):        0
        libinput Disable While Typing Enabled (296):    1
        libinput Disable While Typing Enabled Default (297):    1
        Device Node (262):      "/dev/input/event11"
        Device Product ID (263):        2, 7
        libinput Drag Lock Buttons (298):       <no items>
        libinput Horizontal Scroll Enabled (299):       1

看到 libinput Tapping 的兩個配置編號分別為 274/275, 且值都為 0(禁用), 所以配置為 1 就可以啟用 輕觸代替點擊 啦:

xinput set-prop 12 274 1

更新於 2017-02-14

發現有時在重啟后 device id 或者配置編號可能發生編號, 因此可使用如下字符串版本的命令替換 id 版本:

xinput set-prop --type=int --format=8 "SynPS/2 Synaptics TouchPad" "libinput Tapping Enabled" 1

更新於 2017-03-26

今天晚上發現在合上筆記本蓋子后發現觸摸板三指手勢失效(二指的放大縮小仍舊有效). 通過 libinput-debug-events 發現無法檢測到三指事件了. 執行 libinput-gestures-setup restart 重啟手勢服務也沒有效果, 但看到終端有這個錯誤提示:

libinput error: kernel bug: Touch jump detected and discarded.
See https://wayland.freedesktop.org/libinput/doc/1.6.3/touchpad_jumping_cursor.html for details

上面的鏈接提到在多點觸控的觸摸板上可能會發生手指觸摸坐標跳躍的現象, 但這種問題應該在內核中得到解決. 如果看到有上述錯誤日志, 請記錄相關數據並提交 bug...

Archlinux WiKi: Touchpad Synaptics--Cursor jump 小節中有提到了這個問題, 提示可能是 i8042 控制器丟失中斷請求有關, 暫時還沒有補丁, 但已經有開發者關注這個問題了. 普通用戶可通過重新加載 psmouse 模塊或者添加啟動參數 i8042.nomux=1 的方式解決問題.

在嘗試重新加載 psmouse 模塊后問題得到解決, 於是暫時就先不管這個事情了, 待穩定重現后再說.


以下為原文.

轉做 java 開發后感覺電腦越來越慢了, 於是就拿起了大學時折騰過的 Archlinux.

公司雖然要求 Windows/MacBook 安裝幾個客戶端, 但因為沒有 linux 解決方案, 也沒有禁止使用 linux, 這點還是挺人性化的. 剛開始幾天是下班后再切換到 Arch 下, 測試幾天后就把工作環境完全切換到 Arch 下了.

在 linux 下一個很嚴重的問題是 觸摸板太靈敏了, 稍微一碰鼠標就飛了, 並且 linux 桌面環境有特性: 當前活動窗口是鼠標所在窗口. 這兩個問題/特性加起來, 是非常嚴重使用體驗. 完全禁用觸摸板又太極端了, 於是翻翻 Archlinux WiKi, 優化下觸摸板配置, 雖然還達不到同事吹噓的 MacBook 那種程度, 但也比 Windows 下好用了.

基礎配置

確認自己的觸摸板支持哪些特性:

$ xinput list-props "SynPS/2 Synaptics TouchPad" | grep Capabilities
        Synaptics Capabilities (325):   1, 0, 0, 1, 1, 1, 1

上面輸出的 1/0 按順序分別表示:

  • 1: 設備有物理左鍵;
  • 0: 設備沒有物理中鍵;
  • 0: 設備沒有物理右鍵;
  • 1: 設備支持兩指檢測;
  • 1: 設備支持三指檢測;
  • 1: 設備支持配置垂直分辨率(精度);
  • 1: 設備支持配置水平分辨率(精度);

既然支持兩指和三指檢測, 就可以配置對應的事件了. 其中相關屬性有:

  • TabButton1: 一個手指輕觸觸摸板;
  • TabButton2: 兩個手指輕觸觸摸板;
  • TabButton3: 三個手指觸摸觸摸板;

可選值是:

  • 1: 鼠標左鍵;
  • 2; 鼠標中鍵;
  • 3; 鼠標右鍵;

於是就有了下面的配置:

synclient TapButton1=1 # 一個手指輕觸觸摸板代表點擊左鍵
synclient TapButton2=3 # 兩個手指輕觸觸摸板代表點擊右鍵
synclient TapButton3=2 # 三個手指輕觸觸摸板代表點擊中鍵

觸摸板感應測試

當前的英文 WiKi 已經沒有關於 synclient 命令 -m 參數的介紹了, 命令文檔中也沒有該參數的介紹, 只有中文 WiKi 里還有一點介紹. 經測試可用, 並且效果比 evtestxev 更清晰.

這里 -m 參數是用來配置每隔多少毫秒讀取一次觸摸板當前狀態(比如觸摸位置和壓力). 例如:

$ synclient -m 100
    time     x    y   z f  w  l r u d m     multi  gl gm gr gdx gdy
   0.000  1053 3969   0 0  0  0 0 0 0 0  00000000
   1.802  1105 3623   0 0  0  0 0 0 0 0  00000000
   2.703  1219 4364  94 1  0  0 0 0 0 0  00000000
   2.803  1222 4377  59 1  0  0 0 0 0 0  00000000
   2.904  1215 4382   0 0  0  0 0 0 0 0  00000000
   4.606  2645 3925  64 4  0  0 0 0 0 0  00000000
   4.706  2640 3937  48 4  0  0 0 0 0 0  00000000
   4.806  2640 3937   0 0  0  0 0 0 0 0  00000000

其中:

  • x/y: 位置;
  • z: 壓力;
  • f: 手指數;

這樣, 如果我們對觸摸板的靈敏度不滿意的話, 可以通過嘗試操作觸摸板即快速找到自己的滿意值.


掌壓感應

如果在打字時鼠標亂飛, 那就需要開啟和設置 掌壓感應 了:

synclient PalmDetect=1  # 開啟掌壓感應
synclient PalmMinWidth=8 # 設定手掌與觸摸板的最小接觸面, 超過該值認為觸摸板被手掌壓到了(單位是手指寬度?)
synclient PalmMinZ=30 # 設定手掌壓在觸摸板上的最小壓力, 超過該值認為觸摸板被手掌壓到了

注: PalmMinWidthPalmMinZ 需要根據自身情況調整數值大小.


xSwipe

上面提到的這些功能可被 xf86-input-synaptics 驅動支持, 然而如果想開啟四指/五指檢測和更多手勢支持的話,
就需要安裝 xf86-input-synaptics-xswipe-git 驅動了.

安裝該驅動后, clone 在 GitHub 上的 xSwipe,
通過修改配置文件 eventKey.cfg 設置不同觸摸板事件對應的鍵盤按鍵. 然后啟動 xSwipe 即可:

perl xSwipe.pl

參考鏈接:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM