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

commit1f0329eb626e5fbe5b42ac40a137484a261e7048
parent82e5ee5b36
authorLucas Galante <[email protected]>
date2026-06-30 14:54
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();
             }
         }