libinput
來自libinput wiki 項目
- libinput 是一個函數庫,在 Wayland 上用來接收設備的輸入,在 X.Org 上提供輸入設備的驅動。它提供對設備事件的檢測和接收。對輸入設備信號進行處理。它提供了一些列的函數供用戶使用。
需要注意的是, X.Org 輸入驅動為大多數常規輸入設備提供了支持,libinput 項目的目標是為觸摸板和觸控螢幕的觸摸功能(如多點觸控、手勢等)提供高級支持。詳情請參見 libinput 文檔。
安裝
Libinput 通常作為依賴,已隨圖形界面一同安裝,因此無需手動安裝。
- 在 Wayland 系統中,libinput包 包是所有 Wayland 圖形環境的依賴包並且已經安裝,不需要其它的輸入驅動。
- 在 Xorg 系統中,xf86-input-libinput包 包也是默認依賴。這個軟體包是 libinput 的一個包裝(wrapper),能夠使 libinput 用於 X 上的輸入設備,可以作為 evdev 和 synaptics 的替代品 [1]。代替其他用於 X 輸入的軟體包(即以
xf86-input-為前綴的軟體包)。 -
libinput-tools包軟體包帶有
libinput命令,無論使用哪種顯示伺服器,都可以用它來調試函數庫與硬體之間的交互。
配置
Wayland 上沒有關於 libinput 的配置文件。相關配置由用戶使用的桌面環境對 libinput 的支持情況決定(參見#圖形工具部分),或者使用與桌面環境無關的 udev 規則來實現(參見 Calibrating Touchscreen#Do it automatically via a udev rule和#使用 udev 規則)。
如果要自定義設備的行為(例如攔截和修改傳遞給 libinput 的事件流),還可以參考 libinput 插件系統。
對於 Xorg, 默認的配置文件安裝在 /usr/share/X11/xorg.conf.d/40-libinput.conf。一般沒有必要使用額外的配置文件來檢測鍵盤、觸摸板、指點杆(小紅點)和觸控螢幕。
使用 xinput
首先,執行:
# libinput list-devices
這將會輸出系統中的設備和它們被 libinput 支持的具體特性。
重啟圖形環境之後,如果沒有其它驅動程序被配置為優先,設備應由具有默認配置的 libinput 管理。
參見 libinput(4) 了解可設定的常規選項和一些參數信息。xinput 工具用於查看或更改運行中的特定設備的設置。例如:
查看所有設備並確定其名稱和編號:
$ xinput list
查看 device 的設置
(在下文中,device 表示要操作的設備的名稱或編號):
$ xinput list-props device
修改 device 的某項設置:
$ xinput set-prop device option setting
上文中 option 既可以是設置項的名稱,也可以是其對應編號。
例如,修改「libinput Click Method Enabled (303)」項目的兩個值,可以使用以下命令:
$ xinput set-prop 14 303 {1 1}
或者
$ xinput set-prop 14 "libinput Click Method Enabled" 1 1
使用 Xorg 配置文件
參見 Xorg#Using .conf files 了解永久的選項設置。Logitech Marble Mouse#libinput 和#設置按鍵映射中列舉了幾個例子。
Xorg#輸入設備的替代驅動程序通常可以同時安裝。如果您打算將一個設備的驅動程序切換到 libinput,請確保沒有在 /etc/X11/xorg.conf.d/ 的配置文件中為其它驅動程序配置優先。
- 如果同時安裝了 libinput 和 synaptics 並使用其默認配置(即
/etc/X11/xorg.conf.d/中沒有屬於兩者中任一的文件),synaptics 將因其在默認安裝目錄中擁有更高的數字順序70-而獲得較高優先級。為了避免這種情況,您可以將默認的 libinput 配置文件(40-libinput.conf)符號連結到目錄搜索順序優先於70-synaptics.conf的/etc/X11/xorg.conf.d/中去取代它:
# ln -s /usr/share/X11/xorg.conf.d/40-libinput.conf /etc/X11/xorg.conf.d/40-libinput.conf
- 如果在
/etc/X11/xorg.conf.d/目錄下這兩個配置文件同時存在,libinput 的配置一定是處於較低優先級的;參見 Xorg#使用 .conf 文件。如果要禁用 libinput(並回退到較舊的驅動程序), 只需從/etc/X11/xorg.conf.d/中刪除之前創建的符號連結即可。
- 如果配置文件不起作用,請檢查非特權用戶是否擁有該文件讀取權限。
檢查哪些設備是由 libinput 管理的一種方法是查看 xorg 日誌文件。以下是一個例子:
$ grep -e "Using input driver 'libinput'" /path/to/Xorg.0.log
[ 28.799] (II) Using input driver 'libinput' for 'Power Button' [ 28.847] (II) Using input driver 'libinput' for 'Video Bus' [ 28.853] (II) Using input driver 'libinput' for 'Power Button' [ 28.860] (II) Using input driver 'libinput' for 'Sleep Button' [ 28.872] (II) Using input driver 'libinput' for 'AT Translated Set 2 keyboard' [ 28.878] (II) Using input driver 'libinput' for 'SynPS/2 Synaptics TouchPad' [ 28.886] (II) Using input driver 'libinput' for 'TPPS/2 IBM TrackPoint' [ 28.895] (II) Using input driver 'libinput' for 'ThinkPad Extra Buttons'
這是一台 /etc/X11/xorg.conf.d/ 中沒有任何配置文件的筆記本電腦,也就是說,設備是被自動檢測出來的。
當然,你可以選擇為一個設備使用替代的驅動程序,而為其它設備選擇 libinput。許多因素可能會影響到底使用哪個驅動程序。舉個例子,與 Touchpad Synaptics 相比,libinput 驅動程序能根據自己的喜好去自定義觸摸板行為的選項較少,但處理多點觸控事件的程序邏輯要多得多(例如,手掌檢測)。因此,如果你在使用某個驅動程序的時候,在硬體上遭遇了問題,那麼嘗試一下替代驅動程序是合理的。
自定義配置文件應放在 /etc/X11/xorg.conf.d/ 中,並且遵循被廣泛使用的命名模式,通常選擇 30-touchpad.conf 作為文件名。
/usr/share/X11/xorg.conf.d/40-libinput.conf 中的詳細配置以獲取指導並參考 libinput(4) 手冊頁獲取有關可用配置選項的詳細說明一個基本的配置應該遵循以下的結構:
/etc/X11/xorg.conf.d/30-touchpad.conf
Section "InputClass"
Identifier "devname"
Driver "libinput"
...
EndSection
你可以在單個配置文件中定義任意多的 Section(通常每個輸入設備只配置一個 Section)。 要配置你選擇的設備,請指定 xorg.conf(5) § INPUTCLASS SECTION 中的一個過濾器,例如:
-
MatchIsPointer "on":指點杆(小紅點) MatchIsKeyboard "on"MatchIsTouchpad "on"MatchIsTouchscreen "on"
輸入設備能夠在 CONFIGURATION 中進行配置,詳情請參閱 libinput(4) § CONFIGURATION_DETAILS。 一些常用的配置選項有:
-
Option "Tapping" "on":觸摸以點擊 -
Option "ClickMethod" "clickfinger":觸摸板不再擁有中右鍵區域的區分,與之代替的是雙指代表右鍵,三指代表中鍵。詳情請參閱libinput 文檔。 -
Option "NaturalScrolling" "true":自然滾動(反方向滾動) -
Option "ScrollMethod" "edge":邊緣滾動頁面
注意:有的功能只在特定設備中起作用,並且你可能需要重啟「X 服務」來讓功能生效。
使用 udev 規則
udev 設備管理器可用於設置設備的靜態屬性,這些 udev 屬性可以在設備剛被接入、產生 libinput 事件之前就被讀取。libinput 提供的文檔介紹了如何使用 udev 配置靜態設備。
下面的例子中選取該文檔提到的第一個硬體屬性:LIBINPUT_CALIBRATION_MATRIX,通過創建 udev 規則來校準觸控螢幕。
# libinput list-devices
該命令列印輸入設備的設備名稱(Device)和內核路徑(Kernel)。例如,內核路徑/dev/input/event0 的設備 HID 02eb:114e。
下面為該設備創建一個規則,將所有觸控螢幕輸入旋轉 270 度:
/etc/udev/rules.d/99-mytouchscreen-calibration.rules
# 將輸入旋轉 270 度
ENV{ID_USB_SERIAL}=="02eb_114e", ENV{LIBINPUT_CALIBRATION_MATRIX}="0 1 0 -1 0 1"
然後,重新加載規則並查看設備是否已經成功註冊該規則:
# udevadm info /dev/input/event0
你應該能看到該設備的 LIBINPUT_CALIBRATION_MATRIX 已被列出。
最後,重啟你的機器或 Wayland 桌面。
圖形工具
下面列出了一些圖形工具:
-
GNOME:
- 控制中心(Control center)帶有一個基礎配置頁面,詳見 GNOME#滑鼠和觸摸板。
- gnome-tweaks包 提供一些其他設置。
-
Cinnamon:
- 與 GNOME 界面相似,可更改選項更多。
-
KDE Plasma:
- 鍵盤,滑鼠和控制器可以通過系統設置(System Settings)配置。
-
MATE:
- 你可以在 MATE 的控制面板中配置滑鼠相關內容,也可以使用
mate-mouse-properties。
- 你可以在 MATE 的控制面板中配置滑鼠相關內容,也可以使用
-
Xfce
- 在 xfce4-settings包 下的「滑鼠和觸摸板(Mouse and Touchpad)」子菜單中進行配置。
提示與技巧
交換多指點擊動作
本小節以交換觸摸板的兩指點擊與三指點擊動作為例進行說明。
為了使用兩指點擊來替代三指點擊的動作,需要修改 Xorg 配置文件中 TappingButtonMap 選項。如果希望將單指、兩指、三指點擊對應的動作分別對應為左鍵、右鍵、中鍵(left/right/middle)點擊,將 TappingButtonMap 設置為 lrm 即可。若想調換兩指、三指點擊對應動作,將該選項配置為 lmr(即單指、兩指、三指點擊分別對應左鍵、中鍵、右鍵點擊)即可:
/etc/X11/xorg.conf.d/30-touchpad.conf
Section "InputClass"
Identifier "touchpad"
Driver "libinput"
MatchIsTouchpad "on"
Option "Tapping" "on"
Option "TappingButtonMap" "lmr"
EndSection
如果你的設備不是觸控板,請記得移除 MatchIsTouchpad "on" 選項,並對應修改 Identifier 選項。
設置按鍵映射
設置按鍵映射可以實現使用滑鼠側鍵替換滑鼠中鍵(滑鼠中鍵在 X11 中可以用於粘貼內容,一般為按壓滑鼠滾輪的對應按鍵)等功能。
可以通過如下命令查看按鍵映射情況:
$ xinput get-button-map device
其中 device 可以是 xinput list 命令返回的設備名或者設備ID。你可以隨意交換按鈕對應的數字並寫回。例如:
$ xinput set-button-map device 1 6 3 4 5 0 7
在上面的例子中,我們將編號為 6 的按鈕設置為了中鍵,並為原本的中鍵配置了按鍵 0 以禁用該按鍵。 關於按鍵映射的內容可以參閱 libinput(4) 的「ButtonMapping」部分。 這種修改方式在 Wayland 中同樣適用,但是需要注意的是,device 的編號與 button-map 也許互不相通。因此在 Xorg 與 Wayland 的設置並不能直接交換。
xev(包含於軟體包 xorg-xev包)來查看物理按鍵對應的邏輯按鍵編號。在列出設備時,某些設備可能會以相同的設備名被多次列出,但是他們往往對應著不同的按鍵映射,因此準確修改按鍵映射需要辨別真正需要修改按鍵映射的設備。下面是一個通過 xinitrc 來對某款滑鼠(Logitech Revolution MX)進行配置的示例:
~/.xinitrc
... for i in $(xinput list | grep "Logitech USB Receiver" | perl -n -e'/id=(\d+)/ && print "$1\n"') do if xinput get-button-map "$i" 2>/dev/null| grep -q 20; then xinput set-button-map "$i" 1 17 3 4 5 8 7 6 9 10 11 12 13 14 15 16 2 18 19 20 fi done ...
你也可以用 Xorg 配置文件實現。本例中使用的軌跡球(Trackball)帶有一個物理滾輪,沒有滾輪的設備可能需要參考 Logitech Marble Mouse 的配置。Kensington Slimblade 軌跡球的物理按鍵布局如下:
----------- |2(M)|8(S)| ----------- |1(L)|3(R)| -----------
因此,對於左手用戶,可以使用下面的配置。雖然該設備沒有「向上滾動」和「向下滾動」按鈕,但你不能在配置中禁用它們,否則某些應用程式將無法響應滾輪操作。
----------- |2(N)|8(M)| ----------- |1(R)|3(L)| -----------
/etc/X11/xorg.conf
Section "InputClass"
Identifier "Trackball"
MatchProduct "Kensington Kensington Slimblade Trackball"
MatchProduct "Trackball"
Driver "libinput"
Option "ButtonMapping" "3 0 1 4 5 6 7 8 2"
EndSection
更改觸摸板靈敏度
尋找觸摸板適合的靈敏度閾值的方法可以參考上游文檔 Debugging touchpad pressure ranges。
自定義觸摸板的按壓靈敏度可以通過「temporary local device quirks」實現,參見文檔 Device quirks。
Quirks 是一組內部API(internal API),並不保證能夠在未來版本的 libinput 中正常工作。
在libinput 1.11 到 1.12 版本中,udev規則[2] 被 .quirk文件[3]取代。
禁用設備
使用環境變量
LIBINPUT_IGNORE_DEVICE 環境變量可用於阻止特定設備的初始化(參見文檔 Ignoring specific devices),通常用於 udev 規則:
/etc/udev/rules.d/99-libinput-ignore.rules
ACTION=="add|change", device_delineation, ENV{LIBINPUT_IGNORE_DEVICE}="1"
其中 device_delineation 是使用 udev 語法描述的某個具體設備。例如,如果要禁用某個 USB 設備,設備描述應該像這樣:SUBSYSTEMS=="usb", ATTRS{idVendor}=="vendor_id", ATTRS{idProduct}=="product_id",其中具體的「id」可通過 lsusb 獲取。
新規則文件創建完成後,udev 會自動獲取更改並更新配置(參見 Udev#加載新規則),重新拔插設備即可令新規則生效。
使用 xinput
如需禁用觸摸板,需先使用命令 xinput list 獲取觸摸板名稱,之後使用命令 xinput disable name 來禁用。
- 使用設備ID來禁用設備是一種相對較為魯莽的行為,因為設備ID可能被重新分配,使用設備名稱是相對更好的選擇。
- 當設備名中包含空格時,需要使用英文引號將其包含在內。
如果希望其在系統啟動時生效,參見自動啟動的相關內容。
可以編寫相應腳本來啟用或禁用觸摸板(例如 toggle-touchpad.sh)。
手勢操作
雖然 libinput 已經能處理多點觸控事件,比如滑動和捏合的手勢操作。但部分桌面環境和窗口管理器可能還沒有支持這些功能。
libinput-gestures
對於兼容 EWMH(另見 wm-spec)的窗口管理器(WM), 可以使用 libinput-gestures 。此程序使用 libinput debug-events 從 libinput 獲取觸摸板的手勢 ,然後根據相關配置將其映射成相對應的行為。同時,此程序在 libinput 內置的識別範圍內還提供了相當多了可自定義的功能。
請安裝 libinput-gesturesAUR 以使用。
libinput-gestures 需要訪問觸控板設備。以前的做法是將用戶添加到 input 用戶組中,但更現代且安全的做法是使用 udev 規則動態地管理設備訪問權限,或是 logind、acls。
對於 udev 規則,請創建以下文件:
/etc/udev/rules.d/71-touchpad.rules
ACTION!="remove", ENV{ID_INPUT_TOUCHPAD}=="1", TAG+="uaccess"
文件名稱前的數字非常重要,設備屬性 ENV{ID_INPUT_TOUCHPAD} 可能在 70 中被重置,而對於 systemd-logind(8),uaccess 標籤(tag)需要在 73 之前添加。
用戶可使用默認的系統級別配置的手勢(滑動、捏合),也可自定義配置文件,詳情請參見 libinput-gestures 的說明文件。
如果已在使用 touchegg,請卸載 libinput-gesturesAUR 以防止可能的衝突(參見 這個問題)。
fusuma
Fusuma 是一個使用 Ruby 編寫的多點手勢識別器(multitouch gesture recognizer),可以作為 libinput-gestures 的替代品。
使用 Ruby gem 安裝 fusuma:
$ gem install fusuma
或者可以從 AUR 安裝:ruby-fusumaAUR。
除了 fusuma 模塊,還需要安裝Ruby模塊 fusuma-plugin-sendkey 或者從 xdotool包(用於 X)與 ydotool包(Wayland 和 X11 通用)中任選其一。其他可選擇的工具可以參見 Fusuma 項目說明中的 替代工具。
fusuma-plugin-sendkey 模塊同時支持 X 和 Wayland。Fusuma 安裝完成後需要在配置文件 ~/.config/fusuma/config.yml 進行配置:
~/.config/fusuma/config.yml
swipe:
3:
left:
sendkey: 'LEFTALT+RIGHT'
right:
sendkey: 'LEFTALT+LEFT'
up:
sendkey: 'LEFTALT+LEFTSHIFT+TAB'
down:
sendkey: 'LEFTALT+TAB'
pinch:
in:
sendkey: 'LEFTALT+LEFTSHIFT+TAB'
out:
sendkey: 'LEFTALT+TAB'
threshold:
swipe: 0.5
pinch: 0.2
interval:
swipe: 0.2
pinch: 0.2
適用於 xdotool 的配置:
~/.config/fusuma/config.yml
swipe:
3:
left:
command: 'xdotool key alt+Right'
right:
command: 'xdotool key alt+Left'
up:
command: 'xdotool key ctrl+shift+plus'
down:
command: 'xdotool key ctrl+minus'
pinch:
in:
command: 'xdotool key ctrl+shift+plus'
out:
command: 'xdotool key ctrl+minus'
threshold:
swipe: 0.5
pinch: 0.2
interval:
swipe: 0.2
pinch: 0.2
ydotool 適用的配置同上。
適當配置滑動閾值(swip threshold)可以避免在滾動時划過過多頁面。
需要注意的是該配置僅適用於三指滑動,並不適用於兩指滑動(參見 這裡)。
Gebaar
Gebaar 是另一個手勢識別器(gesture recognizer)。與 Fusuma 相比,Gebaar 不支持「捏」的手勢(該手勢支持已經被加入開發計劃中)和閾值配置,但是增加了四指、五指滑動手勢與斜線滑動。
Gebaar 的一份 fork 可以通過 AUR 安裝:gebaar-libinput-gitAUR,這一版本的 Gebaar 適配了「捏」的手勢以及一些其他功能。該版本當前正處於積極開發的狀態,但是配置文件與Gebaar 原始版本不兼容。
GnomeExtendedGestures
對於 GNOME 環境,可以嘗試 GnomeExtendedGestures(gnome-shell-extension-extended-gestures-gitAUR)。 使用該工具可以將三指水平和垂直滑動對應動作配置為相關 gnome-shell actions(例如切換應用視圖或在應用間切換)。
使用滑鼠按鍵實現滾動
通過配置,在按住某個滑鼠按鍵(例如左鍵或者右鍵,或者滑鼠上的其他按鍵)的同時移動滑鼠,可以實現滾動頁面的動作,這對於軌跡球之類沒有滾輪的設備十分有幫助。只需要將 ScrollMethod 配置為 button,並通過 ScrollButton 選項配置對應的按鍵即可。可以參考下面的例子:
/etc/X11/xorg.conf.d/00-mouse.conf
Section "InputClass"
Identifier "system-mouse"
MatchIsPointer "on"
Option "ScrollMethod" "button"
Option "ScrollButton" "3"
EndSection
調節滑鼠滾輪滾動速度
對某些,尤其是在 HiDPI 設備上使用的滑鼠,使用滑鼠滾輪時可能會感覺滾動速度較慢。 相關補丁還沒有合併進 libinput 項目中。另一個第三方 xf86-input-libinput 使用了這個補丁。
這個補丁為滑鼠提供了一個新屬性 libinput Scroll Distance Scale,可以通過如下方法設置這個屬性的值:
$ xinput --set-prop 'RAPOO Rapoo 2.4G Wireless Device' 'libinput Scroll Distance Scale' 2.5 2.5
上述命令中,RAPOO Rapoo 2.4G Wireless Device 是你的滑鼠在 xinput --list 輸出中展示的設備名,2.5 2.5 是縮放比例,分別對應 x 和 y 方向。
或者你可以選擇安裝 libinput-multiplierAUR 並重啟 Xorg,之後將 y 軸滾動距離配置為 6 倍:
$ echo 6 > /tmp/libinput_discrete_deltay_multiplier
這個示例展示了如何在焦點發生變化時調整滾動縮放。
打字時啟用觸摸板
默認情況下,libinput 在打字時會禁用觸摸板。這會與某些軟體產生衝突,例如 Inkscape,該軟體具有需要在按下按鍵的同時移動滑鼠的快捷鍵。一種在打字時啟用觸摸板的方法是將下面幾行添加到 /etc/X11/xorg.conf.d/30-touchpad.conf 的 InputClass 部分:
Section "InputClass"
...
Option "DisableWhileTyping" "0"
EndSection
也可以使用 Xinput 達到同樣的效果。屬性名稱可能類似於 libinput Disable While Typing Enabled。
疑難解答
當遇到 libinput 相關問題時,可以嘗試使用 libinput debug-events 進行調試,相關內容請參考 libinput-debug-events(1)。
一些輸入事件需要內核支持,查看支持的輸入事件可以安裝軟體包 evemu包,使用工具 evemu-describe 進行確認。
觸摸板在 GNOME 中無法工作
首先需要確認觸摸板的事件是否被正確地發送到 GNOME 處理,可以執行下面的命令:
$ gsettings set org.gnome.desktop.peripherals.touchpad send-events enabled
此外,GNOME 可能會重載部分行為,例如關閉輕觸點擊和強制使用自然滾動(Natural Scrolling)。
如果希望進行修改,必須使用 GNOME 的設置命令 gsettings 或者你選擇的圖形前端進行配置。
例如,如果希望為當前用戶開啟輕觸點擊(Tapping)以及關閉自然滾動(Natural Scrolling),按照下面的命令修改觸摸板的相關配置:
$ gsettings set org.gnome.desktop.peripherals.touchpad tap-to-click true $ gsettings set org.gnome.desktop.peripherals.touchpad natural-scroll false
慣性滾動在 KDE 中無法工作
該功能尚未實現,參見 KDE bug 456383。對於基於 Chromium 的瀏覽器,可以安裝 SmoothScroll 擴展作為臨時解決方案。
進入平板電腦模式後按鍵卡住
在某些平板電腦(尤其是 Lenovo Yoga 系列)上,進入平板電腦模式時按住鍵盤按鍵可能會導致該鍵一直處於觸發狀態,直到禁用平板電腦模式。有時可以通過修改 libinput 的 quirks 文件來修復此行為(參見 Issue 914)。
先找到鍵盤設備的名稱:
# libinput list-devices
... Device: AT Translated Set 2 keyboard Kernel: /dev/input/event3 Capabilities: keyboard ...
然後,創建一個覆蓋文件:
/etc/libinput/local-overrides.quirks
[Lenovo Thinkpad Yoga] MatchName=AT Translated Set 2 keyboard ModelTabletModeNoSuspend=0
ModelTabletModeNoSuspend=0會禁用導致該 bug 的行為。有關配置格式和用於選擇待配置設備的 Match 指令,請參考文檔 Device quirks。通常可以根據針對特定設備的現有 quirks 條目來創建覆蓋文件。默認的 quirks 文件位於 /usr/share/libinput/ 目錄中。
參閱
- libinput 文檔
- FOSDEM 2015 - libinput - Hans de Goede on goals and plans of the project
- Peter Hutterer's Blog - numerous posts on libinput from one of the project's hackers
- Talk by the primary libinput maintainer outlining the history and state (as of 2020) of Linux input device handling
- Blog post by the libinput maintainer outlining the rationale for libinput