Provided by: libx11-doc_1.8.4-2_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)