macOS: Fix text insertion by modifier keys when using IME

This commit is contained in:
pagedown 2022-01-23 01:50:37 +08:00
parent c0be0f74d8
commit 83884f42f8
No known key found for this signature in database
GPG Key ID: E921CF18AC8FF6EB

View File

@ -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 ", 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); keycode, safe_name_for_keycode(keycode), key, format_mods(mods), char_count, window->ns.deadKeyState, event.ARepeat);
marked_text_cleared_by_insert = false; marked_text_cleared_by_insert = false;
in_key_handler = 1;
if (process_text) { if (process_text) {
in_key_handler = 1;
// this will call insertText which will fill up _glfw.ns.text // this will call insertText which will fill up _glfw.ns.text
[self interpretKeyEvents:@[event]]; [self interpretKeyEvents:@[event]];
in_key_handler = 0;
} else { } else {
window->ns.deadKeyState = 0; window->ns.deadKeyState = 0;
} }
in_key_handler = 0;
if (window->ns.deadKeyState && (char_count == 0 || keycode == 0x75)) { if (window->ns.deadKeyState && (char_count == 0 || keycode == 0x75)) {
// 0x75 is the delete key which needs to be ignored during a compose sequence // 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); 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; in_key_handler = 2;
const bool handled = [inpctx handleEvent:event]; const bool handled = [inpctx handleEvent:event];
in_key_handler = 0; in_key_handler = 0;
if (handled) { if (marked_text_cleared_by_insert) {
if (marked_text_cleared_by_insert) { debug_key("Clearing pre-edit text");
debug_key("Clearing pre-edit text"); CLEAR_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; if (_glfw.ns.text[0]) glfw_keyevent.text = _glfw.ns.text;
else _glfw.ns.text[0] = old_first_char; 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)); 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); snprintf(s, sizeof(_glfw.ns.text) - (s - _glfw.ns.text), "%s", utf8);
_glfw.ns.text[sizeof(_glfw.ns.text) - 1] = 0; _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); 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}; GLFWkeyevent glfw_keyevent = {.text=_glfw.ns.text, .ime_state=GLFW_IME_COMMIT_TEXT};
_glfwInputKeyboard(window, &glfw_keyevent); _glfwInputKeyboard(window, &glfw_keyevent);