From 3b9d5d27adce1f48b14ffb329c00ae1fe4bee38a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 28 Aug 2023 08:50:11 -0700 Subject: [PATCH] terminal: implement DECRQM (request mode) --- src/terminal/stream.zig | 29 +++++++++++++++++++++++++++++ src/termio/Exec.zig | 21 +++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index 4e3774e4d..57dc801b7 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -569,6 +569,35 @@ pub fn Stream(comptime Handler: type) type { ), }, + // DECRQM - Request Mode + 'p' => switch (action.intermediates.len) { + 2 => decrqm: { + if (action.intermediates[0] != '?' and + action.intermediates[1] != '$') + { + log.warn( + "ignoring unimplemented CSI p with intermediates: {s}", + .{action.intermediates}, + ); + break :decrqm; + } + + if (action.params.len != 1) { + log.warn("invalid DECRQM command: {}", .{action}); + break :decrqm; + } + + if (@hasDecl(T, "requestMode")) { + try self.handler.requestMode(action.params[0]); + } else log.warn("unimplemented DECRQM callback: {}", .{action}); + }, + + else => log.warn( + "ignoring unimplemented CSI p with intermediates: {s}", + .{action.intermediates}, + ), + }, + // DECSCUSR - Select Cursor Style // TODO: test 'q' => if (@hasDecl(T, "setCursorStyle")) try self.handler.setCursorStyle( diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index 35a74c837..16a90a87e 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -1267,6 +1267,27 @@ const StreamHandler = struct { } } + pub fn requestMode(self: *StreamHandler, mode_raw: u16) !void { + // Get the mode value and respond. + const code: u8 = code: { + if (!terminal.modes.hasSupport(mode_raw)) break :code 0; + if (self.terminal.modes.get(@enumFromInt(mode_raw))) break :code 1; + break :code 2; + }; + + var msg: termio.Message = .{ .write_small = .{} }; + const resp = try std.fmt.bufPrint( + &msg.write_small.data, + "\x1B[?{};{}$y", + .{ + mode_raw, + code, + }, + ); + msg.write_small.len = @intCast(resp.len); + self.messageWriter(msg); + } + pub fn saveMode(self: *StreamHandler, mode: terminal.Mode) !void { // log.debug("save mode={}", .{mode}); self.terminal.modes.save(mode);