634 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			634 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C
		
	
	
	
/************************************************************
 | 
						|
Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
 | 
						|
 | 
						|
Permission to use, copy, modify, and distribute this
 | 
						|
software and its documentation for any purpose and without
 | 
						|
fee is hereby granted, provided that the above copyright
 | 
						|
notice appear in all copies and that both that copyright
 | 
						|
notice and this permission notice appear in supporting
 | 
						|
documentation, and that the name of Silicon Graphics not be 
 | 
						|
used in advertising or publicity pertaining to distribution 
 | 
						|
of the software without specific prior written permission.
 | 
						|
Silicon Graphics makes no representation about the suitability 
 | 
						|
of this software for any purpose. It is provided "as is"
 | 
						|
without any express or implied warranty.
 | 
						|
 | 
						|
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
 | 
						|
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
 | 
						|
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
 | 
						|
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 
 | 
						|
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 
 | 
						|
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 
 | 
						|
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
 | 
						|
THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 | 
						|
********************************************************/
 | 
						|
 | 
						|
#ifndef _XKBSTR_H_
 | 
						|
#define	_XKBSTR_H_
 | 
						|
 | 
						|
#include <X11/extensions/XKB.h>
 | 
						|
 | 
						|
#define	XkbCharToInt(v) ((int) ((v) & 0x80 ? ((v) | (~0xff)) : ((v) & 0x7f)))
 | 
						|
#define	XkbIntTo2Chars(i, h, l) ((h) = (i >> 8) & 0xff, (l) = (i) & 0xff)
 | 
						|
 | 
						|
#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
 | 
						|
#define	Xkb2CharsToInt(h, l) ((int) ((h) & 0x80 ? \
 | 
						|
                              (((h) << 8) | (l) | (~0xffff)) : \
 | 
						|
                              (((h) << 8) | (l) & 0x7fff))
 | 
						|
#else
 | 
						|
#define	Xkb2CharsToInt(h,l)	((short)(((h)<<8)|(l)))
 | 
						|
#endif
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Common data structures and access macros
 | 
						|
	 */
 | 
						|
 | 
						|
typedef struct _XkbStateRec {
 | 
						|
	unsigned char   group; /* base + latched + locked */
 | 
						|
	/* FIXME: Why are base + latched short and not char?? */
 | 
						|
	unsigned short  base_group; /* physically ... down? */
 | 
						|
	unsigned short  latched_group;
 | 
						|
	unsigned char   locked_group;
 | 
						|
 | 
						|
	unsigned char   mods; /* base + latched + locked */
 | 
						|
	unsigned char   base_mods; /* physically down */
 | 
						|
	unsigned char   latched_mods;
 | 
						|
	unsigned char   locked_mods;
 | 
						|
 | 
						|
	unsigned char   compat_state; /* mods + group for core state */
 | 
						|
 | 
						|
	/* grab mods = all depressed and latched mods, _not_ locked mods */
 | 
						|
	unsigned char   grab_mods; /* grab mods minus internal mods */
 | 
						|
	unsigned char   compat_grab_mods; /* grab mods + group for core state,
 | 
						|
	                                     but not locked groups if
 | 
						|
                                             IgnoreGroupLocks set */
 | 
						|
 | 
						|
	/* effective mods = all mods (depressed, latched, locked) */
 | 
						|
	unsigned char   lookup_mods; /* effective mods minus internal mods */
 | 
						|
	unsigned char   compat_lookup_mods; /* effective mods + group */
 | 
						|
 | 
						|
	unsigned short  ptr_buttons; /* core pointer buttons */
 | 
						|
} XkbStateRec,*XkbStatePtr;
 | 
						|
#define	XkbStateFieldFromRec(s)	XkbBuildCoreState((s)->lookup_mods,(s)->group)
 | 
						|
#define	XkbGrabStateFromRec(s)	XkbBuildCoreState((s)->grab_mods,(s)->group)
 | 
						|
 | 
						|
typedef struct _XkbMods {
 | 
						|
	unsigned char	mask;	/* effective mods */
 | 
						|
	unsigned char	real_mods;
 | 
						|
	unsigned short	vmods;
 | 
						|
} XkbModsRec,*XkbModsPtr;
 | 
						|
 | 
						|
