kde5與archlinux環境下配置libinput-gestures多手勢操做

初衷

本身的筆記本是archlinux+kde plasma5的環境,看到同事的macbook pro支持不少手勢操做(gestures),本身也但願在archlinux和kde的環境下配置方便的手勢操做。php

查詢資料後發現touchegglibinput-gestures均可以知足需求,可是在實際配置過程當中,touchegg存在不少問題一直都沒能解決,而libinput-gestures基本沒有太大的問題。因此本文主要介紹如何配置libinput-gestures。html

預備知識

  1. 計算機窗口管理器
  2. kde是X.Org桌面環境,aur上維護了一個基於X.Org Server的驅動xf86-input-libinput-git,很方便。它們間的關係以下:


X11 client在我這裏就是kde plasma5。linux

  1. 驅動程序libinput,linux生態提供了不少驅動,本文使用的驅動是libinput,它負責分析內核從輸入設備獲得的數據,發送給桌面環境,桌面環境根據不一樣的數據進行反饋。

術語解釋

  • touchpad:一般意義上的觸摸板。
  • clickpad:指底部沒有按鈕的touchpad,參考clickpad。clickpad中經過不一樣手指數量的點擊行爲來模擬鼠標左鍵、中鍵、右鍵點擊。這些均可以配置或者關閉。
  • click:點擊,本文語境中之物理按鈕的「按壓」和「釋放」。
  • Clickpad software button behavior:clickpad上軟按鈕的行爲,詳情見Clickpad software button behavior

libinput

安裝

  1. install basic libinput and xf86-input-libinput
sudo gpasswd -a $USER input
sudo pacman -S libinput xf86-input-libinput

配置

libinput有兩種配置方式:git

  • 使用配置文件的永久配置方式
  • 使用xinput命令行工具,針對運行時(runtime)進行實時配置,主要用來調試。

配置文件

libinput安裝後默認的配置文件在/usr/share/X11/xorg.conf.d目錄下,如何你安裝多個驅動,會存在多個文件:github

➜  xorg.conf.d ll
total 12K
-rw-r--r-- 1 root root 1.4K Aug 14 05:40 10-quirks.conf
-rw-r--r-- 1 root root  964 May  5 20:24 40-libinput.conf
-rw-r--r-- 1 root root 1.8K Nov 18  2016 70-synaptics.conf

筆者這裏安裝了3個驅動,因此有3個配置文件,默認狀況下,kde會根據文件前綴數字的大小決定優先使用哪一個配置文件,數字越大,優先級越高。chrome

咱們須要把默認配置文件複製到/etc/X11/xorg.conf.d/目錄下:shell

sudo cp /usr/share/X11/xorg.conf.d/40-libinput.conf /etc/X11/xorg.conf.d/40-libinput.conf

下面是文件中touchpad部分的配置:vim

Section "InputClass"
        Identifier "touchpad"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        Option "Tapping" "on"
        Option "ButtonMapping" "1 3 0 4 5 6 7"
        Option "TappingButtonMap" "lmr"
        Option "DisableWhileTyping" "on"
        Option "TappingDrag" "on"
EndSection

詳細參數和解釋見libinput man page: based on X.Org input dirver,解釋下幾個重要的配置參數:windows

  • Option "Tapping" "on":手指點擊touchpad發送鼠標點擊事件
  • Option "TappingButtonMap" "lmr":1個手指點擊對應鼠標左鍵,2個手指點擊對應鼠標中鍵,3個鼠標點擊對應鼠標右鍵
  • Option "ButtonMapping" "1 3 0 4 5 6 7",按鈕映射,詳情見libinput#Button_Mapping,這裏筆者關閉了3指對應的左鍵。
  • Option "DisableWhileTyping" "on":打字時不檢測touchpad事件,防止用戶不當心觸碰touchpad引發沒必要要的影響。
  • Option "TappingDrag" "on":開啓點擊拖拽。

調試

  1. 肯定touchpad設備
➜  ~ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=16   [slave  pointer  (2)]
......
  1. 查看touchpad的詳細配置
➜  ~ xinput list-props "SynPS/2 Synaptics TouchPad"
Device 'SynPS/2 Synaptics TouchPad':
        Device Enabled (142):   1
        Coordinate Transformation Matrix (144): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
        libinput Tapping Enabled (295): 1
        libinput Tapping Enabled Default (296): 0
        libinput Tapping Drag Enabled (297):    1
        libinput Tapping Drag Enabled Default (298):    1
        libinput Tapping Drag Lock Enabled (299):       0
        libinput Tapping Drag Lock Enabled Default (300):       0
        libinput Tapping Button Mapping Enabled (301):  0, 1
        libinput Tapping Button Mapping Default (302):  1, 0
        libinput Accel Speed (277):     0.000000
        libinput Accel Speed Default (278):     0.000000
        libinput Natural Scrolling Enabled (282):       0
        libinput Natural Scrolling Enabled Default (283):       0
        libinput Send Events Modes Available (262):     1, 1
        libinput Send Events Mode Enabled (263):        0, 0
        libinput Send Events Mode Enabled Default (264):        0, 0
        libinput Left Handed Enabled (284):     0
        libinput Left Handed Enabled Default (285):     0
        libinput Scroll Methods Available (286):        1, 1, 0
        libinput Scroll Method Enabled (287):   1, 0, 0
        libinput Scroll Method Enabled Default (288):   1, 0, 0
        libinput Click Methods Available (303): 1, 1
        libinput Click Method Enabled (304):    1, 0
        libinput Click Method Enabled Default (305):    1, 0
        libinput Middle Emulation Enabled (291):        0
        libinput Middle Emulation Enabled Default (292):        0
        libinput Disable While Typing Enabled (306):    1
        libinput Disable While Typing Enabled Default (307):    1
        Device Node (265):      "/dev/input/event10"
        Device Product ID (266):        2, 7
        libinput Drag Lock Buttons (293):       <no items>
        libinput Horizontal Scroll Enabled (294):       1

