Move per_key_repeats and enabled_ctrls to keymap
authorRan Benita <ran234@gmail.com>
Sat, 14 Jul 2012 22:45:34 +0000 (01:45 +0300)
committerRan Benita <ran234@gmail.com>
Wed, 18 Jul 2012 09:25:29 +0000 (12:25 +0300)
All of the per-key data and global flags are now visible directly in the
keymap.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/alloc.c
src/alloc.h
src/keymap-dump.c
src/map.c
src/state.c
src/xkb-priv.h
src/xkbcomp/compat.c
src/xkbcomp/symbols.c

index 8441f5239aa7651b354de74564181538f1c165e3..6cd5fc214e6f60e4b363c349cea74ba7ad2adc1e 100644 (file)
@@ -168,36 +168,6 @@ free_names(struct xkb_keymap *keymap)
     free(keymap->compat_section_name);
 }
 
-int
-XkbcAllocControls(struct xkb_keymap *keymap)
-{
-    if (!keymap)
-        return BadMatch;
-
-    if (!keymap->ctrls) {
-        keymap->ctrls = uTypedCalloc(1, struct xkb_controls);
-        if (!keymap->ctrls)
-            return BadAlloc;
-    }
-
-    keymap->ctrls->per_key_repeat = uTypedCalloc(keymap->max_key_code >> 3,
-                                                 unsigned char);
-    if (!keymap->ctrls->per_key_repeat)
-        return BadAlloc;
-
-    return Success;
-}
-
-static void
-XkbcFreeControls(struct xkb_keymap *keymap)
-{
-    if (keymap && keymap->ctrls) {
-        free(keymap->ctrls->per_key_repeat);
-        free(keymap->ctrls);
-        keymap->ctrls = NULL;
-    }
-}
-
 struct xkb_keymap *
 XkbcAllocKeyboard(struct xkb_context *ctx)
 {
@@ -229,7 +199,7 @@ XkbcFreeKeyboard(struct xkb_keymap *keymap)
     free(keymap->vmodmap);
     darray_free(keymap->sym_interpret);
     free_names(keymap);
-    XkbcFreeControls(keymap);
+    free(keymap->per_key_repeat);
     xkb_context_unref(keymap->ctx);
     free(keymap);
 }
index a5259909b86b3333eef6b7aa73bd10c7b4ac2b27..34a5a9130ca10e78f98b338d5ca1ed8f8687a991 100644 (file)
@@ -29,9 +29,6 @@
 
 #include "xkb-priv.h"
 
-extern int
-XkbcAllocControls(struct xkb_keymap *keymap);
-
 extern struct xkb_keymap *
 XkbcAllocKeyboard(struct xkb_context *ctx);
 
index 8599d2f6d7ef05f2aff6bbea09abd6350476fece..b836418d81ff7db6bf429dcea1e622cfb802766d 100644 (file)
@@ -842,9 +842,8 @@ write_symbols(struct xkb_keymap *keymap, char **buf, size_t *size,
                               darray_item(keymap->types, type).name);
                 }
             }
-            if (keymap->ctrls &&
-                (keymap->explicit[key] & XkbExplicitAutoRepeatMask)) {
-                if (keymap->ctrls->per_key_repeat[key / 8] & (1 << (key % 8)))
+            if (keymap->explicit[key] & XkbExplicitAutoRepeatMask) {
+                if (keymap->per_key_repeat[key / 8] & (1 << (key % 8)))
                     write_buf(keymap, buf, size, offset,
                               "\n\t\t\trepeat= Yes,");
                 else
index 4fa587647da5c376a020b8c0330cf797e3411d59..16ee80daebb88539555bd21dcaf929e119128a97 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -357,5 +357,5 @@ err:
 _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)));
+    return !!(keymap->per_key_repeat[key / 8] & (1 << (key % 8)));
 }
index 4174383526a98902c74582d828c54d3583a3178d..76eb287ee155b20df0bc71434acb6932bc6699bf 100644 (file)
@@ -562,7 +562,7 @@ xkb_state_led_update_all(struct xkb_state *state)
                 state->leds |= (1 << led);
         }
         else if (map->ctrls) {
-            if ((map->ctrls & state->keymap->ctrls->enabled_ctrls))
+            if ((map->ctrls & state->keymap->enabled_ctrls))
                 state->leds |= (1 << led);
         }
     }
