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)