From 7457b40a4528e98f6fba3a6c17bba1c93418b679 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 15 Nov 2023 09:53:51 -0800 Subject: [PATCH] renderer/metal: handle preedit wider than our screen --- src/renderer/Metal.zig | 3 +-- src/renderer/State.zig | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 8e8cc0e97..5bc0520eb 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -1101,10 +1101,9 @@ fn rebuildCells( y: usize, x: [2]usize, } = if (preedit) |preedit_v| preedit: { - var x = screen.cursor.x; break :preedit .{ .y = screen.cursor.y, - .x = .{ x, x + preedit_v.width() }, + .x = preedit_v.range(screen.cursor.x, screen.cols - 1), }; } else null; diff --git a/src/renderer/State.zig b/src/renderer/State.zig index efe29ecb9..57b54365d 100644 --- a/src/renderer/State.zig +++ b/src/renderer/State.zig @@ -48,4 +48,12 @@ pub const Preedit = struct { return result; } + + pub fn range(self: *const Preedit, start: usize, max: usize) [2]usize { + // If our preedit goes off the end of the screen, we adjust it so + // that it shifts left. + const end = start + self.width(); + const offset = if (end > max) end - max else 0; + return .{ start -| offset, end -| offset }; + } };