1 /************************************************************
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.
25 ********************************************************/
27 #ifdef HAVE_DIX_CONFIG_H
28 #include <dix-config.h>
29 #elif defined(HAVE_CONFIG_H)
37 #include "XKBlibint.h"
38 #include <X11/extensions/XKBgeom.h>
39 #include <X11/extensions/XKBproto.h>
40 #include "XKBlibint.h"
46 #include <X11/Xproto.h>
49 #include <X11/extensions/XKBsrv.h>
50 #include <X11/extensions/XKBgeom.h>
52 #endif /* XKB_IN_SERVER */
54 /***===================================================================***/
58 XkbAllocCompatMap(XkbDescPtr xkb,unsigned which,unsigned nSI)
60 XkbCompatMapPtr compat;
61 XkbSymInterpretRec *prev_interpret;
66 if (xkb->compat->size_si>=nSI)
70 if (compat->sym_interpret==NULL)
72 prev_interpret = compat->sym_interpret;
73 compat->sym_interpret= _XkbTypedRealloc(compat->sym_interpret,
74 nSI,XkbSymInterpretRec);
75 if (compat->sym_interpret==NULL) {
76 _XkbFree(prev_interpret);
77 compat->size_si= compat->num_si= 0;
80 if (compat->num_si!=0) {
81 _XkbClearElems(compat->sym_interpret,compat->num_si,
82 compat->size_si-1,XkbSymInterpretRec);
86 compat= _XkbTypedCalloc(1,XkbCompatMapRec);
90 compat->sym_interpret= _XkbTypedCalloc(nSI,XkbSymInterpretRec);
91 if (!compat->sym_interpret) {
98 bzero((char *)&compat->groups[0],XkbNumKbdGroups*sizeof(XkbModsRec));
105 XkbFreeCompatMap(XkbDescPtr xkb,unsigned which,Bool freeMap)
107 register XkbCompatMapPtr compat;
109 if ((xkb==NULL)||(xkb->compat==NULL))
113 which= XkbAllCompatMask;
114 if (which&XkbGroupCompatMask)
115 bzero((char *)&compat->groups[0],XkbNumKbdGroups*sizeof(XkbModsRec));
116 if (which&XkbSymInterpMask) {
117 if ((compat->sym_interpret)&&(compat->size_si>0))
118 _XkbFree(compat->sym_interpret);
119 compat->size_si= compat->num_si= 0;
120 compat->sym_interpret= NULL;
129 /***===================================================================***/
132 XkbAllocNames(XkbDescPtr xkb,unsigned which,int nTotalRG,int nTotalAliases)
138 if (xkb->names==NULL) {
139 xkb->names = _XkbTypedCalloc(1,XkbNamesRec);
140 if (xkb->names==NULL)
144 if ((which&XkbKTLevelNamesMask)&&(xkb->map!=NULL)&&(xkb->map->types!=NULL)){
148 type= xkb->map->types;
149 for (i=0;i<xkb->map->num_types;i++,type++) {
150 if (type->level_names==NULL) {
151 type->level_names= _XkbTypedCalloc(type->num_levels,Atom);
152 if (type->level_names==NULL)
157 if ((which&XkbKeyNamesMask)&&(names->keys==NULL)) {
158 if ((!XkbIsLegalKeycode(xkb->min_key_code))||
159 (!XkbIsLegalKeycode(xkb->max_key_code))||
160 (xkb->max_key_code<xkb->min_key_code))
162 names->keys= _XkbTypedCalloc((xkb->max_key_code+1),XkbKeyNameRec);
163 if (names->keys==NULL)
166 if ((which&XkbKeyAliasesMask)&&(nTotalAliases>0)) {
167 if (names->key_aliases==NULL) {
168 names->key_aliases= _XkbTypedCalloc(nTotalAliases,XkbKeyAliasRec);
170 else if (nTotalAliases>names->num_key_aliases) {
171 XkbKeyAliasRec *prev_aliases = names->key_aliases;
173 names->key_aliases= _XkbTypedRealloc(names->key_aliases,
174 nTotalAliases,XkbKeyAliasRec);
175 if (names->key_aliases!=NULL) {
176 _XkbClearElems(names->key_aliases,names->num_key_aliases,
177 nTotalAliases-1,XkbKeyAliasRec);
179 _XkbFree(prev_aliases);
182 if (names->key_aliases==NULL) {
183 names->num_key_aliases= 0;
186 names->num_key_aliases= nTotalAliases;
188 if ((which&XkbRGNamesMask)&&(nTotalRG>0)) {
189 if (names->radio_groups==NULL) {
190 names->radio_groups= _XkbTypedCalloc(nTotalRG,Atom);
192 else if (nTotalRG>names->num_rg) {
193 Atom *prev_radio_groups = names->radio_groups;
195 names->radio_groups= _XkbTypedRealloc(names->radio_groups,nTotalRG,
197 if (names->radio_groups!=NULL) {
198 _XkbClearElems(names->radio_groups,names->num_rg,nTotalRG-1,
201 _XkbFree(prev_radio_groups);
204 if (names->radio_groups==NULL)
206 names->num_rg= nTotalRG;
212 XkbFreeNames(XkbDescPtr xkb,unsigned which,Bool freeMap)
216 if ((xkb==NULL)||(xkb->names==NULL))
220 which= XkbAllNamesMask;
221 if (which&XkbKTLevelNamesMask) {
222 XkbClientMapPtr map= xkb->map;
223 if ((map!=NULL)&&(map->types!=NULL)) {
225 register XkbKeyTypePtr type;
227 for (i=0;i<map->num_types;i++,type++) {
228 if (type->level_names!=NULL) {
229 _XkbFree(type->level_names);
230 type->level_names= NULL;
235 if ((which&XkbKeyNamesMask)&&(names->keys!=NULL)) {
236 _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;
245 if ((which&XkbRGNamesMask)&&(names->radio_groups)) {
246 _XkbFree(names->radio_groups);
247 names->radio_groups= NULL;
257 /***===================================================================***/
261 XkbAllocControls(XkbDescPtr xkb,unsigned which)
266 if (xkb->ctrls==NULL) {
267 xkb->ctrls= _XkbTypedCalloc(1,XkbControlsRec);
276 XkbFreeControls(XkbDescPtr xkb,unsigned which,Bool freeMap)
278 if (freeMap && (xkb!=NULL) && (xkb->ctrls!=NULL)) {
279 _XkbFree(xkb->ctrls);
285 /***===================================================================***/
288 XkbAllocIndicatorMaps(XkbDescPtr xkb)
292 if (xkb->indicators==NULL) {
293 xkb->indicators= _XkbTypedCalloc(1,XkbIndicatorRec);
294 if (!xkb->indicators)
301 XkbFreeIndicatorMaps(XkbDescPtr xkb)
303 if ((xkb!=NULL)&&(xkb->indicators!=NULL)) {
304 _XkbFree(xkb->indicators);
305 xkb->indicators= NULL;
310 /***====================================================================***/
313 XkbAllocKeyboard(void)
317 xkb = _XkbTypedCalloc(1,XkbDescRec);
319 xkb->device_spec= XkbUseCoreKbd;
324 XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll)
329 which= XkbAllComponentsMask;
330 if (which&XkbClientMapMask)
331 XkbFreeClientMap(xkb,XkbAllClientInfoMask,True);
332 if (which&XkbServerMapMask)
333 XkbFreeServerMap(xkb,XkbAllServerInfoMask,True);
334 if (which&XkbCompatMapMask)
335 XkbFreeCompatMap(xkb,XkbAllCompatMask,True);
336 if (which&XkbIndicatorMapMask)
337 XkbFreeIndicatorMaps(xkb);
338 if (which&XkbNamesMask)
339 XkbFreeNames(xkb,XkbAllNamesMask,True);
340 if ((which&XkbGeometryMask) && (xkb->geom!=NULL))
341 XkbFreeGeometry(xkb->geom,XkbGeomAllMask,True);
342 if (which&XkbControlsMask)
343 XkbFreeControls(xkb,XkbAllControlsMask,True);
349 /***====================================================================***/
352 XkbAddDeviceLedInfo(XkbDeviceInfoPtr devi,unsigned ledClass,unsigned ledId)
354 XkbDeviceLedInfoPtr devli;
357 if ((!devi)||(!XkbSingleXIClass(ledClass))||(!XkbSingleXIId(ledId)))
359 for (i=0,devli=devi->leds;i<devi->num_leds;i++,devli++) {
360 if ((devli->led_class==ledClass)&&(devli->led_id==ledId))
363 if (devi->num_leds>=devi->sz_leds) {
364 XkbDeviceLedInfoRec *prev_leds = devi->leds;
366 if (devi->sz_leds>0) devi->sz_leds*= 2;
367 else devi->sz_leds= 1;
368 devi->leds= _XkbTypedRealloc(devi->leds,devi->sz_leds,
369 XkbDeviceLedInfoRec);
372 devi->sz_leds= devi->num_leds= 0;
376 for (devli=&devi->leds[i];i<devi->sz_leds;i++,devli++) {
377 bzero(devli,sizeof(XkbDeviceLedInfoRec));
378 devli->led_class= XkbXINone;
379 devli->led_id= XkbXINone;
382 devli= &devi->leds[devi->num_leds++];
383 bzero(devli,sizeof(XkbDeviceLedInfoRec));
384 devli->led_class= ledClass;
385 devli->led_id= ledId;
390 XkbResizeDeviceButtonActions(XkbDeviceInfoPtr devi,unsigned newTotal)
392 XkbAction *prev_btn_acts;
394 if ((!devi)||(newTotal>255))
396 if ((devi->btn_acts!=NULL)&&(newTotal==devi->num_btns))
399 if (devi->btn_acts!=NULL) {
400 _XkbFree(devi->btn_acts);
401 devi->btn_acts= NULL;
406 prev_btn_acts = devi->btn_acts;
407 devi->btn_acts= _XkbTypedRealloc(devi->btn_acts,newTotal,XkbAction);
408 if (devi->btn_acts==NULL) {
409 _XkbFree(prev_btn_acts);
413 if (newTotal>devi->num_btns) {
415 act= &devi->btn_acts[devi->num_btns];
416 bzero((char *)act,(newTotal-devi->num_btns)*sizeof(XkbAction));
418 devi->num_btns= newTotal;
424 XkbAllocDeviceInfo(unsigned deviceSpec,unsigned nButtons,unsigned szLeds)
426 XkbDeviceInfoPtr devi;
428 devi= _XkbTypedCalloc(1,XkbDeviceInfoRec);
430 devi->device_spec= deviceSpec;
431 devi->has_own_state= False;
433 devi->btn_acts= NULL;
435 devi->num_btns= nButtons;
436 devi->btn_acts= _XkbTypedCalloc(nButtons,XkbAction);
437 if (!devi->btn_acts) {
442 devi->dflt_kbd_fb= XkbXINone;
443 devi->dflt_led_fb= XkbXINone;
448 devi->sz_leds= szLeds;
449 devi->leds= _XkbTypedCalloc(szLeds,XkbDeviceLedInfoRec);
452 _XkbFree(devi->btn_acts);
463 XkbFreeDeviceInfo(XkbDeviceInfoPtr devi,unsigned which,Bool freeDevI)
467 which= XkbXI_AllDeviceFeaturesMask;
469 _XkbFree(devi->name);
473 if ((which&XkbXI_ButtonActionsMask)&&(devi->btn_acts)) {
474 _XkbFree(devi->btn_acts);
476 devi->btn_acts= NULL;
478 if ((which&XkbXI_IndicatorsMask)&&(devi->leds)) {
480 if ((which&XkbXI_IndicatorsMask)==XkbXI_IndicatorsMask) {
481 _XkbFree(devi->leds);
482 devi->sz_leds= devi->num_leds= 0;
486 XkbDeviceLedInfoPtr devli;
487 for (i=0,devli=devi->leds;i<devi->num_leds;i++,devli++) {
488 if (which&XkbXI_IndicatorMapsMask)
489 bzero((char *)&devli->maps[0],sizeof(devli->maps));
490 else bzero((char *)&devli->names[0],sizeof(devli->names));