typedef struct _XkbKTMapEntry {
 | 
						|
	Bool		active;
 | 
						|
	unsigned char	level;
 | 
						|
	XkbModsRec	mods;
 | 
						|
} XkbKTMapEntryRec,*XkbKTMapEntryPtr;
 | 
						|
 | 
						|
typedef struct _XkbKeyType {
 | 
						|
	XkbModsRec		mods;
 | 
						|
	unsigned char	  	num_levels;
 | 
						|
	unsigned char	  	map_count;
 | 
						|
	XkbKTMapEntryPtr  	map;
 | 
						|
	XkbModsPtr  		preserve;
 | 
						|
	Atom		  	name;
 | 
						|
	Atom *			level_names;
 | 
						|
} XkbKeyTypeRec, *XkbKeyTypePtr;
 | 
						|
 | 
						|
#define	XkbNumGroups(g)			((g)&0x0f)
 | 
						|
#define	XkbOutOfRangeGroupInfo(g)	((g)&0xf0)
 | 
						|
#define	XkbOutOfRangeGroupAction(g)	((g)&0xc0)
 | 
						|
#define	XkbOutOfRangeGroupNumber(g)	(((g)&0x30)>>4)
 | 
						|
#define	XkbSetGroupInfo(g, w, n) (((w) & 0xc0) | (((n) & 3) << 4) | \
 | 
						|
                                  ((g) & 0x0f))
 | 
						|
#define	XkbSetNumGroups(g,n)	(((g)&0xf0)|((n)&0x0f))
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Structures and access macros used primarily by the server
 | 
						|
	 */
 | 
						|
 | 
						|
typedef struct _XkbBehavior {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	data;
 | 
						|
} XkbBehavior;
 | 
						|
 | 
						|
#define	XkbAnyActionDataSize 7
 | 
						|
typedef	struct _XkbAnyAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	data[XkbAnyActionDataSize];
 | 
						|
} XkbAnyAction;
 | 
						|
 | 
						|
typedef struct _XkbModAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
	unsigned char	mask;
 | 
						|
	unsigned char	real_mods;
 | 
						|
        /* FIXME: Make this an int. */
 | 
						|
	unsigned char	vmods1;
 | 
						|
	unsigned char	vmods2;
 | 
						|
} XkbModAction;
 | 
						|
#define	XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
 | 
						|
#define	XkbSetModActionVMods(a,v) \
 | 
						|
	((a)->vmods1 = (((v) >> 8) & 0xff), \
 | 
						|
         (a)->vmods2 = (v) & 0xff)
 | 
						|
 | 
						|
typedef struct _XkbGroupAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
        /* FIXME: Make this an int. */
 | 
						|
	char		group_XXX;
 | 
						|
} XkbGroupAction;
 | 
						|
#define	XkbSAGroup(a)		(XkbCharToInt((a)->group_XXX))
 | 
						|
#define	XkbSASetGroup(a,g)	((a)->group_XXX=(g))
 | 
						|
 | 
						|
typedef struct _XkbISOAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
	unsigned char	mask;
 | 
						|
	unsigned char	real_mods;
 | 
						|
        /* FIXME: Make this an int. */
 | 
						|
	char		group_XXX;
 | 
						|
	unsigned char	affect;
 | 
						|
	unsigned char	vmods1;
 | 
						|
	unsigned char	vmods2;
 | 
						|
} XkbISOAction;
 | 
						|
 | 
						|
typedef struct _XkbPtrAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
        /* FIXME: Make this an int. */
 | 
						|
	unsigned char	high_XXX;
 | 
						|
	unsigned char	low_XXX;
 | 
						|
	unsigned char	high_YYY;
 | 
						|
	unsigned char	low_YYY;
 | 
						|
} XkbPtrAction;
 | 
						|
#define	XkbPtrActionX(a)      (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
 | 
						|
#define	XkbPtrActionY(a)      (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
 | 
						|
#define	XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
 | 
						|
#define	XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
 | 
						|
 | 
						|
typedef struct _XkbPtrBtnAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
	unsigned char	count;
 | 
						|
	unsigned char	button;
 | 
						|
} XkbPtrBtnAction;
 | 
						|
 | 
						|
typedef struct _XkbPtrDfltAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
	unsigned char	affect;
 | 
						|
	char		valueXXX;
 | 
						|
} XkbPtrDfltAction;
 | 
						|
