Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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) {