From 83884f42f86712c831b6164ab7fd99a94d4f732b Mon Sep 17 00:00:00 2001 From: pagedown Date: Sun, 23 Jan 2022 01:50:37 +0800 Subject: [PATCH] macOS: Fix text insertion by modifier keys when using IME --- glfw/cocoa_window.m | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index c3aee006a..c8da6aa4e 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -1152,14 +1152,14 @@ - (void)keyDown:(NSEvent *)event debug_key("\x1b[31mPress:\x1b[m native_key: 0x%x (%s) glfw_key: 0x%x %schar_count: %lu deadKeyState: %u repeat: %d ", keycode, safe_name_for_keycode(keycode), key, format_mods(mods), char_count, window->ns.deadKeyState, event.ARepeat); marked_text_cleared_by_insert = false; - in_key_handler = 1; if (process_text) { + in_key_handler = 1; // this will call insertText which will fill up _glfw.ns.text [self interpretKeyEvents:@[event]]; + in_key_handler = 0; } else { window->ns.deadKeyState = 0; } - in_key_handler = 0; if (window->ns.deadKeyState && (char_count == 0 || keycode == 0x75)) { // 0x75 is the delete key which needs to be ignored during a compose sequence debug_key("Sending pre-edit text for dead key (text: %s markedText: %s).\n", format_text(_glfw.ns.text), glfw_keyevent.text); @@ -1249,11 +1249,11 @@ - (void)flagsChanged:(NSEvent *)event in_key_handler = 2; const bool handled = [inpctx handleEvent:event]; in_key_handler = 0; - if (handled) { - if (marked_text_cleared_by_insert) { - debug_key("Clearing pre-edit text"); - CLEAR_PRE_EDIT_TEXT; - } + if (marked_text_cleared_by_insert) { + debug_key("Clearing pre-edit text"); + CLEAR_PRE_EDIT_TEXT; + } + if (handled || marked_text_cleared_by_insert) { if (_glfw.ns.text[0]) glfw_keyevent.text = _glfw.ns.text; else _glfw.ns.text[0] = old_first_char; } @@ -1479,7 +1479,7 @@ - (void)insertText:(id)string replacementRange:(NSRange)replacementRange char *s = _glfw.ns.text + strnlen(_glfw.ns.text, sizeof(_glfw.ns.text)); snprintf(s, sizeof(_glfw.ns.text) - (s - _glfw.ns.text), "%s", utf8); _glfw.ns.text[sizeof(_glfw.ns.text) - 1] = 0; - if (!in_key_handler && _glfw.ns.text[0]) { + if ((!in_key_handler || in_key_handler == 2) && _glfw.ns.text[0]) { debug_key("sending text to kitty from insertText called from event loop: %s\n", _glfw.ns.text); GLFWkeyevent glfw_keyevent = {.text=_glfw.ns.text, .ime_state=GLFW_IME_COMMIT_TEXT}; _glfwInputKeyboard(window, &glfw_keyevent);