diff --git a/docs/changelog.rst b/docs/changelog.rst index 27b539111..bfb931d8e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -27,6 +27,8 @@ Changelog - macOS: Fix drag and drop of files not working on mojave (:iss:`1058`) +- macOS: Fix IME input for east asian languages (:iss:`910`) + - Fix expansion of env vars not working in the :opt:`env` directive (:iss:`1075`) diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index 2531308db..4011193cb 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -833,28 +833,22 @@ is_ascii_control_char(char x) { window->ns.deadKeyState = 0; return; } + debug_key(@"scancode: 0x%x (%s) %schar_count: %lu deadKeyState: %u ", scancode, safe_name_for_scancode(scancode), format_mods(mods), char_count, window->ns.deadKeyState); if (process_text) { - // We check if cocoa wants to insert text, as UCKeyTranslate - // inserts text even when the cmd key is pressed. For instance, - // cmd+a will result in the text a. + // this will call insertText which will fill up _glfw.ns.text [self interpretKeyEvents:[NSArray arrayWithObject:event]]; - debug_key(@"char_count: %lu cocoa text: %s\n", char_count, format_text(_glfw.ns.text)); - GLFWbool cocoa_wants_to_insert_text = !is_ascii_control_char(_glfw.ns.text[0]); - _glfw.ns.text[0] = 0; - if (char_count && cocoa_wants_to_insert_text) convert_utf16_to_utf8(text, char_count, _glfw.ns.text, sizeof(_glfw.ns.text)); } else { window->ns.deadKeyState = 0; } - if (window->ns.deadKeyState && char_count == 0) { - debug_key(@"Ignoring dead key. deadKeyState: 0x%x scancode: 0x%x (%s) %s\n", - window->ns.deadKeyState, scancode, safe_name_for_scancode(scancode), format_mods(mods)); + if (window->ns.deadKeyState && (char_count == 0 || scancode == 0x75)) { + // 0x75 is the delete key which needs to be ignored during a compose sequence + debug_key(@"Ignoring dead key.\n"); return; } } - debug_key(@"scancode: 0x%x (%s) %stext: %s glfw_key: %s\n", - scancode, safe_name_for_scancode(scancode), format_mods(mods), - format_text(_glfw.ns.text), _glfwGetKeyName(key)); if (is_ascii_control_char(_glfw.ns.text[0])) _glfw.ns.text[0] = 0; // don't send text for ascii control codes + debug_key(@"text: %s glfw_key: %s\n", + format_text(_glfw.ns.text), _glfwGetKeyName(key)); _glfwInputKeyboard(window, key, scancode, GLFW_PRESS, mods, _glfw.ns.text, 0); }