From eeab85b9679920e4f23459171db8405157a589d7 Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Tue, 18 Aug 2026 23:36:13 +0200 Subject: [PATCH] terminal: clear progress bar on full reset Emit a progress_report remove effect from the full_reset arm, matching kitty and WezTerm which both clear progress on reset. Previously, only the termio StreamHandler removed the progress bar on RIS (ghostty#10178); the terminal stream handler used by libghostty-vt did not, so an embedder's progress bar would outlive the reset. Signed-off-by: Fredrik Fornwall --- src/terminal/stream_terminal.zig | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/terminal/stream_terminal.zig b/src/terminal/stream_terminal.zig index 6af1c6f8a..5b6f08b2b 100644 --- a/src/terminal/stream_terminal.zig +++ b/src/terminal/stream_terminal.zig @@ -345,7 +345,12 @@ pub const Handler = struct { }, .active_status_display => self.terminal.status_display = value, .decaln => try self.terminal.decaln(), - .full_reset => self.terminal.fullReset(), + .full_reset => { + self.terminal.fullReset(); + + // Clear the progress bar + self.progressReport(.{ .state = .remove }); + }, .start_hyperlink => try self.terminal.screens.active.startHyperlink(value.uri, value.id), .end_hyperlink => self.terminal.screens.active.endHyperlink(), .semantic_prompt => try self.terminal.semanticPrompt(value), @@ -2504,6 +2509,15 @@ test "progress_report effect callback" { try testing.expectEqual(case.state, S.last_state); try testing.expectEqual(case.progress, S.last_progress); } + + // A full reset (RIS) removes any active progress bar. + s.nextSlice("\x1B]9;4;1;50\x1B\\"); + try testing.expectEqual(@as(usize, cases.len + 1), S.count); + try testing.expectEqual(osc.Command.ProgressReport.State.set, S.last_state); + s.nextSlice("\x1Bc"); + try testing.expectEqual(@as(usize, cases.len + 2), S.count); + try testing.expectEqual(osc.Command.ProgressReport.State.remove, S.last_state); + try testing.expectEqual(@as(?u8, null), S.last_progress); } test "clipboard_write effect callback" {