2 Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
4 Permission to use, copy, modify, and distribute this
5 software and its documentation for any purpose and without
6 fee is hereby granted, provided that the above copyright
7 notice appear in all copies and that both that copyright
8 notice and this permission notice appear in supporting
9 documentation, and that the name of Silicon Graphics not be
10 used in advertising or publicity pertaining to distribution
11 of the software without specific prior written permission.
12 Silicon Graphics makes no representation about the suitability
13 of this software for any purpose. It is provided "as is"
14 without any express or implied warranty.
16 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23 THE USE OR PERFORMANCE OF THIS SOFTWARE.
28 #include "xkbcommon/xkbcommon.h"
29 #include "XKBcommonint.h"
32 XkbcAllocClientMap(struct xkb_keymap * xkb, unsigned which, unsigned nTotalTypes)
34 struct xkb_client_map * map;
36 if (!xkb || ((nTotalTypes > 0) && (nTotalTypes < XkbNumRequiredTypes)))
39 if ((which & XkbKeySymsMask) && !xkb_keymap_keycode_range_is_legal(xkb)) {
41 fprintf(stderr, "bad keycode (%d,%d) in XkbAllocClientMap\n",
42 xkb->min_key_code, xkb->max_key_code);
48 map = uTypedCalloc(1, struct xkb_client_map);
56 if ((which & XkbKeyTypesMask) && (nTotalTypes > 0)) {
58 map->types = uTypedCalloc(nTotalTypes, struct xkb_key_type);
63 map->size_types = nTotalTypes;
65 else if (map->size_types < nTotalTypes) {
66 struct xkb_key_type *prev_types = map->types;
68 map->types = uTypedRealloc(map->types, nTotalTypes,
72 map->num_types = map->size_types = 0;
76 map->size_types = nTotalTypes;
77 memset(&map->types[map->num_types], 0,
78 (map->size_types - map->num_types) * sizeof(struct xkb_key_type));
82 if (which & XkbKeySymsMask) {
83 if (!map->key_sym_map) {
84 map->key_sym_map = uTypedCalloc(xkb->max_key_code + 1,
86 if (!map->key_sym_map)
91 if (which & XkbModifierMapMask) {
93 map->modmap = uTypedCalloc(xkb->max_key_code + 1, unsigned char);
103 XkbcAllocServerMap(struct xkb_keymap * xkb, unsigned which, unsigned nNewActions)
106 struct xkb_server_map * map;
112 map = uTypedCalloc(1, struct xkb_server_map);
116 for (i = 0; i < XkbNumVirtualMods; i++)
117 map->vmods[i] = XkbNoModifierMask;
127 if (!xkb_keymap_keycode_range_is_legal(xkb))
130 if (!map->explicit) {
131 i = xkb->max_key_code + 1;
132 map->explicit = uTypedCalloc(i, unsigned char);
141 map->acts = uTypedCalloc(nNewActions + 1, union xkb_action);
145 map->size_acts = nNewActions + 1;
147 else if ((map->size_acts - map->num_acts) < (int)nNewActions) {
149 union xkb_action *prev_acts = map->acts;
151 need = map->num_acts + nNewActions;
152 map->acts = uTypedRealloc(map->acts, need, union xkb_action);
155 map->num_acts = map->size_acts = 0;
159 map->size_acts = need;
160 memset(&map->acts[map->num_acts], 0,
161 (map->size_acts - map->num_acts) * sizeof(union xkb_action));
164 if (!map->key_acts) {
165 i = xkb->max_key_code + 1;
166 map->key_acts = uTypedCalloc(i, unsigned short);
171 if (!map->behaviors) {
172 i = xkb->max_key_code + 1;
173 map->behaviors = uTypedCalloc(i, struct xkb_behavior);
179 i = xkb->max_key_code + 1;
180 map->vmodmap = uTypedCalloc(i, uint32_t);
189 XkbcCopyKeyType(struct xkb_key_type * from, struct xkb_key_type * into)
198 free(into->preserve);
199 into->preserve= NULL;
200 for (i = 0; i < into->num_levels; i++)
201 free(UNCONSTIFY(into->level_names[i]));
202 free(into->level_names);
203 into->level_names = NULL;
207 if (from->map && (into->map_count > 0)) {
208 into->map = uTypedCalloc(into->map_count, struct xkb_kt_map_entry);
211 memcpy(into->map, from->map,
212 into->map_count * sizeof(struct xkb_kt_map_entry));
215 if (from->preserve && (into->map_count > 0)) {
216 into->preserve = uTypedCalloc(into->map_count, struct xkb_mods);
219 memcpy(into->preserve, from->preserve,
220 into->map_count * sizeof(struct xkb_mods));
223 if (from->level_names && (into->num_levels > 0)) {
224 into->level_names = uTypedCalloc(into->num_levels, const char *);
225 if (!into->level_names)
227 for (i = 0; i < into->num_levels; i++)
228 into->level_names[i] = strdup(from->level_names[i]);
235 XkbcResizeKeySyms(struct xkb_keymap * xkb, xkb_keycode_t key,
238 if (xkb->map->key_sym_map[key].size_syms >= needed)
241 xkb->map->key_sym_map[key].syms =
242 uTypedRecalloc(xkb->map->key_sym_map[key].syms,
243 xkb->map->key_sym_map[key].size_syms,
246 if (!xkb->map->key_sym_map[key].syms) {
247 xkb->map->key_sym_map[key].size_syms = 0;
250 xkb->map->key_sym_map[key].size_syms = needed;
256 XkbcResizeKeyActions(struct xkb_keymap * xkb, xkb_keycode_t key, uint32_t needed)
258 xkb_keycode_t i, nActs;
259 union xkb_action *newActs;
262 xkb->server->key_acts[key] = 0;
266 if (XkbKeyHasActions(xkb, key) &&
267 (XkbKeyGroupsWidth(xkb, key) >= needed))
268 return XkbKeyActionsPtr(xkb, key);
270 if (xkb->server->size_acts - xkb->server->num_acts >= (int)needed) {
271 xkb->server->key_acts[key] = xkb->server->num_acts;
272 xkb->server->num_acts += needed;
274 return &xkb->server->acts[xkb->server->key_acts[key]];
277 xkb->server->size_acts = xkb->server->num_acts + needed + 8;
278 newActs = uTypedCalloc(xkb->server->size_acts, union xkb_action);
281 newActs[0].type = XkbSA_NoAction;
284 for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) {
285 xkb_keycode_t nKeyActs, nCopy;
287 if ((xkb->server->key_acts[i] == 0) && (i != key))
290 nCopy = nKeyActs = XkbKeyNumActions(xkb, i);
298 memcpy(&newActs[nActs], XkbKeyActionsPtr(xkb, i),
299 nCopy * sizeof(union xkb_action));
300 if (nCopy < nKeyActs)
301 memset(&newActs[nActs + nCopy], 0,
302 (nKeyActs - nCopy) * sizeof(union xkb_action));
304 xkb->server->key_acts[i] = nActs;
308 free(xkb->server->acts);
309 xkb->server->acts = newActs;
310 xkb->server->num_acts = nActs;
312 return &xkb->server->acts[xkb->server->key_acts[key]];
316 XkbcFreeClientMap(struct xkb_keymap * xkb)
318 struct xkb_client_map * map;
319 struct xkb_key_type * type;
323 if (!xkb || !xkb->map)
328 for (i = 0, type = map->types; i < map->num_types && type; i++, type++) {
331 free(type->preserve);
332 for (j = 0; j < type->num_levels; j++)
333 free(UNCONSTIFY(type->level_names[j]));
334 free(type->level_names);
335 free(UNCONSTIFY(type->name));
339 if (map->key_sym_map) {
340 for (key = xkb->min_key_code; key < xkb->max_key_code; key++) {
341 free(map->key_sym_map[key].sym_index);
342 free(map->key_sym_map[key].num_syms);
343 free(map->key_sym_map[key].syms);
346 free(map->key_sym_map);
354 XkbcFreeServerMap(struct xkb_keymap * xkb)
356 struct xkb_server_map * map;
358 if (!xkb || !xkb->server)
366 free(map->behaviors);
373 XkbcAllocCompatMap(struct xkb_keymap *xkb, unsigned nSI)
375 struct xkb_compat_map * compat;
376 struct xkb_sym_interpret *prev_interpret;
382 if (xkb->compat->size_si >= nSI)
385 compat = xkb->compat;
386 compat->size_si = nSI;
387 if (!compat->sym_interpret)
390 prev_interpret = compat->sym_interpret;
391 compat->sym_interpret = uTypedRecalloc(compat->sym_interpret,
393 struct xkb_sym_interpret);
394 if (!compat->sym_interpret) {
395 free(prev_interpret);
396 compat->size_si = compat->num_si = 0;
403 compat = uTypedCalloc(1, struct xkb_compat_map);
408 compat->sym_interpret = uTypedCalloc(nSI, struct xkb_sym_interpret);
409 if (!compat->sym_interpret) {
414 compat->size_si = nSI;
416 memset(&compat->groups[0], 0, XkbNumKbdGroups * sizeof(struct xkb_mods));
417 xkb->compat = compat;
424 XkbcFreeCompatMap(struct xkb_keymap * xkb)
426 struct xkb_compat_map * compat;
428 if (!xkb || !xkb->compat)
431 compat = xkb->compat;
433 free(compat->sym_interpret);
439 XkbcAllocNames(struct xkb_keymap * xkb, unsigned which, unsigned nTotalAliases)
441 struct xkb_names * names;
447 xkb->names = uTypedCalloc(1, struct xkb_names);
453 if ((which & XkbKTLevelNamesMask) && xkb->map && xkb->map->types) {
455 struct xkb_key_type * type;
457 type = xkb->map->types;
458 for (i = 0; i < xkb->map->num_types; i++, type++) {
459 if (!type->level_names) {
460 type->level_names = uTypedCalloc(type->num_levels, const char *);
461 if (!type->level_names)
467 if ((which & XkbKeyNamesMask) && !names->keys) {
468 if (!xkb_keymap_keycode_range_is_legal(xkb))
471 names->keys = uTypedCalloc(xkb->max_key_code + 1, struct xkb_key_name);
476 if ((which & XkbKeyAliasesMask) && (nTotalAliases > 0)) {
477 if (!names->key_aliases)
478 names->key_aliases = uTypedCalloc(nTotalAliases,
479 struct xkb_key_alias);
480 else if (nTotalAliases > names->num_key_aliases) {
481 struct xkb_key_alias *prev_aliases = names->key_aliases;
483 names->key_aliases = uTypedRecalloc(names->key_aliases,
484 names->num_key_aliases,
486 struct xkb_key_alias);
487 if (!names->key_aliases)
491 if (!names->key_aliases) {
492 names->num_key_aliases = 0;
496 names->num_key_aliases = nTotalAliases;
503 XkbcFreeNames(struct xkb_keymap * xkb)
505 struct xkb_names * names;
506 struct xkb_client_map * map;
509 if (!xkb || !xkb->names)
515 if (map && map->types) {
516 struct xkb_key_type * type = map->types;
518 for (i = 0; i < map->num_types; i++, type++) {
520 for (j = 0; j < type->num_levels; j++)
521 free(UNCONSTIFY(type->level_names[i]));
522 free(type->level_names);
523 type->level_names = NULL;
527 for (i = 0; i < XkbNumVirtualMods; i++)
528 free(UNCONSTIFY(names->vmods[i]));
529 for (i = 0; i < XkbNumIndicators; i++)
530 free(UNCONSTIFY(names->indicators[i]));
531 for (i = 0; i < XkbNumKbdGroups; i++)
532 free(UNCONSTIFY(names->groups[i]));
535 free(names->key_aliases);
541 XkbcAllocControls(struct xkb_keymap * xkb)
547 xkb->ctrls = uTypedCalloc(1, struct xkb_controls);
552 xkb->ctrls->per_key_repeat = uTypedCalloc(xkb->max_key_code << 3,
554 if (!xkb->ctrls->per_key_repeat)
561 XkbcFreeControls(struct xkb_keymap * xkb)
563 if (xkb && xkb->ctrls) {
564 free(xkb->ctrls->per_key_repeat);
571 XkbcAllocIndicatorMaps(struct xkb_keymap * xkb)
576 if (!xkb->indicators) {
577 xkb->indicators = uTypedCalloc(1, struct xkb_indicator);
578 if (!xkb->indicators)
586 XkbcFreeIndicatorMaps(struct xkb_keymap * xkb)
589 free(xkb->indicators);
590 xkb->indicators = NULL;
595 XkbcAllocKeyboard(struct xkb_context *context)
597 struct xkb_keymap *xkb;
599 xkb = uTypedCalloc(1, struct xkb_keymap);
604 xkb->context = xkb_context_ref(context);
610 XkbcFreeKeyboard(struct xkb_keymap * xkb)
615 XkbcFreeClientMap(xkb);
616 XkbcFreeServerMap(xkb);
617 XkbcFreeCompatMap(xkb);
618 XkbcFreeIndicatorMaps(xkb);
620 XkbcFreeControls(xkb);
621 xkb_context_unref(xkb->context);