From 9326ae363ca32944d245ee56db824c39dd523fcb Mon Sep 17 00:00:00 2001 From: rok Date: Fri, 5 Apr 2024 03:06:50 +0900 Subject: [PATCH 1/2] input: escape can be used to clear dead key state This fixes korean input method issue on mac. When typing korean and press escape in vim, composing korean character should remain. --- src/input/KeyEncoder.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/input/KeyEncoder.zig b/src/input/KeyEncoder.zig index 9fb84f4d1..459c2491e 100644 --- a/src/input/KeyEncoder.zig +++ b/src/input/KeyEncoder.zig @@ -254,10 +254,10 @@ fn legacy( self.ignore_keypad_with_numlock, self.modify_other_keys_state_2, )) |sequence| pc_style: { - // If we're pressing enter and have UTF-8 text, we probably are + // If we're pressing enter or escape and have UTF-8 text, we probably are // clearing a dead key state. This happens specifically on macOS. // We have a unit test for this. - if (self.event.key == .enter and self.event.utf8.len > 0) { + if (self.event.key == .enter or self.event.key == .escape and self.event.utf8.len > 0) { break :pc_style; } From 0bd673435fadb429e899e2e599832ecd39635c9a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 4 Apr 2024 21:57:32 -0700 Subject: [PATCH 2/2] input: add test for esc clearing dead key state --- src/input/KeyEncoder.zig | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/input/KeyEncoder.zig b/src/input/KeyEncoder.zig index 459c2491e..26eea2907 100644 --- a/src/input/KeyEncoder.zig +++ b/src/input/KeyEncoder.zig @@ -254,10 +254,19 @@ fn legacy( self.ignore_keypad_with_numlock, self.modify_other_keys_state_2, )) |sequence| pc_style: { - // If we're pressing enter or escape and have UTF-8 text, we probably are - // clearing a dead key state. This happens specifically on macOS. + // If we're pressing enter or escape and have UTF-8 text, we probably + // are clearing a dead key state. This happens specifically on macOS. + // "Clearing" a dead key state may or may not commit the dead key + // state; this differs by language: + // + // - Japanese clears and does not write the characters. + // - Korean clears and writes the characters. + // // We have a unit test for this. - if (self.event.key == .enter or self.event.key == .escape and self.event.utf8.len > 0) { + if ((self.event.key == .enter or + self.event.key == .escape) and + self.event.utf8.len > 0) + { break :pc_style; } @@ -1649,6 +1658,20 @@ test "legacy: enter with utf8 (dead key state)" { try testing.expectEqualStrings("A", actual); } +test "legacy: esc with utf8 (dead key state)" { + var buf: [128]u8 = undefined; + var enc: KeyEncoder = .{ + .event = .{ + .key = .escape, + .utf8 = "A", + .unshifted_codepoint = 0x0D, + }, + }; + + const actual = try enc.legacy(&buf); + try testing.expectEqualStrings("A", actual); +} + test "legacy: ctrl+shift+minus (underscore on US)" { var buf: [128]u8 = undefined; var enc: KeyEncoder = .{