[Xfce4-commits] <libxfce4ui:master> Simplify code monitoring key press events.

Jérôme Guelfucci noreply at xfce.org
Thu Jun 2 23:46:02 CEST 2011


Updating branch refs/heads/master
         to 5a4cbdd01c7712934c26a068af8b027b7ac3e1cc (commit)
       from 899aaa97827f263c877faab3f8d0686fd9784b66 (commit)

commit 5a4cbdd01c7712934c26a068af8b027b7ac3e1cc
Author: Jérôme Guelfucci <jeromeg at xfce.org>
Date:   Fri Apr 22 17:09:46 2011 +0200

    Simplify code monitoring key press events.

 libxfce4kbd-private/xfce-shortcuts-grabber.c |  106 +++++++++++---------------
 1 files changed, 46 insertions(+), 60 deletions(-)

diff --git a/libxfce4kbd-private/xfce-shortcuts-grabber.c b/libxfce4kbd-private/xfce-shortcuts-grabber.c
index e1a4f97..e7457a1 100644
--- a/libxfce4kbd-private/xfce-shortcuts-grabber.c
+++ b/libxfce4kbd-private/xfce-shortcuts-grabber.c
@@ -166,6 +166,13 @@ xfce_shortcuts_grabber_init (XfceShortcutsGrabber *grabber)
   grabber->priv = XFCE_SHORTCUTS_GRABBER_GET_PRIVATE (grabber);
   grabber->priv->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
 
+  /* Workaround: Make sure modmap is up to date
+   * There is possibly a bug in GTK+ where virtual modifiers are not
+   * mapped because the modmap is not updated. The following function
+   * updates it.
+   */
+  (void) gdk_keymap_have_bidi_layouts (gdk_keymap_get_default ());
+
   xfce_shortcuts_grabber_reload_modifiers (grabber);
 }
 
@@ -419,47 +426,6 @@ xfce_shortcuts_grabber_parse_shortcut (XfceShortcutsGrabber *grabber,
 
 
 
-gchar *
-xfce_shortcuts_grabber_shortcut_name (XfceShortcutsGrabber *grabber,
-                                      guint                 keycode,
-                                      guint                 modifiers)
-{
-  Display *display;
-  KeySym   keysym;
-
-  g_return_val_if_fail (XFCE_IS_SHORTCUTS_GRABBER (grabber), NULL);
-
-  display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
-  keysym = XKeycodeToKeysym (display, keycode, 0);
-
-  modifiers &= MODIFIER_MASK;
-  modifiers &= ~xfce_shortcuts_grabber_get_ignore_mask (grabber);
-
-  if ((modifiers & grabber->priv->modifiers[CACHE_SUPER]) != 0)
-    {
-      modifiers |= GDK_SUPER_MASK;
-      modifiers ^= grabber->priv->modifiers[CACHE_SUPER];
-    }
-
-  if ((modifiers & grabber->priv->modifiers[CACHE_HYPER]) != 0)
-    {
-      modifiers |= GDK_HYPER_MASK;
-      modifiers ^= grabber->priv->modifiers[CACHE_HYPER];
-    }
-
-#if 0
-  if ((modifiers & grabber->priv->modifiers[CACHE_META]) != 0)
-    {
-      modifiers |= GDK_META_MASK;
-      modifiers ^= grabber->priv->modifiers[CACHE_META];
-    }
-#endif
-
-  return gtk_accelerator_name (keysym, modifiers);
-}
-
-
-
 static void
 xfce_shortcuts_grabber_grab (XfceShortcutsGrabber *grabber,
                              XfceKey              *key,
@@ -547,7 +513,7 @@ xfce_shortcuts_grabber_get_ignore_mask (XfceShortcutsGrabber *grabber)
 struct EventKeyFindContext
 {
   XfceShortcutsGrabber *grabber;
-  XKeyEvent            *xevent;
+  gchar                *needle;
   const gchar          *result;
 };
 
@@ -558,27 +524,22 @@ find_event_key (const gchar                *shortcut,
                 XfceKey                    *key,
                 struct EventKeyFindContext *context)
 {
-  gchar   *name;
-  gboolean result = FALSE;
+  gboolean result;
 
-  g_return_val_if_fail (context != NULL, TRUE);
-  g_return_val_if_fail (context->xevent != NULL, TRUE);
+  result = FALSE;
 
-  gdk_error_trap_push ();
+  g_return_val_if_fail (context != NULL, TRUE);
+  g_return_val_if_fail (context->needle != NULL, TRUE);
 
-  name = xfce_shortcuts_grabber_shortcut_name (context->grabber, context->xevent->keycode,
-                                               context->xevent->state);
+  TRACE ("Comparing %s and %s", shortcut, context->needle);
 
-  if (G_UNLIKELY (g_str_equal (shortcut, name)))
+  if (G_UNLIKELY (g_str_equal (shortcut, context->needle)))
     {
       context->result = shortcut;
       result = TRUE;
-    }
-
-  g_free (name);
 
-  gdk_flush ();
-  gdk_error_trap_pop ();
+      TRACE ("Positive match for %s", context->needle);
+    }
 
   return result;
 }
@@ -590,9 +551,12 @@ xfce_shortcuts_grabber_event_filter (GdkXEvent            *gdk_xevent,
                                      GdkEvent             *event,
                                      XfceShortcutsGrabber *grabber)
 {
-  struct EventKeyFindContext context;
-  XEvent                    *xevent;
-  gint                       timestamp;
+  struct EventKeyFindContext  context;
+  GdkKeymap                  *keymap;
+  GdkModifierType             consumed, modifiers;
+  XEvent                     *xevent;
+  guint                       keyval, mod_mask;
+  gint                        timestamp;
 
   g_return_val_if_fail (XFCE_IS_SHORTCUTS_GRABBER (grabber), GDK_FILTER_CONTINUE);
 
@@ -602,15 +566,37 @@ xfce_shortcuts_grabber_event_filter (GdkXEvent            *gdk_xevent,
     return GDK_FILTER_CONTINUE;
 
   context.grabber = grabber;
-  context.xevent = (XKeyEvent *) xevent;
   context.result = NULL;
-  timestamp = context.xevent->time;
+  timestamp = xevent->xkey.time;
+
+  /* Get the keyboard state */
+  gdk_error_trap_push ();
+  keymap = gdk_keymap_get_default ();
+  mod_mask = gtk_accelerator_get_default_mod_mask ();
+  modifiers = xevent->xkey.state;
+
+  /* TODO: group handling? */
+  gdk_keymap_translate_keyboard_state (keymap, xevent->xkey.keycode,
+                                       modifiers, 0,
+                                       &keyval, NULL, NULL, &consumed);
+
+  /* Get the modifiers */
+  modifiers &= ~consumed;
+  gdk_keymap_add_virtual_modifiers (keymap, &modifiers);
+  modifiers &= mod_mask;
+
+  context.needle = gtk_accelerator_name (keyval, modifiers);
 
   g_hash_table_foreach (grabber->priv->keys, (GHFunc) find_event_key, &context);
 
   if (G_LIKELY (context.result != NULL))
     g_signal_emit_by_name (grabber, "shortcut-activated", context.result, timestamp);
 
+  gdk_flush ();
+  gdk_error_trap_pop ();
+
+  g_free (context.needle);
+
   return GDK_FILTER_CONTINUE;
 }
 



More information about the Xfce4-commits mailing list