Path: blob/master/thirdparty/linuxbsd_headers/X11/extensions/XKBstr.h
9905 views
/************************************************************1Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.23Permission to use, copy, modify, and distribute this4software and its documentation for any purpose and without5fee is hereby granted, provided that the above copyright6notice appear in all copies and that both that copyright7notice and this permission notice appear in supporting8documentation, and that the name of Silicon Graphics not be9used in advertising or publicity pertaining to distribution10of the software without specific prior written permission.11Silicon Graphics makes no representation about the suitability12of this software for any purpose. It is provided "as is"13without any express or implied warranty.1415SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS16SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY17AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON18GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL19DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,20DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE21OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH22THE USE OR PERFORMANCE OF THIS SOFTWARE.2324********************************************************/2526#ifndef _XKBSTR_H_27#define _XKBSTR_H_2829#include <X11/Xfuncproto.h>30#include <X11/extensions/XKB.h>3132#define XkbCharToInt(v) ((v)&0x80?(int)((v)|(~0xff)):(int)((v)&0x7f))33#define XkbIntTo2Chars(i,h,l) (((h)=((i>>8)&0xff)),((l)=((i)&0xff)))34#define Xkb2CharsToInt(h,l) ((short)(((h)<<8)|(l)))3536/*37* The Xkb structs are full of implicit padding to properly align members.38* We can't clean that up without breaking ABI, so tell clang not to bother39* complaining about it.40*/41#ifdef __clang__42#pragma clang diagnostic push43#pragma clang diagnostic ignored "-Wpadded"44#endif4546/*47* Common data structures and access macros48*/4950typedef struct _XkbStateRec {51unsigned char group;52unsigned char locked_group;53unsigned short base_group;54unsigned short latched_group;55unsigned char mods;56unsigned char base_mods;57unsigned char latched_mods;58unsigned char locked_mods;59unsigned char compat_state;60unsigned char grab_mods;61unsigned char compat_grab_mods;62unsigned char lookup_mods;63unsigned char compat_lookup_mods;64unsigned short ptr_buttons;65} XkbStateRec,*XkbStatePtr;66#define XkbModLocks(s) ((s)->locked_mods)67#define XkbStateMods(s) ((s)->base_mods|(s)->latched_mods|XkbModLocks(s))68#define XkbGroupLock(s) ((s)->locked_group)69#define XkbStateGroup(s) ((s)->base_group+(s)->latched_group+XkbGroupLock(s))70#define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group)71#define XkbGrabStateFromRec(s) XkbBuildCoreState((s)->grab_mods,(s)->group)7273typedef struct _XkbMods {74unsigned char mask; /* effective mods */75unsigned char real_mods;76unsigned short vmods;77} XkbModsRec,*XkbModsPtr;7879typedef struct _XkbKTMapEntry {80Bool active;81unsigned char level;82XkbModsRec mods;83} XkbKTMapEntryRec,*XkbKTMapEntryPtr;8485typedef struct _XkbKeyType {86XkbModsRec mods;87unsigned char num_levels;88unsigned char map_count;89/* map is an array of map_count XkbKTMapEntryRec structs */90XkbKTMapEntryPtr map;91/* preserve is an array of map_count XkbModsRec structs */92XkbModsPtr preserve;93Atom name;94/* level_names is an array of num_levels Atoms */95Atom * level_names;96} XkbKeyTypeRec, *XkbKeyTypePtr;9798#define XkbNumGroups(g) ((g)&0x0f)99#define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)100#define XkbOutOfRangeGroupAction(g) ((g)&0xc0)101#define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)102#define XkbSetGroupInfo(g,w,n) (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))103#define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))104105/*106* Structures and access macros used primarily by the server107*/108109typedef struct _XkbBehavior {110unsigned char type;111unsigned char data;112} XkbBehavior;113114#define XkbAnyActionDataSize 7115typedef struct _XkbAnyAction {116unsigned char type;117unsigned char data[XkbAnyActionDataSize];118} XkbAnyAction;119120typedef struct _XkbModAction {121unsigned char type;122unsigned char flags;123unsigned char mask;124unsigned char real_mods;125unsigned char vmods1;126unsigned char vmods2;127} XkbModAction;128#define XkbModActionVMods(a) \129((short)(((a)->vmods1<<8)|((a)->vmods2)))130#define XkbSetModActionVMods(a,v) \131(((a)->vmods1=(((v)>>8)&0xff)),(a)->vmods2=((v)&0xff))132133typedef struct _XkbGroupAction {134unsigned char type;135unsigned char flags;136char group_XXX;137} XkbGroupAction;138#define XkbSAGroup(a) (XkbCharToInt((a)->group_XXX))139#define XkbSASetGroup(a,g) ((a)->group_XXX=(g))140141typedef struct _XkbISOAction {142unsigned char type;143unsigned char flags;144unsigned char mask;145unsigned char real_mods;146char group_XXX;147unsigned char affect;148unsigned char vmods1;149unsigned char vmods2;150} XkbISOAction;151152typedef struct _XkbPtrAction {153unsigned char type;154unsigned char flags;155unsigned char high_XXX;156unsigned char low_XXX;157unsigned char high_YYY;158unsigned char low_YYY;159} XkbPtrAction;160#define XkbPtrActionX(a) (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))161#define XkbPtrActionY(a) (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))162#define XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))163#define XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))164165typedef struct _XkbPtrBtnAction {166unsigned char type;167unsigned char flags;168unsigned char count;169unsigned char button;170} XkbPtrBtnAction;171172typedef struct _XkbPtrDfltAction {173unsigned char type;174unsigned char flags;175unsigned char affect;176char valueXXX;177} XkbPtrDfltAction;178#define XkbSAPtrDfltValue(a) (XkbCharToInt((a)->valueXXX))179#define XkbSASetPtrDfltValue(a,c) ((a)->valueXXX= ((c)&0xff))180181typedef struct _XkbSwitchScreenAction {182unsigned char type;183unsigned char flags;184char screenXXX;185} XkbSwitchScreenAction;186#define XkbSAScreen(a) (XkbCharToInt((a)->screenXXX))187#define XkbSASetScreen(a,s) ((a)->screenXXX= ((s)&0xff))188189typedef struct _XkbCtrlsAction {190unsigned char type;191unsigned char flags;192unsigned char ctrls3;193unsigned char ctrls2;194unsigned char ctrls1;195unsigned char ctrls0;196} XkbCtrlsAction;197#define XkbActionSetCtrls(a,c) (((a)->ctrls3=(((c)>>24)&0xff)),\198((a)->ctrls2=(((c)>>16)&0xff)),\199((a)->ctrls1=(((c)>>8)&0xff)),\200((a)->ctrls0=((c)&0xff)))201#define XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\202(((unsigned int)(a)->ctrls2)<<16)|\203(((unsigned int)(a)->ctrls1)<<8)|\204((unsigned int)((a)->ctrls0)))205206typedef struct _XkbMessageAction {207unsigned char type;208unsigned char flags;209unsigned char message[6];210} XkbMessageAction;211212typedef struct _XkbRedirectKeyAction {213unsigned char type;214unsigned char new_key;215unsigned char mods_mask;216unsigned char mods;217unsigned char vmods_mask0;218unsigned char vmods_mask1;219unsigned char vmods0;220unsigned char vmods1;221} XkbRedirectKeyAction;222223#define XkbSARedirectVMods(a) ((((unsigned int)(a)->vmods1)<<8)|\224((unsigned int)(a)->vmods0))225#define XkbSARedirectSetVMods(a,m) (((a)->vmods1=(((m)>>8)&0xff)),\226((a)->vmods0=((m)&0xff)))227#define XkbSARedirectVModsMask(a) ((((unsigned int)(a)->vmods_mask1)<<8)|\228((unsigned int)(a)->vmods_mask0))229#define XkbSARedirectSetVModsMask(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\230((a)->vmods_mask0=((m)&0xff)))231232typedef struct _XkbDeviceBtnAction {233unsigned char type;234unsigned char flags;235unsigned char count;236unsigned char button;237unsigned char device;238} XkbDeviceBtnAction;239240typedef struct _XkbDeviceValuatorAction {241unsigned char type;242unsigned char device;243unsigned char v1_what;244unsigned char v1_ndx;245unsigned char v1_value;246unsigned char v2_what;247unsigned char v2_ndx;248unsigned char v2_value;249} XkbDeviceValuatorAction;250251typedef union _XkbAction {252XkbAnyAction any;253XkbModAction mods;254XkbGroupAction group;255XkbISOAction iso;256XkbPtrAction ptr;257XkbPtrBtnAction btn;258XkbPtrDfltAction dflt;259XkbSwitchScreenAction screen;260XkbCtrlsAction ctrls;261XkbMessageAction msg;262XkbRedirectKeyAction redirect;263XkbDeviceBtnAction devbtn;264XkbDeviceValuatorAction devval;265unsigned char type;266} XkbAction;267268typedef struct _XkbControls {269unsigned char mk_dflt_btn;270unsigned char num_groups;271unsigned char groups_wrap;272XkbModsRec internal;273XkbModsRec ignore_lock;274unsigned int enabled_ctrls;275unsigned short repeat_delay;276unsigned short repeat_interval;277unsigned short slow_keys_delay;278unsigned short debounce_delay;279unsigned short mk_delay;280unsigned short mk_interval;281unsigned short mk_time_to_max;282unsigned short mk_max_speed;283short mk_curve;284unsigned short ax_options;285unsigned short ax_timeout;286unsigned short axt_opts_mask;287unsigned short axt_opts_values;288unsigned int axt_ctrls_mask;289unsigned int axt_ctrls_values;290unsigned char per_key_repeat[XkbPerKeyBitArraySize];291} XkbControlsRec, *XkbControlsPtr;292293#define XkbAX_AnyFeedback(c) ((c)->enabled_ctrls&XkbAccessXFeedbackMask)294#define XkbAX_NeedOption(c,w) ((c)->ax_options&(w))295#define XkbAX_NeedFeedback(c,w) (XkbAX_AnyFeedback(c)&&XkbAX_NeedOption(c,w))296297typedef struct _XkbServerMapRec {298/* acts is an array of XkbActions structs, with size_acts entries299allocated, and num_acts entries used. */300unsigned short num_acts;301unsigned short size_acts;302XkbAction *acts;303304/* behaviors, key_acts, explicit, & vmodmap are all arrays with305(xkb->max_key_code + 1) entries allocated for each. */306XkbBehavior *behaviors;307unsigned short *key_acts;308#if defined(__cplusplus) || defined(c_plusplus)309/* explicit is a C++ reserved word */310unsigned char *c_explicit;311#else312unsigned char *explicit;313#endif314unsigned char vmods[XkbNumVirtualMods];315unsigned short *vmodmap;316} XkbServerMapRec, *XkbServerMapPtr;317318#define XkbSMKeyActionsPtr(m,k) (&(m)->acts[(m)->key_acts[k]])319320/*321* Structures and access macros used primarily by clients322*/323324typedef struct _XkbSymMapRec {325unsigned char kt_index[XkbNumKbdGroups];326unsigned char group_info;327unsigned char width;328unsigned short offset;329} XkbSymMapRec, *XkbSymMapPtr;330331typedef struct _XkbClientMapRec {332/* types is an array of XkbKeyTypeRec structs, with size_types entries333allocated, and num_types entries used. */334unsigned char size_types;335unsigned char num_types;336XkbKeyTypePtr types;337338/* syms is an array of size_syms KeySyms, in which num_syms are used */339unsigned short size_syms;340unsigned short num_syms;341KeySym *syms;342/* key_sym_map is an array of (max_key_code + 1) XkbSymMapRec structs */343XkbSymMapPtr key_sym_map;344345/* modmap is an array of (max_key_code + 1) unsigned chars */346unsigned char *modmap;347} XkbClientMapRec, *XkbClientMapPtr;348349#define XkbCMKeyGroupInfo(m,k) ((m)->key_sym_map[k].group_info)350#define XkbCMKeyNumGroups(m,k) (XkbNumGroups((m)->key_sym_map[k].group_info))351#define XkbCMKeyGroupWidth(m,k,g) (XkbCMKeyType(m,k,g)->num_levels)352#define XkbCMKeyGroupsWidth(m,k) ((m)->key_sym_map[k].width)353#define XkbCMKeyTypeIndex(m,k,g) ((m)->key_sym_map[k].kt_index[g&0x3])354#define XkbCMKeyType(m,k,g) (&(m)->types[XkbCMKeyTypeIndex(m,k,g)])355#define XkbCMKeyNumSyms(m,k) (XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k))356#define XkbCMKeySymsOffset(m,k) ((m)->key_sym_map[k].offset)357#define XkbCMKeySymsPtr(m,k) (&(m)->syms[XkbCMKeySymsOffset(m,k)])358359/*360* Compatibility structures and access macros361*/362363typedef struct _XkbSymInterpretRec {364KeySym sym;365unsigned char flags;366unsigned char match;367unsigned char mods;368unsigned char virtual_mod;369XkbAnyAction act;370} XkbSymInterpretRec,*XkbSymInterpretPtr;371372typedef struct _XkbCompatMapRec {373/* sym_interpret is an array of XkbSymInterpretRec structs,374in which size_si are allocated & num_si are used. */375XkbSymInterpretPtr sym_interpret;376XkbModsRec groups[XkbNumKbdGroups];377unsigned short num_si;378unsigned short size_si;379} XkbCompatMapRec, *XkbCompatMapPtr;380381typedef struct _XkbIndicatorMapRec {382unsigned char flags;383unsigned char which_groups;384unsigned char groups;385unsigned char which_mods;386XkbModsRec mods;387unsigned int ctrls;388} XkbIndicatorMapRec, *XkbIndicatorMapPtr;389390#define XkbIM_IsAuto(i) ((((i)->flags&XkbIM_NoAutomatic)==0)&&\391(((i)->which_groups&&(i)->groups)||\392((i)->which_mods&&(i)->mods.mask)||\393((i)->ctrls)))394#define XkbIM_InUse(i) (((i)->flags)||((i)->which_groups)||\395((i)->which_mods)||((i)->ctrls))396397398typedef struct _XkbIndicatorRec {399unsigned long phys_indicators;400XkbIndicatorMapRec maps[XkbNumIndicators];401} XkbIndicatorRec,*XkbIndicatorPtr;402403typedef struct _XkbKeyNameRec {404char name[XkbKeyNameLength] _X_NONSTRING;405} XkbKeyNameRec,*XkbKeyNamePtr;406407typedef struct _XkbKeyAliasRec {408char real[XkbKeyNameLength] _X_NONSTRING;409char alias[XkbKeyNameLength] _X_NONSTRING;410} XkbKeyAliasRec,*XkbKeyAliasPtr;411412/*413* Names for everything414*/415typedef struct _XkbNamesRec {416Atom keycodes;417Atom geometry;418Atom symbols;419Atom types;420Atom compat;421Atom vmods[XkbNumVirtualMods];422Atom indicators[XkbNumIndicators];423Atom groups[XkbNumKbdGroups];424/* keys is an array of (xkb->max_key_code + 1) XkbKeyNameRec entries */425XkbKeyNamePtr keys;426/* key_aliases is an array of num_key_aliases XkbKeyAliasRec entries */427XkbKeyAliasPtr key_aliases;428/* radio_groups is an array of num_rg Atoms */429Atom *radio_groups;430Atom phys_symbols;431432/* num_keys seems to be unused in libX11 */433unsigned char num_keys;434unsigned char num_key_aliases;435unsigned short num_rg;436} XkbNamesRec,*XkbNamesPtr;437438typedef struct _XkbGeometry *XkbGeometryPtr;439/*440* Tie it all together into one big keyboard description441*/442typedef struct _XkbDesc {443struct _XDisplay * dpy;444unsigned short flags;445unsigned short device_spec;446KeyCode min_key_code;447KeyCode max_key_code;448449XkbControlsPtr ctrls;450XkbServerMapPtr server;451XkbClientMapPtr map;452XkbIndicatorPtr indicators;453XkbNamesPtr names;454XkbCompatMapPtr compat;455XkbGeometryPtr geom;456} XkbDescRec, *XkbDescPtr;457#define XkbKeyKeyTypeIndex(d,k,g) (XkbCMKeyTypeIndex((d)->map,k,g))458#define XkbKeyKeyType(d,k,g) (XkbCMKeyType((d)->map,k,g))459#define XkbKeyGroupWidth(d,k,g) (XkbCMKeyGroupWidth((d)->map,k,g))460#define XkbKeyGroupsWidth(d,k) (XkbCMKeyGroupsWidth((d)->map,k))461#define XkbKeyGroupInfo(d,k) (XkbCMKeyGroupInfo((d)->map,(k)))462#define XkbKeyNumGroups(d,k) (XkbCMKeyNumGroups((d)->map,(k)))463#define XkbKeyNumSyms(d,k) (XkbCMKeyNumSyms((d)->map,(k)))464#define XkbKeySymsPtr(d,k) (XkbCMKeySymsPtr((d)->map,(k)))465#define XkbKeySym(d,k,n) (XkbKeySymsPtr(d,k)[n])466#define XkbKeySymEntry(d,k,sl,g) \467(XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))468#define XkbKeyAction(d,k,n) \469(XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)470#define XkbKeyActionEntry(d,k,sl,g) \471(XkbKeyHasActions(d,k)?\472XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)473474#define XkbKeyHasActions(d,k) ((d)->server->key_acts[k]!=0)475#define XkbKeyNumActions(d,k) (XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)476#define XkbKeyActionsPtr(d,k) (XkbSMKeyActionsPtr((d)->server,k))477#define XkbKeycodeInRange(d,k) (((k)>=(d)->min_key_code)&&\478((k)<=(d)->max_key_code))479#define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1)480481482/*483* The following structures can be used to track changes484* to a keyboard device485*/486typedef struct _XkbMapChanges {487unsigned short changed;488KeyCode min_key_code;489KeyCode max_key_code;490unsigned char first_type;491unsigned char num_types;492KeyCode first_key_sym;493unsigned char num_key_syms;494KeyCode first_key_act;495unsigned char num_key_acts;496KeyCode first_key_behavior;497unsigned char num_key_behaviors;498KeyCode first_key_explicit;499unsigned char num_key_explicit;500KeyCode first_modmap_key;501unsigned char num_modmap_keys;502KeyCode first_vmodmap_key;503unsigned char num_vmodmap_keys;504unsigned char pad;505unsigned short vmods;506} XkbMapChangesRec,*XkbMapChangesPtr;507508typedef struct _XkbControlsChanges {509unsigned int changed_ctrls;510unsigned int enabled_ctrls_changes;511Bool num_groups_changed;512} XkbControlsChangesRec,*XkbControlsChangesPtr;513514typedef struct _XkbIndicatorChanges {515unsigned int state_changes;516unsigned int map_changes;517} XkbIndicatorChangesRec,*XkbIndicatorChangesPtr;518519typedef struct _XkbNameChanges {520unsigned int changed;521unsigned char first_type;522unsigned char num_types;523unsigned char first_lvl;524unsigned char num_lvls;525unsigned char num_aliases;526unsigned char num_rg;527unsigned char first_key;528unsigned char num_keys;529unsigned short changed_vmods;530unsigned long changed_indicators;531unsigned char changed_groups;532} XkbNameChangesRec,*XkbNameChangesPtr;533534typedef struct _XkbCompatChanges {535unsigned char changed_groups;536unsigned short first_si;537unsigned short num_si;538} XkbCompatChangesRec,*XkbCompatChangesPtr;539540typedef struct _XkbChanges {541unsigned short device_spec;542unsigned short state_changes;543XkbMapChangesRec map;544XkbControlsChangesRec ctrls;545XkbIndicatorChangesRec indicators;546XkbNameChangesRec names;547XkbCompatChangesRec compat;548} XkbChangesRec, *XkbChangesPtr;549550/*551* These data structures are used to construct a keymap from552* a set of components or to list components in the server553* database.554*/555typedef struct _XkbComponentNames {556char * keymap;557char * keycodes;558char * types;559char * compat;560char * symbols;561char * geometry;562} XkbComponentNamesRec, *XkbComponentNamesPtr;563564typedef struct _XkbComponentName {565unsigned short flags;566char * name;567} XkbComponentNameRec,*XkbComponentNamePtr;568569typedef struct _XkbComponentList {570int num_keymaps;571int num_keycodes;572int num_types;573int num_compat;574int num_symbols;575int num_geometry;576XkbComponentNamePtr keymaps;577XkbComponentNamePtr keycodes;578XkbComponentNamePtr types;579XkbComponentNamePtr compat;580XkbComponentNamePtr symbols;581XkbComponentNamePtr geometry;582} XkbComponentListRec, *XkbComponentListPtr;583584/*585* The following data structures describe and track changes to a586* non-keyboard extension device587*/588typedef struct _XkbDeviceLedInfo {589unsigned short led_class;590unsigned short led_id;591unsigned int phys_indicators;592unsigned int maps_present;593unsigned int names_present;594unsigned int state;595Atom names[XkbNumIndicators];596XkbIndicatorMapRec maps[XkbNumIndicators];597} XkbDeviceLedInfoRec,*XkbDeviceLedInfoPtr;598599typedef struct _XkbDeviceInfo {600char * name;601Atom type;602unsigned short device_spec;603Bool has_own_state;604unsigned short supported;605unsigned short unsupported;606607/* btn_acts is an array of num_btn XkbAction entries */608unsigned short num_btns;609XkbAction * btn_acts;610611unsigned short sz_leds;612unsigned short num_leds;613unsigned short dflt_kbd_fb;614unsigned short dflt_led_fb;615/* leds is an array of XkbDeviceLedInfoRec in which616sz_leds entries are allocated and num_leds entries are used */617XkbDeviceLedInfoPtr leds;618} XkbDeviceInfoRec,*XkbDeviceInfoPtr;619620#define XkbXI_DevHasBtnActs(d) (((d)->num_btns>0)&&((d)->btn_acts!=NULL))621#define XkbXI_LegalDevBtn(d,b) (XkbXI_DevHasBtnActs(d)&&((b)<(d)->num_btns))622#define XkbXI_DevHasLeds(d) (((d)->num_leds>0)&&((d)->leds!=NULL))623624typedef struct _XkbDeviceLedChanges {625unsigned short led_class;626unsigned short led_id;627unsigned int defined; /* names or maps changed */628struct _XkbDeviceLedChanges *next;629} XkbDeviceLedChangesRec,*XkbDeviceLedChangesPtr;630631typedef struct _XkbDeviceChanges {632unsigned int changed;633unsigned short first_btn;634unsigned short num_btns;635XkbDeviceLedChangesRec leds;636} XkbDeviceChangesRec,*XkbDeviceChangesPtr;637638#ifdef __clang__639#pragma clang diagnostic pop640#endif641642#endif /* _XKBSTR_H_ */643644645