macOS: Improve handling of IME extended input

Compose characters are now highlighted and the IME panel moves along with the text

Fixes #1586
Fixes #1461
This commit is contained in:
Kovid Goyal 2019-05-03 13:30:56 +05:30
parent e36e44ab3a
commit f0c663d42d
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 13 additions and 1 deletions

View File

@ -37,6 +37,11 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
- Make live resizing of OS windows smoother and show the size in cells - Make live resizing of OS windows smoother and show the size in cells
while the resize is in progress. while the resize is in progress.
- macOS: Improve handling of IME extended input. Compose characters
are now highlighted and the IME panel moves along with the text
(:pull:`1586`). Also fixes handling of delete key in Chinese IME
(:iss:`1461`)
- When a window is closed, switch focus to the previously active window (if - When a window is closed, switch focus to the previously active window (if
any) instead of picking the previous window in the layout (:iss:`1450`) any) instead of picking the previous window in the layout (:iss:`1450`)

View File

@ -831,6 +831,7 @@ is_ascii_control_char(char x) {
} else { } else {
static UniChar text[256]; static UniChar text[256];
UniCharCount char_count = 0; UniCharCount char_count = 0;
const bool in_compose_sequence = window->ns.deadKeyState != 0;
if (UCKeyTranslate( if (UCKeyTranslate(
[(NSData*) _glfw.ns.unicodeData bytes], [(NSData*) _glfw.ns.unicodeData bytes],
scancode, scancode,
@ -856,8 +857,14 @@ is_ascii_control_char(char x) {
} }
if (window->ns.deadKeyState && (char_count == 0 || scancode == 0x75)) { if (window->ns.deadKeyState && (char_count == 0 || scancode == 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(@"Ignoring dead key (text: %s).\n", format_text(_glfw.ns.text)); debug_key(@"Sending pre-edit text for dead key (text: %s markedText: %@).\n", format_text(_glfw.ns.text), markedText);
_glfwInputKeyboard(window, key, scancode, GLFW_PRESS, mods,
[[markedText string] UTF8String], 1); // update pre-edit text
return; return;
} else if (in_compose_sequence) {
debug_key(@"Clearing pre-edit text at end of compose sequence\n");
_glfwInputKeyboard(window, key, scancode, GLFW_PRESS, mods,
NULL, 1); // clear pre-edit text
} }
} }
if (is_ascii_control_char(_glfw.ns.text[0])) _glfw.ns.text[0] = 0; // don't send text for ascii control codes if (is_ascii_control_char(_glfw.ns.text[0])) _glfw.ns.text[0] = 0; // don't send text for ascii control codes