diff options
author | Matthias Clasen <mclasen@redhat.com> | 2012-02-21 00:30:44 +0100 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2012-02-21 01:50:18 +0100 |
commit | 9a92a1da896823b113e26e04268f4fe428e66587 (patch) | |
tree | de5885b55901d7dd15edee3e48c24609ffe0a68c | |
parent | 8ec0cfd571da29b02dbdd3464cd9508ebec4cac1 (diff) | |
download | gtk+-9a92a1da896823b113e26e04268f4fe428e66587.tar.gz |
Add a way to get the current modifier state
Xkb makes this available to us, and it is useful if you want
to do easter eggs that are triggered by Alt.
-rw-r--r-- | docs/reference/gdk/gdk3-sections.txt | 1 | ||||
-rw-r--r-- | gdk/gdk.symbols | 1 | ||||
-rw-r--r-- | gdk/gdkkeys.c | 21 | ||||
-rw-r--r-- | gdk/gdkkeys.h | 1 | ||||
-rw-r--r-- | gdk/gdkkeysprivate.h | 1 | ||||
-rw-r--r-- | gdk/x11/gdkdisplay-x11.c | 2 | ||||
-rw-r--r-- | gdk/x11/gdkkeys-x11.c | 30 |
7 files changed, 51 insertions, 6 deletions
diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index 605dbeb3ec..97565187b9 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -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 diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols index 21f1667fc9..219153dfdc 100644 --- a/gdk/gdk.symbols +++ b/gdk/gdk.symbols @@ -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 diff --git a/gdk/gdkkeys.c b/gdk/gdkkeys.c index 779dfb506f..763e433dbb 100644 --- a/gdk/gdkkeys.c +++ b/gdk/gdkkeys.c @@ -379,6 +379,27 @@ gdk_keymap_get_num_lock_state (GdkKeymap *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 * @keyval: a keyval, such as %GDK_a, %GDK_Up, %GDK_Return, etc. diff --git a/gdk/gdkkeys.h b/gdk/gdkkeys.h index b085d246ca..91fbd3d179 100644 --- a/gdk/gdkkeys.h +++ b/gdk/gdkkeys.h @@ -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, diff --git a/gdk/gdkkeysprivate.h b/gdk/gdkkeysprivate.h index 4ccc974878..3fbee5b442 100644 --- a/gdk/gdkkeysprivate.h +++ b/gdk/gdkkeysprivate.h @@ -63,6 +63,7 @@ struct _GdkKeymapClass GdkModifierType *state); GdkModifierType (*get_modifier_mask) (GdkKeymap *keymap, GdkModifierIntent intent); + guint (* get_modifier_state) (GdkKeymap *keymap); /* Signals */ diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index 6a32285693..897d713c25 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -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, diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c index c2e5e96ef2..c39092a7ea 100644 --- a/gdk/x11/gdkkeys-x11.c +++ b/gdk/x11/gdkkeys-x11.c @@ -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; |