Add keycode min/max and iteration API
authorMatthias Clasen <mclasen@redhat.com>
Thu, 9 May 2013 14:31:21 +0000 (15:31 +0100)
committerDaniel Stone <daniel@fooishbar.org>
Thu, 9 May 2013 14:31:21 +0000 (15:31 +0100)
Add three new pieces of API:
  - xkb_keymap_min_keycode does what it says on the tin
  - xkb_keymap_max_keycode likewise
  - xkb_keymap_key_for_each calls the provided function once for every
    valid key in the keymap

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
src/keymap.c
test/state.c
xkbcommon/xkbcommon.h

index 55000f43a777867b2ee2a22d5c962fb1bea4299e..8205babe5b999113878815c3119016988f5bb2d6 100644 (file)
@@ -484,6 +484,28 @@ err:
     return 0;
 }
 
+XKB_EXPORT xkb_keycode_t
+xkb_keymap_min_keycode(struct xkb_keymap *keymap)
+{
+    return keymap->min_key_code;
+}
+
+XKB_EXPORT xkb_keycode_t
+xkb_keymap_max_keycode(struct xkb_keymap *keymap)
+{
+    return keymap->max_key_code;
+}
+
+XKB_EXPORT void
+xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter,
+                        void *data)
+{
+    struct xkb_key *key;
+
+    xkb_foreach_key(key, keymap)
+        iter(keymap, key->keycode, data);
+}
+
 /**
  * Simple boolean specifying whether or not the key should repeat.
  */
index 34da20149b7f19cdafb4a66eb2667e777d1e9616..3521d667ed570255d3a4f58125b4d5dc02626413 100644 (file)
@@ -331,6 +331,28 @@ test_consume(struct xkb_keymap *keymap)
     xkb_state_unref(state);
 }
 
+static void
+key_iter(struct xkb_keymap *keymap, xkb_keycode_t key, void *data)
+{
+    int *counter = (int *) data;
+
+    assert(*counter == key);
+    (*counter)++;
+}
+
+static void
+test_range(struct xkb_keymap *keymap)
+{
+    int counter;
+
+    assert(xkb_keymap_min_keycode(keymap) == 9);
+    assert(xkb_keymap_max_keycode(keymap) == 253);
+
+    counter = xkb_keymap_min_keycode(keymap);
+    xkb_keymap_key_for_each(keymap, key_iter, &counter);
+    assert(counter == xkb_keymap_max_keycode(keymap) + 1);
+}
+
 int
 main(void)
 {
@@ -351,6 +373,7 @@ main(void)
     test_serialisation(keymap);
     test_repeat(keymap);
     test_consume(keymap);
+    test_range(keymap);
 
     xkb_keymap_unref(keymap);
     xkb_context_unref(context);
index a2aecfbb2a74131c327a1c49451eb35c78a558b1..ff2ce68c25fff99bd7dde07ea3541ef4482ebed4 100644 (file)
@@ -811,6 +811,46 @@ xkb_keymap_get_as_string(struct xkb_keymap *keymap,
  * @{
  */
 
+/**
+ * Get the minimum keycode in the keymap.
+ *
+ * @sa xkb_keycode_t
+ * @memberof xkb_keymap
+ */
+xkb_keycode_t
+xkb_keymap_min_keycode(struct xkb_keymap *keymap);
+
+/**
+ * Get the maximum keycode in the keymap.
+ *
+ * @sa xkb_keycode_t
+ * @memberof xkb_keymap
+ */
+xkb_keycode_t
+xkb_keymap_max_keycode(struct xkb_keymap *keymap);
+
+/**
+ * The iterator used by xkb_keymap_key_for_each().
+ *
+ * @sa xkb_keymap_key_for_each
+ * @memberof xkb_keymap
+ */
+typedef void
+(*xkb_keymap_key_iter_t)(struct xkb_keymap *keymap, xkb_keycode_t key,
+                         void *data);
+
+/**
+ * Run a specified function for every valid keycode in the keymap.  If a
+ * keymap is sparse, this function may be called fewer than
+ * (max_keycode - min_keycode + 1) times.
+ *
+ * @sa xkb_keymap_min_keycode() xkb_keymap_max_keycode() xkb_keycode_t
+ * @memberof xkb_keymap
+ */
+void
+xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter,
+                        void *data);
+
 /**
  * Get the number of modifiers in the keymap.
  *