Merge branch 'devel/x11' into tizen
[platform/upstream/kbproto.git] / XKBstr.h
1 /************************************************************
2 Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
3
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.
15
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.
24
25 ********************************************************/
26
27 #ifndef _XKBSTR_H_
28 #define _XKBSTR_H_
29
30 #include <X11/extensions/XKB.h>
31
32 #define XkbCharToInt(v)         ((v)&0x80?(int)((v)|(~0xff)):(int)((v)&0x7f))
33 #define XkbIntTo2Chars(i,h,l)   (((h)=((i>>8)&0xff)),((l)=((i)&0xff)))
34
35 #if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
36 #define Xkb2CharsToInt(h,l)     ((h)&0x80?(int)(((h)<<8)|(l)|(~0xffff)):\
37                                           (int)(((h)<<8)|(l)&0x7fff))
38 #else
39 #define Xkb2CharsToInt(h,l)     ((short)(((h)<<8)|(l)))
40 #endif
41
42         /*
43          * Common data structures and access macros
44          */
45
46 typedef struct _XkbStateRec {
47         unsigned char   group;
48         unsigned char   locked_group;
49         unsigned short  base_group;
50         unsigned short  latched_group;
51         unsigned char   mods;
52         unsigned char   base_mods;
53         unsigned char   latched_mods;
54         unsigned char   locked_mods;
55         unsigned char   compat_state;
56         unsigned char   grab_mods;
57         unsigned char   compat_grab_mods;
58         unsigned char   lookup_mods;
59         unsigned char   compat_lookup_mods;
60         unsigned short  ptr_buttons;
61 } XkbStateRec,*XkbStatePtr;
62 #define XkbModLocks(s)   ((s)->locked_mods)
63 #define XkbStateMods(s)  ((s)->base_mods|(s)->latched_mods|XkbModLocks(s))
64 #define XkbGroupLock(s)  ((s)->locked_group)
65 #define XkbStateGroup(s) ((s)->base_group+(s)->latched_group+XkbGroupLock(s))
66 #define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group)
67 #define XkbGrabStateFromRec(s)  XkbBuildCoreState((s)->grab_mods,(s)->group)
68
69 typedef struct _XkbMods {
70         unsigned char   mask;   /* effective mods */
71         unsigned char   real_mods;
72         unsigned short  vmods;
73 } XkbModsRec,*XkbModsPtr;
74
75 typedef struct _XkbKTMapEntry {
76         Bool            active;
77         unsigned char   level;
78         XkbModsRec      mods;
79 } XkbKTMapEntryRec,*XkbKTMapEntryPtr;
80
81 typedef struct _XkbKeyType {
82         XkbModsRec              mods;
83         unsigned char           num_levels;
84         unsigned char           map_count;
85         XkbKTMapEntryPtr        map;
86         XkbModsPtr              preserve;
87         Atom                    name;
88         Atom *                  level_names;
89 } XkbKeyTypeRec, *XkbKeyTypePtr;
90
91 #define XkbNumGroups(g)                 ((g)&0x0f)
92 #define XkbOutOfRangeGroupInfo(g)       ((g)&0xf0)
93 #define XkbOutOfRangeGroupAction(g)     ((g)&0xc0)
94 #define XkbOutOfRangeGroupNumber(g)     (((g)&0x30)>>4)
95 #define XkbSetGroupInfo(g,w,n)  (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
96 #define XkbSetNumGroups(g,n)    (((g)&0xf0)|((n)&0x0f))
97
98         /*
99          * Structures and access macros used primarily by the server
100          */
101
102 typedef struct _XkbBehavior {
103         unsigned char   type;
104         unsigned char   data;
105 } XkbBehavior;
106
107 #define XkbAnyActionDataSize 7
108 typedef struct _XkbAnyAction {
109         unsigned char   type;
110         unsigned char   data[XkbAnyActionDataSize];
111 } XkbAnyAction;
112
113 typedef struct _XkbModAction {
114         unsigned char   type;
115         unsigned char   flags;
116         unsigned char   mask;
117         unsigned char   real_mods;
118         unsigned char   vmods1;
119         unsigned char   vmods2;
120 } XkbModAction;
121 #define XkbModActionVMods(a)      \
122         ((short)(((a)->vmods1<<8)|((a)->vmods2)))
123 #define XkbSetModActionVMods(a,v) \
124         (((a)->vmods1=(((v)>>8)&0xff)),(a)->vmods2=((v)&0xff))
125
126 typedef struct _XkbGroupAction {
127         unsigned char   type;
128         unsigned char   flags;
129         char            group_XXX;
130 } XkbGroupAction;
131 #define XkbSAGroup(a)           (XkbCharToInt((a)->group_XXX))
132 #define XkbSASetGroup(a,g)      ((a)->group_XXX=(g))
133
134 typedef struct _XkbISOAction {
135         unsigned char   type;
136         unsigned char   flags;
137         unsigned char   mask;
138         unsigned char   real_mods;
139         char            group_XXX;
140         unsigned char   affect;
141         unsigned char   vmods1;
142         unsigned char   vmods2;
143 } XkbISOAction;
144
145 typedef struct _XkbPtrAction {
146         unsigned char   type;
147         unsigned char   flags;
148         unsigned char   high_XXX;
149         unsigned char   low_XXX;
150         unsigned char   high_YYY;
151         unsigned char   low_YYY;
152 } XkbPtrAction;
153 #define XkbPtrActionX(a)      (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
154 #define XkbPtrActionY(a)      (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
155 #define XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
156 #define XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
157
158 typedef struct _XkbPtrBtnAction {
159         unsigned char   type;
160         unsigned char   flags;
161         unsigned char   count;
162         unsigned char   button;
163 } XkbPtrBtnAction;
164
165 typedef struct _XkbPtrDfltAction {
166         unsigned char   type;
167         unsigned char   flags;
168         unsigned char   affect;
169         char            valueXXX;
170 } XkbPtrDfltAction;
171 #define XkbSAPtrDfltValue(a)            (XkbCharToInt((a)->valueXXX))
172 #define XkbSASetPtrDfltValue(a,c)       ((a)->valueXXX= ((c)&0xff))
173
174 typedef struct _XkbSwitchScreenAction {
175         unsigned char   type;
176         unsigned char   flags;
177         char            screenXXX;
178 } XkbSwitchScreenAction;
179 #define XkbSAScreen(a)                  (XkbCharToInt((a)->screenXXX))
180 #define XkbSASetScreen(a,s)             ((a)->screenXXX= ((s)&0xff))
181
182 typedef struct _XkbCtrlsAction {
183         unsigned char   type;
184         unsigned char   flags;
185         unsigned char   ctrls3;
186         unsigned char   ctrls2;
187         unsigned char   ctrls1;
188         unsigned char   ctrls0;
189 } XkbCtrlsAction;
190 #define XkbActionSetCtrls(a,c)  (((a)->ctrls3=(((c)>>24)&0xff)),\
191                                         ((a)->ctrls2=(((c)>>16)&0xff)),\
192                                         ((a)->ctrls1=(((c)>>8)&0xff)),\
193                                         ((a)->ctrls0=((c)&0xff)))
194 #define XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
195                            (((unsigned int)(a)->ctrls2)<<16)|\
196                            (((unsigned int)(a)->ctrls1)<<8)|\
197                            ((unsigned int)((a)->ctrls0)))
198
199 typedef struct _XkbMessageAction {
200         unsigned char   type;
201         unsigned char   flags;
202         unsigned char   message[6];
203 } XkbMessageAction;
204
205 typedef struct  _XkbRedirectKeyAction {
206         unsigned char   type;
207         unsigned char   new_key;
208         unsigned char   mods_mask;
209         unsigned char   mods;
210         unsigned char   vmods_mask0;
211         unsigned char   vmods_mask1;
212         unsigned char   vmods0;
213         unsigned char   vmods1;
214 } XkbRedirectKeyAction;
215
216 #define XkbSARedirectVMods(a)           ((((unsigned int)(a)->vmods1)<<8)|\
217                                         ((unsigned int)(a)->vmods0))
218 #define XkbSARedirectSetVMods(a,m)      (((a)->vmods_mask1=(((m)>>8)&0xff)),\
219                                          ((a)->vmods_mask0=((m)&0xff)))
220 #define XkbSARedirectVModsMask(a)       ((((unsigned int)(a)->vmods_mask1)<<8)|\
221                                         ((unsigned int)(a)->vmods_mask0))
222 #define XkbSARedirectSetVModsMask(a,m)  (((a)->vmods_mask1=(((m)>>8)&0xff)),\
223                                          ((a)->vmods_mask0=((m)&0xff)))
224
225 typedef struct _XkbDeviceBtnAction {
226         unsigned char   type;
227         unsigned char   flags;
228         unsigned char   count;
229         unsigned char   button;
230         unsigned char   device;
231 } XkbDeviceBtnAction;
232
233 typedef struct _XkbDeviceValuatorAction {
234         unsigned char   type;
235         unsigned char   device;
236         unsigned char   v1_what;
237         unsigned char   v1_ndx;
238         unsigned char   v1_value;
239         unsigned char   v2_what;
240         unsigned char   v2_ndx;
241         unsigned char   v2_value;
242 } XkbDeviceValuatorAction;
243
244 typedef union _XkbAction {
245         XkbAnyAction            any;
246         XkbModAction            mods;
247         XkbGroupAction          group;
248         XkbISOAction            iso;
249         XkbPtrAction            ptr;
250         XkbPtrBtnAction         btn;
251         XkbPtrDfltAction        dflt;
252         XkbSwitchScreenAction   screen;
253         XkbCtrlsAction          ctrls;
254         XkbMessageAction        msg;
255         XkbRedirectKeyAction    redirect;
256         XkbDeviceBtnAction      devbtn;
257         XkbDeviceValuatorAction devval;
258         unsigned char           type;
259 } XkbAction;
260
261 typedef struct _XkbControls {
262         unsigned char   mk_dflt_btn;
263         unsigned char   num_groups;
264         unsigned char   groups_wrap;
265         XkbModsRec      internal;
266         XkbModsRec      ignore_lock;
267         unsigned int    enabled_ctrls;
268         unsigned short  repeat_delay;
269         unsigned short  repeat_interval;
270         unsigned short  slow_keys_delay;
271         unsigned short  debounce_delay;
272         unsigned short  mk_delay;
273         unsigned short  mk_interval;
274         unsigned short  mk_time_to_max;
275         unsigned short  mk_max_speed;
276                  short  mk_curve;
277         unsigned short  ax_options;
278         unsigned short  ax_timeout;
279         unsigned short  axt_opts_mask;
280         unsigned short  axt_opts_values;
281         unsigned int    axt_ctrls_mask;
282         unsigned int    axt_ctrls_values;
283         unsigned char   per_key_repeat[XkbPerKeyBitArraySize];
284 } XkbControlsRec, *XkbControlsPtr;
285
286 #define XkbAX_AnyFeedback(c)    ((c)->enabled_ctrls&XkbAccessXFeedbackMask)
287 #define XkbAX_NeedOption(c,w)   ((c)->ax_options&(w))
288 #define XkbAX_NeedFeedback(c,w) (XkbAX_AnyFeedback(c)&&XkbAX_NeedOption(c,w))
289
290 typedef struct _XkbServerMapRec {
291         unsigned short           num_acts;
292         unsigned short           size_acts;
293         XkbAction               *acts;
294
295         XkbBehavior             *behaviors;
296         unsigned short          *key_acts;
297 #if defined(__cplusplus) || defined(c_plusplus)
298         /* explicit is a C++ reserved word */
299         unsigned char           *c_explicit;
300 #else
301         unsigned char           *explicit;
302 #endif
303         unsigned char            vmods[XkbNumVirtualMods];
304         unsigned short          *vmodmap;
305 } XkbServerMapRec, *XkbServerMapPtr;
306
307 #define XkbSMKeyActionsPtr(m,k) (&(m)->acts[(m)->key_acts[k]])
308
309         /*
310          * Structures and access macros used primarily by clients
311          */
312
313 typedef struct _XkbSymMapRec {
314         unsigned char    kt_index[XkbNumKbdGroups];
315         unsigned char    group_info;
316         unsigned char    width;
317         unsigned short   offset;
318 } XkbSymMapRec, *XkbSymMapPtr;
319
320 typedef struct _XkbClientMapRec {
321         unsigned char            size_types;
322         unsigned char            num_types;
323         XkbKeyTypePtr            types;
324
325         unsigned short           size_syms;
326         unsigned short           num_syms;
327         KeySym                  *syms;
328         XkbSymMapPtr             key_sym_map;
329
330         unsigned char           *modmap;
331 } XkbClientMapRec, *XkbClientMapPtr;
332
333 #define XkbCMKeyGroupInfo(m,k)  ((m)->key_sym_map[k].group_info)
334 #define XkbCMKeyNumGroups(m,k)   (XkbNumGroups((m)->key_sym_map[k].group_info))
335 #define XkbCMKeyGroupWidth(m,k,g) (XkbCMKeyType(m,k,g)->num_levels)
336 #define XkbCMKeyGroupsWidth(m,k) ((m)->key_sym_map[k].width)
337 #define XkbCMKeyTypeIndex(m,k,g) ((m)->key_sym_map[k].kt_index[g&0x3])
338 #define XkbCMKeyType(m,k,g)      (&(m)->types[XkbCMKeyTypeIndex(m,k,g)])
339 #define XkbCMKeyNumSyms(m,k) (XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k))
340 #define XkbCMKeySymsOffset(m,k) ((m)->key_sym_map[k].offset)
341 #define XkbCMKeySymsPtr(m,k)    (&(m)->syms[XkbCMKeySymsOffset(m,k)])
342
343         /*
344          * Compatibility structures and access macros
345          */
346
347 typedef struct _XkbSymInterpretRec {
348         KeySym          sym;
349         unsigned char   flags;
350         unsigned char   match;
351         unsigned char   mods;
352         unsigned char   virtual_mod;
353         XkbAnyAction    act;
354 } XkbSymInterpretRec,*XkbSymInterpretPtr;
355
356 typedef struct _XkbCompatMapRec {
357         XkbSymInterpretPtr       sym_interpret;
358         XkbModsRec               groups[XkbNumKbdGroups];
359         unsigned short           num_si;
360         unsigned short           size_si;
361 } XkbCompatMapRec, *XkbCompatMapPtr;
362
363 typedef struct _XkbIndicatorMapRec {
364         unsigned char   flags;
365         unsigned char   which_groups;
366         unsigned char   groups;
367         unsigned char   which_mods;
368         XkbModsRec      mods;
369         unsigned int    ctrls;
370 } XkbIndicatorMapRec, *XkbIndicatorMapPtr;
371
372 #define XkbIM_IsAuto(i) ((((i)->flags&XkbIM_NoAutomatic)==0)&&\
373                             (((i)->which_groups&&(i)->groups)||\
374                              ((i)->which_mods&&(i)->mods.mask)||\
375                              ((i)->ctrls)))
376 #define XkbIM_InUse(i)  (((i)->flags)||((i)->which_groups)||\
377                                         ((i)->which_mods)||((i)->ctrls))
378         
379
380 typedef struct _XkbIndicatorRec {
381         unsigned long           phys_indicators;
382         XkbIndicatorMapRec      maps[XkbNumIndicators];
383 } XkbIndicatorRec,*XkbIndicatorPtr;
384
385 typedef struct _XkbKeyNameRec {
386         char    name[XkbKeyNameLength];
387 } XkbKeyNameRec,*XkbKeyNamePtr;
388
389 typedef struct _XkbKeyAliasRec {
390         char    real[XkbKeyNameLength];
391         char    alias[XkbKeyNameLength];
392 } XkbKeyAliasRec,*XkbKeyAliasPtr;
393
394         /*
395          * Names for everything 
396          */
397 typedef struct _XkbNamesRec {
398         Atom              keycodes;
399         Atom              geometry;
400         Atom              symbols;
401         Atom              types;
402         Atom              compat;
403         Atom              vmods[XkbNumVirtualMods];
404         Atom              indicators[XkbNumIndicators];
405         Atom              groups[XkbNumKbdGroups];
406         XkbKeyNamePtr     keys;
407         XkbKeyAliasPtr    key_aliases;
408         Atom             *radio_groups;
409         Atom              phys_symbols;
410
411         unsigned char     num_keys;
412         unsigned char     num_key_aliases;
413         unsigned short    num_rg;
414 } XkbNamesRec,*XkbNamesPtr;
415
416 typedef struct _XkbGeometry     *XkbGeometryPtr;
417         /*
418          * Tie it all together into one big keyboard description
419          */
420 typedef struct _XkbDesc {
421         struct _XDisplay *      dpy;
422         unsigned short          flags;
423         unsigned short          device_spec;
424         KeyCode                 min_key_code;
425         KeyCode                 max_key_code;
426
427         XkbControlsPtr          ctrls;
428         XkbServerMapPtr         server;
429         XkbClientMapPtr         map;
430         XkbIndicatorPtr         indicators;
431         XkbNamesPtr             names;
432         XkbCompatMapPtr         compat;
433         XkbGeometryPtr          geom;
434 } XkbDescRec, *XkbDescPtr;
435 #define XkbKeyKeyTypeIndex(d,k,g)       (XkbCMKeyTypeIndex((d)->map,k,g))
436 #define XkbKeyKeyType(d,k,g)            (XkbCMKeyType((d)->map,k,g))
437 #define XkbKeyGroupWidth(d,k,g)         (XkbCMKeyGroupWidth((d)->map,k,g))
438 #define XkbKeyGroupsWidth(d,k)          (XkbCMKeyGroupsWidth((d)->map,k))
439 #define XkbKeyGroupInfo(d,k)            (XkbCMKeyGroupInfo((d)->map,(k)))
440 #define XkbKeyNumGroups(d,k)            (XkbCMKeyNumGroups((d)->map,(k)))
441 #define XkbKeyNumSyms(d,k)              (XkbCMKeyNumSyms((d)->map,(k)))
442 #define XkbKeySymsPtr(d,k)              (XkbCMKeySymsPtr((d)->map,(k)))
443 #define XkbKeySym(d,k,n)                (XkbKeySymsPtr(d,k)[n])
444 #define XkbKeySymEntry(d,k,sl,g) \
445         (XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))
446 #define XkbKeyAction(d,k,n) \
447         (XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
448 #define XkbKeyActionEntry(d,k,sl,g) \
449         (XkbKeyHasActions(d,k)?\
450                 XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
451
452 #define XkbKeyHasActions(d,k)   ((d)->server->key_acts[k]!=0)
453 #define XkbKeyNumActions(d,k)   (XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)
454 #define XkbKeyActionsPtr(d,k)   (XkbSMKeyActionsPtr((d)->server,k))
455 #define XkbKeycodeInRange(d,k)  (((k)>=(d)->min_key_code)&&\
456                                  ((k)<=(d)->max_key_code))
457 #define XkbNumKeys(d)           ((d)->max_key_code-(d)->min_key_code+1)
458
459
460         /*
461          * The following structures can be used to track changes
462          * to a keyboard device
463          */
464 typedef struct _XkbMapChanges {
465         unsigned short           changed;
466         KeyCode                  min_key_code;
467         KeyCode                  max_key_code;
468         unsigned char            first_type;
469         unsigned char            num_types;
470         KeyCode                  first_key_sym;
471         unsigned char            num_key_syms;
472         KeyCode                  first_key_act;
473         unsigned char            num_key_acts;
474         KeyCode                  first_key_behavior;
475         unsigned char            num_key_behaviors;
476         KeyCode                  first_key_explicit;
477         unsigned char            num_key_explicit;
478         KeyCode                  first_modmap_key;
479         unsigned char            num_modmap_keys;
480         KeyCode                  first_vmodmap_key;
481         unsigned char            num_vmodmap_keys;
482         unsigned char            pad;
483         unsigned short           vmods;
484 } XkbMapChangesRec,*XkbMapChangesPtr;
485
486 typedef struct _XkbControlsChanges {
487         unsigned int             changed_ctrls;
488         unsigned int             enabled_ctrls_changes;
489         Bool                     num_groups_changed;
490 } XkbControlsChangesRec,*XkbControlsChangesPtr;
491
492 typedef struct _XkbIndicatorChanges {
493         unsigned int             state_changes;
494         unsigned int             map_changes;
495 } XkbIndicatorChangesRec,*XkbIndicatorChangesPtr;
496
497 typedef struct _XkbNameChanges {
498         unsigned int            changed;
499         unsigned char           first_type;
500         unsigned char           num_types;
501         unsigned char           first_lvl;
502         unsigned char           num_lvls;
503         unsigned char           num_aliases;
504         unsigned char           num_rg;
505         unsigned char           first_key;
506         unsigned char           num_keys;
507         unsigned short          changed_vmods;
508         unsigned long           changed_indicators;
509         unsigned char           changed_groups;
510 } XkbNameChangesRec,*XkbNameChangesPtr;
511
512 typedef struct _XkbCompatChanges {
513         unsigned char           changed_groups;
514         unsigned short          first_si;
515         unsigned short          num_si;
516 } XkbCompatChangesRec,*XkbCompatChangesPtr;
517
518 typedef struct _XkbChanges {
519         unsigned short           device_spec;
520         unsigned short           state_changes;
521         XkbMapChangesRec         map;
522         XkbControlsChangesRec    ctrls;
523         XkbIndicatorChangesRec   indicators;
524         XkbNameChangesRec        names;
525         XkbCompatChangesRec      compat;
526 } XkbChangesRec, *XkbChangesPtr;
527
528         /*
529          * These data structures are used to construct a keymap from 
530          * a set of components or to list components in the server
531          * database.
532          */
533 typedef struct _XkbComponentNames {
534         char *                   keymap;
535         char *                   keycodes;
536         char *                   types;
537         char *                   compat;
538         char *                   symbols;
539         char *                   geometry;
540 } XkbComponentNamesRec, *XkbComponentNamesPtr;
541
542 typedef struct _XkbComponentName {
543         unsigned short          flags;
544         char *                  name;
545 } XkbComponentNameRec,*XkbComponentNamePtr;
546
547 typedef struct _XkbComponentList {
548         int                     num_keymaps;
549         int                     num_keycodes;
550         int                     num_types;
551         int                     num_compat;
552         int                     num_symbols;
553         int                     num_geometry;
554         XkbComponentNamePtr     keymaps;
555         XkbComponentNamePtr     keycodes;
556         XkbComponentNamePtr     types;
557         XkbComponentNamePtr     compat;
558         XkbComponentNamePtr     symbols;
559         XkbComponentNamePtr     geometry;
560 } XkbComponentListRec, *XkbComponentListPtr;
561
562         /*
563          * The following data structures describe and track changes to a 
564          * non-keyboard extension device 
565          */
566 typedef struct _XkbDeviceLedInfo {
567         unsigned short                  led_class;
568         unsigned short                  led_id;
569         unsigned int                    phys_indicators;
570         unsigned int                    maps_present;
571         unsigned int                    names_present;
572         unsigned int                    state;
573         Atom                            names[XkbNumIndicators];
574         XkbIndicatorMapRec              maps[XkbNumIndicators];
575 } XkbDeviceLedInfoRec,*XkbDeviceLedInfoPtr;
576
577 typedef struct _XkbDeviceInfo {
578         char *                  name;
579         Atom                    type;
580         unsigned short          device_spec;
581         Bool                    has_own_state;
582         unsigned short          supported;
583         unsigned short          unsupported;
584
585         unsigned short          num_btns;
586         XkbAction *             btn_acts;
587
588         unsigned short          sz_leds;
589         unsigned short          num_leds;
590         unsigned short          dflt_kbd_fb;
591         unsigned short          dflt_led_fb;
592         XkbDeviceLedInfoPtr     leds;
593 } XkbDeviceInfoRec,*XkbDeviceInfoPtr;
594
595 #define XkbXI_DevHasBtnActs(d)  (((d)->num_btns>0)&&((d)->btn_acts!=NULL))
596 #define XkbXI_LegalDevBtn(d,b)  (XkbXI_DevHasBtnActs(d)&&((b)<(d)->num_btns))
597 #define XkbXI_DevHasLeds(d)     (((d)->num_leds>0)&&((d)->leds!=NULL))
598
599 typedef struct _XkbDeviceLedChanges {
600         unsigned short          led_class;
601         unsigned short          led_id;
602         unsigned int            defined; /* names or maps changed */
603         struct _XkbDeviceLedChanges *next;
604 } XkbDeviceLedChangesRec,*XkbDeviceLedChangesPtr;
605
606 typedef struct _XkbDeviceChanges {
607         unsigned int            changed;
608         unsigned short          first_btn;
609         unsigned short          num_btns;
610         XkbDeviceLedChangesRec  leds;
611 } XkbDeviceChangesRec,*XkbDeviceChangesPtr;
612
613 #endif /* _XKBSTR_H_ */