Use an enum for ime_state

This commit is contained in:
Kovid Goyal 2021-03-23 10:42:07 +05:30
parent 11268ffa16
commit 84dcf8fd27
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
6 changed files with 30 additions and 20 deletions

View File

@ -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);
}

11
glfw/glfw3.h vendored
View File

@ -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.

6
glfw/ibus_glfw.c vendored
View File

@ -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:

4
glfw/xkb_glfw.c vendored
View File

@ -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)

11
kitty/glfw-wrapper.h generated
View File

@ -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.

View File

@ -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__)