diff --git a/docs/architecture.md b/docs/architecture.md index 35b4707..fdac98a 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -40,6 +40,8 @@ Architect is a terminal multiplexer displaying interactive sessions in a grid wi 8. Calls `renderer.render` for the scene, then `ui.render` for overlays, then presents. 9. Sleeps based on idle/active frame targets (~16ms active, ~50ms idle). +`SessionState.dirty` is set on terminal updates and cleared after a successful render (cached grid or full view). When collapsing from full view to grid, the focused session is marked dirty so its cache refreshes before idle throttling resumes. + **Terminal resizing** - `applyTerminalResize` updates the PTY size first, then resizes the `ghostty-vt` terminal. - The VT stream stays alive; only its handler is refreshed to repoint at the resized terminal, preserving parser state and preventing in-flight escape sequences from being misparsed. diff --git a/src/main.zig b/src/main.zig index f9465a7..67fac9a 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1321,11 +1321,16 @@ pub fn main() !void { anim_state.mode == .PanningUp or anim_state.mode == .PanningDown) { if (anim_state.isComplete(now)) { - anim_state.mode = switch (anim_state.mode) { + const previous_mode = anim_state.mode; + const next_mode = switch (anim_state.mode) { .Expanding, .PanningLeft, .PanningRight, .PanningUp, .PanningDown => .Full, .Collapsing => .Grid, else => anim_state.mode, }; + anim_state.mode = next_mode; + if (previous_mode == .Collapsing and next_mode == .Grid and anim_state.focused_session < sessions.len) { + sessions[anim_state.focused_session].dirty = true; + } std.debug.print("Animation complete, new mode: {s}\n", .{@tagName(anim_state.mode)}); } } diff --git a/src/render/renderer.zig b/src/render/renderer.zig index b88cf11..4de53dc 100644 --- a/src/render/renderer.zig +++ b/src/render/renderer.zig @@ -154,6 +154,7 @@ fn renderSession( ) RenderError!void { try renderSessionContent(renderer, session, rect, scale, is_focused, font, term_cols, term_rows, theme); renderSessionOverlays(renderer, session, rect, is_focused, apply_effects, current_time_ms, is_grid_view, theme); + session.dirty = false; } fn renderSessionContent(