From 3dfefb8bb4d99ea67b576bf177804dd386159874 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sun, 9 Jan 2022 18:14:26 +0800 Subject: [PATCH] Fix native GTK input for cyrillic input methods * src/gtkutil.c (xg_widget_key_press_cb): Get unicode mapping of keyval if string doesn't exist. * src/xterm.c (handle_one_xevent): Fix build without HAVE_X_I18N. --- src/gtkutil.c | 21 +++++++++++++++++++-- src/xterm.c | 2 +- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/gtkutil.c b/src/gtkutil.c index c62bd898fb5..5ed871a8226 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -6118,6 +6118,7 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent *event, gunichar *cb; ptrdiff_t i; glong len; + gunichar uc; FOR_EACH_FRAME (tail, tem) { @@ -6216,8 +6217,7 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent *event, || IsKeypadKey (keysym) /* 0xff80 <= x < 0xffbe */ || IsFunctionKey (keysym) /* 0xffbe <= x < 0xffe1 */ /* Any "vendor-specific" key is ok. */ - || (keysym & (1 << 28)) - || (keysym != GDK_KEY_VoidSymbol && !event->key.string)) + || (keysym & (1 << 28))) && !(event->key.is_modifier)) { inev.ie.kind = NON_ASCII_KEYSTROKE_EVENT; @@ -6243,6 +6243,23 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent *event, inev.ie.kind = NO_EVENT; } + else + { + uc = gdk_keyval_to_unicode (keysym); + + if (uc) + { + inev.ie.kind = (SINGLE_BYTE_CHAR_P (uc) + ? ASCII_KEYSTROKE_EVENT + : MULTIBYTE_CHAR_KEYSTROKE_EVENT); + inev.ie.code = uc; + } + else + { + inev.ie.kind = NON_ASCII_KEYSTROKE_EVENT; + inev.ie.code = keysym; + } + } done: if (inev.ie.kind != NO_EVENT) diff --git a/src/xterm.c b/src/xterm.c index 6a05ad98949..1c4907f7eaa 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -10727,7 +10727,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, goto XI_OTHER; #endif -#ifdef HAVE_X_I18N XKeyPressedEvent xkey; memset (&xkey, 0, sizeof xkey); @@ -10745,6 +10744,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, xkey.keycode = xev->detail; xkey.same_screen = True; +#ifdef HAVE_X_I18N #ifdef USE_GTK if ((!x_gtk_use_native_input && x_filter_event (dpyinfo, (XEvent *) &xkey)) -- 2.39.2