614 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			614 lines
		
	
	
		
			18 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)		((v)&0x80?(int)((v)|(~0xff)):(int)((v)&0x7f))
 | 
						|
#define	XkbIntTo2Chars(i,h,l)	(((h)=((i>>8)&0xff)),((l)=((i)&0xff)))
 | 
						|
 | 
						|
#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
 | 
						|
#define	Xkb2CharsToInt(h,l)	((h)&0x80?(int)(((h)<<8)|(l)|(~0xffff)):\
 | 
						|
					  (int)(((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;
 | 
						|
	unsigned char   locked_group;
 | 
						|
	unsigned short	base_group;
 | 
						|
	unsigned short	latched_group;
 | 
						|
	unsigned char	mods;
 | 
						|
	unsigned char	base_mods;
 | 
						|
	unsigned char	latched_mods;
 | 
						|
	unsigned char	locked_mods;
 | 
						|
	unsigned char	compat_state;
 | 
						|
	unsigned char	grab_mods;
 | 
						|
	unsigned char	compat_grab_mods;
 | 
						|
	unsigned char	lookup_mods;
 | 
						|
	unsigned char	compat_lookup_mods;
 | 
						|
	unsigned short	ptr_buttons;
 | 
						|
} XkbStateRec,*XkbStatePtr;
 | 
						|
#define	XkbModLocks(s)	 ((s)->locked_mods)
 | 
						|
#define	XkbStateMods(s)	 ((s)->base_mods|(s)->latched_mods|XkbModLocks(s))
 | 
						|
#define	XkbGroupLock(s)	 ((s)->locked_group)
 | 
						|
#define	XkbStateGroup(s) ((s)->base_group+(s)->latched_group+XkbGroupLock(s))
 | 
						|
#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;
 | 
						|
	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;
 | 
						|
	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;
 | 
						|
	char		group_XXX;
 | 
						|
	unsigned char	affect;
 | 
						|
	unsigned char	vmods1;
 | 
						|
	unsigned char	vmods2;
 | 
						|
} XkbISOAction;
 | 
						|
 | 
						|
typedef struct _XkbPtrAction {
 | 
						|
	unsigned char	type;
 | 
						|
	unsigned char	flags;
 | 
						|
	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;
 | 
						|
	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;
 | 
						|
	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))
 | 
						|
#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;
 | 
						|
	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)==0)&&\
 | 
						|
			    (((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]!=0)
 | 
						|
#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 *			 keymap;
 | 
						|
	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!=NULL))
 | 
						|
#define	XkbXI_LegalDevBtn(d,b)	(XkbXI_DevHasBtnActs(d)&&((b)<(d)->num_btns))
 | 
						|
#define	XkbXI_DevHasLeds(d)	(((d)->num_leds>0)&&((d)->leds!=NULL))
 | 
						|
 | 
						|
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_ */
 |