給Gentoo配置了三指拖拽

2026-05-03


首先得感謝 AUR 包 libinput-three-finger-drag 的維護者 yarliepow。另外,補丁本體似乎由 Jasper van Bourgognie 編寫。AUR 上幾乎總能找到有同樣需求的別人做的包,但 Gentoo 用戶就沒這麼方便了。

雖然本人不見得是 Mac 的粉絲,但它的觸摸板的確讓我折服。所以買了 Magic Trackpad 2,在臺式機也日常使用。Mac 觸摸板的一個重要功能就是三指拖拽,我習慣後就完全離不開了。所以考慮了在運行 Gentoo Linux 的電腦上如何實現它。總結經驗,這篇文章可以讓 Gentoo 用戶直接借助這份補丁,通過 eapply_user 機制在本地復現同樣的效果。


爲什麼不用 linux-3-finger-drag

尋找三指拖拽解決方案時,linux-3-finger-drag 也常出現,但是按照個人的使用體驗,在 KDE Plasma 6 Wayland 環境下,它實際上並不好用,KWin 在 Wayland 下將三指滑動硬編碼爲切換虛擬桌面,linux-3-finger-drag 運行後,拖拽和切換桌面會同時觸發。這個衝突不好解決。

第二個坑是,如果其他程序(比如我用來控制機箱風扇的 OpenLinkHub)佔用了 /dev/uinput 的所有者,會導致工具不能寫入設備。這程序寫得也不友好,找不到 ~/.config/linux-3-finger-drag/3fd-config.json 時就直接退出,甚至不告訴我缺了哪個文件。


原理

AUR 的 libinput-three-finger-drag 包對 libinput 源碼打了一個單行補丁,將三指拖拽的默認值從 DISABLED 改爲 ENABLED_3FG。這樣 KWin 收到的就是拖拽事件而不是滑動事件,不會觸發三指切換桌面。

在 Gentoo 上,利用 eapply_user 機制可以做到不修改官方 ebuild,自動在每次編譯 libinput 時打上這個補丁。


初次配置

1. 建立補丁目錄

sudo mkdir -p /etc/portage/patches/dev-libs/libinput

2. 下載補丁

sudo curl -s "https://aur.archlinux.org/cgit/aur.git/plain/0001-enable-3fg-drag-by-default.patch?h=libinput-three-finger-drag" \
  -o /etc/portage/patches/dev-libs/libinput/0001-enable-3fg-drag-by-default.patch

3. 確認補丁內容正確

補丁應該是這樣的單行修改:

-       return LIBINPUT_CONFIG_3FG_DRAG_DISABLED;
+       return LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG;

驗證:

cat /etc/portage/patches/dev-libs/libinput/0001-enable-3fg-drag-by-default.patch

4. 重新編譯 libinput

sudo emerge --ask dev-libs/libinput

看到 [ebuild R] 表示重新編譯。這是正確的。

5. 重新登錄

重新登錄讓新的 libinput 生效。

6. 確認三指拖拽工作

在觸控板上用三指滑動,應該能拖拽窗口和選取文字,不會觸發桌面切換。


確認補丁是否成功打入

確認編譯時輸出的補丁信息

重新編譯時,emerge 輸出裡應該會看到類似:

>>> Applying /etc/portage/patches/dev-libs/libinput/0001-enable-3fg-drag-by-default.patch ...

或者用 strings 確認二進制文件

strings /usr/lib64/libinput.so* | grep -i "3fg\|three.*finger\|drag"

應該能看到 GESTURE_STATE_3FG_DRAG_START 之類的字樣,這表示功能存在。

再或者直接拖一拖

用三指在觸控板上滑動,應該能拖拽。


libinput 更新後的跟進維護

如果更新順利,補丁自動打入

emerge --update @world 更新 libinput 時,Portage 會自動嘗試打上補丁。如果補丁成功,不需要額外操作。

如果更新時沒打進去

如果 libinput 更新後 emerge 報錯,類似:

patch: **** Can't open patch file...

Hunk FAILED

說明 libinput 的源碼在補丁涉及的區域有變動,需要手動更新補丁。

處理步驟:

  1. 先臨時移除補丁讓 libinput 更新成功:
sudo mv /etc/portage/patches/dev-libs/libinput/0001-enable-3fg-drag-by-default.patch \
  ~/backups/0001-enable-3fg-drag-by-default.patch.bak
sudo emerge dev-libs/libinput
  1. 查看 AUR 包是否有更新的補丁:
curl -s "https://aur.archlinux.org/cgit/aur.git/plain/0001-enable-3fg-drag-by-default.patch?h=libinput-three-finger-drag"
  1. 如果 AUR 已經更新,就下載新補丁:
sudo curl -s "https://aur.archlinux.org/cgit/aur.git/plain/0001-enable-3fg-drag-by-default.patch?h=libinput-three-finger-drag" \
  -o /etc/portage/patches/dev-libs/libinput/0001-enable-3fg-drag-by-default.patch
sudo emerge dev-libs/libinput
  1. 如果 AUR 尚未更新,手動修改補丁:

找到新版本源碼中對應的函數:

grep -n "3fg_drag_default\|3FG_DRAG_DISABLED" /usr/src/debug/dev-libs/libinput-*/src/evdev-mt-touchpad-gestures.c

或直接查看已下載的源碼(在 /var/tmp/portage/dev-libs/libinput-*/work/ 裏)。

修改補丁的上下文讓它匹配新版本的代碼,然後重新 emerge。

定期檢查 AUR 包版本

AUR 的 libinput-three-finger-drag 包版本號和 libinput 同步。可以定期確認:

# 查看已安裝的 libinput 版本
emerge -s dev-libs/libinput | grep "Latest version installed"

# 查看 AUR 包對應的 libinput 版本。看 pkgver 那行
curl -s "https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=libinput-three-finger-drag" | grep pkgver

如果兩者版本一致,補丁通常可以直接用。


注意事項

cp /etc/portage/patches/dev-libs/libinput/0001-enable-3fg-drag-by-default.patch \
  ~/backups/