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 也常出現,但是按照個人的使用體驗,在 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 時打上這個補丁。
sudo mkdir -p /etc/portage/patches/dev-libs/libinput
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
補丁應該是這樣的單行修改:
- 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
sudo emerge --ask dev-libs/libinput
看到 [ebuild R] 表示重新編譯。這是正確的。
重新登錄讓新的 libinput 生效。
在觸控板上用三指滑動,應該能拖拽窗口和選取文字,不會觸發桌面切換。
重新編譯時,emerge 輸出裡應該會看到類似:
>>> Applying /etc/portage/patches/dev-libs/libinput/0001-enable-3fg-drag-by-default.patch ...
strings /usr/lib64/libinput.so* | grep -i "3fg\|three.*finger\|drag"
應該能看到 GESTURE_STATE_3FG_DRAG_START 之類的字樣,這表示功能存在。
用三指在觸控板上滑動,應該能拖拽。
emerge --update @world 更新 libinput 時,Portage 會自動嘗試打上補丁。如果補丁成功,不需要額外操作。
如果 libinput 更新後 emerge 報錯,類似:
patch: **** Can't open patch file...
或
Hunk FAILED
說明 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
curl -s "https://aur.archlinux.org/cgit/aur.git/plain/0001-enable-3fg-drag-by-default.patch?h=libinput-three-finger-drag"
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
找到新版本源碼中對應的函數:
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 的 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
如果兩者版本一致,補丁通常可以直接用。
/etc/portage/patches/<category>/<package>/ 目錄下,Portage 在編譯時會自動應用,不需要修改 ebuild。~/backups/。cp /etc/portage/patches/dev-libs/libinput/0001-enable-3fg-drag-by-default.patch \
~/backups/