xkbstr.h revision 4642e01f
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
324642e01fSmrg#define	XkbCharToInt(v)		((v)&0x80?(int)((v)|(~0xff)):(int)((v)&0x7f))
334642e01fSmrg#define	XkbIntTo2Chars(i,h,l)	(((h)=((i>>8)&0xff)),((l)=((i)&0xff)))
344642e01fSmrg
354642e01fSmrg#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
364642e01fSmrg#define	Xkb2CharsToInt(h,l)	((h)&0x80?(int)(((h)<<8)|(l)|(~0xffff)):\
374642e01fSmrg					  (int)(((h)<<8)|(l)&0x7fff))
384642e01fSmrg#else
394642e01fSmrg#define	Xkb2CharsToInt(h,l)	((short)(((h)<<8)|(l)))
404642e01fSmrg#endif
414642e01fSmrg
424642e01fSmrg	/*
434642e01fSmrg	 * Common data structures and access macros
444642e01fSmrg	 */
454642e01fSmrg
464642e01fSmrgtypedef struct _XkbStateRec {
474642e01fSmrg	unsigned char	group;
484642e01fSmrg	unsigned char   locked_group;
494642e01fSmrg	unsigned short	base_group;
504642e01fSmrg	unsigned short	latched_group;
514642e01fSmrg	unsigned char	mods;
524642e01fSmrg	unsigned char	base_mods;
534642e01fSmrg	unsigned char	latched_mods;
544642e01fSmrg	unsigned char	locked_mods;
554642e01fSmrg	unsigned char	compat_state;
564642e01fSmrg	unsigned char	grab_mods;
574642e01fSmrg	unsigned char	compat_grab_mods;
584642e01fSmrg	unsigned char	lookup_mods;
594642e01fSmrg	unsigned char	compat_lookup_mods;
604642e01fSmrg	unsigned short	ptr_buttons;
614642e01fSmrg} XkbStateRec,*XkbStatePtr;
624642e01fSmrg#define	XkbStateFieldFromRec(s)	XkbBuildCoreState((s)->lookup_mods,(s)->group)
634642e01fSmrg#define	XkbGrabStateFromRec(s)	XkbBuildCoreState((s)->grab_mods,(s)->group)
644642e01fSmrg
654642e01fSmrgtypedef struct _XkbMods {
664642e01fSmrg	unsigned char	mask;	/* effective mods */
674642e01fSmrg	unsigned char	real_mods;
684642e01fSmrg	unsigned short	vmods;
694642e01fSmrg} XkbModsRec,*XkbModsPtr;
704642e01fSmrg
714642e01fSmrgtypedef struct _XkbKTMapEntry {
724642e01fSmrg	Bool		active;
734642e01fSmrg	unsigned char	level;
744642e01fSmrg	XkbModsRec	mods;
754642e01fSmrg} XkbKTMapEntryRec,*XkbKTMapEntryPtr;
764642e01fSmrg
774642e01fSmrgtypedef struct _XkbKeyType {
784642e01fSmrg	XkbModsRec		mods;
794642e01fSmrg	unsigned char	  	num_levels;
804642e01fSmrg	unsigned char	  	map_count;
814642e01fSmrg	XkbKTMapEntryPtr  	map;
824642e01fSmrg	XkbModsPtr  		preserve;
834642e01fSmrg	Atom		  	name;
844642e01fSmrg	Atom *			level_names;
854642e01fSmrg} XkbKeyTypeRec, *XkbKeyTypePtr;
864642e01fSmrg
874642e01fSmrg#define	XkbNumGroups(g)			((g)&0x0f)
884642e01fSmrg#define	XkbOutOfRangeGroupInfo(g)	((g)&0xf0)
894642e01fSmrg#define	XkbOutOfRangeGroupAction(g)	((g)&0xc0)
904642e01fSmrg#define	XkbOutOfRangeGroupNumber(g)	(((g)&0x30)>>4)
914642e01fSmrg#define	XkbSetGroupInfo(g,w,n)	(((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
924642e01fSmrg#define	XkbSetNumGroups(g,n)	(((g)&0xf0)|((n)&0x0f))
934642e01fSmrg
944642e01fSmrg	/*
954642e01fSmrg	 * Structures and access macros used primarily by the server
964642e01fSmrg	 */
974642e01fSmrg
984642e01fSmrgtypedef struct _XkbBehavior {
994642e01fSmrg	unsigned char	type;
1004642e01fSmrg	unsigned char	data;
1014642e01fSmrg} XkbBehavior;
1024642e01fSmrg
1034642e01fSmrg#define	XkbAnyActionDataSize 7
1044642e01fSmrgtypedef	struct _XkbAnyAction {
1054642e01fSmrg	unsigned char	type;
1064642e01fSmrg	unsigned char	data[XkbAnyActionDataSize];
1074642e01fSmrg} XkbAnyAction;
1084642e01fSmrg
1094642e01fSmrgtypedef struct _XkbModAction {
1104642e01fSmrg	unsigned char	type;
1114642e01fSmrg	unsigned char	flags;
1124642e01fSmrg	unsigned char	mask;
1134642e01fSmrg	unsigned char	real_mods;
1144642e01fSmrg	unsigned char	vmods1;
1154642e01fSmrg	unsigned char	vmods2;
1164642e01fSmrg} XkbModAction;
1174642e01fSmrg#define	XkbModActionVMods(a)      \
1184642e01fSmrg	((short)(((a)->vmods1<<8)|((a)->vmods2)))
1194642e01fSmrg#define	XkbSetModActionVMods(a,v) \
1204642e01fSmrg	(((a)->vmods1=(((v)>>8)&0xff)),(a)->vmods2=((v)&0xff))
1214642e01fSmrg
1224642e01fSmrgtypedef struct _XkbGroupAction {
1234642e01fSmrg	unsigned char	type;
1244642e01fSmrg	unsigned char	flags;
1254642e01fSmrg	char		group_XXX;
1264642e01fSmrg} XkbGroupAction;
1274642e01fSmrg#define	XkbSAGroup(a)		(XkbCharToInt((a)->group_XXX))
1284642e01fSmrg#define	XkbSASetGroup(a,g)	((a)->group_XXX=(g))
1294642e01fSmrg
1304642e01fSmrgtypedef struct _XkbISOAction {
1314642e01fSmrg	unsigned char	type;
1324642e01fSmrg	unsigned char	flags;
1334642e01fSmrg	unsigned char	mask;
1344642e01fSmrg	unsigned char	real_mods;
1354642e01fSmrg	char		group_XXX;
1364642e01fSmrg	unsigned char	affect;
1374642e01fSmrg	unsigned char	vmods1;
1384642e01fSmrg	unsigned char	vmods2;
1394642e01fSmrg} XkbISOAction;
1404642e01fSmrg
1414642e01fSmrgtypedef struct _XkbPtrAction {
1424642e01fSmrg	unsigned char	type;
1434642e01fSmrg	unsigned char	flags;
1444642e01fSmrg	unsigned char	high_XXX;
1454642e01fSmrg	unsigned char	low_XXX;
1464642e01fSmrg	unsigned char	high_YYY;
1474642e01fSmrg	unsigned char	low_YYY;
1484642e01fSmrg} XkbPtrAction;
1494642e01fSmrg#define	XkbPtrActionX(a)      (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
1504642e01fSmrg#define	XkbPtrActionY(a)      (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
1514642e01fSmrg#define	XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
1524642e01fSmrg#define	XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
1534642e01fSmrg
1544642e01fSmrgtypedef struct _XkbPtrBtnAction {
1554642e01fSmrg	unsigned char	type;
1564642e01fSmrg	unsigned char	flags;
1574642e01fSmrg	unsigned char	count;
1584642e01fSmrg	unsigned char	button;
1594642e01fSmrg} XkbPtrBtnAction;
1604642e01fSmrg
1614642e01fSmrgtypedef struct _XkbPtrDfltAction {
1624642e01fSmrg	unsigned char	type;
1634642e01fSmrg	unsigned char	flags;
1644642e01fSmrg	unsigned char	affect;
1654642e01fSmrg	char		valueXXX;
1664642e01fSmrg} XkbPtrDfltAction;
1674642e01fSmrg#define	XkbSAPtrDfltValue(a)		(XkbCharToInt((a)->valueXXX))
1684642e01fSmrg#define	XkbSASetPtrDfltValue(a,c)	((a)->valueXXX= ((c)&0xff))
1694642e01fSmrg
1704642e01fSmrgtypedef struct _XkbSwitchScreenAction {
1714642e01fSmrg	unsigned char	type;
1724642e01fSmrg	unsigned char	flags;
1734642e01fSmrg	char		screenXXX;
1744642e01fSmrg} XkbSwitchScreenAction;
1754642e01fSmrg#define	XkbSAScreen(a)			(XkbCharToInt((a)->screenXXX))
1764642e01fSmrg#define	XkbSASetScreen(a,s)		((a)->screenXXX= ((s)&0xff))
1774642e01fSmrg
1784642e01fSmrgtypedef struct _XkbCtrlsAction {
1794642e01fSmrg	unsigned char	type;
1804642e01fSmrg	unsigned char	flags;
1814642e01fSmrg	unsigned char	ctrls3;
1824642e01fSmrg	unsigned char	ctrls2;
1834642e01fSmrg	unsigned char	ctrls1;
1844642e01fSmrg	unsigned char	ctrls0;
1854642e01fSmrg} XkbCtrlsAction;
1864642e01fSmrg#define	XkbActionSetCtrls(a,c)	(((a)->ctrls3=(((c)>>24)&0xff)),\
1874642e01fSmrg					((a)->ctrls2=(((c)>>16)&0xff)),\
1884642e01fSmrg					((a)->ctrls1=(((c)>>8)&0xff)),\
1894642e01fSmrg					((a)->ctrls0=((c)&0xff)))
1904642e01fSmrg#define	XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
1914642e01fSmrg			   (((unsigned int)(a)->ctrls2)<<16)|\
1924642e01fSmrg			   (((unsigned int)(a)->ctrls1)<<8)|\
1934642e01fSmrg			   ((unsigned int)((a)->ctrls0)))
1944642e01fSmrg
1954642e01fSmrgtypedef struct _XkbMessageAction {
1964642e01fSmrg	unsigned char	type;
1974642e01fSmrg	unsigned char	flags;
1984642e01fSmrg	unsigned char	message[6];
1994642e01fSmrg} XkbMessageAction;
2004642e01fSmrg
2014642e01fSmrgtypedef struct	_XkbRedirectKeyAction {
2024642e01fSmrg	unsigned char	type;
2034642e01fSmrg	unsigned char	new_key;
2044642e01fSmrg	unsigned char	mods_mask;
2054642e01fSmrg	unsigned char	mods;
2064642e01fSmrg	unsigned char	vmods_mask0;
2074642e01fSmrg	unsigned char	vmods_mask1;
2084642e01fSmrg	unsigned char	vmods0;
2094642e01fSmrg	unsigned char	vmods1;
2104642e01fSmrg} XkbRedirectKeyAction;
2114642e01fSmrg
2124642e01fSmrg#define	XkbSARedirectVMods(a)		((((unsigned int)(a)->vmods1)<<8)|\
2134642e01fSmrg					((unsigned int)(a)->vmods0))
2144642e01fSmrg#define	XkbSARedirectSetVMods(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
2154642e01fSmrg					 ((a)->vmods_mask0=((m)&0xff)))
2164642e01fSmrg#define	XkbSARedirectVModsMask(a)	((((unsigned int)(a)->vmods_mask1)<<8)|\
2174642e01fSmrg					((unsigned int)(a)->vmods_mask0))
2184642e01fSmrg#define	XkbSARedirectSetVModsMask(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
2194642e01fSmrg					 ((a)->vmods_mask0=((m)&0xff)))
2204642e01fSmrg
2214642e01fSmrgtypedef struct _XkbDeviceBtnAction {
2224642e01fSmrg	unsigned char	type;
2234642e01fSmrg	unsigned char	flags;
2244642e01fSmrg	unsigned char	count;
2254642e01fSmrg	unsigned char	button;
2264642e01fSmrg	unsigned char	device;
2274642e01fSmrg} XkbDeviceBtnAction;
2284642e01fSmrg
2294642e01fSmrgtypedef struct _XkbDeviceValuatorAction {
2304642e01fSmrg	unsigned char	type;
2314642e01fSmrg	unsigned char	device;
2324642e01fSmrg	unsigned char	v1_what;
2334642e01fSmrg	unsigned char	v1_ndx;
2344642e01fSmrg	unsigned char	v1_value;
2354642e01fSmrg	unsigned char	v2_what;
2364642e01fSmrg	unsigned char	v2_ndx;
2374642e01fSmrg	unsigned char	v2_value;
2384642e01fSmrg} XkbDeviceValuatorAction;
2394642e01fSmrg
2404642e01fSmrgtypedef	union _XkbAction {
2414642e01fSmrg	XkbAnyAction		any;
2424642e01fSmrg	XkbModAction		mods;
2434642e01fSmrg	XkbGroupAction		group;
2444642e01fSmrg	XkbISOAction		iso;
2454642e01fSmrg	XkbPtrAction		ptr;
2464642e01fSmrg	XkbPtrBtnAction		btn;
2474642e01fSmrg	XkbPtrDfltAction	dflt;
2484642e01fSmrg	XkbSwitchScreenAction	screen;
2494642e01fSmrg	XkbCtrlsAction		ctrls;
2504642e01fSmrg	XkbMessageAction	msg;
2514642e01fSmrg	XkbRedirectKeyAction	redirect;
2524642e01fSmrg	XkbDeviceBtnAction	devbtn;
2534642e01fSmrg	XkbDeviceValuatorAction	devval;
2544642e01fSmrg	unsigned char 		type;
2554642e01fSmrg} XkbAction;
2564642e01fSmrg
2574642e01fSmrgtypedef	struct _XkbControls {
2584642e01fSmrg	unsigned char	mk_dflt_btn;
2594642e01fSmrg	unsigned char	num_groups;
2604642e01fSmrg	unsigned char	groups_wrap;
2614642e01fSmrg	XkbModsRec	internal;
2624642e01fSmrg	XkbModsRec	ignore_lock;
2634642e01fSmrg	unsigned int	enabled_ctrls;
2644642e01fSmrg	unsigned short	repeat_delay;
2654642e01fSmrg	unsigned short	repeat_interval;
2664642e01fSmrg	unsigned short	slow_keys_delay;
2674642e01fSmrg	unsigned short	debounce_delay;
2684642e01fSmrg	unsigned short	mk_delay;
2694642e01fSmrg	unsigned short	mk_interval;
2704642e01fSmrg	unsigned short	mk_time_to_max;
2714642e01fSmrg	unsigned short	mk_max_speed;
2724642e01fSmrg		 short	mk_curve;
2734642e01fSmrg	unsigned short	ax_options;
2744642e01fSmrg	unsigned short	ax_timeout;
2754642e01fSmrg	unsigned short	axt_opts_mask;
2764642e01fSmrg	unsigned short	axt_opts_values;
2774642e01fSmrg	unsigned int	axt_ctrls_mask;
2784642e01fSmrg	unsigned int	axt_ctrls_values;
2794642e01fSmrg	unsigned char	per_key_repeat[XkbPerKeyBitArraySize];
2804642e01fSmrg} XkbControlsRec, *XkbControlsPtr;
2814642e01fSmrg
2824642e01fSmrg#define	XkbAX_AnyFeedback(c)	((c)->enabled_ctrls&XkbAccessXFeedbackMask)
2834642e01fSmrg#define	XkbAX_NeedOption(c,w)	((c)->ax_options&(w))
2844642e01fSmrg#define	XkbAX_NeedFeedback(c,w)	(XkbAX_AnyFeedback(c)&&XkbAX_NeedOption(c,w))
2854642e01fSmrg
2864642e01fSmrgtypedef struct _XkbServerMapRec {
2874642e01fSmrg	unsigned short		 num_acts;
2884642e01fSmrg	unsigned short		 size_acts;
2894642e01fSmrg	XkbAction		*acts;
2904642e01fSmrg
2914642e01fSmrg	XkbBehavior		*behaviors;
2924642e01fSmrg	unsigned short		*key_acts;
2934642e01fSmrg#if defined(__cplusplus) || defined(c_plusplus)
2944642e01fSmrg	/* explicit is a C++ reserved word */
2954642e01fSmrg	unsigned char		*c_explicit;
2964642e01fSmrg#else
2974642e01fSmrg	unsigned char		*explicit;
2984642e01fSmrg#endif
2994642e01fSmrg	unsigned char		 vmods[XkbNumVirtualMods];
3004642e01fSmrg	unsigned short		*vmodmap;
3014642e01fSmrg} XkbServerMapRec, *XkbServerMapPtr;
3024642e01fSmrg
3034642e01fSmrg#define	XkbSMKeyActionsPtr(m,k) (&(m)->acts[(m)->key_acts[k]])
3044642e01fSmrg
3054642e01fSmrg	/*
3064642e01fSmrg	 * Structures and access macros used primarily by clients
3074642e01fSmrg	 */
3084642e01fSmrg
3094642e01fSmrgtypedef	struct _XkbSymMapRec {
3104642e01fSmrg	unsigned char	 kt_index[XkbNumKbdGroups];
3114642e01fSmrg	unsigned char	 group_info;
3124642e01fSmrg	unsigned char	 width;
3134642e01fSmrg	unsigned short	 offset;
3144642e01fSmrg} XkbSymMapRec, *XkbSymMapPtr;
3154642e01fSmrg
3164642e01fSmrgtypedef struct _XkbClientMapRec {
3174642e01fSmrg	unsigned char		 size_types;
3184642e01fSmrg	unsigned char		 num_types;
3194642e01fSmrg	XkbKeyTypePtr		 types;
3204642e01fSmrg
3214642e01fSmrg	unsigned short		 size_syms;
3224642e01fSmrg	unsigned short		 num_syms;
3234642e01fSmrg	KeySym			*syms;
3244642e01fSmrg	XkbSymMapPtr		 key_sym_map;
3254642e01fSmrg
3264642e01fSmrg	unsigned char		*modmap;
3274642e01fSmrg} XkbClientMapRec, *XkbClientMapPtr;
3284642e01fSmrg
3294642e01fSmrg#define	XkbCMKeyGroupInfo(m,k)  ((m)->key_sym_map[k].group_info)
3304642e01fSmrg#define	XkbCMKeyNumGroups(m,k)	 (XkbNumGroups((m)->key_sym_map[k].group_info))
3314642e01fSmrg#define	XkbCMKeyGroupWidth(m,k,g) (XkbCMKeyType(m,k,g)->num_levels)
3324642e01fSmrg#define	XkbCMKeyGroupsWidth(m,k) ((m)->key_sym_map[k].width)
3334642e01fSmrg#define	XkbCMKeyTypeIndex(m,k,g) ((m)->key_sym_map[k].kt_index[g&0x3])
3344642e01fSmrg#define	XkbCMKeyType(m,k,g)	 (&(m)->types[XkbCMKeyTypeIndex(m,k,g)])
3354642e01fSmrg#define	XkbCMKeyNumSyms(m,k) (XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k))
3364642e01fSmrg#define	XkbCMKeySymsOffset(m,k)	((m)->key_sym_map[k].offset)
3374642e01fSmrg#define	XkbCMKeySymsPtr(m,k)	(&(m)->syms[XkbCMKeySymsOffset(m,k)])
3384642e01fSmrg
3394642e01fSmrg	/*
3404642e01fSmrg	 * Compatibility structures and access macros
3414642e01fSmrg	 */
3424642e01fSmrg
3434642e01fSmrgtypedef struct _XkbSymInterpretRec {
3444642e01fSmrg	KeySym		sym;
3454642e01fSmrg	unsigned char	flags;
3464642e01fSmrg	unsigned char	match;
3474642e01fSmrg	unsigned char	mods;
3484642e01fSmrg	unsigned char	virtual_mod;
3494642e01fSmrg	XkbAnyAction	act;
3504642e01fSmrg} XkbSymInterpretRec,*XkbSymInterpretPtr;
3514642e01fSmrg
3524642e01fSmrgtypedef struct _XkbCompatMapRec {
3534642e01fSmrg	XkbSymInterpretPtr	 sym_interpret;
3544642e01fSmrg	XkbModsRec		 groups[XkbNumKbdGroups];
3554642e01fSmrg	unsigned short		 num_si;
3564642e01fSmrg	unsigned short		 size_si;
3574642e01fSmrg} XkbCompatMapRec, *XkbCompatMapPtr;
3584642e01fSmrg
3594642e01fSmrgtypedef struct _XkbIndicatorMapRec {
3604642e01fSmrg	unsigned char	flags;
3614642e01fSmrg	unsigned char	which_groups;
3624642e01fSmrg	unsigned char	groups;
3634642e01fSmrg	unsigned char	which_mods;
3644642e01fSmrg	XkbModsRec	mods;
3654642e01fSmrg	unsigned int	ctrls;
3664642e01fSmrg} XkbIndicatorMapRec, *XkbIndicatorMapPtr;
3674642e01fSmrg
3684642e01fSmrg#define	XkbIM_IsAuto(i)	((((i)->flags&XkbIM_NoAutomatic)==0)&&\
3694642e01fSmrg			    (((i)->which_groups&&(i)->groups)||\
3704642e01fSmrg			     ((i)->which_mods&&(i)->mods.mask)||\
3714642e01fSmrg			     ((i)->ctrls)))
3724642e01fSmrg#define	XkbIM_InUse(i)	(((i)->flags)||((i)->which_groups)||\
3734642e01fSmrg					((i)->which_mods)||((i)->ctrls))
3744642e01fSmrg
3754642e01fSmrg
3764642e01fSmrgtypedef struct _XkbIndicatorRec {
3774642e01fSmrg	unsigned long	  	phys_indicators;
3784642e01fSmrg	XkbIndicatorMapRec	maps[XkbNumIndicators];
3794642e01fSmrg} XkbIndicatorRec,*XkbIndicatorPtr;
3804642e01fSmrg
3814642e01fSmrgtypedef	struct _XkbKeyNameRec {
3824642e01fSmrg	char	name[XkbKeyNameLength];
3834642e01fSmrg} XkbKeyNameRec,*XkbKeyNamePtr;
3844642e01fSmrg
3854642e01fSmrgtypedef struct _XkbKeyAliasRec {
3864642e01fSmrg	char	real[XkbKeyNameLength];
3874642e01fSmrg	char	alias[XkbKeyNameLength];
3884642e01fSmrg} XkbKeyAliasRec,*XkbKeyAliasPtr;
3894642e01fSmrg
3904642e01fSmrg	/*
3914642e01fSmrg	 * Names for everything
3924642e01fSmrg	 */
3934642e01fSmrgtypedef struct _XkbNamesRec {
3944642e01fSmrg	Atom		  keycodes;
3954642e01fSmrg	Atom		  geometry;
3964642e01fSmrg	Atom		  symbols;
3974642e01fSmrg	Atom              types;
3984642e01fSmrg	Atom		  compat;
3994642e01fSmrg	Atom		  vmods[XkbNumVirtualMods];
4004642e01fSmrg	Atom		  indicators[XkbNumIndicators];
4014642e01fSmrg	Atom		  groups[XkbNumKbdGroups];
4024642e01fSmrg	XkbKeyNamePtr	  keys;
4034642e01fSmrg	XkbKeyAliasPtr	  key_aliases;
4044642e01fSmrg	Atom		 *radio_groups;
4054642e01fSmrg	Atom		  phys_symbols;
4064642e01fSmrg
4074642e01fSmrg	unsigned char	  num_keys;
4084642e01fSmrg	unsigned char	  num_key_aliases;
4094642e01fSmrg	unsigned short	  num_rg;
4104642e01fSmrg} XkbNamesRec,*XkbNamesPtr;
4114642e01fSmrg
4124642e01fSmrgtypedef	struct _XkbGeometry	*XkbGeometryPtr;
4134642e01fSmrg	/*
4144642e01fSmrg	 * Tie it all together into one big keyboard description
4154642e01fSmrg	 */
4164642e01fSmrgtypedef	struct _XkbDesc {
4174642e01fSmrg        unsigned int            defined;
4184642e01fSmrg	unsigned short	 	flags;
4194642e01fSmrg	unsigned short		device_spec;
4204642e01fSmrg	KeyCode			min_key_code;
4214642e01fSmrg	KeyCode			max_key_code;
4224642e01fSmrg
4234642e01fSmrg	XkbControlsPtr		ctrls;
4244642e01fSmrg	XkbServerMapPtr		server;
4254642e01fSmrg	XkbClientMapPtr		map;
4264642e01fSmrg	XkbIndicatorPtr		indicators;
4274642e01fSmrg	XkbNamesPtr		names;
4284642e01fSmrg	XkbCompatMapPtr		compat;
4294642e01fSmrg	XkbGeometryPtr		geom;
4304642e01fSmrg} XkbDescRec, *XkbDescPtr;
4314642e01fSmrg#define	XkbKeyKeyTypeIndex(d,k,g)	(XkbCMKeyTypeIndex((d)->map,k,g))
4324642e01fSmrg#define	XkbKeyKeyType(d,k,g)		(XkbCMKeyType((d)->map,k,g))
4334642e01fSmrg#define	XkbKeyGroupWidth(d,k,g)		(XkbCMKeyGroupWidth((d)->map,k,g))
4344642e01fSmrg#define	XkbKeyGroupsWidth(d,k)		(XkbCMKeyGroupsWidth((d)->map,k))
4354642e01fSmrg#define	XkbKeyGroupInfo(d,k)		(XkbCMKeyGroupInfo((d)->map,(k)))
4364642e01fSmrg#define	XkbKeyNumGroups(d,k)		(XkbCMKeyNumGroups((d)->map,(k)))
4374642e01fSmrg#define	XkbKeyNumSyms(d,k)		(XkbCMKeyNumSyms((d)->map,(k)))
4384642e01fSmrg#define	XkbKeySymsPtr(d,k)		(XkbCMKeySymsPtr((d)->map,(k)))
4394642e01fSmrg#define	XkbKeySym(d,k,n)		(XkbKeySymsPtr(d,k)[n])
4404642e01fSmrg#define	XkbKeySymEntry(d,k,sl,g) \
4414642e01fSmrg	(XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))
4424642e01fSmrg#define	XkbKeyAction(d,k,n) \
4434642e01fSmrg	(XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
4444642e01fSmrg#define	XkbKeyActionEntry(d,k,sl,g) \
4454642e01fSmrg	(XkbKeyHasActions(d,k)?\
4464642e01fSmrg		XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
4474642e01fSmrg
4484642e01fSmrg#define	XkbKeyHasActions(d,k)	((d)->server->key_acts[k]!=0)
4494642e01fSmrg#define	XkbKeyNumActions(d,k)	(XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)
4504642e01fSmrg#define	XkbKeyActionsPtr(d,k)	(XkbSMKeyActionsPtr((d)->server,k))
4514642e01fSmrg#define	XkbKeycodeInRange(d,k)	(((k)>=(d)->min_key_code)&&\
4524642e01fSmrg				 ((k)<=(d)->max_key_code))
4534642e01fSmrg#define	XkbNumKeys(d)		((d)->max_key_code-(d)->min_key_code+1)
4544642e01fSmrg
4554642e01fSmrg
4564642e01fSmrg	/*
4574642e01fSmrg	 * The following structures can be used to track changes
4584642e01fSmrg	 * to a keyboard device
4594642e01fSmrg	 */
4604642e01fSmrgtypedef struct _XkbMapChanges {
4614642e01fSmrg	unsigned short		 changed;
4624642e01fSmrg	KeyCode			 min_key_code;
4634642e01fSmrg	KeyCode			 max_key_code;
4644642e01fSmrg	unsigned char		 first_type;
4654642e01fSmrg	unsigned char		 num_types;
4664642e01fSmrg	KeyCode			 first_key_sym;
4674642e01fSmrg	unsigned char		 num_key_syms;
4684642e01fSmrg	KeyCode			 first_key_act;
4694642e01fSmrg	unsigned char		 num_key_acts;
4704642e01fSmrg	KeyCode			 first_key_behavior;
4714642e01fSmrg	unsigned char		 num_key_behaviors;
4724642e01fSmrg	KeyCode 		 first_key_explicit;
4734642e01fSmrg	unsigned char		 num_key_explicit;
4744642e01fSmrg	KeyCode			 first_modmap_key;
4754642e01fSmrg	unsigned char		 num_modmap_keys;
4764642e01fSmrg	KeyCode			 first_vmodmap_key;
4774642e01fSmrg	unsigned char		 num_vmodmap_keys;
4784642e01fSmrg	unsigned char		 pad;
4794642e01fSmrg	unsigned short		 vmods;
4804642e01fSmrg} XkbMapChangesRec,*XkbMapChangesPtr;
4814642e01fSmrg
4824642e01fSmrgtypedef struct _XkbControlsChanges {
4834642e01fSmrg	unsigned int 		 changed_ctrls;
4844642e01fSmrg	unsigned int		 enabled_ctrls_changes;
4854642e01fSmrg	Bool			 num_groups_changed;
4864642e01fSmrg} XkbControlsChangesRec,*XkbControlsChangesPtr;
4874642e01fSmrg
4884642e01fSmrgtypedef struct _XkbIndicatorChanges {
4894642e01fSmrg	unsigned int		 state_changes;
4904642e01fSmrg	unsigned int		 map_changes;
4914642e01fSmrg} XkbIndicatorChangesRec,*XkbIndicatorChangesPtr;
4924642e01fSmrg
4934642e01fSmrgtypedef struct _XkbNameChanges {
4944642e01fSmrg	unsigned int 		changed;
4954642e01fSmrg	unsigned char		first_type;
4964642e01fSmrg	unsigned char		num_types;
4974642e01fSmrg	unsigned char		first_lvl;
4984642e01fSmrg	unsigned char		num_lvls;
4994642e01fSmrg	unsigned char		num_aliases;
5004642e01fSmrg	unsigned char		num_rg;
5014642e01fSmrg	unsigned char		first_key;
5024642e01fSmrg	unsigned char		num_keys;
5034642e01fSmrg	unsigned short		changed_vmods;
5044642e01fSmrg	unsigned long		changed_indicators;
5054642e01fSmrg	unsigned char		changed_groups;
5064642e01fSmrg} XkbNameChangesRec,*XkbNameChangesPtr;
5074642e01fSmrg
5084642e01fSmrgtypedef struct _XkbCompatChanges {
5094642e01fSmrg	unsigned char		changed_groups;
5104642e01fSmrg	unsigned short		first_si;
5114642e01fSmrg	unsigned short		num_si;
5124642e01fSmrg} XkbCompatChangesRec,*XkbCompatChangesPtr;
5134642e01fSmrg
5144642e01fSmrgtypedef struct _XkbChanges {
5154642e01fSmrg	unsigned short		 device_spec;
5164642e01fSmrg	unsigned short		 state_changes;
5174642e01fSmrg	XkbMapChangesRec	 map;
5184642e01fSmrg	XkbControlsChangesRec	 ctrls;
5194642e01fSmrg	XkbIndicatorChangesRec	 indicators;
5204642e01fSmrg	XkbNameChangesRec	 names;
5214642e01fSmrg	XkbCompatChangesRec	 compat;
5224642e01fSmrg} XkbChangesRec, *XkbChangesPtr;
5234642e01fSmrg
5244642e01fSmrg	/*
5254642e01fSmrg	 * These data structures are used to construct a keymap from
5264642e01fSmrg	 * a set of components or to list components in the server
5274642e01fSmrg	 * database.
5284642e01fSmrg	 */
5294642e01fSmrgtypedef struct _XkbComponentNames {
5304642e01fSmrg	char *			 keymap;
5314642e01fSmrg	char *			 keycodes;
5324642e01fSmrg	char *			 types;
5334642e01fSmrg	char *			 compat;
5344642e01fSmrg	char *			 symbols;
5354642e01fSmrg	char *			 geometry;
5364642e01fSmrg} XkbComponentNamesRec, *XkbComponentNamesPtr;
5374642e01fSmrg
5384642e01fSmrgtypedef struct _XkbComponentName {
5394642e01fSmrg	unsigned short		flags;
5404642e01fSmrg	char *			name;
5414642e01fSmrg} XkbComponentNameRec,*XkbComponentNamePtr;
5424642e01fSmrg
5434642e01fSmrgtypedef struct _XkbComponentList {
5444642e01fSmrg	int			num_keymaps;
5454642e01fSmrg	int			num_keycodes;
5464642e01fSmrg	int			num_types;
5474642e01fSmrg	int			num_compat;
5484642e01fSmrg	int			num_symbols;
5494642e01fSmrg	int			num_geometry;
5504642e01fSmrg	XkbComponentNamePtr	keymaps;
5514642e01fSmrg	XkbComponentNamePtr 	keycodes;
5524642e01fSmrg	XkbComponentNamePtr	types;
5534642e01fSmrg	XkbComponentNamePtr	compat;
5544642e01fSmrg	XkbComponentNamePtr	symbols;
5554642e01fSmrg	XkbComponentNamePtr	geometry;
5564642e01fSmrg} XkbComponentListRec, *XkbComponentListPtr;
5574642e01fSmrg
5584642e01fSmrg	/*
5594642e01fSmrg	 * The following data structures describe and track changes to a
5604642e01fSmrg	 * non-keyboard extension device
5614642e01fSmrg	 */
5624642e01fSmrgtypedef struct _XkbDeviceLedInfo {
5634642e01fSmrg	unsigned short			led_class;
5644642e01fSmrg	unsigned short			led_id;
5654642e01fSmrg	unsigned int			phys_indicators;
5664642e01fSmrg	unsigned int			maps_present;
5674642e01fSmrg	unsigned int			names_present;
5684642e01fSmrg	unsigned int			state;
5694642e01fSmrg	Atom 				names[XkbNumIndicators];
5704642e01fSmrg	XkbIndicatorMapRec		maps[XkbNumIndicators];
5714642e01fSmrg} XkbDeviceLedInfoRec,*XkbDeviceLedInfoPtr;
5724642e01fSmrg
5734642e01fSmrgtypedef struct _XkbDeviceInfo {
5744642e01fSmrg	char *			name;
5754642e01fSmrg	Atom			type;
5764642e01fSmrg	unsigned short		device_spec;
5774642e01fSmrg	Bool			has_own_state;
5784642e01fSmrg	unsigned short		supported;
5794642e01fSmrg	unsigned short		unsupported;
5804642e01fSmrg
5814642e01fSmrg	unsigned short		num_btns;
5824642e01fSmrg	XkbAction *		btn_acts;
5834642e01fSmrg
5844642e01fSmrg	unsigned short		sz_leds;
5854642e01fSmrg	unsigned short		num_leds;
5864642e01fSmrg	unsigned short		dflt_kbd_fb;
5874642e01fSmrg	unsigned short		dflt_led_fb;
5884642e01fSmrg	XkbDeviceLedInfoPtr	leds;
5894642e01fSmrg} XkbDeviceInfoRec,*XkbDeviceInfoPtr;
5904642e01fSmrg
5914642e01fSmrg#define	XkbXI_DevHasBtnActs(d)	(((d)->num_btns>0)&&((d)->btn_acts!=NULL))
5924642e01fSmrg#define	XkbXI_LegalDevBtn(d,b)	(XkbXI_DevHasBtnActs(d)&&((b)<(d)->num_btns))
5934642e01fSmrg#define	XkbXI_DevHasLeds(d)	(((d)->num_leds>0)&&((d)->leds!=NULL))
5944642e01fSmrg
5954642e01fSmrgtypedef struct _XkbDeviceLedChanges {
5964642e01fSmrg	unsigned short		led_class;
5974642e01fSmrg	unsigned short		led_id;
5984642e01fSmrg	unsigned int		defined; /* names or maps changed */
5994642e01fSmrg	struct _XkbDeviceLedChanges *next;
6004642e01fSmrg} XkbDeviceLedChangesRec,*XkbDeviceLedChangesPtr;
6014642e01fSmrg
6024642e01fSmrgtypedef struct _XkbDeviceChanges {
6034642e01fSmrg	unsigned int		changed;
6044642e01fSmrg	unsigned short		first_btn;
6054642e01fSmrg	unsigned short		num_btns;
6064642e01fSmrg	XkbDeviceLedChangesRec 	leds;
6074642e01fSmrg} XkbDeviceChangesRec,*XkbDeviceChangesPtr;
6084642e01fSmrg
6094642e01fSmrg#endif /* _XKBSTR_H_ */
610