]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix event source attribution for GTK input methods
authorPo Lu <luangruo@yahoo.com>
Mon, 11 Apr 2022 11:27:07 +0000 (19:27 +0800)
committerPo Lu <luangruo@yahoo.com>
Mon, 11 Apr 2022 11:27:48 +0000 (19:27 +0800)
* src/gtkutil.c (xg_im_context_commit): Use pending keystroke
source if it exists.

src/gtkutil.c

index 4fc0edf8ace83d77d60750d9c9b0a9bab0c91ae7..718da171f49d7078214ae09d6e7d87580f50d876 100644 (file)
@@ -6274,6 +6274,10 @@ xg_im_context_commit (GtkIMContext *imc, gchar *str,
 {
   struct frame *f = user_data;
   struct input_event ie;
+#ifdef HAVE_XINPUT2
+  struct xi_device_t *source;
+  struct x_display_info *dpyinfo;
+#endif
 
   EVENT_INIT (ie);
   /* This used to use g_utf8_to_ucs4_fast, which led to bad results
@@ -6292,6 +6296,22 @@ xg_im_context_commit (GtkIMContext *imc, gchar *str,
                      make_fixnum (SCHARS (ie.arg)),
                      Qcoding, Qt, ie.arg);
 
+#ifdef HAVE_XINPUT2
+  dpyinfo = FRAME_DISPLAY_INFO (f);
+
+  /* There is no timestamp associated with commit events, so use the
+     device that sent the last event to be filtered.  */
+  if (dpyinfo->pending_keystroke_time)
+    {
+      dpyinfo->pending_keystroke_time = 0;
+      source = xi_device_from_id (dpyinfo,
+                                 dpyinfo->pending_keystroke_source);
+
+      if (source)
+       ie.device = source->name;
+    }
+#endif
+
   XSETFRAME (ie.frame_or_window, f);
   ie.modifiers = 0;
   ie.timestamp = 0;