#define	XkbSAPtrDfltValue(a)		(XkbCharToInt((a)->valueXXX))
 | 
						|
#define	XkbSASetPtrDfltValue(a, c) ((a)->valueXXX = (c) & 0xff)
 | 
						|
 | 
						|
typedef struct _XkbSwitchScreenAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
	char		screenXXX;
 | 
						|
} XkbSwitchScreenAction;
 | 
						|
#define	XkbSAScreen(a)			(XkbCharToInt((a)->screenXXX))
 | 
						|
#define	XkbSASetScreen(a, s) ((a)->screenXXX = (s) & 0xff)
 | 
						|
 | 
						|
typedef struct _XkbCtrlsAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
        /* FIXME: Make this an int. */
 | 
						|
	unsigned char	ctrls3;
 | 
						|
	unsigned char	ctrls2;
 | 
						|
	unsigned char	ctrls1;
 | 
						|
	unsigned char	ctrls0;
 | 
						|
} XkbCtrlsAction;
 | 
						|
#define	XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
 | 
						|
                                 (a)->ctrls2 = ((c) >> 16) & 0xff, \
 | 
						|
                                 (a)->ctrls1 = ((c) >> 8) & 0xff, \
 | 
						|
                                 (a)->ctrls0 = (c) & 0xff)
 | 
						|
#define	XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
 | 
						|
			   (((unsigned int)(a)->ctrls2)<<16)|\
 | 
						|
			   (((unsigned int)(a)->ctrls1)<<8)|\
 | 
						|
                           ((unsigned int) (a)->ctrls0))
 | 
						|
 | 
						|
typedef struct _XkbMessageAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
	unsigned char	message[6];
 | 
						|
} XkbMessageAction;
 | 
						|
 | 
						|
typedef struct	_XkbRedirectKeyAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	new_key;
 | 
						|
	unsigned char	mods_mask;
 | 
						|
	unsigned char	mods;
 | 
						|
        /* FIXME: Make this an int. */
 | 
						|
	unsigned char	vmods_mask0;
 | 
						|
	unsigned char	vmods_mask1;
 | 
						|
	unsigned char	vmods0;
 | 
						|
	unsigned char	vmods1;
 | 
						|
} XkbRedirectKeyAction;
 | 
						|
 | 
						|
#define	XkbSARedirectVMods(a)		((((unsigned int)(a)->vmods1)<<8)|\
 | 
						|
					((unsigned int)(a)->vmods0))
 | 
						|
/* FIXME: This is blatantly not setting vmods.   Yeesh. */
 | 
						|
#define	XkbSARedirectSetVMods(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
 | 
						|
					 ((a)->vmods_mask0=((m)&0xff)))
 | 
						|
#define	XkbSARedirectVModsMask(a)	((((unsigned int)(a)->vmods_mask1)<<8)|\
 | 
						|
					((unsigned int)(a)->vmods_mask0))
 | 
						|
#define	XkbSARedirectSetVModsMask(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
 | 
						|
					 ((a)->vmods_mask0=((m)&0xff)))
 | 
						|
 | 
						|
typedef struct _XkbDeviceBtnAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
	unsigned char	count;
 | 
						|
	unsigned char	button;
 | 
						|
	unsigned char	device;
 | 
						|
} XkbDeviceBtnAction;
 | 
						|
 | 
						|
typedef struct _XkbDeviceValuatorAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	device;
 | 
						|
	unsigned char	v1_what;
 | 
						|
	unsigned char	v1_ndx;
 | 
						|
	unsigned char	v1_value;
 | 
						|
	unsigned char	v2_what;
 | 
						|
	unsigned char	v2_ndx;
 | 
						|
	unsigned char	v2_value;
 | 
						|
} XkbDeviceValuatorAction;
 | 
						|
 | 
						|
typedef	union _XkbAction {
 | 
						|
	XkbAnyAction		any;
 | 
						|
	XkbModAction		mods;
 | 
						|
	XkbGroupAction		group;
 | 
						|
	XkbISOAction		iso;
 | 
						|
	XkbPtrAction		ptr;
 | 
						|
	XkbPtrBtnAction		btn;
 | 
						|
	XkbPtrDfltAction	dflt;
 | 
						|
	XkbSwitchScreenAction	screen;
 | 
						|
	XkbCtrlsAction		ctrls;
 | 
						|
	XkbMessageAction	msg;
 | 
						|
	XkbRedirectKeyAction	redirect;
 | 
						|
	XkbDeviceBtnAction	devbtn;
 | 
						|
	XkbDeviceValuatorAction	devval;
 | 
						|
	unsigned char 		type;
 | 
						|
} XkbAction;
 | 
						|
 | 
						|
