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