summaryrefslogtreecommitdiff
path: root/include/xkbstr.h
blob: 8d715577a67ed0ca11eab32a788fb9ad7d5d4a07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
/************************************************************
Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.

Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Silicon Graphics not be
used in advertising or publicity pertaining to distribution
of the software without specific prior written permission.
Silicon Graphics makes no representation about the suitability
of this software for any purpose. It is provided "as is"
without any express or implied warranty.

SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/

#ifndef _XKBSTR_H_
#define	_XKBSTR_H_

#include <X11/extensions/XKB.h>

#define	XkbCharToInt(v) ((int) ((v) & 0x80 ? ((v) | (~0xff)) : ((v) & 0x7f)))
#define	XkbIntTo2Chars(i, h, l) ((h) = (i >> 8) & 0xff, (l) = (i) & 0xff)

#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
#define	Xkb2CharsToInt(h, l) ((int) ((h) & 0x80 ? \
                              (((h) << 8) | (l) | (~0xffff)) : \
                              (((h) << 8) | (l) & 0x7fff))
#else
#define	Xkb2CharsToInt(h,l)	((short)(((h)<<8)|(l)))
#endif

        /*
         * Common data structures and access macros
         */

typedef struct _XkbStateRec {
    unsigned char group;        /* base + latched + locked */
    /* FIXME: Why are base + latched short and not char?? */
    unsigned short base_group;  /* physically ... down? */
    unsigned short latched_group;
    unsigned char locked_group;

    unsigned char mods;         /* base + latched + locked */
    unsigned char base_mods;    /* physically down */
    unsigned char latched_mods;
    unsigned char locked_mods;

    unsigned char compat_state; /* mods + group for core state */

    /* grab mods = all depressed and latched mods, _not_ locked mods */
    unsigned char grab_mods;    /* grab mods minus internal mods */
    unsigned char compat_grab_mods;     /* grab mods + group for core state,
                                           but not locked groups if
                                           IgnoreGroupLocks set */

    /* effective mods = all mods (depressed, latched, locked) */
    unsigned char lookup_mods;  /* effective mods minus internal mods */
    unsigned char compat_lookup_mods;   /* effective mods + group */

    unsigned short ptr_buttons; /* core pointer buttons */
} XkbStateRec, *XkbStatePtr;

#define	XkbStateFieldFromRec(s)	XkbBuildCoreState((s)->lookup_mods,(s)->group)
#define	XkbGrabStateFromRec(s)	XkbBuildCoreState((s)->grab_mods,(s)->group)

typedef struct _XkbMods {
    unsigned char mask;         /* effective mods */
    unsigned char real_mods;
    unsigned short vmods;
} XkbModsRec, *XkbModsPtr;

typedef struct _XkbKTMapEntry {
    Bool active;
    unsigned char level;
    XkbModsRec mods;
} XkbKTMapEntryRec, *XkbKTMapEntryPtr;

typedef struct _XkbKeyType {
    XkbModsRec mods;
    unsigned char num_levels;
    unsigned char map_count;
    XkbKTMapEntryPtr map;
    XkbModsPtr preserve;
    Atom name;
    Atom *level_names;
} XkbKeyTypeRec, *XkbKeyTypePtr;

#define	XkbNumGroups(g)			((g)&0x0f)
#define	XkbOutOfRangeGroupInfo(g)	((g)&0xf0)
#define	XkbOutOfRangeGroupAction(g)	((g)&0xc0)
#define	XkbOutOfRangeGroupNumber(g)	(((g)&0x30)>>4)
#define	XkbSetGroupInfo(g, w, n) (((w) & 0xc0) | (((n) & 3) << 4) | \
                                  ((g) & 0x0f))
#define	XkbSetNumGroups(g,n)	(((g)&0xf0)|((n)&0x0f))

        /*
         * Structures and access macros used primarily by the server
         */

typedef struct _XkbBehavior {
    unsigned char type;
    unsigned char data;
} XkbBehavior;

