]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix XI2 keysym translation
authorPo Lu <luangruo@yahoo.com>
Tue, 23 Nov 2021 01:01:33 +0000 (09:01 +0800)
committerPo Lu <luangruo@yahoo.com>
Tue, 23 Nov 2021 01:04:40 +0000 (09:04 +0800)
* src/xterm.c (handle_one_xevent): Handle XI_KeyPress events
that can't be translated into strings.

src/xterm.c

index 197776ce31661b42d60fc821f944cb7e267d7878..11e7e602c09c0f0815d0baabe597f5b91693566a 100644 (file)
@@ -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.  */