From 03fd649b5e21d0299146db47470972a5130e7da6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 25 Jun 2023 09:53:58 -0700 Subject: [PATCH] terminal: CHT/CBT --- src/terminal/stream.zig | 26 +++++++++++++++++++++++++- src/termio/Exec.zig | 16 ++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index e78b3f457..3b6b9b06b 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -92,7 +92,7 @@ pub fn Stream(comptime Handler: type) type { log.warn("unimplemented execute: {x}", .{c}), .HT => if (@hasDecl(T, "horizontalTab")) - try self.handler.horizontalTab() + try self.handler.horizontalTab(1) else log.warn("unimplemented execute: {x}", .{c}), @@ -205,6 +205,18 @@ pub fn Stream(comptime Handler: type) type { else => log.warn("invalid CUP command: {}", .{action}), } else log.warn("unimplemented CSI callback: {}", .{action}), + // CHT - Cursor Horizontal Tabulation + 'I' => if (@hasDecl(T, "horizontalTab")) try self.handler.horizontalTab( + switch (action.params.len) { + 0 => 1, + 1 => action.params[0], + else => { + log.warn("invalid horizontal tab command: {}", .{action}); + return; + }, + }, + ) else log.warn("unimplemented CSI callback: {}", .{action}), + // Erase Display // TODO: test 'J' => if (@hasDecl(T, "eraseDisplay")) try self.handler.eraseDisplay( @@ -316,6 +328,18 @@ pub fn Stream(comptime Handler: type) type { }, ) else log.warn("unimplemented CSI callback: {}", .{action}), + // CHT - Cursor Horizontal Tabulation Back + 'Z' => if (@hasDecl(T, "horizontalTabBack")) try self.handler.horizontalTabBack( + switch (action.params.len) { + 0 => 1, + 1 => action.params[0], + else => { + log.warn("invalid horizontal tab back command: {}", .{action}); + return; + }, + }, + ) else log.warn("unimplemented CSI callback: {}", .{action}), + // Repeat Previous Char (REP) 'b' => if (@hasDecl(T, "printRepeat")) try self.handler.printRepeat( switch (action.params.len) { diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index 1345d8f0d..75491dc6f 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -959,8 +959,20 @@ const StreamHandler = struct { self.terminal.backspace(); } - pub fn horizontalTab(self: *StreamHandler) !void { - try self.terminal.horizontalTab(); + pub fn horizontalTab(self: *StreamHandler, count: u16) !void { + for (0..count) |_| { + const x = self.terminal.screen.cursor.x; + try self.terminal.horizontalTab(); + if (x == self.terminal.screen.cursor.x) break; + } + } + + pub fn horizontalTabBack(self: *StreamHandler, count: u16) !void { + for (0..count) |_| { + const x = self.terminal.screen.cursor.x; + try self.terminal.horizontalTabBack(); + if (x == self.terminal.screen.cursor.x) break; + } } pub fn linefeed(self: *StreamHandler) !void {