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

commit1a15b3f815f3021310b9d7c325c27f7201a928df
parent81907e411e
authorLucas Galante <[email protected]>
date2026-06-16 20:57
feat: switch window to cascade mode on maximize and fix client maximized state notification

 src/server/window.rs          |  3 ++-
 src/server/window_manager.rs  |  3 ++-
 src/server/xdg_toplevel.rs    |  4 ++++
 src/server/xwayland_window.rs | 12 ++++++++++--
 4 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/server/window.rs b/src/server/window.rs
index 8d7cda2..5fa49d8 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -1121,6 +1121,7 @@ impl Window {
 
 
 
+        let is_cascade = (*self.server).wm.get_mode_for_window(self as *mut Window) == crate::tiling::TilingMode::Cascade;
         self.configure_scheduled = Configure {
             width,
             height,
@@ -1129,7 +1130,7 @@ impl Window {
             ssd: self.wm_requested.ssd,
             tiled: self.wm_requested.tiled,
             capabilities: self.wm_requested.capabilities,
-            maximized: self.wm_requested.maximized,
+            maximized: self.wm_requested.maximized || is_cascade,
             inform_fullscreen: self.wm_requested.inform_fullscreen,
             resizing: self.wm_requested.resizing,
         };
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index 93ab940..723d621 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -907,7 +907,8 @@ impl WindowManager {
                         width: w as u32,
                         height: h as u32,
                     };
-                    (*win_ptr).wm_requested.tiled = 1 | 2 | 4 | 8;
+                    let is_cascade = self.get_mode_for_window(win_ptr) == crate::tiling::TilingMode::Cascade;
+                    (*win_ptr).wm_requested.tiled = if is_cascade { 0 } else { 1 | 2 | 4 | 8 };
                 }
 
                 let is_focused = win_ptr == focused_window;
diff --git a/src/server/xdg_toplevel.rs b/src/server/xdg_toplevel.rs
index 5b55175..3fdaffe 100644
--- a/src/server/xdg_toplevel.rs
+++ b/src/server/xdg_toplevel.rs
@@ -537,8 +537,12 @@ unsafe extern "C" fn handle_request_maximize(listener: *mut ffi::wl_listener, _d
     let window = (*toplevel).window;
 
     if ffi::river_wlr_xdg_toplevel_get_requested_maximized((*toplevel).wlr_toplevel) {
+        (*window).tiling_mode = crate::tiling::TilingMode::Cascade;
+        (*window).mode_locked = true;
         (*window).wm_scheduled.maximize_requested = crate::window::MaximizeRequest::Maximize;
     } else {
+        (*window).tiling_mode = crate::tiling::TilingMode::Floating;
+        (*window).mode_locked = true;
         (*window).wm_scheduled.maximize_requested = crate::window::MaximizeRequest::Unmaximize;
     }
     (*(*window).server).wm.dirty_windowing();
diff --git a/src/server/xwayland_window.rs b/src/server/xwayland_window.rs
index 7df3d6e..a19cf74 100644
--- a/src/server/xwayland_window.rs
+++ b/src/server/xwayland_window.rs
@@ -552,12 +552,20 @@ unsafe extern "C" fn handle_set_decorations(listener: *mut ffi::wl_listener, _da
 unsafe extern "C" fn handle_request_maximize(listener: *mut ffi::wl_listener, _data: *mut std::ffi::c_void) {
     let xwindow = crate::container_of!(listener, XwaylandWindow, request_maximize);
     let maximized = (*(*xwindow).xsurface).maximized_vert || (*(*xwindow).xsurface).maximized_horz;
-    (*(*xwindow).window).wm_scheduled.maximize_requested = if maximized {
+    let window = (*xwindow).window;
+    if maximized {
+        (*window).tiling_mode = crate::tiling::TilingMode::Cascade;
+        (*window).mode_locked = true;
+    } else {
+        (*window).tiling_mode = crate::tiling::TilingMode::Floating;
+        (*window).mode_locked = true;
+    }
+    (*window).wm_scheduled.maximize_requested = if maximized {
         crate::window::MaximizeRequest::Maximize
     } else {
         crate::window::MaximizeRequest::Unmaximize
     };
-    (*(*(*xwindow).window).server).wm.dirty_windowing();
+    (*(*window).server).wm.dirty_windowing();
 }
 
 unsafe extern "C" fn handle_request_fullscreen(listener: *mut ffi::wl_listener, _data: *mut std::ffi::c_void) {