#define	XkbAnyActionDataSize 7
typedef struct _XkbAnyAction {
    unsigned char type;
    unsigned char data[XkbAnyActionDataSize];
} XkbAnyAction;

typedef struct _XkbModAction {
    unsigned char type;
    unsigned char flags;
    unsigned char mask;
    unsigned char real_mods;
    /* FIXME: Make this an int. */
    unsigned char vmods1;
    unsigned char vmods2;
} XkbModAction;

#define	XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
#define	XkbSetModActionVMods(a,v) \
	((a)->vmods1 = (((v) >> 8) & 0xff), \
         (a)->vmods2 = (v) & 0xff)

typedef struct _XkbGroupAction {
    unsigned char type;
    unsigned char flags;
    /* FIXME: Make this an int. */
    char group_XXX;
} XkbGroupAction;

#define	XkbSAGroup(a)		(XkbCharToInt((a)->group_XXX))
#define	XkbSASetGroup(a,g)	((a)->group_XXX=(g))

typedef struct _XkbISOAction {
    unsigned char type;
    unsigned char flags;
    unsigned char mask;
    unsigned char real_mods;
    /* FIXME: Make this an int. */
    char group_XXX;
    unsigned char affect;
    unsigned char vmods1;
    unsigned char vmods2;
} XkbISOAction;

typedef struct _XkbPtrAction {
    unsigned char type;
    unsigned char flags;
    /* FIXME: Make this an int. */
    unsigned char high_XXX;
    unsigned char low_XXX;
    unsigned char high_YYY;
    unsigned char low_YYY;
} XkbPtrAction;

#define	XkbPtrActionX(a)      (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
#define	XkbPtrActionY(a)      (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
#define	XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
#define	XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))

typedef struct _XkbPtrBtnAction {
    unsigned char type;
    unsigned char flags;
    unsigned char count;
    unsigned char button;
} XkbPtrBtnAction;

typedef struct _XkbPtrDfltAction {
    unsigned char type;
    unsigned char flags;
    unsigned char affect;
    char valueXXX;
} XkbPtrDfltAction;

#define	XkbSAPtrDfltValue(a)		(XkbCharToInt((a)->valueXXX))
#define	XkbSASetPtrDfltValue(a, c) ((a)->valueXXX = (c) & 0xff)

typedef struct _XkbSwitchScreenAction {
    unsigned char type;
    unsigned char flags;
    char screenXXX;
} XkbSwitchScreenAction;

#define	XkbSAScreen(a)			(XkbCharToInt((a)->screenXXX))
#define	XkbSASetScreen(a, s) ((a)->screenXXX = (s) & 0xff)

typedef struct _XkbCtrlsAction {
    unsigned char type;
    unsigned char flags;
    /* FIXME: Make this an int. */
    unsigned char ctrls3;
    unsigned char ctrls2;
    unsigned char ctrls1;
    unsigned char ctrls0;
} XkbCtrlsAction;

#define	XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
                                 (a)->ctrls2 = ((c) >> 16) & 0xff, \
                                 (a)->ctrls1 = ((c) >> 8) & 0xff, \
                                 (a)->ctrls0 = (c) & 0xff)
#define	XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
			   (((unsigned int)(a)->ctrls2)<<16)|\
			   (((unsigned int)(a)->ctrls1)<<8)|\
                           ((unsigned int) (a)->ctrls0))

typedef struct _XkbMessageAction {
    unsigned char type;
    unsigned char flags;
    unsigned char message[6];
} XkbMessageAction;

typedef struct _XkbRedirectKeyAction {
    unsigned char type;
    unsigned char new_key;
    unsigned char mods_mask;
    unsigned char mods;
    /* FIXME: Make this an int. */
    unsigned char vmods_mask0;
    unsigned char vmods_mask1;
    unsigned char vmods0;
    unsigned char vmods1;
} XkbRedirectKeyAction;

#define	XkbSARedirectVMods(a)		((((unsigned int)(a)->vmods1)<<8)|\
					((unsigned int)(a)->vmods0))
