ch16.xml revision e9fcaa8a
1e9fcaa8aSmrg<chapter id='xkb_server_keyboard_mapping'>
2e9fcaa8aSmrg<title>Xkb Server Keyboard Mapping</title>
3e9fcaa8aSmrg
4e9fcaa8aSmrg<para>
5e9fcaa8aSmrgThe <emphasis>
6e9fcaa8aSmrgserver</emphasis>
7e9fcaa8aSmrg field of the complete Xkb keyboard description (see section 6.1) is a pointer
8e9fcaa8aSmrgto the Xkb server map.
9e9fcaa8aSmrg</para>
10e9fcaa8aSmrg
11e9fcaa8aSmrg
12e9fcaa8aSmrg<para>
13e9fcaa8aSmrgFigure 16.1 shows the relationships between elements in the server map:
14e9fcaa8aSmrg</para>
15e9fcaa8aSmrg
16e9fcaa8aSmrg<mediaobject>
17e9fcaa8aSmrg <imageobject> <imagedata format="SVG" fileref="XKBlib-16.svg"/>
18e9fcaa8aSmrg </imageobject>
19e9fcaa8aSmrg<caption>Server Map Relationships</caption>
20e9fcaa8aSmrg </mediaobject>
21e9fcaa8aSmrg
22e9fcaa8aSmrg
23e9fcaa8aSmrg<!--
24e9fcaa8aSmrg<H5 CLASS="Figure">
25e9fcaa8aSmrgServer Map Relationships</H5>
26e9fcaa8aSmrg-->
27e9fcaa8aSmrg
28e9fcaa8aSmrg<para>
29e9fcaa8aSmrgThe Xkb server map contains the information the server needs to interpret key
30e9fcaa8aSmrgevents and is of type <emphasis>
31e9fcaa8aSmrgXkbServerMapRec</emphasis>
32e9fcaa8aSmrg:
33e9fcaa8aSmrg</para>
34e9fcaa8aSmrg
35e9fcaa8aSmrg<para><programlisting>
36e9fcaa8aSmrg#define XkbNumVirtualMods            16
37e9fcaa8aSmrg</programlisting></para>
38e9fcaa8aSmrg
39e9fcaa8aSmrg<para><programlisting>
40e9fcaa8aSmrgtypedef struct {                         /* Server Map */
41e9fcaa8aSmrg      unsigned short     num_acts;       /* # of occupied entries in <emphasis> acts</emphasis> */
42e9fcaa8aSmrg      unsigned short     size_acts;      /* # of entries in <emphasis> acts</emphasis> */
43e9fcaa8aSmrg      XkbAction *        acts;           /* linear 2d tables of key actions, 1 per keycode */
44e9fcaa8aSmrg      XkbBehavior *      behaviors;      /* key behaviors,1 per keycode */
45e9fcaa8aSmrg      unsigned short *   key_acts;       /* index into <emphasis> acts</emphasis> , 1 per keycode */
46e9fcaa8aSmrg      unsigned char *    explicit;       /* explicit overrides of core remapping, 1 per key */
47e9fcaa8aSmrg      unsigned char      vmods[XkbNumVirtualMods];  /* real mods bound to virtual mods */
48e9fcaa8aSmrg      unsigned short *   vmodmap;        /* virtual mods bound to key, 1 per keycode*/
49e9fcaa8aSmrg} <emphasis>XkbServerMapRec</emphasis>, *XkbServerMapPtr;
50e9fcaa8aSmrg</programlisting></para>
51e9fcaa8aSmrg
52e9fcaa8aSmrg<para>
53e9fcaa8aSmrgThe <emphasis>
54e9fcaa8aSmrgnum_acts</emphasis>
55e9fcaa8aSmrg, <emphasis>
56e9fcaa8aSmrgsize_acts</emphasis>
57e9fcaa8aSmrg, <emphasis>
58e9fcaa8aSmrgacts</emphasis>
59e9fcaa8aSmrg, and <emphasis>
60e9fcaa8aSmrgkey_acts</emphasis>
61e9fcaa8aSmrg fields specify the key actions, defined in section 16.1. The <emphasis>
62e9fcaa8aSmrgbehaviors</emphasis>
63e9fcaa8aSmrg field describes the behavior for each key and is defined in section 16.2. The
64e9fcaa8aSmrg<emphasis>
65e9fcaa8aSmrgexplicit</emphasis>
66e9fcaa8aSmrg field describes the explicit components for a key and is defined in section
67e9fcaa8aSmrg16.3. The <emphasis>
68e9fcaa8aSmrgvmods</emphasis>
69e9fcaa8aSmrg and the <emphasis>
70e9fcaa8aSmrgvmodmap</emphasis>
71e9fcaa8aSmrg fields describe the virtual modifiers and the per-key virtual modifier mapping
72e9fcaa8aSmrgand are defined in section 16.4.
73e9fcaa8aSmrg</para>
74e9fcaa8aSmrg
75e9fcaa8aSmrg<sect1 id='key_actions'>
76e9fcaa8aSmrg<title>Key Actions</title>
77e9fcaa8aSmrg
78e9fcaa8aSmrg<para>
79e9fcaa8aSmrgA key action defines the effect key presses and releases have on the internal
80e9fcaa8aSmrgstate of the server. For example, the expected key action associated with
81e9fcaa8aSmrgpressing the <emphasis>
82e9fcaa8aSmrgShift</emphasis>
83e9fcaa8aSmrg key is to set the <emphasis>
84e9fcaa8aSmrgShift</emphasis>
85e9fcaa8aSmrg modifier. There is zero or one key action associated with each keysym bound to
86e9fcaa8aSmrgeach key.
87e9fcaa8aSmrg</para>
88e9fcaa8aSmrg
89e9fcaa8aSmrg
90e9fcaa8aSmrg<para>
91e9fcaa8aSmrgJust as the entire list of key symbols for the keyboard mapping is held in the
92e9fcaa8aSmrg<emphasis>
93e9fcaa8aSmrgsyms</emphasis>
94e9fcaa8aSmrg field of the client map, the entire list of key actions for the keyboard
95e9fcaa8aSmrgmapping is held in the <emphasis>
96e9fcaa8aSmrgacts</emphasis>
97e9fcaa8aSmrg array of the server map. The total size of <emphasis>
98e9fcaa8aSmrgacts</emphasis>
99e9fcaa8aSmrg is specified by <emphasis>
100e9fcaa8aSmrgsize_acts</emphasis>
101e9fcaa8aSmrg, and the number of entries is specified by <emphasis>
102e9fcaa8aSmrgnum_acts</emphasis>.
103e9fcaa8aSmrg</para>
104e9fcaa8aSmrg
105e9fcaa8aSmrg
106e9fcaa8aSmrg<para>
107e9fcaa8aSmrgThe <emphasis>
108e9fcaa8aSmrgkey_acts</emphasis>
109e9fcaa8aSmrg array, indexed by keycode, describes the actions associated with a key. The
110e9fcaa8aSmrg<emphasis>
111e9fcaa8aSmrgkey_acts</emphasis>
112e9fcaa8aSmrg array has <emphasis>
113e9fcaa8aSmrgmin_key_code</emphasis>
114e9fcaa8aSmrg unused entries at the start to allow direct indexing using a keycode. If a
115e9fcaa8aSmrg<emphasis>
116e9fcaa8aSmrgkey_acts</emphasis>
117e9fcaa8aSmrg entry is <emphasis>
118e9fcaa8aSmrgzero</emphasis>
119e9fcaa8aSmrg, it means the key does not have any actions associated with it. If an entry is
120e9fcaa8aSmrgnot <emphasis>
121e9fcaa8aSmrgzero</emphasis>
122e9fcaa8aSmrg, the entry represents an index into the <emphasis>
123e9fcaa8aSmrgacts</emphasis>
124e9fcaa8aSmrg field of the server map, much as the <emphasis>
125e9fcaa8aSmrgoffset</emphasis>
126e9fcaa8aSmrg field of a <emphasis>
127e9fcaa8aSmrgKeySymMapRec</emphasis>
128e9fcaa8aSmrg structure is an index into the <emphasis>
129e9fcaa8aSmrgsyms</emphasis>
130e9fcaa8aSmrg field of the client map.
131e9fcaa8aSmrg</para>
132e9fcaa8aSmrg
133e9fcaa8aSmrg<para>
134e9fcaa8aSmrgThe reason the <emphasis>
135e9fcaa8aSmrgacts</emphasis>
136e9fcaa8aSmrg field is a linear list of <emphasis>
137e9fcaa8aSmrgXkbAction</emphasis>
138e9fcaa8aSmrgs is to reduce the memory consumption associated with a keymap. Because Xkb
139e9fcaa8aSmrgallows individual keys to have multiple shift levels and a different number of
140e9fcaa8aSmrggroups per key, a single two-dimensional array of <emphasis>
141e9fcaa8aSmrgKeySyms</emphasis>
142e9fcaa8aSmrg would potentially be very large and sparse. Instead, Xkb provides a small
143e9fcaa8aSmrgtwo-dimensional array of <emphasis>
144e9fcaa8aSmrgXkbAction</emphasis>
145e9fcaa8aSmrgs for each key. To store all of these individual arrays, Xkb concatenates each
146e9fcaa8aSmrgarray together in the <emphasis>
147e9fcaa8aSmrgacts</emphasis>
148e9fcaa8aSmrg field of the server map.
149e9fcaa8aSmrg</para>
150e9fcaa8aSmrg
151e9fcaa8aSmrg
152e9fcaa8aSmrg<para>
153e9fcaa8aSmrgThe key action structures consist only of fields of type char or unsigned char.
154e9fcaa8aSmrgThis is done to optimize data transfer when the server sends bytes over the
155e9fcaa8aSmrgwire. If the fields are anything but bytes, the server has to sift through all
156e9fcaa8aSmrgof the actions and swap any nonbyte fields. Because they consist of nothing but
157e9fcaa8aSmrgbytes, it can just copy them out.
158e9fcaa8aSmrg</para>
159e9fcaa8aSmrg
160e9fcaa8aSmrg
161e9fcaa8aSmrg<para>
162e9fcaa8aSmrgXkb provides the following macros, to simplify accessing information pertaining
163e9fcaa8aSmrgto key actions:
164e9fcaa8aSmrg</para>
165e9fcaa8aSmrg
166e9fcaa8aSmrg<informaltable frame='none'>
167e9fcaa8aSmrg<tgroup cols='1'>
168e9fcaa8aSmrg<colspec colsep='0'/>
169e9fcaa8aSmrg<tbody>
170e9fcaa8aSmrg  <row rowsep='0'>
171e9fcaa8aSmrg    <entry role='functiondecl'>
172e9fcaa8aSmrgBool <emphasis>
173e9fcaa8aSmrgXkbKeyHasActions</emphasis>
174e9fcaa8aSmrg(<emphasis>
175e9fcaa8aSmrgxkb, keycode</emphasis>
176e9fcaa8aSmrg)                              /* macro */
177e9fcaa8aSmrg    </entry>
178e9fcaa8aSmrg  </row>
179e9fcaa8aSmrg  <row rowsep='0'>
180e9fcaa8aSmrg    <entry role='functionargdecl'>
181e9fcaa8aSmrgXkbDescPtr            <emphasis>
182e9fcaa8aSmrgxkb</emphasis>
183e9fcaa8aSmrg;                  /* Xkb description of interest */
184e9fcaa8aSmrg    </entry>
185e9fcaa8aSmrg  </row>
186e9fcaa8aSmrg  <row rowsep='0'>
187e9fcaa8aSmrg    <entry role='functionargdecl'>
188e9fcaa8aSmrgKeyCode            <emphasis>
189e9fcaa8aSmrgkeycode</emphasis>
190e9fcaa8aSmrg;                  /* keycode of interest */
191e9fcaa8aSmrg    </entry>
192e9fcaa8aSmrg</row>
193e9fcaa8aSmrg</tbody>
194e9fcaa8aSmrg</tgroup>
195e9fcaa8aSmrg</informaltable>
196e9fcaa8aSmrg
197e9fcaa8aSmrg<para>
198e9fcaa8aSmrg<emphasis>
199e9fcaa8aSmrgXkbKeyHasActions</emphasis>
200e9fcaa8aSmrg returns <emphasis>
201e9fcaa8aSmrgTrue</emphasis>
202e9fcaa8aSmrg if the key corresponding to <emphasis>
203e9fcaa8aSmrgkeycode</emphasis>
204e9fcaa8aSmrg has any actions associated with it; otherwise, it returns <emphasis>
205e9fcaa8aSmrgFalse</emphasis>
206e9fcaa8aSmrg.
207e9fcaa8aSmrg</para>
208e9fcaa8aSmrg
209e9fcaa8aSmrg
210e9fcaa8aSmrg<informaltable frame='none'>
211e9fcaa8aSmrg<tgroup cols='1'>
212e9fcaa8aSmrg<colspec colsep='0'/>
213e9fcaa8aSmrg<tbody>
214e9fcaa8aSmrg  <row rowsep='0'>
215e9fcaa8aSmrg    <entry role='functiondecl'>
216e9fcaa8aSmrgint <emphasis>
217e9fcaa8aSmrgXkbKeyNumActions</emphasis>
218e9fcaa8aSmrg(<emphasis>
219e9fcaa8aSmrgxkb, keycode</emphasis>
220e9fcaa8aSmrg)                              /* macro */
221e9fcaa8aSmrg    </entry>
222e9fcaa8aSmrg  </row>
223e9fcaa8aSmrg  <row rowsep='0'>
224e9fcaa8aSmrg    <entry role='functionargdecl'>
225e9fcaa8aSmrgXkbDescPtr            <emphasis>
226e9fcaa8aSmrgxkb</emphasis>
227e9fcaa8aSmrg;                  /* Xkb description of interest */
228e9fcaa8aSmrg    </entry>
229e9fcaa8aSmrg  </row>
230e9fcaa8aSmrg  <row rowsep='0'>
231e9fcaa8aSmrg    <entry role='functionargdecl'>
232e9fcaa8aSmrgKeyCode            <emphasis>
233e9fcaa8aSmrgkeycode</emphasis>
234e9fcaa8aSmrg;                  /* keycode of interest */
235e9fcaa8aSmrg    </entry>
236e9fcaa8aSmrg</row>
237e9fcaa8aSmrg</tbody>
238e9fcaa8aSmrg</tgroup>
239e9fcaa8aSmrg</informaltable>
240e9fcaa8aSmrg
241e9fcaa8aSmrg<para>
242e9fcaa8aSmrg<emphasis>
243e9fcaa8aSmrgXkbKeyNumActions</emphasis>
244e9fcaa8aSmrg computes the number of actions associated with the key corresponding to
245e9fcaa8aSmrg<emphasis>
246e9fcaa8aSmrgkeycode</emphasis>
247e9fcaa8aSmrg. This should be the same value as the result of <emphasis>
248e9fcaa8aSmrgXkbKeyNumSyms</emphasis>
249e9fcaa8aSmrg (see section 15.3.3).
250e9fcaa8aSmrg</para>
251e9fcaa8aSmrg
252e9fcaa8aSmrg
253e9fcaa8aSmrg<informaltable frame='none'>
254e9fcaa8aSmrg<tgroup cols='1'>
255e9fcaa8aSmrg<colspec colsep='0'/>
256e9fcaa8aSmrg<tbody>
257e9fcaa8aSmrg  <row rowsep='0'>
258e9fcaa8aSmrg    <entry role='functiondecl'>
259e9fcaa8aSmrgXkbKeyActionPtr <emphasis>
260e9fcaa8aSmrgXkbKeyActionsPtr</emphasis>
261e9fcaa8aSmrg(<emphasis>
262e9fcaa8aSmrgxkb, keycode</emphasis>
263e9fcaa8aSmrg)                              /* macro */
264e9fcaa8aSmrg    </entry>
265e9fcaa8aSmrg  </row>
266e9fcaa8aSmrg  <row rowsep='0'>
267e9fcaa8aSmrg    <entry role='functionargdecl'>
268e9fcaa8aSmrgXkbDescPtr            <emphasis>
269e9fcaa8aSmrgxkb</emphasis>
270e9fcaa8aSmrg;                  /* Xkb description of interest */
271e9fcaa8aSmrg    </entry>
272e9fcaa8aSmrg  </row>
273e9fcaa8aSmrg  <row rowsep='0'>
274e9fcaa8aSmrg    <entry role='functionargdecl'>
275e9fcaa8aSmrgKeyCode            <emphasis>
276e9fcaa8aSmrgkeycode</emphasis>
277e9fcaa8aSmrg;                  /* keycode of interest */
278e9fcaa8aSmrg    </entry>
279e9fcaa8aSmrg</row>
280e9fcaa8aSmrg</tbody>
281e9fcaa8aSmrg</tgroup>
282e9fcaa8aSmrg</informaltable>
283e9fcaa8aSmrg
284e9fcaa8aSmrg<para>
285e9fcaa8aSmrg<emphasis>
286e9fcaa8aSmrgXkbKeyActionsPtr</emphasis>
287e9fcaa8aSmrg returns a pointer to the two-dimensional array of key actions associated with
288e9fcaa8aSmrgthe key corresponding to <emphasis>
289e9fcaa8aSmrgkeycode</emphasis>
290e9fcaa8aSmrg. Use<emphasis>
291e9fcaa8aSmrg XkbKeyActionsPtr</emphasis>
292e9fcaa8aSmrg only if the key actually has some actions associated with it, that is,
293e9fcaa8aSmrg<emphasis>
294e9fcaa8aSmrgXkbKeyNumActions</emphasis>
295e9fcaa8aSmrg(xkb, keycode) returns something greater than zero.
296e9fcaa8aSmrg</para>
297e9fcaa8aSmrg
298e9fcaa8aSmrg
299e9fcaa8aSmrg<informaltable frame='none'>
300e9fcaa8aSmrg<tgroup cols='1'>
301e9fcaa8aSmrg<colspec colsep='0'/>
302e9fcaa8aSmrg<tbody>
303e9fcaa8aSmrg  <row rowsep='0'>
304e9fcaa8aSmrg    <entry role='functiondecl'>
305e9fcaa8aSmrgXkbAction <emphasis>
306e9fcaa8aSmrgXkbKeyAction</emphasis>
307e9fcaa8aSmrg(<emphasis>
308e9fcaa8aSmrgxkb, keycode, idx</emphasis>
309e9fcaa8aSmrg)                              /* macro */
310e9fcaa8aSmrg    </entry>
311e9fcaa8aSmrg  </row>
312e9fcaa8aSmrg  <row rowsep='0'>
313e9fcaa8aSmrg    <entry role='functionargdecl'>
314e9fcaa8aSmrgXkbDescPtr            <emphasis>
315e9fcaa8aSmrgxkb</emphasis>
316e9fcaa8aSmrg;                  /* Xkb description of interest */
317e9fcaa8aSmrg    </entry>
318e9fcaa8aSmrg  </row>
319e9fcaa8aSmrg  <row rowsep='0'>
320e9fcaa8aSmrg    <entry role='functionargdecl'>
321e9fcaa8aSmrgKeyCode            <emphasis>
322e9fcaa8aSmrgkeycode</emphasis>
323e9fcaa8aSmrg;                  /* keycode of interest */
324e9fcaa8aSmrg    </entry>
325e9fcaa8aSmrg  </row>
326e9fcaa8aSmrg  <row rowsep='0'>
327e9fcaa8aSmrg    <entry role='functionargdecl'>
328e9fcaa8aSmrgint            <emphasis>
329e9fcaa8aSmrgidx</emphasis>
330e9fcaa8aSmrg;                  /* index for group and shift level */
331e9fcaa8aSmrg    </entry>
332e9fcaa8aSmrg</row>
333e9fcaa8aSmrg</tbody>
334e9fcaa8aSmrg</tgroup>
335e9fcaa8aSmrg</informaltable>
336e9fcaa8aSmrg
337e9fcaa8aSmrg<para>
338e9fcaa8aSmrg<emphasis>
339e9fcaa8aSmrgXkbKeyAction</emphasis>
340e9fcaa8aSmrg returns the key action indexed by <emphasis>
341e9fcaa8aSmrgidx</emphasis>
342e9fcaa8aSmrg in the two-dimensional array of key actions associated with the key
343e9fcaa8aSmrgcorresponding to <emphasis>
344e9fcaa8aSmrgkeycode</emphasis>
345e9fcaa8aSmrg. <emphasis>
346e9fcaa8aSmrgidx</emphasis>
347e9fcaa8aSmrg may be computed from the group and shift level of interest as follows:
348e9fcaa8aSmrg</para>
349e9fcaa8aSmrg
350e9fcaa8aSmrg<literallayout>
351e9fcaa8aSmrg     idx = group_index * key_width + shift_level
352e9fcaa8aSmrg</literallayout>
353e9fcaa8aSmrg
354e9fcaa8aSmrg<informaltable frame='none'>
355e9fcaa8aSmrg<tgroup cols='1'>
356e9fcaa8aSmrg<colspec colsep='0'/>
357e9fcaa8aSmrg<tbody>
358e9fcaa8aSmrg  <row rowsep='0'>
359e9fcaa8aSmrg    <entry role='functiondecl'>
360e9fcaa8aSmrgXkbAction <emphasis>
361e9fcaa8aSmrgXkbKeyActionEntry</emphasis>
362e9fcaa8aSmrg(<emphasis>
363e9fcaa8aSmrgxkb, keycode, shift, grp</emphasis>
364e9fcaa8aSmrg)                              /* macro */
365e9fcaa8aSmrg    </entry>
366e9fcaa8aSmrg  </row>
367e9fcaa8aSmrg  <row rowsep='0'>
368e9fcaa8aSmrg    <entry role='functionargdecl'>
369e9fcaa8aSmrgXkbDescPtr            <emphasis>
370e9fcaa8aSmrgxkb</emphasis>
371e9fcaa8aSmrg;                  /* Xkb description of interest */
372e9fcaa8aSmrg    </entry>
373e9fcaa8aSmrg  </row>
374e9fcaa8aSmrg  <row rowsep='0'>
375e9fcaa8aSmrg    <entry role='functionargdecl'>
376e9fcaa8aSmrgKeyCode            <emphasis>
377e9fcaa8aSmrgkeycode</emphasis>
378e9fcaa8aSmrg;                  /* keycode of interest */
379e9fcaa8aSmrg    </entry>
380e9fcaa8aSmrg  </row>
381e9fcaa8aSmrg  <row rowsep='0'>
382e9fcaa8aSmrg    <entry role='functionargdecl'>
383e9fcaa8aSmrgint            <emphasis>
384e9fcaa8aSmrgshift</emphasis>
385e9fcaa8aSmrg;                  /* shift level within group */
386e9fcaa8aSmrg    </entry>
387e9fcaa8aSmrg  </row>
388e9fcaa8aSmrg  <row rowsep='0'>
389e9fcaa8aSmrg    <entry role='functionargdecl'>
390e9fcaa8aSmrgint            <emphasis>
391e9fcaa8aSmrggrp</emphasis>
392e9fcaa8aSmrg;                  /* group index for group of interest */
393e9fcaa8aSmrg    </entry>
394e9fcaa8aSmrg</row>
395e9fcaa8aSmrg</tbody>
396e9fcaa8aSmrg</tgroup>
397e9fcaa8aSmrg</informaltable>
398e9fcaa8aSmrg
399e9fcaa8aSmrg<para>
400e9fcaa8aSmrg<emphasis>
401e9fcaa8aSmrgXkbKeyActionEntry</emphasis>
402e9fcaa8aSmrg returns the key action corresponding to group <emphasis>
403e9fcaa8aSmrggrp</emphasis>
404e9fcaa8aSmrg and shift level <emphasis>
405e9fcaa8aSmrglvl</emphasis>
406e9fcaa8aSmrg from the two-dimensional table of key actions associated with the key
407e9fcaa8aSmrgcorresponding to <emphasis>
408e9fcaa8aSmrgkeycode</emphasis>
409e9fcaa8aSmrg.
410e9fcaa8aSmrg</para>
411e9fcaa8aSmrg
412e9fcaa8aSmrg
413e9fcaa8aSmrg<sect2 id='the_xkbaction_structure'>
414e9fcaa8aSmrg<title>The XkbAction Structure</title>
415e9fcaa8aSmrg
416e9fcaa8aSmrg<para>
417e9fcaa8aSmrgThe description for an action is held in an <emphasis>
418e9fcaa8aSmrgXkbAction</emphasis>
419e9fcaa8aSmrg structure, which is a union of all possible Xkb action types:
420e9fcaa8aSmrg</para>
421e9fcaa8aSmrg
422e9fcaa8aSmrg<para><programlisting>
423e9fcaa8aSmrgtypedef union _XkbAction {
424e9fcaa8aSmrg      XkbAnyAction              any;
425e9fcaa8aSmrg      XkbModAction              mods;
426e9fcaa8aSmrg      XkbGroupAction            group;
427e9fcaa8aSmrg      XkbISOAction              iso;
428e9fcaa8aSmrg      XkbPtrAction              ptr;
429e9fcaa8aSmrg      XkbPtrBtnAction           btn;
430e9fcaa8aSmrg      XkbPtrDfltAction          dflt;
431e9fcaa8aSmrg      XkbSwitchScreenAction     screen;
432e9fcaa8aSmrg      XkbCtrlsAction            ctrls;
433e9fcaa8aSmrg      XkbMessageAction          msg;
434e9fcaa8aSmrg      XkbRedirectKeyAction      redirect;
435e9fcaa8aSmrg      XkbDeviceBtnAction        devbtn;
436e9fcaa8aSmrg      XkbDeviceValuatorAction   devval;
437e9fcaa8aSmrg      unsigned char             type;
438e9fcaa8aSmrg} <emphasis>XkbAction</emphasis>;
439e9fcaa8aSmrg</programlisting></para>
440e9fcaa8aSmrg
441e9fcaa8aSmrg<para>
442e9fcaa8aSmrgThe <emphasis>
443e9fcaa8aSmrgtype</emphasis>
444e9fcaa8aSmrg field is provided for convenience and is the same as the type field in the
445e9fcaa8aSmrgindividual structures. The following sections describe the individual
446e9fcaa8aSmrgstructures for each action in detail.
447e9fcaa8aSmrg</para>
448e9fcaa8aSmrg
449e9fcaa8aSmrg
450e9fcaa8aSmrg</sect2>
451e9fcaa8aSmrg<sect2 id='the_xkbanyaction_structure'>
452e9fcaa8aSmrg<title>The XkbAnyAction Structure</title>
453e9fcaa8aSmrg
454e9fcaa8aSmrg<para>
455e9fcaa8aSmrgThe <emphasis>
456e9fcaa8aSmrgXkbAnyAction</emphasis>
457e9fcaa8aSmrg structure is a convenience structure that refers to any of the actions:
458e9fcaa8aSmrg</para>
459e9fcaa8aSmrg
460e9fcaa8aSmrg<para><programlisting>
461e9fcaa8aSmrg#define      XkbAnyActionDataSize       7
462e9fcaa8aSmrg</programlisting></para>
463e9fcaa8aSmrg
464e9fcaa8aSmrg<para><programlisting>
465e9fcaa8aSmrgtypedef struct _XkbAnyAction {
466e9fcaa8aSmrg   unsigned char    type;            /* type of action; determines interpretation for data */
467e9fcaa8aSmrg   unsigned char    data[XkbAnyActionDataSize];
468e9fcaa8aSmrg} <emphasis>XkbAnyAction</emphasis>;
469e9fcaa8aSmrg</programlisting></para>
470e9fcaa8aSmrg
471e9fcaa8aSmrg<para>
472e9fcaa8aSmrgThe <emphasis>
473e9fcaa8aSmrgdata</emphasis>
474e9fcaa8aSmrg field represents a structure for an action, and its interpretation depends on
475e9fcaa8aSmrgthe <emphasis>
476e9fcaa8aSmrgtype</emphasis>
477e9fcaa8aSmrg field. The valid values for the <emphasis>
478e9fcaa8aSmrgtype</emphasis>
479e9fcaa8aSmrg field, and the data structures associated with them are shown in Table 16.1:
480e9fcaa8aSmrg</para>
481e9fcaa8aSmrg
482e9fcaa8aSmrg<table frame='none'>
483e9fcaa8aSmrg<title>Action Types</title>
484e9fcaa8aSmrg<tgroup cols='4'>
485e9fcaa8aSmrg<colspec colsep='0'/>
486e9fcaa8aSmrg<colspec colsep='0'/>
487e9fcaa8aSmrg<colspec colsep='0'/>
488e9fcaa8aSmrg<colspec colsep='0'/>
489e9fcaa8aSmrg<thead>
490e9fcaa8aSmrg<row rowsep='0'>
491e9fcaa8aSmrg  <entry>Type</entry>
492e9fcaa8aSmrg  <entry>Structure for Data</entry>
493e9fcaa8aSmrg  <entry>XkbAction Union Member</entry>
494e9fcaa8aSmrg  <entry>Section</entry>
495e9fcaa8aSmrg</row>
496e9fcaa8aSmrg</thead>
497e9fcaa8aSmrg<tbody>
498e9fcaa8aSmrg  <row rowsep='0'>
499e9fcaa8aSmrg    <entry><emphasis>XkbSA_NoAction</emphasis></entry>
500e9fcaa8aSmrg    <entry>
501e9fcaa8aSmrg<emphasis>XkbSA_NoAction</emphasis>
502e9fcaa8aSmrg means the server does not perform an action for the key; this action does not
503e9fcaa8aSmrghave an associated data structure.
504e9fcaa8aSmrg    </entry>
505e9fcaa8aSmrg    <entry>any</entry>
506e9fcaa8aSmrg    <entry></entry>
507e9fcaa8aSmrg  </row>
508e9fcaa8aSmrg  <row rowsep='0'>
509e9fcaa8aSmrg    <entry>
510e9fcaa8aSmrg<para><emphasis>XkbSA_SetMods</emphasis></para>
511e9fcaa8aSmrg<para><emphasis>XkbSA_LatchMods</emphasis></para>
512e9fcaa8aSmrg<para><emphasis>XkbSA_LockMods</emphasis></para>
513e9fcaa8aSmrg    </entry>
514e9fcaa8aSmrg    <entry><para><emphasis>XkbModAction</emphasis></para></entry>
515e9fcaa8aSmrg    <entry>mods</entry>
516e9fcaa8aSmrg    <entry>16.1.3</entry>
517e9fcaa8aSmrg  </row>
518e9fcaa8aSmrg  <row rowsep='0'>
519e9fcaa8aSmrg    <entry>
520e9fcaa8aSmrg<para><emphasis>XkbSA_SetGroup</emphasis></para>
521e9fcaa8aSmrg<para><emphasis>XkbSA_LatchGroup</emphasis></para>
522e9fcaa8aSmrg<para><emphasis>XkbSA_LockGroup</emphasis></para>
523e9fcaa8aSmrg    </entry>
524e9fcaa8aSmrg    <entry><emphasis>XkbGroupAction</emphasis></entry>
525e9fcaa8aSmrg    <entry>group</entry>
526e9fcaa8aSmrg    <entry>16.1.4</entry>
527e9fcaa8aSmrg  </row>
528e9fcaa8aSmrg  <row rowsep='0'>
529e9fcaa8aSmrg    <entry><emphasis>XkbSA_MovePtr</emphasis></entry>
530e9fcaa8aSmrg    <entry><emphasis>XkbPtrAction</emphasis></entry>
531e9fcaa8aSmrg    <entry>ptr</entry>
532e9fcaa8aSmrg    <entry>16.1.5</entry>
533e9fcaa8aSmrg  </row>
534e9fcaa8aSmrg  <row rowsep='0'>
535e9fcaa8aSmrg    <entry>
536e9fcaa8aSmrg<para><emphasis>XKbSA_PtrBtn</emphasis></para>
537e9fcaa8aSmrg<para><emphasis>XkbSA_LockPtrBtn</emphasis></para>
538e9fcaa8aSmrg    </entry>
539e9fcaa8aSmrg    <entry><emphasis>XkbPtrBtnAction</emphasis></entry><entry>btn</entry>
540e9fcaa8aSmrg    <entry>16.1.6</entry>
541e9fcaa8aSmrg  </row>
542e9fcaa8aSmrg  <row rowsep='0'>
543e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetPtrDflt</emphasis></entry>
544e9fcaa8aSmrg    <entry><emphasis>XkbPtrDfltAction</emphasis></entry>
545e9fcaa8aSmrg    <entry>dflt</entry>
546e9fcaa8aSmrg    <entry>16.1.7</entry>
547e9fcaa8aSmrg  </row>
548e9fcaa8aSmrg  <row rowsep='0'>
549e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISOLock</emphasis></entry>
550e9fcaa8aSmrg    <entry><emphasis>XkbISOAction</emphasis></entry>
551e9fcaa8aSmrg    <entry>iso</entry>
552e9fcaa8aSmrg    <entry>16.1.8</entry>
553e9fcaa8aSmrg  </row>
554e9fcaa8aSmrg  <row rowsep='0'>
555e9fcaa8aSmrg    <entry><emphasis>XkbSA_SwitchScreen</emphasis></entry>
556e9fcaa8aSmrg    <entry><emphasis>XkbSwitchScreenAction</emphasis></entry>
557e9fcaa8aSmrg    <entry>screen</entry>
558e9fcaa8aSmrg    <entry>16.1.9</entry>
559e9fcaa8aSmrg  </row>
560e9fcaa8aSmrg  <row rowsep='0'>
561e9fcaa8aSmrg    <entry>
562e9fcaa8aSmrg<para><emphasis>XkbSA_SetControls</emphasis></para>
563e9fcaa8aSmrg<para><emphasis>XkbSA_LockControls</emphasis></para>
564e9fcaa8aSmrg    </entry>
565e9fcaa8aSmrg    <entry><emphasis>XkbCtrlsAction</emphasis></entry>
566e9fcaa8aSmrg    <entry>ctrls</entry>
567e9fcaa8aSmrg    <entry>16.1.10</entry>
568e9fcaa8aSmrg  </row>
569e9fcaa8aSmrg  <row rowsep='0'>
570e9fcaa8aSmrg    <entry><emphasis>XkbSA_ActionMessage</emphasis></entry>
571e9fcaa8aSmrg    <entry><emphasis>XkbMessgeAction</emphasis></entry>
572e9fcaa8aSmrg    <entry>msg</entry>
573e9fcaa8aSmrg    <entry>16.1.11</entry>
574e9fcaa8aSmrg  </row>
575e9fcaa8aSmrg  <row rowsep='0'>
576e9fcaa8aSmrg    <entry><emphasis>XkbSA_RedirectKey</emphasis></entry>
577e9fcaa8aSmrg    <entry><emphasis>XkbRedirectKeyAction</emphasis></entry>
578e9fcaa8aSmrg    <entry>redirect</entry>
579e9fcaa8aSmrg    <entry>16.1.12</entry>
580e9fcaa8aSmrg  </row>
581e9fcaa8aSmrg  <row rowsep='0'>
582e9fcaa8aSmrg    <entry>
583e9fcaa8aSmrg<para><emphasis>XkbSA_DeviceBtn</emphasis></para>
584e9fcaa8aSmrg<para><emphasis>XKbSA_LockDeviceBtn</emphasis></para>
585e9fcaa8aSmrg    </entry>
586e9fcaa8aSmrg    <entry><emphasis>XkbDeviceBtnAction</emphasis></entry>
587e9fcaa8aSmrg    <entry>devbtn</entry>
588e9fcaa8aSmrg    <entry>16.1.13</entry>
589e9fcaa8aSmrg  </row>
590e9fcaa8aSmrg  <row rowsep='0'>
591e9fcaa8aSmrg    <entry><emphasis>XkbSA_DeviceValuator</emphasis></entry>
592e9fcaa8aSmrg    <entry><emphasis>XkbDeviceValuatorAction</emphasis></entry>
593e9fcaa8aSmrg    <entry>devval</entry>
594e9fcaa8aSmrg    <entry>16.1.14</entry>
595e9fcaa8aSmrg  </row>
596e9fcaa8aSmrg</tbody>
597e9fcaa8aSmrg</tgroup>
598e9fcaa8aSmrg</table>
599e9fcaa8aSmrg
600e9fcaa8aSmrg</sect2>
601e9fcaa8aSmrg<sect2 id='actions_for_changing_modifiers_state'>
602e9fcaa8aSmrg<title>Actions for Changing Modifiers’ State</title>
603e9fcaa8aSmrg
604e9fcaa8aSmrg<para>
605e9fcaa8aSmrgActions associated with the <emphasis>
606e9fcaa8aSmrgXkbModAction</emphasis>
607e9fcaa8aSmrg structure change the state of the modifiers when keys are pressed and released
608e9fcaa8aSmrg(see Chapter 7 for a discussion of modifiers):
609e9fcaa8aSmrg</para>
610e9fcaa8aSmrg
611e9fcaa8aSmrg<para><programlisting>
612e9fcaa8aSmrgtypedef struct _XkbModAction {
613e9fcaa8aSmrg      unsigned char     type;         /* <emphasis> XkbSA_{Set|Latch|Lock}Mods</emphasis> */
614e9fcaa8aSmrg      unsigned char     flags;        /* with <emphasis> type</emphasis> , controls the effect on modifiers */
615e9fcaa8aSmrg      unsigned char     mask;         /* same as <emphasis> mask</emphasis> field of a modifier description */
616e9fcaa8aSmrg      unsigned char     real_mods;    /* same as <emphasis> real_mods</emphasis> field of a modifier description */
617e9fcaa8aSmrg      unsigned char     vmods1;       /* derived from <emphasis> vmods</emphasis> field of a modifier description */
618e9fcaa8aSmrg      unsigned char     vmods2;       /* derived from <emphasis> vmods</emphasis> field of a modifier description */
619e9fcaa8aSmrg} <emphasis>XkbModAction</emphasis>;
620e9fcaa8aSmrg</programlisting></para>
621e9fcaa8aSmrg
622e9fcaa8aSmrg<para>
623e9fcaa8aSmrgIn the following description, the term <emphasis>
624e9fcaa8aSmrgaction modifiers</emphasis>
625e9fcaa8aSmrg means the real modifier bits associated with this action. Depending on the
626e9fcaa8aSmrgvalue of <emphasis>
627e9fcaa8aSmrgflags</emphasis>
628e9fcaa8aSmrg (see Table 16.3), these are designated either in the <emphasis>
629e9fcaa8aSmrgmask</emphasis>
630e9fcaa8aSmrg field of the <emphasis>
631e9fcaa8aSmrgXkbModAction</emphasis>
632e9fcaa8aSmrg structure itself or the real modifiers bound to the key for which the action
633e9fcaa8aSmrgis being used. In the latter case, this is the client <emphasis>
634e9fcaa8aSmrgmap</emphasis>
635e9fcaa8aSmrg-&gt;<emphasis>
636e9fcaa8aSmrgmodmap</emphasis>
637e9fcaa8aSmrg[<emphasis>
638e9fcaa8aSmrgkeycode</emphasis>
639e9fcaa8aSmrg] field.
640e9fcaa8aSmrg</para>
641e9fcaa8aSmrg
642e9fcaa8aSmrg
643e9fcaa8aSmrg<para>
644e9fcaa8aSmrgThe <emphasis>
645e9fcaa8aSmrgtype</emphasis>
646e9fcaa8aSmrg field can have any of the values shown in Table 16.2.
647e9fcaa8aSmrg</para>
648e9fcaa8aSmrg
649e9fcaa8aSmrg<table frame='none'>
650e9fcaa8aSmrg<title>Modifier Action Types</title>
651e9fcaa8aSmrg<tgroup cols='2'>
652e9fcaa8aSmrg<colspec colsep='0'/>
653e9fcaa8aSmrg<thead>
654e9fcaa8aSmrg<row rowsep='0'>
655e9fcaa8aSmrg  <entry>Type</entry>
656e9fcaa8aSmrg  <entry>Effect</entry>
657e9fcaa8aSmrg</row>
658e9fcaa8aSmrg</thead>
659e9fcaa8aSmrg<tbody>
660e9fcaa8aSmrg  <row rowsep='0'>
661e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetMods</emphasis></entry>
662e9fcaa8aSmrg    <entry>
663e9fcaa8aSmrg<itemizedlist>
664e9fcaa8aSmrg  <listitem>
665e9fcaa8aSmrg    <para>
666e9fcaa8aSmrgA key press adds any action modifiers to the keyboard’s base modifiers.
667e9fcaa8aSmrg    </para>
668e9fcaa8aSmrg  </listitem>
669e9fcaa8aSmrg  <listitem>
670e9fcaa8aSmrg    <para>
671e9fcaa8aSmrgA key release clears any action modifiers in the keyboard’s base modifiers,
672e9fcaa8aSmrgprovided no other key affecting the same modifiers is logically down.
673e9fcaa8aSmrg    </para>
674e9fcaa8aSmrg  </listitem>
675e9fcaa8aSmrg  <listitem>
676e9fcaa8aSmrg    <para>
677e9fcaa8aSmrgIf no other keys are physically depressed when this key is released, and
678e9fcaa8aSmrg<emphasis>
679e9fcaa8aSmrgXkbSA_ClearLocks</emphasis>
680e9fcaa8aSmrg is set in the <emphasis>
681e9fcaa8aSmrgflags</emphasis>
682e9fcaa8aSmrg field, the key release unlocks any action modifiers.
683e9fcaa8aSmrg    </para>
684e9fcaa8aSmrg  </listitem>
685e9fcaa8aSmrg</itemizedlist>
686e9fcaa8aSmrg    </entry>
687e9fcaa8aSmrg  </row>
688e9fcaa8aSmrg  <row rowsep='0'>
689e9fcaa8aSmrg    <entry><emphasis>XkbSA_LatchMods</emphasis></entry>
690e9fcaa8aSmrg    <entry>
691e9fcaa8aSmrg<itemizedlist>
692e9fcaa8aSmrg  <listitem>
693e9fcaa8aSmrg    <para>
694e9fcaa8aSmrgKey press and key release events have the same effect as for <emphasis>
695e9fcaa8aSmrgXkbSA_SetMods</emphasis>
696e9fcaa8aSmrg; if no keys are physically depressed when this key is released, key release
697e9fcaa8aSmrgevents have the following additional effects:
698e9fcaa8aSmrg    </para>
699e9fcaa8aSmrg  </listitem>
700e9fcaa8aSmrg  <listitem>
701e9fcaa8aSmrg    <para>
702e9fcaa8aSmrgModifiers unlocked due to <emphasis>
703e9fcaa8aSmrgXkbSA_ClearLocks</emphasis>
704e9fcaa8aSmrg have no further effect.
705e9fcaa8aSmrg    </para>
706e9fcaa8aSmrg  </listitem>
707e9fcaa8aSmrg  <listitem>
708e9fcaa8aSmrg    <para>
709e9fcaa8aSmrgIf <emphasis>
710e9fcaa8aSmrgXkbSA_LatchToLock</emphasis>
711e9fcaa8aSmrg is set in the <emphasis>
712e9fcaa8aSmrgflags</emphasis>
713e9fcaa8aSmrg field, a key release locks and then unlatches any remaining action modifiers
714e9fcaa8aSmrgthat are already latched.
715e9fcaa8aSmrg    </para>
716e9fcaa8aSmrg  </listitem>
717e9fcaa8aSmrg  <listitem>
718e9fcaa8aSmrg    <para>
719e9fcaa8aSmrgA key release latches any action modifiers not used by the <emphasis>
720e9fcaa8aSmrgXkbSA_ClearLocks</emphasis>
721e9fcaa8aSmrg and <emphasis>
722e9fcaa8aSmrgXkbSA_LatchToLock</emphasis>
723e9fcaa8aSmrg flags.
724e9fcaa8aSmrg    </para>
725e9fcaa8aSmrg  </listitem>
726e9fcaa8aSmrg  </itemizedlist>
727e9fcaa8aSmrg    </entry>
728e9fcaa8aSmrg  </row>
729e9fcaa8aSmrg  <row rowsep='0'>
730e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockMods</emphasis></entry>
731e9fcaa8aSmrg    <entry>
732e9fcaa8aSmrg<itemizedlist>
733e9fcaa8aSmrg  <listitem>
734e9fcaa8aSmrg    <para>
735e9fcaa8aSmrgA key press sets the base state of any action modifiers. If <emphasis>
736e9fcaa8aSmrgXkbSA_LockNoLock</emphasis>
737e9fcaa8aSmrg is set in the <emphasis>
738e9fcaa8aSmrgflags</emphasis>
739e9fcaa8aSmrg field, a key press also sets the locked state of any action modifiers.
740e9fcaa8aSmrg    </para>
741e9fcaa8aSmrg  </listitem>
742e9fcaa8aSmrg  <listitem>
743e9fcaa8aSmrg    <para>
744e9fcaa8aSmrgA key release clears any action modifiers in the keyboard’s base modifiers,
745e9fcaa8aSmrgprovided no other key that affects the same modifiers is down. If <emphasis>
746e9fcaa8aSmrgXkbSA_LockNoUnlock</emphasis>
747e9fcaa8aSmrg is not set in the <emphasis>
748e9fcaa8aSmrgflags</emphasis>
749e9fcaa8aSmrg field, and any of the action modifiers were locked before the corresponding
750e9fcaa8aSmrgkey press occurred, a key release unlocks them.
751e9fcaa8aSmrg    </para>
752e9fcaa8aSmrg  </listitem>
753e9fcaa8aSmrg</itemizedlist>
754e9fcaa8aSmrg    </entry>
755e9fcaa8aSmrg  </row>
756e9fcaa8aSmrg</tbody>
757e9fcaa8aSmrg</tgroup>
758e9fcaa8aSmrg</table>
759e9fcaa8aSmrg
760e9fcaa8aSmrg<para>
761e9fcaa8aSmrgThe <emphasis>
762e9fcaa8aSmrgflags</emphasis>
763e9fcaa8aSmrg field is composed of the bitwise inclusive OR of the masks shown in Table
764e9fcaa8aSmrg16.3. A general meaning is given in the table, but the exact meaning depends on
765e9fcaa8aSmrgthe action <emphasis>type</emphasis>.
766e9fcaa8aSmrg</para>
767e9fcaa8aSmrg
768e9fcaa8aSmrg<table frame='none'>
769e9fcaa8aSmrg<title>Modifier Action Flags</title>
770e9fcaa8aSmrg<tgroup cols='2'>
771e9fcaa8aSmrg<colspec colsep='0'/>
772e9fcaa8aSmrg<colspec colsep='0'/>
773e9fcaa8aSmrg<thead>
774e9fcaa8aSmrg<row rowsep='0'>
775e9fcaa8aSmrg  <entry>Flag</entry>
776e9fcaa8aSmrg  <entry>Meaning</entry>
777e9fcaa8aSmrg</row>
778e9fcaa8aSmrg</thead>
779e9fcaa8aSmrg<tbody>
780e9fcaa8aSmrg  <row rowsep='0'>
781e9fcaa8aSmrg    <entry><emphasis>XkbSA_UseModMapMods</emphasis></entry>
782e9fcaa8aSmrg    <entry>
783e9fcaa8aSmrgIf set, the action modifiers are determined by the modifiers bound by the
784e9fcaa8aSmrgmodifier mapping of the key. Otherwise, the action modifiers are set to the
785e9fcaa8aSmrgmodifiers specified by the <emphasis>
786e9fcaa8aSmrgmask</emphasis>
787e9fcaa8aSmrg, <emphasis>
788e9fcaa8aSmrgreal_mods</emphasis>
789e9fcaa8aSmrg, <emphasis>
790e9fcaa8aSmrgvmod1</emphasis>
791e9fcaa8aSmrg, and <emphasis>
792e9fcaa8aSmrgvmod2</emphasis>
793e9fcaa8aSmrg fields.
794e9fcaa8aSmrg    </entry>
795e9fcaa8aSmrg  </row>
796e9fcaa8aSmrg  <row rowsep='0'>
797e9fcaa8aSmrg    <entry><emphasis>XkbSA_ClearLocks</emphasis></entry>
798e9fcaa8aSmrg    <entry>
799e9fcaa8aSmrgIf set and no keys are physically depressed when this key transition
800e9fcaa8aSmrgoccurs, the server unlocks any action modifiers.
801e9fcaa8aSmrg   </entry>
802e9fcaa8aSmrg  </row>
803e9fcaa8aSmrg  <row rowsep='0'>
804e9fcaa8aSmrg    <entry><emphasis>XkbSA_LatchToLock</emphasis></entry>
805e9fcaa8aSmrg    <entry>
806e9fcaa8aSmrgIf set, and the action type is <emphasis>
807e9fcaa8aSmrgXkbSA_LatchMods</emphasis>
808e9fcaa8aSmrg, the server locks the action modifiers if they are already latched.
809e9fcaa8aSmrg    </entry>
810e9fcaa8aSmrg  </row>
811e9fcaa8aSmrg  <row rowsep='0'>
812e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
813e9fcaa8aSmrg    <entry>
814e9fcaa8aSmrgIf set, and the action type is <emphasis>
815e9fcaa8aSmrgXkbSA_LockMods</emphasis>
816e9fcaa8aSmrg, the server only unlocks the action modifiers.
817e9fcaa8aSmrg    </entry>
818e9fcaa8aSmrg  </row>
819e9fcaa8aSmrg  <row rowsep='0'>
820e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
821e9fcaa8aSmrg    <entry>
822e9fcaa8aSmrgIf set, and the action is <emphasis>
823e9fcaa8aSmrgXkbSA_LockMods</emphasis>
824e9fcaa8aSmrg, the server only locks the action modifiers.
825e9fcaa8aSmrg    </entry>
826e9fcaa8aSmrg  </row>
827e9fcaa8aSmrg</tbody>
828e9fcaa8aSmrg</tgroup>
829e9fcaa8aSmrg</table>
830e9fcaa8aSmrg
831e9fcaa8aSmrg<para>
832e9fcaa8aSmrgIf <emphasis>
833e9fcaa8aSmrgXkbSA_UseModMapMods</emphasis>
834e9fcaa8aSmrg is not set in the <emphasis>
835e9fcaa8aSmrgflags</emphasis>
836e9fcaa8aSmrg field, the <emphasis>
837e9fcaa8aSmrgmask</emphasis>
838e9fcaa8aSmrg, <emphasis>
839e9fcaa8aSmrgreal_mods</emphasis>
840e9fcaa8aSmrg, <emphasis>
841e9fcaa8aSmrgvmods1</emphasis>
842e9fcaa8aSmrg, and <emphasis>
843e9fcaa8aSmrgvmods2 </emphasis>
844e9fcaa8aSmrgfields are used to determine the action modifiers. Otherwise they are ignored
845e9fcaa8aSmrgand the modifiers bound to the key (client <emphasis>
846e9fcaa8aSmrgmap</emphasis>
847e9fcaa8aSmrg-&gt;<emphasis>
848e9fcaa8aSmrgmodmap</emphasis>
849e9fcaa8aSmrg[<emphasis>
850e9fcaa8aSmrgkeycode</emphasis>
851e9fcaa8aSmrg]) are used instead.
852e9fcaa8aSmrg</para>
853e9fcaa8aSmrg
854e9fcaa8aSmrg
855e9fcaa8aSmrg<para>
856e9fcaa8aSmrgThe <emphasis>
857e9fcaa8aSmrgmask</emphasis>
858e9fcaa8aSmrg, <emphasis>
859e9fcaa8aSmrgreal_mods</emphasis>
860e9fcaa8aSmrg, <emphasis>
861e9fcaa8aSmrgvmods1</emphasis>
862e9fcaa8aSmrg, and <emphasis>
863e9fcaa8aSmrgvmods2</emphasis>
864e9fcaa8aSmrg fields represent the components of an Xkb modifier description (see section
865e9fcaa8aSmrg7.2). While the <emphasis>
866e9fcaa8aSmrgmask</emphasis>
867e9fcaa8aSmrg and <emphasis>
868e9fcaa8aSmrgreal_mods</emphasis>
869e9fcaa8aSmrg fields correspond directly to the <emphasis>
870e9fcaa8aSmrgmask</emphasis>
871e9fcaa8aSmrg and <emphasis>
872e9fcaa8aSmrgreal_mods</emphasis>
873e9fcaa8aSmrg fields of an Xkb modifier description, the <emphasis>
874e9fcaa8aSmrgvmods1</emphasis>
875e9fcaa8aSmrg and <emphasis>
876e9fcaa8aSmrgvmods2</emphasis>
877e9fcaa8aSmrg fields are combined to correspond to the <emphasis>
878e9fcaa8aSmrgvmods</emphasis>
879e9fcaa8aSmrg field of an Xkb modifier description. Xkb provides the following macros, to
880e9fcaa8aSmrgconvert between the two formats:
881e9fcaa8aSmrg</para>
882e9fcaa8aSmrg
883e9fcaa8aSmrg<informaltable frame='none'>
884e9fcaa8aSmrg<tgroup cols='1'>
885e9fcaa8aSmrg<colspec colsep='0'/>
886e9fcaa8aSmrg<tbody>
887e9fcaa8aSmrg  <row rowsep='0'>
888e9fcaa8aSmrg    <entry role='functiondecl'>
889e9fcaa8aSmrgunsigned short <emphasis>
890e9fcaa8aSmrgXkbModActionVMods</emphasis>
891e9fcaa8aSmrg(<emphasis>
892e9fcaa8aSmrgact</emphasis>
893e9fcaa8aSmrg)                              /* macro */
894e9fcaa8aSmrg    </entry>
895e9fcaa8aSmrg  </row>
896e9fcaa8aSmrg  <row rowsep='0'>
897e9fcaa8aSmrg    <entry role='functionargdecl'>
898e9fcaa8aSmrgXkbAction            <emphasis>
899e9fcaa8aSmrgact</emphasis>
900e9fcaa8aSmrg;                  /* action from which to extract virtual mods */
901e9fcaa8aSmrg    </entry>
902e9fcaa8aSmrg</row>
903e9fcaa8aSmrg</tbody>
904e9fcaa8aSmrg</tgroup>
905e9fcaa8aSmrg</informaltable>
906e9fcaa8aSmrg
907e9fcaa8aSmrg<para>
908e9fcaa8aSmrg<emphasis>
909e9fcaa8aSmrgXkbModActionVMods</emphasis>
910e9fcaa8aSmrg returns the <emphasis>
911e9fcaa8aSmrgvmods1</emphasis>
912e9fcaa8aSmrg and <emphasis>
913e9fcaa8aSmrgvmods2</emphasis>
914e9fcaa8aSmrg fields of <emphasis>
915e9fcaa8aSmrgact</emphasis>
916e9fcaa8aSmrg converted to the <emphasis>
917e9fcaa8aSmrgvmods</emphasis>
918e9fcaa8aSmrg format of an Xkb modifier description.
919e9fcaa8aSmrg</para>
920e9fcaa8aSmrg
921e9fcaa8aSmrg
922e9fcaa8aSmrg<informaltable frame='none'>
923e9fcaa8aSmrg<tgroup cols='1'>
924e9fcaa8aSmrg<colspec colsep='0'/>
925e9fcaa8aSmrg<tbody>
926e9fcaa8aSmrg  <row rowsep='0'>
927e9fcaa8aSmrg    <entry role='functiondecl'>
928e9fcaa8aSmrgvoid <emphasis>
929e9fcaa8aSmrgXkbSetModActionVMods</emphasis>
930e9fcaa8aSmrg(<emphasis>
931e9fcaa8aSmrgact, vmods</emphasis>
932e9fcaa8aSmrg)                              /* macro */
933e9fcaa8aSmrg    </entry>
934e9fcaa8aSmrg  </row>
935e9fcaa8aSmrg  <row rowsep='0'>
936e9fcaa8aSmrg    <entry role='functionargdecl'>
937e9fcaa8aSmrgXkbAction            <emphasis>
938e9fcaa8aSmrgact</emphasis>
939e9fcaa8aSmrg;                  /* action in which to set vmods */
940e9fcaa8aSmrg    </entry>
941e9fcaa8aSmrg  </row>
942e9fcaa8aSmrg  <row rowsep='0'>
943e9fcaa8aSmrg    <entry role='functionargdecl'>
944e9fcaa8aSmrgunsigned short            <emphasis>
945e9fcaa8aSmrgvmods</emphasis>
946e9fcaa8aSmrg;                  /* virtual mods to set */
947e9fcaa8aSmrg    </entry>
948e9fcaa8aSmrg</row>
949e9fcaa8aSmrg</tbody>
950e9fcaa8aSmrg</tgroup>
951e9fcaa8aSmrg</informaltable>
952e9fcaa8aSmrg
953e9fcaa8aSmrg<para>
954e9fcaa8aSmrg<emphasis>
955e9fcaa8aSmrgXkbSetModActionVMods</emphasis>
956e9fcaa8aSmrg sets the <emphasis>
957e9fcaa8aSmrgvmods1</emphasis>
958e9fcaa8aSmrg and <emphasis>
959e9fcaa8aSmrgvmods2</emphasis>
960e9fcaa8aSmrg fields of <emphasis>
961e9fcaa8aSmrgact</emphasis>
962e9fcaa8aSmrg using the <emphasis>
963e9fcaa8aSmrgvmods</emphasis>
964e9fcaa8aSmrg format of an Xkb modifier description.
965e9fcaa8aSmrg</para>
966e9fcaa8aSmrg
967e9fcaa8aSmrg<note><para>Despite the fact that the first parameter of these two macros is of
968e9fcaa8aSmrgtype XkbAction, these macros may be used only with Actions of type <emphasis>
969e9fcaa8aSmrgXkbModAction</emphasis>
970e9fcaa8aSmrg and <emphasis>
971e9fcaa8aSmrgXkbISOAction</emphasis>
972e9fcaa8aSmrg.</para></note>
973e9fcaa8aSmrg
974e9fcaa8aSmrg
975e9fcaa8aSmrg</sect2>
976e9fcaa8aSmrg<sect2 id='actions_for_changing_group_state'>
977e9fcaa8aSmrg<title>Actions for Changing Group State</title>
978e9fcaa8aSmrg
979e9fcaa8aSmrg<para>
980e9fcaa8aSmrgActions associated with the <emphasis>
981e9fcaa8aSmrgXkbGroupAction</emphasis>
982e9fcaa8aSmrg structure change the current group state when keys are pressed and released
983e9fcaa8aSmrg(see Chapter 5 for a description of groups and keyboard state):
984e9fcaa8aSmrg</para>
985e9fcaa8aSmrg
986e9fcaa8aSmrg<para><programlisting>
987e9fcaa8aSmrgtypedef struct _XkbGroupAction {
988e9fcaa8aSmrg      unsigned char   type;       /* <emphasis> XkbSA_{Set|Latch|Lock}Group</emphasis> */
989e9fcaa8aSmrg      unsigned char   flags;      /* with <emphasis> type</emphasis> , controls the effect on groups */
990e9fcaa8aSmrg      char            group_XXX;  /* represents a group index or delta */
991e9fcaa8aSmrg} <emphasis>XkbGroupAction</emphasis>;
992e9fcaa8aSmrg</programlisting></para>
993e9fcaa8aSmrg
994e9fcaa8aSmrg<para>
995e9fcaa8aSmrgThe <emphasis>
996e9fcaa8aSmrgtype</emphasis>
997e9fcaa8aSmrg field can have any of the following values:
998e9fcaa8aSmrg</para>
999e9fcaa8aSmrg
1000e9fcaa8aSmrg<table frame='none'>
1001e9fcaa8aSmrg<title>Group Action Types</title>
1002e9fcaa8aSmrg<tgroup cols='2'>
1003e9fcaa8aSmrg<colspec colsep='0'/>
1004e9fcaa8aSmrg<colspec colsep='0'/>
1005e9fcaa8aSmrg<thead>
1006e9fcaa8aSmrg<row rowsep='0'>
1007e9fcaa8aSmrg  <entry>Type</entry>
1008e9fcaa8aSmrg  <entry>Effect</entry>
1009e9fcaa8aSmrg</row>
1010e9fcaa8aSmrg</thead>
1011e9fcaa8aSmrg<tbody>
1012e9fcaa8aSmrg  <row rowsep='0'>
1013e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetGroup</emphasis></entry>
1014e9fcaa8aSmrg    <entry>
1015e9fcaa8aSmrg<itemizedlist>
1016e9fcaa8aSmrg  <listitem>
1017e9fcaa8aSmrg    <para>
1018e9fcaa8aSmrgIf the <emphasis>
1019e9fcaa8aSmrgXkbSA_GroupAbsolute</emphasis>
1020e9fcaa8aSmrg bit is set in the <emphasis>
1021e9fcaa8aSmrgflags</emphasis>
1022e9fcaa8aSmrg field, key press events change the base keyboard group to the group specified
1023e9fcaa8aSmrgby the <emphasis>
1024e9fcaa8aSmrggroup_XXX</emphasis>
1025e9fcaa8aSmrg field. Otherwise, key press events change the base keyboard group by adding
1026e9fcaa8aSmrgthe <emphasis>
1027e9fcaa8aSmrggroup_XXX</emphasis>
1028e9fcaa8aSmrg field to the base keyboard group. In either case, the resulting effective
1029e9fcaa8aSmrgkeyboard group is brought back into range depending on the value of the
1030e9fcaa8aSmrg<emphasis>
1031e9fcaa8aSmrggroups_wrap</emphasis>
1032e9fcaa8aSmrg field of the controls structure (see section 10.7.1).
1033e9fcaa8aSmrg    </para>
1034e9fcaa8aSmrg  </listitem>
1035e9fcaa8aSmrg  <listitem>
1036e9fcaa8aSmrg    <para>
1037e9fcaa8aSmrgIf a key with an <emphasis>
1038e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
1039e9fcaa8aSmrg action (see section 16.1.8) is pressed while this key is down, the key release
1040e9fcaa8aSmrgof this key has no effect. Otherwise, the key release cancels the effects of
1041e9fcaa8aSmrgthe key press.
1042e9fcaa8aSmrg    </para>
1043e9fcaa8aSmrg  </listitem>
1044e9fcaa8aSmrg  <listitem>
1045e9fcaa8aSmrg    <para>
1046e9fcaa8aSmrgIf the <emphasis>
1047e9fcaa8aSmrgXkbSA_ClearLocks</emphasis>
1048e9fcaa8aSmrg bit is set in the flags field, and no keys are physically depressed when this
1049e9fcaa8aSmrgkey is released, the key release also sets the locked keyboard group to
1050e9fcaa8aSmrg<emphasis>
1051e9fcaa8aSmrgGroup1</emphasis>
1052e9fcaa8aSmrg.
1053e9fcaa8aSmrg    </para>
1054e9fcaa8aSmrg  </listitem>
1055e9fcaa8aSmrg</itemizedlist>
1056e9fcaa8aSmrg    </entry>
1057e9fcaa8aSmrg  </row>
1058e9fcaa8aSmrg  <row rowsep='0'>
1059e9fcaa8aSmrg    <entry><emphasis>XkbSA_LatchGroup</emphasis></entry>
1060e9fcaa8aSmrg    <entry>
1061e9fcaa8aSmrg<itemizedlist>
1062e9fcaa8aSmrg  <listitem>
1063e9fcaa8aSmrg    <para>
1064e9fcaa8aSmrgKey press and key release events have the same effect as for <emphasis>
1065e9fcaa8aSmrgXkbSA_SetGroup</emphasis>
1066e9fcaa8aSmrg; if no keys are physically depressed when this key is released, key release
1067e9fcaa8aSmrgevents have the following additional effects.
1068e9fcaa8aSmrg    </para>
1069e9fcaa8aSmrg  </listitem>
1070e9fcaa8aSmrg  <listitem>
1071e9fcaa8aSmrg    <para>
1072e9fcaa8aSmrgIf the <emphasis>
1073e9fcaa8aSmrgXkbSA_LatchToLock</emphasis>
1074e9fcaa8aSmrg bit is set in the <emphasis>
1075e9fcaa8aSmrgflags</emphasis>
1076e9fcaa8aSmrg field and the latched keyboard group index is nonzero, the key release adds
1077e9fcaa8aSmrgthe delta applied by the corresponding key press to the locked keyboard group
1078e9fcaa8aSmrgand subtracts it from the latched keyboard group. The locked and effective
1079e9fcaa8aSmrgkeyboard group are brought back into range according to the value of the
1080e9fcaa8aSmrg<emphasis>
1081e9fcaa8aSmrggroups_wrap</emphasis>
1082e9fcaa8aSmrg field of the controls structure.
1083e9fcaa8aSmrg    </para>
1084e9fcaa8aSmrg  </listitem>
1085e9fcaa8aSmrg  <listitem>
1086e9fcaa8aSmrg    <para>
1087e9fcaa8aSmrgOtherwise, the key press adds the key press delta to the latched keyboard group.
1088e9fcaa8aSmrg    </para>
1089e9fcaa8aSmrg  </listitem>
1090e9fcaa8aSmrg</itemizedlist>
1091e9fcaa8aSmrg    </entry>
1092e9fcaa8aSmrg  </row>
1093e9fcaa8aSmrg  <row rowsep='0'>
1094e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockGroup</emphasis></entry>
1095e9fcaa8aSmrg    <entry>
1096e9fcaa8aSmrg<itemizedlist>
1097e9fcaa8aSmrg  <listitem>
1098e9fcaa8aSmrg    <para>
1099e9fcaa8aSmrgIf the <emphasis>
1100e9fcaa8aSmrgXkbSA_GroupAbsolute</emphasis>
1101e9fcaa8aSmrg is set in the <emphasis>
1102e9fcaa8aSmrgflags</emphasis>
1103e9fcaa8aSmrg field, key press events set the locked keyboard group to the group specified
1104e9fcaa8aSmrgby the <emphasis>
1105e9fcaa8aSmrggroup_XXX</emphasis>
1106e9fcaa8aSmrg field. Otherwise, key press events add the group specified by the <emphasis>
1107e9fcaa8aSmrggroup_XXX</emphasis>
1108e9fcaa8aSmrg field to the locked keyboard group. In either case, the resulting locked and
1109e9fcaa8aSmrgeffective keyboard groups are brought back into range depending on the value of
1110e9fcaa8aSmrgthe <emphasis>
1111e9fcaa8aSmrggroups_wrap</emphasis>
1112e9fcaa8aSmrg field of the controls structure.
1113e9fcaa8aSmrg    </para>
1114e9fcaa8aSmrg  </listitem>
1115e9fcaa8aSmrg  <listitem>
1116e9fcaa8aSmrg    <para>
1117e9fcaa8aSmrgA key release has no effect.
1118e9fcaa8aSmrg    </para>
1119e9fcaa8aSmrg  </listitem>
1120e9fcaa8aSmrg</itemizedlist>
1121e9fcaa8aSmrg    </entry>
1122e9fcaa8aSmrg  </row>
1123e9fcaa8aSmrg</tbody>
1124e9fcaa8aSmrg</tgroup>
1125e9fcaa8aSmrg</table>
1126e9fcaa8aSmrg
1127e9fcaa8aSmrg<para>
1128e9fcaa8aSmrgThe <emphasis>
1129e9fcaa8aSmrgflags</emphasis>
1130e9fcaa8aSmrg field is composed of the bitwise inclusive OR of the masks shown in Table
1131e9fcaa8aSmrg16.5. A general meaning is given in the table, but the exact meaning depends on
1132e9fcaa8aSmrgthe action <emphasis>
1133e9fcaa8aSmrgtype</emphasis>
1134e9fcaa8aSmrg.
1135e9fcaa8aSmrg</para>
1136e9fcaa8aSmrg
1137e9fcaa8aSmrg<table frame='none'>
1138e9fcaa8aSmrg<title>Group Action Flags</title>
1139e9fcaa8aSmrg<tgroup cols='2'>
1140e9fcaa8aSmrg<colspec colsep='0'/>
1141e9fcaa8aSmrg<colspec colsep='0'/>
1142e9fcaa8aSmrg<thead>
1143e9fcaa8aSmrg<row rowsep='0'>
1144e9fcaa8aSmrg  <entry>Flag</entry>
1145e9fcaa8aSmrg  <entry>Meaning</entry>
1146e9fcaa8aSmrg</row>
1147e9fcaa8aSmrg</thead>
1148e9fcaa8aSmrg<tbody>
1149e9fcaa8aSmrg  <row rowsep='0'>
1150e9fcaa8aSmrg    <entry><emphasis>XkbSA_ClearLocks</emphasis></entry>
1151e9fcaa8aSmrg    <entry>
1152e9fcaa8aSmrgIf set and no keys are physically depressed when this key transition occurs,
1153e9fcaa8aSmrgthe server sets the locked keyboard group to <emphasis>
1154e9fcaa8aSmrgGroup1</emphasis>
1155e9fcaa8aSmrg on a key release.
1156e9fcaa8aSmrg    </entry>
1157e9fcaa8aSmrg  </row>
1158e9fcaa8aSmrg  <row rowsep='0'>
1159e9fcaa8aSmrg    <entry><emphasis>XkbSA_LatchToLock</emphasis></entry>
1160e9fcaa8aSmrg    <entry>
1161e9fcaa8aSmrgIf set, and the action type is <emphasis>
1162e9fcaa8aSmrgSA_LatchGroup</emphasis>
1163e9fcaa8aSmrg, the server locks the action group if it is already latched.
1164e9fcaa8aSmrg    </entry>
1165e9fcaa8aSmrg  </row>
1166e9fcaa8aSmrg  <row rowsep='0'>
1167e9fcaa8aSmrg    <entry><emphasis>XkbSA_GroupAbsolute</emphasis></entry>
1168e9fcaa8aSmrg    <entry>
1169e9fcaa8aSmrgIf set, the <emphasis>
1170e9fcaa8aSmrggroup_XXX</emphasis>
1171e9fcaa8aSmrg field represents an absolute group number. Otherwise, it represents a group
1172e9fcaa8aSmrgdelta to be added to the current group to determine the new group number.
1173e9fcaa8aSmrg    </entry>
1174e9fcaa8aSmrg  </row>
1175e9fcaa8aSmrg</tbody>
1176e9fcaa8aSmrg</tgroup>
1177e9fcaa8aSmrg</table>
1178e9fcaa8aSmrg
1179e9fcaa8aSmrg<para>
1180e9fcaa8aSmrgThe <emphasis>
1181e9fcaa8aSmrggroup_XXX</emphasis>
1182e9fcaa8aSmrg field represents a signed character. Xkb provides the following macros to
1183e9fcaa8aSmrgconvert between a signed integer value and a signed character:
1184e9fcaa8aSmrg</para>
1185e9fcaa8aSmrg
1186e9fcaa8aSmrg<informaltable frame='none'>
1187e9fcaa8aSmrg<tgroup cols='1'>
1188e9fcaa8aSmrg<colspec colsep='0'/>
1189e9fcaa8aSmrg<tbody>
1190e9fcaa8aSmrg  <row rowsep='0'>
1191e9fcaa8aSmrg    <entry role='functiondecl'>
1192e9fcaa8aSmrgint <emphasis>
1193e9fcaa8aSmrgXkbSAGroup</emphasis>
1194e9fcaa8aSmrg(<emphasis>
1195e9fcaa8aSmrgact</emphasis>
1196e9fcaa8aSmrg)                              /* macro */
1197e9fcaa8aSmrg    </entry>
1198e9fcaa8aSmrg  </row>
1199e9fcaa8aSmrg  <row rowsep='0'>
1200e9fcaa8aSmrg    <entry role='functionargdecl'>
1201e9fcaa8aSmrgXkbAction            <emphasis>
1202e9fcaa8aSmrgact</emphasis>
1203e9fcaa8aSmrg;                  /* action from which to extract group */
1204e9fcaa8aSmrg    </entry>
1205e9fcaa8aSmrg</row>
1206e9fcaa8aSmrg</tbody>
1207e9fcaa8aSmrg</tgroup>
1208e9fcaa8aSmrg</informaltable>
1209e9fcaa8aSmrg
1210e9fcaa8aSmrg<para>
1211e9fcaa8aSmrg<emphasis>
1212e9fcaa8aSmrgXkbSAGroup</emphasis>
1213e9fcaa8aSmrg returns the <emphasis>
1214e9fcaa8aSmrggroup_XXX</emphasis>
1215e9fcaa8aSmrg field of <emphasis>
1216e9fcaa8aSmrgact</emphasis>
1217e9fcaa8aSmrg converted to a signed int.
1218e9fcaa8aSmrg</para>
1219e9fcaa8aSmrg
1220e9fcaa8aSmrg
1221e9fcaa8aSmrg<informaltable frame='none'>
1222e9fcaa8aSmrg<tgroup cols='1'>
1223e9fcaa8aSmrg<colspec colsep='0'/>
1224e9fcaa8aSmrg<tbody>
1225e9fcaa8aSmrg  <row rowsep='0'>
1226e9fcaa8aSmrg    <entry role='functiondecl'>
1227e9fcaa8aSmrgvoid <emphasis>
1228e9fcaa8aSmrgXkbSASetGroup</emphasis>
1229e9fcaa8aSmrg(<emphasis>
1230e9fcaa8aSmrgact, grp</emphasis>
1231e9fcaa8aSmrg)                              /* macro */
1232e9fcaa8aSmrg    </entry>
1233e9fcaa8aSmrg  </row>
1234e9fcaa8aSmrg  <row rowsep='0'>
1235e9fcaa8aSmrg    <entry role='functionargdecl'>
1236e9fcaa8aSmrgXkbAction            <emphasis>
1237e9fcaa8aSmrgact</emphasis>
1238e9fcaa8aSmrg;                  /* action from which to set group */
1239e9fcaa8aSmrg    </entry>
1240e9fcaa8aSmrg  </row>
1241e9fcaa8aSmrg  <row rowsep='0'>
1242e9fcaa8aSmrg    <entry role='functionargdecl'>
1243e9fcaa8aSmrgint            <emphasis>
1244e9fcaa8aSmrggrp</emphasis>
1245e9fcaa8aSmrg;                  /* group index to set in <emphasis>
1246e9fcaa8aSmrggroup_XXX</emphasis>
1247e9fcaa8aSmrg */
1248e9fcaa8aSmrg    </entry>
1249e9fcaa8aSmrg</row>
1250e9fcaa8aSmrg</tbody>
1251e9fcaa8aSmrg</tgroup>
1252e9fcaa8aSmrg</informaltable>
1253e9fcaa8aSmrg
1254e9fcaa8aSmrg<para>
1255e9fcaa8aSmrg<emphasis>
1256e9fcaa8aSmrgXkbSASetGroup</emphasis>
1257e9fcaa8aSmrg sets the <emphasis>
1258e9fcaa8aSmrggroup_XXX</emphasis>
1259e9fcaa8aSmrg field of <emphasis>
1260e9fcaa8aSmrgact</emphasis>
1261e9fcaa8aSmrg from the group index <emphasis>
1262e9fcaa8aSmrggrp</emphasis>
1263e9fcaa8aSmrg.
1264e9fcaa8aSmrg</para>
1265e9fcaa8aSmrg
1266e9fcaa8aSmrg<note><para>Despite the fact that the first parameter of these two macros is of
1267e9fcaa8aSmrgtype XkbAction, these macros may only be used with Actions of type <emphasis>
1268e9fcaa8aSmrgXkbGroupAction</emphasis>
1269e9fcaa8aSmrg and <emphasis>
1270e9fcaa8aSmrgXkbISOAction</emphasis>
1271e9fcaa8aSmrg.</para></note>
1272e9fcaa8aSmrg
1273e9fcaa8aSmrg
1274e9fcaa8aSmrg</sect2>
1275e9fcaa8aSmrg<sect2 id='actions_for_moving_the_pointer'>
1276e9fcaa8aSmrg<title>Actions for Moving the Pointer</title>
1277e9fcaa8aSmrg
1278e9fcaa8aSmrg<para>
1279e9fcaa8aSmrgActions associated with the <emphasis>
1280e9fcaa8aSmrgXkbPtrAction</emphasis>
1281e9fcaa8aSmrg structure move the pointer when keys are pressed and released:
1282e9fcaa8aSmrg</para>
1283e9fcaa8aSmrg
1284e9fcaa8aSmrg<para><programlisting>
1285e9fcaa8aSmrgtypedef struct _XkbPtrAction {
1286e9fcaa8aSmrg      unsigned char      type;      /* <emphasis> XkbSA_MovePtr</emphasis> */
1287e9fcaa8aSmrg      unsigned char      flags;     /* determines type of pointer motion */
1288e9fcaa8aSmrg      unsigned char      high_XXX;  /* x coordinate, high bits*/
1289e9fcaa8aSmrg      unsigned char      low_XXX;   /* y coordinate, low bits */
1290e9fcaa8aSmrg      unsigned char      high_YYY;  /* x coordinate, high bits */
1291e9fcaa8aSmrg      unsigned char      low_YYY;   /* y coordinate, low bits */
1292e9fcaa8aSmrg} <emphasis>XkbPtrAction</emphasis>;
1293e9fcaa8aSmrg</programlisting></para>
1294e9fcaa8aSmrg
1295e9fcaa8aSmrg<para>
1296e9fcaa8aSmrgIf the <emphasis>
1297e9fcaa8aSmrgMouseKeys</emphasis>
1298e9fcaa8aSmrg control is not enabled (see section 10.5.1), <emphasis>
1299e9fcaa8aSmrgKeyPress</emphasis>
1300e9fcaa8aSmrg and <emphasis>
1301e9fcaa8aSmrgKeyRelease</emphasis>
1302e9fcaa8aSmrg events are treated as though the action is <emphasis>
1303e9fcaa8aSmrgXkbSA_NoAction</emphasis>.
1304e9fcaa8aSmrg</para>
1305e9fcaa8aSmrg
1306e9fcaa8aSmrg<para>
1307e9fcaa8aSmrgIf the <emphasis>
1308e9fcaa8aSmrgMouseKeys</emphasis>
1309e9fcaa8aSmrg control is enabled, a server action of type <emphasis>
1310e9fcaa8aSmrgXkbSA_MovePtr</emphasis>
1311e9fcaa8aSmrg instructs the server to generate core pointer <emphasis>
1312e9fcaa8aSmrgMotionNotify</emphasis>
1313e9fcaa8aSmrg events rather than the usual <emphasis>
1314e9fcaa8aSmrgKeyPress</emphasis>
1315e9fcaa8aSmrg event, and the corresponding <emphasis>
1316e9fcaa8aSmrgKeyRelease</emphasis>
1317e9fcaa8aSmrg event disables any mouse keys timers that were created as a result of handling
1318e9fcaa8aSmrgthe <emphasis>
1319e9fcaa8aSmrgXkbSA_MovePtr</emphasis>
1320e9fcaa8aSmrg action.
1321e9fcaa8aSmrg</para>
1322e9fcaa8aSmrg
1323e9fcaa8aSmrg
1324e9fcaa8aSmrg<para>
1325e9fcaa8aSmrgThe <emphasis>
1326e9fcaa8aSmrgtype</emphasis>
1327e9fcaa8aSmrg field of the <emphasis>
1328e9fcaa8aSmrgXkbPtrAction</emphasis>
1329e9fcaa8aSmrg structure is always <emphasis>
1330e9fcaa8aSmrgXkbSA_MovePtr</emphasis>
1331e9fcaa8aSmrg.
1332e9fcaa8aSmrg</para>
1333e9fcaa8aSmrg
1334e9fcaa8aSmrg
1335e9fcaa8aSmrg<para>
1336e9fcaa8aSmrgThe <emphasis>
1337e9fcaa8aSmrgflags</emphasis>
1338e9fcaa8aSmrg field is a bitwise inclusive OR of the masks shown in Table 16.6.
1339e9fcaa8aSmrg</para>
1340e9fcaa8aSmrg
1341e9fcaa8aSmrg<table frame='none'>
1342e9fcaa8aSmrg<title>Pointer Action Types</title>
1343e9fcaa8aSmrg<tgroup cols='2'>
1344e9fcaa8aSmrg<colspec colsep='0'/>
1345e9fcaa8aSmrg<colspec colsep='0'/>
1346e9fcaa8aSmrg<thead>
1347e9fcaa8aSmrg<row rowsep='0'>
1348e9fcaa8aSmrg  <entry>Action Type</entry>
1349e9fcaa8aSmrg  <entry>Meaning</entry>
1350e9fcaa8aSmrg</row>
1351e9fcaa8aSmrg</thead>
1352e9fcaa8aSmrg<tbody>
1353e9fcaa8aSmrg  <row rowsep='0'>
1354e9fcaa8aSmrg    <entry><emphasis>XkbSA_NoAcceleration</emphasis></entry>
1355e9fcaa8aSmrg    <entry>
1356e9fcaa8aSmrgIf not set, and the <emphasis>
1357e9fcaa8aSmrgMouseKeysAccel</emphasis>
1358e9fcaa8aSmrg control is enabled (see section 10.5.2), the <emphasis>
1359e9fcaa8aSmrgKeyPress</emphasis>
1360e9fcaa8aSmrg initiates a mouse keys timer for this key; every time the timer expires, the
1361e9fcaa8aSmrgcursor moves.
1362e9fcaa8aSmrg    </entry>
1363e9fcaa8aSmrg  </row>
1364e9fcaa8aSmrg  <row rowsep='0'>
1365e9fcaa8aSmrg    <entry><emphasis>XkbSA_MoveAbsoluteX</emphasis></entry>
1366e9fcaa8aSmrg    <entry>If set, the X portion of the structure specifies the new pointer X
1367e9fcaa8aSmrgcoordinate. Otherwise, the X portion is added to the current pointer X
1368e9fcaa8aSmrgcoordinate to determine the new pointer X coordinate.
1369e9fcaa8aSmrg    </entry>
1370e9fcaa8aSmrg  </row>
1371e9fcaa8aSmrg  <row rowsep='0'>
1372e9fcaa8aSmrg    <entry><emphasis>XkbSA_MoveAbsoluteY</emphasis></entry>
1373e9fcaa8aSmrg    <entry>
1374e9fcaa8aSmrgIf set, the Y portion of the structure specifies the new
1375e9fcaa8aSmrgpointer Y coordinate. Otherwise, the Y portion is added
1376e9fcaa8aSmrgto the current pointer Y coordinate to determine the new pointer Y coordinate.
1377e9fcaa8aSmrg    </entry>
1378e9fcaa8aSmrg  </row>
1379e9fcaa8aSmrg</tbody>
1380e9fcaa8aSmrg</tgroup>
1381e9fcaa8aSmrg</table>
1382e9fcaa8aSmrg
1383e9fcaa8aSmrg<para>
1384e9fcaa8aSmrgEach of the X and Y coordinantes of the <emphasis>
1385e9fcaa8aSmrgXkbPtrAction</emphasis>
1386e9fcaa8aSmrg structure is composed of two signed 16-bit values, that is, the X coordinate
1387e9fcaa8aSmrgis composed of <emphasis>
1388e9fcaa8aSmrghigh_XXX</emphasis>
1389e9fcaa8aSmrg and <emphasis>
1390e9fcaa8aSmrglow_XXX</emphasis>
1391e9fcaa8aSmrg, and similarly for the Y coordinate. Xkb provides the following macros, to
1392e9fcaa8aSmrgconvert between a signed integer and two signed 16-bit values in <emphasis>
1393e9fcaa8aSmrgXkbPtrAction</emphasis>
1394e9fcaa8aSmrg structures:
1395e9fcaa8aSmrg</para>
1396e9fcaa8aSmrg
1397e9fcaa8aSmrg<informaltable frame='none'>
1398e9fcaa8aSmrg<tgroup cols='1'>
1399e9fcaa8aSmrg<colspec colsep='0'/>
1400e9fcaa8aSmrg<tbody>
1401e9fcaa8aSmrg  <row rowsep='0'>
1402e9fcaa8aSmrg    <entry role='functiondecl'>
1403e9fcaa8aSmrgint <emphasis>
1404e9fcaa8aSmrgXkbPtrActionX</emphasis>
1405e9fcaa8aSmrg(<emphasis>
1406e9fcaa8aSmrgact</emphasis>
1407e9fcaa8aSmrg)                              /* macro */
1408e9fcaa8aSmrg    </entry>
1409e9fcaa8aSmrg  </row>
1410e9fcaa8aSmrg  <row rowsep='0'>
1411e9fcaa8aSmrg    <entry role='functionargdecl'>
1412e9fcaa8aSmrgXkbPtrAction            <emphasis>
1413e9fcaa8aSmrgact</emphasis>
1414e9fcaa8aSmrg;                  /* action from which to extract X */
1415e9fcaa8aSmrg    </entry>
1416e9fcaa8aSmrg</row>
1417e9fcaa8aSmrg</tbody>
1418e9fcaa8aSmrg</tgroup>
1419e9fcaa8aSmrg</informaltable>
1420e9fcaa8aSmrg
1421e9fcaa8aSmrg<para>
1422e9fcaa8aSmrg<emphasis>
1423e9fcaa8aSmrgXkbPtrActionX</emphasis>
1424e9fcaa8aSmrg returns the <emphasis>
1425e9fcaa8aSmrghigh_XXX</emphasis>
1426e9fcaa8aSmrg and <emphasis>
1427e9fcaa8aSmrglow_XXX</emphasis>
1428e9fcaa8aSmrg fields of <emphasis>
1429e9fcaa8aSmrgact</emphasis>
1430e9fcaa8aSmrg converted to a signed int.
1431e9fcaa8aSmrg</para>
1432e9fcaa8aSmrg
1433e9fcaa8aSmrg
1434e9fcaa8aSmrg<informaltable frame='none'>
1435e9fcaa8aSmrg<tgroup cols='1'>
1436e9fcaa8aSmrg<colspec colsep='0'/>
1437e9fcaa8aSmrg<tbody>
1438e9fcaa8aSmrg  <row rowsep='0'>
1439e9fcaa8aSmrg    <entry role='functiondecl'>
1440e9fcaa8aSmrgint <emphasis>
1441e9fcaa8aSmrgXkbPtrActionY</emphasis>
1442e9fcaa8aSmrg(<emphasis>
1443e9fcaa8aSmrgact</emphasis>
1444e9fcaa8aSmrg)                              /* macro */
1445e9fcaa8aSmrg    </entry>
1446e9fcaa8aSmrg  </row>
1447e9fcaa8aSmrg  <row rowsep='0'>
1448e9fcaa8aSmrg    <entry role='functionargdecl'>
1449e9fcaa8aSmrgXkbPtrAction            <emphasis>
1450e9fcaa8aSmrgact</emphasis>
1451e9fcaa8aSmrg;                  /* action from which to extract Y */
1452e9fcaa8aSmrg    </entry>
1453e9fcaa8aSmrg</row>
1454e9fcaa8aSmrg</tbody>
1455e9fcaa8aSmrg</tgroup>
1456e9fcaa8aSmrg</informaltable>
1457e9fcaa8aSmrg
1458e9fcaa8aSmrg<para>
1459e9fcaa8aSmrg<emphasis>
1460e9fcaa8aSmrgXkbPtrActionY</emphasis>
1461e9fcaa8aSmrg returns the <emphasis>
1462e9fcaa8aSmrghigh_YYY</emphasis>
1463e9fcaa8aSmrg and <emphasis>
1464e9fcaa8aSmrglow_YYY</emphasis>
1465e9fcaa8aSmrg fields of <emphasis>
1466e9fcaa8aSmrgact</emphasis>
1467e9fcaa8aSmrg converted to a signed int.
1468e9fcaa8aSmrg</para>
1469e9fcaa8aSmrg
1470e9fcaa8aSmrg
1471e9fcaa8aSmrg<informaltable frame='none'>
1472e9fcaa8aSmrg<tgroup cols='1'>
1473e9fcaa8aSmrg<colspec colsep='0'/>
1474e9fcaa8aSmrg<tbody>
1475e9fcaa8aSmrg  <row rowsep='0'>
1476e9fcaa8aSmrg    <entry role='functiondecl'>
1477e9fcaa8aSmrgvoid <emphasis>
1478e9fcaa8aSmrgXkbSetPtrActionX</emphasis>
1479e9fcaa8aSmrg(<emphasis>
1480e9fcaa8aSmrgact</emphasis>
1481e9fcaa8aSmrg, <emphasis>
1482e9fcaa8aSmrgx</emphasis>
1483e9fcaa8aSmrg)                              /* macro */
1484e9fcaa8aSmrg    </entry>
1485e9fcaa8aSmrg  </row>
1486e9fcaa8aSmrg  <row rowsep='0'>
1487e9fcaa8aSmrg    <entry role='functionargdecl'>
1488e9fcaa8aSmrgXkbPtrAction            <emphasis>
1489e9fcaa8aSmrgact</emphasis>
1490e9fcaa8aSmrg;                  /* action in which to set X */
1491e9fcaa8aSmrg    </entry>
1492e9fcaa8aSmrg  </row>
1493e9fcaa8aSmrg  <row rowsep='0'>
1494e9fcaa8aSmrg    <entry role='functionargdecl'>
1495e9fcaa8aSmrgint            <emphasis>
1496e9fcaa8aSmrgx;      </emphasis>
1497e9fcaa8aSmrg            /* new value to set */
1498e9fcaa8aSmrg    </entry>
1499e9fcaa8aSmrg</row>
1500e9fcaa8aSmrg</tbody>
1501e9fcaa8aSmrg</tgroup>
1502e9fcaa8aSmrg</informaltable>
1503e9fcaa8aSmrg
1504e9fcaa8aSmrg<para>
1505e9fcaa8aSmrg<emphasis>
1506e9fcaa8aSmrgXkbSetPtrActionX</emphasis>
1507e9fcaa8aSmrg sets the <emphasis>
1508e9fcaa8aSmrghigh_XXX</emphasis>
1509e9fcaa8aSmrg and <emphasis>
1510e9fcaa8aSmrglow_XXX</emphasis>
1511e9fcaa8aSmrg fields of <emphasis>
1512e9fcaa8aSmrgact</emphasis>
1513e9fcaa8aSmrg from the signed integer value <emphasis>
1514e9fcaa8aSmrgx</emphasis>
1515e9fcaa8aSmrg.
1516e9fcaa8aSmrg</para>
1517e9fcaa8aSmrg
1518e9fcaa8aSmrg
1519e9fcaa8aSmrg<informaltable frame='none'>
1520e9fcaa8aSmrg<tgroup cols='1'>
1521e9fcaa8aSmrg<colspec colsep='0'/>
1522e9fcaa8aSmrg<tbody>
1523e9fcaa8aSmrg  <row rowsep='0'>
1524e9fcaa8aSmrg    <entry role='functiondecl'>
1525e9fcaa8aSmrgvoid <emphasis>
1526e9fcaa8aSmrgXkbSetPtrActionY</emphasis>
1527e9fcaa8aSmrg(<emphasis>
1528e9fcaa8aSmrgact, y</emphasis>
1529e9fcaa8aSmrg)                              /* macro */
1530e9fcaa8aSmrg    </entry>
1531e9fcaa8aSmrg  </row>
1532e9fcaa8aSmrg  <row rowsep='0'>
1533e9fcaa8aSmrg    <entry role='functionargdecl'>
1534e9fcaa8aSmrgXkbPtrAction            <emphasis>
1535e9fcaa8aSmrgact</emphasis>
1536e9fcaa8aSmrg;                  /* action in which to set Y */
1537e9fcaa8aSmrg    </entry>
1538e9fcaa8aSmrg  </row>
1539e9fcaa8aSmrg  <row rowsep='0'>
1540e9fcaa8aSmrg    <entry role='functionargdecl'>
1541e9fcaa8aSmrgint            <emphasis>
1542e9fcaa8aSmrgy</emphasis>
1543e9fcaa8aSmrg;                  /* new value to set */
1544e9fcaa8aSmrg    </entry>
1545e9fcaa8aSmrg</row>
1546e9fcaa8aSmrg</tbody>
1547e9fcaa8aSmrg</tgroup>
1548e9fcaa8aSmrg</informaltable>
1549e9fcaa8aSmrg
1550e9fcaa8aSmrg<para>
1551e9fcaa8aSmrg<emphasis>
1552e9fcaa8aSmrgXkbSetPtrActionX</emphasis>
1553e9fcaa8aSmrg sets the <emphasis>
1554e9fcaa8aSmrghigh_YYY</emphasis>
1555e9fcaa8aSmrg and <emphasis>
1556e9fcaa8aSmrglow_YYY</emphasis>
1557e9fcaa8aSmrg fields of <emphasis>
1558e9fcaa8aSmrgact</emphasis>
1559e9fcaa8aSmrg from the signed integer value <emphasis>
1560e9fcaa8aSmrgy</emphasis>
1561e9fcaa8aSmrg.
1562e9fcaa8aSmrg</para>
1563e9fcaa8aSmrg
1564e9fcaa8aSmrg
1565e9fcaa8aSmrg</sect2>
1566e9fcaa8aSmrg<sect2 id='actions_for_simulating_pointer_button_press_and_release'>
1567e9fcaa8aSmrg<title>Actions for Simulating Pointer Button Press and Release</title>
1568e9fcaa8aSmrg
1569e9fcaa8aSmrg<para>
1570e9fcaa8aSmrgActions associated with the <emphasis>
1571e9fcaa8aSmrgXkbPtrBtnAction</emphasis>
1572e9fcaa8aSmrg structure simulate the press and release of pointer buttons when keys are
1573e9fcaa8aSmrgpressed and released:
1574e9fcaa8aSmrg</para>
1575e9fcaa8aSmrg
1576e9fcaa8aSmrg<para><programlisting>
1577e9fcaa8aSmrgtypedef struct _XkbPtrBtnAction {
1578e9fcaa8aSmrg      unsigned char   type;     /*<emphasis> XkbSA_PtrBtn, XkbSA_LockPtrBtn</emphasis> */
1579e9fcaa8aSmrg      unsigned char   flags;    /* with <emphasis> type</emphasis> , controls the effect on pointer buttons*/
1580e9fcaa8aSmrg      unsigned char   count;    /* controls number of ButtonPress and ButtonRelease events */
1581e9fcaa8aSmrg      unsigned char   button;   /* pointer button to simulate */
1582e9fcaa8aSmrg} <emphasis>XkbPtrBtnAction</emphasis>;
1583e9fcaa8aSmrg</programlisting></para>
1584e9fcaa8aSmrg
1585e9fcaa8aSmrg<para>
1586e9fcaa8aSmrgIf the <emphasis>
1587e9fcaa8aSmrgMouseKeys</emphasis>
1588e9fcaa8aSmrg (see section 10.5.1) control is not enabled, <emphasis>
1589e9fcaa8aSmrgKeyPress</emphasis>
1590e9fcaa8aSmrg and <emphasis>
1591e9fcaa8aSmrgKeyRelease</emphasis>
1592e9fcaa8aSmrg events are treated as though the action is <emphasis>
1593e9fcaa8aSmrgXkbSA_NoAction</emphasis>
1594e9fcaa8aSmrg.
1595e9fcaa8aSmrg</para>
1596e9fcaa8aSmrg
1597e9fcaa8aSmrg
1598e9fcaa8aSmrg<para>
1599e9fcaa8aSmrgThe <emphasis>
1600e9fcaa8aSmrgtype</emphasis>
1601e9fcaa8aSmrg field can have any one of the values shown in Table 16.7.
1602e9fcaa8aSmrg</para>
1603e9fcaa8aSmrg
1604e9fcaa8aSmrg<table frame='none'>
1605e9fcaa8aSmrg<title>Pointer Button Action Types</title>
1606e9fcaa8aSmrg<tgroup cols='2'>
1607e9fcaa8aSmrg<colspec colsep='0'/>
1608e9fcaa8aSmrg<colspec colsep='0'/>
1609e9fcaa8aSmrg<thead>
1610e9fcaa8aSmrg<row rowsep='0'>
1611e9fcaa8aSmrg  <entry>Type</entry>
1612e9fcaa8aSmrg  <entry>Effect</entry>
1613e9fcaa8aSmrg</row>
1614e9fcaa8aSmrg</thead>
1615e9fcaa8aSmrg<tbody>
1616e9fcaa8aSmrg  <row rowsep='0'>
1617e9fcaa8aSmrg    <entry><emphasis>XkbSA_PtrBtn</emphasis></entry>
1618e9fcaa8aSmrg    <entry>
1619e9fcaa8aSmrg<itemizedlist>
1620e9fcaa8aSmrg  <listitem>
1621e9fcaa8aSmrg    <para>
1622e9fcaa8aSmrgIf<emphasis>
1623e9fcaa8aSmrg XkbSA_UseDfltButton</emphasis>
1624e9fcaa8aSmrg is set in the <emphasis>
1625e9fcaa8aSmrgflags</emphasis>
1626e9fcaa8aSmrg field, the event is generated for the pointer button specified by the
1627e9fcaa8aSmrg<emphasis>
1628e9fcaa8aSmrgmk_dflt_btn</emphasis>
1629e9fcaa8aSmrg attribute of the <emphasis>
1630e9fcaa8aSmrgMouseKeys</emphasis>
1631e9fcaa8aSmrg control (see section 10.5.1). Otherwise, the event is generated for the button
1632e9fcaa8aSmrgspecified by the <emphasis>
1633e9fcaa8aSmrgbutton</emphasis>
1634e9fcaa8aSmrg field.
1635e9fcaa8aSmrg    </para>
1636e9fcaa8aSmrg  </listitem>
1637e9fcaa8aSmrg  <listitem>
1638e9fcaa8aSmrg    <para>
1639e9fcaa8aSmrgIf the mouse button specified for this action is logically down, the key press
1640e9fcaa8aSmrgand corresponding key release are ignored and have no effect. Otherwise, a key
1641e9fcaa8aSmrgpress causes one or more core pointer button events instead of the usual
1642e9fcaa8aSmrg<emphasis>
1643e9fcaa8aSmrgKeyPress</emphasis>
1644e9fcaa8aSmrg event. If <emphasis>
1645e9fcaa8aSmrgcount</emphasis>
1646e9fcaa8aSmrg is <emphasis>
1647e9fcaa8aSmrgzero</emphasis>
1648e9fcaa8aSmrg, a key press generates a single <emphasis>
1649e9fcaa8aSmrgButtonPress</emphasis>
1650e9fcaa8aSmrg event; if <emphasis>
1651e9fcaa8aSmrgcount</emphasis>
1652e9fcaa8aSmrg is greater than <emphasis>
1653e9fcaa8aSmrgzero</emphasis>
1654e9fcaa8aSmrg, a key press generates <emphasis>
1655e9fcaa8aSmrgcount</emphasis>
1656e9fcaa8aSmrg pairs of <emphasis>
1657e9fcaa8aSmrgButtonPress</emphasis>
1658e9fcaa8aSmrg and <emphasis>
1659e9fcaa8aSmrgButtonRelease</emphasis>
1660e9fcaa8aSmrg events.
1661e9fcaa8aSmrg    </para>
1662e9fcaa8aSmrg  </listitem>
1663e9fcaa8aSmrg  <listitem>
1664e9fcaa8aSmrg    <para>
1665e9fcaa8aSmrgIf <emphasis>
1666e9fcaa8aSmrgcount</emphasis>
1667e9fcaa8aSmrg is <emphasis>
1668e9fcaa8aSmrgzero</emphasis>
1669e9fcaa8aSmrg, a key release generates a core pointer <emphasis>
1670e9fcaa8aSmrgButtonRelease</emphasis>
1671e9fcaa8aSmrg that matches the event generated by the corresponding <emphasis>
1672e9fcaa8aSmrgKeyPress</emphasis>
1673e9fcaa8aSmrg; if <emphasis>
1674e9fcaa8aSmrgcount</emphasis>
1675e9fcaa8aSmrg is nonzero, a key release does not cause a <emphasis>
1676e9fcaa8aSmrgButtonRelease</emphasis>
1677e9fcaa8aSmrg event. A key release never generates a key <emphasis>
1678e9fcaa8aSmrgKeyRelease</emphasis>
1679e9fcaa8aSmrg event.
1680e9fcaa8aSmrg    </para>
1681e9fcaa8aSmrg  </listitem>
1682e9fcaa8aSmrg</itemizedlist>
1683e9fcaa8aSmrg    </entry>
1684e9fcaa8aSmrg  </row>
1685e9fcaa8aSmrg  <row rowsep='0'>
1686e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockPtrBtn</emphasis></entry>
1687e9fcaa8aSmrg    <entry>
1688e9fcaa8aSmrg<itemizedlist>
1689e9fcaa8aSmrg  <listitem>
1690e9fcaa8aSmrg    <para>
1691e9fcaa8aSmrgIf the button specified by the <emphasis>
1692e9fcaa8aSmrgMouseKeys</emphasis>
1693e9fcaa8aSmrg default button<emphasis>
1694e9fcaa8aSmrg </emphasis>
1695e9fcaa8aSmrgor <emphasis>
1696e9fcaa8aSmrgbutton</emphasis>
1697e9fcaa8aSmrg is not locked, a key press causes a <emphasis>
1698e9fcaa8aSmrgButtonPress</emphasis>
1699e9fcaa8aSmrg event instead of a <emphasis>
1700e9fcaa8aSmrgKeyPress</emphasis>
1701e9fcaa8aSmrg event and locks the button. If the button is already locked or if <emphasis>
1702e9fcaa8aSmrgXkbSA_LockNoUnlock</emphasis>
1703e9fcaa8aSmrg is set in the <emphasis>
1704e9fcaa8aSmrgflags</emphasis>
1705e9fcaa8aSmrg field, a key press is ignored and has no effect.
1706e9fcaa8aSmrg    </para>
1707e9fcaa8aSmrg  </listitem>
1708e9fcaa8aSmrg  <listitem>
1709e9fcaa8aSmrg    <para>
1710e9fcaa8aSmrgIf the corresponding key press was ignored, and if <emphasis>
1711e9fcaa8aSmrgXkbSA_LockNoLock</emphasis>
1712e9fcaa8aSmrg is not set in the <emphasis>
1713e9fcaa8aSmrgflags</emphasis>
1714e9fcaa8aSmrg field, a key release generates a <emphasis>
1715e9fcaa8aSmrgButtonRelease</emphasis>
1716e9fcaa8aSmrg event instead of a <emphasis>
1717e9fcaa8aSmrgKeyRelease</emphasis>
1718e9fcaa8aSmrg event and unlocks the specified button. If the corresponding key press locked
1719e9fcaa8aSmrga button, the key release is ignored and has no effect.
1720e9fcaa8aSmrg    </para>
1721e9fcaa8aSmrg  </listitem>
1722e9fcaa8aSmrg</itemizedlist>
1723e9fcaa8aSmrg    </entry>
1724e9fcaa8aSmrg  </row>
1725e9fcaa8aSmrg</tbody>
1726e9fcaa8aSmrg</tgroup>
1727e9fcaa8aSmrg</table>
1728e9fcaa8aSmrg
1729e9fcaa8aSmrg<para>
1730e9fcaa8aSmrgThe <emphasis>
1731e9fcaa8aSmrgflags</emphasis>
1732e9fcaa8aSmrg field is composed of the bitwise inclusive OR of the masks shown in Table
1733e9fcaa8aSmrg16.8. A general meaning is given in the table, but the exact meaning depends on
1734e9fcaa8aSmrgthe action <emphasis>
1735e9fcaa8aSmrgtype.</emphasis>
1736e9fcaa8aSmrg:
1737e9fcaa8aSmrg</para>
1738e9fcaa8aSmrg
1739e9fcaa8aSmrg<table frame='none'>
1740e9fcaa8aSmrg<title>Pointer Button Action Flags</title>
1741e9fcaa8aSmrg<tgroup cols='2'>
1742e9fcaa8aSmrg<colspec colsep='0'/>
1743e9fcaa8aSmrg<colspec colsep='0'/>
1744e9fcaa8aSmrg<thead>
1745e9fcaa8aSmrg<row rowsep='0'>
1746e9fcaa8aSmrg  <entry>Flag</entry>
1747e9fcaa8aSmrg  <entry>Meaning</entry>
1748e9fcaa8aSmrg</row>
1749e9fcaa8aSmrg</thead>
1750e9fcaa8aSmrg<tbody>
1751e9fcaa8aSmrg  <row rowsep='0'>
1752e9fcaa8aSmrg    <entry><emphasis>XkbSA_UseDfltButton</emphasis></entry>
1753e9fcaa8aSmrg    <entry>
1754e9fcaa8aSmrgIf set, the action uses the pointer button specified by the <emphasis>
1755e9fcaa8aSmrgmk_dflt_btn</emphasis>
1756e9fcaa8aSmrg attribute of the <emphasis>
1757e9fcaa8aSmrgMouseKeys</emphasis>
1758e9fcaa8aSmrg control (see section 10.5.1). Otherwise, the action uses the pointer button
1759e9fcaa8aSmrgspecified by the<emphasis>
1760e9fcaa8aSmrg button </emphasis>
1761e9fcaa8aSmrgfield.
1762e9fcaa8aSmrg    </entry>
1763e9fcaa8aSmrg  </row>
1764e9fcaa8aSmrg  <row rowsep='0'>
1765e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
1766e9fcaa8aSmrg    <entry>
1767e9fcaa8aSmrgIf set, and the action type is <emphasis>
1768e9fcaa8aSmrgXkbSA_LockPtrBtn</emphasis>
1769e9fcaa8aSmrg, the server only unlocks the pointer button.
1770e9fcaa8aSmrg    </entry>
1771e9fcaa8aSmrg  </row>
1772e9fcaa8aSmrg  <row rowsep='0'>
1773e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
1774e9fcaa8aSmrg    <entry>
1775e9fcaa8aSmrgIf set, and the action type is <emphasis>
1776e9fcaa8aSmrgXkbSA_LockPtrBtn</emphasis>
1777e9fcaa8aSmrg, the server only locks the pointer button.
1778e9fcaa8aSmrg    </entry>
1779e9fcaa8aSmrg  </row>
1780e9fcaa8aSmrg</tbody>
1781e9fcaa8aSmrg</tgroup>
1782e9fcaa8aSmrg</table>
1783e9fcaa8aSmrg
1784e9fcaa8aSmrg</sect2>
1785e9fcaa8aSmrg<sect2 id='actions_for_changing_the_pointer_button_simulated'>
1786e9fcaa8aSmrg<title>Actions for Changing the Pointer Button Simulated</title>
1787e9fcaa8aSmrg
1788e9fcaa8aSmrg<para>
1789e9fcaa8aSmrgActions associated with the <emphasis>
1790e9fcaa8aSmrgXkbPtrDfltAction</emphasis>
1791e9fcaa8aSmrg structure change the <emphasis>
1792e9fcaa8aSmrgmk_dflt_btn</emphasis>
1793e9fcaa8aSmrg attribute of the <emphasis>
1794e9fcaa8aSmrgMouseKeys</emphasis>
1795e9fcaa8aSmrg control (see section 10.5.1):
1796e9fcaa8aSmrg</para>
1797e9fcaa8aSmrg
1798e9fcaa8aSmrg<para><programlisting>
1799e9fcaa8aSmrgtypedef struct _XkbPtrDfltAction {
1800e9fcaa8aSmrg      unsigned char   type;      /* <emphasis> XkbSA_SetPtrDflt</emphasis> */
1801e9fcaa8aSmrg      unsigned char   flags;     /* controls the pointer button number */
1802e9fcaa8aSmrg      unsigned char   affect;    /* <emphasis> XkbSA_AffectDfltBtn</emphasis> */
1803e9fcaa8aSmrg      char            valueXXX;  /* new default button member */
1804e9fcaa8aSmrg} <emphasis>XkbPtrDfltAction</emphasis>;
1805e9fcaa8aSmrg</programlisting></para>
1806e9fcaa8aSmrg
1807e9fcaa8aSmrg<para>
1808e9fcaa8aSmrgIf the <emphasis>
1809e9fcaa8aSmrgMouseKeys</emphasis>
1810e9fcaa8aSmrg control is not enabled, <emphasis>
1811e9fcaa8aSmrgKeyPress</emphasis>
1812e9fcaa8aSmrg and <emphasis>
1813e9fcaa8aSmrgKeyRelease</emphasis>
1814e9fcaa8aSmrg events are treated as though the action is <emphasis>
1815e9fcaa8aSmrgXkbSA_NoAction</emphasis>
1816e9fcaa8aSmrg. Otherwise, this action changes the <emphasis>
1817e9fcaa8aSmrgmk_dflt_btn</emphasis>
1818e9fcaa8aSmrg attribute of the <emphasis>
1819e9fcaa8aSmrgMouseKeys</emphasis>
1820e9fcaa8aSmrg control.
1821e9fcaa8aSmrg</para>
1822e9fcaa8aSmrg
1823e9fcaa8aSmrg
1824e9fcaa8aSmrg<para>
1825e9fcaa8aSmrgThe <emphasis>
1826e9fcaa8aSmrgtype</emphasis>
1827e9fcaa8aSmrg field of the <emphasis>
1828e9fcaa8aSmrgXkbPtrDfltAction</emphasis>
1829e9fcaa8aSmrg structure should always be <emphasis>
1830e9fcaa8aSmrgXkbSA_SetPtrDflt</emphasis>
1831e9fcaa8aSmrg.
1832e9fcaa8aSmrg</para>
1833e9fcaa8aSmrg
1834e9fcaa8aSmrg
1835e9fcaa8aSmrg<para>
1836e9fcaa8aSmrgThe <emphasis>
1837e9fcaa8aSmrgflags</emphasis>
1838e9fcaa8aSmrg field is composed of the bitwise inclusive OR of the values shown in Table
1839e9fcaa8aSmrg16.9 (currently there is only one value defined).
1840e9fcaa8aSmrg</para>
1841e9fcaa8aSmrg
1842e9fcaa8aSmrg<table frame='none'>
1843e9fcaa8aSmrg<title>Pointer Default Flags</title>
1844e9fcaa8aSmrg<tgroup cols='2'>
1845e9fcaa8aSmrg<colspec colsep='0'/>
1846e9fcaa8aSmrg<colspec colsep='0'/>
1847e9fcaa8aSmrg<thead>
1848e9fcaa8aSmrg<row rowsep='0'>
1849e9fcaa8aSmrg  <entry>Flag</entry>
1850e9fcaa8aSmrg  <entry>Meaning</entry>
1851e9fcaa8aSmrg</row>
1852e9fcaa8aSmrg</thead>
1853e9fcaa8aSmrg<tbody>
1854e9fcaa8aSmrg  <row rowsep='0'>
1855e9fcaa8aSmrg    <entry><emphasis>XkbSA_DfltBtnAbsolute</emphasis></entry>
1856e9fcaa8aSmrg    <entry>
1857e9fcaa8aSmrgIf set, the <emphasis>
1858e9fcaa8aSmrgvalue</emphasis>
1859e9fcaa8aSmrg field represents an absolute pointer button. Otherwise, the <emphasis>
1860e9fcaa8aSmrgvalue</emphasis>
1861e9fcaa8aSmrg field represents the amount to be added to the current default button.
1862e9fcaa8aSmrg    </entry>
1863e9fcaa8aSmrg  </row>
1864e9fcaa8aSmrg</tbody>
1865e9fcaa8aSmrg</tgroup>
1866e9fcaa8aSmrg</table>
1867e9fcaa8aSmrg
1868e9fcaa8aSmrg<para>
1869e9fcaa8aSmrgThe <emphasis>
1870e9fcaa8aSmrgaffect</emphasis>
1871e9fcaa8aSmrg field specifies what changes as a result of this action. The only valid value
1872e9fcaa8aSmrgfor the <emphasis>
1873e9fcaa8aSmrgaffect</emphasis>
1874e9fcaa8aSmrg field is <emphasis>XkbSA_AffectDfltBtn</emphasis>.
1875e9fcaa8aSmrg</para>
1876e9fcaa8aSmrg
1877e9fcaa8aSmrg<para>
1878e9fcaa8aSmrgThe <emphasis>
1879e9fcaa8aSmrgvalueXXX</emphasis>
1880e9fcaa8aSmrg field is a signed character that represents the new button value for the
1881e9fcaa8aSmrg<emphasis>
1882e9fcaa8aSmrgmk_dflt_btn</emphasis>
1883e9fcaa8aSmrg attribute of the <emphasis>
1884e9fcaa8aSmrgMouseKeys</emphasis>
1885e9fcaa8aSmrg control (see section 10.5.1). If <emphasis>
1886e9fcaa8aSmrgXkbSA_DfltBtnAbsolute</emphasis>
1887e9fcaa8aSmrg is set in <emphasis>
1888e9fcaa8aSmrgflags</emphasis>
1889e9fcaa8aSmrg, <emphasis>
1890e9fcaa8aSmrgvalueXXX</emphasis>
1891e9fcaa8aSmrg specifies the button to be used; otherwise, <emphasis>
1892e9fcaa8aSmrgvalueXXX</emphasis>
1893e9fcaa8aSmrg specifies the amount to be added to the current default button. In either
1894e9fcaa8aSmrgcase, illegal button choices are wrapped back around into range. Xkb provides
1895e9fcaa8aSmrgthe following macros, to convert between the integer and signed character
1896e9fcaa8aSmrgvalues in <emphasis>
1897e9fcaa8aSmrgXkbPtrDfltAction</emphasis>
1898e9fcaa8aSmrg structures:
1899e9fcaa8aSmrg</para>
1900e9fcaa8aSmrg
1901e9fcaa8aSmrg<informaltable frame='none'>
1902e9fcaa8aSmrg<tgroup cols='1'>
1903e9fcaa8aSmrg<colspec colsep='0'/>
1904e9fcaa8aSmrg<tbody>
1905e9fcaa8aSmrg  <row rowsep='0'>
1906e9fcaa8aSmrg    <entry role='functiondecl'>
1907e9fcaa8aSmrgint <emphasis>
1908e9fcaa8aSmrgXkbSAPtrDfltValue</emphasis>
1909e9fcaa8aSmrg(<emphasis>
1910e9fcaa8aSmrgact</emphasis>
1911e9fcaa8aSmrg)                              /* macro */
1912e9fcaa8aSmrg    </entry>
1913e9fcaa8aSmrg  </row>
1914e9fcaa8aSmrg  <row rowsep='0'>
1915e9fcaa8aSmrg    <entry role='functionargdecl'>
1916e9fcaa8aSmrgXkbAction            <emphasis>
1917e9fcaa8aSmrgact</emphasis>
1918e9fcaa8aSmrg;                  /* action from which to extract group */
1919e9fcaa8aSmrg    </entry>
1920e9fcaa8aSmrg</row>
1921e9fcaa8aSmrg</tbody>
1922e9fcaa8aSmrg</tgroup>
1923e9fcaa8aSmrg</informaltable>
1924e9fcaa8aSmrg
1925e9fcaa8aSmrg<para>
1926e9fcaa8aSmrg<emphasis>
1927e9fcaa8aSmrgXkbSAPtrDfltValue</emphasis>
1928e9fcaa8aSmrg returns the <emphasis>
1929e9fcaa8aSmrgvalueXXX</emphasis>
1930e9fcaa8aSmrg field of <emphasis>
1931e9fcaa8aSmrgact</emphasis>
1932e9fcaa8aSmrg converted to a signed int.
1933e9fcaa8aSmrg</para>
1934e9fcaa8aSmrg
1935e9fcaa8aSmrg
1936e9fcaa8aSmrg<informaltable frame='none'>
1937e9fcaa8aSmrg<tgroup cols='1'>
1938e9fcaa8aSmrg<colspec colsep='0'/>
1939e9fcaa8aSmrg<tbody>
1940e9fcaa8aSmrg  <row rowsep='0'>
1941e9fcaa8aSmrg    <entry role='functiondecl'>
1942e9fcaa8aSmrgvoid <emphasis>
1943e9fcaa8aSmrgXkbSASetPtrDfltValue</emphasis>
1944e9fcaa8aSmrg(<emphasis>
1945e9fcaa8aSmrgact, val</emphasis>
1946e9fcaa8aSmrg)                              /* macro */
1947e9fcaa8aSmrg    </entry>
1948e9fcaa8aSmrg  </row>
1949e9fcaa8aSmrg  <row rowsep='0'>
1950e9fcaa8aSmrg    <entry role='functionargdecl'>
1951e9fcaa8aSmrgXkbPtrDfltAction            <emphasis>
1952e9fcaa8aSmrgact</emphasis>
1953e9fcaa8aSmrg;                  /* action in which to set <emphasis>
1954e9fcaa8aSmrgvalueXXX</emphasis>
1955e9fcaa8aSmrg */
1956e9fcaa8aSmrg    </entry>
1957e9fcaa8aSmrg  </row>
1958e9fcaa8aSmrg  <row rowsep='0'>
1959e9fcaa8aSmrg    <entry role='functionargdecl'>
1960e9fcaa8aSmrgint            <emphasis>
1961e9fcaa8aSmrgval</emphasis>
1962e9fcaa8aSmrg;                  /* value to set in <emphasis>
1963e9fcaa8aSmrgvalueXXX</emphasis>
1964e9fcaa8aSmrg */
1965e9fcaa8aSmrg    </entry>
1966e9fcaa8aSmrg</row>
1967e9fcaa8aSmrg</tbody>
1968e9fcaa8aSmrg</tgroup>
1969e9fcaa8aSmrg</informaltable>
1970e9fcaa8aSmrg
1971e9fcaa8aSmrg<para>
1972e9fcaa8aSmrg<emphasis>
1973e9fcaa8aSmrgXkbSASetPtrDfltValue</emphasis>
1974e9fcaa8aSmrg sets the <emphasis>
1975e9fcaa8aSmrgvalueXXX</emphasis>
1976e9fcaa8aSmrg field of <emphasis>
1977e9fcaa8aSmrgact</emphasis>
1978e9fcaa8aSmrg from <emphasis>
1979e9fcaa8aSmrgval</emphasis>
1980e9fcaa8aSmrg.
1981e9fcaa8aSmrg</para>
1982e9fcaa8aSmrg
1983e9fcaa8aSmrg
1984e9fcaa8aSmrg</sect2>
1985e9fcaa8aSmrg<sect2 id='actions_for_locking_modifiers_and_group'>
1986e9fcaa8aSmrg<title>Actions for Locking Modifiers and Group</title>
1987e9fcaa8aSmrg
1988e9fcaa8aSmrg<para>
1989e9fcaa8aSmrgActions associated with the <emphasis>
1990e9fcaa8aSmrgXkbISOAction</emphasis>
1991e9fcaa8aSmrg structure lock modifiers and the group according to the ISO9995 specification.
1992e9fcaa8aSmrg</para>
1993e9fcaa8aSmrg
1994e9fcaa8aSmrg
1995e9fcaa8aSmrg<para>
1996e9fcaa8aSmrgOperated by itself, the <emphasis>
1997e9fcaa8aSmrgXkbISOAction</emphasis>
1998e9fcaa8aSmrg is just a caps lock. Operated simultaneously with another modifier key, it
1999e9fcaa8aSmrgtransforms the other key into a locking key. For example, press <emphasis>
2000e9fcaa8aSmrgISO_Lock</emphasis>
2001e9fcaa8aSmrg, press and release <emphasis>
2002e9fcaa8aSmrgControl_L</emphasis>
2003e9fcaa8aSmrg, release <emphasis>
2004e9fcaa8aSmrgISO_Lock</emphasis>
2005e9fcaa8aSmrg ends up locking the <emphasis>
2006e9fcaa8aSmrgControl</emphasis>
2007e9fcaa8aSmrg modifier.
2008e9fcaa8aSmrg</para>
2009e9fcaa8aSmrg
2010e9fcaa8aSmrg
2011e9fcaa8aSmrg<para>
2012e9fcaa8aSmrgThe default behavior is to convert:
2013e9fcaa8aSmrg</para>
2014e9fcaa8aSmrg
2015e9fcaa8aSmrg<literallayout>
2016e9fcaa8aSmrg     {Set,Latch}Mods to: LockMods
2017e9fcaa8aSmrg     {Set,Latch}Group to: LockGroup
2018e9fcaa8aSmrg     SetPtrBtn to: LockPtrBtn
2019e9fcaa8aSmrg     SetControls to: LockControls
2020e9fcaa8aSmrg</literallayout>
2021e9fcaa8aSmrg
2022e9fcaa8aSmrg<para>
2023e9fcaa8aSmrgThe <emphasis>
2024e9fcaa8aSmrgaffects</emphasis>
2025e9fcaa8aSmrg field allows you to turn those effects on or off individually. Set <emphasis>
2026e9fcaa8aSmrgXkbSA_ISONoAffectMods</emphasis>
2027e9fcaa8aSmrg to disable the first, <emphasis>
2028e9fcaa8aSmrgXkbSA_ISONoAffectGroup</emphasis>
2029e9fcaa8aSmrg to disable the second, and so forth.
2030e9fcaa8aSmrg</para>
2031e9fcaa8aSmrg
2032e9fcaa8aSmrg<para><programlisting>
2033e9fcaa8aSmrgtypedef struct _XkbISOAction {
2034e9fcaa8aSmrg      unsigned char   type;        /* <emphasis>XkbSA_ISOLock</emphasis> */
2035e9fcaa8aSmrg      unsigned char   flags;       /* controls changes to group or modifier state */
2036e9fcaa8aSmrg      unsigned char   mask;        /* same as <emphasis>mask</emphasis> field of a modifier description */
2037e9fcaa8aSmrg      unsigned char   real_mods;   /* same as <emphasis>real_mods</emphasis> field of a modifier description */
2038e9fcaa8aSmrg      char            group_XXX;   /* group index or delta group */
2039e9fcaa8aSmrg      unsigned char   affect;      /* specifies whether to affect mods, group, ptrbtn, or controls*/
2040e9fcaa8aSmrg      unsigned char   vmods1;      /* derived from <emphasis>vmods</emphasis> field of a modifier description */
2041e9fcaa8aSmrg      unsigned char   vmods2;      /* derived from <emphasis>vmods</emphasis> field of a modifier description */
2042e9fcaa8aSmrg} <emphasis>XkbISOAction</emphasis>;
2043e9fcaa8aSmrg</programlisting></para>
2044e9fcaa8aSmrg
2045e9fcaa8aSmrg<para>
2046e9fcaa8aSmrgThe <emphasis>
2047e9fcaa8aSmrgtype</emphasis>
2048e9fcaa8aSmrg field of the <emphasis>
2049e9fcaa8aSmrgXkbISOAction</emphasis>
2050e9fcaa8aSmrg structure should always be <emphasis>
2051e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2052e9fcaa8aSmrg.
2053e9fcaa8aSmrg</para>
2054e9fcaa8aSmrg
2055e9fcaa8aSmrg
2056e9fcaa8aSmrg<para>
2057e9fcaa8aSmrgThe interpretation of the <emphasis>
2058e9fcaa8aSmrgflags</emphasis>
2059e9fcaa8aSmrg field depends on whether the <emphasis>
2060e9fcaa8aSmrgXkbSA_ISODfltIsGroup</emphasis>
2061e9fcaa8aSmrg is set in the <emphasis>
2062e9fcaa8aSmrgflags</emphasis>
2063e9fcaa8aSmrg field or not.
2064e9fcaa8aSmrg</para>
2065e9fcaa8aSmrg
2066e9fcaa8aSmrg
2067e9fcaa8aSmrg<para>
2068e9fcaa8aSmrgIf the <emphasis>
2069e9fcaa8aSmrgXkbSA_ISODfltIsGroup</emphasis>
2070e9fcaa8aSmrg is set in the <emphasis>
2071e9fcaa8aSmrgflags</emphasis>
2072e9fcaa8aSmrg field, the action is used to change the group state. The remaining valid bits
2073e9fcaa8aSmrgof the <emphasis>
2074e9fcaa8aSmrgflags</emphasis>
2075e9fcaa8aSmrg field are composed of a bitwise inclusive OR using the masks shown in Table
2076e9fcaa8aSmrg16.10.
2077e9fcaa8aSmrg</para>
2078e9fcaa8aSmrg
2079e9fcaa8aSmrg<table frame='none'>
2080e9fcaa8aSmrg<title>ISO Action Flags when XkbSA_ISODfltIsGroup is Set</title>
2081e9fcaa8aSmrg<tgroup cols='2'>
2082e9fcaa8aSmrg<colspec colsep='0'/>
2083e9fcaa8aSmrg<colspec colsep='0'/>
2084e9fcaa8aSmrg<thead>
2085e9fcaa8aSmrg<row rowsep='0'>
2086e9fcaa8aSmrg  <entry>Flag</entry>
2087e9fcaa8aSmrg  <entry>Meaning</entry>
2088e9fcaa8aSmrg</row>
2089e9fcaa8aSmrg</thead>
2090e9fcaa8aSmrg<tbody>
2091e9fcaa8aSmrg  <row rowsep='0'>
2092e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISODfltIsGroup</emphasis></entry>
2093e9fcaa8aSmrg    <entry>
2094e9fcaa8aSmrg      <para>
2095e9fcaa8aSmrgIf set, the action is used to change the base group state. Must be set for the
2096e9fcaa8aSmrgremaining bits in this table to carry their interpretations.
2097e9fcaa8aSmrg      </para>
2098e9fcaa8aSmrg      <para>
2099e9fcaa8aSmrgA key press sets the base group as specified by the <emphasis>
2100e9fcaa8aSmrggroup_XXX</emphasis>
2101e9fcaa8aSmrg field and the <emphasis>
2102e9fcaa8aSmrgXkbSA_GroupAbsolute</emphasis>
2103e9fcaa8aSmrg bit of the <emphasis>
2104e9fcaa8aSmrgflags</emphasis>
2105e9fcaa8aSmrg field (see section Note). If no other actions are transformed by the <emphasis>
2106e9fcaa8aSmrgXkbISO_Lock</emphasis>
2107e9fcaa8aSmrg action, a key release locks the group. Otherwise, a key release clears group
2108e9fcaa8aSmrgset by the key press.
2109e9fcaa8aSmrg      </para>
2110e9fcaa8aSmrg    </entry>
2111e9fcaa8aSmrg  </row>
2112e9fcaa8aSmrg  <row rowsep='0'>
2113e9fcaa8aSmrg    <entry><emphasis>XkbSA_GroupAbsolute</emphasis></entry>
2114e9fcaa8aSmrg    <entry>
2115e9fcaa8aSmrgIf set, the <emphasis>
2116e9fcaa8aSmrggroup_XXX</emphasis>
2117e9fcaa8aSmrg field represents an absolute group number. Otherwise, it represents a group
2118e9fcaa8aSmrgdelta to be added to the current group to determine the new group number.
2119e9fcaa8aSmrg    </entry>
2120e9fcaa8aSmrg  </row>
2121e9fcaa8aSmrg  <row rowsep='0'>
2122e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectMods</emphasis></entry>
2123e9fcaa8aSmrg    <entry>
2124e9fcaa8aSmrgIf not set, any <emphasis>
2125e9fcaa8aSmrgXkbSA_SetMods</emphasis>
2126e9fcaa8aSmrg or <emphasis>
2127e9fcaa8aSmrgXkbSA_LatchMods</emphasis>
2128e9fcaa8aSmrg actions that occur simultaneously with the <emphasis>
2129e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2130e9fcaa8aSmrg action are treated as <emphasis>
2131e9fcaa8aSmrgXkbSA_LockMod</emphasis>
2132e9fcaa8aSmrg actions instead.
2133e9fcaa8aSmrg    </entry>
2134e9fcaa8aSmrg  </row>
2135e9fcaa8aSmrg  <row rowsep='0'>
2136e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectGroup</emphasis></entry>
2137e9fcaa8aSmrg    <entry>
2138e9fcaa8aSmrgIf not set, any <emphasis>
2139e9fcaa8aSmrgXkbSA_SetGroup</emphasis>
2140e9fcaa8aSmrg or <emphasis>
2141e9fcaa8aSmrgXkbSA_LatchGroup</emphasis>
2142e9fcaa8aSmrg actions that occur simultaneously with the <emphasis>
2143e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2144e9fcaa8aSmrg action are treated as <emphasis>
2145e9fcaa8aSmrgXkbSA_LockGroup</emphasis>
2146e9fcaa8aSmrg actions instead.
2147e9fcaa8aSmrg    </entry>
2148e9fcaa8aSmrg  </row>
2149e9fcaa8aSmrg  <row rowsep='0'>
2150e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectPtr</emphasis></entry>
2151e9fcaa8aSmrg    <entry>
2152e9fcaa8aSmrgIf not set, any <emphasis>
2153e9fcaa8aSmrgXkbSA_PtrBtn</emphasis>
2154e9fcaa8aSmrg actions that occur simultaneously with the <emphasis>
2155e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2156e9fcaa8aSmrg action are treated as <emphasis>
2157e9fcaa8aSmrgXkbSA_LockPtrBtn</emphasis>
2158e9fcaa8aSmrg actions instead.
2159e9fcaa8aSmrg    </entry>
2160e9fcaa8aSmrg  </row>
2161e9fcaa8aSmrg  <row rowsep='0'>
2162e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectCtrls</emphasis></entry>
2163e9fcaa8aSmrg    <entry>
2164e9fcaa8aSmrgIf not set, any <emphasis>
2165e9fcaa8aSmrgXkbSA_SetControls</emphasis>
2166e9fcaa8aSmrg actions that occur simultaneously with the <emphasis>
2167e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2168e9fcaa8aSmrg action are treated as <emphasis>
2169e9fcaa8aSmrgXkbSA_LockControls</emphasis>
2170e9fcaa8aSmrg actions instead.
2171e9fcaa8aSmrg    </entry>
2172e9fcaa8aSmrg  </row>
2173e9fcaa8aSmrg</tbody>
2174e9fcaa8aSmrg</tgroup>
2175e9fcaa8aSmrg</table>
2176e9fcaa8aSmrg
2177e9fcaa8aSmrg<para>
2178e9fcaa8aSmrgIf the <emphasis>
2179e9fcaa8aSmrgXkbSA_ISODfltIsGroup</emphasis>
2180e9fcaa8aSmrg is not set in the <emphasis>
2181e9fcaa8aSmrgflags</emphasis>
2182e9fcaa8aSmrg field, the action is used to change the modifier state and the remaining valid
2183e9fcaa8aSmrgbits of the <emphasis>
2184e9fcaa8aSmrgflags</emphasis>
2185e9fcaa8aSmrg field are composed of a bitwise inclusive OR using the masks shown in Table
2186e9fcaa8aSmrg16.11.
2187e9fcaa8aSmrg</para>
2188e9fcaa8aSmrg
2189e9fcaa8aSmrg<table frame='none'>
2190e9fcaa8aSmrg<title>ISO Action Flags when XkbSA_ISODfltIsGroup is Not Set</title>
2191e9fcaa8aSmrg<tgroup cols='2'>
2192e9fcaa8aSmrg<colspec colsep='0'/>
2193e9fcaa8aSmrg<colspec colsep='0'/>
2194e9fcaa8aSmrg<thead>
2195e9fcaa8aSmrg<row rowsep='0'>
2196e9fcaa8aSmrg  <entry>Flag</entry>
2197e9fcaa8aSmrg  <entry>Meaning</entry>
2198e9fcaa8aSmrg</row>
2199e9fcaa8aSmrg</thead>
2200e9fcaa8aSmrg<tbody>
2201e9fcaa8aSmrg  <row rowsep='0'>
2202e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISODfltIsGroup</emphasis> </entry>
2203e9fcaa8aSmrg    <entry>
2204e9fcaa8aSmrg      <para>
2205e9fcaa8aSmrgIf not set, action is used to change the base modifier state. Must not be set
2206e9fcaa8aSmrgfor the remaining bits in this table to carry their interpretations.
2207e9fcaa8aSmrg      </para>
2208e9fcaa8aSmrg      <para>
2209e9fcaa8aSmrgA key press sets the action modifiers in the keyboard’s base modifiers using
2210e9fcaa8aSmrgthe <emphasis>
2211e9fcaa8aSmrgmask</emphasis>
2212e9fcaa8aSmrg, <emphasis>
2213e9fcaa8aSmrgreal_mods</emphasis>
2214e9fcaa8aSmrg, <emphasis>
2215e9fcaa8aSmrgvmods1</emphasis>
2216e9fcaa8aSmrg, and <emphasis>
2217e9fcaa8aSmrgvmods2 </emphasis>
2218e9fcaa8aSmrgfields (see section 16.1.3). If no other actions are transformed by the
2219e9fcaa8aSmrg<emphasis>
2220e9fcaa8aSmrgXkbISO_Lock</emphasis>
2221e9fcaa8aSmrg action, a key release locks the action modifiers. Otherwise, a key release
2222e9fcaa8aSmrgclears the base modifiers set by the key press.
2223e9fcaa8aSmrg      </para>
2224e9fcaa8aSmrg    </entry>
2225e9fcaa8aSmrg  </row>
2226e9fcaa8aSmrg  <row rowsep='0'>
2227e9fcaa8aSmrg    <entry><emphasis>XkbSA_UseModMapMods</emphasis></entry>
2228e9fcaa8aSmrg    <entry>
2229e9fcaa8aSmrgIf set, the action modifiers are determined by the modifiers bound by the
2230e9fcaa8aSmrgmodifier mapping of the key. Otherwise, the action modifiers are set to the
2231e9fcaa8aSmrgmodifiers specified by the <emphasis>
2232e9fcaa8aSmrgmask</emphasis>
2233e9fcaa8aSmrg, <emphasis>
2234e9fcaa8aSmrgreal_mods</emphasis>
2235e9fcaa8aSmrg, <emphasis>
2236e9fcaa8aSmrgvmod1</emphasis>
2237e9fcaa8aSmrg, and <emphasis>
2238e9fcaa8aSmrgvmod2</emphasis>
2239e9fcaa8aSmrg fields.
2240e9fcaa8aSmrg    </entry>
2241e9fcaa8aSmrg  </row>
2242e9fcaa8aSmrg  <row rowsep='0'>
2243e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
2244e9fcaa8aSmrg    <entry>If set, the server only unlocks the action modifiers.</entry>
2245e9fcaa8aSmrg  </row>
2246e9fcaa8aSmrg  <row rowsep='0'>
2247e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
2248e9fcaa8aSmrg    <entry>If set, the server only locks the action modifiers. </entry>
2249e9fcaa8aSmrg  </row>
2250e9fcaa8aSmrg  <row rowsep='0'>
2251e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectMods</emphasis></entry>
2252e9fcaa8aSmrg    <entry>
2253e9fcaa8aSmrgIf not set, any <emphasis>
2254e9fcaa8aSmrgXkbSA_SetMods</emphasis>
2255e9fcaa8aSmrg or <emphasis>
2256e9fcaa8aSmrgXkbSA_LatchMods</emphasis>
2257e9fcaa8aSmrg actions that occur simultaneously with the <emphasis>
2258e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2259e9fcaa8aSmrg action are treated as <emphasis>
2260e9fcaa8aSmrgXkbSA_LockMod</emphasis>
2261e9fcaa8aSmrg actions instead.
2262e9fcaa8aSmrg    </entry>
2263e9fcaa8aSmrg  </row>
2264e9fcaa8aSmrg  <row rowsep='0'>
2265e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectGroup</emphasis></entry>
2266e9fcaa8aSmrg    <entry>
2267e9fcaa8aSmrgIf not set, any <emphasis>
2268e9fcaa8aSmrgXkbSA_SetGroup</emphasis>
2269e9fcaa8aSmrg or <emphasis>
2270e9fcaa8aSmrgXkbSA_LatchGroup</emphasis>
2271e9fcaa8aSmrg actions that occur simultaneously with the <emphasis>
2272e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2273e9fcaa8aSmrg action are treated as <emphasis>
2274e9fcaa8aSmrgXkbSA_LockGroup</emphasis>
2275e9fcaa8aSmrg actions instead.
2276e9fcaa8aSmrg    </entry>
2277e9fcaa8aSmrg  </row>
2278e9fcaa8aSmrg  <row rowsep='0'>
2279e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectPtr</emphasis></entry>
2280e9fcaa8aSmrg    <entry>
2281e9fcaa8aSmrgIf not set, any <emphasis>
2282e9fcaa8aSmrgXkbSA_PtrBtn</emphasis>
2283e9fcaa8aSmrg actions that occur simultaneously with the <emphasis>
2284e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2285e9fcaa8aSmrg action are treated as <emphasis>
2286e9fcaa8aSmrgXkbSA_LockPtrBtn</emphasis>
2287e9fcaa8aSmrg actions instead.
2288e9fcaa8aSmrg    </entry>
2289e9fcaa8aSmrg  </row>
2290e9fcaa8aSmrg  <row rowsep='0'>
2291e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectCtrls</emphasis></entry>
2292e9fcaa8aSmrg    <entry>
2293e9fcaa8aSmrgIf not set, any <emphasis>
2294e9fcaa8aSmrgXkbSA_SetControls</emphasis>
2295e9fcaa8aSmrg actions that occur simultaneously with the <emphasis>
2296e9fcaa8aSmrgXkbSA_ISOLock</emphasis>
2297e9fcaa8aSmrg action are treated as <emphasis>
2298e9fcaa8aSmrgXkbSA_LockControls</emphasis>
2299e9fcaa8aSmrg actions instead.
2300e9fcaa8aSmrg    </entry>
2301e9fcaa8aSmrg  </row>
2302e9fcaa8aSmrg</tbody>
2303e9fcaa8aSmrg</tgroup>
2304e9fcaa8aSmrg</table>
2305e9fcaa8aSmrg
2306e9fcaa8aSmrg<para>
2307e9fcaa8aSmrgThe <emphasis>
2308e9fcaa8aSmrggroup_XXX</emphasis>
2309e9fcaa8aSmrg field represents a signed character. Xkb provides macros to convert between a
2310e9fcaa8aSmrgsigned integer value and a signed character as shown in section Note.
2311e9fcaa8aSmrg</para>
2312e9fcaa8aSmrg
2313e9fcaa8aSmrg
2314e9fcaa8aSmrg<para>
2315e9fcaa8aSmrgThe <emphasis>
2316e9fcaa8aSmrgmask</emphasis>
2317e9fcaa8aSmrg, <emphasis>
2318e9fcaa8aSmrgreal_mods</emphasis>
2319e9fcaa8aSmrg, <emphasis>
2320e9fcaa8aSmrgvmods1</emphasis>
2321e9fcaa8aSmrg, and <emphasis>
2322e9fcaa8aSmrgvmods2</emphasis>
2323e9fcaa8aSmrg fields represent the components of an Xkb modifier description (see section
2324e9fcaa8aSmrg7.2). While the <emphasis>
2325e9fcaa8aSmrgmask</emphasis>
2326e9fcaa8aSmrg and <emphasis>
2327e9fcaa8aSmrgreal_mods</emphasis>
2328e9fcaa8aSmrg fields correspond directly to the <emphasis>
2329e9fcaa8aSmrgmask</emphasis>
2330e9fcaa8aSmrg and <emphasis>
2331e9fcaa8aSmrgreal_mods</emphasis>
2332e9fcaa8aSmrg fields of an Xkb modifier description, the <emphasis>
2333e9fcaa8aSmrgvmods1</emphasis>
2334e9fcaa8aSmrg and <emphasis>
2335e9fcaa8aSmrgvmods2</emphasis>
2336e9fcaa8aSmrg fields are combined to correspond to the <emphasis>
2337e9fcaa8aSmrgvmods</emphasis>
2338e9fcaa8aSmrg field of an Xkb modifier description. Xkb provides macros to convert between
2339e9fcaa8aSmrgthe two formats as shown in section 16.1.3.
2340e9fcaa8aSmrg</para>
2341e9fcaa8aSmrg
2342e9fcaa8aSmrg
2343e9fcaa8aSmrg<para>
2344e9fcaa8aSmrgThe <emphasis>
2345e9fcaa8aSmrgaffect</emphasis>
2346e9fcaa8aSmrg field is composed of a bitwise inclusive OR using the masks shown in Table
2347e9fcaa8aSmrg16.11.
2348e9fcaa8aSmrg</para>
2349e9fcaa8aSmrg
2350e9fcaa8aSmrg<table frame='none'>
2351e9fcaa8aSmrg<title>ISO Action Affect Field Values</title>
2352e9fcaa8aSmrg<tgroup cols='2'>
2353e9fcaa8aSmrg<colspec colsep='0'/>
2354e9fcaa8aSmrg<colspec colsep='0'/>
2355e9fcaa8aSmrg<thead>
2356e9fcaa8aSmrg<row rowsep='0'>
2357e9fcaa8aSmrg  <entry>Affect</entry>
2358e9fcaa8aSmrg  <entry>Meaning</entry>
2359e9fcaa8aSmrg</row>
2360e9fcaa8aSmrg</thead>
2361e9fcaa8aSmrg<tbody>
2362e9fcaa8aSmrg  <row rowsep='0'>
2363e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISODNoAffectMods</emphasis></entry>
2364e9fcaa8aSmrg    <entry>
2365e9fcaa8aSmrgIf <emphasis>
2366e9fcaa8aSmrgXkbSA_ISONoAffectMods</emphasis>
2367e9fcaa8aSmrg is not set, any <emphasis>
2368e9fcaa8aSmrgSA_SetMods</emphasis>
2369e9fcaa8aSmrg or <emphasis>
2370e9fcaa8aSmrgSA_LatchMods</emphasis>
2371e9fcaa8aSmrg actions occurring simultaneously with the <emphasis>
2372e9fcaa8aSmrgXkbISOAction</emphasis>
2373e9fcaa8aSmrg are treated as <emphasis>
2374e9fcaa8aSmrgSA_LockMods</emphasis>
2375e9fcaa8aSmrg instead.
2376e9fcaa8aSmrg    </entry>
2377e9fcaa8aSmrg  </row>
2378e9fcaa8aSmrg  <row rowsep='0'>
2379e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectGroup</emphasis></entry>
2380e9fcaa8aSmrg    <entry>
2381e9fcaa8aSmrgIf <emphasis>
2382e9fcaa8aSmrgXkbSA_ISONoAffectGroup</emphasis>
2383e9fcaa8aSmrg is not set, any <emphasis>
2384e9fcaa8aSmrgSA_SetGroup</emphasis>
2385e9fcaa8aSmrg or <emphasis>
2386e9fcaa8aSmrgSA_LatchGroup</emphasis>
2387e9fcaa8aSmrg actions occurring simultaneously with the <emphasis>
2388e9fcaa8aSmrgXkbISOAction</emphasis>
2389e9fcaa8aSmrg are treated as <emphasis>
2390e9fcaa8aSmrgSA_LockGroup</emphasis>
2391e9fcaa8aSmrg instead.
2392e9fcaa8aSmrg    </entry>
2393e9fcaa8aSmrg  </row>
2394e9fcaa8aSmrg  <row rowsep='0'>
2395e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectPtr</emphasis></entry>
2396e9fcaa8aSmrg    <entry>
2397e9fcaa8aSmrgIf <emphasis>
2398e9fcaa8aSmrgXkbSA_ISONoAffectPtr</emphasis>
2399e9fcaa8aSmrg is not set, any <emphasis>
2400e9fcaa8aSmrgSA_PtrBtn</emphasis>
2401e9fcaa8aSmrg actions occurring simultaneously with the <emphasis>
2402e9fcaa8aSmrgXkbISOAction</emphasis>
2403e9fcaa8aSmrg are treated as <emphasis>
2404e9fcaa8aSmrgSA_LockPtrBtn</emphasis>
2405e9fcaa8aSmrg instead.
2406e9fcaa8aSmrg    </entry>
2407e9fcaa8aSmrg  </row>
2408e9fcaa8aSmrg  <row rowsep='0'>
2409e9fcaa8aSmrg    <entry><emphasis>XkbSA_ISONoAffectCtrls</emphasis></entry>
2410e9fcaa8aSmrg    <entry>
2411e9fcaa8aSmrgIf <emphasis>
2412e9fcaa8aSmrgXkbSA_ISONoAffectCtrls</emphasis>
2413e9fcaa8aSmrg is not set, any <emphasis>
2414e9fcaa8aSmrgSA_SetControls</emphasis>
2415e9fcaa8aSmrg actions occurring simultaneously with the <emphasis>
2416e9fcaa8aSmrgXkbISOAction</emphasis>
2417e9fcaa8aSmrg are treated as <emphasis>
2418e9fcaa8aSmrgSA_LockControls</emphasis>
2419e9fcaa8aSmrg instead.
2420e9fcaa8aSmrg    </entry>
2421e9fcaa8aSmrg  </row>
2422e9fcaa8aSmrg</tbody>
2423e9fcaa8aSmrg</tgroup>
2424e9fcaa8aSmrg</table>
2425e9fcaa8aSmrg
2426e9fcaa8aSmrg</sect2>
2427e9fcaa8aSmrg<sect2 id='actions_for_changing_the_active_screen'>
2428e9fcaa8aSmrg<title>Actions for Changing the Active Screen</title>
2429e9fcaa8aSmrg
2430e9fcaa8aSmrg<para>
2431e9fcaa8aSmrgActions associated with the <emphasis>
2432e9fcaa8aSmrgXkbSwitchScreen</emphasis>
2433e9fcaa8aSmrg action structure change the active screen on a multiscreen display:
2434e9fcaa8aSmrg</para>
2435e9fcaa8aSmrg
2436e9fcaa8aSmrg<note><para>This action is optional. Servers are free to ignore the action or
2437e9fcaa8aSmrgany of its flags if they do not support the requested behavior. If the action
2438e9fcaa8aSmrgis ignored, it behaves like <emphasis>
2439e9fcaa8aSmrgXkbSA_NoAction</emphasis>
2440e9fcaa8aSmrg. Otherwise, key press and key release events do not generate an event.
2441e9fcaa8aSmrg</para></note>
2442e9fcaa8aSmrg
2443e9fcaa8aSmrg<para><programlisting>
2444e9fcaa8aSmrgtypedef struct _XkbSwitchScreenAction {
2445e9fcaa8aSmrg      unsigned char   type;        /* <emphasis> XkbSA_SwitchScreen</emphasis> */
2446e9fcaa8aSmrg      unsigned char   flags;       /* controls screen switching */
2447e9fcaa8aSmrg      char            screenXXX;   /* screen number or delta */
2448e9fcaa8aSmrg} <emphasis>XkbSwitchScreenAction</emphasis>;
2449e9fcaa8aSmrg</programlisting></para>
2450e9fcaa8aSmrg
2451e9fcaa8aSmrg<para>
2452e9fcaa8aSmrgThe <emphasis>
2453e9fcaa8aSmrgtype</emphasis>
2454e9fcaa8aSmrg field of the <emphasis>
2455e9fcaa8aSmrgXkbSwitchScreenAction</emphasis>
2456e9fcaa8aSmrg structure should always be <emphasis>
2457e9fcaa8aSmrgXkbSA_SwitchScreen</emphasis>.
2458e9fcaa8aSmrg</para>
2459e9fcaa8aSmrg
2460e9fcaa8aSmrg
2461e9fcaa8aSmrg<para>
2462e9fcaa8aSmrgThe <emphasis>
2463e9fcaa8aSmrgflags</emphasis>
2464e9fcaa8aSmrg field is composed of the bitwise inclusive OR of the masks shown in Table
2465e9fcaa8aSmrg16.13.
2466e9fcaa8aSmrg</para>
2467e9fcaa8aSmrg
2468e9fcaa8aSmrg<table frame='none'>
2469e9fcaa8aSmrg<title>Switch Screen Action Flags</title>
2470e9fcaa8aSmrg<tgroup cols='2'>
2471e9fcaa8aSmrg<colspec colsep='0'/>
2472e9fcaa8aSmrg<colspec colsep='0'/>
2473e9fcaa8aSmrg<thead>
2474e9fcaa8aSmrg<row rowsep='0'>
2475e9fcaa8aSmrg  <entry>Flag</entry>
2476e9fcaa8aSmrg  <entry>Meaning</entry>
2477e9fcaa8aSmrg</row>
2478e9fcaa8aSmrg</thead>
2479e9fcaa8aSmrg<tbody>
2480e9fcaa8aSmrg  <row rowsep='0'>
2481e9fcaa8aSmrg    <entry><emphasis>XkbSA_SwitchAbsolute</emphasis></entry>
2482e9fcaa8aSmrg    <entry>
2483e9fcaa8aSmrgIf set, the <emphasis>
2484e9fcaa8aSmrgscreenXXX</emphasis>
2485e9fcaa8aSmrg field represents the index of the new screen. Otherwise, it represents an
2486e9fcaa8aSmrgoffset from the current screen to the new screen.
2487e9fcaa8aSmrg    </entry>
2488e9fcaa8aSmrg  </row>
2489e9fcaa8aSmrg  <row rowsep='0'>
2490e9fcaa8aSmrg    <entry><emphasis>XkbSA_SwitchApplication</emphasis></entry>
2491e9fcaa8aSmrg    <entry>
2492e9fcaa8aSmrgIf not set, the action should switch to another screen on the same
2493e9fcaa8aSmrgserver. Otherwise, it should switch to another X server or application that
2494e9fcaa8aSmrgshares the same physical display.
2495e9fcaa8aSmrg    </entry>
2496e9fcaa8aSmrg  </row>
2497e9fcaa8aSmrg</tbody>
2498e9fcaa8aSmrg</tgroup>
2499e9fcaa8aSmrg</table>
2500e9fcaa8aSmrg
2501e9fcaa8aSmrg<para>
2502e9fcaa8aSmrgThe <emphasis>
2503e9fcaa8aSmrgscreenXXX</emphasis>
2504e9fcaa8aSmrg field is a signed character value that represents either the relative or
2505e9fcaa8aSmrgabsolute screen index, depending on the state of the <emphasis>
2506e9fcaa8aSmrgXkbSA_SwitchAbsolute</emphasis>
2507e9fcaa8aSmrg bit in the <emphasis>
2508e9fcaa8aSmrgflags</emphasis>
2509e9fcaa8aSmrg field. Xkb provides the following macros to convert between the integer and
2510e9fcaa8aSmrgsigned character value for screen numbers in <emphasis>
2511e9fcaa8aSmrgXkbSwitchScreenAction</emphasis>
2512e9fcaa8aSmrg structures:
2513e9fcaa8aSmrg</para>
2514e9fcaa8aSmrg
2515e9fcaa8aSmrg<informaltable frame='none'>
2516e9fcaa8aSmrg<tgroup cols='1'>
2517e9fcaa8aSmrg<colspec colsep='0'/>
2518e9fcaa8aSmrg<tbody>
2519e9fcaa8aSmrg  <row rowsep='0'>
2520e9fcaa8aSmrg    <entry role='functiondecl'>
2521e9fcaa8aSmrgint <emphasis>
2522e9fcaa8aSmrgXkbSAScreen</emphasis>
2523e9fcaa8aSmrg(<emphasis>
2524e9fcaa8aSmrgact</emphasis>
2525e9fcaa8aSmrg)                        /* macro */
2526e9fcaa8aSmrg    </entry>
2527e9fcaa8aSmrg  </row>
2528e9fcaa8aSmrg  <row rowsep='0'>
2529e9fcaa8aSmrg    <entry role='functionargdecl'>
2530e9fcaa8aSmrgXkbSwitchScreenAction                  <emphasis>
2531e9fcaa8aSmrgact</emphasis>
2532e9fcaa8aSmrg;      /* action from which to extract screen */
2533e9fcaa8aSmrg    </entry>
2534e9fcaa8aSmrg</row>
2535e9fcaa8aSmrg</tbody>
2536e9fcaa8aSmrg</tgroup>
2537e9fcaa8aSmrg</informaltable>
2538e9fcaa8aSmrg
2539e9fcaa8aSmrg<para>
2540e9fcaa8aSmrg<emphasis>
2541e9fcaa8aSmrgXkbSAScreen</emphasis>
2542e9fcaa8aSmrg returns the <emphasis>
2543e9fcaa8aSmrgscreenXXX</emphasis>
2544e9fcaa8aSmrg field of <emphasis>
2545e9fcaa8aSmrgact</emphasis>
2546e9fcaa8aSmrg converted to a signed int.
2547e9fcaa8aSmrg</para>
2548e9fcaa8aSmrg
2549e9fcaa8aSmrg
2550e9fcaa8aSmrg<informaltable frame='none'>
2551e9fcaa8aSmrg<tgroup cols='1'>
2552e9fcaa8aSmrg<colspec colsep='0'/>
2553e9fcaa8aSmrg<tbody>
2554e9fcaa8aSmrg  <row rowsep='0'>
2555e9fcaa8aSmrg    <entry role='functiondecl'>
2556e9fcaa8aSmrgvoid <emphasis>
2557e9fcaa8aSmrgXkbSASetScreen</emphasis>
2558e9fcaa8aSmrg(<emphasis>
2559e9fcaa8aSmrgact, s</emphasis>
2560e9fcaa8aSmrg)                        /* macro */
2561e9fcaa8aSmrg    </entry>
2562e9fcaa8aSmrg  </row>
2563e9fcaa8aSmrg  <row rowsep='0'>
2564e9fcaa8aSmrg    <entry role='functionargdecl'>
2565e9fcaa8aSmrgXkbSwitchScreenAction                  <emphasis>
2566e9fcaa8aSmrgact</emphasis>
2567e9fcaa8aSmrg;      /* action in which to set <emphasis>
2568e9fcaa8aSmrgscreenXXX</emphasis>
2569e9fcaa8aSmrg */
2570e9fcaa8aSmrg    </entry>
2571e9fcaa8aSmrg  </row>
2572e9fcaa8aSmrg  <row rowsep='0'>
2573e9fcaa8aSmrg    <entry role='functionargdecl'>
2574e9fcaa8aSmrgint                  <emphasis>
2575e9fcaa8aSmrgs</emphasis>
2576e9fcaa8aSmrg;      /* value to set in <emphasis>
2577e9fcaa8aSmrgscreenXXX</emphasis>
2578e9fcaa8aSmrg */
2579e9fcaa8aSmrg    </entry>
2580e9fcaa8aSmrg</row>
2581e9fcaa8aSmrg</tbody>
2582e9fcaa8aSmrg</tgroup>
2583e9fcaa8aSmrg</informaltable>
2584e9fcaa8aSmrg
2585e9fcaa8aSmrg<para>
2586e9fcaa8aSmrg<emphasis>
2587e9fcaa8aSmrgXkbSASetScreen</emphasis>
2588e9fcaa8aSmrg sets the <emphasis>
2589e9fcaa8aSmrgscreenXXX</emphasis>
2590e9fcaa8aSmrg field of <emphasis>
2591e9fcaa8aSmrgact</emphasis>
2592e9fcaa8aSmrg from <emphasis>
2593e9fcaa8aSmrgs</emphasis>
2594e9fcaa8aSmrg.
2595e9fcaa8aSmrg</para>
2596e9fcaa8aSmrg
2597e9fcaa8aSmrg
2598e9fcaa8aSmrg</sect2>
2599e9fcaa8aSmrg<sect2 id='actions_for_changing_boolean_controls_state'>
2600e9fcaa8aSmrg<title>Actions for Changing Boolean Controls State</title>
2601e9fcaa8aSmrg
2602e9fcaa8aSmrg<para>
2603e9fcaa8aSmrgActions associated with the <emphasis>
2604e9fcaa8aSmrgXkbCtrlsAction</emphasis>
2605e9fcaa8aSmrg structure change the state of the boolean controls (see section 10.1):
2606e9fcaa8aSmrg</para>
2607e9fcaa8aSmrg
2608e9fcaa8aSmrg<para><programlisting>
2609e9fcaa8aSmrgtypedef struct _XkbCtrlsAction {
2610e9fcaa8aSmrg      unsigned char     type;        /* <emphasis> XkbSA_SetControls,
2611e9fcaa8aSmrg                                        XkbSA_LockControls</emphasis> */
2612e9fcaa8aSmrg      unsigned char     flags;       /* with <emphasis> type</emphasis>,
2613e9fcaa8aSmrg                                        controls enabling and disabling of controls */
2614e9fcaa8aSmrg      unsigned char     ctrls3;      /* <emphasis>ctrls0</emphasis> through
2615e9fcaa8aSmrg                                        <emphasis> ctrls3</emphasis> represent the boolean controls */
2616e9fcaa8aSmrg      unsigned char     ctrls2;      /* <emphasis>ctrls0</emphasis> through
2617e9fcaa8aSmrg                                        <emphasis> ctrls3</emphasis> represent the boolean controls */
2618e9fcaa8aSmrg      unsigned char     ctrls1;      /* <emphasis>ctrls0</emphasis> through
2619e9fcaa8aSmrg                                        <emphasis> ctrls3</emphasis> represent the boolean controls */
2620e9fcaa8aSmrg      unsigned char     ctrls0;      /* <emphasis>ctrls0</emphasis> through
2621e9fcaa8aSmrg                                        <emphasis> ctrls3</emphasis> represent the boolean controls */
2622e9fcaa8aSmrg} <emphasis>XkbCtrlsAction</emphasis>;
2623e9fcaa8aSmrg</programlisting></para>
2624e9fcaa8aSmrg
2625e9fcaa8aSmrg<para>
2626e9fcaa8aSmrgThe <emphasis>
2627e9fcaa8aSmrgtype</emphasis>
2628e9fcaa8aSmrg field can have any one of the values shown in Table 16.14.
2629e9fcaa8aSmrg</para>
2630e9fcaa8aSmrg
2631e9fcaa8aSmrg<table frame='none'>
2632e9fcaa8aSmrg<title>Controls Action Types</title>
2633e9fcaa8aSmrg<tgroup cols='2'>
2634e9fcaa8aSmrg<colspec colsep='0'/>
2635e9fcaa8aSmrg<colspec colsep='0'/>
2636e9fcaa8aSmrg<thead>
2637e9fcaa8aSmrg<row rowsep='0'>
2638e9fcaa8aSmrg  <entry>Type</entry>
2639e9fcaa8aSmrg  <entry>Effect</entry>
2640e9fcaa8aSmrg</row>
2641e9fcaa8aSmrg</thead>
2642e9fcaa8aSmrg<tbody>
2643e9fcaa8aSmrg  <row rowsep='0'>
2644e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetControls</emphasis></entry>
2645e9fcaa8aSmrg    <entry>
2646e9fcaa8aSmrg<itemizedlist>
2647e9fcaa8aSmrg  <listitem>
2648e9fcaa8aSmrg    <para>
2649e9fcaa8aSmrgA key press enables any boolean controls specified in the <emphasis>
2650e9fcaa8aSmrgctrls</emphasis>
2651e9fcaa8aSmrg fields that were not already enabled at the time of the key press.
2652e9fcaa8aSmrg    </para>
2653e9fcaa8aSmrg  </listitem>
2654e9fcaa8aSmrg  <listitem>
2655e9fcaa8aSmrg    <para>
2656e9fcaa8aSmrgA key release disables any controls enabled by the key press.
2657e9fcaa8aSmrg    </para>
2658e9fcaa8aSmrg  </listitem>
2659e9fcaa8aSmrg  <listitem>
2660e9fcaa8aSmrg    <para>
2661e9fcaa8aSmrgThis action can cause <emphasis>
2662e9fcaa8aSmrgXkbControlsNotify</emphasis>
2663e9fcaa8aSmrg events (see section 10.1).
2664e9fcaa8aSmrg    </para>
2665e9fcaa8aSmrg  </listitem>
2666e9fcaa8aSmrg</itemizedlist>
2667e9fcaa8aSmrg    </entry>
2668e9fcaa8aSmrg  </row>
2669e9fcaa8aSmrg  <row rowsep='0'>
2670e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockControls</emphasis></entry>
2671e9fcaa8aSmrg    <entry>
2672e9fcaa8aSmrg<itemizedlist>
2673e9fcaa8aSmrg  <listitem>
2674e9fcaa8aSmrg    <para>
2675e9fcaa8aSmrgIf the <emphasis>
2676e9fcaa8aSmrgXkbSA_LockNoLock</emphasis>
2677e9fcaa8aSmrg bit is not set in the <emphasis>
2678e9fcaa8aSmrgflags</emphasis>
2679e9fcaa8aSmrg field, a key press enables any controls specified in the <emphasis>
2680e9fcaa8aSmrgctrls</emphasis>
2681e9fcaa8aSmrg fields that were not already enabled at the time of the key press.
2682e9fcaa8aSmrg    </para>
2683e9fcaa8aSmrg  </listitem>
2684e9fcaa8aSmrg  <listitem>
2685e9fcaa8aSmrg    <para>
2686e9fcaa8aSmrgIf the <emphasis>
2687e9fcaa8aSmrgXkbSA_LockNoUnlock</emphasis>
2688e9fcaa8aSmrg bit is not set in the <emphasis>
2689e9fcaa8aSmrgflags</emphasis>
2690e9fcaa8aSmrg field, a key release disables any controls specified in the <emphasis>
2691e9fcaa8aSmrgctrls</emphasis>
2692e9fcaa8aSmrg fields that were not already disabled at the time of the key press.
2693e9fcaa8aSmrg    </para>
2694e9fcaa8aSmrg  </listitem>
2695e9fcaa8aSmrg  <listitem>
2696e9fcaa8aSmrg    <para>
2697e9fcaa8aSmrgThis action can cause <emphasis>
2698e9fcaa8aSmrgXkbControlsNotify</emphasis>
2699e9fcaa8aSmrg events (see section 10.1).
2700e9fcaa8aSmrg    </para>
2701e9fcaa8aSmrg  </listitem>
2702e9fcaa8aSmrg</itemizedlist>
2703e9fcaa8aSmrg    </entry>
2704e9fcaa8aSmrg  </row>
2705e9fcaa8aSmrg</tbody>
2706e9fcaa8aSmrg</tgroup>
2707e9fcaa8aSmrg</table>
2708e9fcaa8aSmrg
2709e9fcaa8aSmrg<para>
2710e9fcaa8aSmrgThe <emphasis>
2711e9fcaa8aSmrgflags</emphasis>
2712e9fcaa8aSmrg field is composed of the bitwise inclusive OR of the masks shown in Table
2713e9fcaa8aSmrg16.15.
2714e9fcaa8aSmrg</para>
2715e9fcaa8aSmrg
2716e9fcaa8aSmrg<table frame='none'>
2717e9fcaa8aSmrg<title>Control Action Flags</title>
2718e9fcaa8aSmrg<tgroup cols='2'>
2719e9fcaa8aSmrg<colspec colsep='0'/>
2720e9fcaa8aSmrg<colspec colsep='0'/>
2721e9fcaa8aSmrg<thead>
2722e9fcaa8aSmrg<row rowsep='0'>
2723e9fcaa8aSmrg  <entry>Flag</entry>
2724e9fcaa8aSmrg  <entry>Meaning</entry>
2725e9fcaa8aSmrg</row>
2726e9fcaa8aSmrg</thead>
2727e9fcaa8aSmrg<tbody>
2728e9fcaa8aSmrg  <row rowsep='0'>
2729e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
2730e9fcaa8aSmrg    <entry>
2731e9fcaa8aSmrgIf set, and the action type is <emphasis>
2732e9fcaa8aSmrgXkbSA_LockControls</emphasis>
2733e9fcaa8aSmrg, the server only disables controls.
2734e9fcaa8aSmrg    </entry>
2735e9fcaa8aSmrg  </row>
2736e9fcaa8aSmrg  <row rowsep='0'>
2737e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
2738e9fcaa8aSmrg    <entry>
2739e9fcaa8aSmrgIf set, and the action type is <emphasis>
2740e9fcaa8aSmrgXkbSA_LockControls</emphasis>
2741e9fcaa8aSmrg, the server only enables controls.
2742e9fcaa8aSmrg    </entry>
2743e9fcaa8aSmrg  </row>
2744e9fcaa8aSmrg</tbody>
2745e9fcaa8aSmrg</tgroup>
2746e9fcaa8aSmrg</table>
2747e9fcaa8aSmrg
2748e9fcaa8aSmrg<para>
2749e9fcaa8aSmrgThe <emphasis>
2750e9fcaa8aSmrgXkbSA_SetControls</emphasis>
2751e9fcaa8aSmrg action implements a key that enables a boolean control when pressed and
2752e9fcaa8aSmrgdisables it when released. The <emphasis>
2753e9fcaa8aSmrgXkbSA_LockControls</emphasis>
2754e9fcaa8aSmrg action is used to implement a key that toggles the state of a boolean control
2755e9fcaa8aSmrgeach time it is pressed and released. The <emphasis>
2756e9fcaa8aSmrgXkbSA_LockNoLock</emphasis>
2757e9fcaa8aSmrg and <emphasis>
2758e9fcaa8aSmrgXkbSA_LockNoUnlock</emphasis>
2759e9fcaa8aSmrg flags allow modifying the toggling behavior to only unlock or only lock the
2760e9fcaa8aSmrgboolean control.
2761e9fcaa8aSmrg</para>
2762e9fcaa8aSmrg
2763e9fcaa8aSmrg
2764e9fcaa8aSmrg<para>
2765e9fcaa8aSmrgThe <emphasis>
2766e9fcaa8aSmrgctrls0</emphasis>
2767e9fcaa8aSmrg, <emphasis>
2768e9fcaa8aSmrgctrls1</emphasis>
2769e9fcaa8aSmrg, <emphasis>
2770e9fcaa8aSmrgctrls2</emphasis>
2771e9fcaa8aSmrg, and <emphasis>
2772e9fcaa8aSmrgctrls3</emphasis>
2773e9fcaa8aSmrg fields represent the boolean controls in the <emphasis>
2774e9fcaa8aSmrgenabled_ctrls</emphasis>
2775e9fcaa8aSmrg field of the controls structure (see section 10.1). Xkb provides the following
2776e9fcaa8aSmrgmacros, to convert between the two formats:
2777e9fcaa8aSmrg</para>
2778e9fcaa8aSmrg
2779e9fcaa8aSmrg<informaltable frame='none'>
2780e9fcaa8aSmrg<tgroup cols='1'>
2781e9fcaa8aSmrg<colspec colsep='0'/>
2782e9fcaa8aSmrg<tbody>
2783e9fcaa8aSmrg  <row rowsep='0'>
2784e9fcaa8aSmrg    <entry role='functiondecl'>
2785e9fcaa8aSmrgunsigned int <emphasis>
2786e9fcaa8aSmrgXkbActionCtrls</emphasis>
2787e9fcaa8aSmrg(<emphasis>
2788e9fcaa8aSmrgact</emphasis>
2789e9fcaa8aSmrg)                        /* macro */
2790e9fcaa8aSmrg    </entry>
2791e9fcaa8aSmrg  </row>
2792e9fcaa8aSmrg  <row rowsep='0'>
2793e9fcaa8aSmrg    <entry role='functionargdecl'>
2794e9fcaa8aSmrgXkbCtrlsAction            <emphasis>
2795e9fcaa8aSmrgact</emphasis>
2796e9fcaa8aSmrg;            /* action from which to extract controls */
2797e9fcaa8aSmrg    </entry>
2798e9fcaa8aSmrg</row>
2799e9fcaa8aSmrg</tbody>
2800e9fcaa8aSmrg</tgroup>
2801e9fcaa8aSmrg</informaltable>
2802e9fcaa8aSmrg
2803e9fcaa8aSmrg<para>
2804e9fcaa8aSmrg<emphasis>
2805e9fcaa8aSmrgXkbActionCtrls</emphasis>
2806e9fcaa8aSmrg returns the <emphasis>
2807e9fcaa8aSmrgctrls</emphasis>
2808e9fcaa8aSmrg fields of <emphasis>
2809e9fcaa8aSmrgact</emphasis>
2810e9fcaa8aSmrg converted to an unsigned int.
2811e9fcaa8aSmrg</para>
2812e9fcaa8aSmrg
2813e9fcaa8aSmrg
2814e9fcaa8aSmrg<informaltable frame='none'>
2815e9fcaa8aSmrg<tgroup cols='1'>
2816e9fcaa8aSmrg<colspec colsep='0'/>
2817e9fcaa8aSmrg<tbody>
2818e9fcaa8aSmrg  <row rowsep='0'>
2819e9fcaa8aSmrg    <entry role='functiondecl'>
2820e9fcaa8aSmrgvoid <emphasis>
2821e9fcaa8aSmrgXkbSAActionSetCtrls</emphasis>
2822e9fcaa8aSmrg(<emphasis>
2823e9fcaa8aSmrgact, ctrls</emphasis>
2824e9fcaa8aSmrg)                        /* macro */
2825e9fcaa8aSmrg    </entry>
2826e9fcaa8aSmrg  </row>
2827e9fcaa8aSmrg  <row rowsep='0'>
2828e9fcaa8aSmrg    <entry role='functionargdecl'>
2829e9fcaa8aSmrgXkbCtrlsAction                  <emphasis>
2830e9fcaa8aSmrgact</emphasis>
2831e9fcaa8aSmrg;      /* action in which to set ctrls0-ctrls3 */
2832e9fcaa8aSmrg    </entry>
2833e9fcaa8aSmrg  </row>
2834e9fcaa8aSmrg  <row rowsep='0'>
2835e9fcaa8aSmrg    <entry role='functionargdecl'>
2836e9fcaa8aSmrgunsigned int                  <emphasis>
2837e9fcaa8aSmrgctrls</emphasis>
2838e9fcaa8aSmrg;      /* value to set in ctrls0-ctrls3 */
2839e9fcaa8aSmrg    </entry>
2840e9fcaa8aSmrg</row>
2841e9fcaa8aSmrg</tbody>
2842e9fcaa8aSmrg</tgroup>
2843e9fcaa8aSmrg</informaltable>
2844e9fcaa8aSmrg
2845e9fcaa8aSmrg<para>
2846e9fcaa8aSmrg<emphasis>
2847e9fcaa8aSmrgXkbSAActionSetCtrls</emphasis>
2848e9fcaa8aSmrg sets the <emphasis>
2849e9fcaa8aSmrgctrls0</emphasis>
2850e9fcaa8aSmrg through <emphasis>
2851e9fcaa8aSmrgctrls3</emphasis>
2852e9fcaa8aSmrg fields of <emphasis>
2853e9fcaa8aSmrgact</emphasis>
2854e9fcaa8aSmrg from <emphasis>
2855e9fcaa8aSmrgctrls</emphasis>
2856e9fcaa8aSmrg.
2857e9fcaa8aSmrg</para>
2858e9fcaa8aSmrg
2859e9fcaa8aSmrg
2860e9fcaa8aSmrg</sect2>
2861e9fcaa8aSmrg<sect2 id='actions_for_generating_messages'>
2862e9fcaa8aSmrg<title>Actions for Generating Messages</title>
2863e9fcaa8aSmrg
2864e9fcaa8aSmrg<para>
2865e9fcaa8aSmrgActions associated with the <emphasis>
2866e9fcaa8aSmrgXkbMessageAction</emphasis>
2867e9fcaa8aSmrg structure generate <emphasis>
2868e9fcaa8aSmrgXkbActionMessage</emphasis>
2869e9fcaa8aSmrg events:
2870e9fcaa8aSmrg</para>
2871e9fcaa8aSmrg
2872e9fcaa8aSmrg<para><programlisting>
2873e9fcaa8aSmrg#define            XkbActionMessageLength                  6
2874e9fcaa8aSmrg</programlisting></para>
2875e9fcaa8aSmrg<para><programlisting>
2876e9fcaa8aSmrgtypedef struct _XkbMessageAction {
2877e9fcaa8aSmrg      unsigned char   type;             /* <emphasis> XkbSA_ActionMessage</emphasis> */
2878e9fcaa8aSmrg      unsigned char   flags;            /* controls event generation via key presses and releases */
2879e9fcaa8aSmrg      unsigned char   message[XkbActionMessageLength];    /* message */
2880e9fcaa8aSmrg} <emphasis>XkbMessageAction</emphasis>;
2881e9fcaa8aSmrg</programlisting></para>
2882e9fcaa8aSmrg
2883e9fcaa8aSmrg<para>
2884e9fcaa8aSmrgThe <emphasis>
2885e9fcaa8aSmrgtype</emphasis>
2886e9fcaa8aSmrg field of the <emphasis>
2887e9fcaa8aSmrgXkbMessageAction</emphasis>
2888e9fcaa8aSmrg structure should always be <emphasis>
2889e9fcaa8aSmrgXkbSA_ActionMessage</emphasis>
2890e9fcaa8aSmrg.
2891e9fcaa8aSmrg</para>
2892e9fcaa8aSmrg
2893e9fcaa8aSmrg
2894e9fcaa8aSmrg<para>
2895e9fcaa8aSmrgThe <emphasis>
2896e9fcaa8aSmrgflags</emphasis>
2897e9fcaa8aSmrg field is composed of the bitwise inclusive OR of the masks shown in Table
2898e9fcaa8aSmrg16.16.
2899e9fcaa8aSmrg</para>
2900e9fcaa8aSmrg
2901e9fcaa8aSmrg<table frame='none'>
2902e9fcaa8aSmrg<title>Message Action Flags</title>
2903e9fcaa8aSmrg<tgroup cols='2'>
2904e9fcaa8aSmrg<colspec colsep='0'/>
2905e9fcaa8aSmrg<colspec colsep='0'/>
2906e9fcaa8aSmrg<thead>
2907e9fcaa8aSmrg<row rowsep='0'>
2908e9fcaa8aSmrg  <entry>Flag</entry>
2909e9fcaa8aSmrg  <entry>Meaning</entry>
2910e9fcaa8aSmrg</row>
2911e9fcaa8aSmrg</thead>
2912e9fcaa8aSmrg<tbody>
2913e9fcaa8aSmrg  <row rowsep='0'>
2914e9fcaa8aSmrg    <entry><emphasis>XkbSA_MessageOnPress</emphasis></entry>
2915e9fcaa8aSmrg    <entry>
2916e9fcaa8aSmrgIf set, key press events generate an <emphasis>
2917e9fcaa8aSmrgXkbActionMessage</emphasis>
2918e9fcaa8aSmrg event that reports the keycode, event type, and contents of the <emphasis>
2919e9fcaa8aSmrgmessage</emphasis>
2920e9fcaa8aSmrg field.
2921e9fcaa8aSmrg    </entry>
2922e9fcaa8aSmrg  </row>
2923e9fcaa8aSmrg  <row rowsep='0'>
2924e9fcaa8aSmrg    <entry><emphasis>XkbSA_MessageOnRelease</emphasis></entry>
2925e9fcaa8aSmrg    <entry>
2926e9fcaa8aSmrgIf set, key release events generate an <emphasis>
2927e9fcaa8aSmrgXkbActionMessage</emphasis>
2928e9fcaa8aSmrg event that reports the keycode, event type, and contents of the <emphasis>
2929e9fcaa8aSmrgmessage</emphasis>
2930e9fcaa8aSmrg field.
2931e9fcaa8aSmrg    </entry>
2932e9fcaa8aSmrg  </row>
2933e9fcaa8aSmrg  <row rowsep='0'>
2934e9fcaa8aSmrg    <entry><emphasis>XkbSA_MessageGenKeyEvent</emphasis></entry>
2935e9fcaa8aSmrg    <entry>
2936e9fcaa8aSmrgIf set, key press and key release events generate <emphasis>
2937e9fcaa8aSmrgKeyPress</emphasis>
2938e9fcaa8aSmrg and <emphasis>
2939e9fcaa8aSmrgKeyRelease</emphasis>
2940e9fcaa8aSmrg events, regardless of whether they generate <emphasis>
2941e9fcaa8aSmrgXkbActionMessage</emphasis>
2942e9fcaa8aSmrg events.
2943e9fcaa8aSmrg    </entry>
2944e9fcaa8aSmrg  </row>
2945e9fcaa8aSmrg</tbody>
2946e9fcaa8aSmrg</tgroup>
2947e9fcaa8aSmrg</table>
2948e9fcaa8aSmrg
2949e9fcaa8aSmrg<para>
2950e9fcaa8aSmrgThe <emphasis>
2951e9fcaa8aSmrgmessage</emphasis>
2952e9fcaa8aSmrg field is an array of <emphasis>
2953e9fcaa8aSmrgXkbActionMessageLength</emphasis>
2954e9fcaa8aSmrg unsigned characters and may be set to anything the keymap designer wishes.
2955e9fcaa8aSmrg</para>
2956e9fcaa8aSmrg
2957e9fcaa8aSmrg<sect3 id='detecting_key_action_messages'>
2958e9fcaa8aSmrg<title>Detecting Key Action Messages</title>
2959e9fcaa8aSmrg
2960e9fcaa8aSmrg<para>
2961e9fcaa8aSmrgTo receive <emphasis>
2962e9fcaa8aSmrgXkbActionMessage</emphasis>
2963e9fcaa8aSmrg events by calling either <emphasis>
2964e9fcaa8aSmrgXkbSelectEvents</emphasis>
2965e9fcaa8aSmrg or <emphasis>
2966e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
2967e9fcaa8aSmrg (see section 4.3).
2968e9fcaa8aSmrg</para>
2969e9fcaa8aSmrg
2970e9fcaa8aSmrg
2971e9fcaa8aSmrg<para>
2972e9fcaa8aSmrgTo receive <emphasis>
2973e9fcaa8aSmrgXkbActionMessage</emphasis>
2974e9fcaa8aSmrg events under all possible conditions, use <emphasis>
2975e9fcaa8aSmrgXkbSelectEvents</emphasis>
2976e9fcaa8aSmrg and pass <emphasis>
2977e9fcaa8aSmrgXkbActionMessageMask</emphasis>
2978e9fcaa8aSmrg in both <emphasis>
2979e9fcaa8aSmrgbits_to_change</emphasis>
2980e9fcaa8aSmrg and <emphasis>
2981e9fcaa8aSmrgvalues_for_bits</emphasis>
2982e9fcaa8aSmrg.
2983e9fcaa8aSmrg</para>
2984e9fcaa8aSmrg
2985e9fcaa8aSmrg
2986e9fcaa8aSmrg<para>
2987e9fcaa8aSmrgThe <emphasis>
2988e9fcaa8aSmrgXkbActionMessage</emphasis>
2989e9fcaa8aSmrg event has no event details. However, you can call <emphasis>
2990e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
2991e9fcaa8aSmrg using <emphasis>
2992e9fcaa8aSmrgXkbActionMessage</emphasis>
2993e9fcaa8aSmrg as the <emphasis>
2994e9fcaa8aSmrgevent_type</emphasis>
2995e9fcaa8aSmrg and specifying <emphasis>
2996e9fcaa8aSmrgXkbAllActionMessageMask</emphasis>
2997e9fcaa8aSmrg in <emphasis>
2998e9fcaa8aSmrgbits_to_change</emphasis>
2999e9fcaa8aSmrg and <emphasis>
3000e9fcaa8aSmrgvalues_for_bits.</emphasis>
3001e9fcaa8aSmrg This has the same effect as a call to <emphasis>
3002e9fcaa8aSmrgXkbSelectEvents</emphasis>.
3003e9fcaa8aSmrg</para>
3004e9fcaa8aSmrg
3005e9fcaa8aSmrg
3006e9fcaa8aSmrg<para>
3007e9fcaa8aSmrgThe structure for the <emphasis>
3008e9fcaa8aSmrgXkbActionMessage</emphasis>
3009e9fcaa8aSmrg event is defined as follows:
3010e9fcaa8aSmrg</para>
3011e9fcaa8aSmrg
3012e9fcaa8aSmrg<para><programlisting>
3013e9fcaa8aSmrgtypedef struct _XkbActionMessage {
3014e9fcaa8aSmrg      int            type;            /* Xkb extension base event code */
3015e9fcaa8aSmrg      unsigned long  serial;          /* X server serial number for event */
3016e9fcaa8aSmrg      Bool           send_event;      /* <emphasis>True</emphasis> =&gt; synthetically generated */
3017e9fcaa8aSmrg      Display *      display;         /* server connection where event generated */
3018e9fcaa8aSmrg      Time           time;            /* server time when event generated */
3019e9fcaa8aSmrg      int            xkb_type;        /* <emphasis>XkbActionMessage</emphasis> */
3020e9fcaa8aSmrg      int            device;          /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
3021e9fcaa8aSmrg      KeyCode        keycode;         /* keycode of key triggering event */
3022e9fcaa8aSmrg      Bool           press;           /* <emphasis>True</emphasis> =&gt; key press,
3023e9fcaa8aSmrg                                         <emphasis>False</emphasis> =&gt; release */
3024e9fcaa8aSmrg      Bool           key_event_follows; /* <emphasis>True</emphasis> =&gt; KeyPress/KeyRelease follows */
3025e9fcaa8aSmrg      char           message[XkbActionMessageLength+1];                       /* message text */
3026e9fcaa8aSmrg} <emphasis>XkbActionMessageEvent</emphasis>;
3027e9fcaa8aSmrg</programlisting></para>
3028e9fcaa8aSmrg
3029e9fcaa8aSmrg<para>
3030e9fcaa8aSmrgThe <emphasis>
3031e9fcaa8aSmrgkeycode</emphasis>
3032e9fcaa8aSmrg is the keycode of the key that was pressed or released. The <emphasis>
3033e9fcaa8aSmrgpress</emphasis>
3034e9fcaa8aSmrg field specifies whether the event was the result of a key press or key
3035e9fcaa8aSmrgrelease.
3036e9fcaa8aSmrg</para>
3037e9fcaa8aSmrg
3038e9fcaa8aSmrg
3039e9fcaa8aSmrg<para>
3040e9fcaa8aSmrgThe <emphasis>
3041e9fcaa8aSmrgkey_event_follows</emphasis>
3042e9fcaa8aSmrg specifies whether a <emphasis>
3043e9fcaa8aSmrgKeyPress</emphasis>
3044e9fcaa8aSmrg (if <emphasis>
3045e9fcaa8aSmrgpress</emphasis>
3046e9fcaa8aSmrg is <emphasis>
3047e9fcaa8aSmrgTrue</emphasis>
3048e9fcaa8aSmrg) or <emphasis>
3049e9fcaa8aSmrgKeyRelease</emphasis>
3050e9fcaa8aSmrg (if <emphasis>
3051e9fcaa8aSmrgpress</emphasis>
3052e9fcaa8aSmrg is <emphasis>
3053e9fcaa8aSmrgFalse</emphasis>
3054e9fcaa8aSmrg) event is also sent to the client. As with all other Xkb events, <emphasis>
3055e9fcaa8aSmrgXkbActionMessageEvent</emphasis>
3056e9fcaa8aSmrgs are delivered to all clients requesting them, regardless of the current
3057e9fcaa8aSmrgkeyboard focus. However, the <emphasis>
3058e9fcaa8aSmrgKeyPress</emphasis>
3059e9fcaa8aSmrg or <emphasis>
3060e9fcaa8aSmrgKeyRelease</emphasis>
3061e9fcaa8aSmrg event that conditionally follows an <emphasis>
3062e9fcaa8aSmrgXkbActionMessageEvent</emphasis>
3063e9fcaa8aSmrg is sent only to the client selected by the current keyboard focus. <emphasis>
3064e9fcaa8aSmrgkey_event_follows</emphasis>
3065e9fcaa8aSmrg is <emphasis>
3066e9fcaa8aSmrgTrue</emphasis>
3067e9fcaa8aSmrg only for the client that is actually sent the following <emphasis>
3068e9fcaa8aSmrgKeyPress</emphasis>
3069e9fcaa8aSmrg or <emphasis>
3070e9fcaa8aSmrgKeyRelease</emphasis>
3071e9fcaa8aSmrg event.
3072e9fcaa8aSmrg</para>
3073e9fcaa8aSmrg
3074e9fcaa8aSmrg
3075e9fcaa8aSmrg<para>
3076e9fcaa8aSmrgThe <emphasis>
3077e9fcaa8aSmrgmessage</emphasis>
3078e9fcaa8aSmrg field is set to the message specified in the action and is guaranteed to be
3079e9fcaa8aSmrg<emphasis>
3080e9fcaa8aSmrgNULL</emphasis>
3081e9fcaa8aSmrg-terminated; the Xkb extension forces a <emphasis>
3082e9fcaa8aSmrgNULL</emphasis>
3083e9fcaa8aSmrg into <emphasis>
3084e9fcaa8aSmrgmessage</emphasis>
3085e9fcaa8aSmrg[<emphasis>
3086e9fcaa8aSmrgXkbActionMessageLength</emphasis>
3087e9fcaa8aSmrg].
3088e9fcaa8aSmrg</para>
3089e9fcaa8aSmrg
3090e9fcaa8aSmrg
3091e9fcaa8aSmrg</sect3>
3092e9fcaa8aSmrg</sect2>
3093e9fcaa8aSmrg<sect2 id='actions_for_generating_a_different_keycode'>
3094e9fcaa8aSmrg<title>Actions for Generating a Different Keycode</title>
3095e9fcaa8aSmrg
3096e9fcaa8aSmrg<para>
3097e9fcaa8aSmrgActions associated with the <emphasis>
3098e9fcaa8aSmrgXkbRedirectKeyAction</emphasis>
3099e9fcaa8aSmrg structure generate <emphasis>
3100e9fcaa8aSmrgKeyPress</emphasis>
3101e9fcaa8aSmrg and <emphasis>
3102e9fcaa8aSmrgKeyRelease</emphasis>
3103e9fcaa8aSmrg events containing a keycode different from the key that was pressed or
3104e9fcaa8aSmrgreleased:
3105e9fcaa8aSmrg</para>
3106e9fcaa8aSmrg
3107e9fcaa8aSmrg<para><programlisting>
3108e9fcaa8aSmrgtypedef struct      _XkbRedirectKeyAction {
3109e9fcaa8aSmrg      unsigned char      type;          /* <emphasis> XkbSA_RedirectKey</emphasis> */
3110e9fcaa8aSmrg      unsigned char      new_key;       /* keycode to be put in event */
3111e9fcaa8aSmrg      unsigned char      mods_mask;     /* mask of real mods to be reset */
3112e9fcaa8aSmrg      unsigned char      mods;          /* mask of real mods to take values from */
3113e9fcaa8aSmrg      unsigned char      vmods_mask0;   /* first half of mask of virtual mods to be reset */
3114e9fcaa8aSmrg      unsigned char      vmods_mask1;   /* other half of mask of virtual mods to be reset */
3115e9fcaa8aSmrg      unsigned char      vmods0;        /* first half of mask of virtual mods to take values from */
3116e9fcaa8aSmrg      unsigned char      vmods1;        /* other half of mask of virtual mods to take values from */
3117e9fcaa8aSmrg} <emphasis>XkbRedirectKeyAction</emphasis>;
3118e9fcaa8aSmrg</programlisting></para>
3119e9fcaa8aSmrg
3120e9fcaa8aSmrg<para>
3121e9fcaa8aSmrgThe <emphasis>
3122e9fcaa8aSmrgtype</emphasis>
3123e9fcaa8aSmrg field for the <emphasis>
3124e9fcaa8aSmrgXkbRedirectKeyAction</emphasis>
3125e9fcaa8aSmrg structure should always be <emphasis>
3126e9fcaa8aSmrgXkbSA_RedirectKey</emphasis>
3127e9fcaa8aSmrg.
3128e9fcaa8aSmrg</para>
3129e9fcaa8aSmrg
3130e9fcaa8aSmrg
3131e9fcaa8aSmrg<para>
3132e9fcaa8aSmrgKey presses cause a <emphasis>
3133e9fcaa8aSmrgKeyPress</emphasis>
3134e9fcaa8aSmrg event for the key specified by the <emphasis>
3135e9fcaa8aSmrgnew_key</emphasis>
3136e9fcaa8aSmrg field instead of the actual key. The state reported in this event reports the
3137e9fcaa8aSmrgcurrent effective modifiers changed as follows: any real modifiers selected by
3138e9fcaa8aSmrgthe <emphasis>
3139e9fcaa8aSmrgmods_mask</emphasis>
3140e9fcaa8aSmrg field are set to corresponding values from the <emphasis>
3141e9fcaa8aSmrgmods</emphasis>
3142e9fcaa8aSmrg field. Any real modifiers bound to the virtual modifiers specified by the
3143e9fcaa8aSmrg<emphasis>
3144e9fcaa8aSmrgvmods_mask0</emphasis>
3145e9fcaa8aSmrg and <emphasis>
3146e9fcaa8aSmrgvmods_mask1</emphasis>
3147e9fcaa8aSmrg fields are either set or cleared, depending on the corresponding values in the
3148e9fcaa8aSmrg<emphasis>
3149e9fcaa8aSmrgvmods0</emphasis>
3150e9fcaa8aSmrg and <emphasis>
3151e9fcaa8aSmrgvmods1</emphasis>
3152e9fcaa8aSmrg fields. If the real and virtual modifier definitions specify conflicting
3153e9fcaa8aSmrgvalues for a single modifier, the real modifier definition has priority.
3154e9fcaa8aSmrg</para>
3155e9fcaa8aSmrg
3156e9fcaa8aSmrg
3157e9fcaa8aSmrg<para>
3158e9fcaa8aSmrgKey releases cause a <emphasis>
3159e9fcaa8aSmrgKeyRelease</emphasis>
3160e9fcaa8aSmrg event for the key specified by the <emphasis>
3161e9fcaa8aSmrgnew_key</emphasis>
3162e9fcaa8aSmrg field instead of the actual key. The state for this event consists of the
3163e9fcaa8aSmrgeffective keyboard modifiers at the time of the release, changed as described
3164e9fcaa8aSmrgpreviously.
3165e9fcaa8aSmrg</para>
3166e9fcaa8aSmrg
3167e9fcaa8aSmrg
3168e9fcaa8aSmrg<para>
3169e9fcaa8aSmrgThe <emphasis>
3170e9fcaa8aSmrgXkbSA_RedirectKey</emphasis>
3171e9fcaa8aSmrg action normally redirects to another key on the same device as the key that
3172e9fcaa8aSmrgcaused the event, unless that device does not belong to the input extension
3173e9fcaa8aSmrg<emphasis>
3174e9fcaa8aSmrgKeyClass</emphasis>
3175e9fcaa8aSmrg, in which case this action causes an event on the core keyboard device. (The
3176e9fcaa8aSmrginput extension categorizes devices by breaking them into classes. Keyboards,
3177e9fcaa8aSmrgand other input devices with keys, are classified as KeyClass devices by the
3178e9fcaa8aSmrginput extension.)
3179e9fcaa8aSmrg</para>
3180e9fcaa8aSmrg
3181e9fcaa8aSmrg
3182e9fcaa8aSmrg<para>
3183e9fcaa8aSmrgThe <emphasis>
3184e9fcaa8aSmrgvmods_mask0</emphasis>
3185e9fcaa8aSmrg and <emphasis>
3186e9fcaa8aSmrgvmods_mask1</emphasis>
3187e9fcaa8aSmrg fields actually represent one <emphasis>
3188e9fcaa8aSmrgvmods_mask</emphasis>
3189e9fcaa8aSmrg value, as described in Chapter 7. Xkb provides the following macros, to
3190e9fcaa8aSmrgconvert between the two formats:
3191e9fcaa8aSmrg</para>
3192e9fcaa8aSmrg
3193e9fcaa8aSmrg<informaltable frame='none'>
3194e9fcaa8aSmrg<tgroup cols='1'>
3195e9fcaa8aSmrg<colspec colsep='0'/>
3196e9fcaa8aSmrg<tbody>
3197e9fcaa8aSmrg  <row rowsep='0'>
3198e9fcaa8aSmrg    <entry role='functiondecl'>
3199e9fcaa8aSmrgunsigned int <emphasis>
3200e9fcaa8aSmrgXkbSARedirectVModsMask</emphasis>
3201e9fcaa8aSmrg(<emphasis>
3202e9fcaa8aSmrgact</emphasis>
3203e9fcaa8aSmrg)                              /* macro */
3204e9fcaa8aSmrg    </entry>
3205e9fcaa8aSmrg  </row>
3206e9fcaa8aSmrg  <row rowsep='0'>
3207e9fcaa8aSmrg    <entry role='functionargdecl'>
3208e9fcaa8aSmrgXkbRedirectKeyAction                  <emphasis>
3209e9fcaa8aSmrgact</emphasis>
3210e9fcaa8aSmrg;            /* action from which to extract vmods */
3211e9fcaa8aSmrg    </entry>
3212e9fcaa8aSmrg</row>
3213e9fcaa8aSmrg</tbody>
3214e9fcaa8aSmrg</tgroup>
3215e9fcaa8aSmrg</informaltable>
3216e9fcaa8aSmrg
3217e9fcaa8aSmrg<para>
3218e9fcaa8aSmrg<emphasis>
3219e9fcaa8aSmrgXkbSARedirectVModsMask</emphasis>
3220e9fcaa8aSmrg returns the <emphasis>
3221e9fcaa8aSmrgvmods_mask0</emphasis>
3222e9fcaa8aSmrg and <emphasis>
3223e9fcaa8aSmrgvmods_mask1</emphasis>
3224e9fcaa8aSmrg fields of <emphasis>
3225e9fcaa8aSmrgact</emphasis>
3226e9fcaa8aSmrg converted to an unsigned int.
3227e9fcaa8aSmrg</para>
3228e9fcaa8aSmrg
3229e9fcaa8aSmrg
3230e9fcaa8aSmrg<informaltable frame='none'>
3231e9fcaa8aSmrg<tgroup cols='1'>
3232e9fcaa8aSmrg<colspec colsep='0'/>
3233e9fcaa8aSmrg<tbody>
3234e9fcaa8aSmrg  <row rowsep='0'>
3235e9fcaa8aSmrg    <entry role='functiondecl'>
3236e9fcaa8aSmrgvoid <emphasis>
3237e9fcaa8aSmrgXkbSARedirectSetVModsMask</emphasis>
3238e9fcaa8aSmrg(<emphasis>
3239e9fcaa8aSmrgact, vm</emphasis>
3240e9fcaa8aSmrg)                              /* macro */
3241e9fcaa8aSmrg    </entry>
3242e9fcaa8aSmrg  </row>
3243e9fcaa8aSmrg  <row rowsep='0'>
3244e9fcaa8aSmrg    <entry role='functionargdecl'>
3245e9fcaa8aSmrgXkbRedirectKeyAction                  <emphasis>
3246e9fcaa8aSmrgact</emphasis>
3247e9fcaa8aSmrg;            /* action in which to set vmods */
3248e9fcaa8aSmrg    </entry>
3249e9fcaa8aSmrg  </row>
3250e9fcaa8aSmrg  <row rowsep='0'>
3251e9fcaa8aSmrg    <entry role='functionargdecl'>
3252e9fcaa8aSmrgunsigned int                  <emphasis>
3253e9fcaa8aSmrgvm</emphasis>
3254e9fcaa8aSmrg;            /* new value for virtual modifier mask */
3255e9fcaa8aSmrg    </entry>
3256e9fcaa8aSmrg</row>
3257e9fcaa8aSmrg</tbody>
3258e9fcaa8aSmrg</tgroup>
3259e9fcaa8aSmrg</informaltable>
3260e9fcaa8aSmrg
3261e9fcaa8aSmrg<para>
3262e9fcaa8aSmrg<emphasis>
3263e9fcaa8aSmrgXkbSARedirectSetVModsMask</emphasis>
3264e9fcaa8aSmrg sets the <emphasis>
3265e9fcaa8aSmrgvmods_mask0</emphasis>
3266e9fcaa8aSmrg and <emphasis>
3267e9fcaa8aSmrgvmods_mask1</emphasis>
3268e9fcaa8aSmrg fields of <emphasis>
3269e9fcaa8aSmrgact</emphasis>
3270e9fcaa8aSmrg from <emphasis>
3271e9fcaa8aSmrgvm</emphasis>
3272e9fcaa8aSmrg.
3273e9fcaa8aSmrg</para>
3274e9fcaa8aSmrg
3275e9fcaa8aSmrg
3276e9fcaa8aSmrg<para>
3277e9fcaa8aSmrgSimilarly, the <emphasis>
3278e9fcaa8aSmrgvmods0</emphasis>
3279e9fcaa8aSmrg and <emphasis>
3280e9fcaa8aSmrgvmods1</emphasis>
3281e9fcaa8aSmrg fields actually represent one <emphasis>
3282e9fcaa8aSmrgvmods </emphasis>
3283e9fcaa8aSmrgvalue, as described in Chapter 7. To convert between the two formats, Xkb
3284e9fcaa8aSmrgprovides the following convenience macros:
3285e9fcaa8aSmrg</para>
3286e9fcaa8aSmrg
3287e9fcaa8aSmrg
3288e9fcaa8aSmrg<informaltable frame='none'>
3289e9fcaa8aSmrg<tgroup cols='1'>
3290e9fcaa8aSmrg<colspec colsep='0'/>
3291e9fcaa8aSmrg<tbody>
3292e9fcaa8aSmrg  <row rowsep='0'>
3293e9fcaa8aSmrg    <entry role='functiondecl'>
3294e9fcaa8aSmrgunsigned int <emphasis>
3295e9fcaa8aSmrgXkbSARedirectVMods</emphasis>
3296e9fcaa8aSmrg(<emphasis>
3297e9fcaa8aSmrgact</emphasis>
3298e9fcaa8aSmrg)                              /* macro */
3299e9fcaa8aSmrg    </entry>
3300e9fcaa8aSmrg  </row>
3301e9fcaa8aSmrg  <row rowsep='0'>
3302e9fcaa8aSmrg    <entry role='functionargdecl'>
3303e9fcaa8aSmrgXkbRedirectKeyAction                  <emphasis>
3304e9fcaa8aSmrgact</emphasis>
3305e9fcaa8aSmrg;            /* action from which to extract vmods */
3306e9fcaa8aSmrg    </entry>
3307e9fcaa8aSmrg</row>
3308e9fcaa8aSmrg</tbody>
3309e9fcaa8aSmrg</tgroup>
3310e9fcaa8aSmrg</informaltable>
3311e9fcaa8aSmrg
3312e9fcaa8aSmrg<literallayout>
3313e9fcaa8aSmrg     <emphasis>XkbSARedirectVModsMask</emphasis> returns the <emphasis>vmods0</emphasis>
3314e9fcaa8aSmrg     and <emphasis>vmods1</emphasis> fields of <emphasis>act</emphasis>
3315e9fcaa8aSmrg     converted to an unsigned int.
3316e9fcaa8aSmrg</literallayout>
3317e9fcaa8aSmrg
3318e9fcaa8aSmrg<informaltable frame='none'>
3319e9fcaa8aSmrg<tgroup cols='1'>
3320e9fcaa8aSmrg<colspec colsep='0'/>
3321e9fcaa8aSmrg<tbody>
3322e9fcaa8aSmrg  <row rowsep='0'>
3323e9fcaa8aSmrg    <entry role='functiondecl'>
3324e9fcaa8aSmrgvoid <emphasis>
3325e9fcaa8aSmrgXkbSARedirectSetVMods</emphasis>
3326e9fcaa8aSmrg(<emphasis>
3327e9fcaa8aSmrgact, vm</emphasis>
3328e9fcaa8aSmrg)                              /* macro */
3329e9fcaa8aSmrg    </entry>
3330e9fcaa8aSmrg  </row>
3331e9fcaa8aSmrg  <row rowsep='0'>
3332e9fcaa8aSmrg    <entry role='functionargdecl'>
3333e9fcaa8aSmrgXkbRedirectKeyAction                  <emphasis>
3334e9fcaa8aSmrgact</emphasis>
3335e9fcaa8aSmrg;            /* action in which to set vmods */
3336e9fcaa8aSmrg    </entry>
3337e9fcaa8aSmrg  </row>
3338e9fcaa8aSmrg  <row rowsep='0'>
3339e9fcaa8aSmrg    <entry role='functionargdecl'>
3340e9fcaa8aSmrgunsigned int                  <emphasis>
3341e9fcaa8aSmrgv</emphasis>
3342e9fcaa8aSmrg;            /* new value for virtual modifiers */
3343e9fcaa8aSmrg    </entry>
3344e9fcaa8aSmrg</row>
3345e9fcaa8aSmrg</tbody>
3346e9fcaa8aSmrg</tgroup>
3347e9fcaa8aSmrg</informaltable>
3348e9fcaa8aSmrg<literallayout>
3349e9fcaa8aSmrg     <emphasis> XkbSARedirectSetVModsMask</emphasis> sets the <emphasis>vmods0</emphasis>
3350e9fcaa8aSmrg     and <emphasis>vmods1</emphasis> of <emphasis>act</emphasis> from <emphasis>v</emphasis>.
3351e9fcaa8aSmrg</literallayout>
3352e9fcaa8aSmrg
3353e9fcaa8aSmrg</sect2>
3354e9fcaa8aSmrg<sect2 id='actions_for_generating_devicebuttonpress_and_devicebuttonrelease'>
3355e9fcaa8aSmrg<title>Actions for Generating DeviceButtonPress and DeviceButtonRelease</title>
3356e9fcaa8aSmrg
3357e9fcaa8aSmrg<para>
3358e9fcaa8aSmrgActions associated with <emphasis>
3359e9fcaa8aSmrgXkbDeviceBtnAction</emphasis>
3360e9fcaa8aSmrg structures generate <emphasis>
3361e9fcaa8aSmrgDeviceButtonPress</emphasis>
3362e9fcaa8aSmrg and <emphasis>
3363e9fcaa8aSmrgDeviceButtonRelease</emphasis>
3364e9fcaa8aSmrg events instead of normal <emphasis>
3365e9fcaa8aSmrgKeyPress</emphasis>
3366e9fcaa8aSmrg and <emphasis>
3367e9fcaa8aSmrgKeyRelease</emphasis>
3368e9fcaa8aSmrg events:
3369e9fcaa8aSmrg</para>
3370e9fcaa8aSmrg
3371e9fcaa8aSmrg<para><programlisting>
3372e9fcaa8aSmrgtypedef struct _XkbDeviceBtnAction {
3373e9fcaa8aSmrg      unsigned char    type;      /* <emphasis> XkbSA_DeviceBtn, XkbSA_LockDeviceBtn</emphasis> */
3374e9fcaa8aSmrg      unsigned char    flags;     /* with <emphasis> type</emphasis> , specifies locking or unlocking */
3375e9fcaa8aSmrg      unsigned char    count;     /* controls number of DeviceButtonPress and Release events */
3376e9fcaa8aSmrg      unsigned char    button;    /* index of button on <emphasis> device</emphasis> */
3377e9fcaa8aSmrg      unsigned char    device;    /* device ID of an X input extension device */
3378e9fcaa8aSmrg} <emphasis>XkbDeviceBtnAction</emphasis>;
3379e9fcaa8aSmrg</programlisting></para>
3380e9fcaa8aSmrg
3381e9fcaa8aSmrg<para>
3382e9fcaa8aSmrgThe <emphasis>
3383e9fcaa8aSmrgtype</emphasis>
3384e9fcaa8aSmrg field can have any one of the values shown in Table 16.17.
3385e9fcaa8aSmrg</para>
3386e9fcaa8aSmrg
3387e9fcaa8aSmrg<table frame='none'>
3388e9fcaa8aSmrg<title>Device Button Action Types</title>
3389e9fcaa8aSmrg<tgroup cols='2'>
3390e9fcaa8aSmrg<colspec colsep='0'/>
3391e9fcaa8aSmrg<colspec colsep='0'/>
3392e9fcaa8aSmrg<thead>
3393e9fcaa8aSmrg<row rowsep='0'>
3394e9fcaa8aSmrg  <entry>Type</entry>
3395e9fcaa8aSmrg  <entry>Effect</entry>
3396e9fcaa8aSmrg</row>
3397e9fcaa8aSmrg</thead>
3398e9fcaa8aSmrg<tbody>
3399e9fcaa8aSmrg  <row rowsep='0'>
3400e9fcaa8aSmrg    <entry><emphasis>XkbSA_DeviceBtn</emphasis></entry>
3401e9fcaa8aSmrg    <entry>
3402e9fcaa8aSmrg<itemizedlist>
3403e9fcaa8aSmrg  <listitem>
3404e9fcaa8aSmrg    <para>
3405e9fcaa8aSmrgIf the button specified by this action is logically down, the key press and
3406e9fcaa8aSmrgcorresponding release are ignored and have no effect. If the device or button
3407e9fcaa8aSmrgspecified by this action are illegal, this action behaves like <emphasis>
3408e9fcaa8aSmrgXkbSA_NoAction</emphasis>.
3409e9fcaa8aSmrg    </para>
3410e9fcaa8aSmrg  </listitem>
3411e9fcaa8aSmrg  <listitem>
3412e9fcaa8aSmrg    <para>
3413e9fcaa8aSmrgOtherwise, key presses cause one or more input extension device events instead
3414e9fcaa8aSmrgof the usual key press event. If the <emphasis>
3415e9fcaa8aSmrgcount</emphasis>
3416e9fcaa8aSmrg field is zero, a key press generates a single <emphasis>
3417e9fcaa8aSmrgDeviceButtonPress</emphasis>
3418e9fcaa8aSmrg event. If count is greater than zero, a key press event generates <emphasis>
3419e9fcaa8aSmrgcount</emphasis>
3420e9fcaa8aSmrg pairs of <emphasis>
3421e9fcaa8aSmrgDeviceButtonPress</emphasis>
3422e9fcaa8aSmrg and <emphasis>
3423e9fcaa8aSmrgDeviceButtonRelease</emphasis>
3424e9fcaa8aSmrg events.
3425e9fcaa8aSmrg    </para>
3426e9fcaa8aSmrg  </listitem>
3427e9fcaa8aSmrg  <listitem>
3428e9fcaa8aSmrg    <para>
3429e9fcaa8aSmrgIf <emphasis>
3430e9fcaa8aSmrgcount</emphasis>
3431e9fcaa8aSmrg is zero, a key release generates an input extension <emphasis>
3432e9fcaa8aSmrgDeviceButtonRelease</emphasis>
3433e9fcaa8aSmrg event that matches the event generated by the corresponding key press. If
3434e9fcaa8aSmrg<emphasis>
3435e9fcaa8aSmrgcount</emphasis>
3436e9fcaa8aSmrg is nonzero, a key release does not cause a <emphasis>
3437e9fcaa8aSmrgDeviceButtonRelease</emphasis>
3438e9fcaa8aSmrg event. Key releases never cause <emphasis>
3439e9fcaa8aSmrgKeyRelease</emphasis>
3440e9fcaa8aSmrg events.
3441e9fcaa8aSmrg    </para>
3442e9fcaa8aSmrg  </listitem>
3443e9fcaa8aSmrg</itemizedlist>
3444e9fcaa8aSmrg    </entry>
3445e9fcaa8aSmrg  </row>
3446e9fcaa8aSmrg  <row rowsep='0'>
3447e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockDeviceBtn</emphasis></entry>
3448e9fcaa8aSmrg    <entry>
3449e9fcaa8aSmrg<itemizedlist>
3450e9fcaa8aSmrg  <listitem>
3451e9fcaa8aSmrg    <para>
3452e9fcaa8aSmrgIf the device or button specified by this action are illegal, this action
3453e9fcaa8aSmrgbehaves like <emphasis>XkbSA_NoAction</emphasis>.
3454e9fcaa8aSmrg    </para>
3455e9fcaa8aSmrg  </listitem>
3456e9fcaa8aSmrg  <listitem>
3457e9fcaa8aSmrg    <para>
3458e9fcaa8aSmrgOtherwise, if the specified button is not locked and the <emphasis>
3459e9fcaa8aSmrgXkbSA_LockNoLock</emphasis>
3460e9fcaa8aSmrg bit is not set in the <emphasis>
3461e9fcaa8aSmrgflags</emphasis>
3462e9fcaa8aSmrg field, a key press generates an input extension <emphasis>
3463e9fcaa8aSmrgDeviceButtonPress</emphasis>
3464e9fcaa8aSmrg event instead of a <emphasis>
3465e9fcaa8aSmrgKeyPress</emphasis>
3466e9fcaa8aSmrg event and locks the button. If the button is already locked or if <emphasis>
3467e9fcaa8aSmrgXkbSA_LockNoLock</emphasis>
3468e9fcaa8aSmrg bit is set in the <emphasis>
3469e9fcaa8aSmrgflags</emphasis>
3470e9fcaa8aSmrg field, the key press is ignored and has no effect.
3471e9fcaa8aSmrg    </para>
3472e9fcaa8aSmrg  </listitem>
3473e9fcaa8aSmrg  <listitem>
3474e9fcaa8aSmrg    <para>
3475e9fcaa8aSmrgIf the corresponding key press was ignored, and if the <emphasis>
3476e9fcaa8aSmrgXkbSA_LockNoUnlock</emphasis>
3477e9fcaa8aSmrg bit is not set in the <emphasis>
3478e9fcaa8aSmrgflags</emphasis>
3479e9fcaa8aSmrg field, a key release generates an input extension <emphasis>
3480e9fcaa8aSmrgDeviceButtonRelease</emphasis>
3481e9fcaa8aSmrg event instead of a <emphasis>
3482e9fcaa8aSmrgKeyRelease</emphasis>
3483e9fcaa8aSmrg event and unlocks the button. If the corresponding key press locked a button,
3484e9fcaa8aSmrgthe key release is ignored and has no effect.
3485e9fcaa8aSmrg    </para>
3486e9fcaa8aSmrg  </listitem>
3487e9fcaa8aSmrg</itemizedlist>
3488e9fcaa8aSmrg    </entry>
3489e9fcaa8aSmrg  </row>
3490e9fcaa8aSmrg</tbody>
3491e9fcaa8aSmrg</tgroup>
3492e9fcaa8aSmrg</table>
3493e9fcaa8aSmrg
3494e9fcaa8aSmrg<para>
3495e9fcaa8aSmrgThe <emphasis>
3496e9fcaa8aSmrgflags</emphasis>
3497e9fcaa8aSmrg field is composed of the bitwise inclusive OR of the masks shown in Table
3498e9fcaa8aSmrg16.18.
3499e9fcaa8aSmrg</para>
3500e9fcaa8aSmrg
3501e9fcaa8aSmrg<table frame='none'>
3502e9fcaa8aSmrg<title>Device Button Action Flags</title>
3503e9fcaa8aSmrg<tgroup cols='2'>
3504e9fcaa8aSmrg<colspec colsep='0'/>
3505e9fcaa8aSmrg<colspec colsep='0'/>
3506e9fcaa8aSmrg<thead>
3507e9fcaa8aSmrg<row rowsep='0'>
3508e9fcaa8aSmrg  <entry>Flag</entry>
3509e9fcaa8aSmrg  <entry>Meaning</entry>
3510e9fcaa8aSmrg</row>
3511e9fcaa8aSmrg</thead>
3512e9fcaa8aSmrg<tbody>
3513e9fcaa8aSmrg  <row rowsep='0'>
3514e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
3515e9fcaa8aSmrg    <entry>
3516e9fcaa8aSmrgIf set, and the action type is <emphasis>
3517e9fcaa8aSmrgXkbSA_LockDeviceBtn</emphasis>
3518e9fcaa8aSmrg, the server only unlocks the button.
3519e9fcaa8aSmrg    </entry>
3520e9fcaa8aSmrg  </row>
3521e9fcaa8aSmrg  <row rowsep='0'>
3522e9fcaa8aSmrg    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
3523e9fcaa8aSmrg    <entry>
3524e9fcaa8aSmrgIf set, and the action type is <emphasis>
3525e9fcaa8aSmrgXkbSA_LockDeviceBtn</emphasis>
3526e9fcaa8aSmrg, the server only locks the button.
3527e9fcaa8aSmrg    </entry>
3528e9fcaa8aSmrg  </row>
3529e9fcaa8aSmrg</tbody>
3530e9fcaa8aSmrg</tgroup>
3531e9fcaa8aSmrg</table>
3532e9fcaa8aSmrg
3533e9fcaa8aSmrg</sect2>
3534e9fcaa8aSmrg<sect2 id='actions_for_simulating_events_from_device_valuators'>
3535e9fcaa8aSmrg<title>Actions for Simulating Events from Device Valuators</title>
3536e9fcaa8aSmrg
3537e9fcaa8aSmrg<para>
3538e9fcaa8aSmrgA <emphasis>
3539e9fcaa8aSmrgvaluator</emphasis>
3540e9fcaa8aSmrg manipulates a range of values for some entity, like a mouse axis, a slider or
3541e9fcaa8aSmrga dial. Actions associated with <emphasis>
3542e9fcaa8aSmrgXkbDeviceValuatorAction</emphasis>
3543e9fcaa8aSmrg structures are used to simulate events from one or two input extension device
3544e9fcaa8aSmrgvaluators.
3545e9fcaa8aSmrg</para>
3546e9fcaa8aSmrg
3547e9fcaa8aSmrg<para><programlisting>
3548e9fcaa8aSmrgtypedef struct _XkbDeviceValuatorAction {
3549e9fcaa8aSmrg      unsigned char    type;        /*<emphasis> XkbSA_DeviceValuator</emphasis> */
3550e9fcaa8aSmrg      unsigned char    device;      /* device ID */
3551e9fcaa8aSmrg      unsigned char    v1_what;     /* determines how valuator is to behave for valuator 1 */
3552e9fcaa8aSmrg      unsigned char    v1_ndx;      /* specifies a real valuator */
3553e9fcaa8aSmrg      unsigned char    v1_value;    /* the value for valuator 1 */
3554e9fcaa8aSmrg      unsigned char    v2_what;     /* determines how valuator is to behave for valuator 2 */
3555e9fcaa8aSmrg      unsigned char    v2_ndx;      /* specifies a real valuator */
3556e9fcaa8aSmrg      unsigned char    v2_value;    /* the value for valuator 1 */
3557e9fcaa8aSmrg} <emphasis>XkbDeviceValuatorAction</emphasis>;
3558e9fcaa8aSmrg</programlisting></para>
3559e9fcaa8aSmrg
3560e9fcaa8aSmrg<para>
3561e9fcaa8aSmrgIf <emphasis>
3562e9fcaa8aSmrgdevice</emphasis>
3563e9fcaa8aSmrg is illegal or if neither <emphasis>
3564e9fcaa8aSmrgv1_ndx</emphasis>
3565e9fcaa8aSmrg nor <emphasis>
3566e9fcaa8aSmrgv2_ndx</emphasis>
3567e9fcaa8aSmrg specifies a legal valuator, this action behaves like <emphasis>
3568e9fcaa8aSmrgXkbSA_NoAction</emphasis>.
3569e9fcaa8aSmrg</para>
3570e9fcaa8aSmrg
3571e9fcaa8aSmrg
3572e9fcaa8aSmrg<para>
3573e9fcaa8aSmrgThe low four bits of <emphasis>
3574e9fcaa8aSmrgv1_what</emphasis>
3575e9fcaa8aSmrg and <emphasis>
3576e9fcaa8aSmrgv2_what</emphasis>
3577e9fcaa8aSmrg specify the corresponding scale value (denoted <emphasis>
3578e9fcaa8aSmrgval&lt;n&gt;Scale</emphasis>
3579e9fcaa8aSmrg in Table 16.17), if needed. The high four bits of <emphasis>
3580e9fcaa8aSmrgv1_what</emphasis>
3581e9fcaa8aSmrg and <emphasis>
3582e9fcaa8aSmrgv2_what</emphasis>
3583e9fcaa8aSmrg specify the operation to perform to set the values. The high four bits of
3584e9fcaa8aSmrg<emphasis>
3585e9fcaa8aSmrgv1_what</emphasis>
3586e9fcaa8aSmrg and <emphasis>
3587e9fcaa8aSmrgv2_what</emphasis>
3588e9fcaa8aSmrg can have the values shown in Table 16.17; the use of <emphasis>
3589e9fcaa8aSmrgval&lt;n&gt;Scale</emphasis>
3590e9fcaa8aSmrg is shown in that table also.
3591e9fcaa8aSmrg</para>
3592e9fcaa8aSmrg
3593e9fcaa8aSmrg<table frame='none'>
3594e9fcaa8aSmrg<title>Device Valuator v&lt;n&gt;_what High Bits Values</title>
3595e9fcaa8aSmrg<tgroup cols='2'>
3596e9fcaa8aSmrg<colspec colsep='0'/>
3597e9fcaa8aSmrg<colspec colsep='0'/>
3598e9fcaa8aSmrg<thead>
3599e9fcaa8aSmrg<row rowsep='0'>
3600e9fcaa8aSmrg  <entry>Value of high bits</entry>
3601e9fcaa8aSmrg  <entry>Effect</entry>
3602e9fcaa8aSmrg</row>
3603e9fcaa8aSmrg</thead>
3604e9fcaa8aSmrg<tbody>
3605e9fcaa8aSmrg  <row rowsep='0'>
3606e9fcaa8aSmrg    <entry><emphasis>XkbSA_IgnoreVal</emphasis></entry>
3607e9fcaa8aSmrg    <entry>No action</entry>
3608e9fcaa8aSmrg  </row>
3609e9fcaa8aSmrg  <row rowsep='0'>
3610e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetValMin</emphasis></entry>
3611e9fcaa8aSmrg    <entry>
3612e9fcaa8aSmrg<emphasis>v&lt;n&gt;_value</emphasis> is set to its minimum legal value.
3613e9fcaa8aSmrg    </entry>
3614e9fcaa8aSmrg  </row>
3615e9fcaa8aSmrg  <row rowsep='0'>
3616e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetValCenter</emphasis></entry>
3617e9fcaa8aSmrg    <entry>
3618e9fcaa8aSmrg<emphasis>v&lt;n&gt;_value</emphasis>is centered (to (max-min)/2).
3619e9fcaa8aSmrg    </entry>
3620e9fcaa8aSmrg  </row>
3621e9fcaa8aSmrg  <row rowsep='0'>
3622e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetValMax</emphasis></entry>
3623e9fcaa8aSmrg    <entry>
3624e9fcaa8aSmrg<emphasis>v&lt;n&gt;_value</emphasis> is set to its maximum legal value.
3625e9fcaa8aSmrg    </entry>
3626e9fcaa8aSmrg  </row>
3627e9fcaa8aSmrg  <row rowsep='0'>
3628e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetValRelative</emphasis></entry>
3629e9fcaa8aSmrg    <entry>
3630e9fcaa8aSmrg<emphasis>v&lt;n&gt;_value</emphasis> * (2
3631e9fcaa8aSmrg<emphasis>val&lt;n&gt;Scale</emphasis>) is added to
3632e9fcaa8aSmrg<emphasis>v&lt;n&gt;_value</emphasis>.
3633e9fcaa8aSmrg    </entry>
3634e9fcaa8aSmrg  </row>
3635e9fcaa8aSmrg  <row rowsep='0'>
3636e9fcaa8aSmrg    <entry><emphasis>XkbSA_SetValAbsolute</emphasis></entry>
3637e9fcaa8aSmrg    <entry>
3638e9fcaa8aSmrg<emphasis>v&lt;n&gt;_value</emphasis>
3639e9fcaa8aSmrg is set to (2 <emphasis>val&lt;n&gt;Scale</emphasis>).
3640e9fcaa8aSmrg    </entry>
3641e9fcaa8aSmrg  </row>
3642e9fcaa8aSmrg</tbody>
3643e9fcaa8aSmrg</tgroup>
3644e9fcaa8aSmrg</table>
3645e9fcaa8aSmrg
3646e9fcaa8aSmrg<para>
3647e9fcaa8aSmrgIllegal values for <emphasis>
3648e9fcaa8aSmrgXkbSA_SetValRelative</emphasis>
3649e9fcaa8aSmrg or <emphasis>
3650e9fcaa8aSmrgXkbSA_SetValAbsolute</emphasis>
3651e9fcaa8aSmrg are clamped into range. Note that all of these possibilities are legal for
3652e9fcaa8aSmrgabsolute valuators. For relative valuators, only <emphasis>
3653e9fcaa8aSmrgXkbSA_SetValRelative</emphasis>
3654e9fcaa8aSmrg is permitted. Part of the input extension description of a device is the range
3655e9fcaa8aSmrgof legal values for all absolute valuators, whence the maximum and minimum
3656e9fcaa8aSmrglegal values shown in Table 16.17.
3657e9fcaa8aSmrg</para>
3658e9fcaa8aSmrg
3659e9fcaa8aSmrg
3660e9fcaa8aSmrg<para>
3661e9fcaa8aSmrgThe following two masks are provided as a convenience to select either portion
3662e9fcaa8aSmrgof <emphasis>
3663e9fcaa8aSmrgv1_what</emphasis>
3664e9fcaa8aSmrg or <emphasis>
3665e9fcaa8aSmrgv2_what</emphasis>
3666e9fcaa8aSmrg:
3667e9fcaa8aSmrg</para>
3668e9fcaa8aSmrg
3669e9fcaa8aSmrg<literallayout>
3670e9fcaa8aSmrg      #define XkbSA_ValOpMask      (0x70)
3671e9fcaa8aSmrg      #define XkbSA_ValScaleMask      (0x07)
3672e9fcaa8aSmrg</literallayout>
3673e9fcaa8aSmrg
3674e9fcaa8aSmrg<para>
3675e9fcaa8aSmrg<emphasis>
3676e9fcaa8aSmrgv1_ndx</emphasis>
3677e9fcaa8aSmrg and <emphasis>
3678e9fcaa8aSmrgv2_ndx</emphasis>
3679e9fcaa8aSmrg specify valuators that actually exists. For example, most mice have two
3680e9fcaa8aSmrgvaluators (x and y axes) so the only legal values for a mouse would be 0 and 1.
3681e9fcaa8aSmrgFor a dial box with eight dials, any value in the range 0..7 would be correct.
3682e9fcaa8aSmrg</para>
3683e9fcaa8aSmrg
3684e9fcaa8aSmrg
3685e9fcaa8aSmrg</sect2>
3686e9fcaa8aSmrg<sect2 id='obtaining_key_actions_for_keys_from_the_server'>
3687e9fcaa8aSmrg<title>Obtaining Key Actions for Keys from the Server</title>
3688e9fcaa8aSmrg
3689e9fcaa8aSmrg<para>
3690e9fcaa8aSmrgTo update the actions (the <emphasis>
3691e9fcaa8aSmrgkey_acts</emphasis>
3692e9fcaa8aSmrg array) for a subset of the keys in a keyboard description, use <emphasis>
3693e9fcaa8aSmrgXkbGetKeyActions</emphasis>
3694e9fcaa8aSmrg.
3695e9fcaa8aSmrg</para>
3696e9fcaa8aSmrg
3697e9fcaa8aSmrg<informaltable frame='none'>
3698e9fcaa8aSmrg<tgroup cols='1'>
3699e9fcaa8aSmrg<colspec colsep='0'/>
3700e9fcaa8aSmrg<tbody>
3701e9fcaa8aSmrg  <row rowsep='0'>
3702e9fcaa8aSmrg    <entry role='functiondecl'>
3703e9fcaa8aSmrgStatus <emphasis>
3704e9fcaa8aSmrgXkbGetKeyActions</emphasis>
3705e9fcaa8aSmrg(<emphasis>
3706e9fcaa8aSmrgdpy</emphasis>
3707e9fcaa8aSmrg,<emphasis>
3708e9fcaa8aSmrg first</emphasis>
3709e9fcaa8aSmrg, <emphasis>
3710e9fcaa8aSmrgnum</emphasis>
3711e9fcaa8aSmrg,<emphasis>
3712e9fcaa8aSmrg xkb</emphasis>
3713e9fcaa8aSmrg)
3714e9fcaa8aSmrg    </entry>
3715e9fcaa8aSmrg  </row>
3716e9fcaa8aSmrg  <row rowsep='0'>
3717e9fcaa8aSmrg    <entry role='functionargdecl'>
3718e9fcaa8aSmrgDisplay *<emphasis>
3719e9fcaa8aSmrg            dpy</emphasis>
3720e9fcaa8aSmrg;            /* connection to X server */
3721e9fcaa8aSmrg    </entry>
3722e9fcaa8aSmrg  </row>
3723e9fcaa8aSmrg  <row rowsep='0'>
3724e9fcaa8aSmrg    <entry role='functionargdecl'>
3725e9fcaa8aSmrgunsigned int            <emphasis>
3726e9fcaa8aSmrgfirst</emphasis>
3727e9fcaa8aSmrg;            /* keycode of first key of interest */
3728e9fcaa8aSmrg    </entry>
3729e9fcaa8aSmrg  </row>
3730e9fcaa8aSmrg  <row rowsep='0'>
3731e9fcaa8aSmrg    <entry role='functionargdecl'>
3732e9fcaa8aSmrgunsigned int            <emphasis>
3733e9fcaa8aSmrgnum</emphasis>
3734e9fcaa8aSmrg;            /* number of keys desired */
3735e9fcaa8aSmrg    </entry>
3736e9fcaa8aSmrg  </row>
3737e9fcaa8aSmrg  <row rowsep='0'>
3738e9fcaa8aSmrg    <entry role='functionargdecl'>
3739e9fcaa8aSmrgXkbDescPtr             <emphasis>
3740e9fcaa8aSmrgxkb</emphasis>
3741e9fcaa8aSmrg;            /* pointer to keyboard description where result is stored */
3742e9fcaa8aSmrg    </entry>
3743e9fcaa8aSmrg</row>
3744e9fcaa8aSmrg</tbody>
3745e9fcaa8aSmrg</tgroup>
3746e9fcaa8aSmrg</informaltable>
3747e9fcaa8aSmrg
3748e9fcaa8aSmrg<para>
3749e9fcaa8aSmrg<emphasis>
3750e9fcaa8aSmrgXkbGetKeyActions</emphasis>
3751e9fcaa8aSmrg sends a request to the server to obtain the actions for <emphasis>
3752e9fcaa8aSmrgnum</emphasis>
3753e9fcaa8aSmrg keys on the keyboard starting with key <emphasis>
3754e9fcaa8aSmrgfirst</emphasis>
3755e9fcaa8aSmrg. It waits for a reply and returns the actions in the <emphasis>
3756e9fcaa8aSmrgserver</emphasis>
3757e9fcaa8aSmrg-&gt;<emphasis>
3758e9fcaa8aSmrgkey_acts</emphasis>
3759e9fcaa8aSmrg field of <emphasis>
3760e9fcaa8aSmrgxkb</emphasis>
3761e9fcaa8aSmrg. If successful, <emphasis>
3762e9fcaa8aSmrgXkbGetKeyActions</emphasis>
3763e9fcaa8aSmrg returns <emphasis>
3764e9fcaa8aSmrgSuccess</emphasis>
3765e9fcaa8aSmrg. The <emphasis>
3766e9fcaa8aSmrgxkb</emphasis>
3767e9fcaa8aSmrg parameter must be a pointer to a valid Xkb keyboard description.
3768e9fcaa8aSmrg</para>
3769e9fcaa8aSmrg
3770e9fcaa8aSmrg
3771e9fcaa8aSmrg<para>
3772e9fcaa8aSmrgIf the <emphasis>
3773e9fcaa8aSmrgserver</emphasis>
3774e9fcaa8aSmrg map in the <emphasis>
3775e9fcaa8aSmrgxkb</emphasis>
3776e9fcaa8aSmrg parameter has not been allocated, <emphasis>
3777e9fcaa8aSmrgXkbGetKeyActions</emphasis>
3778e9fcaa8aSmrg allocates and initializes it before obtaining the actions.
3779e9fcaa8aSmrg</para>
3780e9fcaa8aSmrg
3781e9fcaa8aSmrg
3782e9fcaa8aSmrg<para>
3783e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
3784e9fcaa8aSmrghas not been properly initialized, <emphasis>
3785e9fcaa8aSmrgXkbGetKeyActions</emphasis>
3786e9fcaa8aSmrg returns <emphasis>
3787e9fcaa8aSmrgBadAccess</emphasis>
3788e9fcaa8aSmrg. If <emphasis>
3789e9fcaa8aSmrgnum</emphasis>
3790e9fcaa8aSmrg is less than 1 or greater than <emphasis>
3791e9fcaa8aSmrgXkbMaxKeyCount</emphasis>
3792e9fcaa8aSmrg, <emphasis>
3793e9fcaa8aSmrgXkbGetKeyActions</emphasis>
3794e9fcaa8aSmrg returns <emphasis>
3795e9fcaa8aSmrgBadValue</emphasis>
3796e9fcaa8aSmrg. If any allocation errors occur, <emphasis>
3797e9fcaa8aSmrgXkbGetKeyActions</emphasis>
3798e9fcaa8aSmrg returns <emphasis>
3799e9fcaa8aSmrgBadAlloc</emphasis>
3800e9fcaa8aSmrg.
3801e9fcaa8aSmrg</para>
3802e9fcaa8aSmrg
3803e9fcaa8aSmrg
3804e9fcaa8aSmrg</sect2>
3805e9fcaa8aSmrg<sect2 id='changing_the_number_of_actions_bound_to_a_key'>
3806e9fcaa8aSmrg<title>Changing the Number of Actions Bound to a Key</title>
3807e9fcaa8aSmrg
3808e9fcaa8aSmrg<para>
3809e9fcaa8aSmrgTo change the number of actions bound to a key, use <emphasis>
3810e9fcaa8aSmrgXkbResizeKeyAction</emphasis>
3811e9fcaa8aSmrg.
3812e9fcaa8aSmrg</para>
3813e9fcaa8aSmrg
3814e9fcaa8aSmrg<informaltable frame='none'>
3815e9fcaa8aSmrg<tgroup cols='1'>
3816e9fcaa8aSmrg<colspec colsep='0'/>
3817e9fcaa8aSmrg<tbody>
3818e9fcaa8aSmrg  <row rowsep='0'>
3819e9fcaa8aSmrg    <entry role='functiondecl'>
3820e9fcaa8aSmrgXkbAction *<emphasis>
3821e9fcaa8aSmrgXkbResizeKeyActions</emphasis>
3822e9fcaa8aSmrg(<emphasis>
3823e9fcaa8aSmrgxkb</emphasis>
3824e9fcaa8aSmrg,<emphasis>
3825e9fcaa8aSmrg key</emphasis>
3826e9fcaa8aSmrg,<emphasis>
3827e9fcaa8aSmrg needed</emphasis>
3828e9fcaa8aSmrg)
3829e9fcaa8aSmrg    </entry>
3830e9fcaa8aSmrg  </row>
3831e9fcaa8aSmrg  <row rowsep='0'>
3832e9fcaa8aSmrg    <entry role='functionargdecl'>
3833e9fcaa8aSmrgXkbDescRec *<emphasis>
3834e9fcaa8aSmrg            xkb</emphasis>
3835e9fcaa8aSmrg;            /* keyboard description to change */
3836e9fcaa8aSmrg    </entry>
3837e9fcaa8aSmrg  </row>
3838e9fcaa8aSmrg  <row rowsep='0'>
3839e9fcaa8aSmrg    <entry role='functionargdecl'>
3840e9fcaa8aSmrgint <emphasis>
3841e9fcaa8aSmrg            key</emphasis>
3842e9fcaa8aSmrg;            /* keycode of key to change */
3843e9fcaa8aSmrg    </entry>
3844e9fcaa8aSmrg  </row>
3845e9fcaa8aSmrg  <row rowsep='0'>
3846e9fcaa8aSmrg    <entry role='functionargdecl'>
3847e9fcaa8aSmrgint <emphasis>
3848e9fcaa8aSmrg            needed</emphasis>
3849e9fcaa8aSmrg;            /* new number of actions required */
3850e9fcaa8aSmrg    </entry>
3851e9fcaa8aSmrg</row>
3852e9fcaa8aSmrg</tbody>
3853e9fcaa8aSmrg</tgroup>
3854e9fcaa8aSmrg</informaltable>
3855e9fcaa8aSmrg
3856e9fcaa8aSmrg<para>
3857e9fcaa8aSmrgThe <emphasis>
3858e9fcaa8aSmrgxkb</emphasis>
3859e9fcaa8aSmrg parameter points to the keyboard description containing the <emphasis>
3860e9fcaa8aSmrgkey</emphasis>
3861e9fcaa8aSmrg whose number of actions is to be changed. The <emphasis>
3862e9fcaa8aSmrgkey</emphasis>
3863e9fcaa8aSmrg parameter is the keycode of the key to change, and <emphasis>
3864e9fcaa8aSmrgneeded</emphasis>
3865e9fcaa8aSmrg specifies the new number of actions required for the key.
3866e9fcaa8aSmrg</para>
3867e9fcaa8aSmrg
3868e9fcaa8aSmrg
3869e9fcaa8aSmrg<para>
3870e9fcaa8aSmrg<emphasis>
3871e9fcaa8aSmrgXkbResizeKeyActions</emphasis>
3872e9fcaa8aSmrg reserves the space needed for the actions and returns a pointer to the
3873e9fcaa8aSmrgbeginning of the new array that holds the actions. It can change the <emphasis>
3874e9fcaa8aSmrgacts</emphasis>
3875e9fcaa8aSmrg, <emphasis>
3876e9fcaa8aSmrgnum_acts</emphasis>
3877e9fcaa8aSmrg, and <emphasis>
3878e9fcaa8aSmrgsize_acts</emphasis>
3879e9fcaa8aSmrg fields of <emphasis>
3880e9fcaa8aSmrgxkb</emphasis>
3881e9fcaa8aSmrg-&gt;<emphasis>
3882e9fcaa8aSmrgserver</emphasis>
3883e9fcaa8aSmrg if it is necessary to reallocate the <emphasis>
3884e9fcaa8aSmrgacts </emphasis>
3885e9fcaa8aSmrgarray.
3886e9fcaa8aSmrg</para>
3887e9fcaa8aSmrg
3888e9fcaa8aSmrg
3889e9fcaa8aSmrg<para>
3890e9fcaa8aSmrgIf <emphasis>
3891e9fcaa8aSmrgneeded</emphasis>
3892e9fcaa8aSmrg is greater than the current number of keysyms for the key, <emphasis>
3893e9fcaa8aSmrgXkbResizeKeyActions</emphasis>
3894e9fcaa8aSmrg initializes all new actions in the array to <emphasis>
3895e9fcaa8aSmrgNoAction</emphasis>
3896e9fcaa8aSmrg.
3897e9fcaa8aSmrg</para>
3898e9fcaa8aSmrg
3899e9fcaa8aSmrg
3900e9fcaa8aSmrg<para>
3901e9fcaa8aSmrgBecause the number of actions needed by a key is normally computed as width *
3902e9fcaa8aSmrgnumber of groups, and <emphasis>
3903e9fcaa8aSmrgXkbResizeKeyActions</emphasis>
3904e9fcaa8aSmrg does not modify either the width or number of groups for the key, a
3905e9fcaa8aSmrgdiscrepancy exists on return from <emphasis>
3906e9fcaa8aSmrgXkbResizeKeyActions</emphasis>
3907e9fcaa8aSmrg between the space allocated for the actions and the number required. The
3908e9fcaa8aSmrgunused entries in the list of actions returned by <emphasis>
3909e9fcaa8aSmrgXkbResizeKeyActions</emphasis>
3910e9fcaa8aSmrg are not preserved across future calls to any of the map editing functions, so
3911e9fcaa8aSmrgyou must update the key actions (which updates the width and number of groups
3912e9fcaa8aSmrgfor the key) before calling another allocator function. A call to <emphasis>
3913e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis>
3914e9fcaa8aSmrg updates these.
3915e9fcaa8aSmrg</para>
3916e9fcaa8aSmrg
3917e9fcaa8aSmrg
3918e9fcaa8aSmrg<para>
3919e9fcaa8aSmrgIf any allocation errors occur while resizing the number of actions bound to
3920e9fcaa8aSmrgthe key, <emphasis>
3921e9fcaa8aSmrgXkbResizeKeyActions</emphasis>
3922e9fcaa8aSmrg returns <emphasis>
3923e9fcaa8aSmrgNULL</emphasis>
3924e9fcaa8aSmrg.
3925e9fcaa8aSmrg</para>
3926e9fcaa8aSmrg
3927e9fcaa8aSmrg<note><para>A change to the number of actions bound to a key should be
3928e9fcaa8aSmrgaccompanied by a change in the number of symbols bound to a key. Refer to
3929e9fcaa8aSmrgsection 15.3.7 for more information on changing the number of symbols bound to
3930e9fcaa8aSmrga key.</para></note>
3931e9fcaa8aSmrg
3932e9fcaa8aSmrg
3933e9fcaa8aSmrg</sect2>
3934e9fcaa8aSmrg</sect1>
3935e9fcaa8aSmrg<sect1 id='key_behavior'>
3936e9fcaa8aSmrg<title>Key Behavior</title>
3937e9fcaa8aSmrg
3938e9fcaa8aSmrg<para>
3939e9fcaa8aSmrgKey behavior refers to the demeanor of a key. For example, the expected
3940e9fcaa8aSmrgbehavior of the <emphasis>
3941e9fcaa8aSmrgCapsLock</emphasis>
3942e9fcaa8aSmrg key is that it logically locks when pressed, and then logically unlocks when
3943e9fcaa8aSmrgpressed again.
3944e9fcaa8aSmrg</para>
3945e9fcaa8aSmrg
3946e9fcaa8aSmrg
3947e9fcaa8aSmrg<sect2 id='radio_groups2'>
3948e9fcaa8aSmrg<title>Radio Groups</title>
3949e9fcaa8aSmrg
3950e9fcaa8aSmrg<para>
3951e9fcaa8aSmrgKeys that belong to the same radio group have the <emphasis>
3952e9fcaa8aSmrgXkbKB_RadioGroup</emphasis>
3953e9fcaa8aSmrg type in the <emphasis>
3954e9fcaa8aSmrgtype</emphasis>
3955e9fcaa8aSmrg field and the radio group index specified in the <emphasis>
3956e9fcaa8aSmrgdata</emphasis>
3957e9fcaa8aSmrg field in the <emphasis>
3958e9fcaa8aSmrgXkbBehavior</emphasis>
3959e9fcaa8aSmrg structure. If the radio group has a name in the <emphasis>
3960e9fcaa8aSmrgXkbNamesRec</emphasis>
3961e9fcaa8aSmrg structure, the radio group index is the index into the <emphasis>
3962e9fcaa8aSmrgradio_group</emphasis>
3963e9fcaa8aSmrg array in the <emphasis>
3964e9fcaa8aSmrgXkbNamesRec</emphasis>
3965e9fcaa8aSmrg structure. A radio group key when pressed stays logically down until another
3966e9fcaa8aSmrgkey in the radio group is pressed, when the first key becomes logically up and
3967e9fcaa8aSmrgthe new key becomes logically down. Setting the <emphasis>
3968e9fcaa8aSmrgXkbKB_RGAllowNone</emphasis>
3969e9fcaa8aSmrg bit in the behavior for all of the keys of the radio group means that pressing
3970e9fcaa8aSmrgthe logically down member of the radio group causes it to logically release, in
3971e9fcaa8aSmrgwhich case none of the keys of the radio group would be logically down. If
3972e9fcaa8aSmrg<emphasis>
3973e9fcaa8aSmrgXkbKB_RGAllowNone</emphasis>
3974e9fcaa8aSmrg is not set, there is no way to release the logically down member of the group.
3975e9fcaa8aSmrg</para>
3976e9fcaa8aSmrg
3977e9fcaa8aSmrg
3978e9fcaa8aSmrg<para>
3979e9fcaa8aSmrgThe low five bits of the <emphasis>
3980e9fcaa8aSmrgdata</emphasis>
3981e9fcaa8aSmrg field of the <emphasis>
3982e9fcaa8aSmrgXkbBehavior</emphasis>
3983e9fcaa8aSmrg structure are the group number, the high three bits are flags. The only flag
3984e9fcaa8aSmrgcurrently defined is:
3985e9fcaa8aSmrg</para>
3986e9fcaa8aSmrg
3987e9fcaa8aSmrg<para><programlisting>
3988e9fcaa8aSmrg#define      XkbRG_AllowNone      0x80
3989e9fcaa8aSmrg</programlisting></para>
3990e9fcaa8aSmrg
3991e9fcaa8aSmrg</sect2>
3992e9fcaa8aSmrg<sect2 id='the_xkbbehavior_structure'>
3993e9fcaa8aSmrg<title>The XkbBehavior Structure</title>
3994e9fcaa8aSmrg
3995e9fcaa8aSmrg<para>
3996e9fcaa8aSmrgThe <emphasis>
3997e9fcaa8aSmrgbehaviors</emphasis>
3998e9fcaa8aSmrg field of the server map is an array of <emphasis>
3999e9fcaa8aSmrgXkbBehavior</emphasis>
4000e9fcaa8aSmrg structures, indexed by keycode, and contains the behavior for each key. The
4001e9fcaa8aSmrg<emphasis>
4002e9fcaa8aSmrgXkbBehavior</emphasis>
4003e9fcaa8aSmrg structure is defined as follows:
4004e9fcaa8aSmrg</para>
4005e9fcaa8aSmrg
4006e9fcaa8aSmrg<para><programlisting>
4007e9fcaa8aSmrgtypedef struct _XkbBehavior {
4008e9fcaa8aSmrg      unsigned char  type;                  /* behavior type + optional
4009e9fcaa8aSmrg                                               <emphasis> XkbKB_Permanent</emphasis> bit */
4010e9fcaa8aSmrg      unsigned char  data;
4011e9fcaa8aSmrg} <emphasis>XkbBehavior</emphasis>;
4012e9fcaa8aSmrg</programlisting></para>
4013e9fcaa8aSmrg
4014e9fcaa8aSmrg<para>
4015e9fcaa8aSmrgThe <emphasis>
4016e9fcaa8aSmrgtype</emphasis>
4017e9fcaa8aSmrg field specifies the Xkb behavior, and the value of the <emphasis>
4018e9fcaa8aSmrgdata</emphasis>
4019e9fcaa8aSmrg field depends on the <emphasis>
4020e9fcaa8aSmrgtype</emphasis>
4021e9fcaa8aSmrg. Xkb supports the key behaviors shown in Table 16.20.
4022e9fcaa8aSmrg</para>
4023e9fcaa8aSmrg
4024e9fcaa8aSmrg<table frame='none'>
4025e9fcaa8aSmrg<title>Key Behaviors</title>
4026e9fcaa8aSmrg<tgroup cols='2'>
4027e9fcaa8aSmrg<colspec colsep='0'/>
4028e9fcaa8aSmrg<colspec colsep='0'/>
4029e9fcaa8aSmrg<thead>
4030e9fcaa8aSmrg<row rowsep='0'>
4031e9fcaa8aSmrg  <entry>Type</entry>
4032e9fcaa8aSmrg  <entry>Effect</entry>
4033e9fcaa8aSmrg</row>
4034e9fcaa8aSmrg</thead>
4035e9fcaa8aSmrg<tbody>
4036e9fcaa8aSmrg  <row rowsep='0'>
4037e9fcaa8aSmrg    <entry><emphasis>XkbKB_Default</emphasis></entry>
4038e9fcaa8aSmrg    <entry>
4039e9fcaa8aSmrgPress and release events are processed normally. The <emphasis>
4040e9fcaa8aSmrgdata</emphasis>
4041e9fcaa8aSmrg field is unused.
4042e9fcaa8aSmrg    </entry>
4043e9fcaa8aSmrg  </row>
4044e9fcaa8aSmrg  <row rowsep='0'>
4045e9fcaa8aSmrg    <entry><emphasis>XkbKB_Lock</emphasis></entry>
4046e9fcaa8aSmrg    <entry>
4047e9fcaa8aSmrgIf a key is logically up (that is, the corresponding bit of the core key map is
4048e9fcaa8aSmrgcleared) when it is pressed, the key press is processed normally and the
4049e9fcaa8aSmrgcorresponding release is ignored. If the key is logically down when pressed,
4050e9fcaa8aSmrgthe key press is ignored but the corresponding release is processed normally.
4051e9fcaa8aSmrgThe <emphasis>
4052e9fcaa8aSmrgdata</emphasis>
4053e9fcaa8aSmrg field is unused.
4054e9fcaa8aSmrg    </entry>
4055e9fcaa8aSmrg  </row>
4056e9fcaa8aSmrg  <row rowsep='0'>
4057e9fcaa8aSmrg    <entry><emphasis>XkbKB_RadioGroup</emphasis></entry>
4058e9fcaa8aSmrg    <entry>
4059e9fcaa8aSmrg      <para>
4060e9fcaa8aSmrgIf another member of the radio group is logically down (all members of the
4061e9fcaa8aSmrgradio group have the same index, specified in <emphasis>
4062e9fcaa8aSmrgdata</emphasis>
4063e9fcaa8aSmrg) when a key is pressed, the server synthesizes a key release for the member
4064e9fcaa8aSmrgthat is logically down and then processes the new key press event normally.
4065e9fcaa8aSmrg      </para>
4066e9fcaa8aSmrg      <para>
4067e9fcaa8aSmrgIf the key itself is logically down when pressed, the key press event is
4068e9fcaa8aSmrgignored, but the processing of the corresponding key release depends on the
4069e9fcaa8aSmrgvalue of the <emphasis>
4070e9fcaa8aSmrgXkb_RGAllowNone</emphasis>
4071e9fcaa8aSmrg bit in <emphasis>
4072e9fcaa8aSmrgflags</emphasis>
4073e9fcaa8aSmrg. If it is set, the key release is processed normally; otherwise, the key
4074e9fcaa8aSmrgrelease is also ignored.
4075e9fcaa8aSmrg      </para>
4076e9fcaa8aSmrg      <para>
4077e9fcaa8aSmrgAll other key release events are ignored.
4078e9fcaa8aSmrg      </para>
4079e9fcaa8aSmrg    </entry>
4080e9fcaa8aSmrg  </row>
4081e9fcaa8aSmrg  <row rowsep='0'>
4082e9fcaa8aSmrg    <entry><emphasis>XkbKB_Overlay1</emphasis></entry>
4083e9fcaa8aSmrg    <entry>
4084e9fcaa8aSmrgIf the <emphasis>
4085e9fcaa8aSmrgOverlay1</emphasis>
4086e9fcaa8aSmrg control is enabled (see section 10.4), <emphasis>
4087e9fcaa8aSmrgdata</emphasis>
4088e9fcaa8aSmrg is interpreted as a keycode, and events from this key are reported as if they
4089e9fcaa8aSmrgcame from <emphasis>
4090e9fcaa8aSmrgdata</emphasis>
4091e9fcaa8aSmrg’s keycode. Otherwise, press and release events are processed normally.
4092e9fcaa8aSmrg    </entry>
4093e9fcaa8aSmrg  </row>
4094e9fcaa8aSmrg  <row rowsep='0'>
4095e9fcaa8aSmrg    <entry><emphasis>XkbKB_Overlay2</emphasis></entry>
4096e9fcaa8aSmrg    <entry>
4097e9fcaa8aSmrgIf the <emphasis>
4098e9fcaa8aSmrgOverlay2</emphasis>
4099e9fcaa8aSmrg control is enabled (see section 10.4), <emphasis>
4100e9fcaa8aSmrgdata</emphasis>
4101e9fcaa8aSmrg is interpreted as a keycode, and events from this key are reported as if they
4102e9fcaa8aSmrgcame from <emphasis>
4103e9fcaa8aSmrgdata</emphasis>
4104e9fcaa8aSmrg’s keycode. Otherwise, press and release events are processed normally.
4105e9fcaa8aSmrg    </entry>
4106e9fcaa8aSmrg  </row>
4107e9fcaa8aSmrg</tbody>
4108e9fcaa8aSmrg</tgroup>
4109e9fcaa8aSmrg</table>
4110e9fcaa8aSmrg
4111e9fcaa8aSmrg<para>
4112e9fcaa8aSmrgXkb also provides the mask, <emphasis>
4113e9fcaa8aSmrgXkbKB_Permanent</emphasis>
4114e9fcaa8aSmrg to specify whether the key behavior type should be simulated by Xkb or whether
4115e9fcaa8aSmrgthe key behavior describes an unalterable physical, electrical, or software
4116e9fcaa8aSmrgaspect of the keyboard. If the <emphasis>
4117e9fcaa8aSmrgXkbKB_Permanent</emphasis>
4118e9fcaa8aSmrg bit is not set in the <emphasis>
4119e9fcaa8aSmrgtype</emphasis>
4120e9fcaa8aSmrg field, Xkb simulates the behavior in software. Otherwise, Xkb relies upon the
4121e9fcaa8aSmrgkeyboard to implement the behavior.
4122e9fcaa8aSmrg</para>
4123e9fcaa8aSmrg
4124e9fcaa8aSmrg
4125e9fcaa8aSmrg</sect2>
4126e9fcaa8aSmrg<sect2 id='obtaining_key_behaviors_for_keys_from_the_server'>
4127e9fcaa8aSmrg<title>Obtaining Key Behaviors for Keys from the Server</title>
4128e9fcaa8aSmrg
4129e9fcaa8aSmrg<para>
4130e9fcaa8aSmrgTo obtain the behaviors (the <emphasis>
4131e9fcaa8aSmrgbehaviors</emphasis>
4132e9fcaa8aSmrg array) for a subset of the keys in a keyboard description from the server, use
4133e9fcaa8aSmrg<emphasis>
4134e9fcaa8aSmrgXkbGetKeyBehaviors</emphasis>
4135e9fcaa8aSmrg:
4136e9fcaa8aSmrg</para>
4137e9fcaa8aSmrg
4138e9fcaa8aSmrg<informaltable frame='none'>
4139e9fcaa8aSmrg<tgroup cols='1'>
4140e9fcaa8aSmrg<colspec colsep='0'/>
4141e9fcaa8aSmrg<tbody>
4142e9fcaa8aSmrg  <row rowsep='0'>
4143e9fcaa8aSmrg    <entry role='functiondecl'>
4144e9fcaa8aSmrgStatus <emphasis>
4145e9fcaa8aSmrgXkbGetKeyBehaviors</emphasis>
4146e9fcaa8aSmrg(<emphasis>
4147e9fcaa8aSmrgdpy</emphasis>
4148e9fcaa8aSmrg,<emphasis>
4149e9fcaa8aSmrg first</emphasis>
4150e9fcaa8aSmrg,<emphasis>
4151e9fcaa8aSmrg num</emphasis>
4152e9fcaa8aSmrg,<emphasis>
4153e9fcaa8aSmrg xkb</emphasis>
4154e9fcaa8aSmrg)
4155e9fcaa8aSmrg    </entry>
4156e9fcaa8aSmrg  </row>
4157e9fcaa8aSmrg  <row rowsep='0'>
4158e9fcaa8aSmrg    <entry role='functionargdecl'>
4159e9fcaa8aSmrgDisplay *<emphasis>
4160e9fcaa8aSmrg            dpy</emphasis>
4161e9fcaa8aSmrg;            /* connection to server */
4162e9fcaa8aSmrg    </entry>
4163e9fcaa8aSmrg  </row>
4164e9fcaa8aSmrg  <row rowsep='0'>
4165e9fcaa8aSmrg    <entry role='functionargdecl'>
4166e9fcaa8aSmrgunsigned int            <emphasis>
4167e9fcaa8aSmrgfirst</emphasis>
4168e9fcaa8aSmrg;            /* keycode of first key to get */
4169e9fcaa8aSmrg    </entry>
4170e9fcaa8aSmrg  </row>
4171e9fcaa8aSmrg  <row rowsep='0'>
4172e9fcaa8aSmrg    <entry role='functionargdecl'>
4173e9fcaa8aSmrgunsigned int            <emphasis>
4174e9fcaa8aSmrgnum</emphasis>
4175e9fcaa8aSmrg;            /* number of keys for which behaviors are desired */
4176e9fcaa8aSmrg    </entry>
4177e9fcaa8aSmrg  </row>
4178e9fcaa8aSmrg  <row rowsep='0'>
4179e9fcaa8aSmrg    <entry role='functionargdecl'>
4180e9fcaa8aSmrgXkbDescPtr             <emphasis>
4181e9fcaa8aSmrgxkb</emphasis>
4182e9fcaa8aSmrg;            /* Xkb description to contain the result */
4183e9fcaa8aSmrg    </entry>
4184e9fcaa8aSmrg</row>
4185e9fcaa8aSmrg</tbody>
4186e9fcaa8aSmrg</tgroup>
4187e9fcaa8aSmrg</informaltable>
4188e9fcaa8aSmrg
4189e9fcaa8aSmrg<para>
4190e9fcaa8aSmrg<emphasis>
4191e9fcaa8aSmrgXkbGetKeyBehaviors</emphasis>
4192e9fcaa8aSmrg sends a request to the server to obtain the behaviors for <emphasis>
4193e9fcaa8aSmrgnum</emphasis>
4194e9fcaa8aSmrg keys on the keyboard starting with the key whose keycode is <emphasis>
4195e9fcaa8aSmrgfirst</emphasis>
4196e9fcaa8aSmrg. It waits for a reply and returns the behaviors in the <emphasis>
4197e9fcaa8aSmrgserver</emphasis>
4198e9fcaa8aSmrg-&gt;<emphasis>
4199e9fcaa8aSmrgbehaviors</emphasis>
4200e9fcaa8aSmrg field of <emphasis>
4201e9fcaa8aSmrgxkb</emphasis>
4202e9fcaa8aSmrg. If successful, <emphasis>
4203e9fcaa8aSmrgXkbGetKeyBehaviors</emphasis>
4204e9fcaa8aSmrg returns <emphasis>
4205e9fcaa8aSmrgSuccess</emphasis>
4206e9fcaa8aSmrg.
4207e9fcaa8aSmrg</para>
4208e9fcaa8aSmrg
4209e9fcaa8aSmrg
4210e9fcaa8aSmrg<para>
4211e9fcaa8aSmrgIf the <emphasis>
4212e9fcaa8aSmrgserver</emphasis>
4213e9fcaa8aSmrg map in the <emphasis>
4214e9fcaa8aSmrgxkb</emphasis>
4215e9fcaa8aSmrg parameter has not been allocated, <emphasis>
4216e9fcaa8aSmrgXkbGetKeyBehaviors</emphasis>
4217e9fcaa8aSmrg allocates and initializes it before obtaining the actions.
4218e9fcaa8aSmrg</para>
4219e9fcaa8aSmrg
4220e9fcaa8aSmrg
4221e9fcaa8aSmrg<para>
4222e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
4223e9fcaa8aSmrghas not been properly initialized, <emphasis>
4224e9fcaa8aSmrgXkbGetKeyBehaviors</emphasis>
4225e9fcaa8aSmrg returns <emphasis>
4226e9fcaa8aSmrgBadAccess</emphasis>
4227e9fcaa8aSmrg. If <emphasis>
4228e9fcaa8aSmrgnum</emphasis>
4229e9fcaa8aSmrg is less than 1 or greater than <emphasis>
4230e9fcaa8aSmrgXkbMaxKeyCount</emphasis>
4231e9fcaa8aSmrg, <emphasis>
4232e9fcaa8aSmrgXkbGetKeyBehaviors</emphasis>
4233e9fcaa8aSmrg returns <emphasis>
4234e9fcaa8aSmrgBadValue</emphasis>
4235e9fcaa8aSmrg. If any allocation errors occur, <emphasis>
4236e9fcaa8aSmrgXkbGetKeyBehaviors</emphasis>
4237e9fcaa8aSmrg returns <emphasis>
4238e9fcaa8aSmrgBadAlloc</emphasis>
4239e9fcaa8aSmrg.
4240e9fcaa8aSmrg</para>
4241e9fcaa8aSmrg
4242e9fcaa8aSmrg
4243e9fcaa8aSmrg</sect2>
4244e9fcaa8aSmrg</sect1>
4245e9fcaa8aSmrg<sect1 id='explicit_components_avoiding_automatic_remapping_by_the_server'>
4246e9fcaa8aSmrg<title>Explicit Components—Avoiding Automatic Remapping by the Server</title>
4247e9fcaa8aSmrg
4248e9fcaa8aSmrg<para>
4249e9fcaa8aSmrgWhenever a client remaps the keyboard using core protocol requests, Xkb
4250e9fcaa8aSmrgexamines the map to determine likely default values for the components that
4251e9fcaa8aSmrgcannot be specified using the core protocol (see section 17.1.2 for more
4252e9fcaa8aSmrginformation on how Xkb chooses the default values).
4253e9fcaa8aSmrg</para>
4254e9fcaa8aSmrg
4255e9fcaa8aSmrg
4256e9fcaa8aSmrg<para>
4257e9fcaa8aSmrgThis automatic remapping might replace definitions explicitly requested by an
4258e9fcaa8aSmrgapplication, so the Xkb keyboard description defines an explicit components
4259e9fcaa8aSmrgmask for each key. Any aspects of the automatic remapping listed in the
4260e9fcaa8aSmrgexplicit components mask for a key are not changed by the automatic keyboard
4261e9fcaa8aSmrgmapping.
4262e9fcaa8aSmrg</para>
4263e9fcaa8aSmrg
4264e9fcaa8aSmrg
4265e9fcaa8aSmrg<para>
4266e9fcaa8aSmrgThe explicit components masks are held in the <emphasis>
4267e9fcaa8aSmrgexplicit</emphasis>
4268e9fcaa8aSmrg field of the server map, which is an array indexed by keycode. Each entry in
4269e9fcaa8aSmrgthis array is a mask that is a bitwise inclusive OR of the values shown in
4270e9fcaa8aSmrgTable 16.21.
4271e9fcaa8aSmrg</para>
4272e9fcaa8aSmrg
4273e9fcaa8aSmrg<table frame='none'>
4274e9fcaa8aSmrg<title>Explicit Component Masks</title>
4275e9fcaa8aSmrg<tgroup cols='3'>
4276e9fcaa8aSmrg<colspec colsep='0'/>
4277e9fcaa8aSmrg<colspec colsep='0'/>
4278e9fcaa8aSmrg<colspec colsep='0'/>
4279e9fcaa8aSmrg<thead>
4280e9fcaa8aSmrg<row rowsep='0'>
4281e9fcaa8aSmrg  <entry>Bit in Explicit Mask</entry>
4282e9fcaa8aSmrg  <entry>Value</entry>
4283e9fcaa8aSmrg  <entry>Protects Against</entry>
4284e9fcaa8aSmrg</row>
4285e9fcaa8aSmrg</thead>
4286e9fcaa8aSmrg<tbody>
4287e9fcaa8aSmrg  <row rowsep='0'>
4288e9fcaa8aSmrg    <entry><emphasis>ExplicitKeyType1</emphasis></entry>
4289e9fcaa8aSmrg    <entry>(1&lt;&lt;0)</entry>
4290e9fcaa8aSmrg    <entry>
4291e9fcaa8aSmrgAutomatic determination of the key type associated with <emphasis>
4292e9fcaa8aSmrgGroup1.</emphasis>
4293e9fcaa8aSmrg    </entry>
4294e9fcaa8aSmrg  </row>
4295e9fcaa8aSmrg  <row rowsep='0'>
4296e9fcaa8aSmrg    <entry><emphasis>ExplicitKeyType2</emphasis></entry>
4297e9fcaa8aSmrg    <entry>(1&lt;&lt;1)</entry>
4298e9fcaa8aSmrg    <entry>
4299e9fcaa8aSmrgAutomatic determination of the key type associated with <emphasis>
4300e9fcaa8aSmrgGroup2.</emphasis>
4301e9fcaa8aSmrg    </entry>
4302e9fcaa8aSmrg  </row>
4303e9fcaa8aSmrg  <row rowsep='0'>
4304e9fcaa8aSmrg    <entry><emphasis>ExplicitKeyType3</emphasis></entry>
4305e9fcaa8aSmrg    <entry>(1&lt;&lt;2)</entry>
4306e9fcaa8aSmrg    <entry>
4307e9fcaa8aSmrgAutomatic determination of the key type associated with <emphasis>
4308e9fcaa8aSmrgGroup3.</emphasis>
4309e9fcaa8aSmrg    </entry>
4310e9fcaa8aSmrg  </row>
4311e9fcaa8aSmrg  <row rowsep='0'>
4312e9fcaa8aSmrg    <entry><emphasis>ExplicitKeyType4</emphasis></entry>
4313e9fcaa8aSmrg    <entry>(1&lt;&lt;3)</entry>
4314e9fcaa8aSmrg    <entry>
4315e9fcaa8aSmrgAutomatic determination of the key type associated with <emphasis>
4316e9fcaa8aSmrgGroup4.</emphasis>
4317e9fcaa8aSmrg    </entry>
4318e9fcaa8aSmrg  </row>
4319e9fcaa8aSmrg  <row rowsep='0'>
4320e9fcaa8aSmrg    <entry><emphasis>ExplicitInterpret</emphasis></entry>
4321e9fcaa8aSmrg    <entry>(1&lt;&lt;4)</entry>
4322e9fcaa8aSmrg    <entry>
4323e9fcaa8aSmrgApplication of any of the fields of a symbol interpretation to the
4324e9fcaa8aSmrgkey in question.
4325e9fcaa8aSmrg    </entry>
4326e9fcaa8aSmrg  </row>
4327e9fcaa8aSmrg  <row rowsep='0'>
4328e9fcaa8aSmrg    <entry><emphasis>ExplicitAutoRepeat</emphasis></entry>
4329e9fcaa8aSmrg    <entry>(1&lt;&lt;5)</entry>
4330e9fcaa8aSmrg    <entry>Automatic determination of auto-repeat status for the key, as
4331e9fcaa8aSmrgspecified in a symbol interpretation.</entry>
4332e9fcaa8aSmrg  </row>
4333e9fcaa8aSmrg  <row rowsep='0'>
4334e9fcaa8aSmrg    <entry><emphasis>ExplicitBehavior</emphasis></entry>
4335e9fcaa8aSmrg    <entry>(1&lt;&lt;6)</entry>
4336e9fcaa8aSmrg    <entry>
4337e9fcaa8aSmrgAutomatic assignment of the <emphasis>
4338e9fcaa8aSmrgXkbKB_Lock</emphasis>
4339e9fcaa8aSmrg behavior to the key, if the <emphasis>
4340e9fcaa8aSmrgXkbSI_LockingKey</emphasis>
4341e9fcaa8aSmrg flag is set in a symbol interpretation.
4342e9fcaa8aSmrg    </entry>
4343e9fcaa8aSmrg  </row>
4344e9fcaa8aSmrg  <row rowsep='0'>
4345e9fcaa8aSmrg    <entry><emphasis>ExplicitVModMap</emphasis></entry>
4346e9fcaa8aSmrg    <entry>(1&lt;&lt;7)</entry>
4347e9fcaa8aSmrg    <entry>
4348e9fcaa8aSmrgAutomatic determination of the virtual modifier map for the key
4349e9fcaa8aSmrgbased on the actions assigned to the key and the symbol interpretations that
4350e9fcaa8aSmrgmatch the key.
4351e9fcaa8aSmrg    </entry>
4352e9fcaa8aSmrg  </row>
4353e9fcaa8aSmrg</tbody>
4354e9fcaa8aSmrg</tgroup>
4355e9fcaa8aSmrg</table>
4356e9fcaa8aSmrg
4357e9fcaa8aSmrg<sect2 id='obtaining_explicit_components_for_keys_from_the_server'>
4358e9fcaa8aSmrg<title>Obtaining Explicit Components for Keys from the Server</title>
4359e9fcaa8aSmrg
4360e9fcaa8aSmrg<para>
4361e9fcaa8aSmrgTo obtain the explicit components (the <emphasis>
4362e9fcaa8aSmrgexplicit</emphasis>
4363e9fcaa8aSmrg array) for a subset of the keys in a keyboard description, use <emphasis>
4364e9fcaa8aSmrgXkbGetKeyExplicitComponents</emphasis>.
4365e9fcaa8aSmrg</para>
4366e9fcaa8aSmrg
4367e9fcaa8aSmrg<informaltable frame='none'>
4368e9fcaa8aSmrg<tgroup cols='1'>
4369e9fcaa8aSmrg<colspec colsep='0'/>
4370e9fcaa8aSmrg<tbody>
4371e9fcaa8aSmrg  <row rowsep='0'>
4372e9fcaa8aSmrg    <entry role='functiondecl'>
4373e9fcaa8aSmrgStatus <emphasis>
4374e9fcaa8aSmrgXkbGetKeyExplicitComponents</emphasis>
4375e9fcaa8aSmrg(<emphasis>
4376e9fcaa8aSmrgdpy</emphasis>
4377e9fcaa8aSmrg,<emphasis>
4378e9fcaa8aSmrg first</emphasis>
4379e9fcaa8aSmrg,<emphasis>
4380e9fcaa8aSmrg num</emphasis>
4381e9fcaa8aSmrg,<emphasis>
4382e9fcaa8aSmrg xkb</emphasis>
4383e9fcaa8aSmrg)
4384e9fcaa8aSmrg    </entry>
4385e9fcaa8aSmrg  </row>
4386e9fcaa8aSmrg  <row rowsep='0'>
4387e9fcaa8aSmrg    <entry role='functionargdecl'>
4388e9fcaa8aSmrgDisplay *<emphasis>
4389e9fcaa8aSmrg            dpy</emphasis>
4390e9fcaa8aSmrg;            /* connection to server */
4391e9fcaa8aSmrg    </entry>
4392e9fcaa8aSmrg  </row>
4393e9fcaa8aSmrg  <row rowsep='0'>
4394e9fcaa8aSmrg    <entry role='functionargdecl'>
4395e9fcaa8aSmrgunsigned int            <emphasis>
4396e9fcaa8aSmrgfirst</emphasis>
4397e9fcaa8aSmrg;            /* keycode of first key to fetch */
4398e9fcaa8aSmrg    </entry>
4399e9fcaa8aSmrg  </row>
4400e9fcaa8aSmrg  <row rowsep='0'>
4401e9fcaa8aSmrg    <entry role='functionargdecl'>
4402e9fcaa8aSmrgunsigned int            <emphasis>
4403e9fcaa8aSmrgnum</emphasis>
4404e9fcaa8aSmrg;            /* number of keys for which to get explicit info */
4405e9fcaa8aSmrg    </entry>
4406e9fcaa8aSmrg  </row>
4407e9fcaa8aSmrg  <row rowsep='0'>
4408e9fcaa8aSmrg    <entry role='functionargdecl'>
4409e9fcaa8aSmrgXkbDescPtr             <emphasis>
4410e9fcaa8aSmrgxkb</emphasis>
4411e9fcaa8aSmrg;            /* Xkb description in which to put results */
4412e9fcaa8aSmrg    </entry>
4413e9fcaa8aSmrg</row>
4414e9fcaa8aSmrg</tbody>
4415e9fcaa8aSmrg</tgroup>
4416e9fcaa8aSmrg</informaltable>
4417e9fcaa8aSmrg
4418e9fcaa8aSmrg<para>
4419e9fcaa8aSmrg<emphasis>
4420e9fcaa8aSmrgXkbGetKeyExplicitComponents</emphasis>
4421e9fcaa8aSmrg sends a request to the server to obtain the explicit components for <emphasis>
4422e9fcaa8aSmrgnum</emphasis>
4423e9fcaa8aSmrg keys on the keyboard starting with key <emphasis>
4424e9fcaa8aSmrgfirst</emphasis>
4425e9fcaa8aSmrg. It waits for a reply and returns the explicit components in the <emphasis>
4426e9fcaa8aSmrgserver</emphasis>
4427e9fcaa8aSmrg-&gt;<emphasis>
4428e9fcaa8aSmrgexplicit</emphasis>
4429e9fcaa8aSmrg array of <emphasis>
4430e9fcaa8aSmrgxkb</emphasis>
4431e9fcaa8aSmrg. If successful, <emphasis>
4432e9fcaa8aSmrgXkbGetKeyExplicitComponents</emphasis>
4433e9fcaa8aSmrg returns <emphasis>
4434e9fcaa8aSmrgSuccess</emphasis>
4435e9fcaa8aSmrg. The <emphasis>
4436e9fcaa8aSmrgxkb</emphasis>
4437e9fcaa8aSmrg parameter must be a pointer to a valid Xkb keyboard description.
4438e9fcaa8aSmrg</para>
4439e9fcaa8aSmrg
4440e9fcaa8aSmrg
4441e9fcaa8aSmrg<para>
4442e9fcaa8aSmrgIf the <emphasis>
4443e9fcaa8aSmrgserver</emphasis>
4444e9fcaa8aSmrg map in the <emphasis>
4445e9fcaa8aSmrgxkb</emphasis>
4446e9fcaa8aSmrg parameter has not been allocated, <emphasis>
4447e9fcaa8aSmrgXkbGetKeyExplicitComponents</emphasis>
4448e9fcaa8aSmrg allocates and initializes it before obtaining the actions.
4449e9fcaa8aSmrg</para>
4450e9fcaa8aSmrg
4451e9fcaa8aSmrg
4452e9fcaa8aSmrg<para>
4453e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
4454e9fcaa8aSmrghas not been properly initialized, <emphasis>
4455e9fcaa8aSmrgXkbGetKeyExplicitComponents</emphasis>
4456e9fcaa8aSmrg returns <emphasis>
4457e9fcaa8aSmrgBadMatch</emphasis>
4458e9fcaa8aSmrg. If <emphasis>
4459e9fcaa8aSmrgnum</emphasis>
4460e9fcaa8aSmrg is less than 1 or greater than <emphasis>
4461e9fcaa8aSmrgXkbMaxKeyCount</emphasis>
4462e9fcaa8aSmrg, <emphasis>
4463e9fcaa8aSmrgXkbGetKeyExplicitComponents</emphasis>
4464e9fcaa8aSmrg returns <emphasis>
4465e9fcaa8aSmrgBadValue</emphasis>
4466e9fcaa8aSmrg. If any allocation errors occur, <emphasis>
4467e9fcaa8aSmrgXkbGetKeyExplicitComponents</emphasis>
4468e9fcaa8aSmrg returns <emphasis>
4469e9fcaa8aSmrgBadAlloc</emphasis>
4470e9fcaa8aSmrg.
4471e9fcaa8aSmrg</para>
4472e9fcaa8aSmrg
4473e9fcaa8aSmrg
4474e9fcaa8aSmrg</sect2>
4475e9fcaa8aSmrg</sect1>
4476e9fcaa8aSmrg<sect1 id='virtual_modifier_mapping'>
4477e9fcaa8aSmrg<title>Virtual Modifier Mapping</title>
4478e9fcaa8aSmrg
4479e9fcaa8aSmrg<para>
4480e9fcaa8aSmrgThe <emphasis>
4481e9fcaa8aSmrgvmods</emphasis>
4482e9fcaa8aSmrg member of the server map is a fixed-length array containing <emphasis>
4483e9fcaa8aSmrgXkbNumVirtualMods</emphasis>
4484e9fcaa8aSmrg entries. Each entry corresponds to a virtual modifier and provides the binding
4485e9fcaa8aSmrgof the virtual modifier to the real modifier bits. Each entry in the <emphasis>
4486e9fcaa8aSmrgvmods</emphasis>
4487e9fcaa8aSmrg array is a bitwise inclusive OR of the legal modifier masks:
4488e9fcaa8aSmrg</para>
4489e9fcaa8aSmrg
4490e9fcaa8aSmrg<literallayout>
4491e9fcaa8aSmrg     <emphasis>ShiftMask</emphasis>
4492e9fcaa8aSmrg     <emphasis>LockMask</emphasis>
4493e9fcaa8aSmrg     <emphasis>ControlMask</emphasis>
4494e9fcaa8aSmrg     <emphasis>Mod1Mask</emphasis>
4495e9fcaa8aSmrg     <emphasis>Mod2Mask</emphasis>
4496e9fcaa8aSmrg     <emphasis>Mod3Mask</emphasis>
4497e9fcaa8aSmrg     <emphasis>Mod4Mask</emphasis>
4498e9fcaa8aSmrg     <emphasis>Mod5Mask</emphasis>
4499e9fcaa8aSmrg</literallayout>
4500e9fcaa8aSmrg
4501e9fcaa8aSmrg<para>
4502e9fcaa8aSmrgThe <emphasis>
4503e9fcaa8aSmrgvmodmap</emphasis>
4504e9fcaa8aSmrg member of the server map is similar to the <emphasis>
4505e9fcaa8aSmrgmodmap</emphasis>
4506e9fcaa8aSmrg array of the client map (see section 15.4), but is used to define the virtual
4507e9fcaa8aSmrgmodifier mapping for each key. Like the <emphasis>
4508e9fcaa8aSmrgmodmap</emphasis>
4509e9fcaa8aSmrg member, it is indexed by keycode, and each entry is a mask representing the
4510e9fcaa8aSmrgvirtual modifiers bound to the corresponding key:
4511e9fcaa8aSmrg</para>
4512e9fcaa8aSmrg
4513e9fcaa8aSmrg<itemizedlist>
4514e9fcaa8aSmrg  <listitem>
4515e9fcaa8aSmrg    <para>
4516e9fcaa8aSmrgEach of the bits in a <emphasis>
4517e9fcaa8aSmrgvmodmap</emphasis>
4518e9fcaa8aSmrg entry represents an index into the <emphasis>
4519e9fcaa8aSmrgvmods</emphasis>
4520e9fcaa8aSmrg member. That is, bit 0 of a <emphasis>
4521e9fcaa8aSmrgvmodmap</emphasis>
4522e9fcaa8aSmrg entry refers to index 0 of the <emphasis>
4523e9fcaa8aSmrgvmods</emphasis>
4524e9fcaa8aSmrg array, bit 1 refers to index 1, and so on.
4525e9fcaa8aSmrg    </para>
4526e9fcaa8aSmrg  </listitem>
4527e9fcaa8aSmrg  <listitem>
4528e9fcaa8aSmrg    <para>
4529e9fcaa8aSmrgIf a bit is set in the <emphasis>
4530e9fcaa8aSmrgvmodmap</emphasis>
4531e9fcaa8aSmrg entry for a key, that key is bound to the corresponding virtual modifier in
4532e9fcaa8aSmrgthe <emphasis>
4533e9fcaa8aSmrgvmods</emphasis>
4534e9fcaa8aSmrg array.
4535e9fcaa8aSmrg    </para>
4536e9fcaa8aSmrg  </listitem>
4537e9fcaa8aSmrg</itemizedlist>
4538e9fcaa8aSmrg
4539e9fcaa8aSmrg<para>
4540e9fcaa8aSmrgThe <emphasis>
4541e9fcaa8aSmrgvmodmap</emphasis>
4542e9fcaa8aSmrg and <emphasis>
4543e9fcaa8aSmrgvmods</emphasis>
4544e9fcaa8aSmrg members of the server map are the "master" virtual modifier definitions. Xkb
4545e9fcaa8aSmrgautomatically propagates any changes to these fields to all other fields that
4546e9fcaa8aSmrguse virtual modifier mappings.
4547e9fcaa8aSmrg</para>
4548e9fcaa8aSmrg
4549e9fcaa8aSmrg
4550e9fcaa8aSmrg<para>
4551e9fcaa8aSmrgThe overall relationship of fields dealing with virtual modifiers in an Xkb
4552e9fcaa8aSmrgkeyboard description are shown in Figure 16.2.
4553e9fcaa8aSmrg</para>
4554e9fcaa8aSmrg
4555e9fcaa8aSmrg<mediaobject>
4556e9fcaa8aSmrg <imageobject> <imagedata format="SVG" fileref="XKBlib-17.svg"/>
4557e9fcaa8aSmrg </imageobject>
4558e9fcaa8aSmrg<caption>Virtual Modifier Relationships</caption>
4559e9fcaa8aSmrg</mediaobject>
4560e9fcaa8aSmrg
4561e9fcaa8aSmrg
4562e9fcaa8aSmrg
4563e9fcaa8aSmrg<!--
4564e9fcaa8aSmrg<H5 CLASS="Figure">
4565e9fcaa8aSmrgVirtual Modifier Relationships</H5>
4566e9fcaa8aSmrg-->
4567e9fcaa8aSmrg
4568e9fcaa8aSmrg<sect2 id='obtaining_virtual_modifier_bindings_from_the_server'>
4569e9fcaa8aSmrg<title>Obtaining Virtual Modifier Bindings from the Server</title>
4570e9fcaa8aSmrg
4571e9fcaa8aSmrg<para>
4572e9fcaa8aSmrgTo obtain a subset of the virtual modifier bindings (the <emphasis>
4573e9fcaa8aSmrgvmods</emphasis>
4574e9fcaa8aSmrg array) in a keyboard description, use <emphasis>
4575e9fcaa8aSmrgXkbGetVirtualMods</emphasis>
4576e9fcaa8aSmrg:
4577e9fcaa8aSmrg</para>
4578e9fcaa8aSmrg
4579e9fcaa8aSmrg<informaltable frame='none'>
4580e9fcaa8aSmrg<tgroup cols='1'>
4581e9fcaa8aSmrg<colspec colsep='0'/>
4582e9fcaa8aSmrg<tbody>
4583e9fcaa8aSmrg  <row rowsep='0'>
4584e9fcaa8aSmrg    <entry role='functiondecl'>
4585e9fcaa8aSmrgStatus <emphasis>
4586e9fcaa8aSmrgXkbGetVirtualMods</emphasis>
4587e9fcaa8aSmrg(<emphasis>
4588e9fcaa8aSmrgdpy</emphasis>
4589e9fcaa8aSmrg,<emphasis>
4590e9fcaa8aSmrg which</emphasis>
4591e9fcaa8aSmrg,<emphasis>
4592e9fcaa8aSmrg xkb</emphasis>
4593e9fcaa8aSmrg)
4594e9fcaa8aSmrg    </entry>
4595e9fcaa8aSmrg  </row>
4596e9fcaa8aSmrg  <row rowsep='0'>
4597e9fcaa8aSmrg    <entry role='functionargdecl'>
4598e9fcaa8aSmrgDisplay *<emphasis>
4599e9fcaa8aSmrg            dpy</emphasis>
4600e9fcaa8aSmrg;            /* connection to server */
4601e9fcaa8aSmrg    </entry>
4602e9fcaa8aSmrg  </row>
4603e9fcaa8aSmrg  <row rowsep='0'>
4604e9fcaa8aSmrg    <entry role='functionargdecl'>
4605e9fcaa8aSmrgunsigned int            <emphasis>
4606e9fcaa8aSmrgwhich</emphasis>
4607e9fcaa8aSmrg;            /* mask indicating virtual modifier bindings to get */
4608e9fcaa8aSmrg    </entry>
4609e9fcaa8aSmrg  </row>
4610e9fcaa8aSmrg  <row rowsep='0'>
4611e9fcaa8aSmrg    <entry role='functionargdecl'>
4612e9fcaa8aSmrgXkbDescPtr            <emphasis>
4613e9fcaa8aSmrgxkb</emphasis>
4614e9fcaa8aSmrg;            /* Xkb description where results will be placed */
4615e9fcaa8aSmrg    </entry>
4616e9fcaa8aSmrg</row>
4617e9fcaa8aSmrg</tbody>
4618e9fcaa8aSmrg</tgroup>
4619e9fcaa8aSmrg</informaltable>
4620e9fcaa8aSmrg
4621e9fcaa8aSmrg<para>
4622e9fcaa8aSmrg<emphasis>
4623e9fcaa8aSmrgXkbGetVirtualMods</emphasis>
4624e9fcaa8aSmrg sends a request to the server to obtain the <emphasis>
4625e9fcaa8aSmrgvmods</emphasis>
4626e9fcaa8aSmrg entries for the virtual modifiers specified in the mask, <emphasis>
4627e9fcaa8aSmrgwhich</emphasis>
4628e9fcaa8aSmrg, and waits for a reply. See section 7.1 for a description of how to determine
4629e9fcaa8aSmrgthe virtual modifier mask. For each bit set in <emphasis>
4630e9fcaa8aSmrgwhich</emphasis>
4631e9fcaa8aSmrg, <emphasis>
4632e9fcaa8aSmrgXkbGetVirtualMods</emphasis>
4633e9fcaa8aSmrg updates the corresponding virtual modifier definition in the <emphasis>
4634e9fcaa8aSmrgserver-&gt;vmods</emphasis>
4635e9fcaa8aSmrg array of <emphasis>
4636e9fcaa8aSmrgxkb</emphasis>
4637e9fcaa8aSmrg. The <emphasis>
4638e9fcaa8aSmrgxkb</emphasis>
4639e9fcaa8aSmrg parameter must be a pointer to a valid Xkb keyboard description. If
4640e9fcaa8aSmrgsuccessful, <emphasis>
4641e9fcaa8aSmrgXkbGetVirtualMods</emphasis>
4642e9fcaa8aSmrg returns <emphasis>
4643e9fcaa8aSmrgSuccess</emphasis>
4644e9fcaa8aSmrg.
4645e9fcaa8aSmrg</para>
4646e9fcaa8aSmrg
4647e9fcaa8aSmrg
4648e9fcaa8aSmrg<para>
4649e9fcaa8aSmrgIf the <emphasis>
4650e9fcaa8aSmrgserver</emphasis>
4651e9fcaa8aSmrg map has not been allocated in the <emphasis>
4652e9fcaa8aSmrgxkb</emphasis>
4653e9fcaa8aSmrg parameter, <emphasis>
4654e9fcaa8aSmrgXkbGetVirtualMods</emphasis>
4655e9fcaa8aSmrg allocates and initializes it before obtaining the virtual modifier bindings.
4656e9fcaa8aSmrg</para>
4657e9fcaa8aSmrg
4658e9fcaa8aSmrg
4659e9fcaa8aSmrg<para>
4660e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
4661e9fcaa8aSmrghas not been properly initialized, <emphasis>
4662e9fcaa8aSmrgXkbGetVirtualMods</emphasis>
4663e9fcaa8aSmrg returns <emphasis>
4664e9fcaa8aSmrgBadMatch</emphasis>
4665e9fcaa8aSmrg. Any errors in allocation cause <emphasis>
4666e9fcaa8aSmrgXkbGetVirtualMods </emphasis>
4667e9fcaa8aSmrgto return <emphasis>
4668e9fcaa8aSmrgBadAlloc</emphasis>.
4669e9fcaa8aSmrg</para>
4670e9fcaa8aSmrg
4671e9fcaa8aSmrg
4672e9fcaa8aSmrg</sect2>
4673e9fcaa8aSmrg<sect2 id='obtaining_per_key_virtual_modifier_mappings_from_the_server'>
4674e9fcaa8aSmrg<title>Obtaining Per-Key Virtual Modifier Mappings from the Server</title>
4675e9fcaa8aSmrg
4676e9fcaa8aSmrg<para>
4677e9fcaa8aSmrgTo obtain the virtual modifier map (the <emphasis>
4678e9fcaa8aSmrgvmodmap</emphasis>
4679e9fcaa8aSmrg array) for a subset of the keys in a keyboard description, use <emphasis>
4680e9fcaa8aSmrgXkbGetKeyVirtualModMap</emphasis>
4681e9fcaa8aSmrg:
4682e9fcaa8aSmrg</para>
4683e9fcaa8aSmrg
4684e9fcaa8aSmrg<informaltable frame='none'>
4685e9fcaa8aSmrg<tgroup cols='1'>
4686e9fcaa8aSmrg<colspec colsep='0'/>
4687e9fcaa8aSmrg<tbody>
4688e9fcaa8aSmrg  <row rowsep='0'>
4689e9fcaa8aSmrg    <entry role='functiondecl'>
4690e9fcaa8aSmrgStatus <emphasis>
4691e9fcaa8aSmrgXkbGetKeyVirtualModMap</emphasis>
4692e9fcaa8aSmrg(<emphasis>
4693e9fcaa8aSmrgdpy</emphasis>
4694e9fcaa8aSmrg,<emphasis>
4695e9fcaa8aSmrg first</emphasis>
4696e9fcaa8aSmrg,<emphasis>
4697e9fcaa8aSmrg num</emphasis>
4698e9fcaa8aSmrg,<emphasis>
4699e9fcaa8aSmrg xkb</emphasis>
4700e9fcaa8aSmrg)
4701e9fcaa8aSmrg    </entry>
4702e9fcaa8aSmrg  </row>
4703e9fcaa8aSmrg  <row rowsep='0'>
4704e9fcaa8aSmrg    <entry role='functionargdecl'>
4705e9fcaa8aSmrgDisplay *<emphasis>
4706e9fcaa8aSmrg            dpy</emphasis>
4707e9fcaa8aSmrg;            /* connection to server */
4708e9fcaa8aSmrg    </entry>
4709e9fcaa8aSmrg  </row>
4710e9fcaa8aSmrg  <row rowsep='0'>
4711e9fcaa8aSmrg    <entry role='functionargdecl'>
4712e9fcaa8aSmrgunsigned int            <emphasis>
4713e9fcaa8aSmrgfirst</emphasis>
4714e9fcaa8aSmrg;            /* keycode of first key to fetch */
4715e9fcaa8aSmrg    </entry>
4716e9fcaa8aSmrg  </row>
4717e9fcaa8aSmrg  <row rowsep='0'>
4718e9fcaa8aSmrg    <entry role='functionargdecl'>
4719e9fcaa8aSmrgunsigned int            <emphasis>
4720e9fcaa8aSmrgnum</emphasis>
4721e9fcaa8aSmrg;            /* # keys for which virtual mod maps are desired */
4722e9fcaa8aSmrg    </entry>
4723e9fcaa8aSmrg  </row>
4724e9fcaa8aSmrg  <row rowsep='0'>
4725e9fcaa8aSmrg    <entry role='functionargdecl'>
4726e9fcaa8aSmrgXkbDescPtr             <emphasis>
4727e9fcaa8aSmrgxkb</emphasis>
4728e9fcaa8aSmrg;            /* Xkb description where results will be placed */
4729e9fcaa8aSmrg    </entry>
4730e9fcaa8aSmrg</row>
4731e9fcaa8aSmrg</tbody>
4732e9fcaa8aSmrg</tgroup>
4733e9fcaa8aSmrg</informaltable>
4734e9fcaa8aSmrg
4735e9fcaa8aSmrg<para>
4736e9fcaa8aSmrg<emphasis>
4737e9fcaa8aSmrgXkbGetKeyVirutalModmap </emphasis>
4738e9fcaa8aSmrgsends a request to the server to obtain the virtual modifier mappings for
4739e9fcaa8aSmrg<emphasis>
4740e9fcaa8aSmrgnum</emphasis>
4741e9fcaa8aSmrg keys on the keyboard starting with key <emphasis>
4742e9fcaa8aSmrgfirst</emphasis>
4743e9fcaa8aSmrg. It waits for a reply and returns the virtual modifier mappings in the
4744e9fcaa8aSmrg<emphasis>
4745e9fcaa8aSmrgserver</emphasis>
4746e9fcaa8aSmrg-&gt;<emphasis>
4747e9fcaa8aSmrgvmodmap</emphasis>
4748e9fcaa8aSmrg array of <emphasis>
4749e9fcaa8aSmrgxkb</emphasis>
4750e9fcaa8aSmrg. If successful, <emphasis>
4751e9fcaa8aSmrgXkbGetKeyVirtualModMap</emphasis>
4752e9fcaa8aSmrg returns <emphasis>
4753e9fcaa8aSmrgSuccess</emphasis>
4754e9fcaa8aSmrg. The <emphasis>
4755e9fcaa8aSmrgxkb</emphasis>
4756e9fcaa8aSmrg parameter must be a pointer to a valid Xkb keyboard description
4757e9fcaa8aSmrg</para>
4758e9fcaa8aSmrg
4759e9fcaa8aSmrg
4760e9fcaa8aSmrg<para>
4761e9fcaa8aSmrgIf the <emphasis>
4762e9fcaa8aSmrgserver</emphasis>
4763e9fcaa8aSmrg map in the <emphasis>
4764e9fcaa8aSmrgxkb</emphasis>
4765e9fcaa8aSmrg parameter has not been allocated, <emphasis>
4766e9fcaa8aSmrgXkbGetKeyVirtualModMap</emphasis>
4767e9fcaa8aSmrg allocates and initializes it before obtaining the virtual modifier mappings.
4768e9fcaa8aSmrg</para>
4769e9fcaa8aSmrg
4770e9fcaa8aSmrg
4771e9fcaa8aSmrg<para>
4772e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
4773e9fcaa8aSmrghas not been properly initialized, <emphasis>
4774e9fcaa8aSmrgXkbGetKeyVirtualModMap</emphasis>
4775e9fcaa8aSmrg returns <emphasis>
4776e9fcaa8aSmrgBadMatch</emphasis>
4777e9fcaa8aSmrg. If <emphasis>
4778e9fcaa8aSmrgnum</emphasis>
4779e9fcaa8aSmrg is less than 1 or greater than <emphasis>
4780e9fcaa8aSmrgXkbMaxKeyCount</emphasis>
4781e9fcaa8aSmrg, <emphasis>
4782e9fcaa8aSmrgXkbGetKeyVirtualModMap</emphasis>
4783e9fcaa8aSmrg returns <emphasis>
4784e9fcaa8aSmrgBadValue</emphasis>
4785e9fcaa8aSmrg. If any allocation errors occur, <emphasis>
4786e9fcaa8aSmrgXkbGetKeyVirtualModMap</emphasis>
4787e9fcaa8aSmrg returns <emphasis>
4788e9fcaa8aSmrgBadAlloc</emphasis>
4789e9fcaa8aSmrg.
4790e9fcaa8aSmrg</para>
4791e9fcaa8aSmrg
4792e9fcaa8aSmrg</sect2>
4793e9fcaa8aSmrg</sect1>
4794e9fcaa8aSmrg</chapter>
4795