From 96d2de8f607ee34831fa71dc96cb1dc359fe7ce1 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 25 Jun 2022 11:04:48 -0700 Subject: [PATCH] enq and cursor report with origin mode --- src/Window.zig | 20 +++++++++++++++++--- src/terminal/ansi.zig | 2 ++ src/terminal/stream.zig | 5 +++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/Window.zig b/src/Window.zig index 8f85a4b3d..fff92cb77 100644 --- a/src/Window.zig +++ b/src/Window.zig @@ -731,15 +731,25 @@ pub fn deviceStatusReport( log.warn("error queueing device attr response: {}", .{err}), .cursor_position => { - if (self.terminal.mode_origin) unreachable; // TODO + const pos: struct { + x: usize, + y: usize, + } = if (self.terminal.mode_origin) .{ + // TODO: what do we do if cursor is outside scrolling region? + .x = self.terminal.cursor.x, + .y = self.terminal.cursor.y -| self.terminal.scrolling_region.top, + } else .{ + .x = self.terminal.cursor.x, + .y = self.terminal.cursor.y, + }; // Response always is at least 4 chars, so this leaves the // remainder for the row/column as base-10 numbers. This // will support a very large terminal. var buf: [32]u8 = undefined; const resp = try std.fmt.bufPrint(&buf, "\x1B[{};{}R", .{ - self.terminal.cursor.y + 1, - self.terminal.cursor.x + 1, + pos.y + 1, + pos.x + 1, }); try self.queueWrite(resp); @@ -789,3 +799,7 @@ pub fn saveCursor(self: *Window) !void { pub fn restoreCursor(self: *Window) !void { self.terminal.restoreCursor(); } + +pub fn enquiry(self: *Window) !void { + try self.queueWrite(""); +} diff --git a/src/terminal/ansi.zig b/src/terminal/ansi.zig index 7cbd7d874..911ab182c 100644 --- a/src/terminal/ansi.zig +++ b/src/terminal/ansi.zig @@ -5,6 +5,8 @@ pub const C0 = enum(u7) { /// Null NUL = 0x00, + /// Enquiry + ENQ = 0x05, /// Bell BEL = 0x07, /// Backspace diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index b1c6161b3..834f07006 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -71,6 +71,11 @@ pub fn Stream(comptime Handler: type) type { switch (@intToEnum(ansi.C0, c)) { .NUL => {}, + .ENQ => if (@hasDecl(T, "enquiry")) + try self.handler.enquiry() + else + log.warn("unimplemented execute: {x}", .{c}), + .BEL => if (@hasDecl(T, "bell")) try self.handler.bell() else