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

commit354bb167f8c36e471bc2ab88e4f4ac9d13a795b8
parentea1901b09f
authorLucas Galante <[email protected]>
date2026-07-04 14:46
Keep backdrop blur enabled on cce-data-editor during active pan/zoom

 src/server/window.rs | 44 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/src/server/window.rs b/src/server/window.rs
index a25b0b2..b5b43f6 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -1972,8 +1972,48 @@ impl Window {
             ffi::river_scene_node_set_position_if_changed(self.tree as *mut ffi::wlr_scene_node, self.box_geom.x, self.box_geom.y);
             ffi::river_scene_node_set_position_if_changed(self.popup_tree as *mut ffi::wlr_scene_node, self.box_geom.x, self.box_geom.y);
 
-            // Disable backdrop blur during active viewport zoom/pan for maximum performance
-            ffi::river_scene_node_enable_blur(self.tree as *mut ffi::wlr_scene_node, false, (*self.server).wm.layout.scenefx_optimized_blur, true, 0, 0, 0, 0);
+            // Disable backdrop blur during active viewport zoom/pan for maximum performance,
+            // EXCEPT for the data editor window (app_id: "cce-data-editor") which we want to keep blurred.
+            let app_id = self.get_app_id_string().unwrap_or_default();
+            if app_id.starts_with("cce-data-editor") {
+                let is_status = self.tiling_mode == crate::tiling::TilingMode::Status ||
+                                app_id.starts_with("cce-status");
+                let is_cce_app = app_id.starts_with("cce-");
+                let blur_enabled = requested.blur && (self.wm_requested.ssd || is_cce_app || 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;
+                }
+                let use_optimized = if is_status { false } else { (*self.server).wm.layout.scenefx_optimized_blur };
+                let toplevel_w = match self.impl_type {
+                    WindowImpl::Toplevel(toplevel) => {
+                        if toplevel.is_null() { 0 } else { (*toplevel).geometry.width }
+                    }
+                    _ => 0,
+                };
+                let toplevel_h = match self.impl_type {
+                    WindowImpl::Toplevel(toplevel) => {
+                        if toplevel.is_null() { 0 } else { (*toplevel).geometry.height }
+                    }
+                    _ => 0,
+                };
+                let actual_w = if self.rendering_sent.width > 0 { self.rendering_sent.width } else { toplevel_w as u32 };
+                let actual_h = if self.rendering_sent.height > 0 { self.rendering_sent.height } else { toplevel_h as u32 };
+                let width = (actual_w as f64 * self.scale) as i32;
+                let height = (actual_h as f64 * self.scale) as i32;
+                ffi::river_scene_node_enable_blur(
+                    self.tree as *mut ffi::wlr_scene_node,
+                    blur_enabled,
+                    use_optimized,
+                    ignore_transparent,
+                    0,
+                    0,
+                    width,
+                    height,
+                );
+            } else {
+                ffi::river_scene_node_enable_blur(self.tree as *mut ffi::wlr_scene_node, false, (*self.server).wm.layout.scenefx_optimized_blur, true, 0, 0, 0, 0);
+            }
 
             self.scale_only_render_finish();
             self.draw_borders();