]> Pileus Git - ~andy/gtk/commitdiff
Add a way to get the current modifier state
authorMatthias Clasen <mclasen@redhat.com>
Mon, 20 Feb 2012 23:30:44 +0000 (00:30 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 21 Feb 2012 00:50:18 +0000 (01:50 +0100)
Xkb makes this available to us, and it is useful if you want
to do easter eggs that are triggered by Alt.

docs/reference/gdk/gdk3-sections.txt
gdk/gdk.symbols
gdk/gdkkeys.c
gdk/gdkkeys.h
gdk/gdkkeysprivate.h
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkkeys-x11.c

index 605dbeb3ec1306f946c5a6767d4052f4fa74cbde..97565187b9082caeac9eeeeead193c30a2cc725e 100644 (file)
@@ -631,6 +631,7 @@ gdk_keymap_get_direction
 gdk_keymap_have_bidi_layouts
 gdk_keymap_get_caps_lock_state
 gdk_keymap_get_num_lock_state
+gdk_keymap_get_modifier_state
 gdk_keymap_add_virtual_modifiers
 gdk_keymap_map_virtual_modifiers
 gdk_keymap_get_modifier_mask
index 21f1667fc912046d0471fa11679eec98476b0331..219153dfdc6959a9a1d6c0b7e88810a7392baaa5 100644 (file)
@@ -209,6 +209,7 @@ gdk_keymap_get_entries_for_keycode
 gdk_keymap_get_entries_for_keyval
 gdk_keymap_get_for_display
 gdk_keymap_get_modifier_mask
+gdk_keymap_get_modifier_state
 gdk_keymap_get_num_lock_state
 gdk_keymap_get_type
 gdk_keymap_have_bidi_layouts
index 779dfb506f9221a674377a0a0c63c43eb805bd61..763e433dbb10c922ecb3a641c8d8f350e4d65f61 100644 (file)
@@ -378,6 +378,27 @@ gdk_keymap_get_num_lock_state (GdkKeymap *keymap)
   return GDK_KEYMAP_GET_CLASS (keymap)->get_num_lock_state (keymap);
 }
 
+/**
+ * gdk_keymap_get_modifier_state:
+ * @keymap: a #GdkKeymap
+ *
+ * Returns the current modifier state.
+ *
+ * Returns: the current modifier state.
+ *
+ * Since: 3.2
+ */
+guint
+gdk_keymap_get_modifier_state (GdkKeymap *keymap)
+{
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
+  if (GDK_KEYMAP_GET_CLASS (keymap)->get_modifier_state)
+    return GDK_KEYMAP_GET_CLASS (keymap)->get_modifier_state (keymap);
+
+  return 0;
+}
+
 /**
  * gdk_keymap_get_entries_for_keyval:
  * @keymap: a #GdkKeymap
index b085d246ca463be3ab050ea616abccca3dfeb164..91fbd3d179147132a485e59a94b8ba069c4c6c79 100644 (file)
@@ -110,6 +110,7 @@ PangoDirection gdk_keymap_get_direction            (GdkKeymap           *keymap)
 gboolean       gdk_keymap_have_bidi_layouts        (GdkKeymap           *keymap);
 gboolean       gdk_keymap_get_caps_lock_state      (GdkKeymap           *keymap);
 gboolean       gdk_keymap_get_num_lock_state       (GdkKeymap           *keymap);
+guint          gdk_keymap_get_modifier_state       (GdkKeymap           *keymap);
 void           gdk_keymap_add_virtual_modifiers    (GdkKeymap           *keymap,
                                                     GdkModifierType     *state);
 gboolean       gdk_keymap_map_virtual_modifiers    (GdkKeymap           *keymap,
index 4ccc974878a8ba37f6201a8942e7c2ad291a5977..3fbee5b4428dc6b56d48c342b54f214038c7dc4f 100644 (file)
@@ -63,6 +63,7 @@ struct _GdkKeymapClass
                                          GdkModifierType *state);
   GdkModifierType (*get_modifier_mask)  (GdkKeymap         *keymap,
                                          GdkModifierIntent  intent);
+  guint (* get_modifier_state)          (GdkKeymap *keymap);
 
 
   /* Signals */
