git.lucas.co / cce-status-interface
status bar
git clone https://git.lucas.co/cce-status-interface.git

commitbf5b95f3877d8c9870097fac72ff4eda84947528
parentfc727d0d31
authorLucas Galante <[email protected]>
date2026-08-10 00:31
fix: dedup viewport pushes on parsed content, not the raw payload

The raw viewport text embeds live camera pan/zoom, so during a camera
animation every push differed as a string while parsing to identical
tabs — the window module rebuilt (and the compositor re-baked blur)
per animation frame, flickering the mode text until the camera
settled. Compare the parsed result instead.

Co-Authored-By: Claude Fable 5 <[email protected]>

 src/main.rs | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/main.rs b/src/main.rs
index 59745ca..de6ab44 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1275,7 +1275,15 @@ impl cce_ui::engine::Application for StatusApp {
         let mut changed = true;
         match msg {
             CustomEvent::ViewportUpdated(t) => {
-                changed = self.viewport != t;
+                // Dedup on the PARSED tabs, not the raw payload: the raw
+                // text embeds live camera pan/zoom numbers, so a camera
+                // animation re-delivers a string that differs every frame
+                // while the rendered viewport content is identical — raw
+                // comparison made the whole segment rebuild (and the
+                // compositor re-bake its blur) per animation frame, which
+                // reads as the module flickering until the camera settles.
+                changed = self.viewport != t
+                    && parse_viewport_text(&t) != parse_viewport_text(&self.viewport);
                 self.viewport = t;
             }
             CustomEvent::LayoutUpdated(l) => {