From fe6ba027091a7247a0ad21240560d5d100f00f31 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 26 Aug 2022 14:59:44 -0700 Subject: [PATCH] sgr pixels mouse report format --- src/Window.zig | 15 ++++++++++++++- src/terminal/Terminal.zig | 2 -- src/terminal/ansi.zig | 3 +++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Window.zig b/src/Window.zig index 6a7c0f042..46e043027 100644 --- a/src/Window.zig +++ b/src/Window.zig @@ -933,7 +933,19 @@ fn mouseReport( try self.queueWrite(resp); }, - else => @panic("TODO"), + .sgr_pixels => { + // Response always is at least 4 chars, so this leaves the + // remainder for numbers which are very large... + var buf: [32]u8 = undefined; + const resp = try std.fmt.bufPrint(&buf, "\x1B[<{d};{d};{d}{c}", .{ + button_code, + pos.xpos, + pos.ypos, + @as(u8, if (action == .release) 'm' else 'M'), + }); + + try self.queueWrite(resp); + }, } } @@ -1513,6 +1525,7 @@ pub fn setMode(self: *Window, mode: terminal.Mode, enabled: bool) !void { .mouse_format_utf8 => self.terminal.modes.mouse_format = if (enabled) .utf8 else .x10, .mouse_format_sgr => self.terminal.modes.mouse_format = if (enabled) .sgr else .x10, .mouse_format_urxvt => self.terminal.modes.mouse_format = if (enabled) .urxvt else .x10, + .mouse_format_sgr_pixels => self.terminal.modes.mouse_format = if (enabled) .sgr_pixels else .x10, else => if (enabled) log.warn("unimplemented mode: {}", .{mode}), } diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index c17172683..0433ed553 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -96,8 +96,6 @@ pub const MouseFormat = enum(u3) { utf8 = 1, // 1005 sgr = 2, // 1006 urxvt = 3, // 1015 - - // TODO: sgr_pixels = 4, // 1016 }; diff --git a/src/terminal/ansi.zig b/src/terminal/ansi.zig index 31bbcd8cd..bb2a962e8 100644 --- a/src/terminal/ansi.zig +++ b/src/terminal/ansi.zig @@ -89,6 +89,9 @@ pub const Mode = enum(u16) { /// Report mouse position in the urxvt format. mouse_format_urxvt = 1015, + /// Report mouse position in the SGR format as pixels, instead of cells. + mouse_format_sgr_pixels = 1016, + /// Alternate screen mode with save cursor and clear on enter. alt_screen_save_cursor_clear_enter = 1049,