#include "alloc.h"
int
-XkbcAllocClientMap(struct xkb_keymap *keymap, unsigned which,
- size_t nTotalTypes)
-{
- if (!keymap || ((nTotalTypes > 0) && (nTotalTypes < XkbNumRequiredTypes)))
- return BadValue;
-
- if (!keymap->map) {
- keymap->map = calloc(1, sizeof(*keymap->map));
- if (!keymap->map)
- return BadAlloc;
- darray_init(keymap->map->types);
- }
-
- if (which & XkbKeyTypesMask)
- darray_growalloc(keymap->map->types, nTotalTypes);
-
- if (which & XkbKeySymsMask)
- darray_resize0(keymap->map->key_sym_map, keymap->max_key_code + 1);
-
- if (which & XkbModifierMapMask) {
- if (!keymap->map->modmap) {
- keymap->map->modmap = uTypedCalloc(keymap->max_key_code + 1,
- unsigned char);
- if (!keymap->map->modmap)
- return BadAlloc;
- }
- }
-
- return Success;
-}
-
-int
XkbcAllocServerMap(struct xkb_keymap *keymap, unsigned which,
unsigned nNewActions)
{
XkbcResizeKeySyms(struct xkb_keymap *keymap, xkb_keycode_t key,
unsigned int needed)
{
- darray_resize0(darray_item(keymap->map->key_sym_map, key).syms, needed);
+ darray_resize0(darray_item(keymap->key_sym_map, key).syms, needed);
return true;
}
return XkbKeyActionsPtr(keymap, key);
}
-void
-XkbcFreeClientMap(struct xkb_keymap *keymap)
+static void
+free_types(struct xkb_keymap *keymap)
{
- struct xkb_client_map * map;
- struct xkb_key_type * type;
- struct xkb_sym_map *sym_map;
-
- if (!keymap || !keymap->map)
- return;
-
- map = keymap->map;
+ struct xkb_key_type *type;
- darray_foreach(type, map->types) {
+ darray_foreach(type, keymap->types) {
int j;
darray_free(type->map);
free(type->preserve);
free(type->level_names);
free(type->name);
}
- darray_free(map->types);
+ darray_free(keymap->types);
+}
+
+static void
+free_sym_maps(struct xkb_keymap *keymap)
+{
+ struct xkb_sym_map *sym_map;
- darray_foreach(sym_map, map->key_sym_map) {
+ darray_foreach(sym_map, keymap->key_sym_map) {
free(sym_map->sym_index);
free(sym_map->num_syms);
darray_free(sym_map->syms);
}
- darray_free(map->key_sym_map);
-
- free(map->modmap);
- free(keymap->map);
- keymap->map = NULL;
+ darray_free(keymap->key_sym_map);
}
void
darray_init(keymap->names->key_aliases);
}
- if ((which & XkbKTLevelNamesMask) && keymap->map) {
+ if ((which & XkbKTLevelNamesMask) && keymap) {
struct xkb_key_type * type;
- darray_foreach(type, keymap->map->types) {
+ darray_foreach(type, keymap->types) {
if (!type->level_names) {
type->level_names = calloc(type->num_levels,
sizeof(*type->level_names));
XkbcFreeNames(struct xkb_keymap *keymap)
{
struct xkb_names * names;
- struct xkb_client_map * map;
struct xkb_key_type *type;
int i;
return;
names = keymap->names;
- map = keymap->map;
-
- if (map) {
- darray_foreach(type, map->types) {
- int j;
- for (j = 0; j < type->num_levels; j++)
- free(type->level_names[j]);
- free(type->level_names);
- type->level_names = NULL;
- }
+
+ darray_foreach(type, keymap->types) {
+ int j;
+ for (j = 0; j < type->num_levels; j++)
+ free(type->level_names[j]);
+ free(type->level_names);
+ type->level_names = NULL;
}
free(names->keycodes);
if (!keymap)
return;
- XkbcFreeClientMap(keymap);
+ free_types(keymap);
+ free_sym_maps(keymap);
+ free(keymap->modmap);
XkbcFreeServerMap(keymap);
XkbcFreeCompatMap(keymap);
XkbcFreeIndicatorMaps(keymap);
XkbcFreeKeyboard(struct xkb_keymap *keymap);
extern int
-XkbcAllocClientMap(struct xkb_keymap *keymap, unsigned which,
- size_t nTotalTypes);
-
-extern int
XkbcAllocServerMap(struct xkb_keymap *keymap, unsigned which,
unsigned nNewActions);
uint32_t needed);
extern void
-XkbcFreeClientMap(struct xkb_keymap *keymap);
-
-extern void
XkbcFreeServerMap(struct xkb_keymap *keymap);
#endif /* ALLOC_H */
write_vmods(keymap, buf, size, offset);
- darray_foreach(type, keymap->map->types) {
+ darray_foreach(type, keymap->types) {
write_buf(keymap, buf, size, offset, "\t\ttype \"%s\" {\n",
type->name);
write_buf(keymap, buf, size, offset, "\t\t\tmodifiers= %s;\n",
write_symbols(struct xkb_keymap *keymap, char **buf, size_t *size,
size_t *offset)
{
- struct xkb_client_map *map = keymap->map;
struct xkb_server_map *srv = keymap->server;
xkb_keycode_t key;
int group, tmp;
write_buf(keymap, buf, size, offset,
"\n\t\t\ttype[group%d]= \"%s\",",
group + 1,
- darray_item(map->types, type).name);
+ darray_item(keymap->types, type).name);
}
}
else {
write_buf(keymap, buf, size, offset,
"\n\t\t\ttype= \"%s\",",
- darray_item(map->types, type).name);
+ darray_item(keymap->types, type).name);
}
}
if (keymap->ctrls &&
write_buf(keymap, buf, size, offset, "\n\t\t};\n");
}
}
- if (map && map->modmap) {
+ if (keymap->modmap) {
for (key = keymap->min_key_code; key <= keymap->max_key_code;
key++) {
int mod;
- if (map->modmap[key] == 0)
+ if (keymap->modmap[key] == 0)
continue;
for (mod = 0; mod < XkbNumModifiers; mod++) {
- if (!(map->modmap[key] & (1 << mod)))
+ if (!(keymap->modmap[key] & (1 << mod)))
continue;
write_buf(keymap, buf, size, offset,
darray(xkb_keysym_t) syms;
};
-struct xkb_client_map {
- darray(struct xkb_key_type) types;
- darray(struct xkb_sym_map) key_sym_map;
- unsigned char *modmap;
-};
-
struct xkb_behavior {
unsigned char type;
unsigned char data;
struct xkb_controls * ctrls;
struct xkb_server_map * server;
- struct xkb_client_map * map;
struct xkb_indicator * indicators;
struct xkb_names * names;
struct xkb_compat_map * compat;
+
+ darray(struct xkb_key_type) types;
+ darray(struct xkb_sym_map) key_sym_map;
+ unsigned char *modmap;
};
#define XkbNumGroups(g) ((g) & 0x0f)
#define XkbSetNumGroups(g, n) (((g) & 0xf0) | ((n) & 0x0f))
#define XkbKeyGroupInfo(d, k) \
- (darray_item((d)->map->key_sym_map, k).group_info)
+ (darray_item((d)->key_sym_map, k).group_info)
#define XkbKeyNumGroups(d, k) \
- (XkbNumGroups(darray_item((d)->map->key_sym_map, k).group_info))
+ (XkbNumGroups(darray_item((d)->key_sym_map, k).group_info))
#define XkbKeyGroupWidth(d, k, g) \
(XkbKeyType(d, k, g)->num_levels)
#define XkbKeyGroupsWidth(d, k) \
- (darray_item((d)->map->key_sym_map, k).width)
+ (darray_item((d)->key_sym_map, k).width)
#define XkbKeyTypeIndex(d, k, g) \
- (darray_item((d)->map->key_sym_map, k).kt_index[g & 0x3])
+ (darray_item((d)->key_sym_map, k).kt_index[g & 0x3])
#define XkbKeyType(d, k, g) \
- (&darray_item((d)->map->types, XkbKeyTypeIndex(d, k, g)))
+ (&darray_item((d)->types, XkbKeyTypeIndex(d, k, g)))
#define XkbKeyNumSyms(d, k, g, sl) \
(darray_item((d)->map->key_sym_map, \
k).num_syms[(g * XkbKeyGroupsWidth(d, k)) + sl])
#define XkbKeySym(d, k, n) \
- (&darray_item(darray_item((d)->map->key_sym_map, k).syms, n))
+ (&darray_item(darray_item((d)->key_sym_map, k).syms, n))
#define XkbKeySymOffset(d, k, g, sl) \
(darray_item((d)->map->key_sym_map, \
k).sym_index[(g * XkbKeyGroupsWidth(d, k)) + sl])
continue;
if (level == 0 || !(interp->match & XkbSI_LevelOneOnly))
- mods = keymap->map->modmap[key];
+ mods = keymap->modmap[key];
else
mods = 0;
for (i = 0; i < XkbNumVirtualMods; i++) {
if (!(keymap->server->vmodmap[key] & (1 << i)))
continue;
- keymap->server->vmods[i] |= keymap->map->modmap[key];
+ keymap->server->vmods[i] |= keymap->modmap[key];
}
}
/* Now update the level masks for all the types to reflect the vmods. */
- darray_foreach(type, keymap->map->types) {
+ darray_foreach(type, keymap->types) {
uint32_t mask = 0;
int j;
type->mods.mask = type->mods.real_mods;
for (i = 0; i < XkbKeyNumActions(keymap, key); i++) {
if (acts[i].any.type == XkbSA_NoAction)
continue;
- UpdateActionMods(keymap, &acts[i], keymap->map->modmap[key]);
+ UpdateActionMods(keymap, &acts[i], keymap->modmap[key]);
}
}
InitCanonicalKeyTypes(struct xkb_keymap *keymap, unsigned which,
int keypadVMod)
{
- struct xkb_client_map *map;
const struct xkb_key_type *from;
int rtrn;
- rtrn = XkbcAllocClientMap(keymap, XkbKeyTypesMask, XkbNumRequiredTypes);
- if (rtrn != Success)
- return rtrn;
+ darray_growalloc(keymap->types, XkbNumRequiredTypes);
- map = keymap->map;
if ((which & XkbAllRequiredTypes) == 0)
return Success;
if (which & XkbOneLevelMask)
rtrn = XkbcCopyKeyType(&from[XkbOneLevelIndex],
- &darray_item(map->types, XkbOneLevelIndex));
+ &darray_item(keymap->types, XkbOneLevelIndex));
if ((which & XkbTwoLevelMask) && rtrn == Success)
rtrn = XkbcCopyKeyType(&from[XkbTwoLevelIndex],
- &darray_item(map->types, XkbTwoLevelIndex));
+ &darray_item(keymap->types, XkbTwoLevelIndex));
if ((which & XkbAlphabeticMask) && rtrn == Success)
rtrn = XkbcCopyKeyType(&from[XkbAlphabeticIndex],
- &darray_item(map->types, XkbAlphabeticIndex));
+ &darray_item(keymap->types, XkbAlphabeticIndex));
if ((which & XkbKeypadMask) && rtrn == Success) {
struct xkb_key_type *type;
rtrn = XkbcCopyKeyType(&from[XkbKeypadIndex],
- &darray_item(map->types, XkbKeypadIndex));
- type = &darray_item(map->types, XkbKeypadIndex);
+ &darray_item(keymap->types, XkbKeypadIndex));
+ type = &darray_item(keymap->types, XkbKeypadIndex);
if (keypadVMod >= 0 && keypadVMod < XkbNumVirtualMods &&
rtrn == Success) {
if ((info.stdPresent & XkbAlphabeticMask) == 0)
i++;
- if (XkbcAllocClientMap(keymap, XkbKeyTypesMask, i) != Success) {
- WSGO("Couldn't allocate client map\n");
- goto err_info;
- }
-
- darray_resize0(keymap->map->types, i);
+ darray_resize0(keymap->types, i);
if (XkbAllRequiredTypes & (~info.stdPresent)) {
unsigned missing, keypadVMod;
}
if (missing & XkbOneLevelMask)
- darray_item(keymap->map->types, XkbOneLevelIndex).name =
+ darray_item(keymap->types, XkbOneLevelIndex).name =
xkb_atom_strdup(keymap->ctx, tok_ONE_LEVEL);
if (missing & XkbTwoLevelMask)
- darray_item(keymap->map->types, XkbTwoLevelIndex).name =
+ darray_item(keymap->types, XkbTwoLevelIndex).name =
xkb_atom_strdup(keymap->ctx, tok_TWO_LEVEL);
if (missing & XkbAlphabeticMask)
- darray_item(keymap->map->types, XkbAlphabeticIndex).name =
+ darray_item(keymap->types, XkbAlphabeticIndex).name =
xkb_atom_strdup(keymap->ctx, tok_ALPHABETIC);
if (missing & XkbKeypadMask)
- darray_item(keymap->map->types, XkbKeypadIndex).name =
+ darray_item(keymap->types, XkbKeypadIndex).name =
xkb_atom_strdup(keymap->ctx, tok_KEYPAD);
}
- next = &darray_item(keymap->map->types, XkbLastRequiredType + 1);
+ next = &darray_item(keymap->types, XkbLastRequiredType + 1);
for (i = 0, def = info.types; i < info.nTypes; i++) {
if (def->name == tok_ONE_LEVEL)
- type = &darray_item(keymap->map->types, XkbOneLevelIndex);
+ type = &darray_item(keymap->types, XkbOneLevelIndex);
else if (def->name == tok_TWO_LEVEL)
- type = &darray_item(keymap->map->types, XkbTwoLevelIndex);
+ type = &darray_item(keymap->types, XkbTwoLevelIndex);
else if (def->name == tok_ALPHABETIC)
- type = &darray_item(keymap->map->types, XkbAlphabeticIndex);
+ type = &darray_item(keymap->types, XkbAlphabeticIndex);
else if (def->name == tok_KEYPAD)
- type = &darray_item(keymap->map->types, XkbKeypadIndex);
+ type = &darray_item(keymap->types, XkbKeypadIndex);
else
type = next++;
const char *name = xkb_atom_text(keymap->ctx, atom);
struct xkb_key_type *type;
- if (keymap && keymap->map) {
- darray_foreach(type, keymap->map->types) {
+ if (keymap) {
+ darray_foreach(type, keymap->types) {
if (strcmp(type->name, name) == 0) {
*type_rtrn = n;
return true;
types[i] = XkbTwoLevelIndex;
}
/* if the type specifies fewer levels than the key has, shrink the key */
- type = &darray_item(keymap->map->types, types[i]);
+ type = &darray_item(keymap->types, types[i]);
if (type->num_levels < key->numLevels[i]) {
if (warningLevel > 0) {
WARN("Type \"%s\" has %d levels, but %s has %d symbols\n",
else
outActs = NULL;
- sym_map = &darray_item(keymap->map->key_sym_map, kc);
+ sym_map = &darray_item(keymap->key_sym_map, kc);
if (key->defs.defined & _Key_GroupInfo)
i = key->groupInfo;
}
return false;
}
- keymap->map->modmap[kc] |= (1 << entry->modifier);
+ keymap->modmap[kc] |= (1 << entry->modifier);
return true;
}
goto err_info;
}
- if (XkbcAllocClientMap(keymap, XkbKeySymsMask | XkbModifierMapMask, 0)
- != Success) {
- WSGO("Could not allocate client map in CompileSymbols\n");
- ACTION("Symbols not added\n");
+ darray_resize0(keymap->key_sym_map, keymap->max_key_code + 1);
+ keymap->modmap = calloc(keymap->max_key_code + 1,
+ sizeof(*keymap->modmap));
+ if (!keymap->modmap)
goto err_info;
- }
if (XkbcAllocServerMap(keymap, XkbAllServerInfoMask, 32) != Success) {
WSGO("Could not allocate server map in CompileSymbols\n");