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

commit7367100cbbe7988c1d2b39a054850b06e9c84193
parent748bec89ba
authorLucas Galante <[email protected]>
date2026-06-19 17:21
fix: correctly inform client and draw borders/background when wm toggles fullscreen

 src/server/window.rs | 48 +++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 41 insertions(+), 7 deletions(-)

diff --git a/src/server/window.rs b/src/server/window.rs
index 7d47124..8857b8e 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -1180,8 +1180,26 @@ impl Window {
             ffi::wlr_foreign_toplevel_handle_v1_set_activated(self.wlr_toplevel_handle, activated);
         }
 
-        let (width, height) = if !self.wm_requested.fullscreen.is_null() {
-            let output = self.wm_requested.fullscreen;
+        let output = if !self.wm_requested.fullscreen.is_null() {
+            self.wm_requested.fullscreen
+        } else if self.is_fullscreen() {
+            let outputs_list = &mut (*self.server).om.outputs as *mut ffi::wl_list as *mut WlList;
+            let mut curr = (*outputs_list).next;
+            let mut found_output = std::ptr::null_mut();
+            while curr != outputs_list {
+                let out = crate::container_of!(curr, crate::output::Output, link);
+                if (*out).sent.state == crate::output::OutputStateValue::Enabled {
+                    found_output = out;
+                    break;
+                }
+                curr = (*curr).next;
+            }
+            found_output
+        } else {
+            std::ptr::null_mut()
+        };
+
+        let (width, height) = if !output.is_null() {
             let (w, h) = (*output).sent.dimensions();
             if self.configure_sent.width != Some(w as u32) || self.configure_sent.height != Some(h as u32) {
                 self.configure_scheduled.width = Some(w as u32);
@@ -1199,8 +1217,6 @@ impl Window {
         };
         self.wm_requested.dimensions = None;
 
-
-
         let is_maximized_layout = self.tiling_mode == crate::tiling::TilingMode::Cascade || self.tiling_mode == crate::tiling::TilingMode::Grid;
         self.configure_scheduled = Configure {
             width,
@@ -1211,7 +1227,7 @@ impl Window {
             tiled: self.wm_requested.tiled,
             capabilities: self.wm_requested.capabilities,
             maximized: self.wm_requested.maximized || is_maximized_layout,
-            inform_fullscreen: self.wm_requested.inform_fullscreen,
+            inform_fullscreen: self.wm_requested.inform_fullscreen || self.is_fullscreen(),
             resizing: self.wm_requested.resizing,
         };
 
@@ -1469,8 +1485,26 @@ impl Window {
         let mut clip = requested.clip;
         let mut content_clip = requested.content_clip;
 
-        if !self.wm_requested.fullscreen.is_null() {
-            let output = self.wm_requested.fullscreen;
+        let output = if !self.wm_requested.fullscreen.is_null() {
+            self.wm_requested.fullscreen
+        } else if self.is_fullscreen() {
+            let outputs_list = &mut (*self.server).om.outputs as *mut ffi::wl_list as *mut WlList;
+            let mut curr = (*outputs_list).next;
+            let mut found_output = std::ptr::null_mut();
+            while curr != outputs_list {
+                let out = crate::container_of!(curr, crate::output::Output, link);
+                if (*out).sent.state == crate::output::OutputStateValue::Enabled {
+                    found_output = out;
+                    break;
+                }
+                curr = (*curr).next;
+            }
+            found_output
+        } else {
+            std::ptr::null_mut()
+        };
+
+        if !output.is_null() {
             self.box_geom.x = (*output).sent.x;
             self.box_geom.y = (*output).sent.y;