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