Get rid of struct xkb_sym_map

Past its usefulness; put the stuff directly in xkb_key.

Signed-off-by: Ran Benita <ran234@gmail.com>
master
Ran Benita 2012-07-15 13:15:33 +03:00
parent 7d9f031341
commit 4066fcc9b5
4 changed files with 42 additions and 54 deletions

View File

@ -66,14 +66,6 @@ XkbcCopyKeyType(const struct xkb_key_type *from, struct xkb_key_type *into)
return Success;
}
bool
XkbcResizeKeySyms(struct xkb_keymap *keymap, xkb_keycode_t kc,
unsigned int needed)
{
darray_resize0(XkbKey(keymap, kc)->sym_map.syms, needed);
return true;
}
union xkb_action *
XkbcResizeKeyActions(struct xkb_keymap *keymap, xkb_keycode_t kc,
uint32_t needed)
@ -135,15 +127,17 @@ free_types(struct xkb_keymap *keymap)
}
static void
free_sym_maps(struct xkb_keymap *keymap)
free_keys(struct xkb_keymap *keymap)
{
struct xkb_key *key;
darray_foreach(key, keymap->keys) {
free(key->sym_map.sym_index);
free(key->sym_map.num_syms);
darray_free(key->sym_map.syms);
free(key->sym_index);
free(key->num_syms);
darray_free(key->syms);
}
darray_free(keymap->keys);
}
static void
@ -190,11 +184,10 @@ XkbcFreeKeyboard(struct xkb_keymap *keymap)
return;
free_types(keymap);
free_sym_maps(keymap);
darray_free(keymap->acts);
darray_free(keymap->sym_interpret);
free_names(keymap);
darray_free(keymap->keys);
free_keys(keymap);
xkb_context_unref(keymap->ctx);
free(keymap);
}

View File

@ -38,10 +38,6 @@ XkbcFreeKeyboard(struct xkb_keymap *keymap);
extern int
XkbcCopyKeyType(const struct xkb_key_type *from, struct xkb_key_type *into);
extern bool
XkbcResizeKeySyms(struct xkb_keymap *keymap, xkb_keycode_t kc,
uint32_t needed);
extern union xkb_action *
XkbcResizeKeyActions(struct xkb_keymap *keymap, xkb_keycode_t kc,
uint32_t needed);

View File

