xkbstr.h revision 6747b715
14642e01fSmrg/************************************************************
24642e01fSmrgCopyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
34642e01fSmrg
44642e01fSmrgPermission to use, copy, modify, and distribute this
54642e01fSmrgsoftware and its documentation for any purpose and without
64642e01fSmrgfee is hereby granted, provided that the above copyright
74642e01fSmrgnotice appear in all copies and that both that copyright
84642e01fSmrgnotice and this permission notice appear in supporting
94642e01fSmrgdocumentation, and that the name of Silicon Graphics not be
104642e01fSmrgused in advertising or publicity pertaining to distribution
114642e01fSmrgof the software without specific prior written permission.
124642e01fSmrgSilicon Graphics makes no representation about the suitability
134642e01fSmrgof this software for any purpose. It is provided "as is"
144642e01fSmrgwithout any express or implied warranty.
154642e01fSmrg
164642e01fSmrgSILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
174642e01fSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
184642e01fSmrgAND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
194642e01fSmrgGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
204642e01fSmrgDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
214642e01fSmrgDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
224642e01fSmrgOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
234642e01fSmrgTHE USE OR PERFORMANCE OF THIS SOFTWARE.
244642e01fSmrg
254642e01fSmrg********************************************************/
264642e01fSmrg
274642e01fSmrg#ifndef _XKBSTR_H_
284642e01fSmrg#define	_XKBSTR_H_
294642e01fSmrg
304642e01fSmrg#include <X11/extensions/XKB.h>
314642e01fSmrg
326747b715Smrg#define	XkbCharToInt(v) ((int) ((v) & 0x80 ? ((v) | (~0xff)) : ((v) & 0x7f)))
336747b715Smrg#define	XkbIntTo2Chars(i, h, l) ((h) = (i >> 8) & 0xff, (l) = (i) & 0xff)
344642e01fSmrg
354642e01fSmrg#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
366747b715Smrg#define	Xkb2CharsToInt(h, l) ((int) ((h) & 0x80 ? \
376747b715Smrg                              (((h) << 8) | (l) | (~0xffff)) : \
386747b715Smrg                              (((h) << 8) | (l) & 0x7fff))
394642e01fSmrg#else
404642e01fSmrg#define	Xkb2CharsToInt(h,l)	((short)(((h)<<8)|(l)))
414642e01fSmrg#endif
424642e01fSmrg
434642e01fSmrg	/*
444642e01fSmrg	 * Common data structures and access macros
454642e01fSmrg	 */
464642e01fSmrg
474642e01fSmrgtypedef struct _XkbStateRec {
486747b715Smrg	unsigned char   group; /* base + latched + locked */
496747b715Smrg	/* FIXME: Why are base + latched short and not char?? */
506747b715Smrg	unsigned short  base_group; /* physically ... down? */
516747b715Smrg	unsigned short  latched_group;
524642e01fSmrg	unsigned char   locked_group;
536747b715Smrg
546747b715Smrg	unsigned char   mods; /* base + latched + locked */
556747b715Smrg	unsigned char   base_mods; /* physically down */
566747b715Smrg	unsigned char   latched_mods;
576747b715Smrg	unsigned char   locked_mods;
586747b715Smrg
596747b715Smrg	unsigned char   compat_state; /* mods + group for core state */
606747b715Smrg
616747b715Smrg	/* grab mods = all depressed and latched mods, _not_ locked mods */
626747b715Smrg	unsigned char   grab_mods; /* grab mods minus internal mods */
636747b715Smrg	unsigned char   compat_grab_mods; /* grab mods + group for core state,
646747b715Smrg	                                     but not locked groups if
656747b715Smrg                                             IgnoreGroupLocks set */
666747b715Smrg
676747b715Smrg	/* effective mods = all mods (depressed, latched, locked) */
686747b715Smrg	unsigned char   lookup_mods; /* effective mods minus internal mods */
696747b715Smrg	unsigned char   compat_lookup_mods; /* effective mods + group */
706747b715Smrg
716747b715Smrg	unsigned short  ptr_buttons; /* core pointer buttons */
724642e01fSmrg} XkbStateRec,*XkbStatePtr;
734642e01fSmrg#define	XkbStateFieldFromRec(s)	XkbBuildCoreState((s)->lookup_mods,(s)->group)
744642e01fSmrg#define	XkbGrabStateFromRec(s)	XkbBuildCoreState((s)->grab_mods,(s)->group)
754642e01fSmrg
764642e01fSmrgtypedef struct _XkbMods {
774642e01fSmrg	unsigned char	mask;	/* effective mods */
784642e01fSmrg	unsigned char	real_mods;
794642e01fSmrg	unsigned short	vmods;
804642e01fSmrg} XkbModsRec,*XkbModsPtr;
814642e01fSmrg
824642e01fSmrgtypedef struct _XkbKTMapEntry {
834642e01fSmrg	Bool		active;
844642e01fSmrg	unsigned char	level;
854642e01fSmrg	XkbModsRec	mods;
864642e01fSmrg} XkbKTMapEntryRec,*XkbKTMapEntryPtr;
874642e01fSmrg
884642e01fSmrgtypedef struct _XkbKeyType {
894642e01fSmrg	XkbModsRec		mods;
904642e01fSmrg	unsigned char	  	num_levels;
914642e01fSmrg	unsigned char	  	map_count;
924642e01fSmrg	XkbKTMapEntryPtr  	map;
934642e01fSmrg	XkbModsPtr  		preserve;
944642e01fSmrg	Atom		  	name;
954642e01fSmrg	Atom *			level_names;
964642e01fSmrg} XkbKeyTypeRec, *XkbKeyTypePtr;
974642e01fSmrg
984642e01fSmrg#define	XkbNumGroups(g)			((g)&0x0f)
994642e01fSmrg#define	XkbOutOfRangeGroupInfo(g)	((g)&0xf0)
1004642e01fSmrg#define	XkbOutOfRangeGroupAction(g)	((g)&0xc0)
1014642e01fSmrg#define	XkbOutOfRangeGroupNumber(g)	(((g)&0x30)>>4)
1026747b715Smrg#define	XkbSetGroupInfo(g, w, n) (((w) & 0xc0) | (((n) & 3) << 4) | \
1036747b715Smrg                                  ((g) & 0x0f))
1044642e01fSmrg#define	XkbSetNumGroups(g,n)	(((g)&0xf0)|((n)&0x0f))
1054642e01fSmrg
1064642e01fSmrg	/*
1074642e01fSmrg	 * Structures and access macros used primarily by the server
1084642e01fSmrg	 */
1094642e01fSmrg
1104642e01fSmrgtypedef struct _XkbBehavior {
1114642e01fSmrg	unsigned char	type;
1124642e01fSmrg	unsigned char	data;
1134642e01fSmrg} XkbBehavior;
1144642e01fSmrg
1154642e01fSmrg#define	XkbAnyActionDataSize 7
1164642e01fSmrgtypedef	struct _XkbAnyAction {
1174642e01fSmrg	unsigned char	type;
1184642e01fSmrg	unsigned char	data[XkbAnyActionDataSize];
1194642e01fSmrg} XkbAnyAction;
1204642e01fSmrg
1214642e01fSmrgtypedef struct _XkbModAction {
1224642e01fSmrg	unsigned char	type;
1234642e01fSmrg	unsigned char	flags;
1244642e01fSmrg	unsigned char	mask;
1254642e01fSmrg	unsigned char	real_mods;
1266747b715Smrg        /* FIXME: Make this an int. */
1274642e01fSmrg	unsigned char	vmods1;
1284642e01fSmrg	unsigned char	vmods2;
1294642e01fSmrg} XkbModAction;
1306747b715Smrg#define	XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
1314642e01fSmrg#define	XkbSetModActionVMods(a,v) \
1326747b715Smrg	((a)->vmods1 = (((v) >> 8) & 0xff), \
1336747b715Smrg         (a)->vmods2 = (v) & 0xff)
1344642e01fSmrg
1354642e01fSmrgtypedef struct _XkbGroupAction {
1364642e01fSmrg	unsigned char	type;
1374642e01fSmrg	unsigned char	flags;
1386747b715Smrg        /* FIXME: Make this an int. */
1394642e01fSmrg	char		group_XXX;
1404642e01fSmrg} XkbGroupAction;
1414642e01fSmrg#define	XkbSAGroup(a)		(XkbCharToInt((a)->group_XXX))
1424642e01fSmrg#define	XkbSASetGroup(a,g)	((a)->group_XXX=(g))
1434642e01fSmrg
1444642e01fSmrgtypedef struct _XkbISOAction {
1454642e01fSmrg	unsigned char	type;
1464642e01fSmrg	unsigned char	flags;
1474642e01fSmrg	unsigned char	mask;
1484642e01fSmrg	unsigned char	real_mods;
1496747b715Smrg        /* FIXME: Make this an int. */
1504642e01fSmrg	char		group_XXX;
1514642e01fSmrg	unsigned char	affect;
1524642e01fSmrg	unsigned char	vmods1;
1534642e01fSmrg	unsigned char	vmods2;
1544642e01fSmrg} XkbISOAction;
1554642e01fSmrg
1564642e01fSmrgtypedef struct _XkbPtrAction {
1574642e01fSmrg	unsigned char	type;
1584642e01fSmrg	unsigned char	flags;
1596747b715Smrg        /* FIXME: Make this an int. */
1604642e01fSmrg	unsigned char	high_XXX;
1614642e01fSmrg	unsigned char	low_XXX;
1624642e01fSmrg	unsigned char	high_YYY;
1634642e01fSmrg	unsigned char	low_YYY;
1644642e01fSmrg} XkbPtrAction;
1654642e01fSmrg#define	XkbPtrActionX(a)      (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
1664642e01fSmrg#define	XkbPtrActionY(a)      (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
1674642e01fSmrg#define	XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
1684642e01fSmrg#define	XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
1694642e01fSmrg
1704642e01fSmrgtypedef struct _XkbPtrBtnAction {
1714642e01fSmrg	unsigned char	type;
1724642e01fSmrg	unsigned char	flags;
1734642e01fSmrg	unsigned char	count;
1744642e01fSmrg	unsigned char	button;
1754642e01fSmrg} XkbPtrBtnAction;
1764642e01fSmrg
1774642e01fSmrgtypedef struct _XkbPtrDfltAction {
1784642e01fSmrg	unsigned char	type;
1794642e01fSmrg	unsigned char	flags;
1804642e01fSmrg	unsigned char	affect;
1814642e01fSmrg	char		valueXXX;
1824642e01fSmrg} XkbPtrDfltAction;
1834642e01fSmrg#define	XkbSAPtrDfltValue(a)		(XkbCharToInt((a)->valueXXX))
1846747b715Smrg#define	XkbSASetPtrDfltValue(a, c) ((a)->valueXXX = (c) & 0xff)
1854642e01fSmrg
1864642e01fSmrgtypedef struct _XkbSwitchScreenAction {
1874642e01fSmrg	unsigned char	type;
1884642e01fSmrg	unsigned char	flags;
1894642e01fSmrg	char		screenXXX;
1904642e01fSmrg} XkbSwitchScreenAction;
1914642e01fSmrg#define	XkbSAScreen(a)			(XkbCharToInt((a)->screenXXX))
1926747b715Smrg#define	XkbSASetScreen(a, s) ((a)->screenXXX = (s) & 0xff)
1934642e01fSmrg
1944642e01fSmrgtypedef struct _XkbCtrlsAction {
1954642e01fSmrg	unsigned char	type;
1964642e01fSmrg	unsigned char	flags;
1976747b715Smrg        /* FIXME: Make this an int. */
1984642e01fSmrg	unsigned char	ctrls3;
1994642e01fSmrg	unsigned char	ctrls2;
2004642e01fSmrg	unsigned char	ctrls1;
2014642e01fSmrg	unsigned char	ctrls0;
2024642e01fSmrg} XkbCtrlsAction;
2036747b715Smrg#define	XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
2046747b715Smrg                                 (a)->ctrls2 = ((c) >> 16) & 0xff, \
2056747b715Smrg                                 (a)->ctrls1 = ((c) >> 8) & 0xff, \
2066747b715Smrg                                 (a)->ctrls0 = (c) & 0xff)
2074642e01fSmrg#define	XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
2084642e01fSmrg			   (((unsigned int)(a)->ctrls2)<<16)|\
2094642e01fSmrg			   (((unsigned int)(a)->ctrls1)<<8)|\
2106747b715Smrg                           ((unsigned int) (a)->ctrls0))
2114642e01fSmrg
2124642e01fSmrgtypedef struct _XkbMessageAction {
2134642e01fSmrg	unsigned char	type;
2144642e01fSmrg	unsigned char	flags;
2154642e01fSmrg	unsigned char	message[6];
2164642e01fSmrg} XkbMessageAction;
2174642e01fSmrg
2184642e01fSmrgtypedef struct	_XkbRedirectKeyAction {
2194642e01fSmrg	unsigned char	type;
2204642e01fSmrg	unsigned char	new_key;
2214642e01fSmrg	unsigned char	mods_mask;
2224642e01fSmrg	unsigned char	mods;
2236747b715Smrg        /* FIXME: Make this an int. */
2244642e01fSmrg	unsigned char	vmods_mask0;
2254642e01fSmrg	unsigned char	vmods_mask1;
2264642e01fSmrg	unsigned char	vmods0;
2274642e01fSmrg	unsigned char	vmods1;
2284642e01fSmrg} XkbRedirectKeyAction;
2294642e01fSmrg
2304642e01fSmrg#define	XkbSARedirectVMods(a)		((((unsigned int)(a)->vmods1)<<8)|\
2314642e01fSmrg					((unsigned int)(a)->vmods0))
2326747b715Smrg/* FIXME: This is blatantly not setting vmods.   Yeesh. */
2334642e01fSmrg#define	XkbSARedirectSetVMods(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
2344642e01fSmrg					 ((a)->vmods_mask0=((m)&0xff)))
2354642e01fSmrg#define	XkbSARedirectVModsMask(a)	((((unsigned int)(a)->vmods_mask1)<<8)|\
2364642e01fSmrg					((unsigned int)(a)->vmods_mask0))
2374642e01fSmrg#define	XkbSARedirectSetVModsMask(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
2384642e01fSmrg					 ((a)->vmods_mask0=((m)&0xff)))
2394642e01fSmrg
2404642e01fSmrgtypedef struct _XkbDeviceBtnAction {
2414642e01fSmrg	unsigned char	type;
2424642e01fSmrg	unsigned char	flags;
2434642e01fSmrg	unsigned char	count;
2444642e01fSmrg	unsigned char	button;
2454642e01fSmrg	unsigned char	device;
2464642e01fSmrg} XkbDeviceBtnAction;
2474642e01fSmrg
2484642e01fSmrgtypedef struct _XkbDeviceValuatorAction {
2494642e01fSmrg	unsigned char	type;
2504642e01fSmrg	unsigned char	device;
2514642e01fSmrg	unsigned char	v1_what;
2524642e01fSmrg	unsigned char	v1_ndx;
2534642e01fSmrg	unsigned char	v1_value;
2544642e01fSmrg	unsigned char	v2_what;
2554642e01fSmrg	unsigned char	v2_ndx;
2564642e01fSmrg	unsigned char	v2_value;
2574642e01fSmrg} XkbDeviceValuatorAction;
2584642e01fSmrg
2594642e01fSmrgtypedef	union _XkbAction {
2604642e01fSmrg	XkbAnyAction		any;
2614642e01fSmrg	XkbModAction		mods;
2624642e01fSmrg	XkbGroupAction		group;
2634642e01fSmrg	XkbISOAction		iso;
2644642e01fSmrg	XkbPtrAction		ptr;
2654642e01fSmrg	XkbPtrBtnAction		btn;
2664642e01fSmrg	XkbPtrDfltAction	dflt;
2674642e01fSmrg	XkbSwitchScreenAction	screen;
2684642e01fSmrg	XkbCtrlsAction		ctrls;
2694642e01fSmrg	XkbMessageAction	msg;
2704642e01fSmrg	XkbRedirectKeyAction	redirect;
2714642e01fSmrg	XkbDeviceBtnAction	devbtn;
2724642e01fSmrg	XkbDeviceValuatorAction	devval;
2734642e01fSmrg	unsigned char 		type;
2744642e01fSmrg} XkbAction;
2754642e01fSmrg
2764642e01fSmrgtypedef	struct _XkbControls {
2774642e01fSmrg	unsigned char	mk_dflt_btn;
2784642e01fSmrg	unsigned char	num_groups;
2794642e01fSmrg	unsigned char	groups_wrap;
2804642e01fSmrg	XkbModsRec	internal;
2814642e01fSmrg	XkbModsRec	ignore_lock;
2824642e01fSmrg	unsigned int	enabled_ctrls;
2834642e01fSmrg	unsigned short	repeat_delay;
2844642e01fSmrg	unsigned short	repeat_interval;
2854642e01fSmrg	unsigned short	slow_keys_delay;
2864642e01fSmrg	unsigned short	debounce_delay;
2874642e01fSmrg	unsigned short	mk_delay;
2884642e01fSmrg	unsigned short	mk_interval;
2894642e01fSmrg	unsigned short	mk_time_to_max;
2904642e01fSmrg	unsigned short	mk_max_speed;
2914642e01fSmrg		 short	mk_curve;
2924642e01fSmrg	unsigned short	ax_options;
2934642e01fSmrg	unsigned short	ax_timeout;
2944642e01fSmrg	unsigned short	axt_opts_mask;
2954642e01fSmrg	unsigned short	axt_opts_values;
2964642e01fSmrg	unsigned int	axt_ctrls_mask;
2974642e01fSmrg	unsigned int	axt_ctrls_values;
2984642e01fSmrg	unsigned char	per_key_repeat[XkbPerKeyBitArraySize];
2994642e01fSmrg} XkbControlsRec, *XkbControlsPtr;
3004642e01fSmrg
3014642e01fSmrg#define	XkbAX_AnyFeedback(c)	((c)->enabled_ctrls&XkbAccessXFeedbackMask)
3024642e01fSmrg#define	XkbAX_NeedOption(c,w)	((c)->ax_options&(w))
3036747b715Smrg#define	XkbAX_NeedFeedback(c, w) (XkbAX_AnyFeedback((c)) && \
3046747b715Smrg                                  XkbAX_NeedOption((c), (w)))
3054642e01fSmrg
3064642e01fSmrgtypedef struct _XkbServerMapRec {
3074642e01fSmrg	unsigned short		 num_acts;
3084642e01fSmrg	unsigned short		 size_acts;
3094642e01fSmrg	XkbAction		*acts;
3104642e01fSmrg
3114642e01fSmrg	XkbBehavior		*behaviors;
3124642e01fSmrg	unsigned short		*key_acts;
3134642e01fSmrg#if defined(__cplusplus) || defined(c_plusplus)
3144642e01fSmrg	/* explicit is a C++ reserved word */
3154642e01fSmrg	unsigned char		*c_explicit;
3164642e01fSmrg#else
3174642e01fSmrg	unsigned char		*explicit;
3184642e01fSmrg#endif
3194642e01fSmrg	unsigned char		 vmods[XkbNumVirtualMods];
3204642e01fSmrg	unsigned short		*vmodmap;
3214642e01fSmrg} XkbServerMapRec, *XkbServerMapPtr;
3224642e01fSmrg
3236747b715Smrg#define	XkbSMKeyActionsPtr(m, k) (&(m)->acts[(m)->key_acts[(k)]])
3244642e01fSmrg
3254642e01fSmrg	/*
3264642e01fSmrg	 * Structures and access macros used primarily by clients
3274642e01fSmrg	 */
3284642e01fSmrg
3294642e01fSmrgtypedef	struct _XkbSymMapRec {
3304642e01fSmrg	unsigned char	 kt_index[XkbNumKbdGroups];
3314642e01fSmrg	unsigned char	 group_info;
3324642e01fSmrg	unsigned char	 width;
3334642e01fSmrg	unsigned short	 offset;
3344642e01fSmrg} XkbSymMapRec, *XkbSymMapPtr;
3354642e01fSmrg
3364642e01fSmrgtypedef struct _XkbClientMapRec {
3374642e01fSmrg	unsigned char		 size_types;
3384642e01fSmrg	unsigned char		 num_types;
3394642e01fSmrg	XkbKeyTypePtr		 types;
3404642e01fSmrg
3414642e01fSmrg	unsigned short		 size_syms;
3424642e01fSmrg	unsigned short		 num_syms;
3434642e01fSmrg	KeySym			*syms;
3444642e01fSmrg	XkbSymMapPtr		 key_sym_map;
3454642e01fSmrg
3464642e01fSmrg	unsigned char		*modmap;
3474642e01fSmrg} XkbClientMapRec, *XkbClientMapPtr;
3484642e01fSmrg
3496747b715Smrg#define	XkbCMKeyGroupInfo(m, k) ((m)->key_sym_map[(k)].group_info)
3506747b715Smrg#define	XkbCMKeyNumGroups(m, k) (XkbNumGroups((m)->key_sym_map[(k)].group_info))
3516747b715Smrg#define	XkbCMKeyGroupWidth(m, k, g) (XkbCMKeyType((m), (k), (g))->num_levels)
3526747b715Smrg#define	XkbCMKeyGroupsWidth(m, k) ((m)->key_sym_map[(k)].width)
3536747b715Smrg#define	XkbCMKeyTypeIndex(m, k, g) ((m)->key_sym_map[(k)].kt_index[(g) & 0x3])
3546747b715Smrg#define	XkbCMKeyType(m, k, g) (&(m)->types[XkbCMKeyTypeIndex((m), (k), (g))])
3556747b715Smrg#define	XkbCMKeyNumSyms(m, k) (XkbCMKeyGroupsWidth((m), (k)) * \
3566747b715Smrg                               XkbCMKeyNumGroups((m), (k)))
3576747b715Smrg#define	XkbCMKeySymsOffset(m, k) ((m)->key_sym_map[(k)].offset)
3586747b715Smrg#define	XkbCMKeySymsPtr(m, k) (&(m)->syms[XkbCMKeySymsOffset((m), (k))])
3594642e01fSmrg
3604642e01fSmrg	/*
3614642e01fSmrg	 * Compatibility structures and access macros
3624642e01fSmrg	 */
3634642e01fSmrg
3644642e01fSmrgtypedef struct _XkbSymInterpretRec {
3654642e01fSmrg	KeySym		sym;
3664642e01fSmrg	unsigned char	flags;
3674642e01fSmrg	unsigned char	match;
3684642e01fSmrg	unsigned char	mods;
3694642e01fSmrg	unsigned char	virtual_mod;
3704642e01fSmrg	XkbAnyAction	act;
3714642e01fSmrg} XkbSymInterpretRec,*XkbSymInterpretPtr;
3724642e01fSmrg
3734642e01fSmrgtypedef struct _XkbCompatMapRec {
3744642e01fSmrg	XkbSymInterpretPtr	 sym_interpret;
3754642e01fSmrg	XkbModsRec		 groups[XkbNumKbdGroups];
3764642e01fSmrg	unsigned short		 num_si;
3774642e01fSmrg	unsigned short		 size_si;
3784642e01fSmrg} XkbCompatMapRec, *XkbCompatMapPtr;
3794642e01fSmrg
3804642e01fSmrgtypedef struct _XkbIndicatorMapRec {
3814642e01fSmrg	unsigned char	flags;
3826747b715Smrg        /* FIXME: For some reason, interepretation of groups is wildly
3836747b715Smrg         *        different between which being base/latched/locked. */
3844642e01fSmrg	unsigned char	which_groups;
3854642e01fSmrg	unsigned char	groups;
3864642e01fSmrg	unsigned char	which_mods;
3874642e01fSmrg	XkbModsRec	mods;
3884642e01fSmrg	unsigned int	ctrls;
3894642e01fSmrg} XkbIndicatorMapRec, *XkbIndicatorMapPtr;
3904642e01fSmrg
3916747b715Smrg#define	XkbIM_IsAuto(i)	(!((i)->flags & XkbIM_NoAutomatic) && \
3924642e01fSmrg			    (((i)->which_groups&&(i)->groups)||\
3934642e01fSmrg			     ((i)->which_mods&&(i)->mods.mask)||\
3946747b715Smrg                          (i)->ctrls))
3956747b715Smrg#define	XkbIM_InUse(i)	((i)->flags || (i)->which_groups || (i)->which_mods || \
3966747b715Smrg                         (i)->ctrls)
3974642e01fSmrg
3984642e01fSmrg
3994642e01fSmrgtypedef struct _XkbIndicatorRec {
4004642e01fSmrg	unsigned long	  	phys_indicators;
4014642e01fSmrg	XkbIndicatorMapRec	maps[XkbNumIndicators];
4024642e01fSmrg} XkbIndicatorRec,*XkbIndicatorPtr;
4034642e01fSmrg
4044642e01fSmrgtypedef	struct _XkbKeyNameRec {
4054642e01fSmrg	char	name[XkbKeyNameLength];
4064642e01fSmrg} XkbKeyNameRec,*XkbKeyNamePtr;
4074642e01fSmrg
4084642e01fSmrgtypedef struct _XkbKeyAliasRec {
4094642e01fSmrg	char	real[XkbKeyNameLength];
4104642e01fSmrg	char	alias[XkbKeyNameLength];
4114642e01fSmrg} XkbKeyAliasRec,*XkbKeyAliasPtr;
4124642e01fSmrg
4134642e01fSmrg	/*
4144642e01fSmrg	 * Names for everything
4154642e01fSmrg	 */
4164642e01fSmrgtypedef struct _XkbNamesRec {
4174642e01fSmrg	Atom		  keycodes;
4184642e01fSmrg	Atom		  geometry;
4194642e01fSmrg	Atom		  symbols;
4204642e01fSmrg	Atom              types;
4214642e01fSmrg	Atom		  compat;
4224642e01fSmrg	Atom		  vmods[XkbNumVirtualMods];
4234642e01fSmrg	Atom		  indicators[XkbNumIndicators];
4244642e01fSmrg	Atom		  groups[XkbNumKbdGroups];
4254642e01fSmrg	XkbKeyNamePtr	  keys;
4264642e01fSmrg	XkbKeyAliasPtr	  key_aliases;
4274642e01fSmrg	Atom		 *radio_groups;
4284642e01fSmrg	Atom		  phys_symbols;
4294642e01fSmrg
4304642e01fSmrg	unsigned char	  num_keys;
4314642e01fSmrg	unsigned char	  num_key_aliases;
4324642e01fSmrg	unsigned short	  num_rg;
4334642e01fSmrg} XkbNamesRec,*XkbNamesPtr;
4344642e01fSmrg
4354642e01fSmrgtypedef	struct _XkbGeometry	*XkbGeometryPtr;
4364642e01fSmrg	/*
4374642e01fSmrg	 * Tie it all together into one big keyboard description
4384642e01fSmrg	 */
4394642e01fSmrgtypedef	struct _XkbDesc {
4404642e01fSmrg        unsigned int            defined;
4414642e01fSmrg	unsigned short	 	flags;
4424642e01fSmrg	unsigned short		device_spec;
4434642e01fSmrg	KeyCode			min_key_code;
4444642e01fSmrg	KeyCode			max_key_code;
4454642e01fSmrg
4464642e01fSmrg	XkbControlsPtr		ctrls;
4474642e01fSmrg	XkbServerMapPtr		server;
4484642e01fSmrg	XkbClientMapPtr		map;
4494642e01fSmrg	XkbIndicatorPtr		indicators;
4504642e01fSmrg	XkbNamesPtr		names;
4514642e01fSmrg	XkbCompatMapPtr		compat;
4524642e01fSmrg	XkbGeometryPtr		geom;
4534642e01fSmrg} XkbDescRec, *XkbDescPtr;
4546747b715Smrg#define	XkbKeyKeyTypeIndex(d, k, g)	(XkbCMKeyTypeIndex((d)->map, (k), (g)))
4556747b715Smrg#define	XkbKeyKeyType(d, k, g)		(XkbCMKeyType((d)->map, (k), (g)))
4566747b715Smrg#define	XkbKeyGroupWidth(d, k, g)	(XkbCMKeyGroupWidth((d)->map, (k), (g)))
4576747b715Smrg#define	XkbKeyGroupsWidth(d, k)		(XkbCMKeyGroupsWidth((d)->map, (k)))
4584642e01fSmrg#define	XkbKeyGroupInfo(d,k)		(XkbCMKeyGroupInfo((d)->map,(k)))
4594642e01fSmrg#define	XkbKeyNumGroups(d,k)		(XkbCMKeyNumGroups((d)->map,(k)))
4604642e01fSmrg#define	XkbKeyNumSyms(d,k)		(XkbCMKeyNumSyms((d)->map,(k)))
4614642e01fSmrg#define	XkbKeySymsPtr(d,k)		(XkbCMKeySymsPtr((d)->map,(k)))
4626747b715Smrg#define	XkbKeySym(d, k, n)		(XkbKeySymsPtr((d), (k))[(n)])
4634642e01fSmrg#define	XkbKeySymEntry(d,k,sl,g) \
4646747b715Smrg    (XkbKeySym((d), (k), (XkbKeyGroupsWidth((d), (k)) * (g)) + (sl)))
4654642e01fSmrg#define	XkbKeyAction(d,k,n) \
4666747b715Smrg    (XkbKeyHasActions((d), (k)) ? & XkbKeyActionsPtr((d), (k))[(n)] : NULL)
4674642e01fSmrg#define	XkbKeyActionEntry(d,k,sl,g) \
4686747b715Smrg    (XkbKeyHasActions((d), (k)) ? \
4696747b715Smrg     XkbKeyAction((d), (k), ((XkbKeyGroupsWidth((d), (k)) * (g)) + (sl))) : \
4706747b715Smrg     NULL)
4716747b715Smrg
4726747b715Smrg#define	XkbKeyHasActions(d, k) (!!(d)->server->key_acts[(k)])
4736747b715Smrg#define	XkbKeyNumActions(d, k) (XkbKeyHasActions((d), (k)) ? \
4746747b715Smrg                                XkbKeyNumSyms((d), (k)) : 1)
4756747b715Smrg#define	XkbKeyActionsPtr(d, k) (XkbSMKeyActionsPtr((d)->server, (k)))
4766747b715Smrg#define	XkbKeycodeInRange(d, k) ((k) >= (d)->min_key_code && \
4776747b715Smrg				 (k) <= (d)->max_key_code)
4784642e01fSmrg#define	XkbNumKeys(d)		((d)->max_key_code-(d)->min_key_code+1)
4794642e01fSmrg
4804642e01fSmrg
4814642e01fSmrg	/*
4824642e01fSmrg	 * The following structures can be used to track changes
4834642e01fSmrg	 * to a keyboard device
4844642e01fSmrg	 */
4854642e01fSmrgtypedef struct _XkbMapChanges {
4864642e01fSmrg	unsigned short		 changed;
4874642e01fSmrg	KeyCode			 min_key_code;
4884642e01fSmrg	KeyCode			 max_key_code;
4894642e01fSmrg	unsigned char		 first_type;
4904642e01fSmrg	unsigned char		 num_types;
4914642e01fSmrg	KeyCode			 first_key_sym;
4924642e01fSmrg	unsigned char		 num_key_syms;
4934642e01fSmrg	KeyCode			 first_key_act;
4944642e01fSmrg	unsigned char		 num_key_acts;
4954642e01fSmrg	KeyCode			 first_key_behavior;
4964642e01fSmrg	unsigned char		 num_key_behaviors;
4974642e01fSmrg	KeyCode 		 first_key_explicit;
4984642e01fSmrg	unsigned char		 num_key_explicit;
4994642e01fSmrg	KeyCode			 first_modmap_key;
5004642e01fSmrg	unsigned char		 num_modmap_keys;
5014642e01fSmrg	KeyCode			 first_vmodmap_key;
5024642e01fSmrg	unsigned char		 num_vmodmap_keys;
5034642e01fSmrg	unsigned char		 pad;
5044642e01fSmrg	unsigned short		 vmods;
5054642e01fSmrg} XkbMapChangesRec,*XkbMapChangesPtr;
5064642e01fSmrg
5074642e01fSmrgtypedef struct _XkbControlsChanges {
5084642e01fSmrg	unsigned int 		 changed_ctrls;
5094642e01fSmrg	unsigned int		 enabled_ctrls_changes;
5104642e01fSmrg	Bool			 num_groups_changed;
5114642e01fSmrg} XkbControlsChangesRec,*XkbControlsChangesPtr;
5124642e01fSmrg
5134642e01fSmrgtypedef struct _XkbIndicatorChanges {
5144642e01fSmrg	unsigned int		 state_changes;
5154642e01fSmrg	unsigned int		 map_changes;
5164642e01fSmrg} XkbIndicatorChangesRec,*XkbIndicatorChangesPtr;
5174642e01fSmrg
5184642e01fSmrgtypedef struct _XkbNameChanges {
5194642e01fSmrg	unsigned int 		changed;
5204642e01fSmrg	unsigned char		first_type;
5214642e01fSmrg	unsigned char		num_types;
5224642e01fSmrg	unsigned char		first_lvl;
5234642e01fSmrg	unsigned char		num_lvls;
5244642e01fSmrg	unsigned char		num_aliases;
5254642e01fSmrg	unsigned char		num_rg;
5264642e01fSmrg	unsigned char		first_key;
5274642e01fSmrg	unsigned char		num_keys;
5284642e01fSmrg	unsigned short		changed_vmods;
5294642e01fSmrg	unsigned long		changed_indicators;
5304642e01fSmrg	unsigned char		changed_groups;
5314642e01fSmrg} XkbNameChangesRec,*XkbNameChangesPtr;
5324642e01fSmrg
5334642e01fSmrgtypedef struct _XkbCompatChanges {
5344642e01fSmrg	unsigned char		changed_groups;
5354642e01fSmrg	unsigned short		first_si;
5364642e01fSmrg	unsigned short		num_si;
5374642e01fSmrg} XkbCompatChangesRec,*XkbCompatChangesPtr;
5384642e01fSmrg
5394642e01fSmrgtypedef struct _XkbChanges {
5404642e01fSmrg	unsigned short		 device_spec;
5414642e01fSmrg	unsigned short		 state_changes;
5424642e01fSmrg	XkbMapChangesRec	 map;
5434642e01fSmrg	XkbControlsChangesRec	 ctrls;
5444642e01fSmrg	XkbIndicatorChangesRec	 indicators;
5454642e01fSmrg	XkbNameChangesRec	 names;
5464642e01fSmrg	XkbCompatChangesRec	 compat;
5474642e01fSmrg} XkbChangesRec, *XkbChangesPtr;
5484642e01fSmrg
5494642e01fSmrg	/*
5504642e01fSmrg	 * These data structures are used to construct a keymap from
5514642e01fSmrg	 * a set of components or to list components in the server
5524642e01fSmrg	 * database.
5534642e01fSmrg	 */
5544642e01fSmrgtypedef struct _XkbComponentNames {
5554642e01fSmrg	char *			 keycodes;
5564642e01fSmrg	char *			 types;
5574642e01fSmrg	char *			 compat;
5584642e01fSmrg	char *			 symbols;
5594642e01fSmrg	char *			 geometry;
5604642e01fSmrg} XkbComponentNamesRec, *XkbComponentNamesPtr;
5614642e01fSmrg
5624642e01fSmrgtypedef struct _XkbComponentName {
5634642e01fSmrg	unsigned short		flags;
5644642e01fSmrg	char *			name;
5654642e01fSmrg} XkbComponentNameRec,*XkbComponentNamePtr;
5664642e01fSmrg
5674642e01fSmrgtypedef struct _XkbComponentList {
5684642e01fSmrg	int			num_keymaps;
5694642e01fSmrg	int			num_keycodes;
5704642e01fSmrg	int			num_types;
5714642e01fSmrg	int			num_compat;
5724642e01fSmrg	int			num_symbols;
5734642e01fSmrg	int			num_geometry;
5744642e01fSmrg	XkbComponentNamePtr	keymaps;
5754642e01fSmrg	XkbComponentNamePtr 	keycodes;
5764642e01fSmrg	XkbComponentNamePtr	types;
5774642e01fSmrg	XkbComponentNamePtr	compat;
5784642e01fSmrg	XkbComponentNamePtr	symbols;
5794642e01fSmrg	XkbComponentNamePtr	geometry;
5804642e01fSmrg} XkbComponentListRec, *XkbComponentListPtr;
5814642e01fSmrg
5824642e01fSmrg	/*
5834642e01fSmrg	 * The following data structures describe and track changes to a
5844642e01fSmrg	 * non-keyboard extension device
5854642e01fSmrg	 */
5864642e01fSmrgtypedef struct _XkbDeviceLedInfo {
5874642e01fSmrg	unsigned short			led_class;
5884642e01fSmrg	unsigned short			led_id;
5894642e01fSmrg	unsigned int			phys_indicators;
5904642e01fSmrg	unsigned int			maps_present;
5914642e01fSmrg	unsigned int			names_present;
5924642e01fSmrg	unsigned int			state;
5934642e01fSmrg	Atom 				names[XkbNumIndicators];
5944642e01fSmrg	XkbIndicatorMapRec		maps[XkbNumIndicators];
5954642e01fSmrg} XkbDeviceLedInfoRec,*XkbDeviceLedInfoPtr;
5964642e01fSmrg
5974642e01fSmrgtypedef struct _XkbDeviceInfo {
5984642e01fSmrg	char *			name;
5994642e01fSmrg	Atom			type;
6004642e01fSmrg	unsigned short		device_spec;
6014642e01fSmrg	Bool			has_own_state;
6024642e01fSmrg	unsigned short		supported;
6034642e01fSmrg	unsigned short		unsupported;
6044642e01fSmrg
6054642e01fSmrg	unsigned short		num_btns;
6064642e01fSmrg	XkbAction *		btn_acts;
6074642e01fSmrg
6084642e01fSmrg	unsigned short		sz_leds;
6094642e01fSmrg	unsigned short		num_leds;
6104642e01fSmrg	unsigned short		dflt_kbd_fb;
6114642e01fSmrg	unsigned short		dflt_led_fb;
6124642e01fSmrg	XkbDeviceLedInfoPtr	leds;
6134642e01fSmrg} XkbDeviceInfoRec,*XkbDeviceInfoPtr;
6144642e01fSmrg
6156747b715Smrg#define	XkbXI_DevHasBtnActs(d)	((d)->num_btns > 0 && (d)->btn_acts)
6166747b715Smrg#define	XkbXI_LegalDevBtn(d,b)	(XkbXI_DevHasBtnActs(d) && (b) < (d)->num_btns)
6176747b715Smrg#define	XkbXI_DevHasLeds(d)	((d)->num_leds > 0 && (d)->leds)
6184642e01fSmrg
6194642e01fSmrgtypedef struct _XkbDeviceLedChanges {
6204642e01fSmrg	unsigned short		led_class;
6214642e01fSmrg	unsigned short		led_id;
6224642e01fSmrg	unsigned int		defined; /* names or maps changed */
6234642e01fSmrg	struct _XkbDeviceLedChanges *next;
6244642e01fSmrg} XkbDeviceLedChangesRec,*XkbDeviceLedChangesPtr;
6254642e01fSmrg
6264642e01fSmrgtypedef struct _XkbDeviceChanges {
6274642e01fSmrg	unsigned int		changed;
6284642e01fSmrg	unsigned short		first_btn;
6294642e01fSmrg	unsigned short		num_btns;
6304642e01fSmrg	XkbDeviceLedChangesRec 	leds;
6314642e01fSmrg} XkbDeviceChangesRec,*XkbDeviceChangesPtr;
6324642e01fSmrg
6334642e01fSmrg#endif /* _XKBSTR_H_ */
634