typedef	struct _XkbControls {
 | 
						|
	unsigned char	mk_dflt_btn;
 | 
						|
	unsigned char	num_groups;
 | 
						|
	unsigned char	groups_wrap;
 | 
						|
	XkbModsRec	internal;
 | 
						|
	XkbModsRec	ignore_lock;
 | 
						|
	unsigned int	enabled_ctrls;
 | 
						|
	unsigned short	repeat_delay;
 | 
						|
	unsigned short	repeat_interval;
 | 
						|
	unsigned short	slow_keys_delay;
 | 
						|
	unsigned short	debounce_delay;
 | 
						|
	unsigned short	mk_delay;
 | 
						|
	unsigned short	mk_interval;
 | 
						|
	unsigned short	mk_time_to_max;
 | 
						|
	unsigned short	mk_max_speed;
 | 
						|
		 short	mk_curve;
 | 
						|
	unsigned short	ax_options;
 | 
						|
	unsigned short	ax_timeout;
 | 
						|
	unsigned short	axt_opts_mask;
 | 
						|
	unsigned short	axt_opts_values;
 | 
						|
	unsigned int	axt_ctrls_mask;
 | 
						|
	unsigned int	axt_ctrls_values;
 | 
						|
	unsigned char	per_key_repeat[XkbPerKeyBitArraySize];
 | 
						|
} XkbControlsRec, *XkbControlsPtr;
 | 
						|
 | 
						|
#define	XkbAX_AnyFeedback(c)	((c)->enabled_ctrls&XkbAccessXFeedbackMask)
 | 
						|
#define	XkbAX_NeedOption(c,w)	((c)->ax_options&(w))
 | 
						|
#define	XkbAX_NeedFeedback(c, w) (XkbAX_AnyFeedback((c)) && \
 | 
						|
                                  XkbAX_NeedOption((c), (w)))
 | 
						|
 | 
						|
typedef struct _XkbServerMapRec {
 | 
						|
	unsigned short		 num_acts;
 | 
						|
	unsigned short		 size_acts;
 | 
						|
	XkbAction		*acts;
 | 
						|
 | 
						|
	XkbBehavior		*behaviors;
 | 
						|
	unsigned short		*key_acts;
 | 
						|
#if defined(__cplusplus) || defined(c_plusplus)
 | 
						|
	/* explicit is a C++ reserved word */
 | 
						|
	unsigned char		*c_explicit;
 | 
						|
#else
 | 
						|
	unsigned char		*explicit;
 | 
						|
#endif
 | 
						|
	unsigned char		 vmods[XkbNumVirtualMods];
 | 
						|
	unsigned short		*vmodmap;
 | 
						|
} XkbServerMapRec, *XkbServerMapPtr;
 | 
						|
 | 
						|
#define	XkbSMKeyActionsPtr(m, k) (&(m)->acts[(m)->key_acts[(k)]])
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Structures and access macros used primarily by clients
 | 
						|
	 */
 | 
						|
 | 
						|
typedef	struct _XkbSymMapRec {
 | 
						|
	unsigned char	 kt_index[XkbNumKbdGroups];
 | 
						|
	unsigned char	 group_info;
 | 
						|
	unsigned char	 width;
 | 
						|
	unsigned short	 offset;
 | 
						|
} XkbSymMapRec, *XkbSymMapPtr;
 | 
						|
 | 
						|
typedef struct _XkbClientMapRec {
 | 
						|
	unsigned char		 size_types;
 | 
						|
	unsigned char		 num_types;
 | 
						|
	XkbKeyTypePtr		 types;
 | 
						|
 | 
						|
	unsigned short		 size_syms;
 | 
						|
	unsigned short		 num_syms;
 | 
						|
	KeySym			*syms;
 | 
						|
	XkbSymMapPtr		 key_sym_map;
 | 
						|
 | 
						|
	unsigned char		*modmap;
 | 
						|
} XkbClientMapRec, *XkbClientMapPtr;
 | 
						|
 | 
						|
