summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/gdk/gdk3-sections.txt1
-rw-r--r--gdk/gdk.symbols1
-rw-r--r--gdk/gdkkeys.c21
-rw-r--r--gdk/gdkkeys.h1
-rw-r--r--gdk/gdkkeysprivate.h1
-rw-r--r--gdk/x11/gdkdisplay-x11.c2
-rw-r--r--gdk/x11/gdkkeys-x11.c30
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;