這裏面有一個值很重要Device Node (265): "/dev/input/event10",後面使用libinput命令行時會用到這個路徑。app

  1. 使用libinput debug-events 監控touchpad事件
➜  ~ libinput debug-events --device /dev/input/event10
-event10  DEVICE_ADDED     SynPS/2 Synaptics TouchPad        seat0 default group1  cap:pg  size 100x56mm tap(dl off) left scroll-nat scroll-2fg-edge click-buttonareas-clickfinger dwt-on
 event10  GESTURE_SWIPE_BEGIN  +2.82s   3
 event10  GESTURE_SWIPE_UPDATE  +2.82s  3  0.00/ 0.44 ( 0.00/ 3.63 unaccelerated)
 event10  GESTURE_SWIPE_UPDATE  +2.84s  3  0.00/ 3.43 ( 0.00/19.38 unaccelerated)
 event10  GESTURE_SWIPE_UPDATE  +2.87s  3  0.00/ 5.00 ( 0.00/19.38 unaccelerated)
 event10  GESTURE_SWIPE_UPDATE  +2.89s  3  0.00/ 3.33 ( 0.00/10.90 unaccelerated)
 event10  GESTURE_SWIPE_UPDATE  +2.92s  3  0.00/ 2.74 ( 0.00/ 8.48 unaccelerated)
  1. 使用libinput debug-gui 監控touchpad事件
➜  ~ libinput debug-gui --device /dev/input/event10
info: event10 SynPS/2 Synaptics TouchPad     added

這時會出現一個GUI畫面幫助檢測。
kde-libinput-gestures-001

libinput-gestures

配置好touchpad和手勢後,下面利用libinput-gestures來解析touchpad的數據,而後執行相關的操做。這裏主要用到xdotool,xdotool是模擬鍵盤/鼠標輸入和窗口管理等的命令行工具。libinput-gestures依賴xdotool。

libinput-gestures安裝後會有默認的配置,位置在/etc/libinput-gestures.conf,用戶能夠在~/libinput-gestures.conf $HOME/.config/libinput-gestures.conf配置本身的配置。筆者根據本身的須要修改了相關配置,以下:

# Switch to next desktop
gesture swipe right 4   xdotool key ctrl+F1
# Switch to prev desktop
gesture swipe left 4 xdotool key ctrl+F2

# Present windows (current desktop)
gesture swipe down 3 xdotool key ctrl+F9
# Present windows (all desktop)
gesture swipe down 4 xdotool key ctrl+F10

# Show desktop
gesture swipe up 3 xdotool key super+d
# Show desktops grid
gesture swipe up 4 xdotool key ctrl+F8

主要思想是針對不一樣的手勢觸發相關的快捷鍵,快捷鍵的配置則能夠在系統偏好設置-->快捷鍵中設置。下圖是筆者在plasma5中的切換桌面的快捷鍵配置:
kde-libinput-gestures-002

Demo

  1. 四指橫向滑動切換桌面:

kde-gestures-demo-1-min

  1. 四指上下滑動顯示全部桌面和全部活動窗口:

kde-gestures-demo-2-min

TODOs

經過捏和(pinch in/pinch out)來放大/縮小網頁(對標macbook)

$HOME/.config/libinput-gestures.conf中添加以下內容(方向能夠本身定義):

# back history of chromium/chrome
gesture swipe right 3   xdotool key alt+Left
gesture swipe left 3   xdotool key alt+Right

網頁的前進/後退(對標macbook)

$HOME/.config/libinput-gestures.conf中添加以下內容

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

總結

本文從想法到配置好前先後後花了大約1個月時間,大部分時間用在了理解輸入驅動、配置驅動以及配置調試toucgegg和libinput-gestures上了。

筆者在配置好本身的archlinux 手勢後,機緣巧合用了一個星期的macbook pro,體會了蘋果下面的手勢操做。整體感受蘋果的手勢操做更流暢,識別更準確。畢竟蘋果是本身的生態系統,能夠針對本身的macOS系統進行封裝和調試。而在Linux生態中,由於存在多個Linux發行版和桌面環境,手勢操做很難兼容全部發行版,這就要求用戶要有較強的動手能力和理解能力。能夠說二者都能實現豐富的手勢操做,並且Linux的擴展性更強一些,可是須要更專業的知識和動手能力。

相關參考

相關文章
相關標籤/搜索