From: Po Lu Date: Tue, 23 Nov 2021 01:01:33 +0000 (+0800) Subject: Fix XI2 keysym translation X-Git-Tag: emacs-29.0.90~2852^2~94 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=919cb31cf7f2aec2d8134783b0a5bb93a621fcaf;p=emacs.git Fix XI2 keysym translation * src/xterm.c (handle_one_xevent): Handle XI_KeyPress events that can't be translated into strings. --- diff --git a/src/xterm.c b/src/xterm.c index 197776ce316..11e7e602c09 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -10324,7 +10324,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, memset (&xkey, 0, sizeof xkey); xkey.type = KeyPress; - xkey.serial = 0; + xkey.serial = xev->serial; xkey.send_event = xev->send_event; xkey.display = xev->display; xkey.window = xev->event; @@ -10439,53 +10439,38 @@ handle_one_xevent (struct x_display_info *dpyinfo, emacs_abort (); } else - { #endif + { #ifdef HAVE_XKB int overflow = 0; KeySym sym = keysym; if (dpyinfo->xkb_desc) { - if (!(nbytes = XkbTranslateKeySym (dpyinfo->display, &sym, - state & ~mods_rtrn, copy_bufptr, - copy_bufsiz, &overflow))) - goto XI_OTHER; - } - else -#else - { - block_input (); - char *str = XKeysymToString (keysym); - if (!str) + nbytes = XkbTranslateKeySym (dpyinfo->display, &sym, + state & ~mods_rtrn, copy_bufptr, + copy_bufsiz, &overflow); + if (overflow) { - unblock_input (); - goto XI_OTHER; + copy_bufptr = alloca ((copy_bufsiz += overflow) + * sizeof *copy_bufptr); + overflow = 0; + nbytes = XkbTranslateKeySym (dpyinfo->display, &sym, + state & ~mods_rtrn, copy_bufptr, + copy_bufsiz, &overflow); + + if (overflow) + nbytes = 0; } - nbytes = strlen (str) + 1; - copy_bufptr = alloca (nbytes); - strcpy (copy_bufptr, str); - unblock_input (); } + else #endif -#ifdef HAVE_XKB - if (overflow) { - overflow = 0; - copy_bufptr = alloca (copy_bufsiz + overflow); - keysym = sym; - if (!(nbytes = XkbTranslateKeySym (dpyinfo->display, &sym, - state & ~mods_rtrn, copy_bufptr, - copy_bufsiz + overflow, &overflow))) - goto XI_OTHER; - - if (overflow) - goto XI_OTHER; + nbytes = XLookupString (&xkey, copy_bufptr, + copy_bufsiz, &keysym, + &compose_status); } -#endif -#ifdef HAVE_X_I18N } -#endif /* First deal with keysyms which have defined translations to characters. */