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_ */
 |