]> git.eshelyaron.com Git - emacs.git/commitdiff
Stop assuming X kbd state works with GDK when forwarding events to xwidgets
authorPo Lu <luangruo@yahoo.com>
Tue, 4 Jan 2022 11:30:07 +0000 (19:30 +0800)
committerPo Lu <luangruo@yahoo.com>
Tue, 4 Jan 2022 11:30:07 +0000 (19:30 +0800)
* src/xwidget.c (xw_translate_x_modifiers): New function.
(Fxwidget_perform_lispy_event): Translate X modifiers to GDK
modifiers before sending them to the xwidget.

src/xwidget.c

index 3df208034b8846d6dce0fd78b43f7ea66d699d7a..bfb666e56549ff820c6b8e617281957aadbf265e 100644 (file)
@@ -222,6 +222,34 @@ xw_forward_event_from_view (GtkWidget *widget, GdkEvent *event,
 }
 #endif
 
+#ifdef HAVE_X_WINDOWS
+static guint
+xw_translate_x_modifiers (struct x_display_info *dpyinfo,
+                         unsigned int modifiers)
+{
+  guint mods = 0;
+
+  if (modifiers & dpyinfo->meta_mod_mask)
+    {
+      /* GDK always assumes Mod1 is alt, but that's no reason for
+        us to make that mistake as well.  */
+      if (!dpyinfo->alt_mod_mask)
+       mods |= GDK_MOD1_MASK;
+      else
+       mods |= GDK_META_MASK;
+    }
+
+  if (modifiers & dpyinfo->alt_mod_mask)
+    mods |= GDK_MOD1_MASK;
+  if (modifiers & dpyinfo->super_mod_mask)
+    mods |= GDK_SUPER_MASK;
+  if (modifiers & dpyinfo->hyper_mod_mask)
+    mods |= GDK_HYPER_MASK;
+
+  return mods;
+}
+#endif
+
 DEFUN ("make-xwidget",
        Fmake_xwidget, Smake_xwidget,
        4, 7, 0,
@@ -563,7 +591,13 @@ selected frame is not an X-Windows frame.  */)
     keycode = gdk_unicode_to_keyval (character);
 
   xg_event->key.keyval = keycode;
+#ifndef HAVE_X_WINDOWS
   xg_event->key.state = modifiers;
+#else
+  if (f)
+    xg_event->key.state = xw_translate_x_modifiers (FRAME_DISPLAY_INFO (f),
+                                                   modifiers);
+#endif
 
   if (keycode > -1)
     {