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

commitbe3cc33cb7ea7d08668fbf28d4f7cbd6463d0fbc
parent24c328c562
authorLucas Galante <[email protected]>
date2026-06-24 12:55
fix: identify status bar as TilingMode::Status and block keyboard focus on it

 src/server/cursor.rs         | 14 ++++++++------
 src/server/seat.rs           |  7 +++++++
 src/server/window.rs         |  7 ++++++-
 src/server/window_manager.rs |  1 +
 4 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index 379e0a7..f7909bb 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -808,13 +808,15 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
         if let Some(result) = (*server).scene.at(lx, ly) {
             match result.data {
                 SceneNodeDataVal::Window(window) => {
-                    if !seat.object.is_null() {
-                        if !(*window).object.is_null() {
-                            ffi::wl_resource_post_event(seat.object, 4, (*window).object);
-                            (*(*seat).server).wm.dirty_windowing();
+                    if !(*window).is_status_bar() {
+                        if !seat.object.is_null() {
+                            if !(*window).object.is_null() {
+                                ffi::wl_resource_post_event(seat.object, 4, (*window).object);
+                                (*(*seat).server).wm.dirty_windowing();
+                            }
+                        } else {
+                            seat.focus(Focus::Window(window));
                         }
-                    } else {
-                        seat.focus(Focus::Window(window));
                     }
                 }
                 SceneNodeDataVal::LayerSurface(_) => {
diff --git a/src/server/seat.rs b/src/server/seat.rs
index ccdba2e..606020e 100644
--- a/src/server/seat.rs
+++ b/src/server/seat.rs
@@ -300,6 +300,13 @@ impl Seat {
     }
 
     pub unsafe fn focus(&mut self, new_focus: Focus) {
+        if let Focus::Window(window) = new_focus {
+            if !window.is_null() && (*window).is_status_bar() {
+                log::info!("[FocusDebug] Seat::focus blocking focus to status bar window");
+                return;
+            }
+        }
+
         if self.focused == new_focus {
             return;
         }
diff --git a/src/server/window.rs b/src/server/window.rs
index 435fc8b..4bfc7af 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -672,7 +672,9 @@ impl Window {
             false
         };
 
-        if !is_status_bar {
+        if is_status_bar {
+            self.tiling_mode = crate::tiling::TilingMode::Status;
+        } else {
             let seats = &mut (*self.server).input_manager.seats as *mut ffi::wl_list as *mut WlList;
             let mut curr = (*seats).next;
             while curr != seats {
@@ -1401,6 +1403,9 @@ impl Window {
 
     pub unsafe fn notify_app_id(&mut self) {
         self.wm_scheduled.dirty_app_id = true;
+        if self.get_app_id_string().as_deref() == Some("cce-status-interface") {
+            self.tiling_mode = crate::tiling::TilingMode::Status;
+        }
         self.try_restore();
         (*self.server).wm.dirty_windowing();
 
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index 2b9be44..5bf3605 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -908,6 +908,7 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
                 let is_status_bar = app_id.as_deref() == Some("cce-status-interface");
                 
                 if is_status_bar {
+                    (*win_ptr).tiling_mode = crate::tiling::TilingMode::Status;
                     let bar_h = self.layout.bar_height as u32;
                     (*win_ptr).rendering_requested.x = wlr_box.x;
                     (*win_ptr).rendering_requested.y = wlr_box.y;