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

commit748bec89ba0e3d6a51887be66fab0d686c9c23d9
parent5ad068fdd0
authorLucas Galante <[email protected]>
date2026-06-19 17:18
feat: implement Status tiling mode for status bar windows and fix fullscreen reporting

 src/server/config.rs         | 1 +
 src/server/cursor.rs         | 8 +++++---
 src/server/tiling.rs         | 2 ++
 src/server/window.rs         | 9 +++++++--
 src/server/window_manager.rs | 8 ++++----
 5 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/server/config.rs b/src/server/config.rs
index 378dcd0..d8402d3 100644
--- a/src/server/config.rs
+++ b/src/server/config.rs
@@ -403,6 +403,7 @@ pub fn parse_tiling_mode(s: &str) -> TilingMode {
         "popup" => TilingMode::Popup,
         "sidepanel" | "side_panel" | "side-panel" => TilingMode::SidePanel,
         "expose" => TilingMode::Expose,
+        "status" => TilingMode::Status,
         _ => TilingMode::Cascade,
     }
 }
diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index 675ba0c..2c013fc 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -468,6 +468,7 @@ impl Cursor {
 
                 if (*window).tiling_mode != crate::tiling::TilingMode::Popup
                     && (*window).tiling_mode != crate::tiling::TilingMode::Fullscreen
+                    && (*window).tiling_mode != crate::tiling::TilingMode::Status
                     && !(*server).wm.expose_active
                 {
                     match get_border_zone(window, lx, ly) {
@@ -585,7 +586,7 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
             (*server).wm.expose_active = false;
             log::info!("Expose mode exited via left click");
 
-            if !clicked_win.is_null() {
+            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);
@@ -637,7 +638,7 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
                 }
             }
             
-            if !target_win.is_null() {
+            if !target_win.is_null() && !(*target_win).is_status_bar() {
                 if (*target_win).tiling_mode != crate::tiling::TilingMode::Floating
                     && (*target_win).tiling_mode != crate::tiling::TilingMode::Popup
                     && (*target_win).tiling_mode != crate::tiling::TilingMode::Fullscreen
@@ -700,7 +701,7 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
             }
         }
 
-        if !border_target_win.is_null() && (
+        if !border_target_win.is_null() && !(*border_target_win).is_status_bar() && (
             (*border_target_win).tiling_mode != crate::tiling::TilingMode::Popup
             && (*border_target_win).tiling_mode != crate::tiling::TilingMode::Fullscreen
         ) {
@@ -1385,6 +1386,7 @@ pub unsafe fn get_border_zone(window: *mut crate::window::Window, lx: f64, ly: f
     }
     if (*window).tiling_mode == crate::tiling::TilingMode::Popup
         || (*window).tiling_mode == crate::tiling::TilingMode::Fullscreen
+        || (*window).tiling_mode == crate::tiling::TilingMode::Status
     {
         return BorderZone::None;
     }
diff --git a/src/server/tiling.rs b/src/server/tiling.rs
index c287093..74f4339 100644
--- a/src/server/tiling.rs
+++ b/src/server/tiling.rs
@@ -9,6 +9,7 @@ pub enum TilingMode {
     Popup,
     SidePanel,
     Expose,
+    Status,
 }
 
 impl TilingMode {
@@ -21,6 +22,7 @@ impl TilingMode {
             TilingMode::Popup => "Popup",
             TilingMode::SidePanel => "Side Panel",
             TilingMode::Expose => "Expose",
+            TilingMode::Status => "Status",
         }
     }
 }
diff --git a/src/server/window.rs b/src/server/window.rs
index 642356a..7d47124 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -271,6 +271,10 @@ impl Window {
             || !self.wm_requested.fullscreen.is_null()
     }
 
+    pub unsafe fn is_status_bar(&self) -> bool {
+        self.get_app_id_string().as_deref() == Some("cce-status-interface")
+    }
+
 
     pub unsafe fn create(impl_type: WindowImpl, server: *mut Server) -> Result<*mut Self, &'static str> {
         let hidden_tree = (*server).scene.hidden_tree;
@@ -741,7 +745,7 @@ impl Window {
     pub unsafe fn set_dimensions_hint(&mut self, hint: DimensionsHint) {
         self.wm_scheduled.dimensions_hint = hint;
         if self.wm_sent.dimensions_hint != hint {
-            if matches!(self.tiling_mode, crate::tiling::TilingMode::Floating | crate::tiling::TilingMode::Popup) {
+            if matches!(self.tiling_mode, crate::tiling::TilingMode::Floating | crate::tiling::TilingMode::Popup | crate::tiling::TilingMode::Status) {
                 (*self.server).wm.dirty_windowing();
             } else {
                 self.wm_sent.dimensions_hint = hint;
@@ -1513,7 +1517,8 @@ impl Window {
                     // For tiled CSD windows, do not shift the surfaces tree
                     if !self.wm_requested.ssd &&
                        self.tiling_mode != crate::tiling::TilingMode::Floating &&
-                       self.tiling_mode != crate::tiling::TilingMode::Popup {
+                       self.tiling_mode != crate::tiling::TilingMode::Popup &&
+                       self.tiling_mode != crate::tiling::TilingMode::Status {
                         x = 0;
                         y = 0;
                     }
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index c4ae0fd..2ff7aad 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -571,10 +571,10 @@ impl WindowManager {
     }
 
     pub unsafe fn get_mode_for_window(&self, win: *mut Window) -> crate::tiling::TilingMode {
-        let app_id = (*win).get_app_id_string();
-        if app_id.as_deref() == Some("cce-status-interface") {
-            return crate::tiling::TilingMode::Fullscreen;
+        if (*win).is_status_bar() {
+            return crate::tiling::TilingMode::Status;
         }
+        let app_id = (*win).get_app_id_string();
         if app_id.as_deref() == Some("cce-notification-daemon") || app_id.as_deref() == Some("clear-notification-daemon") {
             return crate::tiling::TilingMode::Popup;
         }
@@ -766,7 +766,7 @@ impl WindowManager {
                     continue;
                 }
 
-                if mode == crate::tiling::TilingMode::Floating || mode == crate::tiling::TilingMode::Popup {
+                if mode == crate::tiling::TilingMode::Floating || mode == crate::tiling::TilingMode::Popup || mode == crate::tiling::TilingMode::Status {
                     floating_windows.push(win_ptr);
                 } else if mode == crate::tiling::TilingMode::SidePanel {
                     side_panel_windows.push(win_ptr);