Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
Introduce render_viewport_update fast-path to bypass expensive redraw logic during pan/zoom
src/server/window.rs | 18 ++++++++++++++++++
src/server/window_manager.rs | 2 +-
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/src/server/window.rs b/src/server/window.rs
index b782d0a..01ee937 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -1831,6 +1831,24 @@ impl Window {
}
}
+ pub unsafe fn render_viewport_update(&mut self) {
+ let requested = &self.rendering_requested;
+ let enabled = !requested.hidden && (matches!(self.state, WindowState::Mapped) || matches!(self.state, WindowState::Closing));
+
+ ffi::wlr_scene_node_set_enabled(self.tree as *mut ffi::wlr_scene_node, enabled);
+ ffi::wlr_scene_node_set_enabled(self.popup_tree as *mut ffi::wlr_scene_node, enabled);
+
+ if enabled {
+ self.box_geom.x = requested.x;
+ self.box_geom.y = requested.y;
+ 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);
+
+ self.scale_only_render_finish();
+ self.draw_borders();
+ }
+ }
+
pub unsafe fn draw_borders(&mut self) {
let requested = &self.rendering_requested;
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index bed6464..0a08107 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -1396,7 +1396,7 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
for &window in self.windows.iter() {
if !window.is_null() {
- (*window).render_finish();
+ (*window).render_viewport_update();
}
}