xkbstr.h revision 35c4bbdf
1/************************************************************
2Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
3
4Permission to use, copy, modify, and distribute this
5software and its documentation for any purpose and without
6fee is hereby granted, provided that the above copyright
7notice appear in all copies and that both that copyright
8notice and this permission notice appear in supporting
9documentation, and that the name of Silicon Graphics not be
10used in advertising or publicity pertaining to distribution
11of the software without specific prior written permission.
12Silicon Graphics makes no representation about the suitability
13of this software for any purpose. It is provided "as is"
14without any express or implied warranty.
15
16SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
23THE 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
47typedef 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
77typedef struct _XkbMods {
78    unsigned char mask;         /* effective mods */
79    unsigned char real_mods;
80    unsigned short vmods;
81} XkbModsRec, *XkbModsPtr;
82
83typedef struct _XkbKTMapEntry {
84    Bool active;
85    unsigned char level;
86    XkbModsRec mods;
87} XkbKTMapEntryRec, *XkbKTMapEntryPtr;
88
89typedef 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
111typedef struct _XkbBehavior {
112    unsigned char type;
113    unsigned char data;
114} XkbBehavior;
115
116#define	XkbAnyActionDataSize 7
117typedef struct _XkbAnyAction {
118    unsigned char type;
119    unsigned char data[XkbAnyActionDataSize];
120} XkbAnyAction;
121
122typedef 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
137typedef 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
147typedef 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
159typedef 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
174typedef struct _XkbPtrBtnAction {
175    unsigned char type;
176    unsigned char flags;
177    unsigned char count;
178    unsigned char button;
179} XkbPtrBtnAction;
180
181typedef 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
191typedef 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
200typedef 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
219typedef struct _XkbMessageAction {
220    unsigned char type;
221    unsigned char flags;
222    unsigned char message[6];
223} XkbMessageAction;
224
225typedef 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
247typedef 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
255typedef 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
266typedef 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
283typedef 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
313typedef 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
336typedef 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
343typedef 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
371typedef 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
380typedef struct _XkbCompatMapRec {
381    XkbSymInterpretPtr sym_interpret;
382    XkbModsRec groups[XkbNumKbdGroups];
383    unsigned short num_si;
384    unsigned short size_si;
385} XkbCompatMapRec, *XkbCompatMapPtr;
386
387typedef 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
405typedef struct _XkbIndicatorRec {
406    unsigned long phys_indicators;
407    XkbIndicatorMapRec maps[XkbNumIndicators];
408} XkbIndicatorRec, *XkbIndicatorPtr;
409
410typedef struct _XkbKeyNameRec {
411    char name[XkbKeyNameLength];
412} XkbKeyNameRec, *XkbKeyNamePtr;
413
414typedef struct _XkbKeyAliasRec {
415    char real[XkbKeyNameLength];
416    char alias[XkbKeyNameLength];
417} XkbKeyAliasRec, *XkbKeyAliasPtr;
418
419        /*
420         * Names for everything
421         */
422typedef 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
441typedef struct _XkbGeometry *XkbGeometryPtr;
442
443        /*
444         * Tie it all together into one big keyboard description
445         */
446typedef 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         */
492typedef 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
514typedef struct _XkbControlsChanges {
515    unsigned int changed_ctrls;
516    unsigned int enabled_ctrls_changes;
517    Bool num_groups_changed;
518} XkbControlsChangesRec, *XkbControlsChangesPtr;
519
520typedef struct _XkbIndicatorChanges {
521    unsigned int state_changes;
522    unsigned int map_changes;
523} XkbIndicatorChangesRec, *XkbIndicatorChangesPtr;
524
525typedef 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
540typedef struct _XkbCompatChanges {
541    unsigned char changed_groups;
542    unsigned short first_si;
543    unsigned short num_si;
544} XkbCompatChangesRec, *XkbCompatChangesPtr;
545
546typedef 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         */
561typedef struct _XkbComponentNames {
562    char *keycodes;
563    char *types;
564    char *compat;
565    char *symbols;
566    char *geometry;
567} XkbComponentNamesRec, *XkbComponentNamesPtr;
568
569typedef struct _XkbComponentName {
570    unsigned short flags;
571    char *name;
572} XkbComponentNameRec, *XkbComponentNamePtr;
573
574typedef 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         */
593typedef 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
604typedef 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
626typedef 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
633typedef 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