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.
30 XkbcAllocClientMap(struct xkb_keymap *keymap, unsigned which,
33 struct xkb_client_map * map;
35 if (!keymap || ((nTotalTypes > 0) && (nTotalTypes < XkbNumRequiredTypes)))
38 if ((which & XkbKeySymsMask) &&
39 !xkb_keymap_keycode_range_is_legal(keymap)) {
41 fprintf(stderr, "bad keycode (%d,%d) in XkbAllocClientMap\n",
42 keymap->min_key_code, keymap->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(keymap->max_key_code + 1,
86 if (!map->key_sym_map)
91 if (which & XkbModifierMapMask) {
93 map->modmap = uTypedCalloc(keymap->max_key_code + 1,
104 XkbcAllocServerMap(struct xkb_keymap *keymap, unsigned which,
105 unsigned nNewActions)
108 struct xkb_server_map * map;
113 if (!keymap->server) {
114 map = uTypedCalloc(1, struct xkb_server_map);
118 for (i = 0; i < XkbNumVirtualMods; i++)
119 map->vmods[i] = XkbNoModifierMask;
121 keymap->server = map;
124 map = keymap->server;
129 if (!xkb_keymap_keycode_range_is_legal(keymap))
132 if (!map->explicit) {
133 i = keymap->max_key_code + 1;
134 map->explicit = uTypedCalloc(i, unsigned char);
143 map->acts = uTypedCalloc(nNewActions + 1, union xkb_action);
147 map->size_acts = nNewActions + 1;
149 else if ((map->size_acts - map->num_acts) < (int)nNewActions) {
151 union xkb_action *prev_acts = map->acts;
153 need = map->num_acts + nNewActions;
154 map->acts = uTypedRealloc(map->acts, need, union xkb_action);
157 map->num_acts = map->size_acts = 0;
161 map->size_acts = need;
162 memset(&map->acts[map->num_acts], 0,
163 (map->size_acts - map->num_acts) * sizeof(union xkb_action));
166 if (!map->key_acts) {
167 i = keymap->max_key_code + 1;
168 map->key_acts = uTypedCalloc(i, unsigned short);
173 if (!map->behaviors) {
174 i = keymap->max_key_code + 1;
175 map->behaviors = uTypedCalloc(i, struct xkb_behavior);
181 i = keymap->max_key_code + 1;
182 map->vmodmap = uTypedCalloc(i, uint32_t);
191 XkbcCopyKeyType(struct xkb_key_type * from, struct xkb_key_type * into)
200 free(into->preserve);
201 into->preserve= NULL;
202 for (i = 0; i < into->num_levels; i++)
203 free(UNCONSTIFY(into->level_names[i]));
204 free(into->level_names);
205 into->level_names = NULL;
209 if (from->map && (into->map_count > 0)) {
210 into->map = uTypedCalloc(into->map_count, struct xkb_kt_map_entry);
213 memcpy(into->map, from->map,
214 into->map_count * sizeof(struct xkb_kt_map_entry));
217 if (from->preserve && (into->map_count > 0)) {
218 into->preserve = uTypedCalloc(into->map_count, struct xkb_mods);
221 memcpy(into->preserve, from->preserve,
222 into->map_count * sizeof(struct xkb_mods));
225 if (from->level_names && (into->num_levels > 0)) {
226 into->level_names = uTypedCalloc(into->num_levels, const char *);
227 if (!into->level_names)
229 for (i = 0; i < into->num_levels; i++)
230 into->level_names[i] = strdup(from->level_names[i]);
237 XkbcResizeKeySyms(struct xkb_keymap *keymap, xkb_keycode_t key,
240 if (keymap->map->key_sym_map[key].size_syms >= needed)
243 keymap->map->key_sym_map[key].syms =
244 uTypedRecalloc(keymap->map->key_sym_map[key].syms,
245 keymap->map->key_sym_map[key].size_syms,
248 if (!keymap->map->key_sym_map[key].syms) {
249 keymap->map->key_sym_map[key].size_syms = 0;
252 keymap->map->key_sym_map[key].size_syms = needed;
258 XkbcResizeKeyActions(struct xkb_keymap *keymap, xkb_keycode_t key,
261 xkb_keycode_t i, nActs;
262 union xkb_action *newActs;
265 keymap->server->key_acts[key] = 0;
269 if (XkbKeyHasActions(keymap, key) &&
270 (XkbKeyGroupsWidth(keymap, key) >= needed))
271 return XkbKeyActionsPtr(keymap, key);
273 if (keymap->server->size_acts - keymap->server->num_acts >= (int)needed) {
274 keymap->server->key_acts[key] = keymap->server->num_acts;
275 keymap->server->num_acts += needed;
277 return &keymap->server->acts[keymap->server->key_acts[key]];
280 keymap->server->size_acts = keymap->server->num_acts + needed + 8;
281 newActs = uTypedCalloc(keymap->server->size_acts, union xkb_action);
284 newActs[0].type = XkbSA_NoAction;
287 for (i = keymap->min_key_code; i <= keymap->max_key_code; i++) {
288 xkb_keycode_t nKeyActs, nCopy;
290 if ((keymap->server->key_acts[i] == 0) && (i != key))
293 nCopy = nKeyActs = XkbKeyNumActions(keymap, i);
301 memcpy(&newActs[nActs], XkbKeyActionsPtr(keymap, i),
302 nCopy * sizeof(union xkb_action));
303 if (nCopy < nKeyActs)
304 memset(&newActs[nActs + nCopy], 0,
305 (nKeyActs - nCopy) * sizeof(union xkb_action));
307 keymap->server->key_acts[i] = nActs;
311 free(keymap->server->acts);
312 keymap->server->acts = newActs;
313 keymap->server->num_acts = nActs;
315 return &keymap->server->acts[keymap->server->key_acts[key]];
319 XkbcFreeClientMap(struct xkb_keymap *keymap)
321 struct xkb_client_map * map;
322 struct xkb_key_type * type;
326 if (!keymap || !keymap->map)
331 for (i = 0, type = map->types; i < map->num_types && type; i++, type++) {
334 free(type->preserve);
335 for (j = 0; j < type->num_levels; j++)
336 free(UNCONSTIFY(type->level_names[j]));
337 free(type->level_names);
338 free(UNCONSTIFY(type->name));
342 if (map->key_sym_map) {
343 for (key = keymap->min_key_code; key < keymap->max_key_code; key++) {
344 free(map->key_sym_map[key].sym_index);
345 free(map->key_sym_map[key].num_syms);
346 free(map->key_sym_map[key].syms);
349 free(map->key_sym_map);
357 XkbcFreeServerMap(struct xkb_keymap *keymap)
359 struct xkb_server_map * map;
361 if (keymap || keymap->server)
364 map = keymap->server;
369 free(map->behaviors);
371 free(keymap->server);
372 keymap->server = NULL;
376 XkbcAllocCompatMap(struct xkb_keymap *keymap, unsigned nSI)
378 struct xkb_compat_map * compat;
379 struct xkb_sym_interpret *prev_interpret;
384 if (keymap->compat) {
385 if (keymap->compat->size_si >= nSI)
388 compat = keymap->compat;
389 compat->size_si = nSI;
390 if (!compat->sym_interpret)
393 prev_interpret = compat->sym_interpret;
394 compat->sym_interpret = uTypedRecalloc(compat->sym_interpret,
396 struct xkb_sym_interpret);
397 if (!compat->sym_interpret) {
398 free(prev_interpret);
399 compat->size_si = compat->num_si = 0;
406 compat = uTypedCalloc(1, struct xkb_compat_map);
411 compat->sym_interpret = uTypedCalloc(nSI, struct xkb_sym_interpret);
412 if (!compat->sym_interpret) {
417 compat->size_si = nSI;
419 memset(&compat->groups[0], 0, XkbNumKbdGroups * sizeof(struct xkb_mods));
420 keymap->compat = compat;
427 XkbcFreeCompatMap(struct xkb_keymap *keymap)
429 struct xkb_compat_map * compat;
431 if (!keymap || !keymap->compat)
434 compat = keymap->compat;
436 free(compat->sym_interpret);
438 keymap->compat = NULL;
442 XkbcAllocNames(struct xkb_keymap *keymap, unsigned which,
443 unsigned nTotalAliases)
445 struct xkb_names * names;
450 if (!keymap->names) {
451 keymap->names = uTypedCalloc(1, struct xkb_names);
455 names = keymap->names;
457 if ((which & XkbKTLevelNamesMask) && keymap->map && keymap->map->types) {
459 struct xkb_key_type * type;
461 type = keymap->map->types;
462 for (i = 0; i < keymap->map->num_types; i++, type++) {
463 if (!type->level_names) {
464 type->level_names = uTypedCalloc(type->num_levels, const char *);
465 if (!type->level_names)
471 if ((which & XkbKeyNamesMask) && !names->keys) {
472 if (!xkb_keymap_keycode_range_is_legal(keymap))
475 names->keys = uTypedCalloc(keymap->max_key_code + 1,
476 struct xkb_key_name);
481 if ((which & XkbKeyAliasesMask) && (nTotalAliases > 0)) {
482 if (!names->key_aliases)
483 names->key_aliases = uTypedCalloc(nTotalAliases,
484 struct xkb_key_alias);
485 else if (nTotalAliases > names->num_key_aliases) {
486 struct xkb_key_alias *prev_aliases = names->key_aliases;
488 names->key_aliases = uTypedRecalloc(names->key_aliases,
489 names->num_key_aliases,
491 struct xkb_key_alias);
492 if (!names->key_aliases)
496 if (!names->key_aliases) {
497 names->num_key_aliases = 0;
501 names->num_key_aliases = nTotalAliases;
508 XkbcFreeNames(struct xkb_keymap *keymap)
510 struct xkb_names * names;
511 struct xkb_client_map * map;
514 if (!keymap || !keymap->names)
517 names = keymap->names;
520 if (map && map->types) {
521 struct xkb_key_type * type = map->types;
523 for (i = 0; i < map->num_types; i++, type++) {
525 for (j = 0; j < type->num_levels; j++)
526 free(UNCONSTIFY(type->level_names[i]));
527 free(type->level_names);
528 type->level_names = NULL;
532 for (i = 0; i < XkbNumVirtualMods; i++)
533 free(UNCONSTIFY(names->vmods[i]));
534 for (i = 0; i < XkbNumIndicators; i++)
535 free(UNCONSTIFY(names->indicators[i]));
536 for (i = 0; i < XkbNumKbdGroups; i++)
537 free(UNCONSTIFY(names->groups[i]));
540 free(names->key_aliases);
542 keymap->names = NULL;
546 XkbcAllocControls(struct xkb_keymap *keymap)
551 if (!keymap->ctrls) {
552 keymap->ctrls = uTypedCalloc(1, struct xkb_controls);
557 keymap->ctrls->per_key_repeat = uTypedCalloc(keymap->max_key_code >> 3,
559 if (!keymap->ctrls->per_key_repeat)
566 XkbcFreeControls(struct xkb_keymap *keymap)
568 if (keymap && keymap->ctrls) {
569 free(keymap->ctrls->per_key_repeat);
571 keymap->ctrls = NULL;
576 XkbcAllocIndicatorMaps(struct xkb_keymap *keymap)
581 if (!keymap->indicators) {
582 keymap->indicators = uTypedCalloc(1, struct xkb_indicator);
583 if (!keymap->indicators)
591 XkbcFreeIndicatorMaps(struct xkb_keymap *keymap)
594 free(keymap->indicators);
595 keymap->indicators = NULL;
600 XkbcAllocKeyboard(struct xkb_ctx *ctx)
602 struct xkb_keymap *keymap;
604 keymap = uTypedCalloc(1, struct xkb_keymap);
609 keymap->ctx = xkb_ctx_ref(ctx);
615 XkbcFreeKeyboard(struct xkb_keymap *keymap)
620 XkbcFreeClientMap(keymap);
621 XkbcFreeServerMap(keymap);
622 XkbcFreeCompatMap(keymap);
623 XkbcFreeIndicatorMaps(keymap);
624 XkbcFreeNames(keymap);
625 XkbcFreeControls(keymap);
626 xkb_ctx_unref(keymap->ctx);