1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
|
'\" t
.\" Copyright 1999 Oracle and/or its affiliates. All rights reserved.
.\"
.\" Permission is hereby granted, free of charge, to any person obtaining a
.\" copy of this software and associated documentation files (the "Software"),
.\" to deal in the Software without restriction, including without limitation
.\" the rights to use, copy, modify, merge, publish, distribute, sublicense,
.\" and/or sell copies of the Software, and to permit persons to whom the
.\" Software is furnished to do so, subject to the following conditions:
.\"
.\" The above copyright notice and this permission notice (including the next
.\" paragraph) shall be included in all copies or substantial portions of the
.\" Software.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
.\" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
.\" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
.\" THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
.\" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
.\" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
.\" DEALINGS IN THE SOFTWARE.
.\"
.TH XkbApplyCompatMapToKey __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
.SH NAME
XkbApplyCompatMapToKey \- Apply the new compatibility mapping to an individual
key to get its semantics updated
.SH SYNOPSIS
.HP
.B Bool XkbApplyCompatMapToKey
.BI "(\^XkbDescPtr " "xkb" "\^,"
.BI "KeyCode " "key" "\^,"
.BI "XkbChangesPtr " "changes" "\^);"
.if n .ti +5n
.if t .ti +.5i
.SH ARGUMENTS
.TP
.I \- xkb
keyboard description to be updated
.TP
.I \- key
key to be updated
.TP
.I \- changes
notes changes to the Xkb keyboard description
.SH DESCRIPTION
.LP
.I 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.
.B 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:
.B 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
.I 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.
.TS
c s s
l l l
l l lw(3i).
Table 1 Explicit Component Masks
_
Bit in Explicit Mask Value Protects Against
_
ExplicitKeyType1 (1<<0) T{
Automatic determination of the key type associated with Group1.
T}
ExplicitKeyType2 (1<<1) T{
Automatic determination of the key type associated with Group2.
T}
ExplicitKeyType3 (1<<2) T{
Automatic determination of the key type associated with Group3.
T}
ExplicitKeyType4 (1<<3) T{
Automatic determination of the key type associated with Group4.
T}
ExplicitInterpret (1<<4) T{
Application of any of the fields of a symbol interpretation to the key in
question.
T}
ExplicitAutoRepeat (1<<5) T{
Automatic determination of auto-repeat status for the key, as specified in a
symbol interpretation.
T}
ExplicitBehavior (1<<6) T{
Automatic assignment of the XkbKB_Lock behavior to the key, if the
XkbSI_LockingKey flag is set in a symbol interpretation.
T}
ExplicitVModMap (1<<7) T{
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.
T}
.TE
.TP 4
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.
.TP 4
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.
.TP 4
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.
.TP 4
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):
.nf
G1L1 G1L2 G2L1 G2L2 G3L1 G3L2 G3L3
.fi
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:
.nf
G1L1 G1L2 G2L1 G2L2 G1L3 G2L3 G3L1 G3L2 G3L3 G4L1 G4L2 G4L3
.fi
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.
.TP 4
1d.
For each group on each changed key, assign a key type appropriate for the
symbols in the group.
.TP 4
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.
.TP 4
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).
.TP 4
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.
.TP 4
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.
.LP
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.
.B 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:
.nf
Virtual modifier map
Auto repeat
Key behavior (may be set to XkbKB_Lock)
Key action
.fi
The XkbSymInterpretRec structure specifies a symbol interpretation:
.nf
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;
.fi
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
.I mods
and
.I match.
If
.I sym
is NULL, the interpretation may be applied to any symbol selected on a key when
the modifiers match the criteria specified by
.I mods
and
.I match.
.I match
must be one of the values shown in Table 2 and specifies how the real modifiers
specified in
.I mods
are to be interpreted.
.TS
c s s
l l l
l l lw(3i).
Table 2 Symbol Interpretation Match Criteria
_
Match Criteria Value Effect
_
XkbSI_NoneOf (0) T{
None of the bits that are on in mods can be set, but other bits can be.
T}
XkbSI_AnyOfOrNone (1) T{
Zero or more of the bits that are on in mods can be set, as well as others.
T}
XkbSI_AnyOf (2) T{
One or more of the bits that are on in mods can be set, as well as any others.
T}
XkbSI_AllOf (3) T{
All of the bits that are on in mods must be set, but others may be set as well.
T}
XkbSI_Exactly (4) T{
All of the bits that are on in mods must be set, and no other bits may be set.
T}
.TE
In addition to the above bits,
.I match
may contain the XkbSI_LevelOneOnly bit, in which case the modifier match
criteria specified by
.I mods
and
.I match
applies only if
.I sym
is in level one of its group; otherwise,
.I mods
and
.I match
are ignored and the symbol matches a condition where no modifiers are set.
.nf
\&#define XkbSI_LevelOneOnly (0x80) /\(** use mods + match only if sym is level 1 */
.fi
If no matching symbol interpretation is found, the server uses a default
interpretation where:
.nf
sym = 0
flags = XkbSI_AutoRepeat
match = XkbSI_AnyOfOrNone
mods = 0
virtual_mod = XkbNoModifier
act = SA_NoAction
.fi
When a matching symbol interpretation is found in step 2a, the interpretation is
applied to modify the Xkb map as follows.
The
.I 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
.I match
or the symbol is in position G1L1, the
.I virtual_mod
field is examined. If
.I virtual_mod
is not XkbNoModifier,
.I virtual_mod
specifies a single virtual modifier to be added to the virtual modifier map for the key.
.I 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:
.nf
\&#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 */
.fi
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.
.SH "SEE ALSO"
.BR XkbKeyAction (__libmansuffix__),
.BR XkbKeyActionEntry (__libmansuffix__),
.BR XkbKeyActionsPtr (__libmansuffix__),
.BR XkbKeyHasActions (__libmansuffix__),
.BR XkbKeyNumActions (__libmansuffix__)
|