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