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

commit60c098626eb07051f30f5b4ad30c87a948603340
parentb2468f7c20
authorLucas Galante <[email protected]>
date2026-06-24 22:22
Support focusing hovered window during swipe-back gesture when zoomed out

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

diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index e24c1d3..2382d6a 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -1209,6 +1209,24 @@ unsafe extern "C" fn handle_swipe_update(listener: *mut ffi::wl_listener, data:
     if matched_action != crate::config::Action::None {
         log::info!("Swipe gesture matched action: {:?}", matched_action);
         cursor.gesture_triggered = true;
+
+        if matched_action == crate::config::Action::Expose && (*seat.server).wm.desk_zoom < 0.999 {
+            let lx = cursor.x();
+            let ly = cursor.y();
+            let mut hovered_win: *mut crate::window::Window = std::ptr::null_mut();
+            if let Some(result) = (*seat.server).scene.at(lx, ly) {
+                if let SceneNodeDataVal::Window(window) = result.data {
+                    hovered_win = window;
+                }
+            }
+            if !hovered_win.is_null() && !(*hovered_win).is_status_bar() {
+                seat.focus(Focus::Window(hovered_win));
+                if !seat.object.is_null() && !(*hovered_win).object.is_null() {
+                    ffi::wl_resource_post_event(seat.object, 4, (*hovered_win).object);
+                }
+            }
+        }
+
         (*seat.server).wm.execute_action(&matched_action, matched_command.as_deref());
 
         let pointer_gestures = (*seat.server).input_manager.pointer_gestures;