ch05.xml revision e9fcaa8a
1e9fcaa8aSmrg<chapter id='keyboard_state'>
2e9fcaa8aSmrg<title>Keyboard State</title>
3e9fcaa8aSmrg
4e9fcaa8aSmrg<para>
5e9fcaa8aSmrgKeyboard state encompasses all of the transitory information necessary to map a physical key press or release to an appropriate event. The Xkb keyboard state consists of primitive components and additional derived components that are maintained for efficiency reasons. Figure 5.1 shows the components of Xkb keyboard state and their relationships.
6e9fcaa8aSmrg</para>
7e9fcaa8aSmrg
8e9fcaa8aSmrg<mediaobject>
9e9fcaa8aSmrg<!-- <title>Keyboard State Description</title> -->
10e9fcaa8aSmrg <imageobject> <imagedata format="SVG" fileref="XKBlib-2.svg"/>
11e9fcaa8aSmrg </imageobject>
12e9fcaa8aSmrg<caption>Xkb State</caption>
13e9fcaa8aSmrg</mediaobject>
14e9fcaa8aSmrg
15e9fcaa8aSmrg
16e9fcaa8aSmrg<sect1 id='keyboard_state_description'>
17e9fcaa8aSmrg<title>Keyboard State Description</title>
18e9fcaa8aSmrg<para>
19e9fcaa8aSmrgThe Xkb keyboard state is comprised of the state of all keyboard modifiers, the keyboard group, and the state of the pointer buttons. These are grouped into the following components:
20e9fcaa8aSmrg</para>
21e9fcaa8aSmrg
22e9fcaa8aSmrg<itemizedlist>
23e9fcaa8aSmrg<listitem>
24e9fcaa8aSmrg  <para>
25e9fcaa8aSmrgThe locked group and locked modifiers
26e9fcaa8aSmrg  </para>
27e9fcaa8aSmrg</listitem>
28e9fcaa8aSmrg<listitem>
29e9fcaa8aSmrg  <para>
30e9fcaa8aSmrgThe latched group and latched modifiers
31e9fcaa8aSmrg  </para>
32e9fcaa8aSmrg</listitem>
33e9fcaa8aSmrg<listitem>
34e9fcaa8aSmrg  <para>
35e9fcaa8aSmrgThe base group and base modifiers
36e9fcaa8aSmrg  </para>
37e9fcaa8aSmrg</listitem>
38e9fcaa8aSmrg<listitem>
39e9fcaa8aSmrg  <para>
40e9fcaa8aSmrgThe effective group and effective modifiers
41e9fcaa8aSmrg  </para>
42e9fcaa8aSmrg</listitem>
43e9fcaa8aSmrg<listitem>
44e9fcaa8aSmrg  <para>
45e9fcaa8aSmrgThe state of the core pointer buttons
46e9fcaa8aSmrg  </para>
47e9fcaa8aSmrg</listitem>
48e9fcaa8aSmrg</itemizedlist>
49e9fcaa8aSmrg
50e9fcaa8aSmrg<para>
51e9fcaa8aSmrgThe <emphasis>
52e9fcaa8aSmrgmodifiers</emphasis>
53e9fcaa8aSmrg are <emphasis>
54e9fcaa8aSmrgShift</emphasis>
55e9fcaa8aSmrg, <emphasis>
56e9fcaa8aSmrgLock</emphasis>
57e9fcaa8aSmrg, <emphasis>
58e9fcaa8aSmrgControl</emphasis>
59e9fcaa8aSmrg, and <emphasis>
60e9fcaa8aSmrgMod1</emphasis>
61e9fcaa8aSmrg-<emphasis>
62e9fcaa8aSmrgMod5</emphasis>
63e9fcaa8aSmrg, as defined by the core protocol. A modifier can be thought of as a toggle that is either set or unset. All modifiers are initially unset. When a modifier is locked, it is set and remains set for all future key events, until it is explicitly unset. A latched modifier is set, but automatically unsets after the next key event that does not change the keyboard state. Locked and latched modifier state can be changed by keyboard activity or via Xkb extension library functions.
64e9fcaa8aSmrg</para>
65e9fcaa8aSmrg
66e9fcaa8aSmrg
67e9fcaa8aSmrg<para>
68e9fcaa8aSmrgThe Xkb extension provides support for <emphasis>
69e9fcaa8aSmrgkeysym</emphasis>
70e9fcaa8aSmrg <emphasis>
71e9fcaa8aSmrggroups</emphasis>
72e9fcaa8aSmrg, as defined by ISO9995:
73e9fcaa8aSmrg</para>
74e9fcaa8aSmrg
75e9fcaa8aSmrg
76e9fcaa8aSmrg<variablelist>
77e9fcaa8aSmrg  <varlistentry>
78e9fcaa8aSmrg    <term>Group</term>
79e9fcaa8aSmrg    <listitem>
80e9fcaa8aSmrg      <para>
81e9fcaa8aSmrgA logical state of a keyboard providing access to a collection of characters.
82e9fcaa8aSmrgA group usually contains a set of characters that logically belong together
83e9fcaa8aSmrgand that may be arranged on several shift levels within that group.
84e9fcaa8aSmrg      </para>
85e9fcaa8aSmrg    </listitem>
86e9fcaa8aSmrg  </varlistentry>
87e9fcaa8aSmrg</variablelist>
88e9fcaa8aSmrg
89e9fcaa8aSmrg
90e9fcaa8aSmrg
91e9fcaa8aSmrg<para>
92e9fcaa8aSmrgThe Xkb extension supports up to four keysym groups. Groups are named beginning with one and indexed beginning with zero. All group states are indicated using the group index. At any point in time, there is zero or one locked group, zero or one latched group, and one base group. When a group is locked, it supersedes any previous locked group and remains the locked group for all future key events, until a new group is locked. A latched group applies only to the next key event that does not change the keyboard state. The locked and latched group can be changed by keyboard activity or via Xkb extension library functions.
93e9fcaa8aSmrg</para>
94e9fcaa8aSmrg
95e9fcaa8aSmrg
96e9fcaa8aSmrg<para>
97e9fcaa8aSmrgChanging to a different group changes the keyboard state to produce characters from a different group. Groups are typically used to switch between keysyms of different languages and locales.
98e9fcaa8aSmrg</para>
99e9fcaa8aSmrg
100e9fcaa8aSmrg
101e9fcaa8aSmrg<para>
102e9fcaa8aSmrgThe <emphasis>
103e9fcaa8aSmrgpointer buttons</emphasis>
104e9fcaa8aSmrg are <emphasis>
105e9fcaa8aSmrgButton1</emphasis>
106e9fcaa8aSmrg - <emphasis>
107e9fcaa8aSmrgButton5</emphasis>
108e9fcaa8aSmrg, as defined by the core protocol.
109e9fcaa8aSmrg</para>
110e9fcaa8aSmrg
111e9fcaa8aSmrg
112e9fcaa8aSmrg<para>
113e9fcaa8aSmrgThe <emphasis>
114e9fcaa8aSmrgbase group</emphasis>
115e9fcaa8aSmrg and <emphasis>
116e9fcaa8aSmrgbase modifiers</emphasis>
117e9fcaa8aSmrg represent keys that are physically or logically down. These
118e9fcaa8aSmrgand the pointer buttons can be changed by keyboard activity and
119e9fcaa8aSmrgnot by Xkb requests. It is possible for a key to be logically
120e9fcaa8aSmrgdown, but not physically down, and neither latched nor locked.
121e9fcaa8aSmrg<footnote><para>
122e9fcaa8aSmrgKeys may be logically down when they are physically up because
123e9fcaa8aSmrgof their electrical properties or because of the keyboard extension
124e9fcaa8aSmrgin the X server having filtered the key release, for esoteric reasons.
125e9fcaa8aSmrg</para></footnote>
126e9fcaa8aSmrg
127e9fcaa8aSmrg</para>
128e9fcaa8aSmrg
129e9fcaa8aSmrg
130e9fcaa8aSmrg<para>
131e9fcaa8aSmrgThe <emphasis>
132e9fcaa8aSmrgeffective modifiers</emphasis>
133e9fcaa8aSmrg are the bitwise union of the locked, latched, and the base modifiers.
134e9fcaa8aSmrg</para>
135e9fcaa8aSmrg
136e9fcaa8aSmrg
137e9fcaa8aSmrg<para>
138e9fcaa8aSmrgThe <emphasis>
139e9fcaa8aSmrgeffective group</emphasis>
140e9fcaa8aSmrg is the arithmetic sum of the group indices of the latched group, locked group, and base group, which is then normalized by some function. The result is a meaningful group index.
141e9fcaa8aSmrg</para>
142e9fcaa8aSmrg
143e9fcaa8aSmrg<simplelist type='vert' columns='1'>
144e9fcaa8aSmrg<member>
145e9fcaa8aSmrgn = number of keyboard groups, 1&lt;= n &lt;= 4
146e9fcaa8aSmrg</member>
147e9fcaa8aSmrg
148e9fcaa8aSmrg<member>
149e9fcaa8aSmrg0 &lt;= any of locked, latched, or base group &lt; n
150e9fcaa8aSmrg</member>
151e9fcaa8aSmrg
152e9fcaa8aSmrg<member>
153e9fcaa8aSmrgeffective group = f(locked group + latched group + base group)
154e9fcaa8aSmrg</member>
155e9fcaa8aSmrg</simplelist>
156e9fcaa8aSmrg
157e9fcaa8aSmrg<para>
158e9fcaa8aSmrgThe function f ensures that the effective group is within range. The precise function is specified for the keyboard and can be retrieved through the keyboard description. It may wrap around, clamp down, or default. Few applications will actually examine the effective group, and far fewer still will examine the locked, latched, and base groups.
159e9fcaa8aSmrg</para>
160e9fcaa8aSmrg
161e9fcaa8aSmrg
162e9fcaa8aSmrg<para>
163e9fcaa8aSmrgThere are two circumstances under which groups are normalized:
164e9fcaa8aSmrg</para>
165e9fcaa8aSmrg
166e9fcaa8aSmrg<orderedlist>
167e9fcaa8aSmrg  <listitem><para>
168e9fcaa8aSmrgThe global locked or effective group changes. In this case, the changed group is normalized into range according to the settings of the <emphasis>
169e9fcaa8aSmrggroups_wrap</emphasis>
170e9fcaa8aSmrg field of the <emphasis>
171e9fcaa8aSmrgXkbControlsRec</emphasis>
172e9fcaa8aSmrg structure for the keyboard (see section 10.7.1). <!-- xref -->
173e9fcaa8aSmrg  </para></listitem>
174e9fcaa8aSmrg  <listitem><para>
175e9fcaa8aSmrg
176e9fcaa8aSmrgThe Xkb library is interpreting an event with an effective group that is legal for the keyboard as a whole, but not for the key in question. In this case, the group to use for this event only is determined using the <emphasis>
177e9fcaa8aSmrggroup_info</emphasis>
178e9fcaa8aSmrg field of the key symbol mapping (<emphasis>
179e9fcaa8aSmrgXkbSymMapRec</emphasis>
180e9fcaa8aSmrg) for the event key.
181e9fcaa8aSmrg  </para></listitem>
182e9fcaa8aSmrg</orderedlist>
183e9fcaa8aSmrg
184e9fcaa8aSmrg<para>
185e9fcaa8aSmrgEach nonmodifier key on a keyboard has zero or more symbols, or keysyms, associated with it. These are the logical symbols that the key can generate when it is pressed. The set of all possible keysyms for a keyboard is divided into groups. Each key is associated with zero or more groups; each group contains one or more symbols. When a key is pressed, the determination of which symbol for the key is selected is based on the effective group and the shift level, which is determined by which modifiers are set.
186e9fcaa8aSmrg</para>
187e9fcaa8aSmrg
188e9fcaa8aSmrg
189e9fcaa8aSmrg<para>
190e9fcaa8aSmrgA client that does not explicitly call Xkb functions, but that otherwise makes use of an X library containing the Xkb extension, will have keyboard state represented in bits 0 - 14 of the state field of events that report modifier and button state. Such a client is said to be <emphasis>
191e9fcaa8aSmrgXkb-capable</emphasis>
192e9fcaa8aSmrg. A client that does explicitly call Xkb functions is an <emphasis>
193e9fcaa8aSmrgXkb-aware</emphasis>
194e9fcaa8aSmrg client. The Xkb keyboard state includes information derived from the effective state and from two server parameters that can be set through the keyboard extension. The following components of keyboard state pertain to Xkb-capable and Xkb-aware clients:
195e9fcaa8aSmrg</para>
196e9fcaa8aSmrg
197e9fcaa8aSmrg<itemizedlist>
198e9fcaa8aSmrg<listitem>
199e9fcaa8aSmrg  <para>
200e9fcaa8aSmrglookup state: lookup group and lookup modifiers
201e9fcaa8aSmrg  </para>
202e9fcaa8aSmrg</listitem>
203e9fcaa8aSmrg<listitem>
204e9fcaa8aSmrg  <para>
205e9fcaa8aSmrggrab state: grab group and grab modifiers
206e9fcaa8aSmrg  </para>
207e9fcaa8aSmrg</listitem>
208e9fcaa8aSmrg</itemizedlist>
209e9fcaa8aSmrg
210e9fcaa8aSmrg<para>
211e9fcaa8aSmrgThe <emphasis>
212e9fcaa8aSmrglookup modifiers</emphasis>
213e9fcaa8aSmrg and <emphasis>
214e9fcaa8aSmrglookup group</emphasis>
215e9fcaa8aSmrg are represented in the state field of core X events. The modifier state and keycode of a key event are used to determine the symbols associated with the event. For <emphasis>
216e9fcaa8aSmrgKeyPress</emphasis>
217e9fcaa8aSmrg and <emphasis>
218e9fcaa8aSmrgKeyRelease</emphasis>
219e9fcaa8aSmrg events, the lookup modifiers are computed as:
220e9fcaa8aSmrg</para>
221e9fcaa8aSmrg
222e9fcaa8aSmrg<literallayout>
223e9fcaa8aSmrg   ((base | latched | locked) &amp; ~<emphasis> server_internal_modifiers</emphasis>)
224e9fcaa8aSmrg</literallayout>
225e9fcaa8aSmrg
226e9fcaa8aSmrg<para>
227e9fcaa8aSmrgOtherwise the lookup modifiers are computed as:
228e9fcaa8aSmrg</para>
229e9fcaa8aSmrg
230e9fcaa8aSmrg<literallayout>
231e9fcaa8aSmrg(((base | latched | (locked &amp; ~<emphasis> ignore_locks</emphasis>)) &amp; ~<emphasis> server_internal_modifiers</emphasis>)
232e9fcaa8aSmrg</literallayout>
233e9fcaa8aSmrg
234e9fcaa8aSmrg<para>
235e9fcaa8aSmrgThe lookup group is the same as the effective group.
236e9fcaa8aSmrg</para>
237e9fcaa8aSmrg
238e9fcaa8aSmrg
239e9fcaa8aSmrg<para>
240e9fcaa8aSmrgWhen an Xkb-capable or Xkb-aware client wishes to map a keycode to a keysym, it should use the <emphasis>
241e9fcaa8aSmrglookup state</emphasis>
242e9fcaa8aSmrg — the lookup group and the lookup modifiers.
243e9fcaa8aSmrg</para>
244e9fcaa8aSmrg
245e9fcaa8aSmrg
246e9fcaa8aSmrg<para>
247e9fcaa8aSmrgThe <emphasis>
248e9fcaa8aSmrggrab state</emphasis>
249e9fcaa8aSmrg is the state used when matching events to passive grabs. If the event activates a grab, the <emphasis>
250e9fcaa8aSmrggrab modifiers</emphasis>
251e9fcaa8aSmrg and <emphasis>
252e9fcaa8aSmrggrab group</emphasis>
253e9fcaa8aSmrg are represented in the state field of core X events; otherwise, the lookup state is used. The grab modifiers are computed as:
254e9fcaa8aSmrg</para>
255e9fcaa8aSmrg
256e9fcaa8aSmrg<literallayout>
257e9fcaa8aSmrg(((base | latched | (locked &amp; ~ignore_locks)) &amp; ~server_internal_modifiers)
258e9fcaa8aSmrg</literallayout>
259e9fcaa8aSmrg
260e9fcaa8aSmrg<para>
261e9fcaa8aSmrgIf the server’s <emphasis>
262e9fcaa8aSmrgIgnoreGroupLock</emphasis>
263e9fcaa8aSmrg control (see section 10.7.3) is not set, the grab group is the same as the effective group. Otherwise, the grab group is computed from the base group and latched group, ignoring the locked group.
264e9fcaa8aSmrg</para>
265e9fcaa8aSmrg
266e9fcaa8aSmrg
267e9fcaa8aSmrg<para>
268e9fcaa8aSmrgThe final three components of Xkb state are applicable to clients that are not linked with an Xlib containing the X keyboard extension library and therefore are not aware of the keyboard extension (<emphasis>
269e9fcaa8aSmrgXkb-unaware </emphasis>
270e9fcaa8aSmrgclients):
271e9fcaa8aSmrg</para>
272e9fcaa8aSmrg
273e9fcaa8aSmrg<itemizedlist>
274e9fcaa8aSmrg<listitem>
275e9fcaa8aSmrg  <para>
276e9fcaa8aSmrgThe compatibility modifier state
277e9fcaa8aSmrg  </para>
278e9fcaa8aSmrg</listitem>
279e9fcaa8aSmrg<listitem>
280e9fcaa8aSmrg  <para>
281e9fcaa8aSmrgThe compatibility lookup modifier state
282e9fcaa8aSmrg  </para>
283e9fcaa8aSmrg</listitem>
284e9fcaa8aSmrg<listitem>
285e9fcaa8aSmrg  <para>
286e9fcaa8aSmrgThe compatibility grab modifier state
287e9fcaa8aSmrg  </para>
288e9fcaa8aSmrg</listitem>
289e9fcaa8aSmrg</itemizedlist>
290e9fcaa8aSmrg
291e9fcaa8aSmrg<para>
292e9fcaa8aSmrgThe X11 protocol interpretation of modifiers does not include direct support for multiple groups. When an Xkb-extended X server connects to an Xkb-unaware client, the compatibility states remap the keyboard group into a core modifier whenever possible. The compatibility state corresponds to the effective modifier and effective group state, with the group remapped to a modifier. The compatibility lookup and grab states correspond to the lookup and grab states, respectively, with the group remapped to a modifier. The compatibility lookup state is reported in events that do not trigger passive grabs; otherwise, the compatibility grab state is reported.
293e9fcaa8aSmrg</para>
294e9fcaa8aSmrg
295e9fcaa8aSmrg
296e9fcaa8aSmrg</sect1>
297e9fcaa8aSmrg<sect1 id='changing_the_keyboard_state'>
298e9fcaa8aSmrg<title>Changing the Keyboard State</title>
299e9fcaa8aSmrg
300e9fcaa8aSmrg<sect2 id='changing_modifiers'>
301e9fcaa8aSmrg<title>Changing Modifiers</title>
302e9fcaa8aSmrg
303e9fcaa8aSmrg<para>
304e9fcaa8aSmrgThe functions in this section that change the use of modifiers use a mask in the parameter <emphasis>
305e9fcaa8aSmrgaffect</emphasis>
306e9fcaa8aSmrg. It is a bitwise inclusive OR of the legal modifier masks:
307e9fcaa8aSmrg</para>
308e9fcaa8aSmrg
309e9fcaa8aSmrg<table frame='none'>
310e9fcaa8aSmrg<title>Real Modifier Masks</title>
311e9fcaa8aSmrg<tgroup cols='1'>
312e9fcaa8aSmrg<colspec colsep='0'/>
313e9fcaa8aSmrg<tbody>
314e9fcaa8aSmrg  <row rowsep='1'>
315e9fcaa8aSmrg    <entry>Mask</entry>
316e9fcaa8aSmrg  </row>
317e9fcaa8aSmrg  <row rowsep='0'>
318e9fcaa8aSmrg    <entry>ShiftMask</entry>
319e9fcaa8aSmrg  </row>
320e9fcaa8aSmrg  <row rowsep='0'>
321e9fcaa8aSmrg    <entry>LockMask</entry>
322e9fcaa8aSmrg  </row>
323e9fcaa8aSmrg  <row rowsep='0'>
324e9fcaa8aSmrg    <entry>ControlMask</entry>
325e9fcaa8aSmrg  </row>
326e9fcaa8aSmrg  <row rowsep='0'>
327e9fcaa8aSmrg    <entry>Mod1Mask</entry>
328e9fcaa8aSmrg  </row>
329e9fcaa8aSmrg  <row rowsep='0'>
330e9fcaa8aSmrg    <entry>Mod2Mask</entry>
331e9fcaa8aSmrg  </row>
332e9fcaa8aSmrg  <row rowsep='0'>
333e9fcaa8aSmrg    <entry>Mod3Mask</entry>
334e9fcaa8aSmrg  </row>
335e9fcaa8aSmrg  <row rowsep='0'>
336e9fcaa8aSmrg    <entry>Mod4Mask</entry>
337e9fcaa8aSmrg  </row>
338e9fcaa8aSmrg  <row rowsep='0'>
339e9fcaa8aSmrg    <entry>Mod5Mask</entry>
340e9fcaa8aSmrg  </row>
341e9fcaa8aSmrg</tbody>
342e9fcaa8aSmrg</tgroup>
343e9fcaa8aSmrg</table>
344e9fcaa8aSmrg
345e9fcaa8aSmrg<para>
346e9fcaa8aSmrgTo lock and unlock any of the eight real keyboard modifiers, use <emphasis>
347e9fcaa8aSmrgXkbLockModifiers:</emphasis>
348e9fcaa8aSmrg</para>
349e9fcaa8aSmrg
350e9fcaa8aSmrg<informaltable frame='none'>
351e9fcaa8aSmrg<tgroup cols='1'>
352e9fcaa8aSmrg<colspec colsep='0'/>
353e9fcaa8aSmrg<tbody>
354e9fcaa8aSmrg  <row rowsep='0'>
355e9fcaa8aSmrg    <entry role='functiondecl'>
356e9fcaa8aSmrgBool <emphasis> XkbLockModifiers</emphasis>
357e9fcaa8aSmrg(<emphasis>
358e9fcaa8aSmrgdisplay, device_spec, affect, values</emphasis>
359e9fcaa8aSmrg)
360e9fcaa8aSmrg    </entry>
361e9fcaa8aSmrg  </row>
362e9fcaa8aSmrg  <row rowsep='0'>
363e9fcaa8aSmrg    <entry role='functionargdecl'>
364e9fcaa8aSmrgDisplay *      <emphasis>
365e9fcaa8aSmrgdisplay</emphasis>
366e9fcaa8aSmrg;            /* connection to the X server */
367e9fcaa8aSmrg    </entry>
368e9fcaa8aSmrg  </row>
369e9fcaa8aSmrg  <row rowsep='0'>
370e9fcaa8aSmrg    <entry role='functionargdecl'>
371e9fcaa8aSmrgunsigned int      <emphasis>
372e9fcaa8aSmrgdevice_spec</emphasis>
373e9fcaa8aSmrg;            /* device ID, or <emphasis>
374e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
375e9fcaa8aSmrg */
376e9fcaa8aSmrg    </entry>
377e9fcaa8aSmrg  </row>
378e9fcaa8aSmrg  <row rowsep='0'>
379e9fcaa8aSmrg    <entry role='functionargdecl'>
380e9fcaa8aSmrgunsigned int<emphasis>
381e9fcaa8aSmrg      affect</emphasis>
382e9fcaa8aSmrg;            /* mask of real modifiers whose lock state is to change */
383e9fcaa8aSmrg    </entry>
384e9fcaa8aSmrg  </row>
385e9fcaa8aSmrg  <row rowsep='0'>
386e9fcaa8aSmrg    <entry role='functionargdecl'>
387e9fcaa8aSmrgunsigned int      <emphasis>
388e9fcaa8aSmrgvalues</emphasis>
389e9fcaa8aSmrg;            /* 1 =&gt; lock, 0 =&gt; unlock; only for modifiers selected by <emphasis>
390e9fcaa8aSmrgaffect</emphasis>
391e9fcaa8aSmrg */
392e9fcaa8aSmrg    </entry>
393e9fcaa8aSmrg</row>
394e9fcaa8aSmrg</tbody>
395e9fcaa8aSmrg</tgroup>
396e9fcaa8aSmrg</informaltable>
397e9fcaa8aSmrg
398e9fcaa8aSmrg<para>
399e9fcaa8aSmrg<emphasis>
400e9fcaa8aSmrgXkbLockModifiers</emphasis>
401e9fcaa8aSmrg sends a request to the server to lock the real modifiers selected by both <emphasis>
402e9fcaa8aSmrgaffect</emphasis>
403e9fcaa8aSmrg and <emphasis>
404e9fcaa8aSmrgvalues</emphasis>
405e9fcaa8aSmrg and to unlock the real modifiers selected by <emphasis>
406e9fcaa8aSmrgaffect</emphasis>
407e9fcaa8aSmrg but not selected by <emphasis>
408e9fcaa8aSmrgvalues</emphasis>
409e9fcaa8aSmrg. <emphasis>
410e9fcaa8aSmrgXkbLockModifiers</emphasis>
411e9fcaa8aSmrg does not wait for a reply from the server. It returns <emphasis>
412e9fcaa8aSmrgTrue</emphasis>
413e9fcaa8aSmrg if the request was sent, and <emphasis>
414e9fcaa8aSmrgFalse</emphasis>
415e9fcaa8aSmrg otherwise.
416e9fcaa8aSmrg</para>
417e9fcaa8aSmrg
418e9fcaa8aSmrg
419e9fcaa8aSmrg<para>
420e9fcaa8aSmrgTo latch and unlatch any of the eight real keyboard modifiers, use <emphasis>
421e9fcaa8aSmrgXkbLatchModifiers:</emphasis>
422e9fcaa8aSmrg</para>
423e9fcaa8aSmrg
424e9fcaa8aSmrg
425e9fcaa8aSmrg<informaltable frame='none'>
426e9fcaa8aSmrg<tgroup cols='1'>
427e9fcaa8aSmrg<colspec colsep='0'/>
428e9fcaa8aSmrg<tbody>
429e9fcaa8aSmrg  <row rowsep='0'>
430e9fcaa8aSmrg    <entry role='functiondecl'>
431e9fcaa8aSmrgBool <emphasis>
432e9fcaa8aSmrgXkbLatchModifiers</emphasis>
433e9fcaa8aSmrg(d<emphasis>
434e9fcaa8aSmrgisplay, device_spec, affect, values</emphasis>
435e9fcaa8aSmrg)
436e9fcaa8aSmrg    </entry>
437e9fcaa8aSmrg  </row>
438e9fcaa8aSmrg  <row rowsep='0'>
439e9fcaa8aSmrg    <entry role='functionargdecl'>
440e9fcaa8aSmrgDisplay *      <emphasis>
441e9fcaa8aSmrgdisplay</emphasis>
442e9fcaa8aSmrg;            /* connection to the X server */
443e9fcaa8aSmrg    </entry>
444e9fcaa8aSmrg  </row>
445e9fcaa8aSmrg  <row rowsep='0'>
446e9fcaa8aSmrg    <entry role='functionargdecl'>
447e9fcaa8aSmrgunsigned int      <emphasis>
448e9fcaa8aSmrgdevice_spec</emphasis>
449e9fcaa8aSmrg;            /* device ID, or <emphasis>
450e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
451e9fcaa8aSmrg */
452e9fcaa8aSmrg    </entry>
453e9fcaa8aSmrg  </row>
454e9fcaa8aSmrg  <row rowsep='0'>
455e9fcaa8aSmrg    <entry role='functionargdecl'>
456e9fcaa8aSmrgunsigned int<emphasis>
457e9fcaa8aSmrg      affect</emphasis>
458e9fcaa8aSmrg;            /* mask of modifiers whose latch state is to change */
459e9fcaa8aSmrg    </entry>
460e9fcaa8aSmrg  </row>
461e9fcaa8aSmrg  <row rowsep='0'>
462e9fcaa8aSmrg    <entry role='functionargdecl'>
463e9fcaa8aSmrgunsigned int <emphasis>values</emphasis>;
464e9fcaa8aSmrg/* 1 =&gt; latch, 0 =&gt; unlatch; only for mods selected by <emphasis>
465e9fcaa8aSmrgaffect</emphasis>
466e9fcaa8aSmrg */
467e9fcaa8aSmrg    </entry>
468e9fcaa8aSmrg</row>
469e9fcaa8aSmrg</tbody>
470e9fcaa8aSmrg</tgroup>
471e9fcaa8aSmrg</informaltable>
472e9fcaa8aSmrg
473e9fcaa8aSmrg<para>
474e9fcaa8aSmrg<emphasis>
475e9fcaa8aSmrgXkbLatchModifiers</emphasis>
476e9fcaa8aSmrg sends a request to the server to latch the real modifiers selected by both <emphasis>
477e9fcaa8aSmrgaffect</emphasis>
478e9fcaa8aSmrg and <emphasis>
479e9fcaa8aSmrgvalues</emphasis>
480e9fcaa8aSmrg and to unlatch the real modifiers selected by <emphasis>
481e9fcaa8aSmrgaffect</emphasis>
482e9fcaa8aSmrg but not selected by <emphasis>
483e9fcaa8aSmrgvalues</emphasis>
484e9fcaa8aSmrg. <emphasis>
485e9fcaa8aSmrgXkbLatchModifiers</emphasis>
486e9fcaa8aSmrg does not wait for a reply from the server. It returns <emphasis>
487e9fcaa8aSmrgTrue</emphasis>
488e9fcaa8aSmrg if the request was sent, and <emphasis>
489e9fcaa8aSmrgFalse</emphasis>
490e9fcaa8aSmrg otherwise.
491e9fcaa8aSmrg</para>
492e9fcaa8aSmrg
493e9fcaa8aSmrg
494e9fcaa8aSmrg</sect2>
495e9fcaa8aSmrg<sect2 id='changing_groups'>
496e9fcaa8aSmrg<title>Changing Groups</title>
497e9fcaa8aSmrg
498e9fcaa8aSmrg<para>
499e9fcaa8aSmrgReference the keysym group indices with these symbolic constants:
500e9fcaa8aSmrg</para>
501e9fcaa8aSmrg
502e9fcaa8aSmrg<table frame='none'>
503e9fcaa8aSmrg<title>Symbolic Group Names</title>
504e9fcaa8aSmrg<tgroup cols='2'>
505e9fcaa8aSmrg<colspec colsep='0'/>
506e9fcaa8aSmrg<tbody>
507e9fcaa8aSmrg  <row rowsep='0'>
508e9fcaa8aSmrg    <entry>Symbolic Name</entry>
509e9fcaa8aSmrg    <entry>Value</entry>
510e9fcaa8aSmrg  </row>
511e9fcaa8aSmrg  <row rowsep='0'>
512e9fcaa8aSmrg    <entry>XkbGroup1Index</entry>
513e9fcaa8aSmrg    <entry>0</entry>
514e9fcaa8aSmrg  </row>
515e9fcaa8aSmrg  <row rowsep='0'>
516e9fcaa8aSmrg    <entry>XkbGroup2Index</entry>
517e9fcaa8aSmrg    <entry>1</entry>
518e9fcaa8aSmrg  </row>
519e9fcaa8aSmrg  <row rowsep='0'>
520e9fcaa8aSmrg    <entry>XkbGroup3Index</entry>
521e9fcaa8aSmrg    <entry>2</entry>
522e9fcaa8aSmrg  </row>
523e9fcaa8aSmrg  <row rowsep='0'>
524e9fcaa8aSmrg    <entry>XkbGroup4Index</entry>
525e9fcaa8aSmrg    <entry>3</entry>
526e9fcaa8aSmrg  </row>
527e9fcaa8aSmrg</tbody>
528e9fcaa8aSmrg</tgroup>
529e9fcaa8aSmrg</table>
530e9fcaa8aSmrg
531e9fcaa8aSmrg<para>
532e9fcaa8aSmrgTo lock the keysym group, use <emphasis>
533e9fcaa8aSmrgXkbLockGroup. </emphasis>
534e9fcaa8aSmrg</para>
535e9fcaa8aSmrg
536e9fcaa8aSmrg<informaltable frame='none'>
537e9fcaa8aSmrg<tgroup cols='1'>
538e9fcaa8aSmrg<colspec colsep='0'/>
539e9fcaa8aSmrg<tbody>
540e9fcaa8aSmrg  <row rowsep='0'>
541e9fcaa8aSmrg    <entry role='functiondecl'>
542e9fcaa8aSmrgBool <emphasis>
543e9fcaa8aSmrgXkbLockGroup</emphasis>
544e9fcaa8aSmrg(<emphasis>
545e9fcaa8aSmrgdisplay, device_spec, group</emphasis>
546e9fcaa8aSmrg)
547e9fcaa8aSmrg    </entry>
548e9fcaa8aSmrg  </row>
549e9fcaa8aSmrg  <row rowsep='0'>
550e9fcaa8aSmrg    <entry role='functionargdecl'>
551e9fcaa8aSmrgDisplay *      <emphasis>
552e9fcaa8aSmrgdisplay</emphasis>
553e9fcaa8aSmrg;            /* connection to the X server */
554e9fcaa8aSmrg    </entry>
555e9fcaa8aSmrg  </row>
556e9fcaa8aSmrg  <row rowsep='0'>
557e9fcaa8aSmrg    <entry role='functionargdecl'>
558e9fcaa8aSmrgunsigned int      <emphasis>
559e9fcaa8aSmrgdevice_spec</emphasis>
560e9fcaa8aSmrg;            /* device ID, or <emphasis>
561e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
562e9fcaa8aSmrg */
563e9fcaa8aSmrg    </entry>
564e9fcaa8aSmrg  </row>
565e9fcaa8aSmrg  <row rowsep='0'>
566e9fcaa8aSmrg    <entry role='functionargdecl'>
567e9fcaa8aSmrgunsigned int      <emphasis>
568e9fcaa8aSmrggroup</emphasis>
569e9fcaa8aSmrg;            /* index of the keysym group to lock */
570e9fcaa8aSmrg    </entry>
571e9fcaa8aSmrg</row>
572e9fcaa8aSmrg</tbody>
573e9fcaa8aSmrg</tgroup>
574e9fcaa8aSmrg</informaltable>
575e9fcaa8aSmrg
576e9fcaa8aSmrg<para>
577e9fcaa8aSmrg<emphasis>
578e9fcaa8aSmrgXkbLockGroup</emphasis>
579e9fcaa8aSmrg sends a request to the server to lock the specified <emphasis>
580e9fcaa8aSmrggroup </emphasis>
581e9fcaa8aSmrgand does not wait for a reply. It returns <emphasis>
582e9fcaa8aSmrgTrue</emphasis>
583e9fcaa8aSmrg if the request was sent and <emphasis>
584e9fcaa8aSmrgFalse</emphasis>
585e9fcaa8aSmrg otherwise.
586e9fcaa8aSmrg</para>
587e9fcaa8aSmrg
588e9fcaa8aSmrg
589e9fcaa8aSmrg<para>
590e9fcaa8aSmrgTo latch the keysym group, use <emphasis>
591e9fcaa8aSmrgXkbLatchGroup.</emphasis>
592e9fcaa8aSmrg</para>
593e9fcaa8aSmrg
594e9fcaa8aSmrg
595e9fcaa8aSmrg<informaltable frame='none'>
596e9fcaa8aSmrg<tgroup cols='1'>
597e9fcaa8aSmrg<colspec colsep='0'/>
598e9fcaa8aSmrg<tbody>
599e9fcaa8aSmrg  <row rowsep='0'>
600e9fcaa8aSmrg    <entry role='functiondecl'>
601e9fcaa8aSmrgBool <emphasis>
602e9fcaa8aSmrgXkbLatchGroup</emphasis>
603e9fcaa8aSmrg(<emphasis>
604e9fcaa8aSmrgdisplay, device_spec, group</emphasis>
605e9fcaa8aSmrg)
606e9fcaa8aSmrg    </entry>
607e9fcaa8aSmrg  </row>
608e9fcaa8aSmrg  <row rowsep='0'>
609e9fcaa8aSmrg    <entry role='functionargdecl'>
610e9fcaa8aSmrgDisplay *      <emphasis>
611e9fcaa8aSmrgdisplay</emphasis>
612e9fcaa8aSmrg;            /* connection to the X server */
613e9fcaa8aSmrg    </entry>
614e9fcaa8aSmrg  </row>
615e9fcaa8aSmrg  <row rowsep='0'>
616e9fcaa8aSmrg    <entry role='functionargdecl'>
617e9fcaa8aSmrgunsigned int<emphasis>
618e9fcaa8aSmrg      device_spec</emphasis>
619e9fcaa8aSmrg;            /* device ID, or <emphasis>
620e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
621e9fcaa8aSmrg */
622e9fcaa8aSmrg    </entry>
623e9fcaa8aSmrg  </row>
624e9fcaa8aSmrg  <row rowsep='0'>
625e9fcaa8aSmrg    <entry role='functionargdecl'>
626e9fcaa8aSmrgunsigned int<emphasis>
627e9fcaa8aSmrg      group</emphasis>
628e9fcaa8aSmrg;            /* index of the keysym group to latch */
629e9fcaa8aSmrg    </entry>
630e9fcaa8aSmrg</row>
631e9fcaa8aSmrg</tbody>
632e9fcaa8aSmrg</tgroup>
633e9fcaa8aSmrg</informaltable>
634e9fcaa8aSmrg
635e9fcaa8aSmrg<para>
636e9fcaa8aSmrg<emphasis>
637e9fcaa8aSmrgXkbLatchGroup</emphasis>
638e9fcaa8aSmrg sends a request to the server to latch the specified group and does not wait for a reply. It returns <emphasis>
639e9fcaa8aSmrgTrue</emphasis>
640e9fcaa8aSmrg if the request was sent and <emphasis>
641e9fcaa8aSmrgFalse</emphasis>
642e9fcaa8aSmrg otherwise.
643e9fcaa8aSmrg</para>
644e9fcaa8aSmrg
645e9fcaa8aSmrg
646e9fcaa8aSmrg</sect2>
647e9fcaa8aSmrg</sect1>
648e9fcaa8aSmrg<sect1 id='determining_keyboard_state'>
649e9fcaa8aSmrg<title>Determining Keyboard State</title>
650e9fcaa8aSmrg
651e9fcaa8aSmrg<para>
652e9fcaa8aSmrgXkb keyboard state may be represented in an <emphasis>
653e9fcaa8aSmrgXkbStateRec</emphasis>
654e9fcaa8aSmrg structure:
655e9fcaa8aSmrg</para>
656e9fcaa8aSmrg
657e9fcaa8aSmrg<para><programlisting>
658e9fcaa8aSmrgtypedef struct {
659e9fcaa8aSmrg      unsigned char            group;                /* effective group index */
660e9fcaa8aSmrg      unsigned char            base_group;           /* base group index */
661e9fcaa8aSmrg      unsigned char            latched_group;        /* latched group index */
662e9fcaa8aSmrg      unsigned char            locked_group;         /* locked group index */
663e9fcaa8aSmrg      unsigned char            mods;                 /* effective modifiers */
664e9fcaa8aSmrg      unsigned char            base_mods;            /* base modifiers */
665e9fcaa8aSmrg      unsigned char            latched_mods;         /* latched modifiers */
666e9fcaa8aSmrg      unsigned char            locked_mods;          /* locked modifiers */
667e9fcaa8aSmrg      unsigned char            compat_state;         /* effective group =&gt; modifiers */
668e9fcaa8aSmrg      unsigned char            grab_mods;            /* modifiers used for grabs */
669e9fcaa8aSmrg      unsigned char            compat_grab_mods;     /* mods used for compatibility mode grabs */
670e9fcaa8aSmrg      unsigned char            lookup_mods;          /* modifiers used to lookup symbols */
671e9fcaa8aSmrg      unsigned char            compat_lookup_mods;   /* mods used for compatibility lookup */
672e9fcaa8aSmrg      unsigned short            ptr_buttons;         /* 1 bit =&gt; corresponding pointer btn is down */
673e9fcaa8aSmrg} <emphasis>
674e9fcaa8aSmrgXkbStateRec</emphasis>
675e9fcaa8aSmrg,*XkbStatePtr;
676e9fcaa8aSmrg</programlisting></para>
677e9fcaa8aSmrg
678e9fcaa8aSmrg<para>
679e9fcaa8aSmrgTo obtain the keyboard state, use <emphasis>
680e9fcaa8aSmrgXkbGetState.</emphasis>
681e9fcaa8aSmrg</para>
682e9fcaa8aSmrg
683e9fcaa8aSmrg<informaltable frame='none'>
684e9fcaa8aSmrg<tgroup cols='1'>
685e9fcaa8aSmrg<colspec colsep='0'/>
686e9fcaa8aSmrg<tbody>
687e9fcaa8aSmrg  <row rowsep='0'>
688e9fcaa8aSmrg    <entry role='functiondecl'>
689e9fcaa8aSmrgStatus <emphasis>
690e9fcaa8aSmrgXkbGetState</emphasis>
691e9fcaa8aSmrg(<emphasis>
692e9fcaa8aSmrgdisplay</emphasis>
693e9fcaa8aSmrg, <emphasis>
694e9fcaa8aSmrgdevice_spec</emphasis>
695e9fcaa8aSmrg, <emphasis>
696e9fcaa8aSmrgstate_return</emphasis>
697e9fcaa8aSmrg)
698e9fcaa8aSmrg    </entry>
699e9fcaa8aSmrg  </row>
700e9fcaa8aSmrg  <row rowsep='0'>
701e9fcaa8aSmrg    <entry role='functionargdecl'>
702e9fcaa8aSmrgDisplay *            <emphasis>
703e9fcaa8aSmrgdisplay</emphasis>
704e9fcaa8aSmrg;            /* connection to the X server */
705e9fcaa8aSmrg    </entry>
706e9fcaa8aSmrg  </row>
707e9fcaa8aSmrg  <row rowsep='0'>
708e9fcaa8aSmrg    <entry role='functionargdecl'>
709e9fcaa8aSmrgunsigned int            <emphasis>
710e9fcaa8aSmrgdevice_spec</emphasis>
711e9fcaa8aSmrg;            /* device ID, or <emphasis>
712e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
713e9fcaa8aSmrg */
714e9fcaa8aSmrg    </entry>
715e9fcaa8aSmrg  </row>
716e9fcaa8aSmrg  <row rowsep='0'>
717e9fcaa8aSmrg    <entry role='functionargdecl'>
718e9fcaa8aSmrgXkbStatePtr            <emphasis>
719e9fcaa8aSmrgstate_return</emphasis>
720e9fcaa8aSmrg;            /* backfilled with Xkb state */
721e9fcaa8aSmrg    </entry>
722e9fcaa8aSmrg</row>
723e9fcaa8aSmrg</tbody>
724e9fcaa8aSmrg</tgroup>
725e9fcaa8aSmrg</informaltable>
726e9fcaa8aSmrg
727e9fcaa8aSmrg<para>
728e9fcaa8aSmrgThe <emphasis>
729e9fcaa8aSmrgXkbGetState </emphasis>
730e9fcaa8aSmrgfunction queries the server for the current keyboard state, waits for a reply, and then backfills <emphasis>
731e9fcaa8aSmrgstate_return</emphasis>
732e9fcaa8aSmrg with the results.
733e9fcaa8aSmrg</para>
734e9fcaa8aSmrg
735e9fcaa8aSmrg
736e9fcaa8aSmrg<para>
737e9fcaa8aSmrgAll group values are expressed as group indices in the range [0..3]. Modifiers and the compatibility modifier state values are expressed as the bitwise union of the core X11 modifier masks. The pointer button state is reported as in the core X11 protocol.
738e9fcaa8aSmrg</para>
739e9fcaa8aSmrg
740e9fcaa8aSmrg
741e9fcaa8aSmrg</sect1>
742e9fcaa8aSmrg<sect1 id='tracking_keyboard_state'>
743e9fcaa8aSmrg<title>Tracking Keyboard State</title>
744e9fcaa8aSmrg
745e9fcaa8aSmrg<para>
746e9fcaa8aSmrgThe Xkb extension reports <emphasis>
747e9fcaa8aSmrgXkbStateNotify </emphasis>
748e9fcaa8aSmrgevents to clients wanting notification whenever the Xkb state changes. The changes reported include changes to any aspect of the keyboard state: when a modifier is set or unset, when the current group changes, or when a pointer button is pressed or released. As with all Xkb events, <emphasis>
749e9fcaa8aSmrgXkbStateNotify</emphasis>
750e9fcaa8aSmrg events are reported to all interested clients without regard to the current keyboard input focus or grab state.
751e9fcaa8aSmrg</para>
752e9fcaa8aSmrg
753e9fcaa8aSmrg
754e9fcaa8aSmrg<para>
755e9fcaa8aSmrgThere are many different types of Xkb state changes. Xkb defines an event detail mask corresponding to each type of change. The event detail masks are listed in Table 5.3.
756e9fcaa8aSmrg</para>
757e9fcaa8aSmrg
758e9fcaa8aSmrg<table frame='none'>
759e9fcaa8aSmrg<title>XkbStateNotify Event Detail Masks</title>
760e9fcaa8aSmrg<tgroup cols='2'>
761e9fcaa8aSmrg<colspec colsep='0'/>
762e9fcaa8aSmrg<thead>
763e9fcaa8aSmrg  <row rowsep='0'>
764e9fcaa8aSmrg    <entry>Mask</entry>
765e9fcaa8aSmrg    <entry>Value</entry>
766e9fcaa8aSmrg  </row>
767e9fcaa8aSmrg</thead>
768e9fcaa8aSmrg<tbody>
769e9fcaa8aSmrg  <row rowsep='0'>
770e9fcaa8aSmrg    <entry>XkbModifierStateMask</entry>
771e9fcaa8aSmrg    <entry>(1L &lt;&lt; 0)</entry>
772e9fcaa8aSmrg  </row>
773e9fcaa8aSmrg  <row rowsep='0'>
774e9fcaa8aSmrg    <entry>XkbModifierBaseMask</entry>
775e9fcaa8aSmrg    <entry>(1L &lt;&lt; 1)</entry>
776e9fcaa8aSmrg  </row>
777e9fcaa8aSmrg  <row rowsep='0'>
778e9fcaa8aSmrg    <entry>XkbModifierLatchMask</entry>
779e9fcaa8aSmrg    <entry>(1L &lt;&lt; 2)</entry>
780e9fcaa8aSmrg  </row>
781e9fcaa8aSmrg  <row rowsep='0'>
782e9fcaa8aSmrg    <entry>XkbModifierLockMask</entry>
783e9fcaa8aSmrg    <entry>(1L &lt;&lt; 3)</entry>
784e9fcaa8aSmrg  </row>
785e9fcaa8aSmrg  <row rowsep='0'>
786e9fcaa8aSmrg    <entry>XkbGroupStateMask</entry>
787e9fcaa8aSmrg    <entry>(1L &lt;&lt; 4)</entry>
788e9fcaa8aSmrg  </row>
789e9fcaa8aSmrg  <row rowsep='0'>
790e9fcaa8aSmrg    <entry>XkbGroupBaseMask</entry>
791e9fcaa8aSmrg    <entry>(1L &lt;&lt; 5)</entry>
792e9fcaa8aSmrg  </row>
793e9fcaa8aSmrg  <row rowsep='0'>
794e9fcaa8aSmrg    <entry>XkbGroupLatchMask</entry>
795e9fcaa8aSmrg    <entry>(1L &lt;&lt; 6)</entry>
796e9fcaa8aSmrg  </row>
797e9fcaa8aSmrg  <row rowsep='0'>
798e9fcaa8aSmrg    <entry>XkbGroupLockMask</entry>
799e9fcaa8aSmrg    <entry>(1L &lt;&lt; 7)</entry>
800e9fcaa8aSmrg  </row>
801e9fcaa8aSmrg  <row rowsep='0'>
802e9fcaa8aSmrg    <entry>XkbCompatStateMask</entry>
803e9fcaa8aSmrg    <entry>(1L &lt;&lt; 8)</entry>
804e9fcaa8aSmrg  </row>
805e9fcaa8aSmrg  <row rowsep='0'>
806e9fcaa8aSmrg    <entry>XkbGrabModsMask</entry>
807e9fcaa8aSmrg    <entry>(1L &lt;&lt; 9)</entry>
808e9fcaa8aSmrg  </row>
809e9fcaa8aSmrg  <row rowsep='0'>
810e9fcaa8aSmrg    <entry>XkbCompatGrabModsMask</entry>
811e9fcaa8aSmrg    <entry>(1L &lt;&lt; 10)</entry>
812e9fcaa8aSmrg  </row>
813e9fcaa8aSmrg  <row rowsep='0'>
814e9fcaa8aSmrg    <entry>XkbLookupModsMask</entry>
815e9fcaa8aSmrg    <entry>(1L &lt;&lt; 11)</entry>
816e9fcaa8aSmrg  </row>
817e9fcaa8aSmrg  <row rowsep='0'>
818e9fcaa8aSmrg    <entry>XkbCompatLookupModsMask</entry>
819e9fcaa8aSmrg    <entry>(1L &lt;&lt; 12)</entry>
820e9fcaa8aSmrg  </row>
821e9fcaa8aSmrg  <row rowsep='0'>
822e9fcaa8aSmrg    <entry>XkbPointerButtonMask</entry>
823e9fcaa8aSmrg    <entry>(1L &lt;&lt; 13)</entry>
824e9fcaa8aSmrg  </row>
825e9fcaa8aSmrg  <row rowsep='0'>
826e9fcaa8aSmrg    <entry>XkbAllStateComponentsMask</entry>
827e9fcaa8aSmrg    <entry>(0x3fff)</entry>
828e9fcaa8aSmrg  </row>
829e9fcaa8aSmrg</tbody>
830e9fcaa8aSmrg</tgroup>
831e9fcaa8aSmrg</table>
832e9fcaa8aSmrg
833e9fcaa8aSmrg<para>
834e9fcaa8aSmrgTo track changes in the keyboard state for a particular device, select to receive <emphasis>
835e9fcaa8aSmrgXkbStateNotify</emphasis>
836e9fcaa8aSmrg events by calling either <emphasis>
837e9fcaa8aSmrgXkbSelectEvents</emphasis>
838e9fcaa8aSmrg or <emphasis>
839e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
840e9fcaa8aSmrg (see section 4.3). <!-- xref -->
841e9fcaa8aSmrg</para>
842e9fcaa8aSmrg
843e9fcaa8aSmrg
844e9fcaa8aSmrg<para>
845e9fcaa8aSmrgTo receive <emphasis>
846e9fcaa8aSmrgXkbStateNotify</emphasis>
847e9fcaa8aSmrg events under all possible conditions, use <emphasis>
848e9fcaa8aSmrgXkbSelectEvents</emphasis>
849e9fcaa8aSmrg and pass <emphasis>
850e9fcaa8aSmrgXkbStateNotifyMask</emphasis>
851e9fcaa8aSmrg in both <emphasis>
852e9fcaa8aSmrgbits_to_change</emphasis>
853e9fcaa8aSmrg and <emphasis>
854e9fcaa8aSmrgvalues_for_bits</emphasis>
855e9fcaa8aSmrg.
856e9fcaa8aSmrg</para>
857e9fcaa8aSmrg
858e9fcaa8aSmrg
859e9fcaa8aSmrg<para>
860e9fcaa8aSmrgTo receive <emphasis>
861e9fcaa8aSmrgXkbStateNotify</emphasis>
862e9fcaa8aSmrg events only under certain conditions, use <emphasis>
863e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
864e9fcaa8aSmrg using <emphasis>
865e9fcaa8aSmrgXkbStateNotify</emphasis>
866e9fcaa8aSmrg as the <emphasis>
867e9fcaa8aSmrgevent_type</emphasis>
868e9fcaa8aSmrg and specifying the desired state changes in <emphasis>
869e9fcaa8aSmrgbits_to_change</emphasis>
870e9fcaa8aSmrg and <emphasis>
871e9fcaa8aSmrgvalues_for_bits</emphasis>
872e9fcaa8aSmrg using mask bits from Table 5.3. <!-- xref -->
873e9fcaa8aSmrg</para>
874e9fcaa8aSmrg
875e9fcaa8aSmrg
876e9fcaa8aSmrg<para>
877e9fcaa8aSmrgThe structure for <emphasis>
878e9fcaa8aSmrgXkbStateNotify</emphasis>
879e9fcaa8aSmrg events is:
880e9fcaa8aSmrg</para>
881e9fcaa8aSmrg
882e9fcaa8aSmrg<para><programlisting>
883e9fcaa8aSmrgtypedef struct {
884e9fcaa8aSmrg      int            type;            /* Xkb extension base event code */
885e9fcaa8aSmrg      unsigned long  serial;          /* X server serial number for event */
886e9fcaa8aSmrg      Bool           send_event;      /* <emphasis> True</emphasis> =&gt; synthetically generated */
887e9fcaa8aSmrg      Display *      display;         /* server connection where event generated */
888e9fcaa8aSmrg      Time           time;            /* server time when event generated */
889e9fcaa8aSmrg      int            xkb_type;        /* <emphasis> XkbStateNotify</emphasis> */
890e9fcaa8aSmrg      int            device;          /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
891e9fcaa8aSmrg      unsigned int   changed;         /* bits indicating what has changed */
892e9fcaa8aSmrg      int            group;           /* group index of effective group */
893e9fcaa8aSmrg      int            base_group;      /* group index of base group */
894e9fcaa8aSmrg      int            latched_group;   /* group index of latched group */
895e9fcaa8aSmrg      int            locked_group;    /* group index of locked group */
896e9fcaa8aSmrg      unsigned int   mods;            /* effective modifiers */
897e9fcaa8aSmrg      unsigned int   base_mods;       /* base modifiers */
898e9fcaa8aSmrg      unsigned int   latched_mods;    /* latched modifiers */
899e9fcaa8aSmrg      unsigned int   locked_mods;     /* locked modifiers */
900e9fcaa8aSmrg      int            compat_state;    /* computed compatibility state */
901e9fcaa8aSmrg      unsigned char  grab_mods;       /* modifiers used for grabs */
902e9fcaa8aSmrg      unsigned char  compat_grab_mods;  /* modifiers used for compatibility grabs */
903e9fcaa8aSmrg      unsigned char  lookup_mods;     /* modifiers used to lookup symbols */
904e9fcaa8aSmrg      unsigned char  compat_lookup_mods;                  /* mods used for compatibility look up */
905e9fcaa8aSmrg      int            ptr_buttons;     /* core pointer buttons */
906e9fcaa8aSmrg      KeyCode        keycode;         /* keycode causing event, 0 if programmatic */
907e9fcaa8aSmrg      char           event_type;      /* core event if <emphasis> req_major</emphasis> or
908e9fcaa8aSmrg                                         <emphasis> req_minor</emphasis> non zero */
909e9fcaa8aSmrg      char           req_major;       /* major request code if program trigger, else 0 */
910e9fcaa8aSmrg      char           req_minor;       /* minor request code if program trigger, else 0 */
911e9fcaa8aSmrg} <emphasis>XkbStateNotifyEvent</emphasis>
912e9fcaa8aSmrg;
913e9fcaa8aSmrg</programlisting></para>
914e9fcaa8aSmrg
915e9fcaa8aSmrg<para>
916e9fcaa8aSmrgWhen you receive an <emphasis>
917e9fcaa8aSmrgXkbStateNotify</emphasis>
918e9fcaa8aSmrg event, the <emphasis>
919e9fcaa8aSmrgchanged</emphasis>
920e9fcaa8aSmrg field indicates which elements of keyboard state have changed.
921e9fcaa8aSmrgThis will be the bitwise inclusive OR of one or more of the <emphasis>
922e9fcaa8aSmrgXkbStateNotify</emphasis>
923e9fcaa8aSmrg event detail masks shown in Table 5.3. All fields reported in  <!-- xref -->
924e9fcaa8aSmrgthe event are valid, but only those indicated in <emphasis>
925e9fcaa8aSmrgchanged</emphasis>
926e9fcaa8aSmrg have changed values.
927e9fcaa8aSmrg</para>
928e9fcaa8aSmrg
929e9fcaa8aSmrg
930e9fcaa8aSmrg<para>
931e9fcaa8aSmrgThe <emphasis>
932e9fcaa8aSmrggroup</emphasis>
933e9fcaa8aSmrg field is the group index of the effective keysym group. The <emphasis>
934e9fcaa8aSmrgbase_group</emphasis>
935e9fcaa8aSmrg, <emphasis>
936e9fcaa8aSmrglatched_group</emphasis>
937e9fcaa8aSmrg, and <emphasis>
938e9fcaa8aSmrglocked_group</emphasis>
939e9fcaa8aSmrg fields are set to a group index value representing the base group,
940e9fcaa8aSmrgthe latched group, and the locked group, respectively. The X
941e9fcaa8aSmrgserver can set the modifier and compatibility state fields to
942e9fcaa8aSmrga union of the core modifier mask bits; this union represents the
943e9fcaa8aSmrgcorresponding modifier states. The <emphasis>ptr_button</emphasis>
944e9fcaa8aSmrg field gives the state of the core pointer buttons as a
945e9fcaa8aSmrgmask composed of an inclusive OR of zero or more of the
946e9fcaa8aSmrgcore pointer button masks.
947e9fcaa8aSmrg</para>
948e9fcaa8aSmrg
949e9fcaa8aSmrg
950e9fcaa8aSmrg<para>
951e9fcaa8aSmrgXkb state changes can occur either in response to keyboard
952e9fcaa8aSmrgactivity or under application control. If a key event
953e9fcaa8aSmrgcaused the state change, the <emphasis>
954e9fcaa8aSmrgkeycode</emphasis>
955e9fcaa8aSmrg field gives the keycode of the key event, and the <emphasis>
956e9fcaa8aSmrgevent_type</emphasis>
957e9fcaa8aSmrg field is set to either <emphasis>KeyPress</emphasis>
958e9fcaa8aSmrg or <emphasis>
959e9fcaa8aSmrgKeyRelease</emphasis>
960e9fcaa8aSmrg. If a pointer button event caused the state change, the <emphasis>
961e9fcaa8aSmrgkeycode</emphasis>
962e9fcaa8aSmrg field is zero, and the <emphasis>event_type</emphasis>
963e9fcaa8aSmrg field is set to either <emphasis>ButtonPress</emphasis>
964e9fcaa8aSmrg or <emphasis>ButtonRelease</emphasis>
965e9fcaa8aSmrg. Otherwise, the major and minor codes of the request that caused the
966e9fcaa8aSmrgstate change are given in the <emphasis>
967e9fcaa8aSmrgreq_major</emphasis>
968e9fcaa8aSmrg and <emphasis>
969e9fcaa8aSmrgreq_minor</emphasis>
970e9fcaa8aSmrg fields, and the <emphasis>
971e9fcaa8aSmrgkeycode</emphasis>
972e9fcaa8aSmrg field is zero. The <emphasis>
973e9fcaa8aSmrgreq_major</emphasis>
974e9fcaa8aSmrg value is the same as the major extension opcode.
975e9fcaa8aSmrg</para>
976e9fcaa8aSmrg</sect1>
977e9fcaa8aSmrg</chapter>
978