• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_ */
614