#define	XkbCMKeyGroupInfo(m, k) ((m)->key_sym_map[(k)].group_info)
 | 
						|
#define	XkbCMKeyNumGroups(m, k) (XkbNumGroups((m)->key_sym_map[(k)].group_info))
 | 
						|
#define	XkbCMKeyGroupWidth(m, k, g) (XkbCMKeyType((m), (k), (g))->num_levels)
 | 
						|
#define	XkbCMKeyGroupsWidth(m, k) ((m)->key_sym_map[(k)].width)
 | 
						|
#define	XkbCMKeyTypeIndex(m, k, g) ((m)->key_sym_map[(k)].kt_index[(g) & 0x3])
 | 
						|
#define	XkbCMKeyType(m, k, g) (&(m)->types[XkbCMKeyTypeIndex((m), (k), (g))])
 | 
						|
#define	XkbCMKeyNumSyms(m, k) (XkbCMKeyGroupsWidth((m), (k)) * \
 | 
						|
                               XkbCMKeyNumGroups((m), (k)))
 | 
						|
#define	XkbCMKeySymsOffset(m, k) ((m)->key_sym_map[(k)].offset)
 | 
						|
#define	XkbCMKeySymsPtr(m, k) (&(m)->syms[XkbCMKeySymsOffset((m), (k))])
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Compatibility structures and access macros
 | 
						|
	 */
 | 
						|
 | 
						|
typedef struct _XkbSymInterpretRec {
 | 
						|
	KeySym		sym;
 | 
						|
	unsigned char	flags;
 | 
						|
	unsigned char	match;
 | 
						|
	unsigned char	mods;
 | 
						|
	unsigned char	virtual_mod;
 | 
						|
	XkbAnyAction	act;
 | 
						|
} XkbSymInterpretRec,*XkbSymInterpretPtr;
 | 
						|
 | 
						|
typedef struct _XkbCompatMapRec {
 | 
						|
	XkbSymInterpretPtr	 sym_interpret;
 | 
						|
	XkbModsRec		 groups[XkbNumKbdGroups];
 | 
						|
	unsigned short		 num_si;
 | 
						|
	unsigned short		 size_si;
 | 
						|
} XkbCompatMapRec, *XkbCompatMapPtr;
 | 
						|
 | 
						|
typedef struct _XkbIndicatorMapRec {
 | 
						|
	unsigned char	flags;
 | 
						|
        /* FIXME: For some reason, interepretation of groups is wildly
 | 
						|
         *        different between which being base/latched/locked. */
 | 
						|
	unsigned char	which_groups;
 | 
						|
	unsigned char	groups;
 | 
						|
	unsigned char	which_mods;
 | 
						|
	XkbModsRec	mods;
 | 
						|
	unsigned int	ctrls;
 | 
						|
} XkbIndicatorMapRec, *XkbIndicatorMapPtr;
 | 
						|
 | 
						|
#define	XkbIM_IsAuto(i)	(!((i)->flags & XkbIM_NoAutomatic) && \
 | 
						|
			    (((i)->which_groups&&(i)->groups)||\
 | 
						|
			     ((i)->which_mods&&(i)->mods.mask)||\
 | 
						|
                          (i)->ctrls))
 | 
						|
#define	XkbIM_InUse(i)	((i)->flags || (i)->which_groups || (i)->which_mods || \
 | 
						|
                         (i)->ctrls)
 | 
						|
	
 | 
						|
 | 
						|
typedef struct _XkbIndicatorRec {
 | 
						|
	unsigned long	  	phys_indicators;
 | 
						|
	XkbIndicatorMapRec	maps[XkbNumIndicators];
 | 
						|
} XkbIndicatorRec,*XkbIndicatorPtr;
 | 
						|
 | 
						|
typedef	struct _XkbKeyNameRec {
 | 
						|
	char	name[XkbKeyNameLength];
 | 
						|
} XkbKeyNameRec,*XkbKeyNamePtr;
 | 
						|
 | 
						|
typedef struct _XkbKeyAliasRec {
 | 
						|
	char	real[XkbKeyNameLength];
 | 
						|
	char	alias[XkbKeyNameLength];
 | 
						|
} XkbKeyAliasRec,*XkbKeyAliasPtr;
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Names for everything 
 | 
						|
	 */
 | 
						|
