-- X11/XKBlib.h, X11/extensions/XKB.h, X11/extensions/XKBstr.h local ffi = require'ffi' local X = require'xlib_h' ffi.cdef[[ // /usr/include/X11/extensions/XKB.h enum { X_kbUseExtension = 0, X_kbSelectEvents = 1, X_kbBell = 3, X_kbGetState = 4, X_kbLatchLockState = 5, X_kbGetControls = 6, X_kbSetControls = 7, X_kbGetMap = 8, X_kbSetMap = 9, X_kbGetCompatMap = 10, X_kbSetCompatMap = 11, X_kbGetIndicatorState = 12, X_kbGetIndicatorMap = 13, X_kbSetIndicatorMap = 14, X_kbGetNamedIndicator = 15, X_kbSetNamedIndicator = 16, X_kbGetNames = 17, X_kbSetNames = 18, X_kbGetGeometry = 19, X_kbSetGeometry = 20, X_kbPerClientFlags = 21, X_kbListComponents = 22, X_kbGetKbdByName = 23, X_kbGetDeviceInfo = 24, X_kbSetDeviceInfo = 25, X_kbSetDebuggingFlags = 101, XkbEventCode = 0, XkbNumberEvents = (XkbEventCode+1), XkbNewKeyboardNotify = 0, XkbMapNotify = 1, XkbStateNotify = 2, XkbControlsNotify = 3, XkbIndicatorStateNotify = 4, XkbIndicatorMapNotify = 5, XkbNamesNotify = 6, XkbCompatMapNotify = 7, XkbBellNotify = 8, XkbActionMessage = 9, XkbAccessXNotify = 10, XkbExtensionDeviceNotify = 11, XkbNewKeyboardNotifyMask = (1 << 0), XkbMapNotifyMask = (1 << 1), XkbStateNotifyMask = (1 << 2), XkbControlsNotifyMask = (1 << 3), XkbIndicatorStateNotifyMask = (1 << 4), XkbIndicatorMapNotifyMask = (1 << 5), XkbNamesNotifyMask = (1 << 6), XkbCompatMapNotifyMask = (1 << 7), XkbBellNotifyMask = (1 << 8), XkbActionMessageMask = (1 << 9), XkbAccessXNotifyMask = (1 << 10), XkbExtensionDeviceNotifyMask = (1 << 11), XkbAllEventsMask = (0xFFF), XkbNKN_KeycodesMask = (1 << 0), XkbNKN_GeometryMask = (1 << 1), XkbNKN_DeviceIDMask = (1 << 2), XkbAllNewKeyboardEventsMask = (0x7), XkbAXN_SKPress = 0, XkbAXN_SKAccept = 1, XkbAXN_SKReject = 2, XkbAXN_SKRelease = 3, XkbAXN_BKAccept = 4, XkbAXN_BKReject = 5, XkbAXN_AXKWarning = 6, XkbAXN_SKPressMask = (1 << 0), XkbAXN_SKAcceptMask = (1 << 1), XkbAXN_SKRejectMask = (1 << 2), XkbAXN_SKReleaseMask = (1 << 3), XkbAXN_BKAcceptMask = (1 << 4), XkbAXN_BKRejectMask = (1 << 5), XkbAXN_AXKWarningMask = (1 << 6), XkbAllAccessXEventsMask = (0xf), XkbAllBellEventsMask = (1 << 0), XkbAllActionMessagesMask = (1 << 0), XkbKeyboard = 0, XkbNumberErrors = 1, XkbErr_BadDevice = 0xff, XkbErr_BadClass = 0xfe, XkbErr_BadId = 0xfd, XkbClientMapMask = (1 << 0), XkbServerMapMask = (1 << 1), XkbCompatMapMask = (1 << 2), XkbIndicatorMapMask = (1 << 3), XkbNamesMask = (1 << 4), XkbGeometryMask = (1 << 5), XkbControlsMask = (1 << 6), XkbAllComponentsMask = (0x7f), XkbModifierStateMask = (1 << 0), XkbModifierBaseMask = (1 << 1), XkbModifierLatchMask = (1 << 2), XkbModifierLockMask = (1 << 3), XkbGroupStateMask = (1 << 4), XkbGroupBaseMask = (1 << 5), XkbGroupLatchMask = (1 << 6), XkbGroupLockMask = (1 << 7), XkbCompatStateMask = (1 << 8), XkbGrabModsMask = (1 << 9), XkbCompatGrabModsMask = (1 << 10), XkbLookupModsMask = (1 << 11), XkbCompatLookupModsMask = (1 << 12), XkbPointerButtonMask = (1 << 13), XkbAllStateComponentsMask = (0x3fff), XkbRepeatKeysMask = (1 << 0), XkbSlowKeysMask = (1 << 1), XkbBounceKeysMask = (1 << 2), XkbStickyKeysMask = (1 << 3), XkbMouseKeysMask = (1 << 4), XkbMouseKeysAccelMask = (1 << 5), XkbAccessXKeysMask = (1 << 6), XkbAccessXTimeoutMask = (1 << 7), XkbAccessXFeedbackMask = (1 << 8), XkbAudibleBellMask = (1 << 9), XkbOverlay1Mask = (1 << 10), XkbOverlay2Mask = (1 << 11), XkbIgnoreGroupLockMask = (1 << 12), XkbGroupsWrapMask = (1 << 27), XkbInternalModsMask = (1 << 28), XkbIgnoreLockModsMask = (1 << 29), XkbPerKeyRepeatMask = (1 << 30), XkbControlsEnabledMask = (1 << 31), XkbAccessXOptionsMask = (XkbStickyKeysMask|XkbAccessXFeedbackMask), XkbAllBooleanCtrlsMask = (0x00001FFF), XkbAllControlsMask = (0xF8001FFF), XkbAX_SKPressFBMask = (1 << 0), XkbAX_SKAcceptFBMask = (1 << 1), XkbAX_FeatureFBMask = (1 << 2), XkbAX_SlowWarnFBMask = (1 << 3), XkbAX_IndicatorFBMask = (1 << 4), XkbAX_StickyKeysFBMask = (1 << 5), XkbAX_TwoKeysMask = (1 << 6), XkbAX_LatchToLockMask = (1 << 7), XkbAX_SKReleaseFBMask = (1 << 8), XkbAX_SKRejectFBMask = (1 << 9), XkbAX_BKRejectFBMask = (1 << 10), XkbAX_DumbBellFBMask = (1 << 11), XkbAX_FBOptionsMask = (0xF3F), XkbAX_SKOptionsMask = (0x0C0), XkbAX_AllOptionsMask = (0xFFF), XkbUseCoreKbd = 0x0100, XkbUseCorePtr = 0x0200, XkbDfltXIClass = 0x0300, XkbDfltXIId = 0x0400, XkbAllXIClasses = 0x0500, XkbAllXIIds = 0x0600, XkbXINone = 0xff00, XkbNoModifier = 0xff, XkbNoShiftLevel = 0xff, XkbNoShape = 0xff, XkbNoIndicator = 0xff, XkbNoModifierMask = 0, XkbAllModifiersMask = 0xff, XkbAllVirtualModsMask = 0xffff, XkbNumKbdGroups = 4, XkbMaxKbdGroup = (XkbNumKbdGroups-1), XkbMaxMouseKeysBtn = 4, XkbGroup1Index = 0, XkbGroup2Index = 1, XkbGroup3Index = 2, XkbGroup4Index = 3, XkbAnyGroup = 254, XkbAllGroups = 255, XkbGroup1Mask = (1<<0), XkbGroup2Mask = (1<<1), XkbGroup3Mask = (1<<2), XkbGroup4Mask = (1<<3), XkbAnyGroupMask = (1<<7), XkbAllGroupsMask = (0xf), XkbWrapIntoRange = (0x00), XkbClampIntoRange = (0x40), XkbRedirectIntoRange = (0x80), XkbSA_ClearLocks = (1 << 0), XkbSA_LatchToLock = (1 << 1), XkbSA_LockNoLock = (1 << 0), XkbSA_LockNoUnlock = (1 << 1), XkbSA_UseModMapMods = (1 << 2), XkbSA_GroupAbsolute = (1 << 2), XkbSA_UseDfltButton = 0, XkbSA_NoAcceleration = (1 << 0), XkbSA_MoveAbsoluteX = (1 << 1), XkbSA_MoveAbsoluteY = (1 << 2), XkbSA_ISODfltIsGroup = (1 << 7), XkbSA_ISONoAffectMods = (1 << 6), XkbSA_ISONoAffectGroup = (1 << 5), XkbSA_ISONoAffectPtr = (1 << 4), XkbSA_ISONoAffectCtrls = (1 << 3), XkbSA_ISOAffectMask = (0x78), XkbSA_MessageOnPress = (1 << 0), XkbSA_MessageOnRelease = (1 << 1), XkbSA_MessageGenKeyEvent = (1 << 2), XkbSA_AffectDfltBtn = 1, XkbSA_DfltBtnAbsolute = (1 << 2), XkbSA_SwitchApplication = (1 << 0), XkbSA_SwitchAbsolute = (1 << 2), XkbSA_IgnoreVal = (0x00), XkbSA_SetValMin = (0x10), XkbSA_SetValCenter = (0x20), XkbSA_SetValMax = (0x30), XkbSA_SetValRelative = (0x40), XkbSA_SetValAbsolute = (0x50), XkbSA_ValOpMask = (0x70), XkbSA_ValScaleMask = (0x07), XkbSA_NoAction = 0x00, XkbSA_SetMods = 0x01, XkbSA_LatchMods = 0x02, XkbSA_LockMods = 0x03, XkbSA_SetGroup = 0x04, XkbSA_LatchGroup = 0x05, XkbSA_LockGroup = 0x06, XkbSA_MovePtr = 0x07, XkbSA_PtrBtn = 0x08, XkbSA_LockPtrBtn = 0x09, XkbSA_SetPtrDflt = 0x0a, XkbSA_ISOLock = 0x0b, XkbSA_Terminate = 0x0c, XkbSA_SwitchScreen = 0x0d, XkbSA_SetControls = 0x0e, XkbSA_LockControls = 0x0f, XkbSA_ActionMessage = 0x10, XkbSA_RedirectKey = 0x11, XkbSA_DeviceBtn = 0x12, XkbSA_LockDeviceBtn = 0x13, XkbSA_DeviceValuator = 0x14, XkbSA_LastAction = XkbSA_DeviceValuator, XkbSA_NumActions = (XkbSA_LastAction+1), XkbSA_XFree86Private = 0x86, XkbSA_BreakLatch = ((1<>8)&0xff)),((l)=((i)&0xff)) end function Xkb2CharsToInt(h,l) return (short)(((h)<<8)|(l)) end function XkbModLocks(s) return (s).locked_mods end function XkbStateMods(s) return (s).base_mods|(s).latched_mods|XkbModLocks(s) end function XkbGroupLock(s) return (s).locked_group end function XkbStateGroup(s) return (s).base_group+(s).latched_group+XkbGroupLock(s) end function XkbStateFieldFromRec(s) return XkbBuildCoreState((s).lookup_mods,(s).group) end function XkbGrabStateFromRec(s) return XkbBuildCoreState((s).grab_mods,(s).group) end function XkbNoteIndicatorMapChanges(o,n,w) return (o).map_changes|=((n).map_changes&(w)) end function XkbNoteIndicatorStateChanges(o,n,w) return (o).state_changes|=((n).state_changes&(w)) end function XkbGetIndicatorMapChanges(d,x,c) return XkbGetIndicatorMap((d),(c).map_changes,x) end function XkbChangeIndicatorMaps(d,x,c) return XkbSetIndicatorMap((d),(c).map_changes,x) end function XkbGetControlsChanges(d,x,c) return XkbGetControls(d,(c).changed_ctrls,x) end function XkbChangeControls(d,x,c) return XkbSetControls(d,(c).changed_ctrls,x) end function XkbNumGroups(g) return (g)&0x0f end function XkbOutOfRangeGroupInfo(g) return (g)&0xf0 end function XkbOutOfRangeGroupAction(g) return (g)&0xc0 end function XkbOutOfRangeGroupNumber(g) return ((g)&0x30)>>4 end function XkbSetGroupInfo(g,w,n) return ((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f) end function XkbSetNumGroups(g,n) return ((g)&0xf0)|((n)&0x0f) end function XkbModActionVMods(a) return (short)(((a).vmods1<<8)|((a).vmods2)) end function XkbSetModActionVMods(a,v) return ((a).vmods1=(((v)>>8)&0xff)),(a).vmods2=((v)&0xff) end function XkbSAGroup(a) return XkbCharToInt((a).group_XXX) end function XkbSASetGroup(a,g) return (a).group_XXX=(g) end function XkbPtrActionX(a) return Xkb2CharsToInt((a).high_XXX,(a).low_XXX) end function XkbPtrActionY(a) return Xkb2CharsToInt((a).high_YYY,(a).low_YYY) end function XkbSetPtrActionX(a,x) return XkbIntTo2Chars(x,(a).high_XXX,(a).low_XXX) end function XkbSetPtrActionY(a,y) return XkbIntTo2Chars(y,(a).high_YYY,(a).low_YYY) end function XkbSAPtrDfltValue(a) return XkbCharToInt((a).valueXXX) end function XkbSASetPtrDfltValue(a,c) return (a).valueXXX= ((c)&0xff) end function XkbSAScreen(a) return XkbCharToInt((a).screenXXX) end function XkbSASetScreen(a,s) return (a).screenXXX= ((s)&0xff) end function XkbActionSetCtrls(a,c) return ((a).ctrls3=(((c)>>24)&0xff)), ((a).ctrls2=(((c)>>16)&0xff)), ((a).ctrls1=(((c)>>8)&0xff)), ((a).ctrls0=((c)&0xff)) end function XkbActionCtrls(a) return (((unsigned int)(a).ctrls3)<<24)| (((unsigned int)(a).ctrls2)<<16)| (((unsigned int)(a).ctrls1)<<8)| ((unsigned int)((a).ctrls0)) end function XkbSARedirectVMods(a) return (((unsigned int)(a).vmods1)<<8)| ((unsigned int)(a).vmods0) end function XkbSARedirectSetVMods(a,m) return ((a).vmods_mask1=(((m)>>8)&0xff)), ((a).vmods_mask0=((m)&0xff)) end function XkbSARedirectVModsMask(a) return (((unsigned int)(a).vmods_mask1)<<8)| ((unsigned int)(a).vmods_mask0) end function XkbSARedirectSetVModsMask(a,m) return ((a).vmods_mask1=(((m)>>8)&0xff)), ((a).vmods_mask0=((m)&0xff)) end function XkbAX_AnyFeedback(c) return (c).enabled_ctrls&XkbAccessXFeedbackMask end function XkbAX_NeedOption(c,w) return (c).ax_options&(w) end function XkbAX_NeedFeedback(c,w) return XkbAX_AnyFeedback(c)&&XkbAX_NeedOption(c,w) end function XkbSMKeyActionsPtr(m,k) return &(m).acts[(m).key_acts[k]] end function XkbCMKeyGroupInfo(m,k) return (m).key_sym_map[k].group_info end function XkbCMKeyNumGroups(m,k) return XkbNumGroups((m).key_sym_map[k].group_info) end function XkbCMKeyGroupWidth(m,k,g) return XkbCMKeyType(m,k,g).num_levels end function XkbCMKeyGroupsWidth(m,k) return (m).key_sym_map[k].width end function XkbCMKeyTypeIndex(m,k,g) return (m).key_sym_map[k].kt_index[g&0x3] end function XkbCMKeyType(m,k,g) return &(m).types[XkbCMKeyTypeIndex(m,k,g)] end function XkbCMKeyNumSyms(m,k) return XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k) end function XkbCMKeySymsOffset(m,k) return (m).key_sym_map[k].offset end function XkbCMKeySymsPtr(m,k) return &(m).syms[XkbCMKeySymsOffset(m,k)] end function XkbIM_IsAuto(i) return (((i).flags&XkbIM_NoAutomatic)==0)&& (((i).which_groups&&(i).groups)|| ((i).which_mods&&(i).mods.mask)|| ((i).ctrls)) end function XkbIM_InUse(i) return ((i).flags)||((i).which_groups)|| ((i).which_mods)||((i).ctrls) end function XkbKeyKeyTypeIndex(d,k,g) return XkbCMKeyTypeIndex((d).map,k,g) end function XkbKeyKeyType(d,k,g) return XkbCMKeyType((d).map,k,g) end function XkbKeyGroupWidth(d,k,g) return XkbCMKeyGroupWidth((d).map,k,g) end function XkbKeyGroupsWidth(d,k) return XkbCMKeyGroupsWidth((d).map,k) end function XkbKeyGroupInfo(d,k) return XkbCMKeyGroupInfo((d).map,(k)) end function XkbKeyNumGroups(d,k) return XkbCMKeyNumGroups((d).map,(k)) end function XkbKeyNumSyms(d,k) return XkbCMKeyNumSyms((d).map,(k)) end function XkbKeySymsPtr(d,k) return XkbCMKeySymsPtr((d).map,(k)) end function XkbKeySym(d,k,n) return XkbKeySymsPtr(d,k)[n] end function XkbKeySymEntry(d,k,sl,g) return XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))) end function XkbKeyAction(d,k,n) return XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL end function XkbKeyActionEntry(d,k,sl,g) return XkbKeyHasActions(d,k)? XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL end function XkbKeyHasActions(d,k) return (d).server.key_acts[k]!=0 end function XkbKeyNumActions(d,k) return XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1 end function XkbKeyActionsPtr(d,k) return XkbSMKeyActionsPtr((d).server,k) end function XkbKeycodeInRange(d,k) return ((k)>=(d).min_key_code)&& ((k)<=(d).max_key_code) end function XkbNumKeys(d) return (d).max_key_code-(d).min_key_code+1 end function XkbXI_DevHasBtnActs(d) return ((d).num_btns>0)&&((d).btn_acts!=NULL) end function XkbXI_LegalDevBtn(d,b) return XkbXI_DevHasBtnActs(d)&&((b)<(d).num_btns) end function XkbXI_DevHasLeds(d) return ((d).num_leds>0)&&((d).leds!=NULL) end function XkbLegalXILedClass(c) return ((c)==KbdFeedbackClass)|| ((c)==LedFeedbackClass)|| ((c)==XkbDfltXIClass)|| ((c)==XkbAllXIClasses) end function XkbLegalXIBellClass(c) return ((c)==KbdFeedbackClass)|| ((c)==BellFeedbackClass)|| ((c)==XkbDfltXIClass)|| ((c)==XkbAllXIClasses) end function XkbExplicitXIDevice(c) return ((c)&(~0xff))==0 end function XkbExplicitXIClass(c) return ((c)&(~0xff))==0 end function XkbExplicitXIId(c) return ((c)&(~0xff))==0 end function XkbSingleXIClass(c) return (((c)&(~0xff))==0)||((c)==XkbDfltXIClass) end function XkbSingleXIId(c) return (((c)&(~0xff))==0)||((c)==XkbDfltXIId) end function XkbBuildCoreState(m,g) return (((g)&0x3)<<13)|((m)&0xff) end function XkbGroupForCoreState(s) return ((s)>>13)&0x3 end function XkbIsLegalGroup(g) return ((g)>=0)&&((g)=Xkb_SASetMods)&&((a).type<=XkbSA_LockMods) end function XkbIsGroupAction(a) return ((a).type>=XkbSA_SetGroup)&&((a).type<=XkbSA_LockGroup) end function XkbIsPtrAction(a) return ((a).type>=XkbSA_MovePtr)&&((a).type<=XkbSA_SetPtrDflt) end function XkbIsLegalKeycode(k) return (k)>=XkbMinLegalKeyCode end function XkbShiftLevel(n) return (n)-1 end function XkbShiftLevelMask(n) return 1<<((n)-1) end XkbName = "XKEYBOARD" ]=] return X