state: Add xkb_state_key_get_consumed_mods
authorJasper St. Pierre <jstpierre@mecheye.net>
Fri, 21 Feb 2014 23:09:00 +0000 (18:09 -0500)
committerRan Benita <ran234@gmail.com>
Sat, 22 Feb 2014 00:23:37 +0000 (02:23 +0200)
This retrieves the mask of consumed modifiers for a given key and state,
which is helpful for toolkits without having them to do it one modifier
at a time, or pass in 0xFFFFFFFF to xkb_state_remove_consumed_mods to
"reverse-engineer" the consumed mods.

src/state.c
test/state.c
xkbcommon/xkbcommon.h

index 8b1a526..f409a3e 100644 (file)
@@ -1169,3 +1169,14 @@ xkb_state_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t kc,
 
     return mask & ~key_get_consumed(state, key);
 }
+
+XKB_EXPORT xkb_mod_mask_t
+xkb_state_key_get_consumed_mods(struct xkb_state *state, xkb_keycode_t kc)
+{
+    const struct xkb_key *key = XkbKey(state->keymap, kc);
+
+    if (!key)
+        return 0;
+
+    return key_get_consumed(state, key);
+}
index 89b3c2f..950b423 100644 (file)
@@ -333,6 +333,9 @@ test_consume(struct xkb_keymap *keymap)
                                               mask);
     assert(mask == (1U << alt));
 
+    mask = xkb_state_key_get_consumed_mods(state, KEY_EQUAL + EVDEV_OFFSET);
+    assert(mask == (1U << shift));
+
     xkb_state_unref(state);
 }
 
index 1e6c803..908edce 100644 (file)
@@ -1483,6 +1483,7 @@ xkb_state_mod_indices_are_active(struct xkb_state *state,
  * index is not valid in the keymap, returns -1.
  *
  * @sa xkb_state_mod_mask_remove_consumed()
+ * @sa xkb_state_key_get_consumed_mods()
  * @memberof xkb_state
  */
 int
@@ -1503,6 +1504,17 @@ xkb_state_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t key,
                                    xkb_mod_mask_t mask);
 
 /**
+ * Get the mask of modifiers consumed by translating a given key.
+ *
+ * @returns a mask of the consumed modifiers.
+ *
+ * @sa xkb_state_mod_index_is_consumed()
+ * @memberof xkb_state
+ */
+xkb_mod_mask_t
+xkb_state_key_get_consumed_mods(struct xkb_state *state, xkb_keycode_t key);
+
+/**
  * Test whether a layout is active in a given keyboard state by name.
  *
  * @returns 1 if the layout is active, 0 if it is not.  If no layout with