typedef struct _XkbNamesRec {
 | 
						|
	Atom		  keycodes;
 | 
						|
	Atom		  geometry;
 | 
						|
	Atom		  symbols;
 | 
						|
	Atom              types;
 | 
						|
	Atom		  compat;
 | 
						|
	Atom		  vmods[XkbNumVirtualMods];
 | 
						|
	Atom		  indicators[XkbNumIndicators];
 | 
						|
	Atom		  groups[XkbNumKbdGroups];
 | 
						|
	XkbKeyNamePtr	  keys;
 | 
						|
	XkbKeyAliasPtr	  key_aliases;
 | 
						|
	Atom		 *radio_groups;
 | 
						|
	Atom		  phys_symbols;
 | 
						|
 | 
						|
	unsigned char	  num_keys;
 | 
						|
	unsigned char	  num_key_aliases;
 | 
						|
	unsigned short	  num_rg;
 | 
						|
} XkbNamesRec,*XkbNamesPtr;
 | 
						|
 | 
						|
typedef	struct _XkbGeometry	*XkbGeometryPtr;
 | 
						|
	/*
 | 
						|
	 * Tie it all together into one big keyboard description
 | 
						|
	 */
 | 
						|
typedef	struct _XkbDesc {
 | 
						|
        unsigned int            defined;
 | 
						|
	unsigned short	 	flags;
 | 
						|
	unsigned short		device_spec;
 | 
						|
	KeyCode			min_key_code;
 | 
						|
	KeyCode			max_key_code;
 | 
						|
 | 
						|
	XkbControlsPtr		ctrls;
 | 
						|
	XkbServerMapPtr		server;
 | 
						|
	XkbClientMapPtr		map;
 | 
						|
	XkbIndicatorPtr		indicators;
 | 
						|
	XkbNamesPtr		names;
 | 
						|
	XkbCompatMapPtr		compat;
 | 
						|
	XkbGeometryPtr		geom;
 | 
						|
} XkbDescRec, *XkbDescPtr;
 | 
						|
#define	XkbKeyKeyTypeIndex(d, k, g)	(XkbCMKeyTypeIndex((d)->map, (k), (g)))
 | 
						|
#define	XkbKeyKeyType(d, k, g)		(XkbCMKeyType((d)->map, (k), (g)))
 | 
						|
#define	XkbKeyGroupWidth(d, k, g)	(XkbCMKeyGroupWidth((d)->map, (k), (g)))
 | 
						|
#define	XkbKeyGroupsWidth(d, k)		(XkbCMKeyGroupsWidth((d)->map, (k)))
 | 
						|
#define	XkbKeyGroupInfo(d,k)		(XkbCMKeyGroupInfo((d)->map,(k)))
 | 
						|
#define	XkbKeyNumGroups(d,k)		(XkbCMKeyNumGroups((d)->map,(k)))
 | 
						|
#define	XkbKeyNumSyms(d,k)		(XkbCMKeyNumSyms((d)->map,(k)))
 | 
						|
#define	XkbKeySymsPtr(d,k)		(XkbCMKeySymsPtr((d)->map,(k)))
 | 
						|
#define	XkbKeySym(d, k, n)		(XkbKeySymsPtr((d), (k))[(n)])
 | 
						|
#define	XkbKeySymEntry(d,k,sl,g) \
 | 
						|
    (XkbKeySym((d), (k), (XkbKeyGroupsWidth((d), (k)) * (g)) + (sl)))
 | 
						|
#define	XkbKeyAction(d,k,n) \
 | 
						|
    (XkbKeyHasActions((d), (k)) ? & XkbKeyActionsPtr((d), (k))[(n)] : NULL)
 | 
						|
#define	XkbKeyActionEntry(d,k,sl,g) \
 | 
						|
    (XkbKeyHasActions((d), (k)) ? \
 | 
						|
     XkbKeyAction((d), (k), ((XkbKeyGroupsWidth((d), (k)) * (g)) + (sl))) : \
 | 
						|
     NULL)
 | 
						|
 | 
						|
#define	XkbKeyHasActions(d, k) (!!(d)->server->key_acts[(k)])
 | 
						|
#define	XkbKeyNumActions(d, k) (XkbKeyHasActions((d), (k)) ? \
 | 
						|
                                XkbKeyNumSyms((d), (k)) : 1)
 | 
						|
#define	XkbKeyActionsPtr(d, k) (XkbSMKeyActionsPtr((d)->server, (k)))
 | 
						|