/* FIXME: This is blatantly not setting vmods.   Yeesh. */
#define	XkbSARedirectSetVMods(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
					 ((a)->vmods_mask0=((m)&0xff)))
#define	XkbSARedirectVModsMask(a)	((((unsigned int)(a)->vmods_mask1)<<8)|\
					((unsigned int)(a)->vmods_mask0))
#define	XkbSARedirectSetVModsMask(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
					 ((a)->vmods_mask0=((m)&0xff)))

typedef struct _XkbDeviceBtnAction {
    unsigned char type;
    unsigned char flags;
    unsigned char count;
    unsigned char button;
    unsigned char device;
} XkbDeviceBtnAction;

typedef struct _XkbDeviceValuatorAction {
    unsigned char type;
    unsigned char device;
    unsigned char v1_what;
    unsigned char v1_ndx;
    unsigned char v1_value;
    unsigned char v2_what;
    unsigned char v2_ndx;
    unsigned char v2_value;
} XkbDeviceValuatorAction;

typedef union _XkbAction {
    XkbAnyAction any;
    XkbModAction mods;
    XkbGroupAction group;
    XkbISOAction iso;
    XkbPtrAction ptr;
    XkbPtrBtnAction btn;
    XkbPtrDfltAction dflt;
    XkbSwitchScreenAction screen;
    XkbCtrlsAction ctrls;
    XkbMessageAction msg;
    XkbRedirectKeyAction redirect;
    XkbDeviceBtnAction devbtn;
    XkbDeviceValuatorAction devval;
    unsigned char type;
} XkbAction;

typedef struct _XkbControls {
    unsigned char mk_dflt_btn;
    unsigned char num_groups;
    unsigned char groups_wrap;
    XkbModsRec internal;
    XkbModsRec ignore_lock;
    unsigned int enabled_ctrls;
    unsigned short repeat_delay;
    unsigned short repeat_interval;
    unsigned short slow_keys_delay;
    unsigned short debounce_delay;
    unsigned short mk_delay;
    unsigned short mk_interval;
    unsigned short mk_time_to_max;
    unsigned short mk_max_speed;
    short mk_curve;
    unsigned short ax_options;
    unsigned short ax_timeout;
    unsigned short axt_opts_mask;
    unsigned short axt_opts_values;
    unsigned int axt_ctrls_mask;
    unsigned int axt_ctrls_values;
    unsigned char per_key_repeat[XkbPerKeyBitArraySize];
} XkbControlsRec, *XkbControlsPtr;

#define	XkbAX_AnyFeedback(c)	((c)->enabled_ctrls&XkbAccessXFeedbackMask)
#define	XkbAX_NeedOption(c,w)	((c)->ax_options&(w))
#define	XkbAX_NeedFeedback(c, w) (XkbAX_AnyFeedback((c)) && \
                                  XkbAX_NeedOption((c), (w)))

typedef struct _XkbServerMapRec {
    unsigned short num_acts;
    unsigned short size_acts;
    XkbAction *acts;

    XkbBehavior *behaviors;
    unsigned short *key_acts;
#if defined(__cplusplus) || defined(c_plusplus)
    /* explicit is a C++ reserved word */
    unsigned char *c_explicit;
#else
    unsigned char *explicit;
#endif
    unsigned char vmods[XkbNumVirtualMods];
    unsigned short *vmodmap;
} XkbServerMapRec, *XkbServerMapPtr;

#define	XkbSMKeyActionsPtr(m, k) (&(m)->acts[(m)->key_acts[(k)]])

        /*
         * Structures and access macros used primarily by clients
         */

typedef struct _XkbSymMapRec {
    unsigned char kt_index[XkbNumKbdGroups];
    unsigned char group_info;
    unsigned char width;
    unsigned short offset;
} XkbSymMapRec, *XkbSymMapPtr;

typedef struct _XkbClientMapRec {
    unsigned char size_types;
    unsigned char num_types;
    XkbKeyTypePtr types;

    unsigned short size_syms;
    unsigned short num_syms;
    KeySym *syms;
    XkbSymMapPtr key_sym_map;

    unsigned char *modmap;
} XkbClientMapRec, *XkbClientMapPtr;