index 9463b1cf945023e155a7c1086278458ac1a1f660..0d1431f1ce6d3a10793550d63f7bd86b3aa7d553 100644 (file)
@@ -294,34 +294,33 @@ struct xkb_key_alias {
 };
 
 struct xkb_controls {
-    /* unsigned char groups_wrap; */
-    /* struct xkb_mods internal; */
-    /* struct xkb_mods ignore_lock; */
-    unsigned int enabled_ctrls;
-    /* unsigned short repeat_delay; */
-    /* unsigned short repeat_interval; */
-    /* unsigned short slow_keys_delay; */
-    /* unsigned short debounce_delay; */
-    /* unsigned short ax_options; */
-    /* unsigned short ax_timeout; */
-    /* unsigned short axt_opts_mask; */
-    /* unsigned short axt_opts_values; */
-    /* unsigned int axt_ctrls_mask; */
-    /* unsigned int axt_ctrls_values; */
-    unsigned char *per_key_repeat;
+    unsigned char groups_wrap;
+    struct xkb_mods internal;
+    struct xkb_mods ignore_lock;
+    unsigned short repeat_delay;
+    unsigned short repeat_interval;
+    unsigned short slow_keys_delay;
+    unsigned short debounce_delay;
+    unsigned short ax_options;
+    unsigned short ax_timeout;
+    unsigned short axt_opts_mask;
+    unsigned short axt_opts_values;
+    unsigned int axt_ctrls_mask;
+    unsigned int axt_ctrls_values;
 };
 
 /* Common keyboard description structure */
 struct xkb_keymap {
-    struct xkb_context  *ctx;
+    struct xkb_context *ctx;
+
+    int refcnt;
+    enum xkb_map_compile_flags flags;
+
+    unsigned int enabled_ctrls;
 
-    unsigned int refcnt;
-    unsigned short flags;
     xkb_keycode_t min_key_code;
     xkb_keycode_t max_key_code;
 
-    struct xkb_controls *      ctrls;
-
     /* key -> key name mapping */
     darray(struct xkb_key_name) key_names;
     /* aliases in no particular order */
@@ -355,6 +354,9 @@ struct xkb_keymap {
     /* key -> behavior mapping */
     struct xkb_behavior *behaviors;
 
+    /* key -> should repeat mapping - one bit per key */
+    unsigned char *per_key_repeat;
+
     struct xkb_indicator_map indicators[XkbNumIndicators];
     char *indicator_names[XkbNumIndicators];
 
index 01dfde3bd7d9eb10cd28387ca9a1e395b8cecf24..d7332c12bf93146425aaf89678f696ce707dd184 100644 (file)
@@ -932,8 +932,7 @@ ApplyInterpsToKey(struct xkb_keymap *keymap, xkb_keycode_t key)
             if (group == 0 && level == 0) {
                 if (!(keymap->explicit[key] & XkbExplicitAutoRepeatMask) &&
                     (!interp || interp->flags & XkbSI_AutoRepeat))
-                    keymap->ctrls->per_key_repeat[key / 8] |=
-                        (1 << (key % 8));
+                    keymap->per_key_repeat[key / 8] |= (1 << (key % 8));
                 if (!(keymap->explicit[key] & XkbExplicitBehaviorMask) &&
                     interp && (interp->flags & XkbSI_LockingKey))
                     keymap->behaviors[key].type = XkbKB_Lock;
index 7f8b9d12795ca00d88b72c3f2b4ee61749472af1..2033e98de7e100e843ace2ad06c0952765b57ff3 100644 (file)
@@ -1850,9 +1850,9 @@ CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *key, int start_from)
     }
     if (key->repeat != RepeatUndefined) {
         if (key->repeat == RepeatYes)
-            keymap->ctrls->per_key_repeat[kc / 8] |= (1 << (kc % 8));
+            keymap->per_key_repeat[kc / 8] |= (1 << (kc % 8));
         else
-            keymap->ctrls->per_key_repeat[kc / 8] &= ~(1 << (kc % 8));
+            keymap->per_key_repeat[kc / 8] &= ~(1 << (kc % 8));
         keymap->explicit[kc] |= XkbExplicitAutoRepeatMask;
     }
 
@@ -1942,11 +1942,9 @@ CompileSymbols(XkbFile *file, struct xkb_keymap *keymap,
     if (!keymap->vmodmap)
         goto err_info;
 
-    if (XkbcAllocControls(keymap) != Success) {
-        WSGO("Could not allocate controls in CompileSymbols\n");
-        ACTION("Symbols not added\n");
+    keymap->per_key_repeat = calloc(keymap->max_key_code / 8, 1);
+    if (!keymap->per_key_repeat)
         goto err_info;
-    }
 
     if (info.name)
         keymap->symbols_section_name = strdup(info.name);