diff options
Diffstat (limited to 'specs/ch16.xml')
-rw-r--r-- | specs/ch16.xml | 9427 |
1 files changed, 9427 insertions, 0 deletions
diff --git a/specs/ch16.xml b/specs/ch16.xml new file mode 100644 index 0000000..6044843 --- /dev/null +++ b/specs/ch16.xml @@ -0,0 +1,9427 @@ + +<chapter id='XKB_Protocol_Requests'> +<title>XKB Protocol Requests</title> + +<para> +This document uses the syntactic conventions and common types defined by the +specification of the core X protocol with a number of additions, which are +detailed below. +</para> + +<sect1 id='Errors'> +<title>Errors</title> + +<para> +If a client attempts to use any other XKB request except <emphasis> +XkbUseExtension</emphasis> + before the extension is properly initialized, XKB reports an <emphasis> +Access</emphasis> + error and ignores the request. XKB is properly initialized once <emphasis> +XkbUseExtension</emphasis> + reports that the client has asked for a supported or compatible version of the +extension. +</para> + + +<sect2 id='Keyboard_Errors'> +<title>Keyboard Errors</title> + +<para> +In addition to all of the errors defined by the core protocol, the X Keyboard +Extension defines a single error, <emphasis> +Keyboard</emphasis> +, which indicates that some request specified an illegal device identifier or +an extension device that is not a member of an appropriate. Unless otherwise +noted, any request with an argument of type KB_DEVICESPEC can cause <emphasis> +Keyboard</emphasis> + errors if an illegal or inappropriate device is specified. +</para> + + +<para> +When the extension reports a Keyboard error, the most significant byte of the +<emphasis> +resource_id</emphasis> + is a further refinement of the error cause, as defined in the table below. The +least significant byte contains the device, class, or feedback id as indicated: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="always" ?> +<tgroup cols='4' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='2.0*'/> +<colspec colname='c2' colwidth='1.0*'/> +<colspec colname='c3' colwidth='3.0*'/> +<colspec colname='c4' colwidth='2.0*'/> +<thead> + <row rowsep='1'> + <entry>high-order byte</entry> + <entry>value</entry> + <entry>meaning</entry> + <entry>low-order byte</entry> + </row> +</thead> +<tbody> + <row> + <entry>XkbErr_BadDevice</entry> + <entry>0xff</entry> + <entry>device not found</entry> + <entry>device id</entry> + </row> + <row> + <entry>XkbErr_BadClass</entry> + <entry>0xfe</entry> + <entry>device found, but is the wrong class</entry> + <entry>class id</entry> + </row> + <row> + <entry>XkbErr_BadId</entry> + <entry>0xfd</entry> + <entry>device found, class ok, but device does not have a feedback with the +indicated id</entry> + <entry>feedback id</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +</sect2> +<sect2 id='Side_Effects_of_Errors'> +<title>Side-Effects of Errors</title> + +<para> +With the exception of <emphasis> +Alloc</emphasis> + or <emphasis> +Implementation</emphasis> + errors, which might result in an inconsistent internal state, no XKB request +that reports an error condition has any effect. Unless otherwise stated, +requests which update some aspect of the keyboard description will not apply +only part of a request — if part of a request fails, the whole thing is +ignored. +</para> + + +</sect2> +</sect1> +<sect1 id='Common_Types'> +<title>Common Types</title> + +<para> +The following types are used in the request and event definitions in subsequent +sections: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="auto" ?> +<tgroup cols='2' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='2.0*'/> +<thead> + <row rowsep='1'> + <entry>Name</entry> + <entry>Value</entry> + </row> +</thead> +<tbody> + <row> + <entry>LISTofITEMs</entry> + <entry> The type LISTofITEMs is special. It is similar to the +LISTofVALUE defined by the core protocol, but the elements of a LISTofITEMs are +not necessarily all the same size. The use of a BITMASK to indicate which +members are present is optional for a LISTofITEMs — it is possible for the +set of elements to be derived from one or more fields of the request.</entry> + </row> + <row> + <entry>KB_DEVICESPEC</entry> + <entry>8 bit unsigned integer, <emphasis> +UseCoreKbd, or UseCorePtr</emphasis> +</entry> + </row> + <row> + <entry>KB_LEDCLASSSPEC</entry> + <entry>{ <emphasis> +KbdFeedbackClass</emphasis> +, <emphasis> +LedFeedbackClass</emphasis> +, <emphasis> +DfltXIClass</emphasis> +, <emphasis> +AllXIClasses</emphasis> +, <emphasis> +XINone</emphasis> + }</entry> + </row> + <row> + <entry>KB_BELLCLASSSPEC</entry> + <entry>{ <emphasis> +KbdFeedbackClass</emphasis> +, <emphasis> +BellFeedbackClass</emphasis> +, <emphasis> +DfltXIClass</emphasis> +, <emphasis> +AllXIClasses</emphasis> + }</entry> + </row> + <row> + <entry>KB_IDSPEC</entry> + <entry>8 bit unsigned integer or <emphasis> +DfltXIId</emphasis> +</entry> + </row> + <row> + <entry>KB_VMODMASK</entry> + <entry> CARD16, each bit corresponds to a virtual modifier</entry> + </row> + <row> + <entry>KB_GROUPMASK</entry> + <entry>{ <emphasis> +Group1</emphasis> +, <emphasis> +Group2</emphasis> +, <emphasis> +Group3</emphasis> +, <emphasis> +Group4</emphasis> + }</entry> + </row> + <row> + <entry>KB_GROUPSWRAP</entry> + <entry>{ <emphasis> +WrapIntoRange</emphasis> +, <emphasis> +ClampIntoRange</emphasis> +, <emphasis> +RedirectIntoRange</emphasis> + }</entry> + </row> + <row> + <entry>KB_GROUPINFO</entry> + <entry>{ groupsWrap: KB_GROUPSWRAP +redirectGroup: 1…4, +numGroups: 1…4 }</entry> + </row> + <row> + <entry>KB_NKNDETAILSMASK</entry> + <entry>{ <emphasis> +NKN_Keycodes</emphasis> +, NKN_Geometry, <emphasis> +NKN_DeviceID</emphasis> + }</entry> + </row> + <row> + <entry>KB_STATEMASK</entry> + <entry> KEYBUTMASK or KB_GROUPMASK</entry> + </row> + <row> + <entry>KB_STATEPARTMASK</entry> + <entry>{ <emphasis> +ModifierState</emphasis> +, <emphasis> +ModifierBase</emphasis> +, <emphasis> +ModifierLatch</emphasis> +, <emphasis> +ModifierLock</emphasis> +, <emphasis> +GroupState</emphasis> +, <emphasis> +GroupBase</emphasis> +, <emphasis> +GroupLatch</emphasis> +, <emphasis> +GroupLock</emphasis> +, <emphasis> +CompatState</emphasis> +, <emphasis> +GrabMods</emphasis> +, <emphasis> +CompatGrabMods</emphasis> +, <emphasis> +LookupMods</emphasis> +, <emphasis> +CompatLookupMods</emphasis> +, <emphasis> +PointerButtons</emphasis> + }</entry> + </row> + <row> + <entry>KB_BOOLCTRLMASK</entry> + <entry>{ <emphasis> +RepeatKeys</emphasis> +, <emphasis> +SlowKeys</emphasis> +, <emphasis> +BounceKeys</emphasis> +, <emphasis> +StickyKeys</emphasis> +, <emphasis> +MouseKeys</emphasis> +, <emphasis> +MouseKeysAccel</emphasis> +, <emphasis> +AccessXKeys</emphasis> +, <emphasis> +AccessXTimeout</emphasis> +, <emphasis> +AccessXFeedback</emphasis> +, <emphasis> +AudibleBell</emphasis> +, <emphasis> +Overlay1</emphasis> +, <emphasis> +Overlay2</emphasis> +, <emphasis> +IgnoreGroupLock</emphasis> + }</entry> + </row> + <row> + <entry>KB_CONTROLSMASK</entry> + <entry>{ <emphasis> +GroupsWrap, InternalMods</emphasis> +, <emphasis> +IgnoreLockMods</emphasis> +, <emphasis> +PerKeyRepeat</emphasis> +, <emphasis> +ControlsEnabled</emphasis> + } or KB_BOOLCTRLMASK</entry> + </row> + <row> + <entry>KB_MAPPARTMASK</entry> + <entry>{ <emphasis> +KeyTypes</emphasis> +, <emphasis> +KeySyms</emphasis> +, <emphasis> +ModifierMap</emphasis> +, <emphasis> +ExplicitComponents</emphasis> +, <emphasis> +KeyActions</emphasis> +, <emphasis> +KeyBehaviors</emphasis> +, <emphasis> +VirtualMods</emphasis> +, <emphasis> +VirtualModMap</emphasis> +}</entry> + </row> + <row> + <entry>KB_CMDETAILMASK</entry> + <entry>{ <emphasis> +SymInterp</emphasis> +, <emphasis> +GroupCompat</emphasis> + }</entry> + </row> + <row> + <entry>KB_NAMEDETAILMASK</entry> + <entry>{ <emphasis> +KeycodesName</emphasis> +, <emphasis> +GeometryName</emphasis> +, <emphasis> +SymbolsName</emphasis> +, + <emphasis> +PhysSymbolsName</emphasis> +, <emphasis> +TypesName</emphasis> +, <emphasis> +CompatName</emphasis> +, <emphasis> +KeyTypeNames</emphasis> +, <emphasis> +KTLevelNames</emphasis> +, <emphasis> +IndicatorNames</emphasis> +, <emphasis> +KeyNames</emphasis> +, <emphasis> +KeyAliases</emphasis> +, <emphasis> +VirtualModNames</emphasis> +, <emphasis> +GroupNames</emphasis> +, <emphasis> +RGNames</emphasis> +}</entry> + </row> + <row> + <entry>KB_AXNDETAILMASK</entry> + <entry>{ <emphasis> +AXN_SKPress</emphasis> +, <emphasis> +AXN_SKAccept</emphasis> +, <emphasis> +AXN_SKReject</emphasis> +, <emphasis> +AXN_SKRelease, AXN_BKAccept, AXN_BKReject, AXN_AXKWarning </emphasis> +}</entry> + </row> + <row> + <entry>KB_AXSKOPTSMASK</entry> + <entry>{ <emphasis> +AX_TwoKeys</emphasis> +, <emphasis> +AX_LatchToLock</emphasis> + }</entry> + </row> + <row> + <entry>KB_AXFBOPTSMASK</entry> + <entry>{ <emphasis> +AX_SKPressFB</emphasis> +, <emphasis> +AX_SKAcceptFB</emphasis> +, <emphasis> +AX_FeatureFB</emphasis> +, <emphasis> +AX_SlowWarnFB</emphasis> +, <emphasis> +AX_IndicatorFB</emphasis> +, <emphasis> +AX_StickyKeysFB</emphasis> +, <emphasis> +AX_SKReleaseFB</emphasis> +,<emphasis> + AX_SKRejectFB</emphasis> +, <emphasis> +AX_BKRejectFB</emphasis> +, <emphasis> +AX_DumbBellFB</emphasis> + }</entry> + </row> + <row> + <entry>KB_AXOPTIONSMASK</entry> + <entry> KB_AXFBOPTSMASK or KB_AXSKOPTSMASK</entry> + </row> + <row> + <entry>KB_GBNDETAILMASK</entry> + <entry>{ <emphasis> +GBN_Types</emphasis> +, <emphasis> +GBN_CompatMap</emphasis> +, <emphasis> +GBN_ClientSymbols</emphasis> +, <emphasis> +GBN_ServerSymbols</emphasis> +, <emphasis> +GBN_IndicatorMap</emphasis> +, <emphasis> +GBN_KeyNames</emphasis> +, <emphasis> +GBN_Geometry</emphasis> +, <emphasis> +GBN_OtherNames</emphasis> + }</entry> + </row> + <row> + <entry>KB_BELLDETAILMASK</entry> + <entry>{ <emphasis> +XkbAllBellNotifyEvents</emphasis> + }</entry> + </row> + <row> + <entry>KB_MSGDETAILMASK</entry> + <entry>{ <emphasis> +XkbAllActionMessages</emphasis> + }</entry> + </row> + <row> + <entry>KB_EVENTTYPE</entry> + <entry>{ <emphasis> +XkbNewKeyboardNotify</emphasis> +, <emphasis> +XkbMapNotify</emphasis> +, <emphasis> +XkbStateNotify</emphasis> +, <emphasis> +XkbControlsNotify</emphasis> +, <emphasis> +XkbIndicatorStateNotify</emphasis> +, <emphasis> +XkbIndicatorMapNotify</emphasis> +, <emphasis> +XkbNamesNotify</emphasis> +, <emphasis> +XkbCompatMapNotify</emphasis> +, <emphasis> +XkbBellNotify</emphasis> +, <emphasis> +XkbActionMessage</emphasis> +, <emphasis> +XkbAccessXNotify</emphasis> +, <emphasis> +XkbExtensionDeviceNotify</emphasis> + }</entry> + </row> + <row> + <entry>KB_ACTION</entry> + <entry>[ type: CARD8 +data: LISTofCARD8 ]</entry> + </row> + <row> + <entry>KB_BEHAVIOR</entry> + <entry>[ type: CARD8, data: CARD 8 ]</entry> + </row> + <row> + <entry>KB_MODDEF</entry> + <entry>[ mask: KEYMASK, +mods: KEYMASK, +vmods: KB_VMODMASK ]</entry> + </row> + <row> + <entry>KB_KTMAPENTRY</entry> + <entry>[ active: BOOL, +level: CARD8, +mods: KB_MODDEF ]</entry> + </row> + <row> + <entry>KB_KTSETMAPENTRY</entry> + <entry>[ level: CARD8, +mods: KB_MODDEF ]</entry> + </row> + <row> + <entry>KB_KEYTYPE</entry> + <entry>[ mods: KB_MODDEF, +numLevels: CARD8, +map: LISTofKB_KTMAPENTRY, +preserve: LISTofKB_MODDEF ]</entry> + </row> + <row> + <entry>KB_SETKEYTYPE</entry> + <entry>[ realMods: KEYMASK, +vmods: CARD16, +numLevels: CARD8, +map: LISTofKB_KTSETMAPENTRY, +preserve: LISTofKB_MODDEF ]</entry> + </row> + <row> + <entry>KB_KEYSYMMAP</entry> + <entry>[ ktIndex: LISTofCARD8, width: CARD8 + numGroups: 0…4, + groupsWrap: KB_GROUPSWRAP, + redirectGroup: 0…3, + syms: LISTofKEYSYM ]</entry> + </row> + <row> + <entry>KB_KEYVMODMAP</entry> + <entry>[ key: KEYCODE, vmods: CARD16 ]</entry> + </row> + <row> + <entry>KB_KEYMODMAP</entry> + <entry>[ key: KEYCODE, mods: KEYMASK ]</entry> + </row> + <row> + <entry>KB_EXPLICITMASK</entry> + <entry>{ <emphasis> +ExplicitKeyType1</emphasis> +, <emphasis> +ExplicitKeyType2</emphasis> +, <emphasis> +ExplicitKeyType3</emphasis> +, <emphasis> +ExplicitKeyType4</emphasis> +, <emphasis> +ExplicitInterpret</emphasis> +, <emphasis> +ExplicitAutoRepeat</emphasis> +, <emphasis> +ExplicitBehavior</emphasis> +, <emphasis> +ExplicitVModMap</emphasis> + }</entry> + </row> + <row> + <entry>KB_INDICATORMASK</entry> + <entry> CARD32, each bit corresponds to an indicator</entry> + </row> + <row> + <entry>KB_IMFLAGS</entry> + <entry>{ <emphasis> +IM_NoExplicit</emphasis> +, <emphasis> +IM_NoAutomatic</emphasis> +, <emphasis> +IM_LEDDrivesKB</emphasis> + }</entry> + </row> + <row> + <entry>KB_IMMODSWHICH</entry> + <entry>{ <emphasis> +IM_UseNone</emphasis> +, <emphasis> +IM_UseBase</emphasis> +, <emphasis> +IM_UseLatched</emphasis> +, <emphasis> +IM_UseLocked</emphasis> +, <emphasis> +IM_UseEffective</emphasis> +, <emphasis> +IM_UseCompat</emphasis> + }</entry> + </row> + <row> + <entry>KB_IMGROUPSWHICH</entry> + <entry>{ <emphasis> +IM_UseNone</emphasis> +, <emphasis> +IM_UseBase</emphasis> +, <emphasis> +IM_UseLatched</emphasis> +, <emphasis> +IM_UseLocked</emphasis> +, <emphasis> +IM_UseEffective</emphasis> + }</entry> + </row> + <row> + <entry>KB_INDICATORMAP</entry> + <entry>[ flags: CARD8, +mods: KB_MODDEF, +whichMods: +groups: KB_GROUPMASK, +whichGroups: +ctrls: KB_BOOLCTRLMASK ]</entry> + </row> + <row> + <entry>KB_SYMINTERPMATCH</entry> + <entry>{ <emphasis> +SI_NoneOf</emphasis> +, <emphasis> +SI_AnyOfOrNone</emphasis> +, <emphasis> +SI_AnyOf</emphasis> +, <emphasis> +SI_AllOf</emphasis> +, <emphasis> +SI_Exactly</emphasis> + }</entry> + </row> + <row> + <entry>KB_SYMINTERP</entry> + <entry>[ sym: KEYSYM, + mods; KEYMASK, + levelOneOnly: BOOL, + match: KB_SYMINTERPMATCH, + virtualMod: CARD8, + autoRepeat: BOOL, + lockingKey: BOOL ]</entry> + </row> + <row> + <entry>KB_PCFMASK</entry> + <entry>{ <emphasis> +PCF_DetectableAutorepeat</emphasis> +, <emphasis> +PCF_GrabsUseXkbState</emphasis> +, <emphasis> +PCF_AutoResetControls</emphasis> +, <emphasis> +PCF_LookupStateWhenGrabbed</emphasis> +, <emphasis> +PCF_SendEventUsesXKBState</emphasis> + }</entry> + </row> + <row> + <entry>KB_LCFLAGSMASK</entry> + <entry>{ <emphasis> +LC_Hidden</emphasis> +, <emphasis> +LC_Default</emphasis> +, <emphasis> +LC_Partial</emphasis> + }</entry> + </row> + <row> + <entry>KB_LCSYMFLAGSMASK</entry> + <entry>{ <emphasis> +LC_AlphanumericKeys</emphasis> +, <emphasis> +LC_ModifierKeys</emphasis> +, <emphasis> +LC_KeypadKeys</emphasis> +, <emphasis> +LC_FunctionKeys</emphasis> +, <emphasis> +LC_AlternateGroup</emphasis> + }</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +These types are used by the <emphasis> +XkbGetGeometry</emphasis> + and <emphasis> +XkbSetGeometry</emphasis> + requests: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="auto" ?> +<tgroup cols='2' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='2.0*'/> +<thead> + <row rowsep='1'> + <entry>Name</entry> + <entry>Value</entry> + </row> +</thead> +<tbody> + <row> + <entry>KB_PROPERTY</entry> + <entry>[ name, value: STRING8 ]</entry> + </row> + <row> + <entry>KB_POINT</entry> + <entry>[ x, y: CARD16 ]</entry> + </row> + <row> + <entry>KB_OUTLINE</entry> + <entry>[ cornerRadius: CARD8, points: LISTofKB_POINT ]</entry> + </row> + <row> + <entry>KB_SHAPE</entry> + <entry>[ name: ATOM, outlines: LISTofKB_OUTLINE + primaryNdx, approxNdx: CARD8 ]</entry> + </row> + <row> + <entry>KB_KEYNAME</entry> + <entry>[ name: LISTofCHAR ]</entry> + </row> + <row> + <entry>KB_KEYALIAS</entry> + <entry>[ real: LISTofCHAR, alias: LISTofCHAR ]</entry> + </row> + <row> + <entry>KB_KEY</entry> + <entry>[ name: KB_KEYNAME, gap: INT16, + shapeNdx, colorNdx: CARD8 ]</entry> + </row> + <row> + <entry>KB_ROW</entry> + <entry>[ top, left: INT16, vertical: BOOL, keys LISTofKB_KEY ]</entry> + </row> + <row> + <entry>KB_OVERLAYKEY</entry> + <entry>[ over, under: KB_KEYNAME ]</entry> + </row> + <row> + <entry>KB_OVERLAYROW</entry> + <entry>[ rowUnder: CARD8, keys: LISTofKB_OVERLAYKEY ]</entry> + </row> + <row> + <entry>KB_OVERLAY</entry> + <entry>[ sectionUnder: CARD8, +rows: LISTofKB_OVERLAYROW ]</entry> + </row> + <row> + <entry>KB_SHAPEDOODAD</entry> + <entry>[ name: ATOM, priority: CARD8, top, left: INT16, + type: { SolidDoodad, OutlineDoodad }, + angle: INT16, width, height: CARD16 + colorNdx, shapeNdx: CARD8 ]</entry> + </row> + <row> + <entry>KB_TEXTDOODAD</entry> + <entry>[ name: ATOM, priority: CARD8, top, left: INT16, + angle: INT16, width, height: CARD16, + colorNdx: CARD8, text: STRING8, font: STRING8 ]</entry> + </row> + <row> + <entry>KB_INDICATORDOODAD</entry> + <entry>[ name: ATOM, priority: CARD8, top, left: INT16, +angle: INT16, +shapeNdx, onColorNdx, offColorNdx: CARD8 ]</entry> + </row> + <row> + <entry>KB_LOGODOODAD</entry> + <entry>[ name: ATOM, priority: CARD8, top, left: INT16, + angle: INT16, colorNdx, shapeNdx: CARD8, + logoName: STRING8 ]</entry> + </row> + <row> + <entry>KB_DOODAD</entry> + <entry>KB_SHAPEDOODAD, or KB_TEXTDOODAD, or KB_INDICATORDOODAD, or +KB_LOGODOODAD</entry> + </row> + <row> + <entry>KB_SECTION</entry> + <entry>[ name: ATOM, + top, left, angle: INT16, + width, height: CARD16, + priority: CARD8, + rows: LISTofKB_ROW, + doodads: LISTofKB_DOODAD, + overlays: LISTofKB_OVERLAY ]</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +These types are used by <emphasis> +XkbGetDeviceInfo</emphasis> + and <emphasis> +XkbSetDeviceInfo</emphasis> +: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="always" ?> +<tgroup cols='2' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='2.0*'/> +<thead> + <row rowsep='1'> + <entry>Name</entry> + <entry>Value</entry> + </row> +</thead> +<tbody> + <row> + <entry>KB_XIDEVFEATUREMASK</entry> + <entry>{ <emphasis> +XI_ButtonActions</emphasis> +, <emphasis> +XI_IndicatorNames</emphasis> +, <emphasis> +XI_IndicatorMaps</emphasis> +, <emphasis> +XI_IndicatorState</emphasis> + }</entry> + </row> + <row> + <entry>KB_XIFEATUREMASK</entry> + <entry>{ KB_XIDEVFEATURES or <emphasis> +XI_Keyboards</emphasis> +</entry> + </row> + <row> + <entry>KB_XIDETAILMASK</entry> + <entry> { KB_XIFEATURES or <emphasis> +XI_UnsupportedFeature</emphasis> + <emphasis> +}</emphasis> +</entry> + </row> + <row> + <entry>KB_DEVICELEDINFO</entry> + <entry>[ ledClass: KB_LEDCLASSSPEC, +ledID: KB_IDSPEC, +physIndicators: CARD32, +state: CARD32, +names: LISTofATOM, +maps: LISTofKB_INDICATORMAP ]</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +</sect1> +<sect1 id='Requests'> +<title>Requests</title> + +<para> +This section lists all of the requests supported by the X Keyboard Extension, +separated into categories of related requests. +</para> + + +<sect2 id='Initializing_the_X_Keyboard_Extension'> +<title>Initializing the X Keyboard Extension</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbUseExtension</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>wantedMajor, wantedMinor: CARD16</entry> + </row> + <row> + <entry role='protoreply'> +supported: BOOL + </entry> + </row> + <row> + <entry role='protoreply'> +serverMajor, serverMinor: CARD16</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +<para> +This request enables XKB extension capabilities for the client that issues the +request; the <emphasis> +wantedMajor</emphasis> + and <emphasis> +wantedMinor</emphasis> + fields specify the extension version in use by the requesting client. The +<emphasis> +supported</emphasis> + field is <emphasis> +True</emphasis> + if the server supports a compatible version, <emphasis> +False</emphasis> + otherwise. The <emphasis> +serverMajor</emphasis> + and <emphasis> +serverMinor</emphasis> + fields return the actual version supported by the server. +</para> + + +<para> +Until a client explicitly and successfully requests the XKB extension, an XKB +capable server reports compatibility state in all core protocol events and +requests. Once a client asks for XKB extension semantics by issuing this +request, the server reports the extended XKB keyboard state in some core +protocol events and requests, as described in the overview section of this +specification. +</para> + + +<para> +Clients should issue an <emphasis> +XkbUseExtension</emphasis> + request before using any other extension requests. +</para> + + +</sect2> +<sect2 id='Selecting_Events'> +<title>Selecting Events</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSelectEvents</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +affectWhich, clear, selectAll: KB_EVENTTYPE</entry> + </row> + <row> + <entry role='protoname'> +affectMap, map: KB_MAPPARTMASK</entry> + </row> + <row> + <entry role='protoname'> +details: LISTofITEMs</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Value</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request updates the event masks of the keyboard indicated by <emphasis> +deviceSpec</emphasis> + for this client. If <emphasis> +deviceSpec</emphasis> + specifies an illegal device, a <emphasis> +Keyboard</emphasis> + error results. +</para> + + +<para> +The <emphasis> +affectMap</emphasis> + and <emphasis> +map</emphasis> + fields specify changes to the event details mask for the <emphasis> +XkbMapNotify</emphasis> + event. If any map components are set in <emphasis> +map</emphasis> + but not in <emphasis> +affectMap</emphasis> +, a <emphasis> +Match</emphasis> + error results. Otherwise, any map components that are set in <emphasis> +affectMap</emphasis> + are set or cleared in the map notify details mask, depending on the value of +the corresponding field in <emphasis> +map</emphasis> +. +</para> + + +<para> +The <emphasis> +affectWhich</emphasis> +, <emphasis> +clear</emphasis> +, and <emphasis> +selectAll</emphasis> + fields specify changes to any other event details masks. If any event types +are set in both <emphasis> +clear</emphasis> + and <emphasis> +selectAll</emphasis> +, a <emphasis> +Match</emphasis> + error results; if any event types are specified in either <emphasis> +clear</emphasis> + or <emphasis> +selectAll</emphasis> + but not in <emphasis> +affectWhich</emphasis> +, a <emphasis> +Match</emphasis> + error results. Otherwise, the detail masks for any event types specified in +the <emphasis> +affectWhich</emphasis> + field of this request are changed as follows: +</para> + +<itemizedlist> +<listitem> + <para>If the event type is also set in <emphasis> +clear</emphasis> +, the detail mask for the corresponding event is set to <emphasis> +0</emphasis> + or <emphasis> +False</emphasis> +, as appropriate. + </para> +</listitem> +<listitem> + <para>If the event type is also set in <emphasis> +selectAll</emphasis> +, the detail mask for the corresponding event is set to include all legal +detail values for that type. + </para> +</listitem> +<listitem> + <para>If the event type is not set in either <emphasis> +clear</emphasis> + or <emphasis> +selectAll</emphasis> +, the corresponding element of <emphasis> +details</emphasis> + lists a set of explicit changes to the details mask for the event, as +described below. + </para> +</listitem> +</itemizedlist> + +<para> +Each entry of the <emphasis> +details</emphasis> + list specifies changes to the event details mask for a single type of event, +and consists of an <emphasis> +affects</emphasis> + mask and a <emphasis> +values</emphasis> + mask. All details that are specified in <emphasis> +affects</emphasis> + are set to the corresponding value from <emphasis> +values</emphasis> +; if any details are listed in <emphasis> +values</emphasis> + but not in <emphasis> +affects</emphasis> +, a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +The details list contains entries only for those event types, if any, that are +listed in the <emphasis> +affectWhich</emphasis> + mask and not in either <emphasis> +clear</emphasis> + or <emphasis> +selectAll</emphasis> +. When present, the items of the <emphasis> +details</emphasis> + list appear in the following order: +</para> + +<informaltable frame='none'> +<?dbfo keep-together="auto" ?> +<tgroup cols='3' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='1.0*'/> +<colspec colname='c3' colwidth='1.0*'/> +<thead> + <row rowsep='1'> + <entry>Event Type</entry> + <entry>Legal Details</entry> + <entry>Type</entry> + </row> +</thead> +<tbody> + <row> + <entry><emphasis> +XkbNewKeyboardNotify</emphasis> +</entry> + <entry><emphasis> +KB_NKNDETAILSMASK</emphasis> +</entry> + <entry><emphasis> +CARD16</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbStateNotify</emphasis> +</entry> + <entry><emphasis> +KB_STATEPARTMASK</emphasis> +</entry> + <entry><emphasis> +CARD16</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbControlsNotify</emphasis> +</entry> + <entry><emphasis> +KB_CONTROLMASK</emphasis> +</entry> + <entry><emphasis> +CARD32</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbIndicatorMapNotify</emphasis> +</entry> + <entry><emphasis> +KB_INDICATORMASK</emphasis> +</entry> + <entry><emphasis> +CARD32</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbIndicatorStateNotify</emphasis> +</entry> + <entry><emphasis> +KB_INDICATORMASK</emphasis> +</entry> + <entry><emphasis> +CARD32</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbNamesNotify</emphasis> +</entry> + <entry><emphasis> +KB_NAMEDETAILMASK</emphasis> +</entry> + <entry><emphasis> +CARD16</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbCompatMapNotify</emphasis> +</entry> + <entry><emphasis> +KB_CMDETAILMASK</emphasis> +</entry> + <entry><emphasis> +CARD8</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbBellNotify</emphasis> +</entry> + <entry><emphasis> +KB_BELLDETAILMASK</emphasis> +</entry> + <entry><emphasis> +CARD8</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbActionMessage</emphasis> +</entry> + <entry><emphasis> +KB_MSGDETAILMASK</emphasis> +</entry> + <entry><emphasis> +CARD8</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbAccessXNotify</emphasis> +</entry> + <entry><emphasis> +KB_AXNDETAILMASK</emphasis> +</entry> + <entry><emphasis> +CARD16</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbExtensionDeviceNotify</emphasis> +</entry> + <entry><emphasis> +KB_XIDETAILMASK</emphasis> +</entry> + <entry><emphasis> +CARD16</emphasis> +</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +Detail masks for event types that are not specified in <emphasis> +affectWhich</emphasis> + are not changed. +</para> + + +<para> +If any components are specified in a client’s event masks, the X server sends +the client an appropriate event whenever any of those components change state. +Unless explicitly modified, all event detail masks are empty. <link linkend='Events'>Events</link> describes all XKB events +and the conditions under which the server generates them. +</para> + + +</sect2> +<sect2 id='Generating_Named_Keyboard_Bells'> +<title>Generating Named Keyboard Bells</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbBell</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +bellClass: KB_BELLCLASSSPEC</entry> + </row> + <row> + <entry role='protoname'> +bellID: KB_IDSPEC</entry> + </row> + <row> + <entry role='protoname'> +percent: INT8</entry> + </row> + <row> + <entry role='protoname'> +forceSound: BOOL</entry> + </row> + <row> + <entry role='protoname'> +eventOnly: BOOL</entry> + </row> + <row> + <entry role='protoname'> +pitch, duration: INT16</entry> + </row> + <row> + <entry role='protoname'> +name: ATOM</entry> + </row> + <row> + <entry role='protoname'> +window: WINDOW</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Value</emphasis> +, <emphasis> +Match</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request generates audible bells and/or <emphasis> +XkbBellNotify</emphasis> + events for the bell specified by the <emphasis> +bellClass</emphasis> + and <emphasis> +bellID</emphasis> + on the device specified by <emphasis> +deviceSpec</emphasis> + at the specified <emphasis> +pitch</emphasis> +, <emphasis> +duration</emphasis> + and volume (<emphasis> +percent</emphasis> +). If deviceSpec specifies a device that does not have a bell or keyboard +feedback, a <emphasis> +Keyboard</emphasis> + error results. +</para> + + +<para> +If both <emphasis> +forceSound</emphasis> + and <emphasis> +eventOnly</emphasis> + are set, this request yields a <emphasis> +Match</emphasis> + error. Otherwise, if <emphasis> +forceSound</emphasis> + is <emphasis> +True</emphasis> +, this request always generates a sound and never generates an event; if +<emphasis> +eventOnly</emphasis> + is <emphasis> +True</emphasis> +, it causes an event but no sound. If neither <emphasis> +forceSound</emphasis> + nor <emphasis> +eventOnly</emphasis> + are <emphasis> +True</emphasis> +, this request always generates an event; if the keyboard’s global <emphasis> +AudibleBell</emphasis> + control is enabled, it also generates a sound. +</para> + + +<para> +Any bell event generated by this request contains all of the information about +the bell that was requested, including the symbolic name specified by <emphasis> +name</emphasis> + and the event window specified by window. The <emphasis> +name</emphasis> + and <emphasis> +window</emphasis> + are not directly interpreted by XKB, but they must have the value <emphasis> +None</emphasis> + or specify a legal Atom or Window, respectively. <emphasis> +XkbBellNotify</emphasis> + events generated in response to core protocol or X input extension bell +requests always report <emphasis> +None</emphasis> + as their <emphasis> +name</emphasis> +. +</para> + + +<para> +The <emphasis> +bellClass</emphasis> +, <emphasis> +bellID</emphasis> +, and <emphasis> +percent</emphasis> + fields are interpreted as for the X input extension <emphasis> +DeviceBell</emphasis> + request. If <emphasis> +pitch</emphasis> + and <emphasis> +duration</emphasis> + are zero, the server uses the corresponding values for that bell from the core +protocol or input extension, otherwise <emphasis> +pitch</emphasis> + and <emphasis> +duration</emphasis> + are interpreted as for the core protocol <emphasis> +ChangeKeyboardControl</emphasis> + request; if they do not include legal values, a <emphasis> +Value</emphasis> + error results. The <emphasis> +window</emphasis> + field must specify a legal Window or have the value <emphasis> +None</emphasis> +, or a <emphasis> +Value</emphasis> + error results. The name field must specify a legal Atom or have the value +<emphasis> +None</emphasis> +, or an <emphasis> +Atom</emphasis> + error results. If an error occurs, this request has no other effect (i.e. does +not cause a sound or generate an event). +</para> + + +<para> +The <emphasis> +pitch</emphasis> +, <emphasis> +volume</emphasis> +, and <emphasis> +duration</emphasis> + are suggested values for the bell, but XKB does not require the server to +honor them. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_Keyboard_State'> +<title>Querying and Changing Keyboard State</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetState</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +mods, baseMods, latchedMods, lockedMods: KEYMASK + </entry> + </row> + <row> + <entry role='protoreply'> +group, lockedGroup: KB_GROUP + </entry> + </row> + <row> + <entry role='protoreply'> +baseGroup, latchedGroup: INT16 + </entry> + </row> + <row> + <entry role='protoreply'> +compatState: KEYMASK + </entry> + </row> + <row> + <entry role='protoreply'> +grabMods, compatGrabMods: KB_GROUP + </entry> + </row> + <row> + <entry role='protoreply'> +lookupMods, compatLookupMods: KEYMASK + </entry> + </row> + <row> + <entry role='protoreply'> +ptrBtnState: BUTMASK</entry> + </row> + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns a detailed description of the current state of the +keyboard specified by <emphasis> +deviceSpec</emphasis> +. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + return value contains the input extension identifier for the specified device, +or <emphasis> +0</emphasis> + if the server does not support the input extension. +</para> + + +<para> +The <emphasis> +baseMods</emphasis> + return value reports the modifiers that are set because one or more modifier +keys are logically down. The <emphasis> +latchedMods</emphasis> + and <emphasis> +lockedMods</emphasis> + return values report the modifiers that are latched or locked respectively. +The <emphasis> +mods</emphasis> + return value reports the effective modifier mask which results from the +current combination of base, latched and locked modifiers. +</para> + + +<para> +The <emphasis> +baseGroup</emphasis> + return value reports the group state selected by group shift keys that are +logically down. The <emphasis> +latchedGroup</emphasis> + and <emphasis> +lockedGroup</emphasis> + return values detail the effects of latching or locking group shift keys and +<emphasis> +XkbLatchLockState</emphasis> + requests. The <emphasis> +group</emphasis> + return value reports the effective keyboard group which results from the +current combination of base, latched and locked group values. +</para> + + +<para> +The <emphasis> +lookupMods</emphasis> + return value reports the lookup modifiers, which consist of the current +effective modifiers minus any server internal modifiers. The <emphasis> +grabMods</emphasis> + return value reports the grab modifiers, which consist of the lookup modifiers +minus any members of the ignore locks mask that are not either latched or +logically depressed. <link linkend='Keyboard_State'>Keyboard +State</link> describes the lookup modifiers and grab modifiers in more detail. +</para> + + +<para> +The <emphasis> +ptrBtnState</emphasis> + return value reports the current logical state of up to five buttons on the +core pointer device. +</para> + + +<para> +The <emphasis> +compatState</emphasis> + return value reports the compatibility state that corresponds to the effective +keyboard group and modifier state. The <emphasis> +compatLookupMods</emphasis> + and <emphasis> +compatGrabMods</emphasis> + return values report the core protocol compatibility states that correspond to +the XKB lookup and grab state. All of the compatibility states are computed by +applying the group compatibility mapping to the corresponding XKB modifier and +group states, as described in <link linkend='Group_Compatibility_Map'> +Group Compatibility Map</link>. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbLatchLockState</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +affectModLocks, modLocks: KEYMASK</entry> + </row> + <row> + <entry role='protoname'> +lockGroup: BOOL</entry> + </row> + <row> + <entry role='protoname'> +groupLock: KB_GROUP</entry> + </row> + <row> + <entry role='protoname'> +affectModLatches,modLatches: KEYMASK</entry> + </row> + <row> + <entry role='protoname'> +latchGroup: BOOL</entry> + </row> + <row> + <entry role='protoname'> +groupLatch: INT16</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Value</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request locks or latches keyboard modifiers and group state for the device +specified by <emphasis> +deviceSpec</emphasis> +. If <emphasis> +deviceSpec</emphasis> + specifies an illegal or non-keyboard device, a <emphasis> +Keyboard</emphasis> + error occurs. +</para> + + +<para> +The locked state of any modifier specified in the <emphasis> +affectModLocks</emphasis> + mask is set to the corresponding value from <emphasis> +modLocks</emphasis> +. If <emphasis> +lockGroup</emphasis> + is <emphasis> +True</emphasis> +, the locked keyboard group is set to the group specified by <emphasis> +groupLock</emphasis> +. If any modifiers are set in <emphasis> +modLocks</emphasis> + but not <emphasis> +affectModLocks</emphasis> +, a <emphasis> +Match</emphasis> + error occurs. +</para> + + +<para> +The latched state of any modifier specified in the <emphasis> +affectModLatches</emphasis> + mask is set to the corresponding value from <emphasis> +modLatches</emphasis> +. If <emphasis> +latchGroup</emphasis> + is <emphasis> +True</emphasis> +, the latched keyboard group is set to the group specified by <emphasis> +groupLatch</emphasis> +. if any modifiers are set in <emphasis> +modLatches</emphasis> + but not in <emphasis> +affectModLatches</emphasis> +, a <emphasis> +Match</emphasis> + error occurs. +</para> + + +<para> +If the locked group exceeds the maximum number of groups permitted for the +specified keyboard, it is wrapped or truncated back into range as specified by +the global <emphasis> +GroupsWrap</emphasis> +<emphasis> + </emphasis> +control. No error results from an out-of-range group specification. +</para> + + +<para> +After changing the locked and latched modifiers and groups as specified, the X +server recalculates the effective and compatibility keyboard state and +generates <emphasis> +XkbStateNotify</emphasis> + events as appropriate if any state components have changed. Changing the +keyboard state might also turn indicators on or off which can cause <emphasis> +XkbIndicatorStateNotify</emphasis> + events as well. +</para> + + +<para> +If any errors occur, this request has no effect. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_Keyboard_Controls'> +<title>Querying and Changing Keyboard Controls</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetControls</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +mouseKeysDfltBtn: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +numGroups: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +groupsWrap: KB_GROUPINFO + </entry> + </row> + <row> + <entry role='protoreply'> +internalMods,ignoreLockMods: KB_MODDEF + </entry> + </row> + <row> + <entry role='protoreply'> +repeatDelay,repeatInterval: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +slowKeysDelay, debounceDelay: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +mouseKeysDelay, mouseKeysInterval: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +mouseKeysTimeToMax, mouseKeysMaxSpeed: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +mouseKeysCurve: INT16 + </entry> + </row> + <row> + <entry role='protoreply'> +accessXOptions: KB_AXOPTIONMASK + </entry> + </row> + <row> + <entry role='protoreply'> +accessXTimeout: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +accessXTimeoutOptionsMask, accessXTimeoutOptionValues: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +accessXTimeoutMask,accessXTimeoutValues: CARD32 + </entry> + </row> + <row> + <entry role='protoreply'> +enabledControls: KB_BOOLCTRLMASK + </entry> + </row> + <row> + <entry role='protoreply'> +perKeyRepeat: LISTofCARD8</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns the current values and status of all controls for the +keyboard specified by <emphasis> +deviceSpec</emphasis> +. If <emphasis> +deviceSpec</emphasis> + specifies an illegal device a <emphasis> +Keyboard</emphasis> + error results. On return, the <emphasis> +deviceID</emphasis> + specifies the identifier of the requested device or zero if the server does +not support the input extension. +</para> + + +<para> +The <emphasis> +numGroups</emphasis> + return value reports the current number of groups, and <emphasis> +groupsWrap</emphasis> + reports the treatment of out-of-range groups, as described in <link linkend='Key_Symbol_Map'>Key Symbol Map</link>. The <emphasis> +internalMods</emphasis> + and <emphasis> +ignoreLockMods</emphasis> + return values report the current values of the server internal and ignore +locks modifiers as described in <link linkend='Keyboard_State'> +Keyboard State</link>. Both are modifier definitions ( +<link linkend='Modifier_Definitions'>Modifier Definitions</link>) which +report the real modifiers, virtual modifiers, and the resulting combination of +real modifiers that are bound to the corresponding control. +</para> + + +<para> +The <emphasis> +repeatDelay</emphasis> +, <emphasis> +repeatInterval</emphasis> +, <emphasis> +slowKeysDelay</emphasis> + and <emphasis> +debounceDelay</emphasis> + fields report the current values of the for the autorepeat delay, autorepeat +interval, slow keys delay and bounce keys timeout, respectively. The <emphasis> +mouseKeysDelay</emphasis> +, <emphasis> +mouseKeysInterval</emphasis> +, <emphasis> +mouseKeysTimeToMax</emphasis> + and <emphasis> +mouseKeysMaxSpeed</emphasis> + and <emphasis> +mouseKeysCurve</emphasis> + return values report the current acceleration applied to mouse keys, as +described in <link linkend='The_MouseKeysAccel_Control'>The MouseKeysAccel +Control</link>. All times are reported in milliseconds. +</para> + + +<para> +The <emphasis> +mouseKeysDfltBtn</emphasis> + return value reports the current default pointer button for which events are +synthesized by the mouse keys server actions. +</para> + + +<para> +The <emphasis> +accessXOptions</emphasis> + return value reports the current settings of the various AccessX options flags +which govern the behavior of the <emphasis> +StickyKeys</emphasis> + control and of AccessX feedback. +</para> + + +<para> +The <emphasis> +accessXTimeout</emphasis> + return value reports the length of time, in seconds, that the keyboard must +remain idle before AccessX controls are automatically changed; an <emphasis> +accessXTimeout</emphasis> + of <emphasis> +0</emphasis> + indicates that AccessX controls are not automatically changed. The <emphasis> +accessXTimeoutMask</emphasis> + specifies the boolean controls to be changed if the AccessX timeout expires; +the <emphasis> +accessXTimeoutValues</emphasis> + field specifies new values for all of the controls in the timeout mask. The +<emphasis> +accessXTimeoutOptionsMask</emphasis> + field specifies the AccessX options to be changed when the AccessX timeout +expires; the <emphasis> +accessXTimeoutOptionValues</emphasis> + return value reports the values to which they will be set. +</para> + + +<para> +The <emphasis> +enabledControls</emphasis> + return value reports the current state of all of the global boolean controls. +</para> + + +<para> +The <emphasis> +perKeyRepeat</emphasis> + array consists of one bit per key and reports the current autorepeat behavior +of each keyboard key; if a bit is set in <emphasis> +perKeyRepeat</emphasis> +, the corresponding key repeats if it is held down while global keyboard +autorepeat is enabled. This array parallels the core protocol and input +extension keyboard controls, if the autorepeat behavior of a key is changed via +the core protocol or input extension, those changes are automatically reflected +in the <emphasis> +perKeyRepeat</emphasis> + array. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetControls</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +affectInternalRealMods, internalRealMods: KEYMASK</entry> + </row> + <row> + <entry role='protoname'> +affectInternalVirtualMods,internalVirtualMods: KB_VMODMASK</entry> + </row> + <row> + <entry role='protoname'> +affectIgnoreLockRealMods,ignoreLockRealMods: KB_MODMASK</entry> + </row> + <row> + <entry role='protoname'> +affectIgnoreLockVirtualMods,ignoreLockVirtualMods: KB_VMODMASK</entry> + </row> + <row> + <entry role='protoname'> +mouseKeysDfltBtn: CARD8</entry> + </row> + <row> + <entry role='protoname'> +groupsWrap: KB_GROUPINFO</entry> + </row> + <row> + <entry role='protoname'> +accessXOptions: CARD16</entry> + </row> + <row> + <entry role='protoname'> +affectEnabledControls: KB_BOOLCTRLMASK</entry> + </row> + <row> + <entry role='protoname'> +enabledControls: KB_BOOLCTRLMASK</entry> + </row> + <row> + <entry role='protoname'> +changeControls: KB_CONTROLMASK</entry> + </row> + <row> + <entry role='protoname'> +repeatDelay,repeatInterval: CARD16</entry> + </row> + <row> + <entry role='protoname'> +slowKeysDelay, debounceDelay: CARD16</entry> + </row> + <row> + <entry role='protoname'> +mouseKeysDelay, mouseKeysInterval: CARD16</entry> + </row> + <row> + <entry role='protoname'> +mouseKeysTimeToMax, mouseKeysMaxSpeed: CARD16</entry> + </row> + <row> + <entry role='protoname'> +mouseKeysCurve: INT16</entry> + </row> + <row> + <entry role='protoname'> +accessXTimeout: CARD16</entry> + </row> + <row> + <entry role='protoname'> +accessXTimeoutMask, accessXTimeoutValues: KB_BOOLCTRLMASK</entry> + </row> + <row> + <entry role='protoname'> +accessXTimeoutOptionsMask,accessXTimeoutOptionsValues: CARD16</entry> + </row> + <row> + <entry role='protoname'> +perKeyRepeat: LISTofCARD8</entry> + </row> + + <row> + <entry role='protoerror'>Errors:<emphasis> + Keyboard</emphasis> +, <emphasis> +Value</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request sets the keyboard controls indicated in <emphasis> +changeControls</emphasis> + for the keyboard specified by <emphasis> +deviceSpec</emphasis> +. Each bit that is set in <emphasis> +changeControls</emphasis> + indicates that one or more of the other request fields should be applied, as +follows: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="always" ?> +<tgroup cols='2' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='2.0*'/> +<thead> + <row rowsep='1'> + <entry>Bit in changeControls</entry> + <entry>Field(s) to be Applied</entry> + </row> +</thead> +<tbody> + <row> + <entry><emphasis> +XkbRepeatKeysMask</emphasis> +</entry> + <entry><emphasis> +repeatDelay</emphasis> +, <emphasis> +repeatInterval</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbSlowKeysMask</emphasis> +</entry> + <entry><emphasis> +slowKeysDelay</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbStickyKeysMask</emphasis> +</entry> + <entry><emphasis> +accessXOptions</emphasis> + (only the <emphasis> +XkbAX_TwoKeys</emphasis> +<emphasis> + </emphasis> +and the <emphasis> +XkbAX_LatchToLock</emphasis> + options are affected)</entry> + </row> + <row> + <entry><emphasis> +XkbBounceKeysMask</emphasis> +</entry> + <entry><emphasis> +debounceDelay</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbMouseKeysMask</emphasis> +</entry> + <entry><emphasis> +mouseKeysDfltBtn</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbMouseKeysAccelMask</emphasis> +</entry> + <entry><emphasis> +mouseKeysDelay</emphasis> +, <emphasis> +mouseKeysInterval</emphasis> +, <emphasis> +mouseKeysCurve</emphasis> +, <emphasis> +mouseKeysTimeToMax</emphasis> +, <emphasis> +mouseKeysMaxSpeed</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbAccessXKeysMask</emphasis> +</entry> + <entry><emphasis> +accessXOptions (all options)</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbAccessXTimeoutMask</emphasis> +</entry> + <entry><emphasis> +accessXTimeout</emphasis> +, <emphasis> +accessXTimeoutMask</emphasis> +, <emphasis> +accessXTimeoutValues</emphasis> +, <emphasis> +accessXTimeoutOptionsMask</emphasis> +, <emphasis> +accessXTimeoutOptionsValues</emphasis> +</entry> + </row> + <row> + <entry>XkbAccessXFeedbackMask</entry> + <entry><emphasis> +accessXOptions</emphasis> + (all options except those affected by the <emphasis> +XkbStickyKeysMask</emphasis> + bit)</entry> + </row> + <row> + <entry><emphasis> +XkbGroupsWrapMask</emphasis> +</entry> + <entry><emphasis> +groupsWrap</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbInternalModsMask</emphasis> +</entry> + <entry><emphasis> +affectInternalRealMods</emphasis> +, <emphasis> +internalRealMods</emphasis> +, <emphasis> +affectInternalVirtualMods</emphasis> +, <emphasis> +internalVirtualMods</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbIgnoreLockModsMask</emphasis> +</entry> + <entry><emphasis> +affectIgnoreLockRealMods</emphasis> +, <emphasis> +ignoreLockRealMods</emphasis> +, <emphasis> +affectIgnoreLockVirtualMods</emphasis> +, <emphasis> +ignoreLockVirtualMods</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbPerKeyRepeatMask</emphasis> +</entry> + <entry><emphasis> +perKeyRepeat</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbControlsEnabledMask</emphasis> +</entry> + <entry><emphasis> +affectEnabledControls</emphasis> +, <emphasis> +enabledControls</emphasis> +</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +If any other bits are set in <emphasis> +changeControls</emphasis> +, a <emphasis> +Value</emphasis> + error results. If any of the bits listed above are not set in <emphasis> +changeControls</emphasis> +, the corresponding fields must have the value <emphasis> +0</emphasis> +, or a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +If applied, <emphasis> +repeatDelay</emphasis> + and <emphasis> +repeatInterval</emphasis> + change the autorepeat characteristics of the keyboard, as described in +<link linkend='The_RepeatKeys_Control'>The RepeatKeys Control</link>. If +specified, <emphasis> +repeatDelay</emphasis> + and <emphasis> +repeatInterval</emphasis> + must both be non-zero or a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If applied, the <emphasis> +slowKeysDelay</emphasis> + field specifies a new delay for the <emphasis> +SlowKeys</emphasis> + control, as defined in <link linkend='The_SlowKeys_Control'>The +SlowKeys Control</link>. If specified, <emphasis> +slowKeysDelay</emphasis> + must be non-zero, or a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If applied, the <emphasis> +debounceDelay</emphasis> + field specifies a new delay for the <emphasis> +BounceKeys</emphasis> + control, as described in <link linkend='The_BounceKeys_Control'>The +BounceKeys Control</link>. If present, the <emphasis> +debounceDelay</emphasis> + must be non-zero or a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If applied, the <emphasis> +mouseKeysDfltBtn</emphasis> + field specifies the core pointer button for which events are generated +whenever a <emphasis> +SA_PtrBtn</emphasis> + or <emphasis> +SA_LockPtrBtn</emphasis> + key action is activated. If present, <emphasis> +mouseKeysDfltBtn</emphasis> + must specify a legal button for the core pointer device, or a <emphasis> +Value</emphasis> + error results. <link linkend='Key_Actions'>Key +Actions</link> describes the <emphasis> +SA_PtrBtn</emphasis> + and <emphasis> +SA_LockPtrBtn</emphasis> + actions in more detail. +</para> + + +<para> +If applied, the <emphasis> +mouseKeysDelay</emphasis> +, <emphasis> +mouseKeysInterval</emphasis> +, <emphasis> +mouseKeysTimeToMax</emphasis> +, <emphasis> +mouseKeysMaxSpeed</emphasis> + and <emphasis> +mouseKeysCurve</emphasis> + fields change the rate at which the pointer moves when a key which generates a +<emphasis> +SA_MovePtr</emphasis> + action is held down. <link linkend='The_MouseKeysAccel_Control'>The +MouseKeysAccel Control</link> describes these <emphasis> +MouseKeysAccel</emphasis> + parameters in more detail. If defined, the <emphasis> +mouseKeysDelay</emphasis> +, <emphasis> +mouseKeysInterval</emphasis> +, <emphasis> +mouseKeysTimeToMax</emphasis> + and <emphasis> +mouseKeysMaxSpeed</emphasis> + values must all be greater than zero, or a <emphasis> +Value</emphasis> + error results. The <emphasis> +mouseKeysCurve</emphasis> + value must be greater than <emphasis> +-1000</emphasis> + or a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If applied, the <emphasis> +accessXOptions</emphasis> + field sets the AccessX options, which are described in detail in +<link linkend='The_AccessXKeys_Control'>The AccessXKeys Control</link>. If +either one of <emphasis> +XkbStickyKeysMask</emphasis> + and <emphasis> +XkbAccessXFeedbackMask</emphasis> + are set in <emphasis> +changeControls</emphasis> + and <emphasis> +XkbAccessXKeysMask</emphasis> + is not, only a subset of the AccessX options are changed, as described in the +table above; if both are set or if the <emphasis> +AccessXKeys</emphasis> + bit is set in <emphasis> +changeControls</emphasis> +, all of the AccessX options are updated. Any bit in <emphasis> +accessXOptions</emphasis> + whose interpretation is undefined must be zero, or a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If applied, the <emphasis> +accessXTimeout</emphasis> +, <emphasis> +accessXTimeoutMask</emphasis> +, <emphasis> +accessXTimeoutValues</emphasis> +, <emphasis> +accessXTimeoutOptionsMask</emphasis> + and <emphasis> +accessXTimeoutOptionsValues</emphasis> + fields change the behavior of the AccessX Timeout control, as described in +<link linkend='The_AccessXTimeout_Control'>The AccessXTimeout +Control</link>. The <emphasis> +accessXTimeout</emphasis> + must be greater than zero, or a <emphasis> +Value</emphasis> + error results. The <emphasis> +accessXTimeoutMask</emphasis> + or <emphasis> +accessXTimeoutValues</emphasis> + fields must specify only legal boolean controls, or a <emphasis> +Value</emphasis> + error results. The <emphasis> +accessXTimeoutOptionsMask</emphasis> + and <emphasis> +accessXTimeoutOptionsValues</emphasis> + fields must contain only legal AccessX options or a <emphasis> +Value</emphasis> + error results. If any bits are set in either values field but not in the +corresponding mask, a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +If present, the <emphasis> +groupsWrap</emphasis> + field specifies the treatment of out-of-range keyboard groups, as described in +<link linkend='Key_Symbol_Map'>Key Symbol Map</link>. If the +<emphasis> +groupsWrap</emphasis> + field does not specify a legal treatment for out-of-range groups, a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If present, the <emphasis> +affectInternalRealMods</emphasis> + field specifies the set of real modifiers to be changed in the internal +modifier definition and the <emphasis> +internalRealMods</emphasis> + field specifies new values for those modifiers. The <emphasis> +affectInternalVirtualMods</emphasis> + and <emphasis> +internalVirtualMods</emphasis> + fields update the virtual modifier component of the modifier definition that +describes the internal modifiers in the same way. If any bits are set in either +values field but not in the corresponding mask field, a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +If present, the <emphasis> +affectIgnoreLockRealMods</emphasis> + field specifies the set of real modifiers to be changed in the ignore locks +modifier definition and the <emphasis> +ignoreLockRealMods</emphasis> + field specifies new values for those modifiers. The <emphasis> +affectIgnoreLockVirtualMods</emphasis> + and <emphasis> +ignoreLockVirtualMods</emphasis> + fields update the virtual modifier component of the ignore locks modifier +definition in the same way. If any bits are set in either values field but not +in the corresponding mask field, a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +If present, the <emphasis> +perKeyRepeat</emphasis> + array specifies the repeat behavior of the individual keyboard keys. The +corresponding core protocol or input extension per-key autorepeat information +is updated to reflect any changes specified in <emphasis> +perKeyRepeat</emphasis> +. If the bits that correspond to any out-of-range keys are set in <emphasis> +perKeyRepeat</emphasis> +, a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If present, the <emphasis> +affectEnabledControls</emphasis> + and <emphasis> +enabledControls</emphasis> + field enable and disable global boolean controls. Any controls set in both +fields are enabled; any controls that are set in <emphasis> +affectEnabledControls</emphasis> + but not in <emphasis> +enabledControls</emphasis> + are disabled. Controls that are not set in either field are not affected. If +any controls are specified in <emphasis> +enabledControls</emphasis> + but not in <emphasis> +affectEnabledControls</emphasis> +, a <emphasis> +Match</emphasis> + error results. If either field contains anything except boolean controls, a +<emphasis> +Value</emphasis> + error results. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_the_Keyboard_Mapping'> +<title>Querying and Changing the Keyboard Mapping</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetMap</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +full, partial: KB_MAPPARTMASK</entry> + </row> + <row> + <entry role='protoname'> +firstType, nTypes: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstKeySym, firstKeyAction: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nKeySyms, nKeyActions: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstKeyBehavior,firstKeyExplicit: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nKeyBehaviors,nKeyExplicit: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstModMapKey,firstVModMapKey: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nModMapKeys, nVModMapKeys: CARD8</entry> + </row> + <row> + <entry role='protoname'> +virtualMods: KB_VMODMASK + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +minKeyCode, maxKeyCode: KEYCODE + </entry> + </row> + <row> + <entry role='protoreply'> +present: KB_MAPPARTMASK + </entry> + </row> + <row> + <entry role='protoreply'> +firstType, nTypes, nTotalTypes: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +firstKeySym, firstKeyAction: KEYCODE + </entry> + </row> + <row> + <entry role='protoreply'> +nKeySyms, nKeyActions: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +totalSyms, totalActions: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +firstKeyBehavior, firstKeyExplicit: KEYCODE + </entry> + </row> + <row> + <entry role='protoreply'> +nKeyBehaviors, nKeyExplicit: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +totalKeyBehaviors, totalKeyExplicit: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +firstModMapKey, firstVModMapKey: KEYCODE + </entry> + </row> + <row> + <entry role='protoreply'> +nModMapKeys, nVModMapKeys: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +totalModMapKeys, totalVModMapKeys: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +virtualMods: KB_VMODMASK + </entry> + </row> + <row> + <entry role='protoreply'> +typesRtrn: LISTofKB_KEYTYPE + </entry> + </row> + <row> + <entry role='protoreply'> +symsRtrn: LISTofKB_KEYSYMMAP + </entry> + </row> + <row> + <entry role='protoreply'> +actsRtrn: { count: LISTofCARD8, acts: LISTofKB_ACTION } + </entry> + </row> + <row> + <entry role='protoreply'> +behaviorsRtrn: LISTofKB_SETBEHAVIOR + </entry> + </row> + <row> + <entry role='protoreply'> +vmodsRtrn: LISTofSETofKEYMASK + </entry> + </row> + <row> + <entry role='protoreply'> +explicitRtrn: LISTofKB_SETEXPLICIT + </entry> + </row> + <row> + <entry role='protoreply'> +modmapRtrn: LISTofKB_KEYMODMAP + </entry> + </row> + <row> + <entry role='protoreply'> +vmodMapRtrn: LISTofKB_KEYVMODMAP + </entry> + </row> + <row> + <entry role='protoerror'> +Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Value</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns the indicated components of the server and client maps of +the keyboard specified by <emphasis> +deviceSpec</emphasis> +. The <emphasis> +full</emphasis> + mask specifies the map components to be returned in full; the <emphasis> +partial</emphasis> + mask specifies the components for which some subset of the legal elements are +to be returned. The server returns a <emphasis> +Match</emphasis> + error if any component is specified in both <emphasis> +full</emphasis> + and <emphasis> +partial</emphasis> +, or a <emphasis> +Value</emphasis> + error if any undefined bits are set in either <emphasis> +full</emphasis> + or <emphasis> +partial</emphasis> +. +</para> + + +<para> +Each bit in the <emphasis> +partial</emphasis> + mask controls the interpretation of one or more of the other request fields, +as follows: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="always" ?> +<tgroup cols='3' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.5*'/> +<colspec colname='c2' colwidth='1.0*'/> +<colspec colname='c3' colwidth='1.5*'/> +<thead> + <row rowsep='1'> + <entry>Bit in the Partial Mask</entry> + <entry>Type</entry> + <entry>Corresponding Field(s)</entry> + </row> +</thead> +<tbody> + <row> + <entry><emphasis> +XkbKeyTypesMask</emphasis> +</entry> + <entry>key types</entry> + <entry><emphasis> +firstType</emphasis> +, <emphasis> +nTypes</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbKeySymsMask</emphasis> +</entry> + <entry>keycodes</entry> + <entry><emphasis> +firstKeySym</emphasis> +, <emphasis> +nKeySyms</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbKeyActionsMask</emphasis> +</entry> + <entry>keycodes</entry> + <entry><emphasis> +firstKeyAction</emphasis> +, <emphasis> +nKeyActions</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbKeyBehaviorsMask</emphasis> +</entry> + <entry>keycodes</entry> + <entry><emphasis> +firstKeyBehavior</emphasis> +, <emphasis> +nKeyBehaviors</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbExplicitComponentsMask</emphasis> +</entry> + <entry>keycodes</entry> + <entry><emphasis> +firstKeyExplicit</emphasis> +, <emphasis> +nKeyExplicit</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbModifierMapMask</emphasis> +</entry> + <entry>keycodes</entry> + <entry><emphasis> +firstModMapKey</emphasis> +, <emphasis> +nModMapKeys</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbVirtualModMapMask</emphasis> +</entry> + <entry>keycodes</entry> + <entry><emphasis> +firstVModMapKey</emphasis> +, <emphasis> +nVModMapKeys</emphasis> +</entry> + </row> + <row> + <entry><emphasis> +XkbVirtualModsMask</emphasis> +</entry> + <entry>virtual modifiers</entry> + <entry><emphasis> +virtualMods</emphasis> +</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +If any of these keyboard map components are specified in <emphasis> +partial</emphasis> +, the corresponding values must specify a valid subset of the requested +components or this request reports a <emphasis> +Value</emphasis> + error. If a keyboard map component is not specified in <emphasis> +partial</emphasis> +, the corresponding fields must contain zeroes, or a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +If any error is generated, the request aborts and does not report any values. +</para> + + +<para> +On successful return, the <emphasis> +deviceID</emphasis> + field reports the X input extension device ID of the keyboard for which +information is being returned, or <emphasis> +0</emphasis> + if the server does not support the X input extension. The <emphasis> +minKeyCode</emphasis> + and <emphasis> +maxKeyCode</emphasis> + return values report the minimum and maximum keycodes that are legal for the +keyboard in question. +</para> + + +<para> +The <emphasis> +present</emphasis> + return value lists all of the keyboard map components contained in the reply. +The bits in <emphasis> +present</emphasis> + affect the interpretation of the other return values as follows: +</para> + + +<para> +If <emphasis> +XkbKeyTypesMask</emphasis> + is set in <emphasis> +present</emphasis> +: +</para> + +<itemizedlist> +<listitem> + <para><emphasis> +firstType</emphasis> + and <emphasis> +nTypes</emphasis> + specify the types reported in the reply. + </para> +</listitem> +<listitem> + <para><emphasis> +nTotalTypes</emphasis> + reports the total number of types defined for the keyboard + </para> +</listitem> +<listitem> + <para><emphasis> +typesRtrn</emphasis> + has <emphasis> +nTypes</emphasis> + elements of type KB_KEYTYPE which describe consecutive key types starting from +<emphasis> +firstType</emphasis> +. + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbKeySymsMask</emphasis> + is set in <emphasis> +present</emphasis> +: +</para> + +<itemizedlist> +<listitem> + <para><emphasis> +firstKeySym</emphasis> + and <emphasis> +nKeySyms</emphasis> + specify the subset of the keyboard keys for which symbols will be reported. + </para> +</listitem> +<listitem> + <para><emphasis> +totalSyms</emphasis> + reports the total number of keysyms bound to the keys returned in this reply. + </para> +</listitem> +<listitem> + <para><emphasis> +symsRtrn</emphasis> + has <emphasis> +nKeySyms</emphasis> + elements of type KB_KEYSYMMAP, which describe the symbols bound to consecutive +keys starting from <emphasis> +firstKeySym</emphasis> +. + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbKeyActionsMask</emphasis> + is set in <emphasis> +present</emphasis> +: +</para> + +<itemizedlist> +<listitem> + <para><emphasis> +firstKeyAction</emphasis> + and <emphasis> +nKeyActions</emphasis> + specify the subset of the keys for which actions are reported. + </para> +</listitem> +<listitem> + <para><emphasis> +totalActions</emphasis> + reports the total number of actions bound to the returned keys. + </para> +</listitem> +<listitem> + <para>The <emphasis> +count </emphasis> +field of the <emphasis> +actsRtrn</emphasis> + return value has <emphasis> +nKeyActions</emphasis> + entries of type CARD8, which specify the number of actions bound to +consecutive keys starting from <emphasis> +firstKeyAction</emphasis> +. The <emphasis> +acts</emphasis> + field of <emphasis> +actsRtrn</emphasis> + has <emphasis> +totalActions</emphasis> + elements of type KB_ACTION and specifies the actions bound to the keys. + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbKeyBehaviorsMask</emphasis> + is set in <emphasis> +present</emphasis> +: +</para> + +<itemizedlist> +<listitem> + <para>The <emphasis> +firstKeyBehavior</emphasis> + and <emphasis> +nKeyBehaviors</emphasis> + return values report the range of keyboard keys for which behaviors will be +reported. + </para> +</listitem> +<listitem> + <para>The <emphasis> +totalKeyBehaviors</emphasis> + return value reports the number of keys in the range to be reported that have +non-default values. + </para> +</listitem> +<listitem> + <para>The <emphasis> +behaviorsRtrn</emphasis> + value has <emphasis> +totalKeyBehaviors</emphasis> + entries of type KB_BEHAVIOR. Each entry specifies a key in the range for which +behaviors are being reported and the behavior associated with that key. Any +keys in that range that do not have an entry in <emphasis> +behaviorsRtrn</emphasis> + have the default behavior, <emphasis> +KB_Default</emphasis> +. + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbExplicitComponentsMask</emphasis> + is set in <emphasis> +present</emphasis> +: +</para> + +<itemizedlist> +<listitem> + <para>The <emphasis> +firstKeyExplicit</emphasis> + and <emphasis> +nKeyExplicit</emphasis> + return values report the range of keyboard keys for which the set of explicit +components is to be returned. + </para> +</listitem> +<listitem> + <para>The <emphasis> +totalKeyExplicit</emphasis> + return value reports the number of keys in the range specified by <emphasis> +firstKeyExplicit</emphasis> + and <emphasis> +nKeyExplicit</emphasis> + that have one or more explicit components. + </para> +</listitem> +<listitem> + <para>The <emphasis> +explicitRtrn</emphasis> + return value has <emphasis> +totalKeyExplicit</emphasis> + entries of type KB_KEYEXPLICIT. Each entry specifies the a key in the range +for which explicit components are being reported and the explicit components +that are bound to it. Any keys in that range that do not have an entry in +<emphasis> +explicitRtrn</emphasis> + have no explicit components. + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbModifierMapMask</emphasis> + is set in <emphasis> +present</emphasis> +: +</para> + +<itemizedlist> +<listitem> + <para>The <emphasis> +firstModMapKey</emphasis> + and <emphasis> +nModMapKeys</emphasis> + return values report the range of keyboard keys for which the modifier map is +to be reported. + </para> +</listitem> +<listitem> + <para>The <emphasis> +totalModMapKeys</emphasis> + return value reports the number of keys in the range specified by <emphasis> +firstModMapKey</emphasis> + and <emphasis> +nModMapKeys</emphasis> + that are bound with to one or more modifiers. + </para> +</listitem> +<listitem> + <para>The <emphasis> +modmapRtrn</emphasis> + return value has <emphasis> +totalModMapKeys</emphasis> + entries of type KB_KEYMODMAP. Each entry specifies the a key in the range for +which the modifier map is being reported and the set of modifiers that are +bound to that key. Any keys in that range that do not have an entry in +<emphasis> +modmapRtrn</emphasis> + are not associated with any modifiers by the modifier mapping. + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbVirtualModMapMask</emphasis> + is set in <emphasis> +present</emphasis> +: +</para> + +<itemizedlist> +<listitem> + <para>The <emphasis> +firstVModMapKey</emphasis> + and <emphasis> +nVModMapKeys</emphasis> + return values report the range of keyboard keys for which the virtual modifier +map is to be reported. + </para> +</listitem> +<listitem> + <para>The <emphasis> +totalVModMapKeys</emphasis> + return value reports the number of keys in the range specified by <emphasis> +firstVModMapKey</emphasis> + and <emphasis> +nVModMapKeys</emphasis> + that are bound with to or more virtual modifiers. + </para> +</listitem> +<listitem> + <para>The <emphasis> +vmodmapRtrn</emphasis> + return value has <emphasis> +totalVModMapKeys</emphasis> + entries of type KB_KEYVMODMAP. Each entry specifies the a key in the range for +which the virtual modifier map is being reported and the set of virtual +modifiers that are bound to that key. Any keys in that range that do not have +an entry in <emphasis> +vmodmapRtrn</emphasis> + are not associated with any virtual modifiers, + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbVirtualModsMask</emphasis> + is set in <emphasis> +present</emphasis> +: +</para> + +<itemizedlist> +<listitem> + <para>The <emphasis> +virtualMods</emphasis> + return value is a mask with one bit per virtual modifier which specifies the +virtual modifiers for which a set of corresponding real modifiers is to be +returned. + </para> +</listitem> +<listitem> + <para>The <emphasis> +vmodsRtrn</emphasis> + return value is a list with one entry of type KEYBUTMASK for each virtual +modifier that is specified in <emphasis> +virtualMods</emphasis> +. The entries in <emphasis> +vmodsRtrn</emphasis> + contain the real modifier bindings for the specified virtual modifiers, +beginning with the lowest-numbered virtual modifier that is present in +<emphasis> +virtualMods</emphasis> + and proceeding to the highest. + </para> +</listitem> +</itemizedlist> + +<para> +If any of these bits are not set in <emphasis> +present</emphasis> +, the corresponding numeric fields all have the value zero, and the +corresponding lists are all of length zero. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetMap</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +flags: { <emphasis> +SetMapResizeTypes, SetMapRecomputeActions </emphasis> +}</entry> + </row> + <row> + <entry role='protoname'> +present: KB_MAPPARTMASK</entry> + </row> + <row> + <entry role='protoname'> +minKeyCode, maxKeyCode: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +firstType, nTypes: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstKeySym, firstKeyAction: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nKeySyms, nKeyActions: CARD8</entry> + </row> + <row> + <entry role='protoname'> +totalSyms, totalActions: CARD16</entry> + </row> + <row> + <entry role='protoname'> +firstKeyBehavior, firstKeyExplicit: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nKeyBehaviors, nKeyExplicit: CARD8</entry> + </row> + <row> + <entry role='protoname'> +totalKeyBehaviors, totalKeyExplicit: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstModMapKey, firstVModMapKey: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nModMapKeys, nVModMapKeys: CARD8</entry> + </row> + <row> + <entry role='protoname'> +totalModMapKeys, totalVModMapKeys: CARD8</entry> + </row> + <row> + <entry role='protoname'> +virtualMods: VMODMASK</entry> + </row> + <row> + <entry role='protoname'> +types: LISTofKB_KEYTYPE</entry> + </row> + <row> + <entry role='protoname'> +syms: LISTofKB_KEYSYMMAP</entry> + </row> + <row> + <entry role='protoname'> +actions: { count: LISTofCARD8, actions: LISTofKB_ACTION }</entry> + </row> + <row> + <entry role='protoname'> +behaviors: LISTofKB_BEHAVIOR</entry> + </row> + <row> + <entry role='protoname'> +vmods: LISTofKEYMASK</entry> + </row> + <row> + <entry role='protoname'> +explicit: LISTofKB_EXPLICIT</entry> + </row> + <row> + <entry role='protoname'> +modmap: LISTofKB_KEYMODMAP</entry> + </row> + <row> + <entry role='protoname'> +vmodmap: LISTofKB_KEYVMODMAP</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Value</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request changes the indicated parts of the keyboard specified by <emphasis> +deviceSpec</emphasis> +. With XKB, the effect of a key release is independent of the keyboard mapping +at the time of the release, so this request can be processed regardless of the +logical state of the modifier keys at the time of the request. +</para> + + +<para> +The <emphasis> +present</emphasis> + field specifies the keyboard map components contained to be changed. The bits +in <emphasis> +present</emphasis> + affect the interpretation of the other fields as follows: +</para> + + +<para> +If <emphasis> +XkbKeyTypesMask</emphasis> + is set in <emphasis> +present</emphasis> +, <emphasis> +firstType</emphasis> + and <emphasis> +nTypes</emphasis> + specify a subset of the key types bound to the keyboard to be changed or +created. The index of the first key type to be changed must be less than or +equal to the unmodified length of the list of key types or a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If <emphasis> +XkbKeyTypesMask</emphasis> + is set in <emphasis> +present</emphasis> + and <emphasis> +SetMapResizeTypes</emphasis> + is set in <emphasis> +flags</emphasis> +, the server resizes the list of key types bound to the keyboard so that the +last key type specified by this request is the last element in the list. If the +list of key types is shrunk, any existing key definitions that use key types +that eliminated are automatically assigned key types from the list of canonical +key types as described in <link linkend='Assigning_Types_To_Groups_of_Symbols_for_a_Key'> +Assigning Types To Groups of Symbols for a Key</link>. The list of key types +bound to a keyboard must always include the four canonical types and cannot +have more than <emphasis> +XkbMaxTypesPerKey</emphasis> + (32) types; any attempt to reduce the number of types bound to a keyboard +below four or above <emphasis> +XkbMaxTypesPerKey</emphasis> + causes a <emphasis> +Value</emphasis> + error. Symbolic names for newly created key types or levels within a key type +are initialized to <emphasis> +None</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbKeyTypesMask</emphasis> + is set in <emphasis> +present</emphasis> +, the types list has <emphasis> +nTypes</emphasis> + entries of type KB_KEYTYPE.Each key type specified in <emphasis> +types</emphasis> + must be valid or a <emphasis> +Value</emphasis> + error results. To be valid a key type definition must meet the following +criteria: +</para> + +<itemizedlist> +<listitem> + <para>The <emphasis> +numLevels</emphasis> + for the type must be greater than zero. + </para> +</listitem> +<listitem> + <para>If the key type is <emphasis> +ONE_LEVEL</emphasis> + (i.e. index zero in the list of key types), <emphasis> +numLevels</emphasis> + must be one. + </para> +</listitem> +<listitem> + <para>If the key type is <emphasis> +TWO_LEVEL</emphasis> + or <emphasis> +KEYPAD</emphasis> +, or <emphasis> +ALPHABETIC</emphasis> + (i.e. index one, two, or three in the lest of key types) group width must be +two. + </para> +</listitem> +</itemizedlist> + +<para> +Each key type in types must also be internally consistent, or a Match error +results. To be internally consistent, a key type definition must meet the +following criteria: +</para> + +<itemizedlist> +<listitem> + <para>Each map entry must specify a resulting level that is legal for the +type. + </para> +</listitem> +<listitem> + <para>Any real or virtual modifiers specified in any of the map entries must +also be specified in the <emphasis> +mods</emphasis> + for the type. + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbKeySymsMask</emphasis> + is set in <emphasis> +present</emphasis> +, <emphasis> +firstKeySym</emphasis> + and <emphasis> +nKeySyms</emphasis> + specify a subset of the keyboard keys to which new symbols are to be assigned +and <emphasis> +totalSyms</emphasis> + specifies the total number of symbols to be assigned to those keys. If any of +the keys specified by <emphasis> +firstKeySym</emphasis> + and <emphasis> +nKeySyms</emphasis> + are not legal, a <emphasis> +Match</emphasis> + error results. The <emphasis> +syms</emphasis> + list has <emphasis> +nKeySyms</emphasis> + elements of type KB_KEYSYMMAP. Each key in the resulting key symbol map must +be valid and internally consistent or a <emphasis> +Value</emphasis> + error results. To be valid and internally consistent, a key symbol map must +meet the following criteria: +</para> + +<itemizedlist> +<listitem> + <para>The key type indices must specify legal result key types. + </para> +</listitem> +<listitem> + <para>The number of groups specified by <emphasis> +groupInfo</emphasis> + must be in the range <emphasis> +0…4</emphasis> +. + </para> +</listitem> +<listitem> + <para>The <emphasis> +width</emphasis> + of the key symbol map must be equal to <emphasis> +numLevels</emphasis> + of the widest key type bound to the key. + </para> +</listitem> +<listitem> + <para>The number of symbols, <emphasis> +nSyms</emphasis> +, must equal the number of groups times <emphasis> +width</emphasis> +. + </para> +</listitem> +</itemizedlist> + +<para> +If <emphasis> +XkbKeyActionsMask</emphasis> + is set in <emphasis> +present</emphasis> +, <emphasis> +firstKeyAction</emphasis> + and <emphasis> +nKeyActions</emphasis> + specify a subset of the keyboard keys to which new actions are to be assigned +and <emphasis> +totalActions</emphasis> + specifies the total number of actions to be assigned to those keys. If any of +the keys specified by <emphasis> +firstKeyAction</emphasis> + and <emphasis> +nKeyActions</emphasis> + are not legal, a <emphasis> +Match</emphasis> + error results. The <emphasis> +count</emphasis> + field of the <emphasis> +actions</emphasis> + return value has <emphasis> +nKeyActions</emphasis> + elements of type CARD8; each element of <emphasis> +count</emphasis> + specifies the number of actions bound to the corresponding key. The <emphasis> +actions</emphasis> + list in the <emphasis> +actions</emphasis> + field has <emphasis> +totalActions</emphasis> + elements of type KB_ACTION. These actions are assigned to each target key in +turn, as specified by <emphasis> +count</emphasis> +. The list of actions assigned to each key must either be empty or have exactly +as many actions as the key has symbols, or a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +If <emphasis> +XkbKeyBehaviorsMask</emphasis> + is set in <emphasis> +present</emphasis> +, <emphasis> +firstKeyBehavior</emphasis> + and <emphasis> +nKeyBehaviors</emphasis> + specify a subset of the keyboard keys to which new behaviors are to be +assigned, and <emphasis> +totalKeyBehaviors</emphasis> + specifies the total number of keys in that range to be assigned non-default +behavior. If any of the keys specified by <emphasis> +firstKeyBehavior</emphasis> + and <emphasis> +nKeyBehaviors</emphasis> + are not legal, a <emphasis> +Match</emphasis> + error results. The <emphasis> +behaviors</emphasis> + list has <emphasis> +totalKeyBehaviors</emphasis> + elements of type KB_BEHAVIOR; each entry of <emphasis> +behaviors</emphasis> + specifies a key in the specified range and a new behavior for that key; any +key that falls in the range specified by <emphasis> +firstBehavior</emphasis> + and <emphasis> +nBehaviors</emphasis> + for which no behavior is specified in <emphasis> +behaviors</emphasis> + is assigned the default behavior, <emphasis> +KB_Default</emphasis> +. The new behaviors must be legal, or a <emphasis> +Value</emphasis> + error results. To be legal, the behavior specified in the <emphasis> +XkbSetMap</emphasis> + request must: +</para> + +<itemizedlist> +<listitem> + <para>Specify a key in the range indicated by <emphasis> +firstKeyBehavior</emphasis> + and <emphasis> +nKeyBehaviors</emphasis> +. + </para> +</listitem> +<listitem> + <para>Not specify the <emphasis> +permanent</emphasis> + flag; permanent behaviors cannot be set or changed using the <emphasis> +XkbSetMap</emphasis> + request. + </para> +</listitem> +<listitem> + <para>If present, the <emphasis> +KB_Overlay1</emphasis> + and <emphasis> +KB_Overlay2</emphasis> + behaviors must specify a keycode for the overlay key that is valid for the +current keyboard. + </para> +</listitem> +<listitem> + <para>If present, the <emphasis> +KB_RadioGroup</emphasis> + behavior must specify a legal index (0…31) for the radio group to which the +key belongs. + </para> +</listitem> +</itemizedlist> + +<para> +Key behaviors that are not recognized by the server are accepted but ignored. +Attempts to replace a "permanent" behavior are silently ignored; the behavior +is not replaced, but not error is generated and any other components specified +in the <emphasis> +XkbSetMap</emphasis> + request are updated, as appropriate. +</para> + + +<para> +If <emphasis> +XkbVirtualModsMask</emphasis> + is set in <emphasis> +present</emphasis> +, <emphasis> +virtualMods</emphasis> + is a mask which specifies the virtual modifiers to be rebound. The <emphasis> +vmods</emphasis> + list specifies the real modifiers that are bound to each of the virtual +modifiers specified in <emphasis> +virtualMods</emphasis> +, starting from the lowest numbered virtual modifier and progressing upward. +Any virtual modifier that is not specified in <emphasis> +virtualMods</emphasis> + has no corresponding entry in <emphasis> +vmods</emphasis> +, so the <emphasis> +vmods</emphasis> + list has one entry for each bit that is set in <emphasis> +virtualMods</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbExplicitComponentsMask</emphasis> + is set in <emphasis> +present</emphasis> +, <emphasis> +firstKeyExplicit</emphasis> + and <emphasis> +nKeyExplicit</emphasis> + specify a subset of the keyboard keys to which new explicit components are to +be assigned, and <emphasis> +totalKeyExplicit</emphasis> + specifies the total number of keys in that range that have at least one +explicit component. The <emphasis> +explicit</emphasis> + list has <emphasis> +totalKeyExplicit</emphasis> + elements of type KB_KEYEXPLICIT; each entry of <emphasis> +explicit</emphasis> + specifies a key in the specified range and a new set of explicit components +for that key. Any key that falls in the range specified by <emphasis> +firstKeyExplicit</emphasis> + and <emphasis> +nKeyExplicit</emphasis> + that is not assigned some value in <emphasis> +explicit</emphasis> + has no explicit components. +</para> + + +<para> +If <emphasis> +XkbModifierMapMask</emphasis> + is set in <emphasis> +present</emphasis> +, <emphasis> +firstModMapKey</emphasis> + and <emphasis> +nModMapKeys</emphasis> + specify a subset of the keyboard keys for which new modifier mappings are to +be assigned, and <emphasis> +totalModMapKeys</emphasis> + specifies the total number of keys in that range to which at least one +modifier is bound. The <emphasis> +modmap</emphasis> + list has <emphasis> +totalModMapKeys</emphasis> + elements of type KB_KEYMODMAP; each entry of <emphasis> +modmap</emphasis> + specifies a key in the specified range and a new set of modifiers to be +associated with that key. Any key that falls in the range specified by +<emphasis> +firstModMapKey</emphasis> + and <emphasis> +nModMapKeys</emphasis> + that is not assigned some value in <emphasis> +modmap</emphasis> + has no associated modifiers. +</para> + + +<para> +If the modifier map is changed by the <emphasis> +XkbSetMap</emphasis> + request, any changes are also reflected in the core protocol modifier mapping. +Changes to the core protocol modifier mapping are reported to XKB-unaware +clients via <emphasis> +MappingNotify</emphasis> + events and can be retrieved with the core protocol <emphasis> +GetModifierMapping</emphasis> + request. +</para> + + +<para> +If <emphasis> +XkbVirtualModMapMask</emphasis> + is set in <emphasis> +present</emphasis> +, <emphasis> +firstVModMapKey</emphasis> + and <emphasis> +nVModMapKeys</emphasis> + specify a subset of the keyboard keys for which new modifier mappings are to +be assigned, and <emphasis> +totalVModMapKeys</emphasis> + specifies the total number of keys in that range to which at least one virtual +modifier is bound. The <emphasis> +vmodmap</emphasis> + list has <emphasis> +totalVModMapKeys</emphasis> + elements of type KB_KEYVMODMAP; each entry of <emphasis> +vmodmap</emphasis> + specifies a key in the specified range and a new set of virtual modifiers to +be associated with that key. Any key that falls in the range specified by +<emphasis> +firstVModMapKey</emphasis> + and <emphasis> +nVModMapKeys</emphasis> + that is not assigned some value in <emphasis> +vmodmap</emphasis> + has no associated virtual modifiers. +</para> + + +<para> +If the resulting keyboard map is legal, the server updates the keyboard map. +Changes to some keyboard components have indirect effects on others: +</para> + + +<para> +If the <emphasis> +XkbSetMapRecomputeActions</emphasis> + bit is set in <emphasis> +flags</emphasis> +, the actions associated with any keys for which symbol or modifier bindings +were changed by this request are recomputed as described in +<link linkend='Assigning_Actions_To_Keys'>Assigning Actions To Keys</link>. Note +that actions are recomputed <emphasis> +after </emphasis> +any actions specified in this request are bound to keys, so the actions +specified in this request might be clobbered by the automatic assignment of +actions to keys. +</para> + + +<para> +If the group width of an existing key type is changed, the list of symbols +associated with any keys of the changed type might be resized accordingly. If +the list increases in size, any unspecified new symbols are initialized to +<emphasis> +NoSymbol</emphasis> +. +</para> + + +<para> +If the list of actions associated with a key is not empty, changing the key +type of the key resizes the list. Unspecified new actions are calculated by +applying any keyboard symbol interpretations to the corresponding symbols. +</para> + + +<para> +The number of groups global to the keyboard is always equal to the largest +number of groups specified by any of the key symbol maps. Changing the number +of groups in one or more key symbol maps may change the number of groups global +to the keyboard. +</para> + + +<para> +Assigning key behavior <emphasis> +KB_RadioGroup</emphasis> + to a key adds that key as a member of the specified radio group. Changing a +key with the existing behavior <emphasis> +KB_RadioGroup</emphasis> + removes that key from the group. Changing the elements of a radio group can +cause synthetic key press or key release events if the key to be added or +removed is logically down at the time of the change. +</para> + + +<para> +Changing a key with behavior <emphasis> +KB_Lock</emphasis> + causes a synthetic key release event if the key is logically but not +physically down at the time of the change. +</para> + + +<para> +This request sends an <emphasis> +XkbMapNotify</emphasis> + event which reflects both explicit and indirect map changes to any interested +clients. If any symbolic names are changed, it sends a <emphasis> +XkbNamesNotify</emphasis> + reflecting the changes to any interested clients. XKB-unaware clients are +notified of keyboard changes via core protocol <emphasis> +MappingNotify</emphasis> + events. +</para> + + +<para> +Key press and key release events caused by changing key behavior may cause +additional <emphasis> +XkbStateNotify</emphasis> + or <emphasis> +XkbIndicatorStateNotify</emphasis> + events. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_the_Compatibility_Map'> +<title>Querying and Changing the Compatibility Map</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetCompatMap</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +groups: KB_GROUPMASK</entry> + </row> + <row> + <entry role='protoname'> +getAllSI: BOOL</entry> + </row> + <row> + <entry role='protoname'> +firstSI, nSI: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +groupsRtrn: KB_GROUPMASK + </entry> + </row> + <row> + <entry role='protoreply'> +firstSIRtrn, nSIRtrn, nTotalSI: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +siRtrn: LISTofKB_SYMINTERP + </entry> + </row> + <row> + <entry role='protoreply'> +groupRtrn: LISTofKB_MODDEF</entry> + </row> + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns the listed compatibility map components for the keyboard +specified by <emphasis> +deviceSpec</emphasis> +. If <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device, a <emphasis> +Keyboard</emphasis> + Error results. On return, <emphasis> +deviceID</emphasis> + reports the input extension identifier of the keyboard device or <emphasis> +0</emphasis> + if the server does not support the input extension. +</para> + + +<para> +If <emphasis> +getAllSI</emphasis> + is <emphasis> +False</emphasis> +, <emphasis> +firstSI</emphasis> + and <emphasis> +nSI</emphasis> + specify a subset of the symbol interpretations to be returned; if used, +<emphasis> +nSI</emphasis> + must be greater than <emphasis> +0</emphasis> + and all of the elements specified by <emphasis> +firstSI</emphasis> + and <emphasis> +nSI</emphasis> + must be defined or a <emphasis> +Value</emphasis> + error results. If <emphasis> +getAllSyms</emphasis> + is <emphasis> +True</emphasis> +, the server ignores <emphasis> +firstSym</emphasis> + and <emphasis> +nSyms</emphasis> + and returns all of the symbol interpretations defined for the keyboard. +</para> + + +<para> +The <emphasis> +groups</emphasis> + mask specifies the groups for which compatibility maps are to be returned. +</para> + + +<para> +The <emphasis> +nTotalSI</emphasis> + return value reports the total number of symbol interpretations defined for +the keyboard. On successful return, the <emphasis> +siRtrn</emphasis> + return list contains the definitions for <emphasis> +nSIRtrn</emphasis> + symbol interpretations beginning at <emphasis> +firstSIRtrn</emphasis> +. +</para> + + +<para> +The <emphasis> +groupRtrn</emphasis> + return values report the entries in the group compatibility map for any groups +specified in the <emphasis> +groupsRtrn</emphasis> + return value. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetCompatMap</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +recomputeActions: BOOL</entry> + </row> + <row> + <entry role='protoname'> +truncateSI: BOOL</entry> + </row> + <row> + <entry role='protoname'> +groups: KB_GROUPMASK</entry> + </row> + <row> + <entry role='protoname'> +firstSI, nSI: CARD16</entry> + </row> + <row> + <entry role='protoname'> +si: LISTofKB_SYMINTERPRET</entry> + </row> + <row> + <entry role='protoname'> +groupMaps: LISTofKB_MODDEF</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Value</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request changes a specified subset of the compatibility map of the +keyboard indicated by <emphasis> +deviceSpec</emphasis> +. If <emphasis> +deviceSpec</emphasis> + specifies an invalid device, a <emphasis> +Keyboard</emphasis> + error results and nothing is changed. +</para> + + +<para> +The <emphasis> +firstSI</emphasis> + and <emphasis> +nSI</emphasis> + fields specify a subset of the keyboard symbol interpretations to be changed. +The <emphasis> +si</emphasis> + list specifies new values for each of the interpretations in that range. +</para> + + +<para> +The first symbol interpretation to be changed, <emphasis> +firstSI</emphasis> +, must be less than or equal to the unchanged length of the list of symbol +interpretations, or a <emphasis> +Value</emphasis> + error results. If the resulting list would be larger than the unchanged list, +it server list of symbol interpretations is automatically increased in size. +Otherwise, if <emphasis> +truncateSyms</emphasis> + is <emphasis> +True</emphasis> +, the server deletes any symbol interpretations after the last element changed +by this request, and reduces the length of the list accordingly. +</para> + + +<para> +The <emphasis> +groupMaps</emphasis> + fields contain new definitions for a subset of the group compatibility map; +<emphasis> +groups</emphasis> + specifies the group compatibility map entries to be updated from <emphasis> +groupMaps</emphasis> +. +</para> + + +<para> + All changed compatibility maps and symbol interpretations must either ignore +group state or specify a legal range of groups, or a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +If the <emphasis> +recomputeActions</emphasis> + field is <emphasis> +True</emphasis> +, the server regenerates recalculates the actions bound to all keyboard keys by +applying the new symbol interpretations to the entire key symbol map, as +described in <link linkend='Assigning_Actions_To_Keys'>Assigning Actions To +Keys</link>. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_Indicators'> +<title>Querying and Changing Indicators</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetIndicatorState</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 +state: KB_INDICATORMASK</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request reports the current state of the indicators for the keyboard +specified by <emphasis> +deviceSpec</emphasis> +. If <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard, a <emphasis> +Keyboard</emphasis> + error results. +</para> + + +<para> +On successful return, the <emphasis> +deviceID</emphasis> + field reports the input extension identifier of the keyboard or <emphasis> +0</emphasis> + if the server does not support the input extension. The <emphasis> +state</emphasis> + return value reports the state of each of the thirty-two indicators on the +specified keyboard. The least-significant bit corresponds to indicator 0, the +most significant bit to indicator 31; if a bit is set, the corresponding +indicator is lit. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetIndicatorMap</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +which: KB_INDICATORMASK + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +which: KB_INDICATORMASK + </entry> + </row> + <row> + <entry role='protoreply'> +realIndicators: KB_INDICATORMASK + </entry> + </row> + <row> + <entry role='protoreply'> +nIndicators: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +maps: LISTofKB_INDICATORMAP</entry> + </row> + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Value</emphasis> +</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns a subset of the maps for the indicators on the keyboard +specified by <emphasis> +deviceSpec</emphasis> +. If <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device, a <emphasis> +Keyboard</emphasis> + error results. +</para> + + +<para> +The <emphasis> +which</emphasis> + field specifies the subset to be returned; a set bit in the which field +indicates that the map for the corresponding indicator should be returned. +</para> + + +<para> +On successful return, the <emphasis> +deviceID</emphasis> + field reports the input extension identifier of the keyboard or <emphasis> +0</emphasis> + if the server does not support the input extension. Any indicators specified +in <emphasis> +realIndicators</emphasis> + are actually present on the keyboard; the rest are virtual indicators. Virtual +indicators do not directly cause any visible or audible effect when they change +state, but they do cause <emphasis> +XkbIndicatorStateNotify</emphasis> + events. +</para> + + +<para> +The <emphasis> +maps</emphasis> + return value reports the requested indicator maps. Indicator maps are +described in <link linkend='Indicator_Maps'>Indicator Maps</link> +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetIndicatorMap</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +which: KB_INDICATORMASK</entry> + </row> + <row> + <entry role='protoname'> +maps: LISTofKB_INDICATORMAP</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Value</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request changes a subset of the maps on the keyboard specified by +<emphasis> +deviceSpec</emphasis> +. If <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device, a <emphasis> +Keyboard</emphasis> + error results. +</para> + + +<para> +The <emphasis> +which</emphasis> + field specifies the subset to be changed; the <emphasis> +maps</emphasis> + field contains the new definitions. +</para> + + +<para> +If successful, the new indicator maps are applied immediately. If any +indicators change state as a result of the new maps, the server generates +<emphasis> +XkbIndicatorStateNotify</emphasis> + events as appropriate. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetNamedIndicator</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +ledClass: KB_LEDCLASSSPEC</entry> + </row> + <row> + <entry role='protoname'> +ledID: KB_IDSPEC</entry> + </row> + <row> + <entry role='protoname'> +indicator: ATOM + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +supported: BOOL + </entry> + </row> + <row> + <entry role='protoreply'> +indicator: ATOM + </entry> + </row> + <row> + <entry role='protoreply'> +found: BOOL + </entry> + </row> + <row> + <entry role='protoreply'> +on: BOOL + </entry> + </row> + <row> + <entry role='protoreply'> +realIndicator: BOOL + </entry> + </row> + <row> + <entry role='protoreply'> +ndx: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +map: KB_INDICATORMAP</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Atom</emphasis> +, <emphasis> +Value</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns information about the indicator specified by <emphasis> +ledClass</emphasis> +, <emphasis> +ledID</emphasis> +, and <emphasis> +indicator</emphasis> + on the keyboard specified by <emphasis> +deviceSpec</emphasis> +. The <emphasis> +indicator</emphasis> + field specifies the name of the indicator for which information is to be +returned. +</para> + + +<para> +If <emphasis> +deviceSpec</emphasis> + does not specify a device with indicators, a <emphasis> +Keyboard</emphasis> + error results. If <emphasis> +ledClass</emphasis> + does not have the value <emphasis> +DfltXIClass</emphasis> +, <emphasis> +LedFeedbackClass</emphasis> +, or <emphasis> +KbdFeedbackClass</emphasis> +, a <emphasis> +Value</emphasis> + error results. If <emphasis> +ledID</emphasis> + does not have the value <emphasis> +DfltXIId</emphasis> + or specify the identifier of a feedback of the class specified by <emphasis> +ledClass</emphasis> + on the device specified by <emphasis> +deviceSpec</emphasis> +, a <emphasis> +Match</emphasis> + error results. If <emphasis> +indicator</emphasis> + is not a valid ATOM other than <emphasis> +None</emphasis> +, an <emphasis> +Atom</emphasis> + error results. +</para> + + +<para> +This request is always supported with default class and identifier on the core +keyboard device. If the request specifies a device other than the core keyboard +device or a feedback class and identifier other than the defaults, and the +server does not support indicator names or indicator maps for extension +devices, the <emphasis> +supported</emphasis> + return value is <emphasis> +False</emphasis> + and the values of the other fields in the reply are undefined. If the client +which issued the unsupported request has also selected to do so, it will also +receive an <emphasis> +XkbExtensionDeviceNotify</emphasis> + event which reports the attempt to use an unsupported feature, in this case +one or both of <emphasis> +XkbXI_IndicatorMaps</emphasis> + or <emphasis> +XkbXI_IndicatorNames</emphasis> +. +</para> + + +<para> +Otherwise, <emphasis> +supported</emphasis> + is <emphasis> +True</emphasis> + and the <emphasis> +deviceID</emphasis> + field reports the input extension identifier of the keyboard or <emphasis> +0</emphasis> + if the server does not support the input extension. The <emphasis> +indicator</emphasis> + return value reports the name for which information was requested and the +<emphasis> +found</emphasis> + return value is <emphasis> +True</emphasis> + if an indicator with the specified name was found on the device. +</para> + + +<para> +If a matching indicator was found: +</para> + +<itemizedlist> +<listitem> + <para>The <emphasis> +on</emphasis> + return value reports the state of the indicator at the time of the request. + </para> +</listitem> +<listitem> + <para>The <emphasis> +realIndicator</emphasis> + return value is <emphasis> +True</emphasis> + if the requested indicator is actually present on the keyboard or <emphasis> +False</emphasis> + if it is virtual. + </para> +</listitem> +<listitem> + <para>The <emphasis> +ndx</emphasis> + return value reports the index of the indicator in the requested feedback. + </para> +</listitem> +<listitem> + <para>The <emphasis> +map</emphasis> + return value reports the indicator map used by to automatically change the +state of the specified indicator in response to changes in keyboard state or +controls. + </para> +</listitem> +</itemizedlist> + +<para> +If no matching indicator is found, the <emphasis> +found</emphasis> + return value is <emphasis> +False</emphasis> +, and the <emphasis> +on</emphasis> +, <emphasis> +realIndicator</emphasis> +, <emphasis> +ndx</emphasis> +, and <emphasis> +map</emphasis> + return values are undefined. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetNamedIndicator</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +ledClass: KB_LEDCLASSSPEC</entry> + </row> + <row> + <entry role='protoname'> +ledID: KB_IDSPEC</entry> + </row> + <row> + <entry role='protoname'> +indicator: ATOM</entry> + </row> + <row> + <entry role='protoname'> +setState: BOOL</entry> + </row> + <row> + <entry role='protoname'> +on: BOOL</entry> + </row> + <row> + <entry role='protoname'> +setMap: BOOL</entry> + </row> + <row> + <entry role='protoname'> +createMap: BOOL</entry> + </row> + <row> + <entry role='protoname'> +map: KB_SETINDICATORMAP</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Atom</emphasis> +, <emphasis> +Access</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request changes various aspects of the indicator specified by <emphasis> +ledClass</emphasis> +, <emphasis> +ledID</emphasis> +, and <emphasis> +indicator</emphasis> + on the keyboard specified by <emphasis> +deviceSpec</emphasis> +. The <emphasis> +indicator</emphasis> + argument specifies the name of the indicator to be updated. +</para> + + +<para> +If <emphasis> +deviceSpec</emphasis> + does not specify a device with indicators, a <emphasis> +Keyboard</emphasis> + error results. If <emphasis> +ledClass</emphasis> + does not have the value <emphasis> +DfltXIClass</emphasis> +, <emphasis> +LedFeedbackClass</emphasis> +, or <emphasis> +KbdFeedbackClass</emphasis> +, a <emphasis> +Value</emphasis> + error results. If <emphasis> +ledID</emphasis> + does not have the value <emphasis> +DfltXIId</emphasis> + or specify the identifier of a feedback of the class specified by <emphasis> +ledClass</emphasis> + on the device specified by <emphasis> +deviceSpec</emphasis> +, a <emphasis> +Match</emphasis> + error results. If <emphasis> +indicator</emphasis> + is not a valid ATOM other than <emphasis> +None</emphasis> +, an <emphasis> +Atom</emphasis> + error results. +</para> + + +<para> +This request is always supported with default class and identifier on the core +keyboard device. If the request specifies a device other than the core keyboard +device or a feedback class and identifier other than the defaults, and the +server does not support indicator names or indicator maps for extension +devices, the <emphasis> +supported</emphasis> + return value is <emphasis> +False</emphasis> + and the values of the other fields in the reply are undefined. If the client +which issued the unsupported request has also selected to do so, it will also +receive an <emphasis> +XkbExtensionDeviceNotify</emphasis> + event which reports the attempt to use an unsupported feature, in this case +one or both of <emphasis> +XkbXI_IndicatorMaps</emphasis> + and <emphasis> +XkbXI_IndicatorNames</emphasis> +. +</para> + + +<para> +Otherwise, <emphasis> +supported</emphasis> + is <emphasis> +True</emphasis> + and the <emphasis> +deviceID</emphasis> + field reports the input extension identifier of the keyboard or <emphasis> +0</emphasis> + if the server does not support the input extension. The <emphasis> +indicator</emphasis> + return value reports the name for which information was requested and the +<emphasis> +found</emphasis> + return value is <emphasis> +True</emphasis> + if an indicator with the specified name was found on the device. +</para> + + +<para> +If no indicator with the specified name is found on the specified device, and +the <emphasis> +createMap</emphasis> + field is <emphasis> +True</emphasis> +, XKB assigns the specified name to the lowest-numbered indicator that has no +name (i.e. whose name is <emphasis> +None</emphasis> +) and applies the rest of the fields in the request to the newly named +indicator. If no unnamed indicators remain, this request reports no error and +has no effect. +</para> + + +<para> +If no matching indicator is found or new indicator assigned this request +reports no error and has no effect. Otherwise, it updates the indicator as +follows: +</para> + + +<para> +If <emphasis> +setMap </emphasis> +is <emphasis> +True</emphasis> +, XKB changes the map for the indicator (see <link linkend='Indicator_Maps'>Indicator Maps</link>) to reflect the +values specified in <emphasis> +map</emphasis> +. +</para> + + +<para> +If <emphasis> +setState</emphasis> + is <emphasis> +True</emphasis> +, XKB attempts to explicitly change the state of the indicator to the state +specified in <emphasis> +on</emphasis> +. The effects of an attempt to explicitly change the state of an indicator +depend on the values in the map for that indicator and are not guaranteed to +succeed. +</para> + + +<para> +If this request affects both indicator map and state, it updates the indicator +map before attempting to change its state, so the success of the explicit +change depends on the indicator map values specified in the request. +</para> + + +<para> +If this request changes the indicator map, it applies the new map immediately +to determine the appropriate state for the indicator given the new indicator +map and the current state of the keyboard. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_Symbolic_Names'> +<title>Querying and Changing Symbolic Names</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetNames</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +which: KB_NAMEDETAILMASK</entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 +which: KB_NAMESMASK +minKeyCode, maxKeyCode: KEYCODE +nTypes: CARD8 +nKTLevels: CARD16 +groupNames: KB_GROUPMASK +virtualMods: KB_VMODMASK +firstKey: KEYCODE +nKeys: CARD8 +indicators: KB_INDICATORMASK +nRadioGroups, nKeyAliases: CARD8 +present: KB_NAMEDETAILMASK +valueList: LISTofITEMs</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Value</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns the symbolic names for various components of the keyboard +mapping for the device specified by <emphasis> +deviceSpec</emphasis> +. The <emphasis> +which</emphasis> + field specifies the keyboard components for which names are to be returned. If +<emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device, a <emphasis> +Keyboard</emphasis> + error results. If any undefined bits in <emphasis> +which</emphasis> + are non-zero, a <emphasis> +Value</emphasis> + error results. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + return value contains the X Input Extension device identifier of the specified +device or <emphasis> +0</emphasis> + if the server does not support the input extension. The <emphasis> +present</emphasis> + and <emphasis> +valueList</emphasis> + return values specify the components for which names are being reported. If a +component is specified in <emphasis> +present</emphasis> +, the corresponding element is present in the <emphasis> +valueList</emphasis> +, otherwise that component has length <emphasis> +0</emphasis> +. The components of the <emphasis> +valueList</emphasis> + appear in the following order, when present:. +</para> + +<informaltable frame='none'> +<?dbfo keep-together="always" ?> +<tgroup cols='3' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='1.0*'/> +<colspec colname='c3' colwidth='1.0*'/> +<thead> + <row rowsep='1'> + <entry>Component</entry> + <entry>Size</entry> + <entry>Type</entry> + </row> +</thead> +<tbody> + <row> + <entry><emphasis> +XkbKeycodesName</emphasis> +</entry> + <entry>1</entry> + <entry> ATOM</entry> + </row> + <row> + <entry><emphasis> +XkbGeometryName</emphasis> +</entry> + <entry>1</entry> + <entry> ATOM</entry> + </row> + <row> + <entry><emphasis> +XkbSymbolsName</emphasis> +</entry> + <entry>1</entry> + <entry> ATOM</entry> + </row> + <row> + <entry><emphasis> +XkbPhysSymbolsName</emphasis> +</entry> + <entry>1</entry> + <entry> ATOM</entry> + </row> + <row> + <entry><emphasis> +XkbTypesName</emphasis> +</entry> + <entry>1</entry> + <entry> ATOM</entry> + </row> + <row> + <entry><emphasis> +XkbCompatName</emphasis> +</entry> + <entry>1</entry> + <entry> ATOM</entry> + </row> + <row> + <entry><emphasis> +XkbKeyTypeNames</emphasis> + </entry> + <entry><emphasis> +nTypes</emphasis> +</entry> + <entry> LISTofATOM</entry> + </row> + <row> + <entry><emphasis> +XkbKTLevelNames</emphasis> + </entry> + <entry><emphasis> +nTypes</emphasis> +, +<emphasis> +nKTLevels</emphasis> +</entry> + <entry>{ count: LISTofCARD8, + names: LISTofATOM }</entry> + </row> + <row> + <entry><emphasis> +XkbIndicatorNames</emphasis> + </entry> + <entry>One per bit set in <emphasis> +indicators</emphasis> +</entry> + <entry> LISTofATOM</entry> + </row> + <row> + <entry><emphasis> +XkbVirtualModNames</emphasis> + </entry> + <entry>One per bit set in <emphasis> +virtualMods</emphasis> +</entry> + <entry> LISTofATOM</entry> + </row> + <row> + <entry><emphasis> +XkbGroupNames </emphasis> +</entry> + <entry>One per bit set in <emphasis> +groupNames</emphasis> +</entry> + <entry> LISTofATOM</entry> + </row> + <row> + <entry><emphasis> +XkbKeyNames</emphasis> +</entry> + <entry><emphasis> +nKeys</emphasis> +</entry> + <entry> LISTofKB_KEYNAME</entry> + </row> + <row> + <entry><emphasis> +XkbKeyAliases</emphasis> +</entry> + <entry><emphasis> +nKeyAliases</emphasis> +</entry> + <entry> LISTofKB_KEYALIAS</entry> + </row> + <row> + <entry><emphasis> +XkbRGNames</emphasis> +</entry> + <entry><emphasis> +nRadioGroups</emphasis> +</entry> + <entry> LISTofATOM</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +If type names are reported, the <emphasis> +nTypes</emphasis> + return value reports the number of types defined for the keyboard, and the +list of key type names in <emphasis> +valueList</emphasis> + has <emphasis> +nTypes</emphasis> + elements. +</para> + + +<para> +If key type level names are reported, the list of key type level names in the +<emphasis> +valueList</emphasis> + has two parts: The <emphasis> +count</emphasis> + array has <emphasis> +nTypes</emphasis> + elements, each of which reports the number of level names reported for the +corresponding key type. The <emphasis> +names</emphasis> + array has <emphasis> +nKTLevels</emphasis> + atoms and reports the names of each type sequentially. The <emphasis> +nKTLevels</emphasis> + return value is always equal to the sum of all of the elements of the +<emphasis> +count</emphasis> + array. +</para> + + +<para> +If indicator names are reported, the <emphasis> +indicators</emphasis> + mask specifies the indicators for which names are defined; any indicators not +specified in <emphasis> +indicators</emphasis> + have the name <emphasis> +None</emphasis> +. The list of indicator names in <emphasis> +valueList</emphasis> + contains the names of the listed indicators, beginning with the +lowest-numbered indicator for which a name is defined and proceeding to the +highest. +</para> + + +<para> +If virtual modifier names are reported, the <emphasis> +virtualMods</emphasis> + mask specifies the virtual modifiers for which names are defined; any virtual +modifiers not specified in <emphasis> +virtualMods</emphasis> + have the name <emphasis> +None</emphasis> +. The list of virtual modifier names in <emphasis> +valueList</emphasis> + contains the names of the listed virtual modifiers, beginning with the +lowest-numbered virtual modifier for which a name is defined and proceeding to +the highest. +</para> + + +<para> +If group names are reported, the <emphasis> +groupNames</emphasis> + mask specifies the groups for which names are defined; any groups not +specified in <emphasis> +groupNames</emphasis> + have the name <emphasis> +None</emphasis> +. The list of group names in <emphasis> +valueList</emphasis> + contains the names of the listed groups, beginning with the lowest-numbered +group for which a name is defined and proceeding to the highest. +</para> + + +<para> +If key names are reported, the <emphasis> +firstKey</emphasis> + and <emphasis> +nKeys</emphasis> + return values specify a range of keys which includes all keys for which names +are defined; any key that does not fall in the range specified by <emphasis> +firstKey</emphasis> + and <emphasis> +nKeys</emphasis> + has the name <emphasis> +NullKeyName</emphasis> +. The list of key names in the <emphasis> +valueList</emphasis> + has <emphasis> +nKeys</emphasis> + entries and specifies the names of the keys beginning at <emphasis> +firstKey</emphasis> +. +</para> + + +<para> +If key aliases are reported, the <emphasis> +nKeyAliases</emphasis> + return value specifies the total number of key aliases defined for the +keyboard. The list of key aliases in <emphasis> +valueList</emphasis> + has <emphasis> +nKeyAliases</emphasis> + entries, each of which reports an alias and the real name of the key to which +it corresponds. +</para> + + +<para> +If radio group names are reported, the <emphasis> +nRadioGroups</emphasis> + return value specifies the number of radio groups on the keyboard for which +names are defined. The list of radio group names in <emphasis> +valueList</emphasis> + reports the names of each group and has <emphasis> +nRadioGroups</emphasis> + entries. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetNames</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoargs'>which: KB_NAMEDETAILMASK</entry> + </row> + <row> + <entry role='protoname'> +virtualMods: KB_VMODMASK</entry> + </row> + <row> + <entry role='protoname'> +firstType, nTypes: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstKTLevel, nKTLevels: CARD8</entry> + </row> + <row> + <entry role='protoname'> +totalKTLevelNames: CARD16</entry> + </row> + <row> + <entry role='protoname'> +indicators: KB_INDICATORMASK</entry> + </row> + <row> + <entry role='protoname'> +groupNames: KB_GROUPMASK</entry> + </row> + <row> + <entry role='protoname'> +nRadioGroups: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstKey: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nKeys, nKeyAliases: CARD8</entry> + </row> + <row> + <entry role='protoname'> +valueList: LISTofITEMs</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Atom</emphasis> +, <emphasis> +Value</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request changes the symbolic names for the requested components of the +keyboard specified by <emphasis> +deviceSpec</emphasis> +. The <emphasis> +which</emphasis> + field specifies the components for which one or more names are to be updated. +If <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device, a <emphasis> +Keyboard</emphasis> + error results. If any undefined bits in <emphasis> +which</emphasis> + are non-zero, a <emphasis> +Value</emphasis> + error results. If any error (other than <emphasis> +Alloc</emphasis> + or <emphasis> +Implementation</emphasis> +) occurs, this request returns without modifying any names. +</para> + + +<para> +The <emphasis> +which</emphasis> + and <emphasis> +valueList</emphasis> + fields specify the components to be changed; the type of each <emphasis> +valueList</emphasis> + entry, the order in which components appear in the <emphasis> +valueList</emphasis> + when specified, and the correspondence between components in <emphasis> +which</emphasis> + and the entries in the <emphasis> +valueList</emphasis> + are as specified for the <emphasis> +XkbGetNames</emphasis> + request. +</para> + + +<para> +If keycodes, geometry, symbols, physical symbols, types or compatibility map +names are to be changed, the corresponding entries in the <emphasis> +valueList</emphasis> + must have the value <emphasis> +None</emphasis> + or specify a valid ATOM, else an <emphasis> +Atom</emphasis> + error occurs. +</para> + + +<para> +If key type names are to be changed, the <emphasis> +firstType</emphasis> + and <emphasis> +nTypes</emphasis> + fields specify a range of types for which new names are supplied, and the list +of key type names in <emphasis> +valueList</emphasis> + has <emphasis> +nTypes</emphasis> + elements. Names for types that fall outside of the range specified by +<emphasis> +firstType</emphasis> + and <emphasis> +nTypes</emphasis> + are not affected. If this request specifies names for types that are not +present on the keyboard, a <emphasis> +Match</emphasis> + error results. All of the type names in the <emphasis> +valueList</emphasis> + must be valid ATOMs or have the value <emphasis> +None</emphasis> +, or an <emphasis> +Atom</emphasis> + error results. +</para> + + +<para> +The names of the first four keyboard types are specified by the XKB extension +and cannot be changed; including any of the canonical types in this request +causes an <emphasis> +Access</emphasis> + error, as does trying to assign the name reserved for a canonical type to one +of the other key types. +</para> + + +<para> +If key type level names are to be changed, the <emphasis> +firstKTLevel</emphasis> + and <emphasis> +nKTLevels</emphasis> + fields specify a range of key types for which new level names are supplied, +and the list of key type level names in the <emphasis> +valueList</emphasis> + has two parts: The <emphasis> +count</emphasis> + array has <emphasis> +nKTLevels</emphasis> + elements, each of which specifies the number of levels for which names are +supplied on the corresponding key type; any levels for which no names are +specified are assigned the name <emphasis> +None</emphasis> +. The <emphasis> +names</emphasis> + array has <emphasis> +totalKTLevels</emphasis> + atoms and specifies the names of each type sequentially. The <emphasis> +totalKTLevels</emphasis> + field must always equal the sum of all of the elements of the <emphasis> +count</emphasis> + array. Level names for types that fall outside of the specified range are not +affected. If this request specifies level names for types that are not present +on the keyboard, or if it specifies more names for a type than the type has +levels, a <emphasis> +Match</emphasis> + error results. All specified type level names must be <emphasis> +None</emphasis> + or a valid ATOM or an <emphasis> +Atom</emphasis> + error results. +</para> + + +<para> +If indicator names are to be changed, the <emphasis> +indicators</emphasis> + mask specifies the indicators for which new names are specified; the names for +indicators not specified in <emphasis> +indicators</emphasis> + are not affected. The list of indicator names in <emphasis> +valueList</emphasis> + contains the new names for the listed indicators, beginning with the +lowest-numbered indicator for which a name is defined and proceeding to the +highest. All specified indicator names must be a valid ATOM or <emphasis> +None</emphasis> +, or an <emphasis> +Atom</emphasis> + error results. +</para> + + +<para> +If virtual modifier names are to be changed, the <emphasis> +virtualMods</emphasis> + mask specifies the virtual modifiers for which new names are specified; names +for any virtual modifiers not specified in <emphasis> +virtualMods</emphasis> + are not affected. The list of virtual modifier names in <emphasis> +valueList</emphasis> + contains the new names for the specified virtual modifiers, beginning with the +lowest-numbered virtual modifier for which a name is defined and proceeding to +the highest. All virtual modifier names must be valid ATOMs or <emphasis> +None</emphasis> +, or an <emphasis> +Atom</emphasis> + error results. +</para> + + +<para> +If group names are to be changed, the <emphasis> +groupNames</emphasis> + mask specifies the groups for which new names are specified; the name of any +group not specified in <emphasis> +groupNames</emphasis> + is not changed. The list of group names in <emphasis> +valueList</emphasis> + contains the new names for the listed groups, beginning with the +lowest-numbered group for which a name is defined and proceeding to the +highest. All specified group names must be a valid ATOM or <emphasis> +None</emphasis> +, or an <emphasis> +Atom</emphasis> + error results. +</para> + + +<para> +If key names are to be changed, the <emphasis> +firstKey</emphasis> + and <emphasis> +nKeys</emphasis> + fields specify a range of keys for which new names are defined; the name of +any key that does not fall in the range specified by <emphasis> +firstKey</emphasis> + and <emphasis> +nKeys</emphasis> + is not changed. The list of key names in the <emphasis> +valueList</emphasis> + has <emphasis> +nKeys</emphasis> + entries and specifies the names of the keys beginning at <emphasis> +firstKey</emphasis> +. +</para> + + +<para> +If key aliases are to be changed, the <emphasis> +nKeyAliases</emphasis> + field specifies the length of a new list of key aliases for the keyboard. The +list of key aliases can only be replaced in its entirety; it cannot be +replaced. The list of key aliases in <emphasis> +valueList</emphasis> + has <emphasis> +nKeyAliases</emphasis> + entries, each of which reports an alias and the real name of the key to which +it corresponds. +</para> + + +<para> +XKB does not check key names or aliases for consistency and validity, so +applications should take care not to assign duplicate names or aliases +</para> + + +<para> +If radio group names are to be changed, the <emphasis> +nRadioGroups</emphasis> + field specifies the length of a new list of radio group names for the +keyboard. There is no way to edit the list of radio group names; it can only be +replaced in its entirety. The list of radio group names in <emphasis> +valueList</emphasis> + reports the names of each group and has <emphasis> +nRadioGroups</emphasis> + entries. If the list of radio group names specifies names for more radio +groups than XKB allows (32), a <emphasis> +Match</emphasis> + error results. All specified radio group names must be valid ATOMs or have the +value <emphasis> +None</emphasis> +, or an <emphasis> +Atom</emphasis> + error results. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_Keyboard_Geometry'> +<title>Querying and Changing Keyboard Geometry</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetGeometry</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC + </entry> + </row> + <row> + <entry role='protoname'> +name: ATOM</entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoname'> +name: ATOM + </entry> + </row> + <row> + <entry role='protoname'> +found: BOOL + </entry> + </row> + <row> + <entry role='protoname'> +widthMM, heightMM: CARD16 + </entry> + </row> + <row> + <entry role='protoname'> +baseColorNdx, labelColorNdx: CARD8 + </entry> + </row> + <row> + <entry role='protoname'> +properties: LISTofKB_PROPERTY + </entry> + </row> + <row> + <entry role='protoname'> +colors: LISTofSTRING8 + </entry> + </row> + <row> + <entry role='protoname'> +shapes: LISTofKB_SHAPE + </entry> + </row> + <row> + <entry role='protoname'> +sections: LISTofKB_SECTION + </entry> + </row> + <row> + <entry role='protoname'> +doodads: LISTofKB_DOODAD + </entry> + </row> + <row> + <entry role='protoname'> +keyAliases: LISTofKB_KEYALIAS</entry> + </row> + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns a description of the physical layout of a keyboard. If the +<emphasis> +name</emphasis> + field has the value <emphasis> +None</emphasis> +, or if name is identical to the name of the geometry for the keyboard +specified by <emphasis> +deviceSpec</emphasis> +, this request returns the geometry of the keyboard specified by <emphasis> +deviceSpec</emphasis> +; otherwise, if <emphasis> +name</emphasis> + is a valid atom other than <emphasis> +None</emphasis> +, the server returns the keyboard geometry description with that name in the +server database of keyboard components (see <link linkend='The_Server_Database_of_Keyboard_Components'>The Server Database of Keyboard +Components</link>) if one exists. If <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device, a <emphasis> +Keyboard</emphasis> + error results. If <emphasis> +name</emphasis> + has a value other than <emphasis> +None</emphasis> + or a valid ATOM, an <emphasis> +Atom</emphasis> + error results. +</para> + + +<para> +On successful return, the <emphasis> +deviceID</emphasis> + field reports the X Input extension identifier of the keyboard device +specified in the request, or <emphasis> +0</emphasis> + if the server does not support the input extension. +</para> + + +<para> +The <emphasis> +found</emphasis> + return value reports whether the requested geometry was available. If +<emphasis> +found</emphasis> + is <emphasis> +False</emphasis> +, no matching geometry was found and the remaining fields in the request reply +are undefined; if <emphasis> +found</emphasis> + is <emphasis> +True</emphasis> +, the remaining fields of the reply describe the requested keyboard geometry. +The interpretation of the components that make up a keyboard geometry is +described in detail in <link linkend='Keyboard_Geometry'>Keyboard +Geometry</link> +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetGeometry</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +name: ATOM</entry> + </row> + <row> + <entry role='protoname'> +widthMM, heightMM, CARD16</entry> + </row> + <row> + <entry role='protoname'> +baseColorNdx, labelColorNdx: CARD8</entry> + </row> + <row> + <entry role='protoname'> +shapes: LISTofKB_SHAPE</entry> + </row> + <row> + <entry role='protoname'> +sections: LISTofKB_SECTION</entry> + </row> + <row> + <entry role='protoname'> +properties: LISTofKB_PROPERTY</entry> + </row> + <row> + <entry role='protoname'> +colors: LISTofSTRING8</entry> + </row> + <row> + <entry role='protoname'> +doodads: LISTofKB_DOODAD</entry> + </row> + <row> + <entry role='protoname'> +keyAliases: LISTofKB_KEYALIAS</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Atom</emphasis> +, <emphasis> +Value</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request changes the reported description of the geometry for the keyboard +specified by <emphasis> +deviceSpec</emphasis> +. If deviceSpec does not specify a valid keyboard device, a <emphasis> +Keyboard</emphasis> + error results. +</para> + + +<para> +The <emphasis> +name</emphasis> + field specifies the name of the new keyboard geometry and must be a valid ATOM +or an <emphasis> +Atom</emphasis> + error results. The new geometry is not added to the server database of +keyboard components, but it can be retrieved using the <emphasis> +XkbGetGeometry</emphasis> + request for as long as it is bound to the keyboard. The keyboard geometry +symbolic name is also updated from the name field, and an <emphasis> +XkbNamesNotify</emphasis> + event is generated, if necessary. +</para> + + +<para> +The list of <emphasis> +colors</emphasis> + must include at least two definitions, or a <emphasis> +Value</emphasis> + error results. All color definitions in the geometry must specify a legal +color (i.e. must specify a valid index for one of the entries of the <emphasis> +colors</emphasis> + list) or a <emphasis> +Match</emphasis> + error results. The <emphasis> +baseColorNdx</emphasis> + and the <emphasis> +labelColorNdx</emphasis> + must be different or a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +The list of <emphasis> +shapes</emphasis> + must include at least one shape definition, or a <emphasis> +Value</emphasis> + error results. If any two shapes have the same name, a <emphasis> +Match</emphasis> + error result. All doodads and keys which specify shape must specify a valid +index for one of the elements of the <emphasis> +shapes</emphasis> + list, or a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +All section, shape and doodad names must be valid ATOMs or an <emphasis> +Atom</emphasis> + error results; the constant <emphasis> +None</emphasis> + is not permitted for any of these components. +</para> + + +<para> +All doodads must be of a known type; XKB does not support "private" doodad +types. +</para> + + +<para> +If, after rotation, any keys or doodads fall outside of the bounding box for a +section, the bounding box is automatically adjusted to the minimum size which +encloses all of its components. +</para> + + +<para> +If, after adjustment and rotation, the bounding box of any section or doodad +extends below zero on either the X or Y axes, the entire geometry is translated +so that the minimum extent along either axis is zero. +</para> + + +<para> +If, after rotation and translation, any keyboard components fall outside of the +rectangle specified by <emphasis> +widthMM</emphasis> + and <emphasis> +heightMM</emphasis> +, the keyboard dimensions are automatically resized to the minimum bounding box +that surrounds all components. Otherwise, the width and height of the keyboard +are left as specified. +</para> + + +<para> +The <emphasis> +under</emphasis> + field of any overlay key definitions must specify a key that is in the section +that contains the overlay key, or a <emphasis> +Match</emphasis> + error results. This request does not check the value of the <emphasis> +over</emphasis> + field of an overlay key definition, so applications must be careful to avoid +conflicts with actual keys. +</para> + + +<para> +This request does not verify that key names or aliases are unique. It also does +not verify that all key names specified in the geometry are bound to some +keycode or that all keys that are named in the keyboard definition are also +available in the geometry. Applications should make sure that keyboard geometry +has no internal conflicts and is consistent with the other components of the +keyboard definition, but XKB does not check for or guarantee it. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_Per_Client_Flags'> +<title>Querying and Changing Per-Client Flags</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbPerClientFlags</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +change: KB_PCFMASK</entry> + </row> + <row> + <entry role='protoname'> +value: KB_PCFMASK</entry> + </row> + <row> + <entry role='protoname'> +ctrlsToChange: KB_BOOLCTRLMASK</entry> + </row> + <row> + <entry role='protoname'> +autoCtrls: KB_BOOLCTRLMASK</entry> + </row> + <row> + <entry role='protoname'> +autoCtrlValues: KB_BOOLCTRLMASK</entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 +supported: KB_PCFMASK +value: KB_PCFMASK +autoCtrls: KB_BOOLCTRLMASK +autoCtrlValues: KB_BOOLCTRLMASK +where: KB_PCFMASK:</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Value</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +Changes the client specific flags for the keyboard specified by <emphasis> +deviceSpec</emphasis> +. Reports a <emphasis> +Keyboard</emphasis> + error if <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device. +</para> + + +<para> +Any flags specified in <emphasis> +change</emphasis> + are set to the corresponding values in <emphasis> +value</emphasis> +, provided that the server supports the requested control. Legal +per-client-flags are: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="always" ?> +<tgroup cols='2' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='1.0*'/> +<thead> + <row rowsep='1'> + <entry>Flag…</entry> + <entry>Described in…</entry> + </row> +</thead> +<tbody> + <row> + <entry><emphasis> +XkbPCF_DetectableAutorepeat</emphasis> +</entry> + <entry><link linkend='Detectable_Autorepeat'>Detectable +Autorepeat</link></entry> + </row> + <row> + <entry><emphasis> +XkbPCF_GrabsUseXKBStateMask</emphasis> +</entry> + <entry><link linkend='Setting_a_Passive_Grab_for_an_XKB_State'>Setting a Passive Grab +for an XKB State</link></entry> + </row> + <row> + <entry><emphasis> +XkbPCF_AutoResetControlsMask</emphasis> +</entry> + <entry><link linkend='Automatic_Reset_of_Boolean_Controls'>Automatic Reset of +Boolean Controls</link></entry> + </row> + <row> + <entry><emphasis> +XkbPCF_LookupStateWhenGrabbed</emphasis> +</entry> + <entry><link linkend='Effects_of_XKB_on_Core_Protocol_Events'>Effects of XKB on Core +Protocol Events</link></entry> + </row> + <row> + <entry><emphasis> +XkbPCF_SendEventUsesXKBState</emphasis> +</entry> + <entry><link linkend='Sending_Events_to_Clients'>Sending Events to +Clients</link></entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +If <emphasis> +PCF_AutoResetControls</emphasis> + is set in both <emphasis> +change</emphasis> + and <emphasis> +value</emphasis> +, the client’s mask of controls to be changed is updated from <emphasis> +ctrlsToChange</emphasis> +, <emphasis> +autoCtrls</emphasis> +, and <emphasis> +autoCtrlValues</emphasis> +. Any controls specified in <emphasis> +ctrlsToChange</emphasis> + are modified in the auto-reset controls mask for the client; the corresponding +bits from the <emphasis> +autoCtrls</emphasis> + field are copied into the auto-reset controls mask and the corresponding bits +from <emphasis> +autoCtrlValues</emphasis> + are copied into the auto-reset controls state values. If any controls are +specified in <emphasis> +autoCtrlValues</emphasis> + but not in <emphasis> +autoCtrls</emphasis> +, a <emphasis> +Match</emphasis> + error results. If any controls are specified in <emphasis> +autoCtrls</emphasis> + but not in <emphasis> +ctrlsToChange</emphasis> +, a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +If <emphasis> +PCF_AutoResetControls</emphasis> + is set in <emphasis> +change</emphasis> + but not in <emphasis> +value</emphasis> +, the client’s mask of controls to be changed is reset to all zeroes (i.e. +the client does not change any controls when it exits). +</para> + + +<para> +This request reports a <emphasis> +Match</emphasis> + error if a bit is set in any of the value masks but not in the control mask +that governs it or a <emphasis> +Value</emphasis> + error if any undefined bits are set in any of the masks. +</para> + + +<para> +On successful return, the <emphasis> +deviceID</emphasis> + field reports the X Input extension identifier of the keyboard, or <emphasis> +0</emphasis> + if the server does not support the X Input Extension. +</para> + + +<para> +The <emphasis> +supported</emphasis> + return value reports the set of per-client flags that are supported by the +server; in this version of XKB, only the <emphasis> +XkbPCF_DetectableAutorepeat</emphasis> + per-client flag is optional; all other per-client flags must be supported. +</para> + + +<para> +The <emphasis> +value</emphasis> + return value reports the current settings of all per-client flags for the +specified keyboard. The <emphasis> +autoCtrls</emphasis> + return value reports the current set of controls to be reset when the client +exits, while the <emphasis> +autoCtrlValues</emphasis> + return value reports the state to which they should be set. +</para> + + +</sect2> +<sect2 id='Using_the_Servers_Database_of_Keyboard_Components'> +<title>Using the Server’s Database of Keyboard Components</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbListComponents</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +maxNames: CARD16</entry> + </row> + <row> + <entry role='protoname'> +keymapsSpec: STRING8</entry> + </row> + <row> + <entry role='protoname'> +keycodesSpec: STRING8</entry> + </row> + <row> + <entry role='protoname'> +typesSpec: STRING8</entry> + </row> + <row> + <entry role='protoname'> +compatMapSpec: STRING8</entry> + </row> + <row> + <entry role='protoname'> +symbolsSpec: STRING8</entry> + </row> + <row> + <entry role='protoname'> +geometrySpec: STRING8 + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +extra: CARD16 + </entry> + </row> + <row> + <entry role='protoreply'> +keymaps,keycodes,types,compatMaps: LISTofKB_COMPONENTNAME + </entry> + </row> + <row> + <entry role='protoreply'> +symbols, geometries: LISTofKB_COMPONENTNAME</entry> + </row> + <row> + <entry role='protoreply'>Where:</entry> + </row> + <row> + <entry role='protoreply'>KB_COMPONENTNAME { hints: CARD8, name: +STRING8 }</entry> + </row> + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + </tbody> + </tgroup> +</informaltable> + +<para> +This request returns one or more lists of keyboard components that are +available from the X server database of keyboard components for the device +specified by <emphasis> +deviceSpec</emphasis> +. The X server is allowed, but not required or expected, to maintain separate +databases for each keyboard device. A <emphasis> +Keyboard</emphasis> + error results if <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device. +</para> + + +<para> +The <emphasis> +maxNames</emphasis> + field specifies the maximum number of component names to be reported, in +total, by this request. +</para> + + +<para> +The <emphasis> +keymapsSpec</emphasis> +, <emphasis> +keycodesSpec</emphasis> +, <emphasis> +typesSpec</emphasis> +, <emphasis> +compatMapSpec</emphasis> +, <emphasis> +symbolsSpec</emphasis> + and <emphasis> +geometrySpec</emphasis> + request fields specify a pattern to be matched against the names of all +components of the corresponding type in the server database of keyboard +components. +</para> + + +<para> +Each pattern uses the ISO Latin-1 encoding and should contain only parentheses, +the wildcard characters "?" and "*" or characters that are permitted in a +component class or member name (see <link linkend='Component_Names'>Component Names</link>). Illegal +characters in a pattern are simply ignored; no error results if a pattern +contains illegal characters. +</para> + + +<para> +Comparison is case-sensitive and, in a pattern, the "?" wildcard character +matches any single character except parentheses while the "*" character matches +any number of characters except parentheses. If an implementation accepts +characters other than those required by XKB, whether or not those characters +match either wildcard is also implementation dependent. An empty pattern does +not match any component names. +</para> + + +<para> +On successful return, the <emphasis> +deviceID</emphasis> + return value reports the X Input Extension device identifier of the specified +device, or <emphasis> +0</emphasis> + if the server does not support the X input extension. The <emphasis> +extra</emphasis> + return value reports the number of matching component names that could not be +returned due to the setting of the <emphasis> +maxNames</emphasis> + field in the request. +</para> + + +<para> +The <emphasis> +keymaps</emphasis> +, <emphasis> +keycodes</emphasis> +, <emphasis> +types</emphasis> +, <emphasis> +compatMaps</emphasis> +, <emphasis> +symbols</emphasis> + and <emphasis> +geometries</emphasis> + return the hints (see <link linkend='Component_Hints'>Component +Hints</link>) and names of any components from the server database that match +the corresponding pattern. +</para> + + +<para> +<link linkend='The_Server_Database_of_Keyboard_Components'>The Server Database of Keyboard +Components</link> describes the X server database of keyboard components in +more detail. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetKbdByName</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +need, want: KB_GBNDETAILMASK</entry> + </row> + <row> + <entry role='protoname'> +load: BOOL</entry> + </row> + <row> + <entry role='protoname'> +keymapsSpec: STRING8</entry> + </row> + <row> + <entry role='protoname'> +keycodesSpec, typesSpec: STRING8</entry> + </row> + <row> + <entry role='protoname'> +compatMapSpec, symbolsSpec: STRING8</entry> + </row> + <row> + <entry role='protoname'> +geometrySpec: STRING8 + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +minKeyCode, maxKeyCode: KEYCODE + </entry> + </row> + <row> + <entry role='protoreply'> +loaded, newKeyboard: BOOL + </entry> + </row> + <row> + <entry role='protoreply'> +found, reported: KB_GBNDETAILMASK + </entry> + </row> + <row> + <entry role='protoreply'> +map: optional <emphasis> +XkbGetMap</emphasis> + reply + </entry> + </row> + <row> + <entry role='protoreply'> +compat: optional <emphasis> +XkbGetCompatMap</emphasis> + reply + </entry> + </row> + <row> + <entry role='protoreply'> +indicators: optional <emphasis> +XkbGetIndicatorMap</emphasis> + reply + </entry> + </row> + <row> + <entry role='protoreply'> +names: optional <emphasis> +XkbGetNames</emphasis> + reply + </entry> + </row> + <row> + <entry role='protoreply'> +geometry: optional <emphasis> +XkbGetGeometry</emphasis> + reply</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Keyboard</emphasis> +, <emphasis> +Access</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +Assembles and returns a keymap from the current mapping and specified elements +from the server database of keymap components for the keyboard specified by +<emphasis> +deviceSpec</emphasis> +, and optionally replaces the current keyboard mapping with the newly generated +description. If <emphasis> +deviceSpec</emphasis> + does not specify a valid keyboard device, a <emphasis> +Keyboard</emphasis> + error results. +</para> + + +<para> +The <emphasis> +keymapsSpec</emphasis> +, <emphasis> +keycodesSpec</emphasis> +, <emphasis> +typesSpec</emphasis> +, <emphasis> +compatMapSpec</emphasis> +, <emphasis> +symbolsSpec</emphasis> + and <emphasis> +geometrySpec</emphasis> + component expressions (see <link linkend='Partial_Components_and_Combining_Multiple_Components'> +Partial Components and Combining Multiple Components</link>) specify the +database components to be used to assemble the keyboard description. +</para> + + +<para> +The <emphasis> +want</emphasis> + field lists the pieces of the keyboard description that the client wants to +have reported for the newly constructed keymap. The <emphasis> +need</emphasis> + field lists all of the pieces that must be reported. If any of the pieces in +<emphasis> +need</emphasis> + cannot be loaded from the specified names, no description of the keyboard is +returned. +</para> + + +<para> +The <emphasis> +want</emphasis> + and <emphasis> +need</emphasis> + fields can include any combinations of these <emphasis> +XkbGetMapByName</emphasis> + (GBN) components: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="always" ?> +<tgroup cols='3' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='1.0*'/> +<colspec colname='c3' colwidth='1.0*'/> +<thead> + <row rowsep='1'> + <entry>XkbGetMapByName Keyboard Component…</entry> + <entry>Database Component…</entry> + <entry>Components of Keyboard Description</entry> + </row> +</thead> +<tbody> + <row> + <entry><emphasis> +XkbGBN_Types</emphasis> +</entry> + <entry>types</entry> + <entry>key types</entry> + </row> + <row> + <entry><emphasis> +XkbGBN_CompatMap</emphasis> +</entry> + <entry>compat</entry> + <entry>symbol interpretations, group compatibility map</entry> + </row> + <row> + <entry><emphasis> +XkbGBN_ClientSymbols</emphasis> +</entry> + <entry>symbols, types, keycodes</entry> + <entry>key types, key symbol mappings, modifier mapping</entry> + </row> + <row> + <entry><emphasis> +XkbGBN_ServerSymbols</emphasis> +</entry> + <entry>symbols, types, keycodes</entry> + <entry>key behaviors, key actions, key explicit components, virtual +modifiers, virtual modifier mapping</entry> + </row> + <row> + <entry><emphasis> +XkbGBN_IndicatorMap</emphasis> +</entry> + <entry>compat</entry> + <entry>indicator maps, indicator names</entry> + </row> + <row> + <entry><emphasis> +XkbGBN_KeyNames</emphasis> +</entry> + <entry>keycodes</entry> + <entry>key names, key aliases</entry> + </row> + <row> + <entry><emphasis> +XkbGBN_Geometry</emphasis> +</entry> + <entry>geometry</entry> + <entry>keyboard geometry</entry> + </row> + <row> + <entry><emphasis> +XkbGBN_OtherNames</emphasis> +</entry> + <entry>all</entry> + <entry>key types, symbol interpretations, indicator maps, names, +geometry</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +If either field contains a GBN component that depends on some database +component for which the request does not supply an expression, XKB +automatically substitutes the special pattern "%" which copies the +corresponding component from the current keyboard description, as described in +<link linkend='Partial_Components_and_Combining_Multiple_Components'>Partial Components and Combining +Multiple Components</link>. +</para> + + +<para> +The <emphasis> +load</emphasis> + flag asks the server to replace the current keyboard description for <emphasis> +deviceSpec</emphasis> + with the newly constructed keyboard description. If <emphasis> +load</emphasis> + is <emphasis> +True</emphasis> +, the request must include component expressions for all of the database +components; if any are missing, XKB substitutes "%" as described above. +</para> + + +<para> +If all necessary components are both specified and found, the new keyboard +description is loaded. If the new keyboard description has a different geometry +or keycode range than the previous keyboard description, XKB sends <emphasis> +XkbNewKeyboardNotify</emphasis> + events to all interested clients. See +<link linkend='Replacing_the_Keyboard_On_the_Fly'>Replacing the Keyboard +"On-the-Fly"</link> for more information about the effects of replacing the +keyboard description on the fly. +</para> + + +<para> +If the range of keycodes changes, clients that have requested <emphasis> +XkbNewKeyboardNotify</emphasis> + events are not sent any other change notification events by this request. +Clients that do not request <emphasis> +XkbNewKeyboardNotify</emphasis> + events are sent other XKB change notification events (e.g. <emphasis> +XkbMapNotify</emphasis> +, <emphasis> +XkbNamesNotify</emphasis> +) as necessary to alert them to as many of the keyboard changes as possible. +</para> + + +<para> +If no error occurs, the request reply reports the GBN components that were +found and sends a description of any of the resulting keyboard that includes +and of the components that were requested. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + return value reports the X Input extension device identifier of the keyboard +that was used, or <emphasis> +0</emphasis> + if the server does not support the X input extension. +</para> + + +<para> +The <emphasis> +minKeyCode</emphasis> + and <emphasis> +maxKeyCode</emphasis> + return values report the legal range of keycodes for the keyboard description +that was created. If the resulting keyboard description does not include at +least one of the key names, client symbols or server symbols components, +<emphasis> +minKeyCode</emphasis> + and <emphasis> +maxKeyCode</emphasis> + are both <emphasis> +0</emphasis> +. +</para> + + +<para> +The <emphasis> +loaded</emphasis> + return value reports whether or not the existing keyboard definition was +replaced with the newly created one. If <emphasis> +loaded</emphasis> + is <emphasis> +True</emphasis> +, the <emphasis> +newKeyboard</emphasis> + return value reports whether or not the new map changed the geometry or range +of keycodes and caused <emphasis> +XkbNewKeyboardNotify</emphasis> + events for clients that have requested them. +</para> + + +<para> +The <emphasis> +found</emphasis> + return value reports the GBN components that were present in the keymap that +was constructed by this request. The <emphasis> +reported</emphasis> + return value lists the subset of those components for which descriptions +follow. if any of the components specified in the <emphasis> +need</emphasis> + field of the request were not found, <emphasis> +reported</emphasis> + is empty, otherwise it contains the intersection of the <emphasis> +found</emphasis> + return value with the union of the <emphasis> +need</emphasis> + and <emphasis> +want</emphasis> + request fields. +</para> + + +<para> +If any of <emphasis> +GBN_Types</emphasis> +, <emphasis> +GBN_ClientSymbols</emphasis> + or <emphasis> +GBN_ServerSymbols</emphasis> + are set in <emphasis> +reported</emphasis> +, the <emphasis> +map</emphasis> + return value has the same format as the reply to an <emphasis> +XkbGetMap</emphasis> + request and reports the corresponding pieces of the newly constructed keyboard +description. +</para> + + +<para> +If <emphasis> +GBN_CompatMap</emphasis> + is set in <emphasis> +reported</emphasis> +, the <emphasis> +compat</emphasis> + return value has the same format as the reply to an <emphasis> +XkbGetCompatMap</emphasis> + request and reports the symbol interpretations and group compatibility map for +the newly constructed keyboard description. +</para> + + +<para> +If <emphasis> +GBN_IndicatorMap</emphasis> + is set in <emphasis> +reported</emphasis> +, the <emphasis> +indicators</emphasis> + return value has the same format as the reply to an <emphasis> +XkbGetIndicatorMap</emphasis> + request and reports the physical indicators and indicator maps for the newly +constructed keyboard description. +</para> + + +<para> +If <emphasis> +GBN_KeyNames</emphasis> + or <emphasis> +GBN_OtherNames</emphasis> + are set in <emphasis> +reported</emphasis> +, the <emphasis> +names</emphasis> + return value has the same format as the reply to an <emphasis> +XkbGetNames</emphasis> + reply and reports the corresponding set of symbolic names for the newly +constructed keyboard description. +</para> + + +<para> +If <emphasis> +GBN_Geometry</emphasis> + is set in <emphasis> +reported</emphasis> +, the <emphasis> +geometry</emphasis> + return value has the same format as the reply to an <emphasis> +XkbGetGeometryMap</emphasis> + request and reports the keyboard geometry for the newly constructed keyboard +description. +</para> + + +</sect2> +<sect2 id='Querying_and_Changing_Input_Extension_Devices'> +<title>Querying and Changing Input Extension Devices</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbGetDeviceInfo</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +wanted: KB_XIDEVFEATUREMASK</entry> + </row> + <row> + <entry role='protoname'> +ledClass: KB_LEDCLASSSPEC</entry> + </row> + <row> + <entry role='protoname'> +ledID: KB_IDSPEC</entry> + </row> + <row> + <entry role='protoname'> +allButtons: BOOL</entry> + </row> + <row> + <entry role='protoname'> +firstButton, nButtons: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +deviceID: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +present: KB_XIDEVFEATUREMASK + </entry> + </row> + <row> + <entry role='protoreply'> +supported: KB_XIFEATUREMASK + </entry> + </row> + <row> + <entry role='protoreply'> +unsupported: KB_XIFEATUREMASK + </entry> + </row> + <row> + <entry role='protoreply'> +firstBtnWanted: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +nBtnsWanted: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +firstBtnRtrn: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +nBtnsRtrn: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +totalBtns: CARD8 + </entry> + </row> + <row> + <entry role='protoreply'> +hasOwnState: BOOL + </entry> + </row> + <row> + <entry role='protoreply'> +dfltKbdFB, dfltLedFB: KB_IDSPEC + </entry> + </row> + <row> + <entry role='protoreply'> +devType: ATOM + </entry> + </row> + <row> + <entry role='protoreply'> +name: STRING + </entry> + </row> + <row> + <entry role='protoreply'> +btnActions: LISTofKB_ACTION + </entry> + </row> + <row> + <entry role='protoreply'> +leds: LISTofKB_DEVICELEDINFO</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Device</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Access</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +Reports a subset of the XKB-supplied information about the input device +specified by <emphasis> +deviceSpec</emphasis> +. Unlike most XKB requests, the device specified for <emphasis> +XkbGetDeviceInfo</emphasis> + need not be a keyboard device. Nonetheless, a <emphasis> +Keyboard</emphasis> + error results if <emphasis> +deviceSpec</emphasis> + does not specify a valid core or input extension device. +</para> + + +<para> +The <emphasis> +wanted</emphasis> + field specifies the types of information to be returned, and controls the +interpretation of the other request fields. +</para> + + +<para> +If the server does not support assignment of XKB actions to extension device +buttons, the <emphasis> +allButtons</emphasis> +, <emphasis> +firstButton</emphasis> + and <emphasis> +nButtons</emphasis> + fields are ignored. +</para> + + +<para> +Otherwise, if the <emphasis> +XkbXI_ButtonActions</emphasis> + flag is set in <emphasis> +wanted</emphasis> +, the <emphasis> +allButtons</emphasis> +, <emphasis> +firstButton</emphasis> + and <emphasis> +nButtons</emphasis> + fields specify the device buttons for which actions should be returned. +Setting <emphasis> +allButtons</emphasis> + to <emphasis> +True</emphasis> + requests actions for all device buttons; if <emphasis> +allButtons</emphasis> + is <emphasis> +False</emphasis> +, <emphasis> +firstButton</emphasis> + and <emphasis> +nButtons</emphasis> + specify a range of buttons for which actions are requested. If the device has +no buttons or if <emphasis> +firstButton</emphasis> + and <emphasis> +nButtons</emphasis> + specify illegal buttons, a <emphasis> +Match</emphasis> + error results. If <emphasis> +allButtons</emphasis> + is <emphasis> +True</emphasis> +, <emphasis> +firstButton</emphasis> + and <emphasis> +nButtons</emphasis> + are ignored. +</para> + + +<para> +If the server does not support XKB access to any aspect of the indicators on +extension devices, or if the <emphasis> +wanted</emphasis> + field does not include any of the indicator flags, the <emphasis> +ledClass</emphasis> + and <emphasis> +ledID</emphasis> + fields are ignored. Otherwise, <emphasis> +ledClass</emphasis> + and <emphasis> +ledID</emphasis> + specify one or more feedback(s) for which indicator information is requested. +If <emphasis> +ledClass</emphasis> + or <emphasis> +ledID</emphasis> + have illegal values, a <emphasis> +Value</emphasis> + error results. If they have legal values but do not specify a keyboard or +indicator class feedback for the device in question, a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +The <emphasis> +ledClass</emphasis> + field can specify either <emphasis> +KbdFeedbackClass</emphasis> +, <emphasis> +LedFeedbackClass</emphasis> +, <emphasis> +XkbDfltXIClass</emphasis> +, or <emphasis> +XkbAllXIClasses</emphasis> +. If at least one keyboard feedback is defined for the specified device, +<emphasis> +XkbDfltXIClass</emphasis> + is equivalent to <emphasis> +KbdFeedbackClass</emphasis> +, otherwise it is equivalent to <emphasis> +LedFeedbackClass</emphasis> +. If <emphasis> +XkbAllXIClasses</emphasis> + is specified, this request returns information about both indicator and +keyboard class feedbacks which match the requested identifier, as described +below. +</para> + + +<para> +The <emphasis> +ledID</emphasis> + field can specify any valid input extension feedback identifier, <emphasis> +XkbDfltXIId</emphasis> +, or <emphasis> +XkbAllXIIds</emphasis> +. The default keyboard feedback is the one that is affected by core protocol +requests; the default led feedback is implementation-specific. If <emphasis> +XkbAllXIIds</emphasis> + is specified, this request returns indicator information about all feedbacks +of the class(es) specified by <emphasis> +ledClass</emphasis> +. +</para> + + +<para> +If no error results, the <emphasis> +deviceID</emphasis> + return value reports the input extension device identifier of the device for +which values are being returned. The <emphasis> +supported</emphasis> + return value reports the set of optional XKB extension device features that +are supported by this implementation (see +<link linkend='Interactions_Between_XKB_and_the_X_Input_Extension'> +Interactions Between XKB and the X Input +Extension</link>) for the specified device, and the unsupported return value +reports any <emphasis> +unsupported</emphasis> + features. +</para> + + +<para> +If <emphasis> +hasOwnState</emphasis> + is <emphasis> +True</emphasis> +, the device is also a keyboard, and any indicator maps bound to the device use +the current state and control settings for this device to control automatic +changes. If <emphasis> +hasOwnState</emphasis> + is <emphasis> +False</emphasis> +, the state and control settings of the core keyboard device control automatic +indicator changes. +</para> + + +<para> +The <emphasis> +name</emphasis> + field reports the X Input Extension name for the device. The <emphasis> +devType</emphasis> + field reports the X Input Extension device type. Both fields are provided +merely for convenience and are not interpreted by XKB. +</para> + + +<para> +The <emphasis> +present</emphasis> + return value reports the kinds of device information being returned, and +controls the interpretation of the remaining fields. The <emphasis> +present</emphasis> + field consists of the <emphasis> +wanted</emphasis> + field from the original request minus the flags for any unsupported features. +</para> + + +<para> +If <emphasis> +XkbXI_ButtonActions</emphasis> + is set in <emphasis> +present</emphasis> +, the <emphasis> +totalBtns</emphasis> + return value reports the total number of buttons present on the device, +<emphasis> +firstBtnWanted</emphasis> + and <emphasis> +nBtnsWanted</emphasis> + specify the range of buttons for which actions were requested, and the +<emphasis> +firstBtnRtrn</emphasis> + and <emphasis> +nBtnsRtrn </emphasis> +values specify the range of buttons for which actions are reported. The +<emphasis> +actionsRtrn</emphasis> + list has <emphasis> +nButtonsRtrn</emphasis> + entries which contain the actions bound to the specified buttons on the +device. Any buttons for which actions were requested but not returned have the +action <emphasis> +NoAction()</emphasis> +. +</para> + + +<para> +If any indicator information is reported, the leds list contains one element +for each requested feedback. For example, if <emphasis> +ledClass</emphasis> + is <emphasis> +XkbAllXIClasses</emphasis> + and <emphasis> +ledID</emphasis> + is <emphasis> +XkbAllXIIds</emphasis> +, <emphasis> +leds</emphasis> + describes all of the indicators on the device and has one element for each +keyboard or led class feedback defined for the device. If any information at +all is reported about a feedback, the set of physical indicators is also +reported in the <emphasis> +physIndicators</emphasis> + field of the corresponding element of <emphasis> +leds</emphasis> +. +</para> + + +<para> +If the server supports assignment of indicator maps to extension device +indicators, and if the <emphasis> +XkbXI_IndicatorMaps</emphasis> + flag is set in <emphasis> +wanted</emphasis> +, each member of <emphasis> +leds</emphasis> + reports any indicators on the corresponding feedback to which names have been +assigned. Any indicators for which no map is reported have the default map, +which allows explicit changes and does not request any automatic changes. +</para> + + +<para> +If the server supports assignment of indicator names to extension device +indicators, and the <emphasis> +XkbXI_IndicatorNames</emphasis> + flag is set in <emphasis> +wanted</emphasis> +, each member of <emphasis> +leds</emphasis> + reports any indicators on the corresponding feedback to which names have been +assigned. Any indicators for which no name is reported have the name <emphasis> +None</emphasis> +. +</para> + + +<para> +If the server supports XKB access to the state of extension device indicators, +and the <emphasis> +XkbXI_IndicatorState</emphasis> + flag is set in wanted, each member of leds reports the state of the indicators +on the corresponding feedback. +</para> + + +<para> +If any unsupported features are requested, and the requesting client has +selected for them, the server sends the client an <emphasis> +XkbExtensionDeviceNotify</emphasis> + event which indicates that an unsupported feature was requested. This event is +only generated if the client which issued the unsupported request has selected +for it and, if generated, is not sent to any other clients. +</para> + + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetDeviceInfo</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>deviceSpec: KB_DEVICESPEC</entry> + </row> + <row> + <entry role='protoname'> +change: KB_XIDEVFEATUREMASK</entry> + </row> + <row> + <entry role='protoname'> +firstBtn, nBtns: CARD8</entry> + </row> + <row> + <entry role='protoname'> +btnActions:LISTofKB_ACTION</entry> + </row> + <row> + <entry role='protoname'> +leds: LISTofKB_DEVICELEDINFO</entry> + </row> + + <row> + <entry role='protoerror'>Errors: <emphasis> +Device</emphasis> +, <emphasis> +Match</emphasis> +, <emphasis> +Access</emphasis> +, <emphasis> +Alloc</emphasis> +</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +Changes a subset of the XKB-supplied information about the input device +specified by <emphasis> +deviceSpec</emphasis> +. Unlike most XKB requests, the device specified for <emphasis> +XkbGetDeviceInfo</emphasis> + need not be a keyboard device. Nonetheless, a <emphasis> +Keyboard</emphasis> + error results if <emphasis> +deviceSpec</emphasis> + does not specify a valid core or input extension device +</para> + + +<para> +The <emphasis> +change</emphasis> + field specifies the features for which new values are supplied, and controls +the interpretation of the other request fields. +</para> + + +<para> +If the server does not support assignment of XKB actions to extension device +buttons, the <emphasis> +firstButton</emphasis> + and <emphasis> +nButtons</emphasis> + fields are ignored. +</para> + + +<para> +Otherwise, if the <emphasis> +XkbXI_ButtonActions</emphasis> + flag is set in <emphasis> +change</emphasis> +, the <emphasis> +firstBtn</emphasis> + and <emphasis> +nBtns</emphasis> + fields specify a range of buttons for which actions are specified in this +request. If the device has no buttons or if <emphasis> +firstBtn</emphasis> + and <emphasis> +nBtns</emphasis> + specify illegal buttons, a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +Each element of the <emphasis> +leds</emphasis> + list describes the changes for a single keyboard or led feedback. If the +<emphasis> +ledClass</emphasis> + field of any element of <emphasis> +leds</emphasis> + contains any value other than <emphasis> +KbdFeedbackClass</emphasis> +, <emphasis> +LedFeedbackClass</emphasis> + or <emphasis> +XkbDfltXIClass</emphasis> +, a <emphasis> +Value</emphasis> + error results. If the <emphasis> +ledId</emphasis> + field of any element of leds contains any value other than a valid input +extension feedback identifier or <emphasis> +XkbDfltXIId</emphasis> +, a <emphasis> +Value</emphasis> + error results. If both fields are valid, but the device has no matching +feedback, a <emphasis> +Match</emphasis> + error results. +</para> + + +<para> +The fields of each element of <emphasis> +leds</emphasis> + are interpreted as follows: +</para> + +<itemizedlist> +<listitem> + <para>If <emphasis> +XkbXI_IndicatorMaps</emphasis> + is set in <emphasis> +change</emphasis> + and the server supports XKB assignment of indicator maps to the corresponding +feedback, the maps for all indicators on the corresponding feedback are taken +from <emphasis> +leds</emphasis> +. If the server does not support this feature, any maps specified in <emphasis> +leds</emphasis> + are ignored. + </para> +</listitem> +<listitem> + <para>If <emphasis> +XkbXI_IndicatorNames</emphasis> + is set in <emphasis> +change</emphasis> +, and the server supports XKB assignment of names to indicators for the +corresponding feedback, the names for all indicators on the corresponding +feedback are taken from <emphasis> +leds</emphasis> +. If the server does not support this feature, any names specified in <emphasis> +leds</emphasis> + are ignored. Regardless of whether they are used, any names be a valid Atom or +<emphasis> +None</emphasis> +, or an <emphasis> +Atom</emphasis> + error results. + </para> +</listitem> +<listitem> + <para>If <emphasis> +XkbXI_IndicatorState</emphasis> + is set in change, and the server supports XKB changes to extension device +indicator state, the server attempts to change the indicators on the +corresponding feedback as specified by <emphasis> +leds</emphasis> +. Any indicator maps bound to the feedback are applied, so state changes might +be blocked or have side-effects. + </para> +</listitem> +</itemizedlist> + +<para> +If any unsupported features are requested, and the requesting client has +selected for them, the server sends the client an <emphasis> +XkbExtensionDeviceNotify</emphasis> + event which indicates that an unsupported feature was requested. This event is +only generated if the client which issued the unsupported request has selected +for it and, if generated, is not sent to any other clients. +</para> + + +</sect2> +<sect2 id='Debugging_the_X_Keyboard_Extension'> +<title>Debugging the X Keyboard Extension</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbSetDebuggingFlags</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>affectFlags, flags: CARD32</entry> + </row> + <row> + <entry role='protoname'> +affectCtrls, ctrls: CARD32</entry> + </row> + <row> + <entry role='protoname'> +message: STRING + </entry> + </row> + <row> + <entry role='protoreply'> +currentFlags, supportedFlags: CARD32 + </entry> + </row> + <row> + <entry role='protoreply'> +currentCtrls, supportedCtrls: CARD32</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +This request sets up various internal XKB debugging flags and controls. It is +intended for developer use and may be disabled in production servers. If +disabled, <emphasis> +XkbSetDebuggingFlags</emphasis> + has no effect but returns <emphasis> +Success</emphasis> +. +</para> + + +<para> +The <emphasis> +affectFlags</emphasis> + field specifies the debugging flags to be changed, the <emphasis> +flags</emphasis> + field specifies new values for the changed flags. The interpretation of the +debugging flags is implementation-specific, but flags are intended to control +debugging output and should not otherwise affect the operation of the server. +</para> + + +<para> +The <emphasis> +affectCtrls</emphasis> + field specifies the debugging controls to be changed, the <emphasis> +ctrls</emphasis> + field specifies new values for the changed controls. The interpretation of the +debugging controls is implementation-specific, but debugging controls are +allowed to affect the behavior of the server. +</para> + + +<para> +The <emphasis> +message</emphasis> + field provides a message that the X server can print in any logging or +debugging files before changing the flags. The server must accept this field +but it is not required to actually display it anywhere. +</para> + + +<para> +The X Test Suite makes some assumptions about the implementation of locking +modifier keys that do not apply when XKB is present. The <emphasis> +XkbDF_DisableLocks</emphasis> + debugging control provides a simple workaround to these test suite problems by +simply disabling all locking keys. If <emphasis> +XkbDF_DisableLocks</emphasis> + is enabled, the <emphasis> +SA_LockMods</emphasis> + and <emphasis> +SA_LockGroup</emphasis> + actions behave like <emphasis> +SA_SetMods</emphasis> + and <emphasis> +SA_LockMods</emphasis> +, respectively. If it is disabled, <emphasis> +SA_LockMods</emphasis> + and <emphasis> +SA_LockGroup</emphasis> + actions behave normally. +</para> + + +<para> +Implementations are free to ignore the <emphasis> +XkbDF_DisableLocks</emphasis> + debugging control or to define others. +</para> + + +<para> +The <emphasis> +currentFlags</emphasis> + return value reports the current setting for the debugging flags, if +applicable. The <emphasis> +currentCtrls</emphasis> + return value reports the setting for the debugging controls, if applicable. +The <emphasis> +supportedFlags</emphasis> + and <emphasis> +supportedCtrls</emphasis> + fields report the flags and controls that are recognized by the +implementation. Attempts to change unsupported fields or controls are silently +ignored. +</para> + + +<para> +If the <emphasis> +XkbSetDebuggingFlags</emphasis> + request contains more data than expected, the server ignores the extra data, +but no error results. If the request has less data than expected, a <emphasis> +Length</emphasis> + error results. +</para> + + +<para> +If the <emphasis> +XkbSetDebuggingFlags</emphasis> + reply contains more data than expected, the client just ignores any +uninterpreted data without reporting an error. If the reply has less data than +expected, a <emphasis> +Length</emphasis> + error results. +</para> + + +</sect2> +</sect1> +<sect1 id='Events'> +<title>Events</title> + +<para> +All XKB events report the time at which they occurred in a field named +<emphasis> +time</emphasis> + and the device on which they occurred in a field named <emphasis> +deviceID</emphasis> +. XKB uses a single X event code for all events and uses a common field to +distinguish XKB event type. +</para> + + +<sect2 id='Tracking_Keyboard_Replacement'> +<title>Tracking Keyboard Replacement</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbNewKeyboardNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +changed: KB_NKNDETAILMASK</entry> + </row> + <row> + <entry role='protoname'> +minKeyCode, maxKeyCode: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +oldDeviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +oldMinKeyCode, oldMaxKeyCode: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +requestMajor, requestMinor: CARD8</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbNewKeyboardNotify</emphasis> + event reports that a new core keyboard has been installed. New keyboard notify +events can be generated: +</para> + +<itemizedlist> +<listitem> + <para>When the X server detects that the keyboard was changed. + </para> +</listitem> +<listitem> + <para>When a client installs a new extension device as the core keyboard +using the X Input Extension <emphasis> +ChangeKeyboardDevice</emphasis> + request. + </para> +</listitem> +<listitem> + <para>When a client issues an <emphasis> +XkbGetMapByName</emphasis> + request which changes the keycodes range or geometry. + </para> +</listitem> +</itemizedlist> + +<para> +The <emphasis> +changed</emphasis> + field of the event reports the aspects of the keyboard that have changed, and +can contain any combination of the event details for this event: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="always" ?> +<tgroup cols='2' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='2.0*'/> +<thead> + <row rowsep='1'> + <entry>Bit in Changed</entry> + <entry>Meaning</entry> + </row> +</thead> +<tbody> + <row> + <entry>NKN_Keycodes</entry> + <entry>The new keyboard has a different minimum or maximum keycode.</entry> + </row> + <row> + <entry>NKN_Geometry</entry> + <entry>The new keyboard has a different keyboard geometry.</entry> + </row> + <row> + <entry>NKN_DeviceID</entry> + <entry>The new keyboard has a new X Input Extension device +identifier</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +The server sends an <emphasis> +XkbNewKeyboardNotify</emphasis> + event to a client only if at least one of the bits that is set in the +<emphasis> +changed</emphasis> + field of the event is also set in the appropriate event details mask for the +client. +</para> + + +<para> +The <emphasis> +minKeyCode</emphasis> + and <emphasis> +maxKeyCode</emphasis> + fields report the minimum and maximum keycodes that can be returned by the new +keyboard. The <emphasis> +oldMinKeyCode</emphasis> + and <emphasis> +oldMaxKeyCode</emphasis> + fields report the minimum and maximum values that could be returned before the +change. This event always reports all four values, but the old and new values +are the same unless <emphasis> +NKN_Keycodes</emphasis> + is set in <emphasis> +changed</emphasis> +. +</para> + + +<para> +Once a client receives a new keyboard notify event which reports a new keycode +range, the X server reports events from all keys in the new range to that +client. Clients that do not request or receive new keyboard notify events +receive events only from keys that fall in the last range for legal keys +reported to that client. See <link linkend='Replacing_the_Keyboard_On_the_Fly'> +Replacing the Keyboard "On-the-Fly"</link> for a more detailed explanation. +</para> + + +<para> +If <emphasis> +NKN_Keycodes</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +XkbNewKeyboardNotify</emphasis> + event subsumes all other change notification events (e.g. <emphasis> +XkbMapNotify</emphasis> +, <emphasis> +XkbNamesNotify</emphasis> +) that would otherwise result from the keyboard change. Clients who receive an +<emphasis> +XkbNewKeyboardNotify</emphasis> + event should assume that all other aspects of the keyboard mapping have +changed and regenerate the entire local copy of the keyboard description. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + field reports the X Input Extension device identifier of the new keyboard +device; <emphasis> +oldDeviceID</emphasis> + reports the device identifier before the change. This event always includes +both values, but they are the same unless <emphasis> +NKN_DeviceID</emphasis> + is set in <emphasis> +changed</emphasis> +. If the server does not support the X Input Extension, both fields have the +value <emphasis> +0</emphasis> +. +</para> + + +<para> +The <emphasis> +requestMajor</emphasis> + and <emphasis> +requestMinor</emphasis> + fields report the major and minor opcode of the request that caused the +keyboard change. If the keyboard change was not caused by some client request, +both fields have the value <emphasis> +0</emphasis> +. +</para> + + +</sect2> +<sect2 id='Tracking_Keyboard_Mapping_Changes'> +<title>Tracking Keyboard Mapping Changes</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbMapNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +ptrBtnActions: CARD8</entry> + </row> + <row> + <entry role='protoname'> +changed: KB_MAPPARTMASK</entry> + </row> + <row> + <entry role='protoname'> +minKeyCode, maxKeyCode: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +firstType, nTypes: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstKeySym, firstKeyAction: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nKeySyms, nKeyActions: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstKeyBehavior, firstKeyExplicit: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nKeyBehaviors, nKeyExplicit: CARD8</entry> + </row> + <row> + <entry role='protoname'> +virtualMods: KB_VMODMASK</entry> + </row> + <row> + <entry role='protoname'> +firstModMapKey, firstVModMapKey: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nModMapKeys, nVModMapKeys: CARD8</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbMapNotify</emphasis> + event reports that some aspect of XKB map for a keyboard has changed. Map +notify events can be generated whenever some aspect of the keyboard map is +changed by an XKB or core protocol request. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + field reports the keyboard for which some map component has changed and the +<emphasis> +changed</emphasis> + field reports the components with new values, and can contain any of the +values that are legal for the <emphasis> +full</emphasis> + and <emphasis> +partial</emphasis> + fields of the <emphasis> +XkbGetMap</emphasis> + request. The server sends an <emphasis> +XkbMapNotify</emphasis> + event to a client only if at least one of the bits that is set in the +<emphasis> +changed</emphasis> + field of the event is also set in the appropriate event details mask for the +client. +</para> + + +<para> +The <emphasis> +minKeyCode</emphasis> + and <emphasis> +maxKeyCode</emphasis> + fields report the range of keycodes that are legal on the keyboard for which +the change is being reported. +</para> + + +<para> +If <emphasis> +XkbKeyTypesMask</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstType</emphasis> + and <emphasis> +nTypes</emphasis> + fields report a range of key types that includes all changed types. Otherwise, +both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbKeySymsMask</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstKeySym</emphasis> + and <emphasis> +nKeySyms</emphasis> + fields report a range of keycodes that includes all keys with new symbols. +Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbKeyActionsMask</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstKeyAction</emphasis> + and <emphasis> +nKeyActions</emphasis> + fields report a range of keycodes that includes all keys with new actions. +Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbKeyBehaviorsMask</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstKeyBehavior </emphasis> +and <emphasis> +nKeyBehaviors</emphasis> + fields report a range of keycodes that includes all keys with new key +behavior. Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbVirtualModsMask</emphasis> + is set in <emphasis> +changed</emphasis> +, <emphasis> +virtualMods</emphasis> + contains all virtual modifiers to which a new set of real modifiers is bound. +Otherwise, <emphasis> +virtualMods</emphasis> + is <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbExplicitComponentsMask</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstKeyExplicit</emphasis> + and <emphasis> +nKeyExplicit</emphasis> + fields report a range of keycodes that includes all keys with changed explicit +components. Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbModifierMapMask</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstModMapKey</emphasis> + and <emphasis> +nModMapKeys</emphasis> + fields report a range of keycodes that includes all keys with changed modifier +bindings. Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +XkbVirtualModMapMask</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstVModMapKey</emphasis> + and <emphasis> +nVModMapKeys</emphasis> + fields report a range of keycodes that includes all keys with changed virtual +modifier mappings. Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +</sect2> +<sect2 id='Tracking_Keyboard_State_Changes'> +<title>Tracking Keyboard State Changes</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbStateNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +mods, baseMods, latchedMods, lockedMods: KEYMASK</entry> + </row> + <row> + <entry role='protoname'> +group, lockedGroup: CARD8</entry> + </row> + <row> + <entry role='protoname'> +baseGroup, latchedGroup: INT16</entry> + </row> + <row> + <entry role='protoname'> +compatState: KEYMASK</entry> + </row> + <row> + <entry role='protoname'> +grabMods, compatGrabMods: KEYMASK</entry> + </row> + <row> + <entry role='protoname'> +lookupMods, compatLookupMods: KEYMASK</entry> + </row> + <row> + <entry role='protoname'> +ptrBtnState: BUTMASK</entry> + </row> + <row> + <entry role='protoname'> +changed: KB_STATEPARTMASK</entry> + </row> + <row> + <entry role='protoname'> +keycode: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +eventType: CARD8</entry> + </row> + <row> + <entry role='protoname'> +requestMajor, requestMinor: CARD8</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis>XkbStateNotify</emphasis> +event reports that some component of the XKB state (see +<link linkend='Keyboard_State'>Keyboard State</link>) has changed. +State notify events are usually caused by key or pointer activity, but they can +also result from explicit state changes requested by the <emphasis> +XkbLatchLockState</emphasis> + request or by other extensions. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + field reports the keyboard on which some state component changed. The +<emphasis> +changed</emphasis> + field reports the XKB state components (see +<link linkend='Keyboard_State'>Keyboard State</link>) that have changed +and contain any combination of: +</para> + +<informaltable frame='none'> +<?dbfo keep-together="always" ?> +<tgroup cols='3' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='1.0*'/> +<colspec colname='c3' colwidth='2.0*'/> +<thead> + <row rowsep='1'> + <entry>Bit in changed</entry> + <entry>Event field</entry> + <entry>Changed component</entry> + </row> +</thead> +<tbody> + <row> + <entry><emphasis> +ModifierState</emphasis> +</entry> + <entry><emphasis> +mods</emphasis> +</entry> + <entry>The effective modifiers</entry> + </row> + <row> + <entry><emphasis> +ModifierBase</emphasis> +</entry> + <entry><emphasis> +baseMods</emphasis> +</entry> + <entry>The base modifiers</entry> + </row> + <row> + <entry><emphasis> +ModifierLatch</emphasis> +</entry> + <entry><emphasis> +latchedMods</emphasis> +</entry> + <entry>The latched modifiers</entry> + </row> + <row> + <entry><emphasis> +ModifierLock</emphasis> +</entry> + <entry><emphasis> +lockedMods</emphasis> +</entry> + <entry>The locked modifiers</entry> + </row> + <row> + <entry><emphasis> +GroupState</emphasis> +</entry> + <entry><emphasis> +group</emphasis> +</entry> + <entry>The effective keyboard group</entry> + </row> + <row> + <entry><emphasis> +GroupBase</emphasis> +</entry> + <entry><emphasis> +baseGroup</emphasis> +</entry> + <entry>The base keyboard group</entry> + </row> + <row> + <entry><emphasis> +GroupLatch</emphasis> +</entry> + <entry><emphasis> +latchedGroup</emphasis> +</entry> + <entry>The latched keyboard group</entry> + </row> + <row> + <entry><emphasis> +GroupLock</emphasis> +</entry> + <entry><emphasis> +lockedGroup</emphasis> +</entry> + <entry>The locked keyboard group</entry> + </row> + <row> + <entry><emphasis> +PointerButtons</emphasis> +</entry> + <entry><emphasis> +ptrBtnState</emphasis> +</entry> + <entry>The state of the core pointer buttons</entry> + </row> + <row> + <entry><emphasis> +GrabMods</emphasis> +</entry> + <entry><emphasis> +grabMods</emphasis> +</entry> + <entry>The XKB state used to compute grabs</entry> + </row> + <row> + <entry><emphasis> +LookupMods</emphasis> +</entry> + <entry><emphasis> +lookupMods</emphasis> +</entry> + <entry>The XKB state used to look up symbols</entry> + </row> + <row> + <entry><emphasis> +CompatState</emphasis> +</entry> + <entry><emphasis> +compatState</emphasis> +</entry> + <entry>Default state for non-XKB clients</entry> + </row> + <row> + <entry><emphasis> +CompatGrabMods</emphasis> +</entry> + <entry><emphasis> +compatGrabMods</emphasis> +</entry> + <entry>The core state used to compute grabs</entry> + </row> + <row> + <entry><emphasis> +CompatLookupMods</emphasis> +</entry> + <entry><emphasis> +compatLookupMods</emphasis> +</entry> + <entry>The core state used to look up symbols</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +The server sends an <emphasis> +XkbStateNotify</emphasis> + event to a client only if at least one of the bits that is set in the +<emphasis> +changed</emphasis> + field of the event is also set in the appropriate event details mask for the +client. +</para> + + +<para> +A state notify event reports current values for all state components, even +those with unchanged values. +</para> + + +<para> +The <emphasis> +keycode</emphasis> + field reports the key or button which caused the change in state while the +<emphasis> +eventType</emphasis> + field reports the exact type of event (e.g. <emphasis> +KeyPress</emphasis> +). If the change in state was not caused by key or button activity, both fields +have the value <emphasis> +0</emphasis> +. +</para> + + +<para> +The <emphasis> +requestMajor</emphasis> + and <emphasis> +requestMinor</emphasis> + fields report the major and minor opcodes of the request that caused the +change in state and have the value <emphasis> +0</emphasis> + if it was resulted from key or button activity. +</para> + + +</sect2> +<sect2 id='Tracking_Keyboard_Control_Changes'> +<title>Tracking Keyboard Control Changes</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbControlsNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +numGroups: CARD8</entry> + </row> + <row> + <entry role='protoname'> +changedControls: KB_CONTROLMASK</entry> + </row> + <row> + <entry role='protoname'> +enabledControls,enabledControlChanges: KB_BOOLCTRLMASK</entry> + </row> + <row> + <entry role='protoname'> +keycode: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +eventType: CARD8</entry> + </row> + <row> + <entry role='protoname'> +requestMajor: CARD8</entry> + </row> + <row> + <entry role='protoname'> +requestMinor: CARD8</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbControlsNotify</emphasis> + event reports a change in one or more of the global keyboard controls (see +<link linkend='Global_Keyboard_Controls'>Global Keyboard Controls</link>) +or in the internal modifiers or ignore locks masks (see +<link linkend='Server_Internal_Modifiers_and_Ignore_Locks_Behavior'> +Server Internal Modifiers and Ignore +Locks Behavior</link>). Controls notify events are usually caused by and +<emphasis> +XkbSetControls</emphasis> + request, but they can also be caused by keyboard activity or certain core +protocol and input extension requests. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + field reports the keyboard for which some control has changed, and the +<emphasis> +changed</emphasis> + field reports the controls that have new values. +</para> + + +<para> +The <emphasis> +changed</emphasis> + field can contain any of the values that are permitted for the <emphasis> +changeControls</emphasis> + field of the <emphasis> +XkbSetControls</emphasis> + request. The server sends an <emphasis> +XkbControlsNotify</emphasis> + event to a client only if at least one of the bits that is set in the +<emphasis> +changed</emphasis> + field of the event is also set in the appropriate event details mask for the +client. +</para> + + +<para> +The <emphasis> +numGroups</emphasis> + field reports the total number of groups defined for the keyboard, whether or +not the number of groups has changed. +</para> + + +<para> +The <emphasis> +enabledControls</emphasis> + field reports the current status of all of the boolean controls, whether or +not any boolean controls changed state. If <emphasis> +EnabledControls</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +enabledControlChanges</emphasis> + field reports the boolean controls that were enabled or disabled; if a control +is specified in <emphasis> +enabledControlChanges</emphasis> +, the value that is reported for that control in <emphasis> +enabledControls</emphasis> + represents a change in state. +</para> + + +<para> +The <emphasis> +keycode</emphasis> + field reports the key or button which caused the change in state while the +<emphasis> +eventType</emphasis> + field reports the exact type of event (e.g. <emphasis> +KeyPress</emphasis> +). If the change in state was not caused by key or button activity, both fields +have the value <emphasis> +0</emphasis> +. +</para> + + +<para> +The <emphasis> +requestMajor</emphasis> + and <emphasis> +requestMinor</emphasis> + fields report the major and minor opcodes of the request that caused the +change in state and have the value <emphasis> +0</emphasis> + if it was resulted from key or button activity. +</para> + + +</sect2> +<sect2 id='Tracking_Keyboard_Indicator_State_Changes'> +<title>Tracking Keyboard Indicator State Changes</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbIndicatorStateNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +stateChanged, state: KB_INDICATORMASK</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbIndicatorStateNotify</emphasis> + event indicates that one or more of the indicators on a keyboard have changed +state. Indicator state notify events can be caused by: +</para> + +<itemizedlist> +<listitem> + <para>Automatic update to reflect changes in keyboard state (keyboard +activity, <emphasis> +XkbLatchLockState</emphasis> + requests). + </para> +</listitem> +<listitem> + <para>Automatic update to reflect changes in keyboard controls (<emphasis> +XkbSetControls</emphasis> +, keyboard activity, certain core protocol and input extension requests). + </para> +</listitem> +<listitem> + <para>Explicit attempts to change indicator state (core protocol and input +extension requests, <emphasis> +XkbSetNamedIndicator</emphasis> + requests). + </para> +</listitem> +<listitem> + <para>Changes to indicator maps (<emphasis> +XkbSetIndicatorMap</emphasis> + and <emphasis> +XkbSetNamedIndicator</emphasis> + requests). + </para> +</listitem> +</itemizedlist> + +<para> +The <emphasis> +deviceID</emphasis> + field reports the keyboard for which some indicator has changed, and the +<emphasis> +state</emphasis> + field reports the new state for all indicators on the specified keyboard. The +<emphasis> +stateChanged</emphasis> + field specifies which of the values in <emphasis> +state</emphasis> + represent a new state for the corresponding indicator. The server sends an +<emphasis> +XkbIndicatorStateNotify</emphasis> + event to a client only if at least one of the bits that is set in the +<emphasis> +stateChanged</emphasis> + field of the event is also set in the appropriate event details mask for the +client. +</para> + + +</sect2> +<sect2 id='Tracking_Keyboard_Indicator_Map_Changes'> +<title>Tracking Keyboard Indicator Map Changes</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbIndicatorMapNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +state: KB_INDICATORMASK</entry> + </row> + <row> + <entry role='protoname'> +mapChanged: KB_INDICATORMASK</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbIndicatorMapNotify</emphasis> + event indicates that the maps for one or more keyboard indicators have been +changed. Indicator map notify events can be caused by <emphasis> +XkbSetIndicatorMap</emphasis> + and <emphasis> +XkbSetNamedIndicator</emphasis> + requests. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + field reports the keyboard for which some indicator map has changed, and the +<emphasis> +mapChanged</emphasis> + field reports the indicators with changed maps. The server sends an <emphasis> +XkbIndicatorMapNotify</emphasis> + event to a client only if at least one of the bits that is set in the +<emphasis> +mapChanged</emphasis> + field of the event is also set in the appropriate event details mask for the +client. +</para> + + +<para> +The <emphasis> +state</emphasis> + field reports the current state of all indicators on the specified keyboard. +</para> + + +</sect2> +<sect2 id='Tracking_Keyboard_Name_Changes'> +<title>Tracking Keyboard Name Changes</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbNamesNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +changed: KB_NAMEDETAILMASK</entry> + </row> + <row> + <entry role='protoname'> +firstType, nTypes: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstLevelName, nLevelNames: CARD8</entry> + </row> + <row> + <entry role='protoname'> +firstKey: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +nKeys, nKeyAliases, nRadioGroups: CARD8</entry> + </row> + <row> + <entry role='protoname'> +changedGroupNames: KB_GROUPMASK</entry> + </row> + <row> + <entry role='protoname'> +changedVirtualMods: KB_VMODMASK</entry> + </row> + <row> + <entry role='protoname'> +changedIndicators: KB_INDICATORMASK</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbNamesNotify</emphasis> + event reports a change to one or more of the symbolic names associated with a +keyboard. Symbolic names can change when: +</para> + +<itemizedlist> +<listitem> + <para> Some client explicitly changes them using <emphasis> +XkbSetNames</emphasis> +. + </para> +</listitem> +<listitem> + <para>The list of key types or radio groups is resized + </para> +</listitem> +<listitem> + <para>The group width of some key type is changed + </para> +</listitem> +</itemizedlist> + +<para> +The <emphasis> +deviceID</emphasis> + field reports the keyboard on which names were changed. The <emphasis> +changed</emphasis> + mask lists the components for which some names have changed and can have any +combination of the values permitted for the <emphasis> +which</emphasis> + field of the <emphasis> +XkbGetNames</emphasis> + request. The server sends an <emphasis> +XkbNamesNotify</emphasis> + event to a client only if at least one of the bits that is set in the +<emphasis> +changed</emphasis> + field of the event is also set in the appropriate event details mask for the +client. +</para> + + +<para> +If <emphasis> +KeyTypeNames</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstType</emphasis> + and <emphasis> +nTypes</emphasis> + fields report a range of types that includes all types with changed names. +Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +KTLevelNames</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstLevelName</emphasis> + and <emphasis> +nLevelNames</emphasis> + fields report a range of types that includes all types with changed level +names. Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +IndicatorNames</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +changedIndicators</emphasis> + field reports the indicators with changed names. Otherwise, <emphasis> +changedIndicators</emphasis> + is <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +VirtualModNames</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +changedVirtualMods</emphasis> + field reports the virtual modifiers with changed names. Otherwise, <emphasis> +changedVirtualMods</emphasis> + is <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +GroupNames</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +changedGroupNames</emphasis> + field reports the groups with changed names. Otherwise, <emphasis> +changedGroupNames</emphasis> + is <emphasis> +0</emphasis> +. +</para> + + +<para> +If <emphasis> +KeyNames</emphasis> + is set in <emphasis> +changed</emphasis> +, the <emphasis> +firstKey</emphasis> + and <emphasis> +nKeys</emphasis> + fields report a range of keycodes that includes all keys with changed names. +Otherwise, both fields are <emphasis> +0</emphasis> +. +</para> + + +<para> +The <emphasis> +nKeyAliases</emphasis> + field reports the total number of key aliases associated with the keyboard, +regardless of whether <emphasis> +KeyAliases</emphasis> + is set in <emphasis> +changed</emphasis> +. +</para> + + +<para> +The <emphasis> +nRadioGroups</emphasis> + field reports the total number of radio group names associated with the +keyboard, regardless of whether <emphasis> +RGNames</emphasis> + is set in <emphasis> +changed</emphasis> +. +</para> + + +</sect2> +<sect2 id='Tracking_Compatibility_Map_Changes'> +<title>Tracking Compatibility Map Changes</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbCompatMapNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +changedGroups: KB_GROUPMASK</entry> + </row> + <row> + <entry role='protoname'> +firstSI, nSI: CARD16</entry> + </row> + <row> + <entry role='protoname'> +nTotalSI: CARD16</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbCompatMapNotify</emphasis> + event indicates that some component of the compatibility map for a keyboard +has been changed. Compatibility map notify events can be caused by <emphasis> +XkbSetCompatMap</emphasis> + and <emphasis> +XkbGetMapByName</emphasis> + requests. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + field reports the keyboard for which the compatibility map has changed; if the +server does not support the X input extension, <emphasis> +deviceID</emphasis> + is <emphasis> +0</emphasis> +. +</para> + + +<para> +The <emphasis> +changedGroups</emphasis> + field reports the keyboard groups, if any, with a changed entry in the group +compatibility map. The <emphasis> +firstSI</emphasis> + and <emphasis> +nSI</emphasis> + fields specify a range of symbol interpretations in the symbol compatibility +map that includes all changed symbol interpretations; if the symbol +compatibility map is unchanged, both fields are <emphasis> +0</emphasis> +. The <emphasis> +nTotalSI</emphasis> + field always reports the total number of symbol interpretations present in the +symbol compatibility map, regardless of whether any symbol interpretations have +been changed. +</para> + + +<para> +The server sends an <emphasis> +XkbCompatMapNotify</emphasis> + event to a client only if at least one of the following conditions is met: +</para> + +<itemizedlist> +<listitem> + <para>The <emphasis> +nSI</emphasis> + field of the event is non-zero, and the <emphasis> +XkbSymInterpMask</emphasis> + bit is set in the appropriate event details mask for the client. + </para> +</listitem> +<listitem> + <para>The <emphasis> +changedGroups</emphasis> + field of the event contains at least one group, and the <emphasis> +XkbGroupCompatMask</emphasis> + bit is set in the appropriate event details mask for the client. + </para> +</listitem> +</itemizedlist> + +</sect2> +<sect2 id='Tracking_Application_Bell_Requests'> +<title>Tracking Application Bell Requests</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbBellNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +bellClass: { KbdFeedbackClass, BellFeedbackClass }</entry> + </row> + <row> + <entry role='protoname'> +bellID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +percent: CARD8</entry> + </row> + <row> + <entry role='protoname'> +pitch: CARD16</entry> + </row> + <row> + <entry role='protoname'> +duration: CARD16</entry> + </row> + <row> + <entry role='protoname'> +eventOnly: BOOL</entry> + </row> + <row> + <entry role='protoname'> +name: ATOM</entry> + </row> + <row> + <entry role='protoname'> +window: WINDOW</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbBellNotify</emphasis> + event indicates that some client has requested a keyboard bell. Bell notify +events are usually caused by <emphasis> +Bell</emphasis> +, <emphasis> +DeviceBell</emphasis> +, or <emphasis> +XkbBell</emphasis> + requests, but they can also be generated by the server (e.g. if the <emphasis> +AccessXFeedback</emphasis> + control is active). +</para> + + +<para> +The server sends an <emphasis> +XkbBellNotify</emphasis> + event to a client if the appropriate event details field for the client has +the value <emphasis> +True</emphasis> +. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + field specifies the device for which a bell was requested, while the <emphasis> +bellClass</emphasis> + and <emphasis> +bellID</emphasis> + fields specify the input extension class and identifier of the feedback for +which the bell was requested. If the reporting server does not support the +input extension, all three fields have the value 0. +</para> + + +<para> +The <emphasis> +percent</emphasis> +, <emphasis> +pitch</emphasis> + and <emphasis> +duration</emphasis> + fields report the volume, tone and duration requested for the bell as +specified by the <emphasis> +XkbBell</emphasis> + request. Bell notify events caused by core protocol or input extension +requests use the pitch and duration specified in the corresponding bell or +keyboard feedback control. +</para> + + +<para> +If the bell was caused by an <emphasis> +XkbBell</emphasis> + request or by the X server, <emphasis> +name</emphasis> + reports an optional symbolic name for the bell and the <emphasis> +window</emphasis> + field optionally reports the window for which the bell was generated. +Otherwise, both fields have the value <emphasis> +None</emphasis> +. +</para> + + +<para> +If the <emphasis> +eventOnly</emphasis> + field is <emphasis> +True</emphasis> +, the server did not generate a sound in response to the request, otherwise the +server issues the beep before sending the event. The eventOnly field can be +<emphasis> +True</emphasis> + if the <emphasis> +AudibleBell</emphasis> + control is disabled or if a client explicitly requests <emphasis> +eventOnly</emphasis> + when it issues an <emphasis> +XkbBell</emphasis> + request. +</para> + + +</sect2> +<sect2 id='Tracking_Messages_Generated_by_Key_Actions'> +<title>Tracking Messages Generated by Key Actions</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbActionMessage</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +keycode: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +press: BOOL</entry> + </row> + <row> + <entry role='protoname'> +mods: KEYMASK</entry> + </row> + <row> + <entry role='protoname'> +group: KB_GROUP</entry> + </row> + <row> + <entry role='protoname'> +keyEventFollows: BOOL</entry> + </row> + <row> + <entry role='protoname'> +message: LISTofCARD8</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbActionMessage</emphasis> + event is generated when the user operates a key to which an <emphasis> +SA_ActionMessage</emphasis> + message is bound under the appropriate state and group. The server sends an +<emphasis> +XkbActionMessage</emphasis> + event to a client if the appropriate event details field for the client has +the value <emphasis> +True</emphasis> +. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + field specifies the keyboard device that contains the key which activated the +event. The <emphasis> +keycode</emphasis> + field specifies the key whose operation caused the message and press is +<emphasis> +True</emphasis> + if the message was caused by the user pressing the key. The <emphasis> +mods</emphasis> + and <emphasis> +group</emphasis> + fields report the effective keyboard modifiers and group in effect at the time +the key was pressed or released. +</para> + + +<para> +If <emphasis> +keyEventFollows</emphasis> + is <emphasis> +True</emphasis> +, the server will also send a key press or release event, as appropriate, for +the key that generated the message. If it is <emphasis> +False</emphasis> +, the key causes only a message. Note that the key event is delivered normally +with respect to passive grabs, keyboard focus, and cursor position, so that +<emphasis> +keyEventFollows</emphasis> + does not guarantee that any particular client which receives the <emphasis> +XkbActionMessage</emphasis> + notify event will also receive a key press or release event. +</para> + + +<para> +The <emphasis> +message</emphasis> + field is <emphasis> +NULL</emphasis> +-terminated string of up to <emphasis> +ActionMessageLength</emphasis> + (<emphasis> +6</emphasis> +) bytes, which reports the contents of the <emphasis> +message</emphasis> + field in the action that caused the message notify event. +</para> + + +</sect2> +<sect2 id='Tracking_Changes_to_AccessX_State_and_Keys'> +<title>Tracking Changes to AccessX State and Keys</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbAccessXNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD8</entry> + </row> + <row> + <entry role='protoname'> +detail: KB_AXNDETAILMASK</entry> + </row> + <row> + <entry role='protoname'> +keycode: KEYCODE</entry> + </row> + <row> + <entry role='protoname'> +slowKeysDelay: CARD16</entry> + </row> + <row> + <entry role='protoname'> +debounceDelay: CARD16</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbAccessXNotify</emphasis> + event reports on some kinds of keyboard activity when any of the <emphasis> +SlowKeys</emphasis> +, <emphasis> +BounceKeys</emphasis> + or <emphasis> +AccessXKeys</emphasis> + controls are active. Compatibility map notify events can only be caused by +keyboard activity. +</para> + + +<para> +The <emphasis> +deviceID</emphasis> + and <emphasis> +keycode</emphasis> + fields specify the keyboard and key for which the event occurred. The +<emphasis> +detail</emphasis> + field describes the event that occurred and has one of the following values: +</para> + +<informaltable frame='topbot'> +<?dbfo keep-together="always" ?> +<tgroup cols='3' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> +<colspec colname='c2' colwidth='1.0*'/> +<colspec colname='c3' colwidth='2.0*'/> +<thead> + <row rowsep='1'> + <entry>Detail</entry> + <entry>Control</entry> + <entry>Meaning</entry> + </row> +</thead> +<tbody> + <row> + <entry><emphasis> +AXN_SKPress</emphasis> +</entry> + <entry><emphasis> +SlowKeys</emphasis> +</entry> + <entry>Key pressed</entry> + </row> + <row> + <entry><emphasis> +AXN_SKAccept</emphasis> +</entry> + <entry><emphasis> +SlowKeys</emphasis> +</entry> + <entry><emphasis> +K</emphasis> +ey held until it was accepted.</entry> + </row> + <row> + <entry><emphasis> +AXN_SKReject</emphasis> +</entry> + <entry><emphasis> +SlowKeys</emphasis> +</entry> + <entry>Key released before it was accepted.</entry> + </row> + <row> + <entry><emphasis> +AXN_SKRelease</emphasis> +</entry> + <entry><emphasis> +SlowKeys</emphasis> +</entry> + <entry>Key released after it was accepted.</entry> + </row> + <row> + <entry><emphasis> +AXN_BKAccept</emphasis> +</entry> + <entry><emphasis> +BounceKeys</emphasis> +</entry> + <entry>Key pressed while it was active.</entry> + </row> + <row> + <entry><emphasis> +AXN_BKReject</emphasis> +</entry> + <entry><emphasis> +BounceKeys</emphasis> +</entry> + <entry>Key pressed while it was still disabled.</entry> + </row> + <row> + <entry><emphasis> +AXN_AXKWarning</emphasis> +</entry> + <entry><emphasis> +AccessXKeys</emphasis> +</entry> + <entry>Shift key held down for four seconds</entry> + </row> +</tbody> +</tgroup> +</informaltable> + +<para> +Each subclass of the AccessX notify event is generated only when the control +specified in the table above is enabled. The server sends an <emphasis> +XkbAccessXNotify</emphasis> + event to a client only if the bit which corresponds to the value of the +<emphasis> +detail</emphasis> + field for the event is set in the appropriate event details mask for the +client. +</para> + + +<para> +Regardless of the value of <emphasis> +detail</emphasis> +, the <emphasis> +slowKeysDelay</emphasis> + and <emphasis> +debounceDelay</emphasis> + fields always reports the current slow keys acceptance delay (see +<link linkend='The_SlowKeys_Control'>The SlowKeys Control</link>) and +debounce delay (see <link linkend='The_BounceKeys_Control'>The BounceKeys +Control</link>) for the specified keyboard. +</para> + + +</sect2> +<sect2 id='Tracking_Changes_To_Extension_Devices'> +<title>Tracking Changes To Extension Devices</title> + + +<informaltable frame='none' tabstyle='proto'> +<?dbfo keep-together="always" ?> +<tgroup cols='1' align='left' colsep='0' rowsep='0'> +<colspec colname='c1' colwidth='1.0*'/> + <thead> + <row> + <entry role='protoname'>XkbExtensionDeviceNotify</entry> + </row> + </thead> + <tbody> + <row> + <entry role='protoargs'>time: TIMESTAMP</entry> + </row> + <row> + <entry role='protoname'> +deviceID: CARD16</entry> + </row> + <row> + <entry role='protoname'> +ledClass: { KbdFeedbackClass, LedFeedbackClass }</entry> + </row> + <row> + <entry role='protoname'> +ledID: CARD16</entry> + </row> + <row> + <entry role='protoname'> +reason: KB_XIDETAILMASK</entry> + </row> + <row> + <entry role='protoname'> +supported: KB_XIFEATUREMASK</entry> + </row> + <row> + <entry role='protoname'> +unsupported: KB_XIFEATUREMASK</entry> + </row> + <row> + <entry role='protoname'> +ledsDefined: KB_INDICATORMASK</entry> + </row> + <row> + <entry role='protoname'> +ledState: KB_INDICATORMASK</entry> + </row> + <row> + <entry role='protoname'> +firstButton, nButtons: CARD8</entry> + </row> + + </tbody> + </tgroup> +</informaltable> + +<para> +An <emphasis> +XkbExtensionDeviceNotify</emphasis> + event reports: +</para> + +<itemizedlist> +<listitem> + <para>A change to some part of the XKB information for an extension device. + </para> +</listitem> +<listitem> + <para>An attempt to use an XKB extension device feature that is not supported +for the specified device by the current implementation. + </para> +</listitem> +</itemizedlist> + +<para> +The <emphasis> +deviceID</emphasis> + field specifies the X Input Extension device identifier of some device on +which an XKB feature was requested, or <emphasis> +XkbUseCorePtr</emphasis> + if the request affected the core pointer device. The <emphasis> +reason</emphasis> + field explains why the event was generated in response to the request, and can +contain any combination of <emphasis> +XkbXI_UnsupportedFeature</emphasis> + and the values permitted for the change field of the <emphasis> +XkbSetDeviceInfo</emphasis> + request. +</para> + + +<para> +If <emphasis> +XkbXI_ButtonActions</emphasis> + is set in <emphasis> +reason</emphasis> +, this event reports a successful change to the XKB actions bound to one or +more buttons on the core pointer or an extension device. The <emphasis> +firstButton</emphasis> + and <emphasis> +nButtons</emphasis> + fields report a range of device buttons that include all of the buttons for +which actions were changed. +</para> + + +<para> +If any combination of <emphasis> +XkbXI_IndicatorNames</emphasis> +, <emphasis> +XkbXI_IndicatorMaps</emphasis> +, or <emphasis> +XkbXI_IndicatorState</emphasis> + is set in either <emphasis> +reason</emphasis> + or <emphasis> +unsupported</emphasis> +, the <emphasis> +ledClass</emphasis> + and <emphasis> +ledID</emphasis> + fields specify the X Input Extension feedback class and identifier of the +feedback for which the change is reported. If this event reports any changes to +an indicator feedback, the <emphasis> +ledsDefined</emphasis> + field reports all indicators on that feedback for which either a name or a +indicator map are defined, and <emphasis> +ledState</emphasis> + reports the current state of all of the indicators on the specified feedback. +</para> + + +<para> +If <emphasis> +XkbXI_IndicatorNames</emphasis> + is set in <emphasis> +reason</emphasis> +, this event reports a successful change to the symbolic names bound to one or +more extension device indicators by XKB. If <emphasis> +XkbXI_IndicatorMaps</emphasis> + is set in <emphasis> +reason</emphasis> +, this event reports a successful change to the indicator maps bound to one or +more extension device indicators by XKB. If <emphasis> +XkbXI_IndicatorState</emphasis> + is set in reason, this event reports that one or more indicators in the +specified device and feedback have changed state. +</para> + + +<para> +If <emphasis> +XkbXI_UnsupportedFeature</emphasis> + is set in reason, this event reports an unsuccessful attempt to use some XKB +extension device feature that is not supported by the XKB implementation in the +server for the specified device. The <emphasis> +unsupported</emphasis> + mask reports the requested features that are not available on the specified +device. See <link linkend='Interactions_Between_XKB_and_the_X_Input_Extension'>Interactions Between +XKB and the X Input Extension</link> for more information about possible XKB +interactions with the X Input Extension. +</para> + + +<para> +The server sends an <emphasis> +XkbExtensionDeviceNotify</emphasis> + event to a client only if at least one of the bits that is set in the +<emphasis> +reason</emphasis> + field of the event is also set in the appropriate event details mask for the +client. +</para> + + +<para> +Events that report a successful change to some extension device feature are +reported to all clients that have expressed interest in the event; events that +report an attempt to use an unsupported feature are reported only to the client +which issued the request. Events which report a partial success are reported to +all interested clients, but only the client that issued the request is informed +of the attempt to use unsupported features. +</para> +</sect2> +</sect1> +</chapter> |