diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index 246acce4b..4c0c765bb 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -1322,6 +1322,20 @@ pub fn setScrollingRegion(self: *Terminal, top: usize, bottom: usize) void { self.setCursorPos(1, 1); } +/// Full reset +pub fn fullReset(self: *Terminal) void { + self.primaryScreen(.{}); + self.selection = null; + self.charset = .{}; + self.eraseDisplay(.scrollback); + self.eraseDisplay(.complete); + self.modes = .{}; + self.tabstops.reset(0); + self.screen.cursor = .{}; + self.screen.saved_cursor = .{}; + self.scrolling_region = .{ .top = 0, .bottom = self.rows - 1 }; +} + test "Terminal: input with no control characters" { var t = try init(testing.allocator, 80, 80); defer t.deinit(testing.allocator); diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index 085d78964..4bf7c6d53 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -567,6 +567,15 @@ pub fn Stream(comptime Handler: type) type { }, } else log.warn("unimplemented invokeCharset: {}", .{action}), + // RIS - Full Reset + 'c' => if (@hasDecl(T, "fullReset")) switch (action.intermediates.len) { + 0 => try self.handler.fullReset(), + else => { + log.warn("invalid full reset command: {}", .{action}); + return; + }, + } else log.warn("unimplemented ESC callback: {}", .{action}), + // LS2 - Locking Shift 2 'n' => if (@hasDecl(T, "invokeCharset")) switch (action.intermediates.len) { 0 => try self.handler.invokeCharset(.GL, .G2, false), diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index 66c632408..77085fa93 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -767,4 +767,10 @@ const StreamHandler = struct { ) !void { self.terminal.invokeCharset(active, slot, single); } + + pub fn fullReset( + self: *StreamHandler, + ) !void { + self.terminal.fullReset(); + } };