#define	XkbCMKeyGroupInfo(m, k) ((m)->key_sym_map[(k)].group_info)
#define	XkbCMKeyNumGroups(m, k) (XkbNumGroups((m)->key_sym_map[(k)].group_info))
#define	XkbCMKeyGroupWidth(m, k, g) (XkbCMKeyType((m), (k), (g))->num_levels)
#define	XkbCMKeyGroupsWidth(m, k) ((m)->key_sym_map[(k)].width)
#define	XkbCMKeyTypeIndex(m, k, g) ((m)->key_sym_map[(k)].kt_index[(g) & 0x3])
#define	XkbCMKeyType(m, k, g) (&(m)->types[XkbCMKeyTypeIndex((m), (k), (g))])
#define	XkbCMKeyNumSyms(m, k) (XkbCMKeyGroupsWidth((m), (k)) * \
                               XkbCMKeyNumGroups((m), (k)))
#define	XkbCMKeySymsOffset(m, k) ((m)->key_sym_map[(k)].offset)
#define	XkbCMKeySymsPtr(m, k) (&(m)->syms[XkbCMKeySymsOffset((m), (k))])

        /*
         * Compatibility structures and access macros
         */

typedef struct _XkbSymInterpretRec {
    KeySym sym;
    unsigned char flags;
    unsigned char match;
    unsigned char mods;
    unsigned char virtual_mod;
    XkbAnyAction act;
} XkbSymInterpretRec, *XkbSymInterpretPtr;

typedef struct _XkbCompatMapRec {
    XkbSymInterpretPtr sym_interpret;
    XkbModsRec groups[XkbNumKbdGroups];
    unsigned short num_si;
    unsigned short size_si;
} XkbCompatMapRec, *XkbCompatMapPtr;

typedef struct _XkbIndicatorMapRec {
    unsigned char flags;
    /* FIXME: For some reason, interepretation of groups is wildly
     *        different between which being base/latched/locked. */
    unsigned char which_groups;
    unsigned char groups;
    unsigned char which_mods;
    XkbModsRec mods;
    unsigned int ctrls;
} XkbIndicatorMapRec, *XkbIndicatorMapPtr;

#define	XkbIM_IsAuto(i)	(!((i)->flags & XkbIM_NoAutomatic) && \
			    (((i)->which_groups&&(i)->groups)||\
			     ((i)->which_mods&&(i)->mods.mask)||\
                          (i)->ctrls))
#define	XkbIM_InUse(i)	((i)->flags || (i)->which_groups || (i)->which_mods || \
                         (i)->ctrls)

typedef struct _XkbIndicatorRec {
    unsigned long phys_indicators;
    XkbIndicatorMapRec maps[XkbNumIndicators];
} XkbIndicatorRec, *XkbIndicatorPtr;

typedef struct _XkbKeyNameRec {
    char name[XkbKeyNameLength];
} XkbKeyNameRec, *XkbKeyNamePtr;

typedef struct _XkbKeyAliasRec {
    char real[XkbKeyNameLength];
    char alias[XkbKeyNameLength];
} XkbKeyAliasRec, *XkbKeyAliasPtr;

        /*
         * Names for everything
         */
typedef struct _XkbNamesRec {
    Atom keycodes;
    Atom geometry;
    Atom symbols;
    Atom types;
    Atom compat;
    Atom vmods[XkbNumVirtualMods];
    Atom indicators[XkbNumIndicators];
    Atom groups[XkbNumKbdGroups];
    XkbKeyNamePtr keys;
    XkbKeyAliasPtr key_aliases;
    Atom *radio_groups;
    Atom phys_symbols;

    unsigned char num_keys;
    unsigned char num_key_aliases;
    unsigned short num_rg;
} XkbNamesRec, *XkbNamesPtr;

typedef struct _XkbGeometry *XkbGeometryPtr;

        /*
         * Tie it all together into one big keyboard description
         */
