1*4882a593Smuzhiyun /************************************************************ 2*4882a593Smuzhiyun Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun Permission to use, copy, modify, and distribute this 5*4882a593Smuzhiyun software and its documentation for any purpose and without 6*4882a593Smuzhiyun fee is hereby granted, provided that the above copyright 7*4882a593Smuzhiyun notice appear in all copies and that both that copyright 8*4882a593Smuzhiyun notice and this permission notice appear in supporting 9*4882a593Smuzhiyun documentation, and that the name of Silicon Graphics not be 10*4882a593Smuzhiyun used in advertising or publicity pertaining to distribution 11*4882a593Smuzhiyun of the software without specific prior written permission. 12*4882a593Smuzhiyun Silicon Graphics makes no representation about the suitability 13*4882a593Smuzhiyun of this software for any purpose. It is provided "as is" 14*4882a593Smuzhiyun without any express or implied warranty. 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 17*4882a593Smuzhiyun SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 18*4882a593Smuzhiyun AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON 19*4882a593Smuzhiyun GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 20*4882a593Smuzhiyun DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 21*4882a593Smuzhiyun DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 22*4882a593Smuzhiyun OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH 23*4882a593Smuzhiyun THE USE OR PERFORMANCE OF THIS SOFTWARE. 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun ********************************************************/ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #ifndef _XKBSTR_H_ 28*4882a593Smuzhiyun #define _XKBSTR_H_ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include <X11/extensions/XKB.h> 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define XkbCharToInt(v) ((int) ((v) & 0x80 ? ((v) | (~0xff)) : ((v) & 0x7f))) 33*4882a593Smuzhiyun #define XkbIntTo2Chars(i, h, l) ((h) = (i >> 8) & 0xff, (l) = (i) & 0xff) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #if defined(WORD64) && defined(UNSIGNEDBITFIELDS) 36*4882a593Smuzhiyun #define Xkb2CharsToInt(h, l) ((int) ((h) & 0x80 ? \ 37*4882a593Smuzhiyun (((h) << 8) | (l) | (~0xffff)) : \ 38*4882a593Smuzhiyun (((h) << 8) | (l) & 0x7fff)) 39*4882a593Smuzhiyun #else 40*4882a593Smuzhiyun #define Xkb2CharsToInt(h,l) ((short)(((h)<<8)|(l))) 41*4882a593Smuzhiyun #endif 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * Common data structures and access macros 45*4882a593Smuzhiyun */ 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun typedef struct _XkbStateRec { 48*4882a593Smuzhiyun unsigned char group; /* base + latched + locked */ 49*4882a593Smuzhiyun /* FIXME: Why are base + latched short and not char?? */ 50*4882a593Smuzhiyun unsigned short base_group; /* physically ... down? */ 51*4882a593Smuzhiyun unsigned short latched_group; 52*4882a593Smuzhiyun unsigned char locked_group; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun unsigned char mods; /* base + latched + locked */ 55*4882a593Smuzhiyun unsigned char base_mods; /* physically down */ 56*4882a593Smuzhiyun unsigned char latched_mods; 57*4882a593Smuzhiyun unsigned char locked_mods; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun unsigned char compat_state; /* mods + group for core state */ 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* grab mods = all depressed and latched mods, _not_ locked mods */ 62*4882a593Smuzhiyun unsigned char grab_mods; /* grab mods minus internal mods */ 63*4882a593Smuzhiyun unsigned char compat_grab_mods; /* grab mods + group for core state, 64*4882a593Smuzhiyun but not locked groups if 65*4882a593Smuzhiyun IgnoreGroupLocks set */ 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* effective mods = all mods (depressed, latched, locked) */ 68*4882a593Smuzhiyun unsigned char lookup_mods; /* effective mods minus internal mods */ 69*4882a593Smuzhiyun unsigned char compat_lookup_mods; /* effective mods + group */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun unsigned short ptr_buttons; /* core pointer buttons */ 72*4882a593Smuzhiyun } XkbStateRec, *XkbStatePtr; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group) 75*4882a593Smuzhiyun #define XkbGrabStateFromRec(s) XkbBuildCoreState((s)->grab_mods,(s)->group) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun typedef struct _XkbMods { 78*4882a593Smuzhiyun unsigned char mask; /* effective mods */ 79*4882a593Smuzhiyun unsigned char real_mods; 80*4882a593Smuzhiyun unsigned short vmods; 81*4882a593Smuzhiyun } XkbModsRec, *XkbModsPtr; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun typedef struct _XkbKTMapEntry { 84*4882a593Smuzhiyun Bool active; 85*4882a593Smuzhiyun unsigned char level; 86*4882a593Smuzhiyun XkbModsRec mods; 87*4882a593Smuzhiyun } XkbKTMapEntryRec, *XkbKTMapEntryPtr; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun typedef struct _XkbKeyType { 90*4882a593Smuzhiyun XkbModsRec mods; 91*4882a593Smuzhiyun unsigned char num_levels; 92*4882a593Smuzhiyun unsigned char map_count; 93*4882a593Smuzhiyun XkbKTMapEntryPtr map; 94*4882a593Smuzhiyun XkbModsPtr preserve; 95*4882a593Smuzhiyun Atom name; 96*4882a593Smuzhiyun Atom *level_names; 97*4882a593Smuzhiyun } XkbKeyTypeRec, *XkbKeyTypePtr; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define XkbNumGroups(g) ((g)&0x0f) 100*4882a593Smuzhiyun #define XkbOutOfRangeGroupInfo(g) ((g)&0xf0) 101*4882a593Smuzhiyun #define XkbOutOfRangeGroupAction(g) ((g)&0xc0) 102*4882a593Smuzhiyun #define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4) 103*4882a593Smuzhiyun #define XkbSetGroupInfo(g, w, n) (((w) & 0xc0) | (((n) & 3) << 4) | \ 104*4882a593Smuzhiyun ((g) & 0x0f)) 105*4882a593Smuzhiyun #define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f)) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* 108*4882a593Smuzhiyun * Structures and access macros used primarily by the server 109*4882a593Smuzhiyun */ 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun typedef struct _XkbBehavior { 112*4882a593Smuzhiyun unsigned char type; 113*4882a593Smuzhiyun unsigned char data; 114*4882a593Smuzhiyun } XkbBehavior; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define XkbAnyActionDataSize 7 117*4882a593Smuzhiyun typedef struct _XkbAnyAction { 118*4882a593Smuzhiyun unsigned char type; 119*4882a593Smuzhiyun unsigned char data[XkbAnyActionDataSize]; 120*4882a593Smuzhiyun } XkbAnyAction; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun typedef struct _XkbModAction { 123*4882a593Smuzhiyun unsigned char type; 124*4882a593Smuzhiyun unsigned char flags; 125*4882a593Smuzhiyun unsigned char mask; 126*4882a593Smuzhiyun unsigned char real_mods; 127*4882a593Smuzhiyun /* FIXME: Make this an int. */ 128*4882a593Smuzhiyun unsigned char vmods1; 129*4882a593Smuzhiyun unsigned char vmods2; 130*4882a593Smuzhiyun } XkbModAction; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2)) 133*4882a593Smuzhiyun #define XkbSetModActionVMods(a,v) \ 134*4882a593Smuzhiyun ((a)->vmods1 = (((v) >> 8) & 0xff), \ 135*4882a593Smuzhiyun (a)->vmods2 = (v) & 0xff) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun typedef struct _XkbGroupAction { 138*4882a593Smuzhiyun unsigned char type; 139*4882a593Smuzhiyun unsigned char flags; 140*4882a593Smuzhiyun /* FIXME: Make this an int. */ 141*4882a593Smuzhiyun char group_XXX; 142*4882a593Smuzhiyun } XkbGroupAction; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #define XkbSAGroup(a) (XkbCharToInt((a)->group_XXX)) 145*4882a593Smuzhiyun #define XkbSASetGroup(a,g) ((a)->group_XXX=(g)) 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun typedef struct _XkbISOAction { 148*4882a593Smuzhiyun unsigned char type; 149*4882a593Smuzhiyun unsigned char flags; 150*4882a593Smuzhiyun unsigned char mask; 151*4882a593Smuzhiyun unsigned char real_mods; 152*4882a593Smuzhiyun /* FIXME: Make this an int. */ 153*4882a593Smuzhiyun char group_XXX; 154*4882a593Smuzhiyun unsigned char affect; 155*4882a593Smuzhiyun unsigned char vmods1; 156*4882a593Smuzhiyun unsigned char vmods2; 157*4882a593Smuzhiyun } XkbISOAction; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun typedef struct _XkbPtrAction { 160*4882a593Smuzhiyun unsigned char type; 161*4882a593Smuzhiyun unsigned char flags; 162*4882a593Smuzhiyun /* FIXME: Make this an int. */ 163*4882a593Smuzhiyun unsigned char high_XXX; 164*4882a593Smuzhiyun unsigned char low_XXX; 165*4882a593Smuzhiyun unsigned char high_YYY; 166*4882a593Smuzhiyun unsigned char low_YYY; 167*4882a593Smuzhiyun } XkbPtrAction; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #define XkbPtrActionX(a) (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX)) 170*4882a593Smuzhiyun #define XkbPtrActionY(a) (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY)) 171*4882a593Smuzhiyun #define XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX)) 172*4882a593Smuzhiyun #define XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY)) 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun typedef struct _XkbPtrBtnAction { 175*4882a593Smuzhiyun unsigned char type; 176*4882a593Smuzhiyun unsigned char flags; 177*4882a593Smuzhiyun unsigned char count; 178*4882a593Smuzhiyun unsigned char button; 179*4882a593Smuzhiyun } XkbPtrBtnAction; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun typedef struct _XkbPtrDfltAction { 182*4882a593Smuzhiyun unsigned char type; 183*4882a593Smuzhiyun unsigned char flags; 184*4882a593Smuzhiyun unsigned char affect; 185*4882a593Smuzhiyun char valueXXX; 186*4882a593Smuzhiyun } XkbPtrDfltAction; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun #define XkbSAPtrDfltValue(a) (XkbCharToInt((a)->valueXXX)) 189*4882a593Smuzhiyun #define XkbSASetPtrDfltValue(a, c) ((a)->valueXXX = (c) & 0xff) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun typedef struct _XkbSwitchScreenAction { 192*4882a593Smuzhiyun unsigned char type; 193*4882a593Smuzhiyun unsigned char flags; 194*4882a593Smuzhiyun char screenXXX; 195*4882a593Smuzhiyun } XkbSwitchScreenAction; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #define XkbSAScreen(a) (XkbCharToInt((a)->screenXXX)) 198*4882a593Smuzhiyun #define XkbSASetScreen(a, s) ((a)->screenXXX = (s) & 0xff) 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun typedef struct _XkbCtrlsAction { 201*4882a593Smuzhiyun unsigned char type; 202*4882a593Smuzhiyun unsigned char flags; 203*4882a593Smuzhiyun /* FIXME: Make this an int. */ 204*4882a593Smuzhiyun unsigned char ctrls3; 205*4882a593Smuzhiyun unsigned char ctrls2; 206*4882a593Smuzhiyun unsigned char ctrls1; 207*4882a593Smuzhiyun unsigned char ctrls0; 208*4882a593Smuzhiyun } XkbCtrlsAction; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #define XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \ 211*4882a593Smuzhiyun (a)->ctrls2 = ((c) >> 16) & 0xff, \ 212*4882a593Smuzhiyun (a)->ctrls1 = ((c) >> 8) & 0xff, \ 213*4882a593Smuzhiyun (a)->ctrls0 = (c) & 0xff) 214*4882a593Smuzhiyun #define XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\ 215*4882a593Smuzhiyun (((unsigned int)(a)->ctrls2)<<16)|\ 216*4882a593Smuzhiyun (((unsigned int)(a)->ctrls1)<<8)|\ 217*4882a593Smuzhiyun ((unsigned int) (a)->ctrls0)) 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun typedef struct _XkbMessageAction { 220*4882a593Smuzhiyun unsigned char type; 221*4882a593Smuzhiyun unsigned char flags; 222*4882a593Smuzhiyun unsigned char message[6]; 223*4882a593Smuzhiyun } XkbMessageAction; 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun typedef struct _XkbRedirectKeyAction { 226*4882a593Smuzhiyun unsigned char type; 227*4882a593Smuzhiyun unsigned char new_key; 228*4882a593Smuzhiyun unsigned char mods_mask; 229*4882a593Smuzhiyun unsigned char mods; 230*4882a593Smuzhiyun /* FIXME: Make this an int. */ 231*4882a593Smuzhiyun unsigned char vmods_mask0; 232*4882a593Smuzhiyun unsigned char vmods_mask1; 233*4882a593Smuzhiyun unsigned char vmods0; 234*4882a593Smuzhiyun unsigned char vmods1; 235*4882a593Smuzhiyun } XkbRedirectKeyAction; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun #define XkbSARedirectVMods(a) ((((unsigned int)(a)->vmods1)<<8)|\ 238*4882a593Smuzhiyun ((unsigned int)(a)->vmods0)) 239*4882a593Smuzhiyun /* FIXME: This is blatantly not setting vmods. Yeesh. */ 240*4882a593Smuzhiyun #define XkbSARedirectSetVMods(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\ 241*4882a593Smuzhiyun ((a)->vmods_mask0=((m)&0xff))) 242*4882a593Smuzhiyun #define XkbSARedirectVModsMask(a) ((((unsigned int)(a)->vmods_mask1)<<8)|\ 243*4882a593Smuzhiyun ((unsigned int)(a)->vmods_mask0)) 244*4882a593Smuzhiyun #define XkbSARedirectSetVModsMask(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\ 245*4882a593Smuzhiyun ((a)->vmods_mask0=((m)&0xff))) 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun typedef struct _XkbDeviceBtnAction { 248*4882a593Smuzhiyun unsigned char type; 249*4882a593Smuzhiyun unsigned char flags; 250*4882a593Smuzhiyun unsigned char count; 251*4882a593Smuzhiyun unsigned char button; 252*4882a593Smuzhiyun unsigned char device; 253*4882a593Smuzhiyun } XkbDeviceBtnAction; 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun typedef struct _XkbDeviceValuatorAction { 256*4882a593Smuzhiyun unsigned char type; 257*4882a593Smuzhiyun unsigned char device; 258*4882a593Smuzhiyun unsigned char v1_what; 259*4882a593Smuzhiyun unsigned char v1_ndx; 260*4882a593Smuzhiyun unsigned char v1_value; 261*4882a593Smuzhiyun unsigned char v2_what; 262*4882a593Smuzhiyun unsigned char v2_ndx; 263*4882a593Smuzhiyun unsigned char v2_value; 264*4882a593Smuzhiyun } XkbDeviceValuatorAction; 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun typedef union _XkbAction { 267*4882a593Smuzhiyun XkbAnyAction any; 268*4882a593Smuzhiyun XkbModAction mods; 269*4882a593Smuzhiyun XkbGroupAction group; 270*4882a593Smuzhiyun XkbISOAction iso; 271*4882a593Smuzhiyun XkbPtrAction ptr; 272*4882a593Smuzhiyun XkbPtrBtnAction btn; 273*4882a593Smuzhiyun XkbPtrDfltAction dflt; 274*4882a593Smuzhiyun XkbSwitchScreenAction screen; 275*4882a593Smuzhiyun XkbCtrlsAction ctrls; 276*4882a593Smuzhiyun XkbMessageAction msg; 277*4882a593Smuzhiyun XkbRedirectKeyAction redirect; 278*4882a593Smuzhiyun XkbDeviceBtnAction devbtn; 279*4882a593Smuzhiyun XkbDeviceValuatorAction devval; 280*4882a593Smuzhiyun unsigned char type; 281*4882a593Smuzhiyun } XkbAction; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun typedef struct _XkbControls { 284*4882a593Smuzhiyun unsigned char mk_dflt_btn; 285*4882a593Smuzhiyun unsigned char num_groups; 286*4882a593Smuzhiyun unsigned char groups_wrap; 287*4882a593Smuzhiyun XkbModsRec internal; 288*4882a593Smuzhiyun XkbModsRec ignore_lock; 289*4882a593Smuzhiyun unsigned int enabled_ctrls; 290*4882a593Smuzhiyun unsigned short repeat_delay; 291*4882a593Smuzhiyun unsigned short repeat_interval; 292*4882a593Smuzhiyun unsigned short slow_keys_delay; 293*4882a593Smuzhiyun unsigned short debounce_delay; 294*4882a593Smuzhiyun unsigned short mk_delay; 295*4882a593Smuzhiyun unsigned short mk_interval; 296*4882a593Smuzhiyun unsigned short mk_time_to_max; 297*4882a593Smuzhiyun unsigned short mk_max_speed; 298*4882a593Smuzhiyun short mk_curve; 299*4882a593Smuzhiyun unsigned short ax_options; 300*4882a593Smuzhiyun unsigned short ax_timeout; 301*4882a593Smuzhiyun unsigned short axt_opts_mask; 302*4882a593Smuzhiyun unsigned short axt_opts_values; 303*4882a593Smuzhiyun unsigned int axt_ctrls_mask; 304*4882a593Smuzhiyun unsigned int axt_ctrls_values; 305*4882a593Smuzhiyun unsigned char per_key_repeat[XkbPerKeyBitArraySize]; 306*4882a593Smuzhiyun } XkbControlsRec, *XkbControlsPtr; 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun #define XkbAX_AnyFeedback(c) ((c)->enabled_ctrls&XkbAccessXFeedbackMask) 309*4882a593Smuzhiyun #define XkbAX_NeedOption(c,w) ((c)->ax_options&(w)) 310*4882a593Smuzhiyun #define XkbAX_NeedFeedback(c, w) (XkbAX_AnyFeedback((c)) && \ 311*4882a593Smuzhiyun XkbAX_NeedOption((c), (w))) 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun typedef struct _XkbServerMapRec { 314*4882a593Smuzhiyun unsigned short num_acts; 315*4882a593Smuzhiyun unsigned short size_acts; 316*4882a593Smuzhiyun XkbAction *acts; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun XkbBehavior *behaviors; 319*4882a593Smuzhiyun unsigned short *key_acts; 320*4882a593Smuzhiyun #if defined(__cplusplus) || defined(c_plusplus) 321*4882a593Smuzhiyun /* explicit is a C++ reserved word */ 322*4882a593Smuzhiyun unsigned char *c_explicit; 323*4882a593Smuzhiyun #else 324*4882a593Smuzhiyun unsigned char *explicit; 325*4882a593Smuzhiyun #endif 326*4882a593Smuzhiyun unsigned char vmods[XkbNumVirtualMods]; 327*4882a593Smuzhiyun unsigned short *vmodmap; 328*4882a593Smuzhiyun } XkbServerMapRec, *XkbServerMapPtr; 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun #define XkbSMKeyActionsPtr(m, k) (&(m)->acts[(m)->key_acts[(k)]]) 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun /* 333*4882a593Smuzhiyun * Structures and access macros used primarily by clients 334*4882a593Smuzhiyun */ 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun typedef struct _XkbSymMapRec { 337*4882a593Smuzhiyun unsigned char kt_index[XkbNumKbdGroups]; 338*4882a593Smuzhiyun unsigned char group_info; 339*4882a593Smuzhiyun unsigned char width; 340*4882a593Smuzhiyun unsigned short offset; 341*4882a593Smuzhiyun } XkbSymMapRec, *XkbSymMapPtr; 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun typedef struct _XkbClientMapRec { 344*4882a593Smuzhiyun unsigned char size_types; 345*4882a593Smuzhiyun unsigned char num_types; 346*4882a593Smuzhiyun XkbKeyTypePtr types; 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun unsigned short size_syms; 349*4882a593Smuzhiyun unsigned short num_syms; 350*4882a593Smuzhiyun KeySym *syms; 351*4882a593Smuzhiyun XkbSymMapPtr key_sym_map; 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun unsigned char *modmap; 354*4882a593Smuzhiyun } XkbClientMapRec, *XkbClientMapPtr; 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun #define XkbCMKeyGroupInfo(m, k) ((m)->key_sym_map[(k)].group_info) 357*4882a593Smuzhiyun #define XkbCMKeyNumGroups(m, k) (XkbNumGroups((m)->key_sym_map[(k)].group_info)) 358*4882a593Smuzhiyun #define XkbCMKeyGroupWidth(m, k, g) (XkbCMKeyType((m), (k), (g))->num_levels) 359*4882a593Smuzhiyun #define XkbCMKeyGroupsWidth(m, k) ((m)->key_sym_map[(k)].width) 360*4882a593Smuzhiyun #define XkbCMKeyTypeIndex(m, k, g) ((m)->key_sym_map[(k)].kt_index[(g) & 0x3]) 361*4882a593Smuzhiyun #define XkbCMKeyType(m, k, g) (&(m)->types[XkbCMKeyTypeIndex((m), (k), (g))]) 362*4882a593Smuzhiyun #define XkbCMKeyNumSyms(m, k) (XkbCMKeyGroupsWidth((m), (k)) * \ 363*4882a593Smuzhiyun XkbCMKeyNumGroups((m), (k))) 364*4882a593Smuzhiyun #define XkbCMKeySymsOffset(m, k) ((m)->key_sym_map[(k)].offset) 365*4882a593Smuzhiyun #define XkbCMKeySymsPtr(m, k) (&(m)->syms[XkbCMKeySymsOffset((m), (k))]) 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun /* 368*4882a593Smuzhiyun * Compatibility structures and access macros 369*4882a593Smuzhiyun */ 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun typedef struct _XkbSymInterpretRec { 372*4882a593Smuzhiyun KeySym sym; 373*4882a593Smuzhiyun unsigned char flags; 374*4882a593Smuzhiyun unsigned char match; 375*4882a593Smuzhiyun unsigned char mods; 376*4882a593Smuzhiyun unsigned char virtual_mod; 377*4882a593Smuzhiyun XkbAnyAction act; 378*4882a593Smuzhiyun } XkbSymInterpretRec, *XkbSymInterpretPtr; 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun typedef struct _XkbCompatMapRec { 381*4882a593Smuzhiyun XkbSymInterpretPtr sym_interpret; 382*4882a593Smuzhiyun XkbModsRec groups[XkbNumKbdGroups]; 383*4882a593Smuzhiyun unsigned short num_si; 384*4882a593Smuzhiyun unsigned short size_si; 385*4882a593Smuzhiyun } XkbCompatMapRec, *XkbCompatMapPtr; 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun typedef struct _XkbIndicatorMapRec { 388*4882a593Smuzhiyun unsigned char flags; 389*4882a593Smuzhiyun /* FIXME: For some reason, interepretation of groups is wildly 390*4882a593Smuzhiyun * different between which being base/latched/locked. */ 391*4882a593Smuzhiyun unsigned char which_groups; 392*4882a593Smuzhiyun unsigned char groups; 393*4882a593Smuzhiyun unsigned char which_mods; 394*4882a593Smuzhiyun XkbModsRec mods; 395*4882a593Smuzhiyun unsigned int ctrls; 396*4882a593Smuzhiyun } XkbIndicatorMapRec, *XkbIndicatorMapPtr; 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun #define XkbIM_IsAuto(i) (!((i)->flags & XkbIM_NoAutomatic) && \ 399*4882a593Smuzhiyun (((i)->which_groups&&(i)->groups)||\ 400*4882a593Smuzhiyun ((i)->which_mods&&(i)->mods.mask)||\ 401*4882a593Smuzhiyun (i)->ctrls)) 402*4882a593Smuzhiyun #define XkbIM_InUse(i) ((i)->flags || (i)->which_groups || (i)->which_mods || \ 403*4882a593Smuzhiyun (i)->ctrls) 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun typedef struct _XkbIndicatorRec { 406*4882a593Smuzhiyun unsigned long phys_indicators; 407*4882a593Smuzhiyun XkbIndicatorMapRec maps[XkbNumIndicators]; 408*4882a593Smuzhiyun } XkbIndicatorRec, *XkbIndicatorPtr; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun typedef struct _XkbKeyNameRec { 411*4882a593Smuzhiyun char name[XkbKeyNameLength]; 412*4882a593Smuzhiyun } XkbKeyNameRec, *XkbKeyNamePtr; 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun typedef struct _XkbKeyAliasRec { 415*4882a593Smuzhiyun char real[XkbKeyNameLength]; 416*4882a593Smuzhiyun char alias[XkbKeyNameLength]; 417*4882a593Smuzhiyun } XkbKeyAliasRec, *XkbKeyAliasPtr; 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun /* 420*4882a593Smuzhiyun * Names for everything 421*4882a593Smuzhiyun */ 422*4882a593Smuzhiyun typedef struct _XkbNamesRec { 423*4882a593Smuzhiyun Atom keycodes; 424*4882a593Smuzhiyun Atom geometry; 425*4882a593Smuzhiyun Atom symbols; 426*4882a593Smuzhiyun Atom types; 427*4882a593Smuzhiyun Atom compat; 428*4882a593Smuzhiyun Atom vmods[XkbNumVirtualMods]; 429*4882a593Smuzhiyun Atom indicators[XkbNumIndicators]; 430*4882a593Smuzhiyun Atom groups[XkbNumKbdGroups]; 431*4882a593Smuzhiyun XkbKeyNamePtr keys; 432*4882a593Smuzhiyun XkbKeyAliasPtr key_aliases; 433*4882a593Smuzhiyun Atom *radio_groups; 434*4882a593Smuzhiyun Atom phys_symbols; 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun unsigned char num_keys; 437*4882a593Smuzhiyun unsigned char num_key_aliases; 438*4882a593Smuzhiyun unsigned short num_rg; 439*4882a593Smuzhiyun } XkbNamesRec, *XkbNamesPtr; 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun typedef struct _XkbGeometry *XkbGeometryPtr; 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun /* 444*4882a593Smuzhiyun * Tie it all together into one big keyboard description 445*4882a593Smuzhiyun */ 446*4882a593Smuzhiyun typedef struct _XkbDesc { 447*4882a593Smuzhiyun unsigned int defined; 448*4882a593Smuzhiyun unsigned short flags; 449*4882a593Smuzhiyun unsigned short device_spec; 450*4882a593Smuzhiyun KeyCode min_key_code; 451*4882a593Smuzhiyun KeyCode max_key_code; 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun XkbControlsPtr ctrls; 454*4882a593Smuzhiyun XkbServerMapPtr server; 455*4882a593Smuzhiyun XkbClientMapPtr map; 456*4882a593Smuzhiyun XkbIndicatorPtr indicators; 457*4882a593Smuzhiyun XkbNamesPtr names; 458*4882a593Smuzhiyun XkbCompatMapPtr compat; 459*4882a593Smuzhiyun XkbGeometryPtr geom; 460*4882a593Smuzhiyun } XkbDescRec, *XkbDescPtr; 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun #define XkbKeyKeyTypeIndex(d, k, g) (XkbCMKeyTypeIndex((d)->map, (k), (g))) 463*4882a593Smuzhiyun #define XkbKeyKeyType(d, k, g) (XkbCMKeyType((d)->map, (k), (g))) 464*4882a593Smuzhiyun #define XkbKeyGroupWidth(d, k, g) (XkbCMKeyGroupWidth((d)->map, (k), (g))) 465*4882a593Smuzhiyun #define XkbKeyGroupsWidth(d, k) (XkbCMKeyGroupsWidth((d)->map, (k))) 466*4882a593Smuzhiyun #define XkbKeyGroupInfo(d,k) (XkbCMKeyGroupInfo((d)->map,(k))) 467*4882a593Smuzhiyun #define XkbKeyNumGroups(d,k) (XkbCMKeyNumGroups((d)->map,(k))) 468*4882a593Smuzhiyun #define XkbKeyNumSyms(d,k) (XkbCMKeyNumSyms((d)->map,(k))) 469*4882a593Smuzhiyun #define XkbKeySymsPtr(d,k) (XkbCMKeySymsPtr((d)->map,(k))) 470*4882a593Smuzhiyun #define XkbKeySym(d, k, n) (XkbKeySymsPtr((d), (k))[(n)]) 471*4882a593Smuzhiyun #define XkbKeySymEntry(d,k,sl,g) \ 472*4882a593Smuzhiyun (XkbKeySym((d), (k), (XkbKeyGroupsWidth((d), (k)) * (g)) + (sl))) 473*4882a593Smuzhiyun #define XkbKeyAction(d,k,n) \ 474*4882a593Smuzhiyun (XkbKeyHasActions((d), (k)) ? & XkbKeyActionsPtr((d), (k))[(n)] : NULL) 475*4882a593Smuzhiyun #define XkbKeyActionEntry(d,k,sl,g) \ 476*4882a593Smuzhiyun (XkbKeyHasActions((d), (k)) ? \ 477*4882a593Smuzhiyun XkbKeyAction((d), (k), ((XkbKeyGroupsWidth((d), (k)) * (g)) + (sl))) : \ 478*4882a593Smuzhiyun NULL) 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun #define XkbKeyHasActions(d, k) (!!(d)->server->key_acts[(k)]) 481*4882a593Smuzhiyun #define XkbKeyNumActions(d, k) (XkbKeyHasActions((d), (k)) ? \ 482*4882a593Smuzhiyun XkbKeyNumSyms((d), (k)) : 1) 483*4882a593Smuzhiyun #define XkbKeyActionsPtr(d, k) (XkbSMKeyActionsPtr((d)->server, (k))) 484*4882a593Smuzhiyun #define XkbKeycodeInRange(d, k) ((k) >= (d)->min_key_code && \ 485*4882a593Smuzhiyun (k) <= (d)->max_key_code) 486*4882a593Smuzhiyun #define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1) 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun /* 489*4882a593Smuzhiyun * The following structures can be used to track changes 490*4882a593Smuzhiyun * to a keyboard device 491*4882a593Smuzhiyun */ 492*4882a593Smuzhiyun typedef struct _XkbMapChanges { 493*4882a593Smuzhiyun unsigned short changed; 494*4882a593Smuzhiyun KeyCode min_key_code; 495*4882a593Smuzhiyun KeyCode max_key_code; 496*4882a593Smuzhiyun unsigned char first_type; 497*4882a593Smuzhiyun unsigned char num_types; 498*4882a593Smuzhiyun KeyCode first_key_sym; 499*4882a593Smuzhiyun unsigned char num_key_syms; 500*4882a593Smuzhiyun KeyCode first_key_act; 501*4882a593Smuzhiyun unsigned char num_key_acts; 502*4882a593Smuzhiyun KeyCode first_key_behavior; 503*4882a593Smuzhiyun unsigned char num_key_behaviors; 504*4882a593Smuzhiyun KeyCode first_key_explicit; 505*4882a593Smuzhiyun unsigned char num_key_explicit; 506*4882a593Smuzhiyun KeyCode first_modmap_key; 507*4882a593Smuzhiyun unsigned char num_modmap_keys; 508*4882a593Smuzhiyun KeyCode first_vmodmap_key; 509*4882a593Smuzhiyun unsigned char num_vmodmap_keys; 510*4882a593Smuzhiyun unsigned char pad; 511*4882a593Smuzhiyun unsigned short vmods; 512*4882a593Smuzhiyun } XkbMapChangesRec, *XkbMapChangesPtr; 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun typedef struct _XkbControlsChanges { 515*4882a593Smuzhiyun unsigned int changed_ctrls; 516*4882a593Smuzhiyun unsigned int enabled_ctrls_changes; 517*4882a593Smuzhiyun Bool num_groups_changed; 518*4882a593Smuzhiyun } XkbControlsChangesRec, *XkbControlsChangesPtr; 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun typedef struct _XkbIndicatorChanges { 521*4882a593Smuzhiyun unsigned int state_changes; 522*4882a593Smuzhiyun unsigned int map_changes; 523*4882a593Smuzhiyun } XkbIndicatorChangesRec, *XkbIndicatorChangesPtr; 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun typedef struct _XkbNameChanges { 526*4882a593Smuzhiyun unsigned int changed; 527*4882a593Smuzhiyun unsigned char first_type; 528*4882a593Smuzhiyun unsigned char num_types; 529*4882a593Smuzhiyun unsigned char first_lvl; 530*4882a593Smuzhiyun unsigned char num_lvls; 531*4882a593Smuzhiyun unsigned char num_aliases; 532*4882a593Smuzhiyun unsigned char num_rg; 533*4882a593Smuzhiyun unsigned char first_key; 534*4882a593Smuzhiyun unsigned char num_keys; 535*4882a593Smuzhiyun unsigned short changed_vmods; 536*4882a593Smuzhiyun unsigned long changed_indicators; 537*4882a593Smuzhiyun unsigned char changed_groups; 538*4882a593Smuzhiyun } XkbNameChangesRec, *XkbNameChangesPtr; 539*4882a593Smuzhiyun 540*4882a593Smuzhiyun typedef struct _XkbCompatChanges { 541*4882a593Smuzhiyun unsigned char changed_groups; 542*4882a593Smuzhiyun unsigned short first_si; 543*4882a593Smuzhiyun unsigned short num_si; 544*4882a593Smuzhiyun } XkbCompatChangesRec, *XkbCompatChangesPtr; 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun typedef struct _XkbChanges { 547*4882a593Smuzhiyun unsigned short device_spec; 548*4882a593Smuzhiyun unsigned short state_changes; 549*4882a593Smuzhiyun XkbMapChangesRec map; 550*4882a593Smuzhiyun XkbControlsChangesRec ctrls; 551*4882a593Smuzhiyun XkbIndicatorChangesRec indicators; 552*4882a593Smuzhiyun XkbNameChangesRec names; 553*4882a593Smuzhiyun XkbCompatChangesRec compat; 554*4882a593Smuzhiyun } XkbChangesRec, *XkbChangesPtr; 555*4882a593Smuzhiyun 556*4882a593Smuzhiyun /* 557*4882a593Smuzhiyun * These data structures are used to construct a keymap from 558*4882a593Smuzhiyun * a set of components or to list components in the server 559*4882a593Smuzhiyun * database. 560*4882a593Smuzhiyun */ 561*4882a593Smuzhiyun typedef struct _XkbComponentNames { 562*4882a593Smuzhiyun char *keycodes; 563*4882a593Smuzhiyun char *types; 564*4882a593Smuzhiyun char *compat; 565*4882a593Smuzhiyun char *symbols; 566*4882a593Smuzhiyun char *geometry; 567*4882a593Smuzhiyun } XkbComponentNamesRec, *XkbComponentNamesPtr; 568*4882a593Smuzhiyun 569*4882a593Smuzhiyun typedef struct _XkbComponentName { 570*4882a593Smuzhiyun unsigned short flags; 571*4882a593Smuzhiyun char *name; 572*4882a593Smuzhiyun } XkbComponentNameRec, *XkbComponentNamePtr; 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun typedef struct _XkbComponentList { 575*4882a593Smuzhiyun int num_keymaps; 576*4882a593Smuzhiyun int num_keycodes; 577*4882a593Smuzhiyun int num_types; 578*4882a593Smuzhiyun int num_compat; 579*4882a593Smuzhiyun int num_symbols; 580*4882a593Smuzhiyun int num_geometry; 581*4882a593Smuzhiyun XkbComponentNamePtr keymaps; 582*4882a593Smuzhiyun XkbComponentNamePtr keycodes; 583*4882a593Smuzhiyun XkbComponentNamePtr types; 584*4882a593Smuzhiyun XkbComponentNamePtr compat; 585*4882a593Smuzhiyun XkbComponentNamePtr symbols; 586*4882a593Smuzhiyun XkbComponentNamePtr geometry; 587*4882a593Smuzhiyun } XkbComponentListRec, *XkbComponentListPtr; 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun /* 590*4882a593Smuzhiyun * The following data structures describe and track changes to a 591*4882a593Smuzhiyun * non-keyboard extension device 592*4882a593Smuzhiyun */ 593*4882a593Smuzhiyun typedef struct _XkbDeviceLedInfo { 594*4882a593Smuzhiyun unsigned short led_class; 595*4882a593Smuzhiyun unsigned short led_id; 596*4882a593Smuzhiyun unsigned int phys_indicators; 597*4882a593Smuzhiyun unsigned int maps_present; 598*4882a593Smuzhiyun unsigned int names_present; 599*4882a593Smuzhiyun unsigned int state; 600*4882a593Smuzhiyun Atom names[XkbNumIndicators]; 601*4882a593Smuzhiyun XkbIndicatorMapRec maps[XkbNumIndicators]; 602*4882a593Smuzhiyun } XkbDeviceLedInfoRec, *XkbDeviceLedInfoPtr; 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun typedef struct _XkbDeviceInfo { 605*4882a593Smuzhiyun char *name; 606*4882a593Smuzhiyun Atom type; 607*4882a593Smuzhiyun unsigned short device_spec; 608*4882a593Smuzhiyun Bool has_own_state; 609*4882a593Smuzhiyun unsigned short supported; 610*4882a593Smuzhiyun unsigned short unsupported; 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun unsigned short num_btns; 613*4882a593Smuzhiyun XkbAction *btn_acts; 614*4882a593Smuzhiyun 615*4882a593Smuzhiyun unsigned short sz_leds; 616*4882a593Smuzhiyun unsigned short num_leds; 617*4882a593Smuzhiyun unsigned short dflt_kbd_fb; 618*4882a593Smuzhiyun unsigned short dflt_led_fb; 619*4882a593Smuzhiyun XkbDeviceLedInfoPtr leds; 620*4882a593Smuzhiyun } XkbDeviceInfoRec, *XkbDeviceInfoPtr; 621*4882a593Smuzhiyun 622*4882a593Smuzhiyun #define XkbXI_DevHasBtnActs(d) ((d)->num_btns > 0 && (d)->btn_acts) 623*4882a593Smuzhiyun #define XkbXI_LegalDevBtn(d,b) (XkbXI_DevHasBtnActs(d) && (b) < (d)->num_btns) 624*4882a593Smuzhiyun #define XkbXI_DevHasLeds(d) ((d)->num_leds > 0 && (d)->leds) 625*4882a593Smuzhiyun 626*4882a593Smuzhiyun typedef struct _XkbDeviceLedChanges { 627*4882a593Smuzhiyun unsigned short led_class; 628*4882a593Smuzhiyun unsigned short led_id; 629*4882a593Smuzhiyun unsigned int defined; /* names or maps changed */ 630*4882a593Smuzhiyun struct _XkbDeviceLedChanges *next; 631*4882a593Smuzhiyun } XkbDeviceLedChangesRec, *XkbDeviceLedChangesPtr; 632*4882a593Smuzhiyun 633*4882a593Smuzhiyun typedef struct _XkbDeviceChanges { 634*4882a593Smuzhiyun unsigned int changed; 635*4882a593Smuzhiyun unsigned short first_btn; 636*4882a593Smuzhiyun unsigned short num_btns; 637*4882a593Smuzhiyun XkbDeviceLedChangesRec leds; 638*4882a593Smuzhiyun } XkbDeviceChangesRec, *XkbDeviceChangesPtr; 639*4882a593Smuzhiyun 640*4882a593Smuzhiyun #endif /* _XKBSTR_H_ */ 641