@ -261,15 +261,6 @@ struct xkb_sym_interpret {
union xkb_action act;
};
struct xkb_sym_map {
unsigned char kt_index[XkbNumKbdGroups];
unsigned char group_info;
unsigned char width;
int *sym_index; /* per level/group index into 'syms' */
unsigned int *num_syms; /* per level/group */
darray(xkb_keysym_t) syms;
};
struct xkb_behavior {
unsigned char type;
unsigned char data;
@ -307,14 +298,28 @@ struct xkb_controls {
struct xkb_key {
char name[XkbKeyNameLength];
unsigned char explicit;
struct xkb_sym_map sym_map;
unsigned char modmap;
uint32_t vmodmap;
struct xkb_behavior behavior;
bool repeats;
/* Index into keymap->acts */
size_t acts_index;
unsigned char kt_index[XkbNumKbdGroups];
unsigned char group_info;
unsigned char width;
/* per level/group index into 'syms' */
int *sym_index;
/* per level/group */
unsigned int *num_syms;
darray(xkb_keysym_t) syms;
};
/* Common keyboard description structure */
@ -406,7 +411,7 @@ XkbSetNumGroups(unsigned char group_info, unsigned char num_groups)
static inline unsigned char
XkbKeyGroupInfo(struct xkb_keymap *keymap, xkb_keycode_t kc)
{
return XkbKey(keymap, kc)->sym_map.group_info;
return XkbKey(keymap, kc)->group_info;
}
static inline unsigned char
@ -419,7 +424,7 @@ static inline unsigned char
XkbKeyTypeIndex(struct xkb_keymap *keymap, xkb_keycode_t kc,
unsigned int group)
{
return XkbKey(keymap, kc)->sym_map.kt_index[group & 0x3];
return XkbKey(keymap, kc)->kt_index[group & 0x3];
}
static inline struct xkb_key_type *
@ -438,7 +443,7 @@ XkbKeyGroupWidth(struct xkb_keymap *keymap, xkb_keycode_t kc,
static inline unsigned char
XkbKeyGroupsWidth(struct xkb_keymap *keymap, xkb_keycode_t kc)
{
return XkbKey(keymap, kc)->sym_map.width;
return XkbKey(keymap, kc)->width;
}
static inline unsigned int
@ -446,13 +451,13 @@ XkbKeyNumSyms(struct xkb_keymap *keymap, xkb_keycode_t kc,
unsigned int group, unsigned int level)
{
unsigned char width = XkbKeyGroupsWidth(keymap, kc);
return XkbKey(keymap, kc)->sym_map.num_syms[group * width + level];
return XkbKey(keymap, kc)->num_syms[group * width + level];
}
static inline xkb_keysym_t *
XkbKeySym(struct xkb_keymap *keymap, xkb_keycode_t kc, int ndx)
{
return &darray_item(XkbKey(keymap, kc)->sym_map.syms, ndx);
return &darray_item(XkbKey(keymap, kc)->syms, ndx);
}
static inline int
@ -460,7 +465,7 @@ XkbKeySymOffset(struct xkb_keymap *keymap, xkb_keycode_t kc,
unsigned group, unsigned int level)
{
unsigned char width = XkbKeyGroupsWidth(keymap, kc);
return XkbKey(keymap, kc)->sym_map.sym_index[group * width + level];
return XkbKey(keymap, kc)->sym_index[group * width + level];
}
static inline xkb_keysym_t *

View File

@ -1701,7 +1701,6 @@ CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *keyi, int start_from)
unsigned types[XkbNumKbdGroups];
union xkb_action *outActs;
unsigned int symIndex = 0;
struct xkb_sym_map *sym_map;
useAlias = (start_from == 0);
@ -1774,11 +1773,8 @@ CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *keyi, int start_from)
sizeSyms += darray_size(keyi->syms[i]);
}
if (!XkbcResizeKeySyms(keymap, kc, sizeSyms)) {
WSGO("Could not enlarge symbols for %s (keycode %d)\n",
longText(keyi->name), kc);
return false;
}
darray_resize0(key->syms, sizeSyms);
if (haveActions) {
outActs = XkbcResizeKeyActions(keymap, kc, width * nGroups);
if (outActs == NULL) {
@ -1791,17 +1787,15 @@ CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *keyi, int start_from)
else
outActs = NULL;
sym_map = &key->sym_map;
if (keyi->defs.defined & _Key_GroupInfo)
i = keyi->groupInfo;
else
i = sym_map->group_info;
i = key->group_info;
sym_map->group_info = XkbSetNumGroups(i, nGroups);
sym_map->width = width;
sym_map->sym_index = uTypedCalloc(nGroups * width, int);
sym_map->num_syms = uTypedCalloc(nGroups * width, unsigned int);
key->group_info = XkbSetNumGroups(i, nGroups);
key->width = width;
key->sym_index = uTypedCalloc(nGroups * width, int);
key->num_syms = uTypedCalloc(nGroups * width, unsigned int);
for (i = 0; i < nGroups; i++) {
/* assign kt_index[i] to the index of the type in map->types.
@ -1812,25 +1806,25 @@ CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *keyi, int start_from)
* FIXME: There should be a better fix for this.
*/
if (keyi->numLevels[i])
sym_map->kt_index[i] = types[i];
key->kt_index[i] = types[i];
if (!darray_empty(keyi->syms[i])) {
/* fill key to "width" symbols*/
for (tmp = 0; tmp < width; tmp++) {
if (tmp < keyi->numLevels[i] &&
darray_item(keyi->symsMapNumEntries[i], tmp) != 0) {
memcpy(darray_mem(sym_map->syms, symIndex),
memcpy(darray_mem(key->syms, symIndex),
darray_mem(keyi->syms[i],
darray_item(keyi->symsMapIndex[i], tmp)),
darray_item(keyi->symsMapNumEntries[i],
tmp) * sizeof(xkb_keysym_t));
sym_map->sym_index[(i * width) + tmp] = symIndex;
sym_map->num_syms[(i * width) + tmp] =
key->sym_index[(i * width) + tmp] = symIndex;
key->num_syms[(i * width) + tmp] =
darray_item(keyi->symsMapNumEntries[i], tmp);
symIndex += sym_map->num_syms[(i * width) + tmp];
symIndex += key->num_syms[(i * width) + tmp];
}
else {
sym_map->sym_index[(i * width) + tmp] = -1;
sym_map->num_syms[(i * width) + tmp] = 0;
key->sym_index[(i * width) + tmp] = -1;
key->num_syms[(i * width) + tmp] = 0;
}
if (outActs != NULL && !darray_empty(keyi->acts[i])) {
if (tmp < keyi->numLevels[i])