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
935c4bbdfSmrgdocumentation, and that the name of Silicon Graphics not be
1035c4bbdfSmrgused in advertising or publicity pertaining to distribution
114642e01fSmrgof the software without specific prior written permission.
1235c4bbdfSmrgSilicon 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
1635c4bbdfSmrgSILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
1735c4bbdfSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
184642e01fSmrgAND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
1935c4bbdfSmrgGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
2035c4bbdfSmrgDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
2135c4bbdfSmrgDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
224642e01fSmrgOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
234642e01fSmrgTHE USE OR PERFORMANCE OF THIS SOFTWARE.
244642e01fSmrg
254642e01fSmrg********************************************************/
264642e01fSmrg
274642e01fSmrg#ifndef _XKBSTR_H_
284642e01fSmrg#define	_XKBSTR_H_
294642e01fSmrg
304642e01fSmrg#include <X11/extensions/XKB.h>
314642e01fSmrg
326747b715Smrg#define	XkbCharToInt(v) ((int) ((v) & 0x80 ? ((v) | (~0xff)) : ((v) & 0x7f)))
336747b715Smrg#define	XkbIntTo2Chars(i, h, l) ((h) = (i >> 8) & 0xff, (l) = (i) & 0xff)
344642e01fSmrg
354642e01fSmrg#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
366747b715Smrg#define	Xkb2CharsToInt(h, l) ((int) ((h) & 0x80 ? \
376747b715Smrg                              (((h) << 8) | (l) | (~0xffff)) : \
386747b715Smrg                              (((h) << 8) | (l) & 0x7fff))
394642e01fSmrg#else
404642e01fSmrg#define	Xkb2CharsToInt(h,l)	((short)(((h)<<8)|(l)))
414642e01fSmrg#endif
424642e01fSmrg
4335c4bbdfSmrg        /*
4435c4bbdfSmrg         * Common data structures and access macros
4535c4bbdfSmrg         */
464642e01fSmrg
474642e01fSmrgtypedef struct _XkbStateRec {
4835c4bbdfSmrg    unsigned char group;        /* base + latched + locked */
4935c4bbdfSmrg    /* FIXME: Why are base + latched short and not char?? */
5035c4bbdfSmrg    unsigned short base_group;  /* physically ... down? */
5135c4bbdfSmrg    unsigned short latched_group;
5235c4bbdfSmrg    unsigned char locked_group;
5335c4bbdfSmrg
5435c4bbdfSmrg    unsigned char mods;         /* base + latched + locked */
5535c4bbdfSmrg    unsigned char base_mods;    /* physically down */
5635c4bbdfSmrg    unsigned char latched_mods;
5735c4bbdfSmrg    unsigned char locked_mods;
5835c4bbdfSmrg
5935c4bbdfSmrg    unsigned char compat_state; /* mods + group for core state */
6035c4bbdfSmrg
6135c4bbdfSmrg    /* grab mods = all depressed and latched mods, _not_ locked mods */
6235c4bbdfSmrg    unsigned char grab_mods;    /* grab mods minus internal mods */
6335c4bbdfSmrg    unsigned char compat_grab_mods;     /* grab mods + group for core state,
6435c4bbdfSmrg                                           but not locked groups if
6535c4bbdfSmrg                                           IgnoreGroupLocks set */
6635c4bbdfSmrg
6735c4bbdfSmrg    /* effective mods = all mods (depressed, latched, locked) */
6835c4bbdfSmrg    unsigned char lookup_mods;  /* effective mods minus internal mods */
6935c4bbdfSmrg    unsigned char compat_lookup_mods;   /* effective mods + group */
7035c4bbdfSmrg
7135c4bbdfSmrg    unsigned short ptr_buttons; /* core pointer buttons */
7235c4bbdfSmrg} XkbStateRec, *XkbStatePtr;
7335c4bbdfSmrg
744642e01fSmrg#define	XkbStateFieldFromRec(s)	XkbBuildCoreState((s)->lookup_mods,(s)->group)
754642e01fSmrg#define	XkbGrabStateFromRec(s)	XkbBuildCoreState((s)->grab_mods,(s)->group)
764642e01fSmrg
774642e01fSmrgtypedef struct _XkbMods {
7835c4bbdfSmrg    unsigned char mask;         /* effective mods */
7935c4bbdfSmrg    unsigned char real_mods;
8035c4bbdfSmrg    unsigned short vmods;
8135c4bbdfSmrg} XkbModsRec, *XkbModsPtr;
824642e01fSmrg
834642e01fSmrgtypedef struct _XkbKTMapEntry {
8435c4bbdfSmrg    Bool active;
8535c4bbdfSmrg    unsigned char level;
8635c4bbdfSmrg    XkbModsRec mods;
8735c4bbdfSmrg} XkbKTMapEntryRec, *XkbKTMapEntryPtr;
884642e01fSmrg
894642e01fSmrgtypedef struct _XkbKeyType {
9035c4bbdfSmrg    XkbModsRec mods;
9135c4bbdfSmrg    unsigned char num_levels;
9235c4bbdfSmrg    unsigned char map_count;
9335c4bbdfSmrg    XkbKTMapEntryPtr map;
9435c4bbdfSmrg    XkbModsPtr preserve;
9535c4bbdfSmrg    Atom name;
9635c4bbdfSmrg    Atom *level_names;
974642e01fSmrg} XkbKeyTypeRec, *XkbKeyTypePtr;
984642e01fSmrg
994642e01fSmrg#define	XkbNumGroups(g)			((g)&0x0f)
1004642e01fSmrg#define	XkbOutOfRangeGroupInfo(g)	((g)&0xf0)
1014642e01fSmrg#define	XkbOutOfRangeGroupAction(g)	((g)&0xc0)
1024642e01fSmrg#define	XkbOutOfRangeGroupNumber(g)	(((g)&0x30)>>4)
1036747b715Smrg#define	XkbSetGroupInfo(g, w, n) (((w) & 0xc0) | (((n) & 3) << 4) | \
1046747b715Smrg                                  ((g) & 0x0f))
1054642e01fSmrg#define	XkbSetNumGroups(g,n)	(((g)&0xf0)|((n)&0x0f))
1064642e01fSmrg
10735c4bbdfSmrg        /*
10835c4bbdfSmrg         * Structures and access macros used primarily by the server
10935c4bbdfSmrg         */
1104642e01fSmrg
1114642e01fSmrgtypedef struct _XkbBehavior {
11235c4bbdfSmrg    unsigned char type;
11335c4bbdfSmrg    unsigned char data;
1144642e01fSmrg} XkbBehavior;
1154642e01fSmrg
1164642e01fSmrg#define	XkbAnyActionDataSize 7
11735c4bbdfSmrgtypedef struct _XkbAnyAction {
11835c4bbdfSmrg    unsigned char type;
11935c4bbdfSmrg    unsigned char data[XkbAnyActionDataSize];
1204642e01fSmrg} XkbAnyAction;
1214642e01fSmrg
1224642e01fSmrgtypedef struct _XkbModAction {
12335c4bbdfSmrg    unsigned char type;
12435c4bbdfSmrg    unsigned char flags;
12535c4bbdfSmrg    unsigned char mask;
12635c4bbdfSmrg    unsigned char real_mods;
12735c4bbdfSmrg    /* FIXME: Make this an int. */
12835c4bbdfSmrg    unsigned char vmods1;
12935c4bbdfSmrg    unsigned char vmods2;
1304642e01fSmrg} XkbModAction;
13135c4bbdfSmrg
1326747b715Smrg#define	XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
1334642e01fSmrg#define	XkbSetModActionVMods(a,v) \
1346747b715Smrg	((a)->vmods1 = (((v) >> 8) & 0xff), \
1356747b715Smrg         (a)->vmods2 = (v) & 0xff)
1364642e01fSmrg
1374642e01fSmrgtypedef struct _XkbGroupAction {
13835c4bbdfSmrg    unsigned char type;
13935c4bbdfSmrg    unsigned char flags;
14035c4bbdfSmrg    /* FIXME: Make this an int. */
14135c4bbdfSmrg    char group_XXX;
1424642e01fSmrg} XkbGroupAction;
14335c4bbdfSmrg
1444642e01fSmrg#define	XkbSAGroup(a)		(XkbCharToInt((a)->group_XXX))
1454642e01fSmrg#define	XkbSASetGroup(a,g)	((a)->group_XXX=(g))
1464642e01fSmrg
1474642e01fSmrgtypedef struct _XkbISOAction {
14835c4bbdfSmrg    unsigned char type;
14935c4bbdfSmrg    unsigned char flags;
15035c4bbdfSmrg    unsigned char mask;
15135c4bbdfSmrg    unsigned char real_mods;
15235c4bbdfSmrg    /* FIXME: Make this an int. */
15335c4bbdfSmrg    char group_XXX;
15435c4bbdfSmrg    unsigned char affect;
15535c4bbdfSmrg    unsigned char vmods1;
15635c4bbdfSmrg    unsigned char vmods2;
1574642e01fSmrg} XkbISOAction;
1584642e01fSmrg
1594642e01fSmrgtypedef struct _XkbPtrAction {
16035c4bbdfSmrg    unsigned char type;
16135c4bbdfSmrg    unsigned char flags;
16235c4bbdfSmrg    /* FIXME: Make this an int. */
16335c4bbdfSmrg    unsigned char high_XXX;
16435c4bbdfSmrg    unsigned char low_XXX;
16535c4bbdfSmrg    unsigned char high_YYY;
16635c4bbdfSmrg    unsigned char low_YYY;
1674642e01fSmrg} XkbPtrAction;
16835c4bbdfSmrg
1694642e01fSmrg#define	XkbPtrActionX(a)      (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
1704642e01fSmrg#define	XkbPtrActionY(a)      (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
1714642e01fSmrg#define	XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
1724642e01fSmrg#define	XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
1734642e01fSmrg
1744642e01fSmrgtypedef struct _XkbPtrBtnAction {
17535c4bbdfSmrg    unsigned char type;
17635c4bbdfSmrg    unsigned char flags;
17735c4bbdfSmrg    unsigned char count;
17835c4bbdfSmrg    unsigned char button;
1794642e01fSmrg} XkbPtrBtnAction;
1804642e01fSmrg
1814642e01fSmrgtypedef struct _XkbPtrDfltAction {
18235c4bbdfSmrg    unsigned char type;
18335c4bbdfSmrg    unsigned char flags;
18435c4bbdfSmrg    unsigned char affect;
18535c4bbdfSmrg    char valueXXX;
1864642e01fSmrg} XkbPtrDfltAction;
18735c4bbdfSmrg
1884642e01fSmrg#define	XkbSAPtrDfltValue(a)		(XkbCharToInt((a)->valueXXX))
1896747b715Smrg#define	XkbSASetPtrDfltValue(a, c) ((a)->valueXXX = (c) & 0xff)
1904642e01fSmrg
1914642e01fSmrgtypedef struct _XkbSwitchScreenAction {
19235c4bbdfSmrg    unsigned char type;
19335c4bbdfSmrg    unsigned char flags;
19435c4bbdfSmrg    char screenXXX;
1954642e01fSmrg} XkbSwitchScreenAction;
19635c4bbdfSmrg
1974642e01fSmrg#define	XkbSAScreen(a)			(XkbCharToInt((a)->screenXXX))
1986747b715Smrg#define	XkbSASetScreen(a, s) ((a)->screenXXX = (s) & 0xff)
1994642e01fSmrg
2004642e01fSmrgtypedef struct _XkbCtrlsAction {
20135c4bbdfSmrg    unsigned char type;
20235c4bbdfSmrg    unsigned char flags;
20335c4bbdfSmrg    /* FIXME: Make this an int. */
20435c4bbdfSmrg    unsigned char ctrls3;
20535c4bbdfSmrg    unsigned char ctrls2;
20635c4bbdfSmrg    unsigned char ctrls1;
20735c4bbdfSmrg    unsigned char ctrls0;
2084642e01fSmrg} XkbCtrlsAction;
20935c4bbdfSmrg
2106747b715Smrg#define	XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
2116747b715Smrg                                 (a)->ctrls2 = ((c) >> 16) & 0xff, \
2126747b715Smrg                                 (a)->ctrls1 = ((c) >> 8) & 0xff, \
2136747b715Smrg                                 (a)->ctrls0 = (c) & 0xff)
2144642e01fSmrg#define	XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
2154642e01fSmrg			   (((unsigned int)(a)->ctrls2)<<16)|\
2164642e01fSmrg			   (((unsigned int)(a)->ctrls1)<<8)|\
2176747b715Smrg                           ((unsigned int) (a)->ctrls0))
2184642e01fSmrg
2194642e01fSmrgtypedef struct _XkbMessageAction {
22035c4bbdfSmrg    unsigned char type;
22135c4bbdfSmrg    unsigned char flags;
22235c4bbdfSmrg    unsigned char message[6];
2234642e01fSmrg} XkbMessageAction;
2244642e01fSmrg
22535c4bbdfSmrgtypedef struct _XkbRedirectKeyAction {
22635c4bbdfSmrg    unsigned char type;
22735c4bbdfSmrg    unsigned char new_key;
22835c4bbdfSmrg    unsigned char mods_mask;
22935c4bbdfSmrg    unsigned char mods;
23035c4bbdfSmrg    /* FIXME: Make this an int. */
23135c4bbdfSmrg    unsigned char vmods_mask0;
23235c4bbdfSmrg    unsigned char vmods_mask1;
23335c4bbdfSmrg    unsigned char vmods0;
23435c4bbdfSmrg    unsigned char vmods1;
2354642e01fSmrg} XkbRedirectKeyAction;
2364642e01fSmrg
2374642e01fSmrg#define	XkbSARedirectVMods(a)		((((unsigned int)(a)->vmods1)<<8)|\
2384642e01fSmrg					((unsigned int)(a)->vmods0))
2396747b715Smrg/* FIXME: This is blatantly not setting vmods.   Yeesh. */
2404642e01fSmrg#define	XkbSARedirectSetVMods(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
2414642e01fSmrg					 ((a)->vmods_mask0=((m)&0xff)))
2424642e01fSmrg#define	XkbSARedirectVModsMask(a)	((((unsigned int)(a)->vmods_mask1)<<8)|\
2434642e01fSmrg					((unsigned int)(a)->vmods_mask0))
2444642e01fSmrg#define	XkbSARedirectSetVModsMask(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
2454642e01fSmrg					 ((a)->vmods_mask0=((m)&0xff)))
2464642e01fSmrg
2474642e01fSmrgtypedef struct _XkbDeviceBtnAction {
24835c4bbdfSmrg    unsigned char type;
24935c4bbdfSmrg    unsigned char flags;
25035c4bbdfSmrg    unsigned char count;
25135c4bbdfSmrg    unsigned char button;
25235c4bbdfSmrg    unsigned char device;
2534642e01fSmrg} XkbDeviceBtnAction;
2544642e01fSmrg
2554642e01fSmrgtypedef struct _XkbDeviceValuatorAction {
25635c4bbdfSmrg    unsigned char type;
25735c4bbdfSmrg    unsigned char device;
25835c4bbdfSmrg    unsigned char v1_what;
25935c4bbdfSmrg    unsigned char v1_ndx;
26035c4bbdfSmrg    unsigned char v1_value;
26135c4bbdfSmrg    unsigned char v2_what;
26235c4bbdfSmrg    unsigned char v2_ndx;
26335c4bbdfSmrg    unsigned char v2_value;
2644642e01fSmrg} XkbDeviceValuatorAction;
2654642e01fSmrg
26635c4bbdfSmrgtypedef union _XkbAction {
26735c4bbdfSmrg    XkbAnyAction any;
26835c4bbdfSmrg    XkbModAction mods;
26935c4bbdfSmrg    XkbGroupAction group;
27035c4bbdfSmrg    XkbISOAction iso;
27135c4bbdfSmrg    XkbPtrAction ptr;
27235c4bbdfSmrg    XkbPtrBtnAction btn;
27335c4bbdfSmrg    XkbPtrDfltAction dflt;
27435c4bbdfSmrg    XkbSwitchScreenAction screen;
27535c4bbdfSmrg    XkbCtrlsAction ctrls;
27635c4bbdfSmrg    XkbMessageAction msg;
27735c4bbdfSmrg    XkbRedirectKeyAction redirect;
27835c4bbdfSmrg    XkbDeviceBtnAction devbtn;
27935c4bbdfSmrg    XkbDeviceValuatorAction devval;
28035c4bbdfSmrg    unsigned char type;
2814642e01fSmrg} XkbAction;
2824642e01fSmrg
28335c4bbdfSmrgtypedef struct _XkbControls {
28435c4bbdfSmrg    unsigned char mk_dflt_btn;
28535c4bbdfSmrg    unsigned char num_groups;
28635c4bbdfSmrg    unsigned char groups_wrap;
28735c4bbdfSmrg    XkbModsRec internal;
28835c4bbdfSmrg    XkbModsRec ignore_lock;
28935c4bbdfSmrg    unsigned int enabled_ctrls;
29035c4bbdfSmrg    unsigned short repeat_delay;
29135c4bbdfSmrg    unsigned short repeat_interval;
29235c4bbdfSmrg    unsigned short slow_keys_delay;
29335c4bbdfSmrg    unsigned short debounce_delay;
29435c4bbdfSmrg    unsigned short mk_delay;
29535c4bbdfSmrg    unsigned short mk_interval;
29635c4bbdfSmrg    unsigned short mk_time_to_max;
29735c4bbdfSmrg    unsigned short mk_max_speed;
29835c4bbdfSmrg    short mk_curve;
29935c4bbdfSmrg    unsigned short ax_options;
30035c4bbdfSmrg    unsigned short ax_timeout;
30135c4bbdfSmrg    unsigned short axt_opts_mask;
30235c4bbdfSmrg    unsigned short axt_opts_values;
30335c4bbdfSmrg    unsigned int axt_ctrls_mask;
30435c4bbdfSmrg    unsigned int axt_ctrls_values;
30535c4bbdfSmrg    unsigned char per_key_repeat[XkbPerKeyBitArraySize];
3064642e01fSmrg} XkbControlsRec, *XkbControlsPtr;
3074642e01fSmrg
3084642e01fSmrg#define	XkbAX_AnyFeedback(c)	((c)->enabled_ctrls&XkbAccessXFeedbackMask)
3094642e01fSmrg#define	XkbAX_NeedOption(c,w)	((c)->ax_options&(w))
3106747b715Smrg#define	XkbAX_NeedFeedback(c, w) (XkbAX_AnyFeedback((c)) && \
3116747b715Smrg                                  XkbAX_NeedOption((c), (w)))
3124642e01fSmrg
3134642e01fSmrgtypedef struct _XkbServerMapRec {
31435c4bbdfSmrg    unsigned short num_acts;
31535c4bbdfSmrg    unsigned short size_acts;
31635c4bbdfSmrg    XkbAction *acts;
3174642e01fSmrg
31835c4bbdfSmrg    XkbBehavior *behaviors;
31935c4bbdfSmrg    unsigned short *key_acts;
3204642e01fSmrg#if defined(__cplusplus) || defined(c_plusplus)
32135c4bbdfSmrg    /* explicit is a C++ reserved word */
32235c4bbdfSmrg    unsigned char *c_explicit;
3234642e01fSmrg#else
32435c4bbdfSmrg    unsigned char *explicit;
3254642e01fSmrg#endif
32635c4bbdfSmrg    unsigned char vmods[XkbNumVirtualMods];
32735c4bbdfSmrg    unsigned short *vmodmap;
3284642e01fSmrg} XkbServerMapRec, *XkbServerMapPtr;
3294642e01fSmrg
3306747b715Smrg#define	XkbSMKeyActionsPtr(m, k) (&(m)->acts[(m)->key_acts[(k)]])
3314642e01fSmrg
33235c4bbdfSmrg        /*
33335c4bbdfSmrg         * Structures and access macros used primarily by clients
33435c4bbdfSmrg         */
3354642e01fSmrg
33635c4bbdfSmrgtypedef struct _XkbSymMapRec {
33735c4bbdfSmrg    unsigned char kt_index[XkbNumKbdGroups];
33835c4bbdfSmrg    unsigned char group_info;
33935c4bbdfSmrg    unsigned char width;
34035c4bbdfSmrg    unsigned short offset;
3414642e01fSmrg} XkbSymMapRec, *XkbSymMapPtr;
3424642e01fSmrg
3434642e01fSmrgtypedef struct _XkbClientMapRec {
34435c4bbdfSmrg    unsigned char size_types;
34535c4bbdfSmrg    unsigned char num_types;
34635c4bbdfSmrg    XkbKeyTypePtr types;
3474642e01fSmrg
34835c4bbdfSmrg    unsigned short size_syms;
34935c4bbdfSmrg    unsigned short num_syms;
35035c4bbdfSmrg    KeySym *syms;
35135c4bbdfSmrg    XkbSymMapPtr key_sym_map;
3524642e01fSmrg
35335c4bbdfSmrg    unsigned char *modmap;
3544642e01fSmrg} XkbClientMapRec, *XkbClientMapPtr;
3554642e01fSmrg
3566747b715Smrg#define	XkbCMKeyGroupInfo(m, k) ((m)->key_sym_map[(k)].group_info)
3576747b715Smrg#define	XkbCMKeyNumGroups(m, k) (XkbNumGroups((m)->key_sym_map[(k)].group_info))
3586747b715Smrg#define	XkbCMKeyGroupWidth(m, k, g) (XkbCMKeyType((m), (k), (g))->num_levels)
3596747b715Smrg#define	XkbCMKeyGroupsWidth(m, k) ((m)->key_sym_map[(k)].width)
3606747b715Smrg#define	XkbCMKeyTypeIndex(m, k, g) ((m)->key_sym_map[(k)].kt_index[(g) & 0x3])
3616747b715Smrg#define	XkbCMKeyType(m, k, g) (&(m)->types[XkbCMKeyTypeIndex((m), (k), (g))])
3626747b715Smrg#define	XkbCMKeyNumSyms(m, k) (XkbCMKeyGroupsWidth((m), (k)) * \
3636747b715Smrg                               XkbCMKeyNumGroups((m), (k)))
3646747b715Smrg#define	XkbCMKeySymsOffset(m, k) ((m)->key_sym_map[(k)].offset)
3656747b715Smrg#define	XkbCMKeySymsPtr(m, k) (&(m)->syms[XkbCMKeySymsOffset((m), (k))])
3664642e01fSmrg
36735c4bbdfSmrg        /*
36835c4bbdfSmrg         * Compatibility structures and access macros
36935c4bbdfSmrg         */
3704642e01fSmrg
3714642e01fSmrgtypedef struct _XkbSymInterpretRec {
37235c4bbdfSmrg    KeySym sym;
37335c4bbdfSmrg    unsigned char flags;
37435c4bbdfSmrg    unsigned char match;
37535c4bbdfSmrg    unsigned char mods;
37635c4bbdfSmrg    unsigned char virtual_mod;
37735c4bbdfSmrg    XkbAnyAction act;
37835c4bbdfSmrg} XkbSymInterpretRec, *XkbSymInterpretPtr;
3794642e01fSmrg
3804642e01fSmrgtypedef struct _XkbCompatMapRec {
38135c4bbdfSmrg    XkbSymInterpretPtr sym_interpret;
38235c4bbdfSmrg    XkbModsRec groups[XkbNumKbdGroups];
38335c4bbdfSmrg    unsigned short num_si;
38435c4bbdfSmrg    unsigned short size_si;
3854642e01fSmrg} XkbCompatMapRec, *XkbCompatMapPtr;
3864642e01fSmrg
3874642e01fSmrgtypedef struct _XkbIndicatorMapRec {
38835c4bbdfSmrg    unsigned char flags;
389ed6184dfSmrg    /* FIXME: For some reason, interpretation of groups is wildly
39035c4bbdfSmrg     *        different between which being base/latched/locked. */
39135c4bbdfSmrg    unsigned char which_groups;
39235c4bbdfSmrg    unsigned char groups;
39335c4bbdfSmrg    unsigned char which_mods;
39435c4bbdfSmrg    XkbModsRec mods;
39535c4bbdfSmrg    unsigned int ctrls;
3964642e01fSmrg} XkbIndicatorMapRec, *XkbIndicatorMapPtr;
3974642e01fSmrg
3986747b715Smrg#define	XkbIM_IsAuto(i)	(!((i)->flags & XkbIM_NoAutomatic) && \
3994642e01fSmrg			    (((i)->which_groups&&(i)->groups)||\
4004642e01fSmrg			     ((i)->which_mods&&(i)->mods.mask)||\
4016747b715Smrg                          (i)->ctrls))
4026747b715Smrg#define	XkbIM_InUse(i)	((i)->flags || (i)->which_groups || (i)->which_mods || \
4036747b715Smrg                         (i)->ctrls)
4044642e01fSmrg
4054642e01fSmrgtypedef struct _XkbIndicatorRec {
40635c4bbdfSmrg    unsigned long phys_indicators;
40735c4bbdfSmrg    XkbIndicatorMapRec maps[XkbNumIndicators];
40835c4bbdfSmrg} XkbIndicatorRec, *XkbIndicatorPtr;
4094642e01fSmrg
41035c4bbdfSmrgtypedef struct _XkbKeyNameRec {
41135c4bbdfSmrg    char name[XkbKeyNameLength];
41235c4bbdfSmrg} XkbKeyNameRec, *XkbKeyNamePtr;
4134642e01fSmrg
4144642e01fSmrgtypedef struct _XkbKeyAliasRec {
41535c4bbdfSmrg    char real[XkbKeyNameLength];
41635c4bbdfSmrg    char alias[XkbKeyNameLength];
41735c4bbdfSmrg} XkbKeyAliasRec, *XkbKeyAliasPtr;
4184642e01fSmrg
41935c4bbdfSmrg        /*
42035c4bbdfSmrg         * Names for everything
42135c4bbdfSmrg         */
4224642e01fSmrgtypedef struct _XkbNamesRec {
42335c4bbdfSmrg    Atom keycodes;
42435c4bbdfSmrg    Atom geometry;
42535c4bbdfSmrg    Atom symbols;
42635c4bbdfSmrg    Atom types;
42735c4bbdfSmrg    Atom compat;
42835c4bbdfSmrg    Atom vmods[XkbNumVirtualMods];
42935c4bbdfSmrg    Atom indicators[XkbNumIndicators];
43035c4bbdfSmrg    Atom groups[XkbNumKbdGroups];
43135c4bbdfSmrg    XkbKeyNamePtr keys;
43235c4bbdfSmrg    XkbKeyAliasPtr key_aliases;
43335c4bbdfSmrg    Atom *radio_groups;
43435c4bbdfSmrg    Atom phys_symbols;
43535c4bbdfSmrg
43635c4bbdfSmrg    unsigned char num_keys;
43735c4bbdfSmrg    unsigned char num_key_aliases;
43835c4bbdfSmrg    unsigned short num_rg;
43935c4bbdfSmrg} XkbNamesRec, *XkbNamesPtr;
44035c4bbdfSmrg
44135c4bbdfSmrgtypedef struct _XkbGeometry *XkbGeometryPtr;
44235c4bbdfSmrg
44335c4bbdfSmrg        /*
44435c4bbdfSmrg         * Tie it all together into one big keyboard description
44535c4bbdfSmrg         */
44635c4bbdfSmrgtypedef struct _XkbDesc {
44735c4bbdfSmrg    unsigned int defined;
44835c4bbdfSmrg    unsigned short flags;
44935c4bbdfSmrg    unsigned short device_spec;
45035c4bbdfSmrg    KeyCode min_key_code;
45135c4bbdfSmrg    KeyCode max_key_code;
45235c4bbdfSmrg
45335c4bbdfSmrg    XkbControlsPtr ctrls;
45435c4bbdfSmrg    XkbServerMapPtr server;
45535c4bbdfSmrg    XkbClientMapPtr map;
45635c4bbdfSmrg    XkbIndicatorPtr indicators;
45735c4bbdfSmrg    XkbNamesPtr names;
45835c4bbdfSmrg    XkbCompatMapPtr compat;
45935c4bbdfSmrg    XkbGeometryPtr geom;
4604642e01fSmrg} XkbDescRec, *XkbDescPtr;
46135c4bbdfSmrg
4626747b715Smrg#define	XkbKeyKeyTypeIndex(d, k, g)	(XkbCMKeyTypeIndex((d)->map, (k), (g)))
4636747b715Smrg#define	XkbKeyKeyType(d, k, g)		(XkbCMKeyType((d)->map, (k), (g)))
4646747b715Smrg#define	XkbKeyGroupWidth(d, k, g)	(XkbCMKeyGroupWidth((d)->map, (k), (g)))
4656747b715Smrg#define	XkbKeyGroupsWidth(d, k)		(XkbCMKeyGroupsWidth((d)->map, (k)))
4664642e01fSmrg#define	XkbKeyGroupInfo(d,k)		(XkbCMKeyGroupInfo((d)->map,(k)))
4674642e01fSmrg#define	XkbKeyNumGroups(d,k)		(XkbCMKeyNumGroups((d)->map,(k)))
4684642e01fSmrg#define	XkbKeyNumSyms(d,k)		(XkbCMKeyNumSyms((d)->map,(k)))
4694642e01fSmrg#define	XkbKeySymsPtr(d,k)		(XkbCMKeySymsPtr((d)->map,(k)))
4706747b715Smrg#define	XkbKeySym(d, k, n)		(XkbKeySymsPtr((d), (k))[(n)])
4714642e01fSmrg#define	XkbKeySymEntry(d,k,sl,g) \
4726747b715Smrg    (XkbKeySym((d), (k), (XkbKeyGroupsWidth((d), (k)) * (g)) + (sl)))
4734642e01fSmrg#define	XkbKeyAction(d,k,n) \
4746747b715Smrg    (XkbKeyHasActions((d), (k)) ? & XkbKeyActionsPtr((d), (k))[(n)] : NULL)
4754642e01fSmrg#define	XkbKeyActionEntry(d,k,sl,g) \
4766747b715Smrg    (XkbKeyHasActions((d), (k)) ? \
4776747b715Smrg     XkbKeyAction((d), (k), ((XkbKeyGroupsWidth((d), (k)) * (g)) + (sl))) : \
4786747b715Smrg     NULL)
4796747b715Smrg
4806747b715Smrg#define	XkbKeyHasActions(d, k) (!!(d)->server->key_acts[(k)])
4816747b715Smrg#define	XkbKeyNumActions(d, k) (XkbKeyHasActions((d), (k)) ? \
4826747b715Smrg                                XkbKeyNumSyms((d), (k)) : 1)
4836747b715Smrg#define	XkbKeyActionsPtr(d, k) (XkbSMKeyActionsPtr((d)->server, (k)))
4846747b715Smrg#define	XkbKeycodeInRange(d, k) ((k) >= (d)->min_key_code && \
4856747b715Smrg				 (k) <= (d)->max_key_code)
4864642e01fSmrg#define	XkbNumKeys(d)		((d)->max_key_code-(d)->min_key_code+1)
4874642e01fSmrg
48835c4bbdfSmrg        /*
48935c4bbdfSmrg         * The following structures can be used to track changes
49035c4bbdfSmrg         * to a keyboard device
49135c4bbdfSmrg         */
4924642e01fSmrgtypedef struct _XkbMapChanges {
49335c4bbdfSmrg    unsigned short changed;
49435c4bbdfSmrg    KeyCode min_key_code;
49535c4bbdfSmrg    KeyCode max_key_code;
49635c4bbdfSmrg    unsigned char first_type;
49735c4bbdfSmrg    unsigned char num_types;
49835c4bbdfSmrg    KeyCode first_key_sym;
49935c4bbdfSmrg    unsigned char num_key_syms;
50035c4bbdfSmrg    KeyCode first_key_act;
50135c4bbdfSmrg    unsigned char num_key_acts;
50235c4bbdfSmrg    KeyCode first_key_behavior;
50335c4bbdfSmrg    unsigned char num_key_behaviors;
50435c4bbdfSmrg    KeyCode first_key_explicit;
50535c4bbdfSmrg    unsigned char num_key_explicit;
50635c4bbdfSmrg    KeyCode first_modmap_key;
50735c4bbdfSmrg    unsigned char num_modmap_keys;
50835c4bbdfSmrg    KeyCode first_vmodmap_key;
50935c4bbdfSmrg    unsigned char num_vmodmap_keys;
51035c4bbdfSmrg    unsigned char pad;
51135c4bbdfSmrg    unsigned short vmods;
51235c4bbdfSmrg} XkbMapChangesRec, *XkbMapChangesPtr;
5134642e01fSmrg
5144642e01fSmrgtypedef struct _XkbControlsChanges {
51535c4bbdfSmrg    unsigned int changed_ctrls;
51635c4bbdfSmrg    unsigned int enabled_ctrls_changes;
51735c4bbdfSmrg    Bool num_groups_changed;
51835c4bbdfSmrg} XkbControlsChangesRec, *XkbControlsChangesPtr;
5194642e01fSmrg
5204642e01fSmrgtypedef struct _XkbIndicatorChanges {
52135c4bbdfSmrg    unsigned int state_changes;
52235c4bbdfSmrg    unsigned int map_changes;
52335c4bbdfSmrg} XkbIndicatorChangesRec, *XkbIndicatorChangesPtr;
5244642e01fSmrg
5254642e01fSmrgtypedef struct _XkbNameChanges {
52635c4bbdfSmrg    unsigned int changed;
52735c4bbdfSmrg    unsigned char first_type;
52835c4bbdfSmrg    unsigned char num_types;
52935c4bbdfSmrg    unsigned char first_lvl;
53035c4bbdfSmrg    unsigned char num_lvls;
53135c4bbdfSmrg    unsigned char num_aliases;
53235c4bbdfSmrg    unsigned char num_rg;
53335c4bbdfSmrg    unsigned char first_key;
53435c4bbdfSmrg    unsigned char num_keys;
53535c4bbdfSmrg    unsigned short changed_vmods;
53635c4bbdfSmrg    unsigned long changed_indicators;
53735c4bbdfSmrg    unsigned char changed_groups;
53835c4bbdfSmrg} XkbNameChangesRec, *XkbNameChangesPtr;
5394642e01fSmrg
5404642e01fSmrgtypedef struct _XkbCompatChanges {
54135c4bbdfSmrg    unsigned char changed_groups;
54235c4bbdfSmrg    unsigned short first_si;
54335c4bbdfSmrg    unsigned short num_si;
54435c4bbdfSmrg} XkbCompatChangesRec, *XkbCompatChangesPtr;
5454642e01fSmrg
5464642e01fSmrgtypedef struct _XkbChanges {
54735c4bbdfSmrg    unsigned short device_spec;
54835c4bbdfSmrg    unsigned short state_changes;
54935c4bbdfSmrg    XkbMapChangesRec map;
55035c4bbdfSmrg    XkbControlsChangesRec ctrls;
55135c4bbdfSmrg    XkbIndicatorChangesRec indicators;
55235c4bbdfSmrg    XkbNameChangesRec names;
55335c4bbdfSmrg    XkbCompatChangesRec compat;
5544642e01fSmrg} XkbChangesRec, *XkbChangesPtr;
5554642e01fSmrg
55635c4bbdfSmrg        /*
55735c4bbdfSmrg         * These data structures are used to construct a keymap from
55835c4bbdfSmrg         * a set of components or to list components in the server
55935c4bbdfSmrg         * database.
56035c4bbdfSmrg         */
5614642e01fSmrgtypedef struct _XkbComponentNames {
56235c4bbdfSmrg    char *keycodes;
56335c4bbdfSmrg    char *types;
56435c4bbdfSmrg    char *compat;
56535c4bbdfSmrg    char *symbols;
56635c4bbdfSmrg    char *geometry;
5674642e01fSmrg} XkbComponentNamesRec, *XkbComponentNamesPtr;
5684642e01fSmrg
5694642e01fSmrgtypedef struct _XkbComponentName {
57035c4bbdfSmrg    unsigned short flags;
57135c4bbdfSmrg    char *name;
57235c4bbdfSmrg} XkbComponentNameRec, *XkbComponentNamePtr;
5734642e01fSmrg
5744642e01fSmrgtypedef struct _XkbComponentList {
57535c4bbdfSmrg    int num_keymaps;
57635c4bbdfSmrg    int num_keycodes;
57735c4bbdfSmrg    int num_types;
57835c4bbdfSmrg    int num_compat;
57935c4bbdfSmrg    int num_symbols;
58035c4bbdfSmrg    int num_geometry;
58135c4bbdfSmrg    XkbComponentNamePtr keymaps;
58235c4bbdfSmrg    XkbComponentNamePtr keycodes;
58335c4bbdfSmrg    XkbComponentNamePtr types;
58435c4bbdfSmrg    XkbComponentNamePtr compat;
58535c4bbdfSmrg    XkbComponentNamePtr symbols;
58635c4bbdfSmrg    XkbComponentNamePtr geometry;
5874642e01fSmrg} XkbComponentListRec, *XkbComponentListPtr;
5884642e01fSmrg
58935c4bbdfSmrg        /*
59035c4bbdfSmrg         * The following data structures describe and track changes to a
59135c4bbdfSmrg         * non-keyboard extension device
59235c4bbdfSmrg         */
5934642e01fSmrgtypedef struct _XkbDeviceLedInfo {
59435c4bbdfSmrg    unsigned short led_class;
59535c4bbdfSmrg    unsigned short led_id;
59635c4bbdfSmrg    unsigned int phys_indicators;
59735c4bbdfSmrg    unsigned int maps_present;
59835c4bbdfSmrg    unsigned int names_present;
59935c4bbdfSmrg    unsigned int state;
60035c4bbdfSmrg    Atom names[XkbNumIndicators];
60135c4bbdfSmrg    XkbIndicatorMapRec maps[XkbNumIndicators];
60235c4bbdfSmrg} XkbDeviceLedInfoRec, *XkbDeviceLedInfoPtr;
6034642e01fSmrg
6044642e01fSmrgtypedef struct _XkbDeviceInfo {
60535c4bbdfSmrg    char *name;
60635c4bbdfSmrg    Atom type;
60735c4bbdfSmrg    unsigned short device_spec;
60835c4bbdfSmrg    Bool has_own_state;
60935c4bbdfSmrg    unsigned short supported;
61035c4bbdfSmrg    unsigned short unsupported;
61135c4bbdfSmrg
61235c4bbdfSmrg    unsigned short num_btns;
61335c4bbdfSmrg    XkbAction *btn_acts;
61435c4bbdfSmrg
61535c4bbdfSmrg    unsigned short sz_leds;
61635c4bbdfSmrg    unsigned short num_leds;
61735c4bbdfSmrg    unsigned short dflt_kbd_fb;
61835c4bbdfSmrg    unsigned short dflt_led_fb;
61935c4bbdfSmrg    XkbDeviceLedInfoPtr leds;
62035c4bbdfSmrg} XkbDeviceInfoRec, *XkbDeviceInfoPtr;
6214642e01fSmrg
6226747b715Smrg#define	XkbXI_DevHasBtnActs(d)	((d)->num_btns > 0 && (d)->btn_acts)
6236747b715Smrg#define	XkbXI_LegalDevBtn(d,b)	(XkbXI_DevHasBtnActs(d) && (b) < (d)->num_btns)
6246747b715Smrg#define	XkbXI_DevHasLeds(d)	((d)->num_leds > 0 && (d)->leds)
6254642e01fSmrg
6264642e01fSmrgtypedef struct _XkbDeviceLedChanges {
62735c4bbdfSmrg    unsigned short led_class;
62835c4bbdfSmrg    unsigned short led_id;
62935c4bbdfSmrg    unsigned int defined;       /* names or maps changed */
63035c4bbdfSmrg    struct _XkbDeviceLedChanges *next;
63135c4bbdfSmrg} XkbDeviceLedChangesRec, *XkbDeviceLedChangesPtr;
6324642e01fSmrg
6334642e01fSmrgtypedef struct _XkbDeviceChanges {
63435c4bbdfSmrg    unsigned int changed;
63535c4bbdfSmrg    unsigned short first_btn;
63635c4bbdfSmrg    unsigned short num_btns;
63735c4bbdfSmrg    XkbDeviceLedChangesRec leds;
63835c4bbdfSmrg} XkbDeviceChangesRec, *XkbDeviceChangesPtr;
6394642e01fSmrg
64035c4bbdfSmrg#endif                          /* _XKBSTR_H_ */
641