typedef struct _XkbDesc {
    unsigned int defined;
    unsigned short flags;
    unsigned short device_spec;
    KeyCode min_key_code;
    KeyCode max_key_code;

    XkbControlsPtr ctrls;
    XkbServerMapPtr server;
    XkbClientMapPtr map;
    XkbIndicatorPtr indicators;
    XkbNamesPtr names;
    XkbCompatMapPtr compat;
    XkbGeometryPtr geom;
} XkbDescRec, *XkbDescPtr;

#define	XkbKeyKeyTypeIndex(d, k, g)	(XkbCMKeyTypeIndex((d)->map, (k), (g)))
#define	XkbKeyKeyType(d, k, g)		(XkbCMKeyType((d)->map, (k), (g)))
#define	XkbKeyGroupWidth(d, k, g)	(XkbCMKeyGroupWidth((d)->map, (k), (g)))
#define	XkbKeyGroupsWidth(d, k)		(XkbCMKeyGroupsWidth((d)->map, (k)))
#define	XkbKeyGroupInfo(d,k)		(XkbCMKeyGroupInfo((d)->map,(k)))
#define	XkbKeyNumGroups(d,k)		(XkbCMKeyNumGroups((d)->map,(k)))
#define	XkbKeyNumSyms(d,k)		(XkbCMKeyNumSyms((d)->map,(k)))
#define	XkbKeySymsPtr(d,k)		(XkbCMKeySymsPtr((d)->map,(k)))
#define	XkbKeySym(d, k, n)		(XkbKeySymsPtr((d), (k))[(n)])
#define	XkbKeySymEntry(d,k,sl,g) \
    (XkbKeySym((d), (k), (XkbKeyGroupsWidth((d), (k)) * (g)) + (sl)))
#define	XkbKeyAction(d,k,n) \
    (XkbKeyHasActions((d), (k)) ? & XkbKeyActionsPtr((d), (k))[(n)] : NULL)
#define	XkbKeyActionEntry(d,k,sl,g) \
    (XkbKeyHasActions((d), (k)) ? \
     XkbKeyAction((d), (k), ((XkbKeyGroupsWidth((d), (k)) * (g)) + (sl))) : \
     NULL)

#define	XkbKeyHasActions(d, k) (!!(d)->server->key_acts[(k)])
#define	XkbKeyNumActions(d, k) (XkbKeyHasActions((d), (k)) ? \
                                XkbKeyNumSyms((d), (k)) : 1)
#define	XkbKeyActionsPtr(d, k) (XkbSMKeyActionsPtr((d)->server, (k)))
#define	XkbKeycodeInRange(d, k) ((k) >= (d)->min_key_code && \
				 (k) <= (d)->max_key_code)
#define	XkbNumKeys(d)		((d)->max_key_code-(d)->min_key_code+1)

        /*
         * The following structures can be used to track changes
         * to a keyboard device
         */
typedef struct _XkbMapChanges {
    unsigned short changed;
    KeyCode min_key_code;
    KeyCode max_key_code;
    unsigned char first_type;
    unsigned char num_types;
    KeyCode first_key_sym;
    unsigned char num_key_syms;
    KeyCode first_key_act;
    unsigned char num_key_acts;
    KeyCode first_key_behavior;
    unsigned char num_key_behaviors;
    KeyCode first_key_explicit;
    unsigned char num_key_explicit;
    KeyCode first_modmap_key;
    unsigned char num_modmap_keys;
    KeyCode first_vmodmap_key;
    unsigned char num_vmodmap_keys;
    unsigned char pad;
    unsigned short vmods;
} XkbMapChangesRec, *XkbMapChangesPtr;

typedef struct _XkbControlsChanges {
    unsigned int changed_ctrls;
    unsigned int enabled_ctrls_changes;
    Bool num_groups_changed;
} XkbControlsChangesRec, *XkbControlsChangesPtr;

typedef struct _XkbIndicatorChanges {
    unsigned int state_changes;
    unsigned int map_changes;
} XkbIndicatorChangesRec, *XkbIndicatorChangesPtr;

