From 5561aa1d3745403f1929d2e48bf2a1efc50bb1d8 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 28 Nov 2021 22:53:45 +0530 Subject: [PATCH] Allow forcing IME update --- kitty/fast_data_types.pyi | 2 +- kitty/screen.c | 2 +- kitty/state.c | 12 +++++++----- kitty/state.h | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/kitty/fast_data_types.pyi b/kitty/fast_data_types.pyi index 3d00f8a66..5bcda0e06 100644 --- a/kitty/fast_data_types.pyi +++ b/kitty/fast_data_types.pyi @@ -1336,5 +1336,5 @@ def set_os_window_title(os_window_id: int, title: str) -> None: pass -def update_ime_position_for_window(window_id: int) -> bool: +def update_ime_position_for_window(window_id: int, force: bool = False) -> bool: pass diff --git a/kitty/screen.c b/kitty/screen.c index dd4c890f7..fe942ff91 100644 --- a/kitty/screen.c +++ b/kitty/screen.c @@ -763,7 +763,7 @@ restore_overlay_line(struct SaveOverlayLine *sol) { debug("Received input from child (%s) while overlay active. Overlay contents: %s\n", sol->func_name, PyUnicode_AsUTF8(sol->overlay_text)); screen_draw_overlay_text(sol->screen, PyUnicode_AsUTF8(sol->overlay_text)); Py_DECREF(sol->overlay_text); - update_ime_position_for_window(sol->screen->window_id); + update_ime_position_for_window(sol->screen->window_id, false); } } diff --git a/kitty/state.c b/kitty/state.c index 782b2b897..8a1a22154 100644 --- a/kitty/state.c +++ b/kitty/state.c @@ -570,7 +570,7 @@ send_pending_click_to_window_id(id_type timer_id UNUSED, void *data) { } bool -update_ime_position_for_window(id_type window_id) { +update_ime_position_for_window(id_type window_id, bool force) { for (size_t o = 0; o < global_state.num_os_windows; o++) { OSWindow *osw = global_state.os_windows + o; for (size_t t = 0; t < osw->num_tabs; t++) { @@ -578,13 +578,14 @@ update_ime_position_for_window(id_type window_id) { for (size_t w = 0; w < qtab->num_windows; w++) { Window *window = qtab->windows + w; if (window->id == window_id) { - if (window->render_data.screen && osw->is_focused) { + if (window->render_data.screen && (force || osw->is_focused)) { OSWindow *orig = global_state.callback_os_window; global_state.callback_os_window = osw; update_ime_position(window, window->render_data.screen); global_state.callback_os_window = orig; + return true; } - return true; + return false; } } } @@ -618,8 +619,9 @@ update_ime_position_for_window(id_type window_id) { PYWRAP1(update_ime_position_for_window) { id_type window_id; - PA("K", &window_id); - if (update_ime_position_for_window(window_id)) Py_RETURN_TRUE; + int force = 0; + PA("K|p", &window_id, &force); + if (update_ime_position_for_window(window_id, force)) Py_RETURN_TRUE; Py_RETURN_FALSE; } diff --git a/kitty/state.h b/kitty/state.h index dbe7ea932..b002a0d1e 100644 --- a/kitty/state.h +++ b/kitty/state.h @@ -323,4 +323,4 @@ bool draw_window_title(OSWindow *window, const char *text, color_type fg, color_ uint8_t* draw_single_ascii_char(const char ch, size_t *result_width, size_t *result_height); bool is_os_window_fullscreen(OSWindow *); void update_ime_position(Window* w, Screen *screen); -bool update_ime_position_for_window(id_type window_id); +bool update_ime_position_for_window(id_type window_id, bool force);