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.
31 #include "X11/extensions/XKBcommon.h"
32 #include "XKBcommonint.h"
33 #include <X11/extensions/XKB.h>
36 XkbcAllocCompatMap(XkbcDescPtr xkb, unsigned which, unsigned nSI)
38 XkbcCompatMapPtr compat;
39 XkbcSymInterpretRec *prev_interpret;
45 if (xkb->compat->size_si >= nSI)
49 compat->size_si = nSI;
50 if (!compat->sym_interpret)
53 prev_interpret = compat->sym_interpret;
54 compat->sym_interpret = _XkbTypedRealloc(compat->sym_interpret,
55 nSI, XkbcSymInterpretRec);
56 if (!compat->sym_interpret) {
57 _XkbFree(prev_interpret);
58 compat->size_si = compat->num_si = 0;
62 if (compat->num_si != 0)
63 _XkbClearElems(compat->sym_interpret, compat->num_si,
64 compat->size_si - 1, XkbcSymInterpretRec);
69 compat = _XkbTypedCalloc(1, XkbcCompatMapRec);
74 compat->sym_interpret = _XkbTypedCalloc(nSI, XkbcSymInterpretRec);
75 if (!compat->sym_interpret) {
80 compat->size_si = nSI;
82 bzero(&compat->groups[0], XkbNumKbdGroups * sizeof(XkbcModsRec));
90 XkbcFreeCompatMap(XkbcDescPtr xkb, unsigned which, Bool freeMap)
92 XkbcCompatMapPtr compat;
94 if (!xkb || !xkb->compat)
99 which = XkbAllCompatMask;
101 if (which & XkbGroupCompatMask)
102 bzero(&compat->groups[0], XkbNumKbdGroups * sizeof(XkbcModsRec));
104 if (which & XkbSymInterpMask) {
105 if (compat->sym_interpret && (compat->size_si > 0))
106 _XkbFree(compat->sym_interpret);
107 compat->size_si = compat->num_si = 0;
108 compat->sym_interpret = NULL;
118 XkbcAllocNames(XkbcDescPtr xkb, unsigned which, int nTotalRG, int nTotalAliases)
126 xkb->names = _XkbTypedCalloc(1, XkbcNamesRec);
132 if ((which & XkbKTLevelNamesMask) && xkb->map && xkb->map->types) {
136 type = xkb->map->types;
137 for (i = 0; i < xkb->map->num_types; i++, type++) {
138 if (!type->level_names) {
139 type->level_names = _XkbTypedCalloc(type->num_levels, uint32_t);
140 if (!type->level_names)
146 if ((which & XkbKeyNamesMask) && !names->keys) {
147 if ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
148 (!XkbIsLegalKeycode(xkb->max_key_code)) ||
149 (xkb->max_key_code < xkb->min_key_code))
152 names->keys = _XkbTypedCalloc(xkb->max_key_code + 1, XkbKeyNameRec);
157 if ((which & XkbKeyAliasesMask) && (nTotalAliases > 0)) {
158 if (!names->key_aliases)
159 names->key_aliases = _XkbTypedCalloc(nTotalAliases,
161 else if (nTotalAliases > names->num_key_aliases) {
162 XkbKeyAliasRec *prev_aliases = names->key_aliases;
164 names->key_aliases = _XkbTypedRealloc(names->key_aliases,
167 if (names->key_aliases)
168 _XkbClearElems(names->key_aliases, names->num_key_aliases,
169 nTotalAliases - 1, XkbKeyAliasRec);
171 _XkbFree(prev_aliases);
174 if (!names->key_aliases) {
175 names->num_key_aliases = 0;
179 names->num_key_aliases = nTotalAliases;
182 if ((which & XkbRGNamesMask) && (nTotalRG > 0)) {
183 if (!names->radio_groups)
184 names->radio_groups = _XkbTypedCalloc(nTotalRG, uint32_t);
185 else if (nTotalRG > names->num_rg) {
186 uint32_t *prev_radio_groups = names->radio_groups;
188 names->radio_groups = _XkbTypedRealloc(names->radio_groups,
190 if (names->radio_groups)
191 _XkbClearElems(names->radio_groups, names->num_rg,
192 nTotalRG - 1, uint32_t);
194 _XkbFree(prev_radio_groups);
197 if (!names->radio_groups)
200 names->num_rg = nTotalRG;
207 XkbcFreeNames(XkbcDescPtr xkb, unsigned which, Bool freeMap)
211 if (!xkb || !xkb->names)
216 which = XkbAllNamesMask;
218 if (which & XkbKTLevelNamesMask) {
219 XkbcClientMapPtr map = xkb->map;
221 if (map && map->types) {
223 XkbcKeyTypePtr type = map->types;
225 for (i = 0; i < map->num_types; i++, type++) {
226 if (type->level_names) {
227 _XkbFree(type->level_names);
228 type->level_names = NULL;
234 if ((which & XkbKeyNamesMask) && names->keys) {
235 _XkbFree(names->keys);
240 if ((which & XkbKeyAliasesMask) && names->key_aliases) {
241 _XkbFree(names->key_aliases);
242 names->key_aliases = NULL;
243 names->num_key_aliases = 0;
246 if ((which & XkbRGNamesMask) && names->radio_groups) {
247 _XkbFree(names->radio_groups);
248 names->radio_groups = NULL;
259 XkbcAllocControls(XkbcDescPtr xkb, unsigned which)
265 xkb->ctrls = _XkbTypedCalloc(1, XkbControlsRec);
274 XkbcFreeControls(XkbcDescPtr xkb, unsigned which, Bool freeMap)
276 if (freeMap && xkb && xkb->ctrls) {
277 _XkbFree(xkb->ctrls);
283 XkbcAllocIndicatorMaps(XkbcDescPtr xkb)
288 if (!xkb->indicators) {
289 xkb->indicators = _XkbTypedCalloc(1, XkbIndicatorRec);
290 if (!xkb->indicators)
298 XkbcFreeIndicatorMaps(XkbcDescPtr xkb)
300 if (xkb && xkb->indicators) {
301 _XkbFree(xkb->indicators);
302 xkb->indicators = NULL;
307 XkbcAllocKeyboard(void)
311 xkb = _XkbTypedCalloc(1, XkbcDescRec);
313 xkb->device_spec = XkbUseCoreKbd;
318 XkbcFreeKeyboard(XkbcDescPtr xkb, unsigned which, Bool freeAll)
324 which = XkbAllComponentsMask;
326 if (which & XkbClientMapMask)
327 XkbcFreeClientMap(xkb, XkbAllClientInfoMask, True);
328 if (which & XkbServerMapMask)
329 XkbcFreeServerMap(xkb, XkbAllServerInfoMask, True);
330 if (which & XkbCompatMapMask)
331 XkbcFreeCompatMap(xkb, XkbAllCompatMask, True);
332 if (which & XkbIndicatorMapMask)
333 XkbcFreeIndicatorMaps(xkb);
334 if (which & XkbNamesMask)
335 XkbcFreeNames(xkb, XkbAllNamesMask, True);
336 if ((which & XkbGeometryMask) && xkb->geom)
337 XkbcFreeGeometry(xkb->geom, XkbGeomAllMask, True);
338 if (which & XkbControlsMask)
339 XkbcFreeControls(xkb, XkbAllControlsMask, True);