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