typedef struct _XkbNameChanges {
    unsigned int changed;
    unsigned char first_type;
    unsigned char num_types;
    unsigned char first_lvl;
    unsigned char num_lvls;
    unsigned char num_aliases;
    unsigned char num_rg;
    unsigned char first_key;
    unsigned char num_keys;
    unsigned short changed_vmods;
    unsigned long changed_indicators;
    unsigned char changed_groups;
} XkbNameChangesRec, *XkbNameChangesPtr;

typedef struct _XkbCompatChanges {
    unsigned char changed_groups;
    unsigned short first_si;
    unsigned short num_si;
} XkbCompatChangesRec, *XkbCompatChangesPtr;

typedef struct _XkbChanges {
    unsigned short device_spec;
    unsigned short state_changes;
    XkbMapChangesRec map;
    XkbControlsChangesRec ctrls;
    XkbIndicatorChangesRec indicators;
    XkbNameChangesRec names;
    XkbCompatChangesRec compat;
} XkbChangesRec, *XkbChangesPtr;

        /*
         * These data structures are used to construct a keymap from
         * a set of components or to list components in the server
         * database.
         */
typedef struct _XkbComponentNames {
    char *keycodes;
    char *types;
    char *compat;
    char *symbols;
    char *geometry;
} XkbComponentNamesRec, *XkbComponentNamesPtr;

typedef struct _XkbComponentName {
    unsigned short flags;
    char *name;
} XkbComponentNameRec, *XkbComponentNamePtr;

typedef struct _XkbComponentList {
    int num_keymaps;
    int num_keycodes;
    int num_types;
    int num_compat;
    int num_symbols;
    int num_geometry;
    XkbComponentNamePtr keymaps;
    XkbComponentNamePtr keycodes;
    XkbComponentNamePtr types;
    XkbComponentNamePtr compat;
    XkbComponentNamePtr symbols;
    XkbComponentNamePtr geometry;
} XkbComponentListRec, *XkbComponentListPtr;

        /*
         * The following data structures describe and track changes to a
         * non-keyboard extension device
         */
typedef struct _XkbDeviceLedInfo {
    unsigned short led_class;
    unsigned short led_id;
    unsigned int phys_indicators;
    unsigned int maps_present;
    unsigned int names_present;
    unsigned int state;
    Atom names[XkbNumIndicators];
    XkbIndicatorMapRec maps[XkbNumIndicators];
} XkbDeviceLedInfoRec, *XkbDeviceLedInfoPtr;

typedef struct _XkbDeviceInfo {
    char *name;
    Atom type;
    unsigned short device_spec;
    Bool has_own_state;
    unsigned short supported;
    unsigned short unsupported;

    unsigned short num_btns;
    XkbAction *btn_acts;

    unsigned short sz_leds;
    unsigned short num_leds;
    unsigned short dflt_kbd_fb;
    unsigned short dflt_led_fb;
    XkbDeviceLedInfoPtr leds;
} XkbDeviceInfoRec, *XkbDeviceInfoPtr;

#define	XkbXI_DevHasBtnActs(d)	((d)->num_btns > 0 && (d)->btn_acts)
#define	XkbXI_LegalDevBtn(d,b)	(XkbXI_DevHasBtnActs(d) && (b) < (d)->num_btns)
#define	XkbXI_DevHasLeds(d)	((d)->num_leds > 0 && (d)->leds)

typedef struct _XkbDeviceLedChanges {
    unsigned short led_class;
    unsigned short led_id;
    unsigned int defined;       /* names or maps changed */
    struct _XkbDeviceLedChanges *next;
} XkbDeviceLedChangesRec, *XkbDeviceLedChangesPtr;

typedef struct _XkbDeviceChanges {
    unsigned int changed;
    unsigned short first_btn;
    unsigned short num_btns;
    XkbDeviceLedChangesRec leds;
} XkbDeviceChangesRec, *XkbDeviceChangesPtr;

#endif                          /* _XKBSTR_H_ */