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)