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

commitb2468f7c203c3cb1d4bfe8ad076b79de5e84ed25
parent4055b1d3d4
authorLucas Galante <[email protected]>
date2026-06-24 22:20
Fix window centering bug when zooming back from zoomed out state

 src/server/cursor.rs         | 14 +++++++-------
 src/server/window_manager.rs |  2 ++
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index fab8ddb..e24c1d3 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -575,11 +575,6 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
             }
 
             if !clicked_win.is_null() && !(*clicked_win).is_status_bar() {
-                seat.focus(Focus::Window(clicked_win));
-                if !seat.object.is_null() && !(*clicked_win).object.is_null() {
-                    ffi::wl_resource_post_event(seat.object, 4, (*clicked_win).object);
-                }
-
                 let mut viewport_w = 1920.0;
                 let mut viewport_h = 1080.0;
                 let outputs_list = &mut (*server).om.outputs as *mut ffi::wl_list as *mut WlList;
@@ -595,17 +590,22 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
                     curr_out = (*curr_out).next;
                 }
 
-                (*server).wm.desk_zoom = 1.0;
-
                 let win_w = if (*clicked_win).box_geom.width > 0 { (*clicked_win).box_geom.width as f64 } else { 800.0 };
                 let win_h = if (*clicked_win).box_geom.height > 0 { (*clicked_win).box_geom.height as f64 } else { 600.0 };
 
                 let center_x = (*clicked_win).virtual_x + win_w / 2.0;
                 let center_y = (*clicked_win).virtual_y + win_h / 2.0;
 
+                (*server).wm.desk_zoom = 1.0;
                 (*server).wm.desk_pan_x = center_x - viewport_w / 2.0;
                 (*server).wm.desk_pan_y = center_y - viewport_h / 2.0;
 
+                seat.focus(Focus::Window(clicked_win));
+                if !seat.object.is_null() && !(*clicked_win).object.is_null() {
+                    ffi::wl_resource_post_event(seat.object, 4, (*clicked_win).object);
+                }
+
+                (*server).wm.stop_panning_animation();
                 (*server).wm.dirty_windowing();
 
                 cursor.pressed.insert((*event).button, None);
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index 497ddab..7cb72eb 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -1647,6 +1647,7 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
                                 self.desk_zoom = 1.0;
                                 self.desk_pan_x = center_x - viewport_w / 2.0;
                                 self.desk_pan_y = center_y - viewport_h / 2.0;
+                                self.stop_panning_animation();
                                 self.dirty_windowing();
                                 return;
                             }
@@ -1655,6 +1656,7 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
                     self.desk_zoom = 1.0;
                     self.desk_pan_x = 0.0;
                     self.desk_pan_y = 0.0;
+                    self.stop_panning_animation();
                     self.dirty_windowing();
                 } else {
                     let mut min_vx = f64::MAX;