#define	XkbKeycodeInRange(d, k) ((k) >= (d)->min_key_code && \
 | 
						|
				 (k) <= (d)->max_key_code)
 | 
						|
#define	XkbNumKeys(d)		((d)->max_key_code-(d)->min_key_code+1)
 | 
						|
 | 
						|
 | 
						|
	/*
 | 
						|
	 * The following structures can be used to track changes
 | 
						|
	 * to a keyboard device
 | 
						|
	 */
 | 
						|
typedef struct _XkbMapChanges {
 | 
						|
	unsigned short		 changed;
 | 
						|
	KeyCode			 min_key_code;
 | 
						|
	KeyCode			 max_key_code;
 | 
						|
	unsigned char		 first_type;
 | 
						|
	unsigned char		 num_types;
 | 
						|
	KeyCode			 first_key_sym;
 | 
						|
	unsigned char		 num_key_syms;
 | 
						|
	KeyCode			 first_key_act;
 | 
						|
	unsigned char		 num_key_acts;
 | 
						|
	KeyCode			 first_key_behavior;
 | 
						|
	unsigned char		 num_key_behaviors;
 | 
						|
	KeyCode 		 first_key_explicit;
 | 
						|
	unsigned char		 num_key_explicit;
 | 
						|
	KeyCode			 first_modmap_key;
 | 
						|
	unsigned char		 num_modmap_keys;
 | 
						|
	KeyCode			 first_vmodmap_key;
 | 
						|
	unsigned char		 num_vmodmap_keys;
 | 
						|
	unsigned char		 pad;
 | 
						|
	unsigned short		 vmods;
 | 
						|
} XkbMapChangesRec,*XkbMapChangesPtr;
 | 
						|
 | 
						|
typedef struct _XkbControlsChanges {
 | 
						|
	unsigned int 		 changed_ctrls;
 | 
						|
	unsigned int		 enabled_ctrls_changes;
 | 
						|
	Bool			 num_groups_changed;
 | 
						|
} XkbControlsChangesRec,*XkbControlsChangesPtr;
 | 
						|
 | 
						|
typedef struct _XkbIndicatorChanges {
 | 
						|
	unsigned int		 state_changes;
 | 
						|
	unsigned int		 map_changes;
 | 
						|
} XkbIndicatorChangesRec,*XkbIndicatorChangesPtr;
 | 
						|
 | 
						|
typedef struct _XkbNameChanges {
 | 
						|
	unsigned int 		changed;
 | 
						|
	unsigned char		first_type;
 | 
						|
	unsigned char		num_types;
 | 
						|
	unsigned char		first_lvl;
 | 
						|
	unsigned char		num_lvls;
 | 
						|
	unsigned char		num_aliases;
 | 
						|
	unsigned char		num_rg;
 | 
						|
	unsigned char		first_key;
 | 
						|
	unsigned char		num_keys;
 | 
						|
	unsigned short		changed_vmods;
 | 
						|
	unsigned long		changed_indicators;
 | 
						|
	unsigned char		changed_groups;
 | 
						|
} XkbNameChangesRec,*XkbNameChangesPtr;
 | 
						|
 | 
						|
typedef struct _XkbCompatChanges {
 | 
						|
	unsigned char		changed_groups;
 | 
						|
	unsigned short		first_si;
 | 
						|
	unsigned short		num_si;
 | 
						|
} XkbCompatChangesRec,*XkbCompatChangesPtr;
 | 
						|
 | 
						|
typedef struct _XkbChanges {
 | 
						|
	unsigned short		 device_spec;
 | 
						|
	unsigned short		 state_changes;
 | 
						|
	XkbMapChangesRec	 map;
 | 
						|
	XkbControlsChangesRec	 ctrls;
 | 
						|
	XkbIndicatorChangesRec	 indicators;
 | 
						|
	XkbNameChangesRec	 names;
 | 
						|
	XkbCompatChangesRec	 compat;
 | 
						|
} XkbChangesRec, *XkbChangesPtr;
 | 
						|
 | 
						|
	/*
 | 
						|
	 * These data structures are used to construct a keymap from 
 | 
						|
	 * a set of components or to list components in the server
 | 
						|
	 * database.
 | 
						|
	 */
 | 
						|
