From 8d96c2beedb90b4ac9fe48ae591f9fbd1e2fb88f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 9 Sep 2023 20:30:04 -0700 Subject: [PATCH] termio/exec: changing default cursor config updates at runtime --- src/termio/Exec.zig | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index 2b149c9a8..aa4627f35 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -202,6 +202,8 @@ pub fn threadEnter(self: *Exec, thread: *termio.Thread) !ThreadData { .ev = ev_data_ptr, .terminal = &self.terminal, .grid_size = &self.grid_size, + .default_cursor_style = self.default_cursor_style, + .default_cursor_blink = self.default_cursor_blink, }, }, }; @@ -271,6 +273,14 @@ pub fn changeConfig(self: *Exec, config: *DerivedConfig) !void { self.default_cursor_style = config.cursor_style; self.default_cursor_blink = config.cursor_blink; + // If we have event data, then update our active stream too + if (self.data) |data| { + data.terminal_stream.handler.changeDefaultCursor( + config.cursor_style, + config.cursor_blink, + ); + } + // Set the image size limits try self.terminal.screen.kitty_images.setLimit( self.alloc, @@ -486,10 +496,6 @@ const EventData = struct { /// this to determine if we need to default the window title. seen_title: bool = false, - /// The default cursor style used for CSI q. - default_cursor_style: terminal.Cursor.Style = .block, - default_cursor_blink: bool = true, - pub fn deinit(self: *EventData, alloc: Allocator) void { // Clear our write pools. We know we aren't ever going to do // any more IO since we stop our data stream below so we can just @@ -1130,6 +1136,12 @@ const StreamHandler = struct { /// to wake up the writer. writer_messaged: bool = false, + /// The default cursor state. This is used with CSI q. This is + /// set to true when we're currently in the default cursor state. + default_cursor: bool = true, + default_cursor_style: terminal.Cursor.Style, + default_cursor_blink: bool, + pub fn deinit(self: *StreamHandler) void { self.apc.deinit(); } @@ -1143,6 +1155,21 @@ const StreamHandler = struct { self.writer_messaged = true; } + pub fn changeDefaultCursor( + self: *StreamHandler, + style: terminal.Cursor.Style, + blink: bool, + ) void { + self.default_cursor_style = style; + self.default_cursor_blink = blink; + + // If our cursor is the default, then we update it immediately. + if (self.default_cursor) self.setCursorStyle(.default) catch |err| { + log.warn("failed to set default cursor style: {}", .{err}); + return; + }; + } + pub fn apcStart(self: *StreamHandler) !void { self.apc.start(); } @@ -1483,10 +1510,14 @@ const StreamHandler = struct { self: *StreamHandler, style: terminal.CursorStyleReq, ) !void { + // Assume we're setting to a non-default. + self.default_cursor = false; + switch (style) { .default => { - self.terminal.screen.cursor.style = self.ev.default_cursor_style; - self.terminal.modes.set(.cursor_blinking, self.ev.default_cursor_blink); + self.default_cursor = true; + self.terminal.screen.cursor.style = self.default_cursor_style; + self.terminal.modes.set(.cursor_blinking, self.default_cursor_blink); }, .blinking_block => {