From 26300447e48f88d3d8090cfd7aebfef8d258cbcc Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 6 May 2024 18:31:26 -0700 Subject: [PATCH 1/2] renderer/metal: reset screen dirty flags I introduced screen dirty flags fairly late, and never reset them. As a result, dirty tracking basically gets disabled as soon as selection changes in any form. This happens frequently because _unsetting_ selection also resets selection which happens for various events. --- src/renderer/Metal.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index ef6f329d9..b2a47f2f6 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -932,6 +932,7 @@ pub fn updateFrame( // success and reset while we hold the lock. This is much easier // than coordinating row by row or as changes are persisted. state.terminal.flags.dirty = .{}; + state.terminal.screen.dirty = .{}; { var it = state.terminal.screen.pages.pageIterator( .right_down, From d3abe65ad68d3a0aa0bbc81b005ff645e7d699d2 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 6 May 2024 18:35:51 -0700 Subject: [PATCH 2/2] terminal: only set selection dirty to true on clear if previously set --- src/terminal/Screen.zig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/terminal/Screen.zig b/src/terminal/Screen.zig index 304bc7cce..3ab434048 100644 --- a/src/terminal/Screen.zig +++ b/src/terminal/Screen.zig @@ -1344,9 +1344,11 @@ pub fn select(self: *Screen, sel_: ?Selection) !void { /// Same as select(null) but can't fail. pub fn clearSelection(self: *Screen) void { - if (self.selection) |*sel| sel.deinit(self); + if (self.selection) |*sel| { + sel.deinit(self); + self.dirty.selection = true; + } self.selection = null; - self.dirty.selection = true; } pub const SelectionString = struct {