From: Po Lu Date: Tue, 28 Jun 2022 01:40:22 +0000 (+0800) Subject: Always use XKB to translate keysyms when no input method is available X-Git-Tag: emacs-29.0.90~1447^2~1416 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=dea5c528bd8263b57a8619eac3e66e04f9ab31a4;p=emacs.git Always use XKB to translate keysyms when no input method is available * src/xterm.c (handle_one_xevent) [HAVE_XKB]: Also use XKB to handle core KeyPress events. --- diff --git a/src/xterm.c b/src/xterm.c index 98ceae6ac16..3a642972586 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -17622,14 +17622,50 @@ handle_one_xevent (struct x_display_info *dpyinfo, emacs_abort (); } else - nbytes = XLookupString (&xkey, (char *) copy_bufptr, - copy_bufsiz, &keysym, - &compose_status); -#else - nbytes = XLookupString (&xkey, (char *) copy_bufptr, - copy_bufsiz, &keysym, - &compose_status); #endif + { +#ifdef HAVE_XKB + int overflow; + unsigned int consumed; + + if (dpyinfo->xkb_desc) + { + if (!XkbTranslateKeyCode (dpyinfo->xkb_desc, + xkey.keycode, xkey.state, + &consumed, &keysym)) + goto done_keysym; + + modifiers &= ~consumed; + overflow = 0; + + nbytes = XkbTranslateKeySym (dpyinfo->display, &keysym, + xkey.state & ~consumed, + (char *) copy_bufptr, + copy_bufsiz, &overflow); + + if (overflow) + { + copy_bufptr = SAFE_ALLOCA ((copy_bufsiz += overflow) + * sizeof *copy_bufptr); + overflow = 0; + nbytes = XkbTranslateKeySym (dpyinfo->display, &keysym, + xkey.state & ~consumed, + (char *) copy_bufptr, + copy_bufsiz, &overflow); + + if (overflow) + nbytes = 0; + } + + if (nbytes) + coding = Qnil; + } + else +#endif + nbytes = XLookupString (&xkey, (char *) copy_bufptr, + copy_bufsiz, &keysym, + &compose_status); + } #ifdef XK_F1 if (x_dnd_in_progress && keysym == XK_F1) @@ -20755,6 +20791,10 @@ handle_one_xevent (struct x_display_info *dpyinfo, } #endif +#ifdef HAVE_XKB + mods_rtrn = 0; +#endif + x_display_set_last_user_time (dpyinfo, xev->time, xev->send_event); ignore_next_mouse_click_timeout = 0; @@ -20911,7 +20951,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, #endif XSETFRAME (inev.ie.frame_or_window, f); - inev.ie.modifiers = x_x_to_emacs_modifiers (dpyinfo, state); inev.ie.timestamp = xev->time; #ifdef HAVE_X_I18N @@ -20990,6 +21029,13 @@ handle_one_xevent (struct x_display_info *dpyinfo, } } +#ifndef HAVE_XKB + inev.ie.modifiers = x_x_to_emacs_modifiers (dpyinfo, state); +#else + inev.ie.modifiers = x_x_to_emacs_modifiers (dpyinfo, + state & ~mods_rtrn); +#endif + #ifdef XK_F1 if (x_dnd_in_progress && keysym == XK_F1) {