From 92e98d34b57577637927afca80635c588d762644 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 21 Sep 2023 08:21:32 -0700 Subject: [PATCH] terminal: CSI E and F --- src/terminal/stream.zig | 28 ++++++++++++++++++++++++++++ src/termio/Exec.zig | 6 ++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index 585e49212..739768b7c 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -163,6 +163,7 @@ pub fn Stream(comptime Handler: type) type { return; }, }, + false, ) else log.warn("unimplemented CSI callback: {}", .{action}), // CUD - Cursor Down @@ -175,6 +176,7 @@ pub fn Stream(comptime Handler: type) type { return; }, }, + false, ) else log.warn("unimplemented CSI callback: {}", .{action}), // CUF - Cursor Right @@ -201,6 +203,32 @@ pub fn Stream(comptime Handler: type) type { }, ) else log.warn("unimplemented CSI callback: {}", .{action}), + // CNL - Cursor Next Line + 'E' => if (@hasDecl(T, "setCursorDown")) try self.handler.setCursorDown( + switch (action.params.len) { + 0 => 1, + 1 => action.params[0], + else => { + log.warn("invalid cursor up command: {}", .{action}); + return; + }, + }, + true, + ) else log.warn("unimplemented CSI callback: {}", .{action}), + + // CPL - Cursor Previous Line + 'F' => if (@hasDecl(T, "setCursorUp")) try self.handler.setCursorUp( + switch (action.params.len) { + 0 => 1, + 1 => action.params[0], + else => { + log.warn("invalid cursor down command: {}", .{action}); + return; + }, + }, + true, + ) else log.warn("unimplemented CSI callback: {}", .{action}), + // HPA - Cursor Horizontal Position Absolute // TODO: test 'G', '`' => if (@hasDecl(T, "setCursorCol")) switch (action.params.len) { diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index 742e4eef1..096e4918b 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -1277,12 +1277,14 @@ const StreamHandler = struct { self.terminal.cursorRight(amount); } - pub fn setCursorDown(self: *StreamHandler, amount: u16) !void { + pub fn setCursorDown(self: *StreamHandler, amount: u16, carriage: bool) !void { self.terminal.cursorDown(amount); + if (carriage) self.terminal.carriageReturn(); } - pub fn setCursorUp(self: *StreamHandler, amount: u16) !void { + pub fn setCursorUp(self: *StreamHandler, amount: u16, carriage: bool) !void { self.terminal.cursorUp(amount); + if (carriage) self.terminal.carriageReturn(); } pub fn setCursorCol(self: *StreamHandler, col: u16) !void {