index 6a3228569361271d8ac8c3111c8da2fa1a331733..897d713c25c191ec62d0d85fc6761294d0cdc162 100644 (file)
@@ -1403,7 +1403,7 @@ _gdk_x11_display_open (const gchar *display_name)
            XkbSelectEventDetails (display_x11->xdisplay,
                                   XkbUseCoreKbd, XkbStateNotify,
                                   XkbAllStateComponentsMask,
-                                   XkbGroupLockMask|XkbModifierLockMask);
+                                   XkbModifierStateMask|XkbGroupStateMask);
 
            XkbSetDetectableAutoRepeat (display_x11->xdisplay,
                                        True,
index c2e5e96ef2313aa462ae68ea1a5a8f6fc8c97ff0..c39092a7ea67271010b5ac4bc5fb3201dee7aa03 100644 (file)
@@ -77,7 +77,8 @@ struct _GdkX11Keymap
   guint have_direction  : 1;
   guint have_lock_state : 1;
   guint caps_lock_state : 1;
-  guint num_lock_state : 1;
+  guint num_lock_state  : 1;
+  guint modifier_state;
   guint current_serial;
 
 #ifdef HAVE_XKB
@@ -600,12 +601,14 @@ update_direction (GdkX11Keymap *keymap_x11,
 
 static gboolean
 update_lock_state (GdkX11Keymap *keymap_x11,
-                   gint          locked_mods)
+                   gint          locked_mods,
+                   gint          effective_mods)
 {
   XkbDescPtr xkb G_GNUC_UNUSED;
   gboolean have_lock_state;
   gboolean caps_lock_state;
   gboolean num_lock_state;
+  guint modifier_state;
 
   /* ensure keymap_x11->num_lock_mask is initialized */
   xkb = get_xkb (keymap_x11);
@@ -613,14 +616,18 @@ update_lock_state (GdkX11Keymap *keymap_x11,
   have_lock_state = keymap_x11->have_lock_state;
   caps_lock_state = keymap_x11->caps_lock_state;
   num_lock_state = keymap_x11->num_lock_state;
+  modifier_state = keymap_x11->modifier_state;
 
   keymap_x11->have_lock_state = TRUE;
   keymap_x11->caps_lock_state = (locked_mods & GDK_LOCK_MASK) != 0;
   keymap_x11->num_lock_state = (locked_mods & keymap_x11->num_lock_mask) != 0;
+  /* FIXME: sanitize this */
+  keymap_x11->modifier_state = (guint)effective_mods;
 
   return !have_lock_state
          || (caps_lock_state != keymap_x11->caps_lock_state)
-         || (num_lock_state != keymap_x11->num_lock_state);
+         || (num_lock_state != keymap_x11->num_lock_state)
+         || (modifier_state != keymap_x11->modifier_state);
 }
 
 /* keep this in sync with the XkbSelectEventDetails()
@@ -640,7 +647,9 @@ _gdk_x11_keymap_state_changed (GdkDisplay *display,
       if (update_direction (keymap_x11, XkbStateGroup (&xkb_event->state)))
         g_signal_emit_by_name (keymap_x11, "direction-changed");
 
-      if (update_lock_state (keymap_x11, xkb_event->state.locked_mods))
+      if (update_lock_state (keymap_x11,
+                             xkb_event->state.locked_mods,
+                             xkb_event->state.mods))
         g_signal_emit_by_name (keymap_x11, "state-changed");
     }
 }
@@ -661,7 +670,7 @@ ensure_lock_state (GdkKeymap *keymap)
           XkbStateRec state_rec;
 
           XkbGetState (GDK_DISPLAY_XDISPLAY (display), XkbUseCoreKbd, &state_rec);
-          update_lock_state (keymap_x11, state_rec.locked_mods);
+          update_lock_state (keymap_x11, state_rec.locked_mods, state_rec.mods);
         }
     }
 #endif /* HAVE_XKB */
@@ -752,6 +761,16 @@ gdk_x11_keymap_get_num_lock_state (GdkKeymap *keymap)
   return keymap_x11->num_lock_state;
 }
 
+static guint
+gdk_x11_keymap_get_modifier_state (GdkKeymap *keymap)
+{
+  GdkX11Keymap *keymap_x11 = GDK_X11_KEYMAP (keymap);
+
+  ensure_lock_state (keymap);
+
+  return keymap_x11->modifier_state;
+}
+
 static gboolean
 gdk_x11_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                        guint          keyval,
@@ -1580,6 +1599,7 @@ gdk_x11_keymap_class_init (GdkX11KeymapClass *klass)
   keymap_class->have_bidi_layouts = gdk_x11_keymap_have_bidi_layouts;
   keymap_class->get_caps_lock_state = gdk_x11_keymap_get_caps_lock_state;
   keymap_class->get_num_lock_state = gdk_x11_keymap_get_num_lock_state;
+  keymap_class->get_modifier_state = gdk_x11_keymap_get_modifier_state;
   keymap_class->get_entries_for_keyval = gdk_x11_keymap_get_entries_for_keyval;
   keymap_class->get_entries_for_keycode = gdk_x11_keymap_get_entries_for_keycode;
   keymap_class->lookup_key = gdk_x11_keymap_lookup_key;