typedef struct _XkbComponentNames {
 | 
						|
	char *			 keycodes;
 | 
						|
	char *			 types;
 | 
						|
	char *			 compat;
 | 
						|
	char *			 symbols;
 | 
						|
	char *			 geometry;
 | 
						|
} XkbComponentNamesRec, *XkbComponentNamesPtr;
 | 
						|
 | 
						|
typedef struct _XkbComponentName {
 | 
						|
	unsigned short		flags;
 | 
						|
	char *			name;
 | 
						|
} XkbComponentNameRec,*XkbComponentNamePtr;
 | 
						|
 | 
						|
typedef struct _XkbComponentList {
 | 
						|
	int			num_keymaps;
 | 
						|
	int			num_keycodes;
 | 
						|
	int			num_types;
 | 
						|
	int			num_compat;
 | 
						|
	int			num_symbols;
 | 
						|
	int			num_geometry;
 | 
						|
	XkbComponentNamePtr	keymaps;
 | 
						|
	XkbComponentNamePtr 	keycodes;
 | 
						|
	XkbComponentNamePtr	types;
 | 
						|
	XkbComponentNamePtr	compat;
 | 
						|
	XkbComponentNamePtr	symbols;
 | 
						|
	XkbComponentNamePtr	geometry;
 | 
						|
} XkbComponentListRec, *XkbComponentListPtr;
 | 
						|
 | 
						|
	/*
 | 
						|
	 * The following data structures describe and track changes to a 
 | 
						|
	 * non-keyboard extension device 
 | 
						|
	 */
 | 
						|
typedef struct _XkbDeviceLedInfo {
 | 
						|
	unsigned short			led_class;
 | 
						|
	unsigned short			led_id;
 | 
						|
	unsigned int			phys_indicators;
 | 
						|
	unsigned int			maps_present;
 | 
						|
	unsigned int			names_present;
 | 
						|
	unsigned int			state;
 | 
						|
	Atom 				names[XkbNumIndicators];
 | 
						|
	XkbIndicatorMapRec		maps[XkbNumIndicators];
 | 
						|
} XkbDeviceLedInfoRec,*XkbDeviceLedInfoPtr;
 | 
						|
 | 
						|
typedef struct _XkbDeviceInfo {
 | 
						|
	char *			name;
 | 
						|
	Atom			type;
 | 
						|
	unsigned short		device_spec;
 | 
						|
	Bool			has_own_state;
 | 
						|
	unsigned short		supported;
 | 
						|
	unsigned short		unsupported;
 | 
						|
 | 
						|
	unsigned short		num_btns;
 | 
						|
	XkbAction *		btn_acts;
 | 
						|
 | 
						|
	unsigned short		sz_leds;
 | 
						|
	unsigned short		num_leds;
 | 
						|
	unsigned short		dflt_kbd_fb;
 | 
						|
	unsigned short		dflt_led_fb;
 | 
						|
	XkbDeviceLedInfoPtr	leds;
 | 
						|
} XkbDeviceInfoRec,*XkbDeviceInfoPtr;
 | 
						|
 | 
						|
#define	XkbXI_DevHasBtnActs(d)	((d)->num_btns > 0 && (d)->btn_acts)
 | 
						|
#define	XkbXI_LegalDevBtn(d,b)	(XkbXI_DevHasBtnActs(d) && (b) < (d)->num_btns)
 | 
						|
#define	XkbXI_DevHasLeds(d)	((d)->num_leds > 0 && (d)->leds)
 | 
						|
 | 
						|
typedef struct _XkbDeviceLedChanges {
 | 
						|
	unsigned short		led_class;
 | 
						|
	unsigned short		led_id;
 | 
						|
	unsigned int		defined; /* names or maps changed */
 | 
						|
	struct _XkbDeviceLedChanges *next;
 | 
						|
} XkbDeviceLedChangesRec,*XkbDeviceLedChangesPtr;
 | 
						|
 | 
						|
typedef struct _XkbDeviceChanges {
 | 
						|
	unsigned int		changed;
 | 
						|
	unsigned short		first_btn;
 | 
						|
	unsigned short		num_btns;
 | 
						|
	XkbDeviceLedChangesRec 	leds;
 | 
						|
} XkbDeviceChangesRec,*XkbDeviceChangesPtr;
 | 
						|
 | 
						|
#endif /* _XKBSTR_H_ */
 |