diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index 67afaa93b..fe2f3f3eb 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -1375,8 +1375,19 @@ is_ascii_control_char(char x) { selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange { - debug_key("\n\tsetMarkedText: %s selectedRange: (%lu, %lu) replacementRange: (%lu, %lu)\n", polymorphic_string_as_utf8(string), selectedRange.location, selectedRange.length, replacementRange.location, replacementRange.length); - if (string == nil) { [self unmarkText]; return; } + const char *s = polymorphic_string_as_utf8(string); + debug_key("\n\tsetMarkedText: %s selectedRange: (%lu, %lu) replacementRange: (%lu, %lu)\n", s, selectedRange.location, selectedRange.length, replacementRange.location, replacementRange.length); + if (string == nil || !s[0]) { + bool had_marked_text = [self hasMarkedText]; + [self unmarkText]; + if (had_marked_text && !in_key_handler) { + debug_key("clearing pre-edit because setMarkedText called from event loop\n"); + GLFWkeyevent glfw_keyevent = {.ime_state = GLFW_IME_PREEDIT_CHANGED}; + _glfwInputKeyboard(window, &glfw_keyevent); + _glfw.ns.text[0] = 0; + } + return; + } if ([string isKindOfClass:[NSAttributedString class]]) { if (((NSMutableAttributedString*)string).length == 0) { [self unmarkText]; return; } [markedText release]; diff --git a/kitty/keys.c b/kitty/keys.c index 5985182d9..4cda5e162 100644 --- a/kitty/keys.c +++ b/kitty/keys.c @@ -187,7 +187,8 @@ on_key_input(GLFWkeyevent *ev) { } } if (!w) return; - } else if (w->last_special_key_pressed == key) { + } else if (w->last_special_key_pressed == key && key != 0) { + // key == 0 is sent by the glfw coca backend when text is inserted by the IME outside the key handlers w->last_special_key_pressed = 0; debug("ignoring release event for previous press that was handled as shortcut\n"); return;