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

commit71e3f20cb92a811e9485dfe9ecce4453714990e3
parent62eeba5f61
authorLucas Galante <[email protected]>
date2026-07-02 19:19
Fix status bar flickering during viewport panning and optimize backdrop blur

 src/server/server.rs         |  1 -
 src/server/window.rs         | 11 +++++++----
 src/server/window_manager.rs |  2 ++
 src/server/xdg_toplevel.rs   | 17 +++++------------
 4 files changed, 14 insertions(+), 17 deletions(-)

diff --git a/src/server/server.rs b/src/server/server.rs
index f7f831f..bad0aa4 100644
--- a/src/server/server.rs
+++ b/src/server/server.rs
@@ -165,7 +165,6 @@ pub struct WlrXwayland {
     pub own_server: bool,
     pub xwm: *mut std::ffi::c_void,
     pub shell_v1: *mut std::ffi::c_void,
-    pub cursor: *mut std::ffi::c_void,
     pub display_name: *const std::os::raw::c_char,
     pub wl_display: *mut ffi::wl_display,
     pub compositor: *mut ffi::wlr_compositor,
diff --git a/src/server/window.rs b/src/server/window.rs
index d16e1ea..a51a988 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -1560,11 +1560,11 @@ impl Window {
         ffi::wlr_scene_node_set_enabled(self.popup_tree as *mut ffi::wlr_scene_node, enabled);
 
         if enabled {
-            let blur_enabled = requested.blur;
             let app_id = self.get_app_id_string().unwrap_or_default();
-            let mut ignore_transparent = (*self.server).wm.layout.window_backdrop_blur_ignore_transparent;
             let is_status = self.tiling_mode == crate::tiling::TilingMode::Status ||
                             app_id.starts_with("cce-status");
+            let blur_enabled = requested.blur && (self.wm_requested.ssd || is_status);
+            let mut ignore_transparent = (*self.server).wm.layout.window_backdrop_blur_ignore_transparent;
             if is_status {
                 ignore_transparent = (*self.server).wm.layout.status_backdrop_blur_ignore_transparent;
             }
@@ -2843,10 +2843,13 @@ impl Decoration {
         let server = (*self.window).server;
         let app_id = (*self.window).get_app_id_string().unwrap_or_default();
         let mut ignore_transparent = (*server).wm.layout.window_backdrop_blur_ignore_transparent;
-        if app_id.starts_with("cce-status") {
+        let is_status = (*self.window).tiling_mode == crate::tiling::TilingMode::Status ||
+                        app_id.starts_with("cce-status");
+        if is_status {
             ignore_transparent = (*server).wm.layout.status_backdrop_blur_ignore_transparent;
         }
-        ffi::river_scene_node_enable_blur(self.surfaces.tree as *mut ffi::wlr_scene_node, self.rendering_requested.blur, (*server).wm.layout.scenefx_optimized_blur, ignore_transparent, 0, 0, 0, 0);
+        let blur_enabled = self.rendering_requested.blur && ((*self.window).wm_requested.ssd || is_status);
+        ffi::river_scene_node_enable_blur(self.surfaces.tree as *mut ffi::wlr_scene_node, blur_enabled, (*server).wm.layout.scenefx_optimized_blur, ignore_transparent, 0, 0, 0, 0);
 
         let scale = (*self.window).scale;
         let scaled_x = (self.rendering_requested.offset_x as f64 * scale) as i32;
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index a1ab414..cb4e382 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -815,6 +815,8 @@ impl WindowManager {
                                 (*self.server).scene.layers.fullscreen
                             } else if (*window).tiling_mode == crate::tiling::TilingMode::Popup {
                                 (*self.server).scene.layers.popups
+                            } else if (*window).tiling_mode == crate::tiling::TilingMode::Status {
+                                (*self.server).scene.layers.top
                             } else if (*window).rendering_requested.circular {
                                 (*self.server).scene.layers.top
                             } else if (*window).tiling_mode == crate::tiling::TilingMode::Overlay && self.layout.overlay_behavior == "above" {
diff --git a/src/server/xdg_toplevel.rs b/src/server/xdg_toplevel.rs
index 0a7ca16..4293a5d 100644
--- a/src/server/xdg_toplevel.rs
+++ b/src/server/xdg_toplevel.rs
@@ -433,17 +433,9 @@ unsafe extern "C" fn handle_commit(listener: *mut ffi::wl_listener, _data: *mut
     let toplevel = crate::container_of!(listener, XdgToplevel, commit);
     let window = (*toplevel).window;
     let base = ffi::river_wlr_xdg_toplevel_get_base((*toplevel).wlr_toplevel);
-    let surface = ffi::river_wlr_xdg_surface_get_surface(base);
-    let committed_w = ffi::river_wlr_surface_get_width(surface);
-    let committed_h = ffi::river_wlr_surface_get_height(surface);
-    if committed_w > 0 && committed_h > 0 {
-        (*toplevel).geometry.width = committed_w;
-        (*toplevel).geometry.height = committed_h;
-    } else {
-        let mut new_geometry = std::mem::zeroed();
-        ffi::river_wlr_xdg_surface_get_geometry(base, &mut new_geometry);
-        (*toplevel).geometry = new_geometry;
-    }
+    let mut new_geometry = std::mem::zeroed();
+    ffi::river_wlr_xdg_surface_get_geometry(base, &mut new_geometry);
+    (*toplevel).geometry = new_geometry;
 
     let app_id = (*window).get_app_id_string().unwrap_or_default();
     let mut ignore_transparent = (*(*window).server).wm.layout.window_backdrop_blur_ignore_transparent;
@@ -458,9 +450,10 @@ unsafe extern "C" fn handle_commit(listener: *mut ffi::wl_listener, _data: *mut
     let is_status = (*window).tiling_mode == crate::tiling::TilingMode::Status || 
                     app_id.starts_with("cce-status");
     let use_optimized = if is_status { false } else { (*(*window).server).wm.layout.scenefx_optimized_blur };
+    let blur_enabled = (*window).rendering_requested.blur && ((*window).wm_requested.ssd || is_status);
     ffi::river_scene_node_enable_blur(
         (*window).tree as *mut ffi::wlr_scene_node,
-        (*window).rendering_requested.blur,
+        blur_enabled,
         use_optimized,
         ignore_transparent,
         0,