Add xkb_key_repeats
authorDaniel Stone <daniel@fooishbar.org>
Fri, 22 Jun 2012 14:27:05 +0000 (15:27 +0100)
committerDaniel Stone <daniel@fooishbar.org>
Fri, 22 Jun 2012 14:27:05 +0000 (15:27 +0100)
Does what it says on the box.

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

index 4c148d53d89a1d36572c05bb3a1218b36c2e2594..31d0dcfabc91b1a704866a5154aaa7b3c7f31ab5 100644 (file)
@@ -366,6 +366,12 @@ xkb_map_group_get_index(struct xkb_keymap *keymap, const char *name);
 xkb_group_index_t
 xkb_key_num_groups(struct xkb_keymap *keymap, xkb_keycode_t key);
 
+/**
+ * Returns 1 if the key should repeat, or 0 otherwise.
+ */
+int
+xkb_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t key);
+
 /**
  * Returns the number of LEDs in the given map.
  */
index d4c8f3dd43390eb06bbcadbb89e21e89d8f4e9a3..d9afc1a5ca95f99421c20239b3ea437d4c383b66 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -351,3 +351,12 @@ err:
     *syms_out = NULL;
     return 0;
 }
+
+/**
+ * Simple boolean specifying whether or not the key should repeat.
+ */
+_X_EXPORT int
+xkb_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t key)
+{
+    return !!(keymap->ctrls->per_key_repeat[key / 8] & (1 << (key % 8)));
+}
index 2409a23677fba81c19e9a02627459f991f102531..d32a1ea4e92ea9d86914e40dcb956cfbc4efa1cc 100644 (file)
@@ -227,6 +227,18 @@ test_serialisation(struct xkb_keymap *keymap)
     xkb_state_unref(state);
 }
 
+static void
+test_repeat(struct xkb_keymap *keymap)
+{
+    xkb_keycode_t key;
+    fprintf(stderr, "%s\n", xkb_map_get_as_string(keymap));
+    for (key = keymap->min_key_code; key < keymap->max_key_code; key++)
+        if (xkb_key_repeats(keymap, key))
+            fprintf(stderr, "%d repeats!\n", key);
+    assert(!xkb_key_repeats(keymap, KEY_LEFTSHIFT + 8));
+    assert(xkb_key_repeats(keymap, KEY_A + 8));
+}
+
 int
 main(void)
 {
@@ -248,6 +260,7 @@ main(void)
 
     test_update_key(keymap);
     test_serialisation(keymap);
+    test_repeat(keymap);
 
     xkb_map_unref(keymap);
     xkb_context_unref(context);