From 84dcf8fd272f438c104449c474dcb4b0a042f410 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 23 Mar 2021 10:42:07 +0530 Subject: [PATCH] Use an enum for ime_state --- glfw/cocoa_window.m | 12 ++++++------ glfw/glfw3.h | 11 ++++++++--- glfw/ibus_glfw.c | 6 +++--- glfw/xkb_glfw.c | 4 ++-- kitty/glfw-wrapper.h | 11 ++++++++--- kitty/keys.c | 6 +++--- 6 files changed, 30 insertions(+), 20 deletions(-) diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index b319e5060..45734e747 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -1073,7 +1073,7 @@ is_ascii_control_char(char x) { if (input_source_changed) { debug_key(@"Input source changed, clearing pre-edit text and resetting deadkey state\n"); glfw_keyevent.text = NULL; - glfw_keyevent.ime_state = 1; + glfw_keyevent.ime_state = GLFW_IME_PREEDIT_CHANGED; window->ns.deadKeyState = 0; _glfwInputKeyboard(window, &glfw_keyevent); // clear pre-edit text } @@ -1110,14 +1110,14 @@ is_ascii_control_char(char x) { // 0x75 is the delete key which needs to be ignored during a compose sequence debug_key(@"Sending pre-edit text for dead key (text: %@ markedText: %@).\n", @(format_text(_glfw.ns.text)), markedText); glfw_keyevent.text = [[markedText string] UTF8String]; - glfw_keyevent.ime_state = 1; + glfw_keyevent.ime_state = GLFW_IME_PREEDIT_CHANGED; _glfwInputKeyboard(window, &glfw_keyevent); // update pre-edit text return; } if (in_compose_sequence) { debug_key(@"Clearing pre-edit text at end of compose sequence\n"); glfw_keyevent.text = NULL; - glfw_keyevent.ime_state = 1; + glfw_keyevent.ime_state = GLFW_IME_PREEDIT_CHANGED; _glfwInputKeyboard(window, &glfw_keyevent); // clear pre-edit text } } @@ -1127,11 +1127,11 @@ is_ascii_control_char(char x) { if (!window->ns.deadKeyState) { if ([self hasMarkedText]) { glfw_keyevent.text = [[markedText string] UTF8String]; - glfw_keyevent.ime_state = 1; + glfw_keyevent.ime_state = GLFW_IME_PREEDIT_CHANGED; _glfwInputKeyboard(window, &glfw_keyevent); // update pre-edit text } else if (previous_has_marked_text) { glfw_keyevent.text = NULL; - glfw_keyevent.ime_state = 1; + glfw_keyevent.ime_state = GLFW_IME_PREEDIT_CHANGED; _glfwInputKeyboard(window, &glfw_keyevent); // clear pre-edit text } if (([self hasMarkedText] || previous_has_marked_text) && !_glfw.ns.text[0]) { @@ -1140,7 +1140,7 @@ is_ascii_control_char(char x) { } } glfw_keyevent.text = _glfw.ns.text; - glfw_keyevent.ime_state = 0; + glfw_keyevent.ime_state = GLFW_IME_NONE; add_alternate_keys(&glfw_keyevent, event); _glfwInputKeyboard(window, &glfw_keyevent); } diff --git a/glfw/glfw3.h b/glfw/glfw3.h index e7ee09fda..cbfa60830 100644 --- a/glfw/glfw3.h +++ b/glfw/glfw3.h @@ -1184,6 +1184,11 @@ typedef enum { GLFW_PRESS = 1, GLFW_REPEAT = 2 } GLFWKeyAction; +typedef enum { + GLFW_IME_NONE, + GLFW_IME_PREEDIT_CHANGED, + GLFW_IME_COMMIT_TEXT +} GLFWIMEState; typedef struct GLFWkeyevent { @@ -1203,9 +1208,9 @@ typedef struct GLFWkeyevent const char *text; // Used for Input Method events. Zero for normal key events. - // A value of 1 means the pre-edit text for the input event has been changed. - // A value of 2 means the text should be committed. - int ime_state; + // A value of GLFW_IME_PREEDIT_CHANGED means the pre-edit text for the input event has been changed. + // A value of GLFW_IME_COMMIT_TEXT means the text should be committed. + GLFWIMEState ime_state; } GLFWkeyevent; /*! @brief The function pointer type for error callbacks. diff --git a/glfw/ibus_glfw.c b/glfw/ibus_glfw.c index 83b0f4ac8..0e36fcd5d 100644 --- a/glfw/ibus_glfw.c +++ b/glfw/ibus_glfw.c @@ -107,7 +107,7 @@ get_ibus_text_from_message(DBusMessage *msg) { } static inline void -send_text(const char *text, int ime_state) { +send_text(const char *text, GLFWIMEState ime_state) { _GLFWwindow *w = _glfwFocusedWindow(); if (w && w->callbacks.keyboard) { GLFWkeyevent fake_ev = {.action = GLFW_PRESS}; @@ -130,11 +130,11 @@ message_handler(DBusConnection *conn UNUSED, DBusMessage *msg, void *user_data) case 0: text = get_ibus_text_from_message(msg); debug("IBUS: CommitText: '%s'\n", text ? text : "(nil)"); - send_text(text, 2); + send_text(text, GLFW_IME_COMMIT_TEXT); break; case 1: text = get_ibus_text_from_message(msg); - send_text(text, 1); + send_text(text, GLFW_IME_PREEDIT_CHANGED); debug("IBUS: UpdatePreeditText: '%s'\n", text ? text : "(nil)"); break; case 2: diff --git a/glfw/xkb_glfw.c b/glfw/xkb_glfw.c index 21a2018a5..314f10eb0 100644 --- a/glfw/xkb_glfw.c +++ b/glfw/xkb_glfw.c @@ -575,7 +575,7 @@ glfw_xkb_key_from_ime(_GLFWIBUSKeyEvent *ev, bool handled_by_ime, bool failed) { if (failed && window && window->callbacks.keyboard) { // notify application to remove any existing pre-edit text GLFWkeyevent fake_ev = {.action = GLFW_PRESS}; - fake_ev.ime_state = 1; + fake_ev.ime_state = GLFW_IME_PREEDIT_CHANGED; window->callbacks.keyboard((GLFWwindow*) window, &fake_ev); } static xkb_keycode_t last_handled_press_keycode = 0; @@ -594,7 +594,7 @@ glfw_xkb_key_from_ime(_GLFWIBUSKeyEvent *ev, bool handled_by_ime, bool failed) { format_mods(ev->glfw_ev.mods), ev->glfw_ev.text ); - ev->glfw_ev.ime_state = 0; + ev->glfw_ev.ime_state = GLFW_IME_NONE; _glfwInputKeyboard(window, &ev->glfw_ev); } else debug("↳ discarded\n"); if (!is_release && handled_by_ime) diff --git a/kitty/glfw-wrapper.h b/kitty/glfw-wrapper.h index 797085bc2..bcb40a0bc 100644 --- a/kitty/glfw-wrapper.h +++ b/kitty/glfw-wrapper.h @@ -922,6 +922,11 @@ typedef enum { GLFW_PRESS = 1, GLFW_REPEAT = 2 } GLFWKeyAction; +typedef enum { + GLFW_IME_NONE, + GLFW_IME_PREEDIT_CHANGED, + GLFW_IME_COMMIT_TEXT +} GLFWIMEState; typedef struct GLFWkeyevent { @@ -941,9 +946,9 @@ typedef struct GLFWkeyevent const char *text; // Used for Input Method events. Zero for normal key events. - // A value of 1 means the pre-edit text for the input event has been changed. - // A value of 2 means the text should be committed. - int ime_state; + // A value of GLFW_IME_PREEDIT_CHANGED means the pre-edit text for the input event has been changed. + // A value of GLFW_IME_COMMIT_TEXT means the text should be committed. + GLFWIMEState ime_state; } GLFWkeyevent; /*! @brief The function pointer type for error callbacks. diff --git a/kitty/keys.c b/kitty/keys.c index 11be2dcb6..f958b51f4 100644 --- a/kitty/keys.c +++ b/kitty/keys.c @@ -105,19 +105,19 @@ on_key_input(GLFWkeyevent *ev) { id_type active_window_id = w->id; switch(ev->ime_state) { - case 1: // update pre-edit text + case GLFW_IME_PREEDIT_CHANGED: update_ime_position(global_state.callback_os_window, w, screen); screen_draw_overlay_text(screen, text); debug("updated pre-edit text: '%s'\n", text); return; - case 2: // commit text + case GLFW_IME_COMMIT_TEXT: if (*text) { schedule_write_to_child(w->id, 1, text, strlen(text)); debug("committed pre-edit text: %s\n", text); } else debug("committed pre-edit text: (null)\n"); screen_draw_overlay_text(screen, NULL); return; - case 0: + case GLFW_IME_NONE: // for macOS, update ime position on every key input // because the position is required before next input #if defined(__APPLE__)