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

commit1c3202d4330a55cca43a8bae4be5158c091f8802
parentae1f0ddc35
authorLucas Galante <[email protected]>
date2026-06-30 14:47
Implement dynamic grid LOD scaling during viewport zoom

 src/server/output.rs | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/server/output.rs b/src/server/output.rs
index 4c6964e..61db63c 100644
--- a/src/server/output.rs
+++ b/src/server/output.rs
@@ -166,6 +166,7 @@ pub struct Output {
     pub last_grid_cell_corner_radius: i32,
     pub last_grid_cell_fade_inset: i64,
     pub last_grid_gap_color: String,
+    pub grid_is_low_res: bool,
 
     pub destroy: ffi::wl_listener,
     pub request_state: ffi::wl_listener,
@@ -413,6 +414,7 @@ impl Output {
             last_grid_cell_corner_radius: 0,
             last_grid_cell_fade_inset: 0,
             last_grid_gap_color: String::new(),
+            grid_is_low_res: false,
             destroy: std::mem::zeroed(),
             request_state: std::mem::zeroed(),
             frame: std::mem::zeroed(),
@@ -574,9 +576,13 @@ impl Output {
             || self.last_grid_cell_fade_inset != cell_fade_inset
             || self.last_grid_gap_color != gap_color;
 
+        let force_high_res = !structure_changed && self.grid_is_low_res;
+
         let period_pixels = period * zoom;
 
-        if structure_changed {
+        if structure_changed || force_high_res {
+            let draw_low_res = self.last_grid_zoom != zoom;
+
             // Cache current parameters (excluding pan coordinates)
             self.last_grid_viewport_w = viewport_w;
             self.last_grid_viewport_h = viewport_h;
@@ -587,6 +593,7 @@ impl Output {
             self.last_grid_cell_corner_radius = cell_corner_radius;
             self.last_grid_cell_fade_inset = cell_fade_inset;
             self.last_grid_gap_color = gap_color;
+            self.grid_is_low_res = draw_low_res;
 
             // Clear previous grid rendering
             ffi::river_scene_tree_clear_children(self.grid_tree);
@@ -650,7 +657,7 @@ impl Output {
                             }
                         }
                     } else {
-                        let step = 1;
+                        let step = if draw_low_res { 8 } else { 1 };
                         let inset_scaled = (cell_fade_inset as f64 * zoom) as i32;
 
                         // 0. Draw the cell-sized gap color background rect behind the fade layers