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 if (!keymap || ((nTotalTypes > 0) && (nTotalTypes < XkbNumRequiredTypes)))
37 keymap->map = calloc(1, sizeof(*keymap->map));
40 darray_init(keymap->map->types);
43 if (which & XkbKeyTypesMask)
44 darray_growalloc(keymap->map->types, nTotalTypes);
46 if (which & XkbKeySymsMask)
47 darray_resize0(keymap->map->key_sym_map, keymap->max_key_code + 1);
49 if (which & XkbModifierMapMask) {
50 if (!keymap->map->modmap) {
51 keymap->map->modmap = uTypedCalloc(keymap->max_key_code + 1,
53 if (!keymap->map->modmap)
62 XkbcAllocServerMap(struct xkb_keymap *keymap, unsigned which,
66 struct xkb_server_map * map;
71 if (!keymap->server) {
72 map = uTypedCalloc(1, struct xkb_server_map);
76 for (i = 0; i < XkbNumVirtualMods; i++)
77 map->vmods[i] = XkbNoModifierMask;
88 i = keymap->max_key_code + 1;
89 map->explicit = uTypedCalloc(i, unsigned char);
97 darray_resize0(map->acts, darray_size(map->acts) + nNewActions + 1);
98 darray_resize0(map->key_acts, keymap->max_key_code + 1);
100 if (!map->behaviors) {
101 i = keymap->max_key_code + 1;
102 map->behaviors = uTypedCalloc(i, struct xkb_behavior);
108 i = keymap->max_key_code + 1;
109 map->vmodmap = uTypedCalloc(i, uint32_t);
118 XkbcCopyKeyType(const struct xkb_key_type *from, struct xkb_key_type *into)
125 darray_free(into->map);
126 free(into->preserve);
127 for (i = 0; i < into->num_levels; i++)
128 free(into->level_names[i]);
129 free(into->level_names);
133 darray_init(into->map);
134 darray_from_items(into->map,
135 &darray_item(from->map, 0),
136 darray_size(from->map));
138 if (from->preserve && !darray_empty(into->map)) {
139 into->preserve = calloc(darray_size(into->map),
140 sizeof(*into->preserve));
143 memcpy(into->preserve, from->preserve,
144 darray_size(into->map) * sizeof(*into->preserve));
147 if (from->level_names && into->num_levels > 0) {
148 into->level_names = calloc(into->num_levels,
149 sizeof(*into->level_names));
150 if (!into->level_names)
153 for (i = 0; i < into->num_levels; i++)
154 into->level_names[i] = strdup(from->level_names[i]);
161 XkbcResizeKeySyms(struct xkb_keymap *keymap, xkb_keycode_t key,
164 struct xkb_sym_map *sym_map =
165 &darray_item(keymap->map->key_sym_map, key);
167 if (sym_map->size_syms >= needed)
170 sym_map->syms = uTypedRecalloc(sym_map->syms, sym_map->size_syms,
171 needed, xkb_keysym_t);
172 if (!sym_map->syms) {
173 sym_map->size_syms = 0;
177 sym_map->size_syms = needed;
182 XkbcResizeKeyActions(struct xkb_keymap *keymap, xkb_keycode_t key,
185 size_t old_ndx, old_num_acts, new_ndx;
188 darray_item(keymap->server->key_acts, key) = 0;
192 if (XkbKeyHasActions(keymap, key) &&
193 XkbKeyGroupsWidth(keymap, key) >= needed)
194 return XkbKeyActionsPtr(keymap, key);
197 * The key may already be in the array, but without enough space.
198 * This should not happen often, so in order to avoid moving and
199 * copying stuff from acts and key_acts, we just allocate new
200 * space for the key at the end, and leave the old space alone.
203 old_ndx = darray_item(keymap->server->key_acts, key);
204 old_num_acts = XkbKeyNumActions(keymap, key);
205 new_ndx = darray_size(keymap->server->acts);
207 darray_resize0(keymap->server->acts, new_ndx + needed);
208 darray_item(keymap->server->key_acts, key) = new_ndx;
211 * The key was already in the array, copy the old actions to the
215 memcpy(&darray_item(keymap->server->acts, new_ndx),
216 &darray_item(keymap->server->acts, old_ndx),
217 old_num_acts * sizeof(union xkb_action));
219 return XkbKeyActionsPtr(keymap, key);
223 XkbcFreeClientMap(struct xkb_keymap *keymap)
225 struct xkb_client_map * map;
226 struct xkb_key_type * type;
227 struct xkb_sym_map *sym_map;
229 if (!keymap || !keymap->map)
234 darray_foreach(type, map->types) {
236 darray_free(type->map);
237 free(type->preserve);
238 for (j = 0; j < type->num_levels; j++)
239 free(type->level_names[j]);
240 free(type->level_names);
243 darray_free(map->types);
245 darray_foreach(sym_map, map->key_sym_map) {
246 free(sym_map->sym_index);
247 free(sym_map->num_syms);
250 darray_free(map->key_sym_map);
258 XkbcFreeServerMap(struct xkb_keymap *keymap)
260 struct xkb_server_map * map;
262 if (!keymap || !keymap->server)
265 map = keymap->server;
268 darray_free(map->key_acts);
269 darray_free(map->acts);
270 free(map->behaviors);
272 free(keymap->server);
273 keymap->server = NULL;
277 XkbcAllocCompatMap(struct xkb_keymap *keymap, unsigned nSI)
282 if (!keymap->compat) {
283 keymap->compat = calloc(1, sizeof(*keymap->compat));
286 darray_init(keymap->compat->sym_interpret);
289 darray_growalloc(keymap->compat->sym_interpret, nSI);
290 darray_resize(keymap->compat->sym_interpret, 0);
292 memset(keymap->compat->groups, 0,
293 XkbNumKbdGroups * sizeof(*keymap->compat->groups));
300 XkbcFreeCompatMap(struct xkb_keymap *keymap)
302 if (!keymap || !keymap->compat)
305 darray_free(keymap->compat->sym_interpret);
306 free(keymap->compat);
307 keymap->compat = NULL;
311 XkbcAllocNames(struct xkb_keymap *keymap, unsigned which, size_t nTotalAliases)
316 if (!keymap->names) {
317 keymap->names = calloc(1, sizeof(*keymap->names));
321 darray_init(keymap->names->keys);
322 darray_init(keymap->names->key_aliases);
325 if ((which & XkbKTLevelNamesMask) && keymap->map) {
326 struct xkb_key_type * type;
328 darray_foreach(type, keymap->map->types) {
329 if (!type->level_names) {
330 type->level_names = calloc(type->num_levels,
331 sizeof(*type->level_names));
332 if (!type->level_names)
338 if (which & XkbKeyNamesMask)
339 darray_resize0(keymap->names->keys, keymap->max_key_code + 1);
341 if (which & XkbKeyAliasesMask)
342 darray_resize0(keymap->names->key_aliases, nTotalAliases);
348 XkbcFreeNames(struct xkb_keymap *keymap)
350 struct xkb_names * names;
351 struct xkb_client_map * map;
352 struct xkb_key_type *type;
355 if (!keymap || !keymap->names)
358 names = keymap->names;
362 darray_foreach(type, map->types) {
364 for (j = 0; j < type->num_levels; j++)
365 free(type->level_names[j]);
366 free(type->level_names);
367 type->level_names = NULL;
371 for (i = 0; i < XkbNumVirtualMods; i++)
372 free(names->vmods[i]);
373 for (i = 0; i < XkbNumIndicators; i++)
374 free(names->indicators[i]);
375 for (i = 0; i < XkbNumKbdGroups; i++)
376 free(names->groups[i]);
378 darray_free(names->keys);
379 darray_free(names->key_aliases);
381 keymap->names = NULL;
385 XkbcAllocControls(struct xkb_keymap *keymap)
390 if (!keymap->ctrls) {
391 keymap->ctrls = uTypedCalloc(1, struct xkb_controls);
396 keymap->ctrls->per_key_repeat = uTypedCalloc(keymap->max_key_code >> 3,
398 if (!keymap->ctrls->per_key_repeat)
405 XkbcFreeControls(struct xkb_keymap *keymap)
407 if (keymap && keymap->ctrls) {
408 free(keymap->ctrls->per_key_repeat);
410 keymap->ctrls = NULL;
415 XkbcAllocIndicatorMaps(struct xkb_keymap *keymap)
420 if (!keymap->indicators) {
421 keymap->indicators = uTypedCalloc(1, struct xkb_indicator);
422 if (!keymap->indicators)
430 XkbcFreeIndicatorMaps(struct xkb_keymap *keymap)
433 free(keymap->indicators);
434 keymap->indicators = NULL;
439 XkbcAllocKeyboard(struct xkb_context *ctx)
441 struct xkb_keymap *keymap;
443 keymap = uTypedCalloc(1, struct xkb_keymap);
448 keymap->ctx = xkb_context_ref(ctx);
454 XkbcFreeKeyboard(struct xkb_keymap *keymap)
459 XkbcFreeClientMap(keymap);
460 XkbcFreeServerMap(keymap);
461 XkbcFreeCompatMap(keymap);
462 XkbcFreeIndicatorMaps(keymap);
463 XkbcFreeNames(keymap);
464 XkbcFreeControls(keymap);
465 xkb_context_unref(keymap->ctx);