From 6edb676c181d1b49a4f1b7c90fc093cc37569424 Mon Sep 17 00:00:00 2001 From: Po Lu <luangruo@yahoo.com> Date: Fri, 7 Oct 2022 18:39:17 +0800 Subject: [PATCH] Handle IM server disconnects during preedit * src/xterm.c (x_maybe_clear_preedit): New function. (xim_destroy_callback): Call that function. --- src/xterm.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/xterm.c b/src/xterm.c index 1d58e80f003..cdf99f278af 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -25511,6 +25511,39 @@ x_new_font (struct frame *f, Lisp_Object font_object, int fontset) #ifdef HAVE_X11R6 +/* If preedit text is set on F, cancel preedit, free the text, and + generate the appropriate events to cancel the preedit display. + + This is mainly useful when the connection to the IM server is + dropped during preconversion. */ + +static void +x_maybe_clear_preedit (struct frame *f) +{ + struct x_output *output; + struct input_event ie; + + output = FRAME_X_OUTPUT (f); + + if (!output->preedit_chars) + return; + + EVENT_INIT (ie); + ie.kind = PREEDIT_TEXT_EVENT; + ie.arg = Qnil; + XSETFRAME (ie.frame_or_window, f); + XSETINT (ie.x, 0); + XSETINT (ie.y, 0); + kbd_buffer_store_event (&ie); + + xfree (output->preedit_chars); + + output->preedit_size = 0; + output->preedit_active = false; + output->preedit_chars = NULL; + output->preedit_caret = 0; +} + /* XIM destroy callback function, which is called whenever the connection to input method XIM dies. CLIENT_DATA contains a pointer to the x_display_info structure corresponding to XIM. */ @@ -25531,6 +25564,9 @@ xim_destroy_callback (XIM xim, XPointer client_data, XPointer call_data) { FRAME_XIC (f) = NULL; xic_free_xfontset (f); + + /* Free the preedit text if necessary. */ + x_maybe_clear_preedit (f); } } -- 2.39.5