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