git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitc006fa1057872fed5a9dc6f0467b00d2b10c33ee
parent9871cc8d48
authorLucas Galante <[email protected]>
date2026-06-26 14:35
Ensure trackpad panning persists when pointer moves over windows

 src/server/cursor.rs | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index b1e609d..1d4e9cd 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -46,6 +46,7 @@ pub struct Cursor {
     pub gesture_dy: f64,
     pub gesture_scale: f64,
     pub gesture_triggered: bool,
+    pub panning_gesture_active: bool,
 }
 
 impl Default for Cursor {
@@ -89,6 +90,7 @@ impl Default for Cursor {
             gesture_dy: 0.0,
             gesture_scale: 1.0,
             gesture_triggered: false,
+            panning_gesture_active: false,
         }
     }
 }
@@ -1029,7 +1031,21 @@ unsafe extern "C" fn handle_axis(listener: *mut ffi::wl_listener, data: *mut std
     };
     let is_overview = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview;
 
-    if (modifiers & 0x40) != 0 || is_on_background || is_overview {
+    let is_finger = (*event).source == ffi::wl_pointer_axis_source_WL_POINTER_AXIS_SOURCE_FINGER
+        || (*event).source == ffi::wl_pointer_axis_source_WL_POINTER_AXIS_SOURCE_CONTINUOUS;
+
+    let mut was_panning = cursor.panning_gesture_active;
+
+    if is_finger {
+        if delta == 0.0 {
+            cursor.panning_gesture_active = false;
+        } else if !cursor.panning_gesture_active && (is_on_background || is_overview) {
+            cursor.panning_gesture_active = true;
+            was_panning = true;
+        }
+    }
+
+    if (modifiers & 0x40) != 0 || is_on_background || is_overview || was_panning {
         let wm = &mut (*seat.server).wm;
         wm.stop_panning_animation();
         let step = delta / wm.desk_zoom;