Provided by: libx11-doc_1.6.4-3ubuntu0.4_all bug

NAME

       XkbApplyCompatMapToKey  -  Apply  the new compatibility mapping to an individual key to get its semantics
       updated

SYNOPSIS

       Bool XkbApplyCompatMapToKey (XkbDescPtr xkb, KeyCode key, XkbChangesPtr changes);

ARGUMENTS

       - xkb  keyboard description to be updated

       - key  key to be updated

       - changes
              notes changes to the Xkb keyboard description

DESCRIPTION

       XkbApplyCompatMapToKey essentially performs the operation described  in  Core  Keyboard  Mapping  to  Xkb
       Keyboard Mapping Transformation to a specific key. This updates the behavior, actions, repeat status, and
       virtual modifier bindings of the key.

       Core Keyboard Mapping to Xkb Keyboard Mapping Transformation

       When a core protocol keyboard mapping request is received by the server, the server's core  keyboard  map
       is  updated,  and  then  the  Xkb  map  maintained  by  the  server is updated. Because a client may have
       explicitly configured some of the Xkb keyboard mapping in the server, this automatic regeneration of  the
       Xkb  keyboard mapping from the core protocol keyboard mapping should not modify any components of the Xkb
       keyboard mapping that were explicitly set by a client. The client must set explicit override controls  to
       prevent  this  from  happening  (see Explicit Components-Avoiding Automatic Remapping by the Server). The
       core-to-Xkb mapping is done as follows:

       Explicit Components-Avoiding Automatic Remapping by the Server

       Whenever a client remaps the keyboard using core protocol requests, Xkb examines  the  map  to  determine
       likely default values for the components that cannot be specified using the core protocol.

       This  automatic  remapping  might  replace definitions explicitly requested by an application, so the Xkb
       keyboard description defines an explicit components mask for each  key.  Any  aspects  of  the  automatic
       remapping  listed  in  the  explicit  components mask for a key are not changed by the automatic keyboard
       mapping.

       The explicit components masks are held in the explicit field of the server map, which is an array indexed
       by  keycode.  Each  entry  in  this array is a mask that is a bitwise inclusive OR of the values shown in
       Table 1.

                      Table 1 Explicit Component Masks
       ───────────────────────────────────────────────────────────────
       Bit in Explicit Mask   Value    Protects Against
       ───────────────────────────────────────────────────────────────
       ExplicitKeyType1       (1<<0)   Automatic determination of the
                                       key   type   associated   with
                                       Group1.
       ExplicitKeyType2       (1<<1)   Automatic determination of the
                                       key   type   associated   with
                                       Group2.
       ExplicitKeyType3       (1<<2)   Automatic determination of the
                                       key   type   associated   with
                                       Group3.
       ExplicitKeyType4       (1<<3)   Automatic determination of the
                                       key   type   associated   with
                                       Group4.

       ExplicitInterpret      (1<<4)   Application  of  any  of   the
                                       fields     of     a     symbol
                                       interpretation to the  key  in
                                       question.
       ExplicitAutoRepeat     (1<<5)   Automatic   determination   of
                                       auto-repeat  status  for   the
                                       key,  as specified in a symbol
                                       interpretation.
       ExplicitBehavior       (1<<6)   Automatic  assignment  of  the
                                       XkbKB_Lock   behavior  to  the
                                       key, if  the  XkbSI_LockingKey
                                       flag   is   set  in  a  symbol
                                       interpretation.
       ExplicitVModMap        (1<<7)   Automatic determination of the
                                       virtual  modifier  map for the
                                       key  based  on   the   actions
                                       assigned  to  the  key and the
                                       symbol  interpretations   that
                                       match the key.

       1.  Map  the  symbols  from  the  keys  in the core keyboard map to groups and symbols on keys in the Xkb
           keyboard map. The core keyboard mapping is of fixed width, so each key in the core  mapping  has  the
           same  number  of symbols associated with it.  The Xkb mapping allows a different number of symbols to
           be associated with each key; those symbols may be divided into a different number of groups (1-4) for
           each key. For each key, this process therefore involves partitioning the fixed number of symbols from
           the core mapping into a set of variable-length groups with a  variable  number  of  symbols  in  each
           group. For example, if the core protocol map is of width five, the partition for one key might result
           in one group with two symbols and another with three symbols. A different key  might  result  in  two
           groups  with  two symbols plus a third group with one symbol. The core protocol map requires at least
           two symbols in each of the first two groups.

       1a. For each changed key, determine the number of groups represented in the new core keyboard  map.  This
           results in a tentative group count for each key in the Xkb map.

       1b. For  each  changed key, determine the number of symbols in each of the groups found in step 1a. There
           is one explicit override control associated with each of the four possible groups for each  Xkb  key,
           ExplicitKeyType1  through  ExplicitKeyType4.  If no explicit override control is set for a group, the
           number of symbols used for that group from the core map is two.  If the explicit override control  is
           set  for  a  group on the key, the number of symbols used for that Xkb group from the core map is the
           width of the Xkb group with one exception: because of the core protocol requirement for at least  two
           symbols  in  each  of  groups  one  and two, the number of symbols used for groups one and two is the
           maximum of 2 or the width of the Xkb group.

       1c. For each changed key, assign the symbols in the core map to the appropriate group on the key. If  the
           total number of symbols required by the Xkb map for a particular key needs more symbols than the core
           protocol map contains, the additional symbols are taken to be NoSymbol keysyms appended to the end of
           the  core set. If the core map contains more symbols than are needed by the Xkb map, trailing symbols
           in the core map are discarded. In the absence of an explicit override for group one or  two,  symbols
           are  assigned  in  order  by  group;  the first symbols in the core map are assigned to group one, in
           order, followed by group two, and so on. For example, if the core map  contained  eight  symbols  per
           key,  and  a particular Xkb map contained 2 symbols for G1 and G2 and three for G3, the symbols would
           be assigned as (G is group, L is shift level):

                         G1L1 G1L2 G2L1 G2L2 G3L1 G3L2 G3L3

           If an explicit override control is set for group one or two, the symbols are taken from the core  set
           in  a  somewhat different order. The first four symbols from the core set are assigned to G1L1, G1L2,
           G2L1, G2L2, respectively. If group one requires more symbols, they  are  taken  next,  and  then  any
           additional  symbols  needed by group two. Group three and four symbols are taken in complete sequence
           after group two. For example, a key with four groups and three  symbols  in  each  group  would  take
           symbols from the core set in the following order:

              G1L1 G1L2 G2L1 G2L2 G1L3 G2L3 G3L1 G3L2 G3L3 G4L1 G4L2 G4L3

           As  previously  noted,  the  core  protocol  map requires at lease two symbols in groups one and two.
           Because of this, if an explicit override control for an Xkb key is set and group one and /  or  group
           two  is of width one, it is not possible to generate the symbols taken from the core protocol set and
           assigned to position G1L2 and / or G2L2.

       1d. For each group on each changed key, assign a key type appropriate for the symbols in the group.

       1e. For each changed key, remove any empty or redundant groups.

           At this point, the groups and their associated symbols have been assigned to  the  corresponding  key
           definitions in the Xkb map.

       2.  Apply  symbol  interpretations  to  modify  key  operation.  This  phase is completely skipped if the
           ExplicitInterpret override control bit is set in the explicit controls mask  for  the  Xkb  key  (see
           Explicit Components-Avoiding Automatic Remapping by the Server).

       2a. For  each symbol on each changed key, attempt to match the symbol and modifiers from the Xkb map to a
           symbol interpretation describing how to generate the symbol.

       2b. When a match is found in step 2a, apply the symbol interpretation to change the semantics  associated
           with the symbol in the Xkb key map. If no match is found, apply a default interpretation.

       The  symbol interpretations used in step 2 are configurable and may be specified using XkbSymInterpretRec
       structures referenced by the sym_interpret field of an XkbCompatMapRec.

       Symbol Interpretations - the XkbSymInterpretRec Structure

       Symbol interpretations are used to guide the X server when it modifies the  Xkb  keymap  in  step  2.  An
       initial  set  of symbol interpretations is loaded by the server when it starts. A client may add new ones
       using XkbSetCompatMap.

       Symbol interpretations result in key semantics being set. When a symbol interpretation  is  applied,  the
       following components of server key event processing may be modified for the particular key involved:

           Virtual modifier map
           Auto repeat
           Key behavior (may be set to XkbKB_Lock)
           Key action

       The XkbSymInterpretRec structure specifies a symbol interpretation:

       typedef struct {
           KeySym        sym;         /∗ keysym of interest or NULL */
           unsigned char flags;       /∗ XkbSI_AutoRepeat, XkbSI_LockingKey */
           unsigned char match;       /∗ specifies how mods is interpreted */
           unsigned char mods;        /∗ modifier bits, correspond to eight real modifiers */
           unsigned char virtual_mod; /∗ 1 modifier to add to key virtual mod map */
           XkbAnyAction  act;         /∗ action to bind to symbol position on key */
       } XkbSymInterpretRec,*XkbSymInterpretPtr;

       If  sym  is  not  NULL,  it  limits  the symbol interpretation to keys on which that particular keysym is
       selected by the modifiers matching the criteria specified by  mods  and  match.   If  sym  is  NULL,  the
       interpretation  may  be  applied  to  any  symbol selected on a key when the modifiers match the criteria
       specified by mods and match.

       match must be one of the values shown in Table 2 and specifies how the real modifiers specified  in  mods
       are to be interpreted.

              Table 2 Symbol Interpretation Match Criteria
       ───────────────────────────────────────────────────────────
       Match Criteria      Value   Effect
       ───────────────────────────────────────────────────────────
       XkbSI_NoneOf        (0)     None  of  the bits that are on
                                   in mods can be set, but  other
                                   bits can be.

       XkbSI_AnyOfOrNone   (1)     Zero  or more of the bits that
                                   are on in mods can be set,  as
                                   well as others.
       XkbSI_AnyOf         (2)     One  or  more of the bits that
                                   are on in mods can be set,  as
                                   well as any others.
       XkbSI_AllOf         (3)     All of the bits that are on in
                                   mods must be set,  but  others
                                   may be set as well.
       XkbSI_Exactly       (4)     All of the bits that are on in
                                   mods must be set, and no other
                                   bits may be set.

       In  addition  to the above bits, match may contain the XkbSI_LevelOneOnly bit, in which case the modifier
       match criteria specified by mods and match applies only if sym is in level one of its  group;  otherwise,
       mods and match are ignored and the symbol matches a condition where no modifiers are set.

       #define XkbSI_LevelOneOnly  (0x80)  /∗ use mods + match only if sym is level 1 */

       If no matching symbol interpretation is found, the server uses a default interpretation where:

           sym =           0
           flags =         XkbSI_AutoRepeat
           match =         XkbSI_AnyOfOrNone
           mods =          0
           virtual_mod =   XkbNoModifier
           act =           SA_NoAction

       When  a  matching  symbol interpretation is found in step 2a, the interpretation is applied to modify the
       Xkb map as follows.

       The act field specifies a single action to be bound to the symbol position; any key  event  that  selects
       the symbol causes the action to be taken. Valid actions are defined in Key Actions.

       If the Xkb keyboard map for the key does not have its ExplicitVModMap control set, the XkbSI_LevelOneOnly
       bit and symbol position are examined. If the XkbSI_LevelOneOnly bit is not set in match or the symbol  is
       in  position  G1L1,  the  virtual_mod field is examined. If virtual_mod is not XkbNoModifier, virtual_mod
       specifies a single virtual modifier to be added to the virtual modifier map for the key.  virtual_mod  is
       specified as an index in the range [0..15].

       If  the  matching  symbol is in position G1L1 of the key, two bits in the flags field potentially specify
       additional behavior modifications:

       #define  XkbSI_AutoRepeat  (1<<0)  /∗ key repeats if sym is in position G1L1 */
       #define  XkbSI_LockingKey  (1<<1)  /∗ set KB_Lock behavior if sym is in psn G1L1 */

       If the Xkb keyboard map for the key does not have its ExplicitAutoRepeat control  set,  its  auto  repeat
       behavior  is  set based on the value of the XkbSI_AutoRepeat bit. If the XkbSI_AutoRepeat bit is set, the
       auto-repeat behavior of the key is turned on; otherwise, it is turned off.

       If the Xkb keyboard map for the key does not have its ExplicitBehavior control set, its locking  behavior
       is  set  based  on the value of the XkbSI_LockingKey bit. If XkbSI_LockingKey is set, the key behavior is
       set to KB_Lock; otherwise, it is turned off.

SEE ALSO

       XkbKeyAction(3), XkbKeyActionEntry(3), XkbKeyActionsPtr(3), XkbKeyHasActions(3), XkbKeyNumActions(3)