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 {