10f8248bfSmrg<?xml version="1.0" encoding="UTF-8" ?>
20f8248bfSmrg<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
30f8248bfSmrg	  "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
4eb411b4bSmrg<chapter id='Keyboard_State'>
5e9fcaa8aSmrg<title>Keyboard State</title>
6e9fcaa8aSmrg
7e9fcaa8aSmrg<para>
80f8248bfSmrgKeyboard 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. <link linkend="figure5.1">Figure 5.1</link> shows the components of Xkb keyboard state and their relationships.
9e9fcaa8aSmrg</para>
10e9fcaa8aSmrg
110f8248bfSmrg<figure id='figure5.1'>
120f8248bfSmrg  <title>Xkb State</title>
130f8248bfSmrg  <mediaobject>
140f8248bfSmrg  <!-- <title>Keyboard State Description</title> -->
150f8248bfSmrg   <imageobject> <imagedata format="SVG" fileref="XKBlib-2.svg"/>
160f8248bfSmrg   </imageobject>
170f8248bfSmrg  </mediaobject>
180f8248bfSmrg</figure>
19e9fcaa8aSmrg
20e9fcaa8aSmrg
21eb411b4bSmrg<sect1 id='Keyboard_State_Description'>
22e9fcaa8aSmrg<title>Keyboard State Description</title>
23e9fcaa8aSmrg<para>
24e9fcaa8aSmrgThe 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:
25e9fcaa8aSmrg</para>
26e9fcaa8aSmrg
27e9fcaa8aSmrg<itemizedlist>
28e9fcaa8aSmrg<listitem>
29e9fcaa8aSmrg  <para>
30e9fcaa8aSmrgThe locked group and locked modifiers
31e9fcaa8aSmrg  </para>
32e9fcaa8aSmrg</listitem>
33e9fcaa8aSmrg<listitem>
34e9fcaa8aSmrg  <para>
35e9fcaa8aSmrgThe latched group and latched modifiers
36e9fcaa8aSmrg  </para>
37e9fcaa8aSmrg</listitem>
38e9fcaa8aSmrg<listitem>
39e9fcaa8aSmrg  <para>
40e9fcaa8aSmrgThe base group and base modifiers
41e9fcaa8aSmrg  </para>
42e9fcaa8aSmrg</listitem>
43e9fcaa8aSmrg<listitem>
44e9fcaa8aSmrg  <para>
45e9fcaa8aSmrgThe effective group and effective modifiers
46e9fcaa8aSmrg  </para>
47e9fcaa8aSmrg</listitem>
48e9fcaa8aSmrg<listitem>
49e9fcaa8aSmrg  <para>
50e9fcaa8aSmrgThe state of the core pointer buttons
51e9fcaa8aSmrg  </para>
52e9fcaa8aSmrg</listitem>
53e9fcaa8aSmrg</itemizedlist>
54e9fcaa8aSmrg
550f8248bfSmrg<para id='modifiers'>
560f8248bfSmrgThe
570f8248bfSmrg<firstterm>modifiers</firstterm>
580f8248bfSmrg<indexterm significance="preferred" zone="modifiers">
590f8248bfSmrg<primary>modifiers</primary></indexterm>
600f8248bfSmrgare
610f8248bfSmrg<symbol>Shift</symbol>,
620f8248bfSmrg<symbol>Lock</symbol>,
630f8248bfSmrg<symbol>Control</symbol>,
640f8248bfSmrgand
650f8248bfSmrg<symbol>Mod1</symbol>
660f8248bfSmrg&ndash;
670f8248bfSmrg<symbol>Mod5</symbol>,
680f8248bfSmrgas 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.
69e9fcaa8aSmrg</para>
70e9fcaa8aSmrg
71e9fcaa8aSmrg
720f8248bfSmrg<para id='keysym_groups'>
730f8248bfSmrgThe Xkb extension provides support for
740f8248bfSmrg<firstterm>keysym groups</firstterm>,
750f8248bfSmrg<indexterm significance="preferred" zone="keysym_groups">
760f8248bfSmrg<primary>keysym groups</primary></indexterm>
770f8248bfSmrg<indexterm significance="preferred" zone="keysym_groups">
780f8248bfSmrg<primary>group</primary><secondary>keysym</secondary></indexterm>
790f8248bfSmrg<indexterm significance="preferred" zone="keysym_groups">
800f8248bfSmrg<primary>group</primary><secondary>ISO9995</secondary></indexterm>
810f8248bfSmrgas defined by ISO9995:
82e9fcaa8aSmrg</para>
83e9fcaa8aSmrg
84e9fcaa8aSmrg
85e9fcaa8aSmrg<variablelist>
86e9fcaa8aSmrg  <varlistentry>
87e9fcaa8aSmrg    <term>Group</term>
88e9fcaa8aSmrg    <listitem>
89e9fcaa8aSmrg      <para>
90e9fcaa8aSmrgA logical state of a keyboard providing access to a collection of characters.
91e9fcaa8aSmrgA group usually contains a set of characters that logically belong together
92e9fcaa8aSmrgand that may be arranged on several shift levels within that group.
93e9fcaa8aSmrg      </para>
94e9fcaa8aSmrg    </listitem>
95e9fcaa8aSmrg  </varlistentry>
96e9fcaa8aSmrg</variablelist>
97e9fcaa8aSmrg
98e9fcaa8aSmrg
99e9fcaa8aSmrg
100e9fcaa8aSmrg<para>
101e9fcaa8aSmrgThe 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.
102e9fcaa8aSmrg</para>
103e9fcaa8aSmrg
104e9fcaa8aSmrg
105e9fcaa8aSmrg<para>
106e9fcaa8aSmrgChanging 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.
107e9fcaa8aSmrg</para>
108e9fcaa8aSmrg
109e9fcaa8aSmrg
110e9fcaa8aSmrg<para>
1110f8248bfSmrgThe
1120f8248bfSmrg<firstterm>pointer buttons</firstterm>
1130f8248bfSmrgare
1140f8248bfSmrg<symbol>Button1</symbol>
1150f8248bfSmrg&ndash;
1160f8248bfSmrg<symbol>Button5</symbol>,
1170f8248bfSmrgas defined by the core protocol.
118e9fcaa8aSmrg</para>
119e9fcaa8aSmrg
120e9fcaa8aSmrg
1210f8248bfSmrg<para id='base_group'>
1220f8248bfSmrgThe
1230f8248bfSmrg<firstterm>base group</firstterm>
1240f8248bfSmrg<indexterm significance="preferred" zone="base_group">
1250f8248bfSmrg<primary>base group</primary></indexterm>
1260f8248bfSmrg<indexterm significance="preferred" zone="base_group">
1270f8248bfSmrg<primary>group</primary><secondary>base</secondary></indexterm>
1280f8248bfSmrgand
1290f8248bfSmrg<firstterm>base modifiers</firstterm>
1300f8248bfSmrg<indexterm significance="preferred" zone="base_group">
1310f8248bfSmrg<primary>base modifiers</primary></indexterm>
1320f8248bfSmrg<indexterm significance="preferred" zone="base_group">
1330f8248bfSmrg<primary>modifiers</primary><secondary>base</secondary></indexterm>
1340f8248bfSmrgrepresent keys that are physically or logically down. These
135e9fcaa8aSmrgand the pointer buttons can be changed by keyboard activity and
136e9fcaa8aSmrgnot by Xkb requests. It is possible for a key to be logically
137e9fcaa8aSmrgdown, but not physically down, and neither latched nor locked.
138e9fcaa8aSmrg<footnote><para>
139e9fcaa8aSmrgKeys may be logically down when they are physically up because
140e9fcaa8aSmrgof their electrical properties or because of the keyboard extension
141e9fcaa8aSmrgin the X server having filtered the key release, for esoteric reasons.
142e9fcaa8aSmrg</para></footnote>
143e9fcaa8aSmrg
144e9fcaa8aSmrg</para>
145e9fcaa8aSmrg
146e9fcaa8aSmrg
1470f8248bfSmrg<para id='effective_modifiers'>
1480f8248bfSmrgThe
1490f8248bfSmrg<firstterm>effective modifiers</firstterm>
1500f8248bfSmrg<indexterm significance="preferred" zone="effective_modifiers">
1510f8248bfSmrg<primary>effective modifiers</primary></indexterm>
1520f8248bfSmrg<indexterm significance="preferred" zone="effective_modifiers">
1530f8248bfSmrg<primary>modifiers</primary><secondary>effective</secondary></indexterm>
1540f8248bfSmrgare the bitwise union of the locked, latched, and the base modifiers.
155e9fcaa8aSmrg</para>
156e9fcaa8aSmrg
157e9fcaa8aSmrg
1580f8248bfSmrg<para id='effective_group'>
1590f8248bfSmrgThe
1600f8248bfSmrg<firstterm>effective group</firstterm>
1610f8248bfSmrg<indexterm significance="preferred" zone="effective_group">
1620f8248bfSmrg<primary>effective group</primary></indexterm>
1630f8248bfSmrg<indexterm significance="preferred" zone="effective_group">
1640f8248bfSmrg<primary>group</primary><secondary>effective</secondary></indexterm>
1650f8248bfSmrgis 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.
166e9fcaa8aSmrg</para>
167e9fcaa8aSmrg
168e9fcaa8aSmrg<simplelist type='vert' columns='1'>
169e9fcaa8aSmrg<member>
170e9fcaa8aSmrgn = number of keyboard groups, 1&lt;= n &lt;= 4
171e9fcaa8aSmrg</member>
172e9fcaa8aSmrg
173e9fcaa8aSmrg<member>
174e9fcaa8aSmrg0 &lt;= any of locked, latched, or base group &lt; n
175e9fcaa8aSmrg</member>
176e9fcaa8aSmrg
177e9fcaa8aSmrg<member>
178e9fcaa8aSmrgeffective group = f(locked group + latched group + base group)
179e9fcaa8aSmrg</member>
180e9fcaa8aSmrg</simplelist>
181e9fcaa8aSmrg
182e9fcaa8aSmrg<para>
183e9fcaa8aSmrgThe 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.
184e9fcaa8aSmrg</para>
185e9fcaa8aSmrg
186e9fcaa8aSmrg
187e9fcaa8aSmrg<para>
188e9fcaa8aSmrgThere are two circumstances under which groups are normalized:
189e9fcaa8aSmrg</para>
190e9fcaa8aSmrg
191e9fcaa8aSmrg<orderedlist>
192e9fcaa8aSmrg  <listitem><para>
1930f8248bfSmrgThe global locked or effective group changes. In this case, the changed group is normalized into range according to the settings of the
1940f8248bfSmrg<structfield>groups_wrap</structfield>
1950f8248bfSmrgfield of the
1960f8248bfSmrg<structname>XkbControlsRec</structname>
1970f8248bfSmrgstructure for the keyboard (see <link linkend="The_GroupsWrap_Control">section 10.7.1</link>).
198e9fcaa8aSmrg  </para></listitem>
199e9fcaa8aSmrg  <listitem><para>
200e9fcaa8aSmrg
2010f8248bfSmrgThe 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
2020f8248bfSmrg<structfield>group_info</structfield>
2030f8248bfSmrgfield of the key symbol mapping
2040f8248bfSmrg(<structname>XkbSymMapRec</structname>)
2050f8248bfSmrgfor the event key.
206e9fcaa8aSmrg  </para></listitem>
207e9fcaa8aSmrg</orderedlist>
208e9fcaa8aSmrg
209e9fcaa8aSmrg<para>
210e9fcaa8aSmrgEach 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.
211e9fcaa8aSmrg</para>
212e9fcaa8aSmrg
213e9fcaa8aSmrg
2140f8248bfSmrg<para id='Xkb-aware'>
2150f8248bfSmrgA 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 &ndash; 14 of the state field of events that report modifier and button state. Such a client is said to be
2160f8248bfSmrg<firstterm>Xkb-capable</firstterm>.
2170f8248bfSmrg<indexterm significance="preferred" zone="Xkb-aware">
2180f8248bfSmrg<primary>Xkb-capable client</primary></indexterm>
2190f8248bfSmrg
2200f8248bfSmrgA client that does explicitly call Xkb functions is an
2210f8248bfSmrg<firstterm>Xkb-aware</firstterm>
2220f8248bfSmrg<indexterm significance="preferred" zone="Xkb-aware">
2230f8248bfSmrg<primary>Xkb-aware client</primary></indexterm>
2240f8248bfSmrgclient. 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:
225e9fcaa8aSmrg</para>
226e9fcaa8aSmrg
227e9fcaa8aSmrg<itemizedlist>
228e9fcaa8aSmrg<listitem>
229e9fcaa8aSmrg  <para>
230e9fcaa8aSmrglookup state: lookup group and lookup modifiers
231e9fcaa8aSmrg  </para>
232e9fcaa8aSmrg</listitem>
233e9fcaa8aSmrg<listitem>
234e9fcaa8aSmrg  <para>
235e9fcaa8aSmrggrab state: grab group and grab modifiers
236e9fcaa8aSmrg  </para>
237e9fcaa8aSmrg</listitem>
238e9fcaa8aSmrg</itemizedlist>
239e9fcaa8aSmrg
2400f8248bfSmrg<para id='lookup_state'>
2410f8248bfSmrgThe
2420f8248bfSmrg<firstterm>lookup modifiers</firstterm>
2430f8248bfSmrg<indexterm significance="preferred" zone="lookup_state">
2440f8248bfSmrg<primary>lookup modifiers</primary></indexterm>
2450f8248bfSmrg<indexterm significance="preferred" zone="lookup_state">
2460f8248bfSmrg<primary>modifiers</primary><secondary>lookup</secondary></indexterm>
2470f8248bfSmrgand
2480f8248bfSmrg<firstterm>lookup group</firstterm>
2490f8248bfSmrg<indexterm significance="preferred" zone="lookup_state">
2500f8248bfSmrg<primary>lookup group</primary></indexterm>
2510f8248bfSmrg<indexterm significance="preferred" zone="lookup_state">
2520f8248bfSmrg<primary>group</primary><secondary>lookup</secondary></indexterm>
2530f8248bfSmrgare 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
2540f8248bfSmrg<symbol>KeyPress</symbol>
2550f8248bfSmrgand
2560f8248bfSmrg<symbol>KeyRelease</symbol>
2570f8248bfSmrgevents, the lookup modifiers are computed as:
2580f8248bfSmrg
2590f8248bfSmrg<literallayout>   ((base | latched | locked) &amp; ~<emphasis>server_internal_modifiers</emphasis>)</literallayout>
260e9fcaa8aSmrg</para>
261e9fcaa8aSmrg
262e9fcaa8aSmrg<para>
263e9fcaa8aSmrgOtherwise the lookup modifiers are computed as:
264e9fcaa8aSmrg
2650f8248bfSmrg<literallayout>   (((base | latched | (locked &amp; ~<emphasis>ignore_locks</emphasis>)) &amp; ~<emphasis>server_internal_modifiers</emphasis>)</literallayout>
2660f8248bfSmrg</para>
267e9fcaa8aSmrg
268e9fcaa8aSmrg<para>
269e9fcaa8aSmrgThe lookup group is the same as the effective group.
270e9fcaa8aSmrg</para>
271e9fcaa8aSmrg
272e9fcaa8aSmrg
273e9fcaa8aSmrg<para>
2740f8248bfSmrgWhen an Xkb-capable or Xkb-aware client wishes to map a keycode to a keysym, it should use the
2750f8248bfSmrg<firstterm>lookup state</firstterm>
2760f8248bfSmrg<indexterm significance="preferred" zone="lookup_state">
2770f8248bfSmrg<primary>lookup state</primary></indexterm>
2780f8248bfSmrg<indexterm significance="preferred" zone="lookup_state">
2790f8248bfSmrg<primary>state</primary><secondary>lookup</secondary></indexterm>
2800f8248bfSmrg— the lookup group and the lookup modifiers.
281e9fcaa8aSmrg</para>
282e9fcaa8aSmrg
283e9fcaa8aSmrg
2840f8248bfSmrg<para id='grab_state'>
2850f8248bfSmrgThe
2860f8248bfSmrg<firstterm>grab state</firstterm>
2870f8248bfSmrg<indexterm significance="preferred" zone="grab_state">
2880f8248bfSmrg<primary>grab state</primary></indexterm>
2890f8248bfSmrg<indexterm significance="preferred" zone="grab_state">
2900f8248bfSmrg<primary>state</primary><secondary>grab</secondary></indexterm>
2910f8248bfSmrgis the state used when matching events to passive grabs. If the event activates a grab, the
2920f8248bfSmrg<firstterm>grab modifiers</firstterm>
2930f8248bfSmrg<indexterm significance="preferred" zone="grab_state">
2940f8248bfSmrg<primary>grab modifiers</primary></indexterm>
2950f8248bfSmrg<indexterm significance="preferred" zone="grab_state">
2960f8248bfSmrg<primary>modifiers</primary><secondary>grab</secondary></indexterm>
2970f8248bfSmrgand
2980f8248bfSmrg<firstterm>grab group</firstterm>
2990f8248bfSmrg<indexterm significance="preferred" zone="grab_state">
3000f8248bfSmrg<primary>grab group</primary></indexterm>
3010f8248bfSmrg<indexterm significance="preferred" zone="grab_state">
3020f8248bfSmrg<primary>group</primary><secondary>grab</secondary></indexterm>
3030f8248bfSmrgare represented in the state field of core X events; otherwise, the lookup state is used. The grab modifiers are computed as:
3040f8248bfSmrg
3050f8248bfSmrg<literallayout>   (((base | latched | (locked &amp; ~ignore_locks)) &amp; ~server_internal_modifiers)</literallayout>
306e9fcaa8aSmrg</para>
307e9fcaa8aSmrg
308e9fcaa8aSmrg<para>
3090f8248bfSmrgIf the server’s
3100f8248bfSmrg<emphasis>IgnoreGroupLock</emphasis>
3110f8248bfSmrgcontrol (see <link linkend="The_IgnoreGroupLock_Control">section 10.7.3</link>) 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.
312e9fcaa8aSmrg</para>
313e9fcaa8aSmrg
314e9fcaa8aSmrg
315e9fcaa8aSmrg<para>
3160f8248bfSmrgThe 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
3170f8248bfSmrg(<emphasis>Xkb-unaware</emphasis>
318e9fcaa8aSmrgclients):
319e9fcaa8aSmrg</para>
320e9fcaa8aSmrg
321e9fcaa8aSmrg<itemizedlist>
322e9fcaa8aSmrg<listitem>
323e9fcaa8aSmrg  <para>
324e9fcaa8aSmrgThe compatibility modifier state
325e9fcaa8aSmrg  </para>
326e9fcaa8aSmrg</listitem>
327e9fcaa8aSmrg<listitem>
328e9fcaa8aSmrg  <para>
329e9fcaa8aSmrgThe compatibility lookup modifier state
330e9fcaa8aSmrg  </para>
331e9fcaa8aSmrg</listitem>
332e9fcaa8aSmrg<listitem>
333e9fcaa8aSmrg  <para>
334e9fcaa8aSmrgThe compatibility grab modifier state
335e9fcaa8aSmrg  </para>
336e9fcaa8aSmrg</listitem>
337e9fcaa8aSmrg</itemizedlist>
338e9fcaa8aSmrg
339e9fcaa8aSmrg<para>
340e9fcaa8aSmrgThe 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.
341e9fcaa8aSmrg</para>
342e9fcaa8aSmrg
343e9fcaa8aSmrg
344e9fcaa8aSmrg</sect1>
345eb411b4bSmrg<sect1 id='Changing_the_Keyboard_State'>
346e9fcaa8aSmrg<title>Changing the Keyboard State</title>
347e9fcaa8aSmrg
348eb411b4bSmrg<sect2 id='Changing_Modifiers'>
349e9fcaa8aSmrg<title>Changing Modifiers</title>
350e9fcaa8aSmrg
3510f8248bfSmrg<indexterm zone="Changing_Modifiers">
3520f8248bfSmrg<primary>real modifiers</primary></indexterm>
3530f8248bfSmrg<indexterm zone="Changing_Modifiers">
3540f8248bfSmrg<primary>modifiers</primary><secondary>real</secondary></indexterm>
3550f8248bfSmrg<indexterm significance="preferred" zone="Changing_Modifiers">
3560f8248bfSmrg<primary>mask</primary><secondary>real modifiers</secondary></indexterm>
3570f8248bfSmrg
358e9fcaa8aSmrg<para>
3590f8248bfSmrgThe functions in this section that change the use of modifiers use a mask in the parameter
3600f8248bfSmrg<structfield>affect</structfield>.
3610f8248bfSmrgIt is a bitwise inclusive OR of the legal modifier masks:
362e9fcaa8aSmrg</para>
363e9fcaa8aSmrg
3640f8248bfSmrg<table id='table5.1' frame='none'>
365e9fcaa8aSmrg<title>Real Modifier Masks</title>
366eb411b4bSmrg<?dbfo keep-together="always" ?>
367eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'>
368eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
369e9fcaa8aSmrg<tbody>
370eb411b4bSmrg  <row>
371e9fcaa8aSmrg    <entry>Mask</entry>
372e9fcaa8aSmrg  </row>
373eb411b4bSmrg  <row>
374e9fcaa8aSmrg    <entry>ShiftMask</entry>
375e9fcaa8aSmrg  </row>
376eb411b4bSmrg  <row>
377e9fcaa8aSmrg    <entry>LockMask</entry>
378e9fcaa8aSmrg  </row>
379eb411b4bSmrg  <row>
380e9fcaa8aSmrg    <entry>ControlMask</entry>
381e9fcaa8aSmrg  </row>
382eb411b4bSmrg  <row>
383e9fcaa8aSmrg    <entry>Mod1Mask</entry>
384e9fcaa8aSmrg  </row>
385eb411b4bSmrg  <row>
386e9fcaa8aSmrg    <entry>Mod2Mask</entry>
387e9fcaa8aSmrg  </row>
388eb411b4bSmrg  <row>
389e9fcaa8aSmrg    <entry>Mod3Mask</entry>
390e9fcaa8aSmrg  </row>
391eb411b4bSmrg  <row>
392e9fcaa8aSmrg    <entry>Mod4Mask</entry>
393e9fcaa8aSmrg  </row>
394eb411b4bSmrg  <row>
395e9fcaa8aSmrg    <entry>Mod5Mask</entry>
396e9fcaa8aSmrg  </row>
397e9fcaa8aSmrg</tbody>
398e9fcaa8aSmrg</tgroup>
399e9fcaa8aSmrg</table>
400e9fcaa8aSmrg
401e9fcaa8aSmrg<para>
4020f8248bfSmrgTo lock and unlock any of the eight real keyboard modifiers, use
4030f8248bfSmrg<function>XkbLockModifiers</function>:
404e9fcaa8aSmrg</para>
405e9fcaa8aSmrg
4060f8248bfSmrg<indexterm significance="preferred" zone="XkbLockModifiers"><primary><function>XkbLockModifiers</function></primary></indexterm>
4070f8248bfSmrg<funcsynopsis id="XkbLockModifiers">
4080f8248bfSmrg  <funcprototype>
4090f8248bfSmrg    <funcdef>Bool <function>XkbLockModifiers</function></funcdef>
4100f8248bfSmrg<!-- (
4110f8248bfSmrg<parameter>display, device_spec, affect, values</parameter>
4120f8248bfSmrg) -->
4130f8248bfSmrg
4140f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
4150f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
4160f8248bfSmrg    <paramdef>unsigned int <parameter>affect</parameter></paramdef>
4170f8248bfSmrg    <paramdef>unsigned int <parameter>values</parameter></paramdef>
4180f8248bfSmrg  </funcprototype>
4190f8248bfSmrg</funcsynopsis>
4200f8248bfSmrg<variablelist>
4210f8248bfSmrg  <varlistentry>
4220f8248bfSmrg    <term>
4230f8248bfSmrg      <parameter>display</parameter>
4240f8248bfSmrg    </term>
4250f8248bfSmrg    <listitem>
4260f8248bfSmrg      <para>
4270f8248bfSmrg        connection to the X server
4280f8248bfSmrg      </para>
4290f8248bfSmrg    </listitem>
4300f8248bfSmrg  </varlistentry>
4310f8248bfSmrg  <varlistentry>
4320f8248bfSmrg    <term>
4330f8248bfSmrg      <parameter>device_spec</parameter>
4340f8248bfSmrg    </term>
4350f8248bfSmrg    <listitem>
4360f8248bfSmrg      <para>
4370f8248bfSmrg        device ID, or <symbol>XkbUseCoreKbd</symbol>
4380f8248bfSmrg      </para>
4390f8248bfSmrg    </listitem>
4400f8248bfSmrg  </varlistentry>
4410f8248bfSmrg  <varlistentry>
4420f8248bfSmrg    <term>
4430f8248bfSmrg      <parameter>affect</parameter>
4440f8248bfSmrg    </term>
4450f8248bfSmrg    <listitem>
4460f8248bfSmrg      <para>
4470f8248bfSmrg        mask of real modifiers whose lock state is to change
4480f8248bfSmrg      </para>
4490f8248bfSmrg    </listitem>
4500f8248bfSmrg  </varlistentry>
4510f8248bfSmrg  <varlistentry>
4520f8248bfSmrg    <term>
4530f8248bfSmrg      <parameter>values</parameter>
4540f8248bfSmrg    </term>
4550f8248bfSmrg    <listitem>
4560f8248bfSmrg      <para>
4570f8248bfSmrg        1 &rArr; lock, 0 &rArr; unlock; only for modifiers selected by <parameter>affect</parameter>
4580f8248bfSmrg      </para>
4590f8248bfSmrg    </listitem>
4600f8248bfSmrg  </varlistentry>
4610f8248bfSmrg</variablelist>
462e9fcaa8aSmrg
463e9fcaa8aSmrg<para>
4640f8248bfSmrg<function>XkbLockModifiers</function>
4650f8248bfSmrgsends a request to the server to lock the real modifiers selected by both
4660f8248bfSmrg<parameter>affect</parameter>
4670f8248bfSmrgand
4680f8248bfSmrg<parameter>values</parameter>
4690f8248bfSmrgand to unlock the real modifiers selected by
4700f8248bfSmrg<parameter>affect</parameter>
4710f8248bfSmrgbut not selected by
4720f8248bfSmrg<parameter>values</parameter>.
4730f8248bfSmrg<function>XkbLockModifiers</function>
4740f8248bfSmrgdoes not wait for a reply from the server. It returns
4750f8248bfSmrg<symbol>True</symbol>
4760f8248bfSmrgif the request was sent, and
4770f8248bfSmrg<symbol>False</symbol>
4780f8248bfSmrgotherwise.
479e9fcaa8aSmrg</para>
480e9fcaa8aSmrg
481e9fcaa8aSmrg
482e9fcaa8aSmrg<para>
4830f8248bfSmrgTo latch and unlatch any of the eight real keyboard modifiers, use
4840f8248bfSmrg<function>XkbLatchModifiers</function>:
485e9fcaa8aSmrg</para>
486e9fcaa8aSmrg
487e9fcaa8aSmrg
4880f8248bfSmrg<indexterm significance="preferred" zone="XkbLatchModifiers"><primary><function>XkbLatchModifiers</function></primary></indexterm>
4890f8248bfSmrg<funcsynopsis id="XkbLatchModifiers">
4900f8248bfSmrg  <funcprototype>
4910f8248bfSmrg    <funcdef>Bool <function>XkbLatchModifiers</function></funcdef>
4920f8248bfSmrg<!-- (
4930f8248bfSmrg<parameter>display, device_spec, affect, values</parameter>
4940f8248bfSmrg) -->
4950f8248bfSmrg
4960f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
4970f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
4980f8248bfSmrg    <paramdef>unsigned int <parameter>affect</parameter></paramdef>
4990f8248bfSmrg    <paramdef>unsigned int <parameter>values</parameter></paramdef>
5000f8248bfSmrg  </funcprototype>
5010f8248bfSmrg</funcsynopsis>
5020f8248bfSmrg<variablelist>
5030f8248bfSmrg  <varlistentry>
5040f8248bfSmrg    <term>
5050f8248bfSmrg      <parameter>display</parameter>
5060f8248bfSmrg    </term>
5070f8248bfSmrg    <listitem>
5080f8248bfSmrg      <para>
5090f8248bfSmrg        connection to the X server
5100f8248bfSmrg      </para>
5110f8248bfSmrg    </listitem>
5120f8248bfSmrg  </varlistentry>
5130f8248bfSmrg  <varlistentry>
5140f8248bfSmrg    <term>
5150f8248bfSmrg      <parameter>device_spec</parameter>
5160f8248bfSmrg    </term>
5170f8248bfSmrg    <listitem>
5180f8248bfSmrg      <para>
5190f8248bfSmrg        device ID, or <symbol>XkbUseCoreKbd</symbol>
5200f8248bfSmrg      </para>
5210f8248bfSmrg    </listitem>
5220f8248bfSmrg  </varlistentry>
5230f8248bfSmrg  <varlistentry>
5240f8248bfSmrg    <term>
5250f8248bfSmrg      <parameter>affect</parameter>
5260f8248bfSmrg    </term>
5270f8248bfSmrg    <listitem>
5280f8248bfSmrg      <para>
5290f8248bfSmrg        mask of modifiers whose latch state is to change
5300f8248bfSmrg      </para>
5310f8248bfSmrg    </listitem>
5320f8248bfSmrg  </varlistentry>
5330f8248bfSmrg  <varlistentry>
5340f8248bfSmrg    <term>
5350f8248bfSmrg      <parameter>values</parameter>
5360f8248bfSmrg    </term>
5370f8248bfSmrg    <listitem>
5380f8248bfSmrg      <para>
5390f8248bfSmrg        1 &rArr; latch, 0 &rArr; unlatch; only for mods selected by <parameter>affect</parameter>
5400f8248bfSmrg      </para>
5410f8248bfSmrg    </listitem>
5420f8248bfSmrg  </varlistentry>
5430f8248bfSmrg</variablelist>
544e9fcaa8aSmrg
545e9fcaa8aSmrg<para>
5460f8248bfSmrg<function>XkbLatchModifiers</function>
5470f8248bfSmrgsends a request to the server to latch the real modifiers selected by both
5480f8248bfSmrg<parameter>affect</parameter>
5490f8248bfSmrgand
5500f8248bfSmrg<parameter>values</parameter>
5510f8248bfSmrgand to unlatch the real modifiers selected by
5520f8248bfSmrg<parameter>affect</parameter>
5530f8248bfSmrgbut not selected by
5540f8248bfSmrg<parameter>values</parameter>.
5550f8248bfSmrg<function>XkbLatchModifiers</function>
5560f8248bfSmrgdoes not wait for a reply from the server. It returns
5570f8248bfSmrg<symbol>True</symbol>
5580f8248bfSmrgif the request was sent, and
5590f8248bfSmrg<symbol>False</symbol>
5600f8248bfSmrgotherwise.
561e9fcaa8aSmrg</para>
562e9fcaa8aSmrg
563e9fcaa8aSmrg
564e9fcaa8aSmrg</sect2>
565eb411b4bSmrg<sect2 id='Changing_Groups'>
566e9fcaa8aSmrg<title>Changing Groups</title>
567e9fcaa8aSmrg
5680f8248bfSmrg<indexterm zone="Changing_Groups">
5690f8248bfSmrg<primary>keysym groups</primary></indexterm>
5700f8248bfSmrg<indexterm zone="Changing_Groups">
5710f8248bfSmrg<primary>group</primary><secondary>keysym</secondary></indexterm>
5720f8248bfSmrg
573e9fcaa8aSmrg<para>
574e9fcaa8aSmrgReference the keysym group indices with these symbolic constants:
575e9fcaa8aSmrg</para>
576e9fcaa8aSmrg
5770f8248bfSmrg<table id='table5.2' frame='topbot'>
578e9fcaa8aSmrg<title>Symbolic Group Names</title>
579eb411b4bSmrg<?dbfo keep-together="always" ?>
580eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
581eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
582eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
583e9fcaa8aSmrg<tbody>
584eb411b4bSmrg  <row rowsep='1'>
585e9fcaa8aSmrg    <entry>Symbolic Name</entry>
586e9fcaa8aSmrg    <entry>Value</entry>
587e9fcaa8aSmrg  </row>
588eb411b4bSmrg  <row>
5890f8248bfSmrg    <entry><symbol>XkbGroup1Index</symbol></entry>
590e9fcaa8aSmrg    <entry>0</entry>
591e9fcaa8aSmrg  </row>
592eb411b4bSmrg  <row>
5930f8248bfSmrg    <entry><symbol>XkbGroup2Index</symbol></entry>
594e9fcaa8aSmrg    <entry>1</entry>
595e9fcaa8aSmrg  </row>
596eb411b4bSmrg  <row>
5970f8248bfSmrg    <entry><symbol>XkbGroup3Index</symbol></entry>
598e9fcaa8aSmrg    <entry>2</entry>
599e9fcaa8aSmrg  </row>
600eb411b4bSmrg  <row>
6010f8248bfSmrg    <entry><symbol>XkbGroup4Index</symbol></entry>
602e9fcaa8aSmrg    <entry>3</entry>
603e9fcaa8aSmrg  </row>
604e9fcaa8aSmrg</tbody>
605e9fcaa8aSmrg</tgroup>
606e9fcaa8aSmrg</table>
607e9fcaa8aSmrg
608e9fcaa8aSmrg<para>
6090f8248bfSmrgTo lock the keysym group, use
6100f8248bfSmrg<function>XkbLockGroup</function>.
611e9fcaa8aSmrg</para>
612e9fcaa8aSmrg
6130f8248bfSmrg<indexterm significance="preferred" zone="XkbLockGroup"><primary><function>XkbLockGroup</function></primary></indexterm>
6140f8248bfSmrg<funcsynopsis id="XkbLockGroup">
6150f8248bfSmrg  <funcprototype>
6160f8248bfSmrg    <funcdef>Bool <function>XkbLockGroup</function></funcdef>
6170f8248bfSmrg<!-- (
6180f8248bfSmrg<parameter>display, device_spec, group</parameter>
6190f8248bfSmrg) -->
6200f8248bfSmrg
6210f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
6220f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
6230f8248bfSmrg    <paramdef>unsigned int <parameter>group</parameter></paramdef>
6240f8248bfSmrg  </funcprototype>
6250f8248bfSmrg</funcsynopsis>
6260f8248bfSmrg<variablelist>
6270f8248bfSmrg  <varlistentry>
6280f8248bfSmrg    <term>
6290f8248bfSmrg      <parameter>display</parameter>
6300f8248bfSmrg    </term>
6310f8248bfSmrg    <listitem>
6320f8248bfSmrg      <para>
6330f8248bfSmrg        connection to the X server
6340f8248bfSmrg      </para>
6350f8248bfSmrg    </listitem>
6360f8248bfSmrg  </varlistentry>
6370f8248bfSmrg  <varlistentry>
6380f8248bfSmrg    <term>
6390f8248bfSmrg      <parameter>device_spec</parameter>
6400f8248bfSmrg    </term>
6410f8248bfSmrg    <listitem>
6420f8248bfSmrg      <para>
6430f8248bfSmrg        device ID, or <symbol>XkbUseCoreKbd</symbol>
6440f8248bfSmrg      </para>
6450f8248bfSmrg    </listitem>
6460f8248bfSmrg  </varlistentry>
6470f8248bfSmrg  <varlistentry>
6480f8248bfSmrg    <term>
6490f8248bfSmrg      <parameter>group</parameter>
6500f8248bfSmrg    </term>
6510f8248bfSmrg    <listitem>
6520f8248bfSmrg      <para>
6530f8248bfSmrg        index of the keysym group to lock
6540f8248bfSmrg      </para>
6550f8248bfSmrg    </listitem>
6560f8248bfSmrg  </varlistentry>
6570f8248bfSmrg</variablelist>
658e9fcaa8aSmrg
659e9fcaa8aSmrg<para>
6600f8248bfSmrg<function>XkbLockGroup</function>
6610f8248bfSmrgsends a request to the server to lock the specified
6620f8248bfSmrg<parameter>group</parameter>
6630f8248bfSmrgand does not wait for a reply. It returns
6640f8248bfSmrg<symbol>True</symbol>
6650f8248bfSmrgif the request was sent and
6660f8248bfSmrg<symbol>False</symbol>
6670f8248bfSmrgotherwise.
668e9fcaa8aSmrg</para>
669e9fcaa8aSmrg
670e9fcaa8aSmrg
671e9fcaa8aSmrg<para>
6720f8248bfSmrgTo latch the keysym group, use
6730f8248bfSmrg<function>XkbLatchGroup</function>.
674e9fcaa8aSmrg</para>
675e9fcaa8aSmrg
676e9fcaa8aSmrg
6770f8248bfSmrg<indexterm significance="preferred" zone="XkbLatchGroup"><primary><function>XkbLatchGroup</function></primary></indexterm>
6780f8248bfSmrg<funcsynopsis id="XkbLatchGroup">
6790f8248bfSmrg  <funcprototype>
6800f8248bfSmrg    <funcdef>Bool <function>XkbLatchGroup</function></funcdef>
6810f8248bfSmrg<!-- (
6820f8248bfSmrg<parameter>display, device_spec, group</parameter>
6830f8248bfSmrg) -->
6840f8248bfSmrg
6850f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
6860f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
6870f8248bfSmrg    <paramdef>unsigned int <parameter>group</parameter></paramdef>
6880f8248bfSmrg  </funcprototype>
6890f8248bfSmrg</funcsynopsis>
6900f8248bfSmrg<variablelist>
6910f8248bfSmrg  <varlistentry>
6920f8248bfSmrg    <term>
6930f8248bfSmrg      <parameter>display</parameter>
6940f8248bfSmrg    </term>
6950f8248bfSmrg    <listitem>
6960f8248bfSmrg      <para>
6970f8248bfSmrg        connection to the X server
6980f8248bfSmrg      </para>
6990f8248bfSmrg    </listitem>
7000f8248bfSmrg  </varlistentry>
7010f8248bfSmrg  <varlistentry>
7020f8248bfSmrg    <term>
7030f8248bfSmrg      <parameter>device_spec</parameter>
7040f8248bfSmrg    </term>
7050f8248bfSmrg    <listitem>
7060f8248bfSmrg      <para>
7070f8248bfSmrg        device ID, or <symbol>XkbUseCoreKbd</symbol>
7080f8248bfSmrg      </para>
7090f8248bfSmrg    </listitem>
7100f8248bfSmrg  </varlistentry>
7110f8248bfSmrg  <varlistentry>
7120f8248bfSmrg    <term>
7130f8248bfSmrg      <parameter>group</parameter>
7140f8248bfSmrg    </term>
7150f8248bfSmrg    <listitem>
7160f8248bfSmrg      <para>
7170f8248bfSmrg        index of the keysym group to latch
7180f8248bfSmrg      </para>
7190f8248bfSmrg    </listitem>
7200f8248bfSmrg  </varlistentry>
7210f8248bfSmrg</variablelist>
722e9fcaa8aSmrg
723e9fcaa8aSmrg<para>
7240f8248bfSmrg<function>XkbLatchGroup</function>
7250f8248bfSmrgsends a request to the server to latch the specified group and does not wait for a reply. It returns
7260f8248bfSmrg<symbol>True</symbol>
7270f8248bfSmrgif the request was sent and
7280f8248bfSmrg<symbol>False</symbol>
7290f8248bfSmrgotherwise.
730e9fcaa8aSmrg</para>
731e9fcaa8aSmrg
732e9fcaa8aSmrg
733e9fcaa8aSmrg</sect2>
734e9fcaa8aSmrg</sect1>
735eb411b4bSmrg<sect1 id='Determining_Keyboard_State'>
736e9fcaa8aSmrg<title>Determining Keyboard State</title>
737e9fcaa8aSmrg
7380f8248bfSmrg<indexterm significance="preferred" zone="Determining_Keyboard_State">
7390f8248bfSmrg<primary><structname>XkbStateRec</structname></primary></indexterm>
7400f8248bfSmrg
741e9fcaa8aSmrg<para>
7420f8248bfSmrgXkb keyboard state may be represented in an
7430f8248bfSmrg<structname>XkbStateRec</structname>
7440f8248bfSmrgstructure:
745e9fcaa8aSmrg
7460f8248bfSmrg<programlisting>
747e9fcaa8aSmrgtypedef struct {
7480f8248bfSmrg    unsigned char      group;                /* effective group index */
7490f8248bfSmrg    unsigned char      base_group;           /* base group index */
7500f8248bfSmrg    unsigned char      latched_group;        /* latched group index */
7510f8248bfSmrg    unsigned char      locked_group;         /* locked group index */
7520f8248bfSmrg    unsigned char      mods;                 /* effective modifiers */
7530f8248bfSmrg    unsigned char      base_mods;            /* base modifiers */
7540f8248bfSmrg    unsigned char      latched_mods;         /* latched modifiers */
7550f8248bfSmrg    unsigned char      locked_mods;          /* locked modifiers */
7560f8248bfSmrg    unsigned char      compat_state;         /* effective group &rArr; modifiers */
7570f8248bfSmrg    unsigned char      grab_mods;            /* modifiers used for grabs */
7580f8248bfSmrg    unsigned char      compat_grab_mods;     /* mods used for compatibility
7590f8248bfSmrg                                                mode grabs */
7600f8248bfSmrg    unsigned char      lookup_mods;          /* mods used to lookup symbols */
7610f8248bfSmrg    unsigned char      compat_lookup_mods;   /* mods used for compatibility
7620f8248bfSmrg                                                lookup */
7630f8248bfSmrg    unsigned short     ptr_buttons;          /* 1 bit &rArr; corresponding
7640f8248bfSmrg                                                pointer btn is down */
7650f8248bfSmrg} <structname>XkbStateRec</structname>, *XkbStatePtr;
766e9fcaa8aSmrg</programlisting></para>
767e9fcaa8aSmrg
768e9fcaa8aSmrg<para>
7690f8248bfSmrgTo obtain the keyboard state, use
7700f8248bfSmrg<function>XkbGetState</function>.
771e9fcaa8aSmrg</para>
772e9fcaa8aSmrg
7730f8248bfSmrg<indexterm significance="preferred" zone="XkbGetState"><primary><function>XkbGetState</function></primary></indexterm>
7740f8248bfSmrg<funcsynopsis id="XkbGetState">
7750f8248bfSmrg  <funcprototype>
7760f8248bfSmrg    <funcdef>Status <function>XkbGetState</function></funcdef>
7770f8248bfSmrg<!-- (
7780f8248bfSmrg<parameter>display</parameter>,
7790f8248bfSmrg<parameter>device_spec</parameter>,
7800f8248bfSmrg<parameter>state_return</parameter>
7810f8248bfSmrg) -->
7820f8248bfSmrg
7830f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
7840f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
7850f8248bfSmrg    <paramdef>XkbStatePtr <parameter>state_return</parameter></paramdef>
7860f8248bfSmrg  </funcprototype>
7870f8248bfSmrg</funcsynopsis>
7880f8248bfSmrg<variablelist>
7890f8248bfSmrg  <varlistentry>
7900f8248bfSmrg    <term>
7910f8248bfSmrg      <parameter>display</parameter>
7920f8248bfSmrg    </term>
7930f8248bfSmrg    <listitem>
7940f8248bfSmrg      <para>
7950f8248bfSmrg        connection to the X server
7960f8248bfSmrg      </para>
7970f8248bfSmrg    </listitem>
7980f8248bfSmrg  </varlistentry>
7990f8248bfSmrg  <varlistentry>
8000f8248bfSmrg    <term>
8010f8248bfSmrg      <parameter>device_spec</parameter>
8020f8248bfSmrg    </term>
8030f8248bfSmrg    <listitem>
8040f8248bfSmrg      <para>
8050f8248bfSmrg        device ID, or <symbol>XkbUseCoreKbd</symbol>
8060f8248bfSmrg      </para>
8070f8248bfSmrg    </listitem>
8080f8248bfSmrg  </varlistentry>
8090f8248bfSmrg  <varlistentry>
8100f8248bfSmrg    <term>
8110f8248bfSmrg      <parameter>state_return</parameter>
8120f8248bfSmrg    </term>
8130f8248bfSmrg    <listitem>
8140f8248bfSmrg      <para>
8150f8248bfSmrg        backfilled with Xkb state
8160f8248bfSmrg      </para>
8170f8248bfSmrg    </listitem>
8180f8248bfSmrg  </varlistentry>
8190f8248bfSmrg</variablelist>
820e9fcaa8aSmrg
821e9fcaa8aSmrg<para>
8220f8248bfSmrgThe
8230f8248bfSmrg<function>XkbGetState</function>
8240f8248bfSmrgfunction queries the server for the current keyboard state, waits for a reply, and then backfills
8250f8248bfSmrg<parameter>state_return</parameter>
8260f8248bfSmrgwith the results.
827e9fcaa8aSmrg</para>
828e9fcaa8aSmrg
829e9fcaa8aSmrg
830e9fcaa8aSmrg<para>
831e9fcaa8aSmrgAll 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.
832e9fcaa8aSmrg</para>
833e9fcaa8aSmrg
834e9fcaa8aSmrg
835e9fcaa8aSmrg</sect1>
836eb411b4bSmrg<sect1 id='Tracking_Keyboard_State'>
837e9fcaa8aSmrg<title>Tracking Keyboard State</title>
838e9fcaa8aSmrg
8390f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Keyboard_State">
8400f8248bfSmrg<primary>events</primary><secondary><symbol>XkbStateNotify</symbol></secondary></indexterm>
8410f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Keyboard_State">
8420f8248bfSmrg<primary><structname>XkbStateNotifyEvent</structname></primary></indexterm>
8430f8248bfSmrg
844e9fcaa8aSmrg<para>
8450f8248bfSmrgThe Xkb extension reports
8460f8248bfSmrg<symbol>XkbStateNotify</symbol>
8470f8248bfSmrgevents 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,
8480f8248bfSmrg<symbol>XkbStateNotify</symbol>
8490f8248bfSmrgevents are reported to all interested clients without regard to the current keyboard input focus or grab state.
850e9fcaa8aSmrg</para>
851e9fcaa8aSmrg
852e9fcaa8aSmrg
853e9fcaa8aSmrg<para>
8540f8248bfSmrgThere are many different types of Xkb state changes. Xkb defines an event
8550f8248bfSmrgdetail mask corresponding to each type of change. The event detail masks are
8560f8248bfSmrglisted in <link linkend="table5.3">Table 5.3</link>.
857e9fcaa8aSmrg</para>
858e9fcaa8aSmrg
8590f8248bfSmrg<table id='table5.3' frame='topbot'>
860e9fcaa8aSmrg<title>XkbStateNotify Event Detail Masks</title>
861eb411b4bSmrg<?dbfo keep-together="always" ?>
862eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
863eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
864eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
865e9fcaa8aSmrg<thead>
866eb411b4bSmrg  <row rowsep='1'>
867e9fcaa8aSmrg    <entry>Mask</entry>
868e9fcaa8aSmrg    <entry>Value</entry>
869e9fcaa8aSmrg  </row>
870e9fcaa8aSmrg</thead>
871e9fcaa8aSmrg<tbody>
872eb411b4bSmrg  <row>
8730f8248bfSmrg    <entry><symbol>XkbModifierStateMask</symbol></entry>
874e9fcaa8aSmrg    <entry>(1L &lt;&lt; 0)</entry>
875e9fcaa8aSmrg  </row>
876eb411b4bSmrg  <row>
8770f8248bfSmrg    <entry><symbol>XkbModifierBaseMask</symbol></entry>
878e9fcaa8aSmrg    <entry>(1L &lt;&lt; 1)</entry>
879e9fcaa8aSmrg  </row>
880eb411b4bSmrg  <row>
8810f8248bfSmrg    <entry><symbol>XkbModifierLatchMask</symbol></entry>
882e9fcaa8aSmrg    <entry>(1L &lt;&lt; 2)</entry>
883e9fcaa8aSmrg  </row>
884eb411b4bSmrg  <row>
8850f8248bfSmrg    <entry><symbol>XkbModifierLockMask</symbol></entry>
886e9fcaa8aSmrg    <entry>(1L &lt;&lt; 3)</entry>
887e9fcaa8aSmrg  </row>
888eb411b4bSmrg  <row>
8890f8248bfSmrg    <entry><symbol>XkbGroupStateMask</symbol></entry>
890e9fcaa8aSmrg    <entry>(1L &lt;&lt; 4)</entry>
891e9fcaa8aSmrg  </row>
892eb411b4bSmrg  <row>
8930f8248bfSmrg    <entry><symbol>XkbGroupBaseMask</symbol></entry>
894e9fcaa8aSmrg    <entry>(1L &lt;&lt; 5)</entry>
895e9fcaa8aSmrg  </row>
896eb411b4bSmrg  <row>
8970f8248bfSmrg    <entry><symbol>XkbGroupLatchMask</symbol></entry>
898e9fcaa8aSmrg    <entry>(1L &lt;&lt; 6)</entry>
899e9fcaa8aSmrg  </row>
900eb411b4bSmrg  <row>
9010f8248bfSmrg    <entry><symbol>XkbGroupLockMask</symbol></entry>
902e9fcaa8aSmrg    <entry>(1L &lt;&lt; 7)</entry>
903e9fcaa8aSmrg  </row>
904eb411b4bSmrg  <row>
9050f8248bfSmrg    <entry><symbol>XkbCompatStateMask</symbol></entry>
906e9fcaa8aSmrg    <entry>(1L &lt;&lt; 8)</entry>
907e9fcaa8aSmrg  </row>
908eb411b4bSmrg  <row>
9090f8248bfSmrg    <entry><symbol>XkbGrabModsMask</symbol></entry>
910e9fcaa8aSmrg    <entry>(1L &lt;&lt; 9)</entry>
911e9fcaa8aSmrg  </row>
912eb411b4bSmrg  <row>
9130f8248bfSmrg    <entry><symbol>XkbCompatGrabModsMask</symbol></entry>
914e9fcaa8aSmrg    <entry>(1L &lt;&lt; 10)</entry>
915e9fcaa8aSmrg  </row>
916eb411b4bSmrg  <row>
9170f8248bfSmrg    <entry><symbol>XkbLookupModsMask</symbol></entry>
918e9fcaa8aSmrg    <entry>(1L &lt;&lt; 11)</entry>
919e9fcaa8aSmrg  </row>
920eb411b4bSmrg  <row>
9210f8248bfSmrg    <entry><symbol>XkbCompatLookupModsMask</symbol></entry>
922e9fcaa8aSmrg    <entry>(1L &lt;&lt; 12)</entry>
923e9fcaa8aSmrg  </row>
924eb411b4bSmrg  <row>
9250f8248bfSmrg    <entry><symbol>XkbPointerButtonMask</symbol></entry>
926e9fcaa8aSmrg    <entry>(1L &lt;&lt; 13)</entry>
927e9fcaa8aSmrg  </row>
928eb411b4bSmrg  <row>
9290f8248bfSmrg    <entry><symbol>XkbAllStateComponentsMask</symbol></entry>
930e9fcaa8aSmrg    <entry>(0x3fff)</entry>
931e9fcaa8aSmrg  </row>
932e9fcaa8aSmrg</tbody>
933e9fcaa8aSmrg</tgroup>
934e9fcaa8aSmrg</table>
935e9fcaa8aSmrg
936e9fcaa8aSmrg<para>
9370f8248bfSmrgTo track changes in the keyboard state for a particular device, select to receive
9380f8248bfSmrg<symbol>XkbStateNotify</symbol>
9390f8248bfSmrgevents by calling either
9400f8248bfSmrg<function>XkbSelectEvents</function>
9410f8248bfSmrgor
9420f8248bfSmrg<function>XkbSelectEventDetails</function>
9430f8248bfSmrg(see <link linkend="Selecting_Xkb_Events">section 4.3</link>).
944e9fcaa8aSmrg</para>
945e9fcaa8aSmrg
946e9fcaa8aSmrg
947e9fcaa8aSmrg<para>
9480f8248bfSmrgTo receive
9490f8248bfSmrg<symbol>XkbStateNotify</symbol>
9500f8248bfSmrgevents under all possible conditions, use
9510f8248bfSmrg<function>XkbSelectEvents</function>
9520f8248bfSmrgand pass
9530f8248bfSmrg<symbol>XkbStateNotifyMask</symbol>
9540f8248bfSmrgin both
9550f8248bfSmrg<parameter>bits_to_change</parameter>
9560f8248bfSmrgand
9570f8248bfSmrg<parameter>values_for_bits</parameter>.
958e9fcaa8aSmrg</para>
959e9fcaa8aSmrg
960e9fcaa8aSmrg
961e9fcaa8aSmrg<para>
9620f8248bfSmrgTo receive
9630f8248bfSmrg<symbol>XkbStateNotify</symbol>
9640f8248bfSmrgevents only under certain conditions, use
9650f8248bfSmrg<function>XkbSelectEventDetails</function>
9660f8248bfSmrgusing
9670f8248bfSmrg<symbol>XkbStateNotify</symbol>
9680f8248bfSmrgas the
9690f8248bfSmrg<structfield>event_type</structfield>
9700f8248bfSmrgand specifying the desired state changes in
9710f8248bfSmrg<parameter>bits_to_change</parameter>
9720f8248bfSmrgand
9730f8248bfSmrg<parameter>values_for_bits</parameter>
9740f8248bfSmrgusing mask bits from <link linkend="table5.3">Table 5.3</link>.
975e9fcaa8aSmrg</para>
976e9fcaa8aSmrg
977e9fcaa8aSmrg
978e9fcaa8aSmrg<para>
9790f8248bfSmrgThe structure for
9800f8248bfSmrg<symbol>XkbStateNotify</symbol>
9810f8248bfSmrgevents is:
982e9fcaa8aSmrg
9830f8248bfSmrg<programlisting>
984e9fcaa8aSmrgtypedef struct {
9850f8248bfSmrg    int            type;            /* Xkb extension base event code */
9860f8248bfSmrg    unsigned long  serial;          /* X server serial number for event */
9870f8248bfSmrg    Bool           send_event;      /* <symbol>True</symbol> &rArr; synthetically generated */
9880f8248bfSmrg    Display *      display;         /* server connection where event generated */
9890f8248bfSmrg    Time           time;            /* server time when event generated */
9900f8248bfSmrg    int            xkb_type;        /* <symbol>XkbStateNotify</symbol> */
9910f8248bfSmrg    int            device;          /* Xkb device ID,
9920f8248bfSmrg                                       will not be <symbol>XkbUseCoreKbd</symbol> */
9930f8248bfSmrg    unsigned int   changed;         /* bits indicating what has changed */
9940f8248bfSmrg    int            group;           /* group index of effective group */
9950f8248bfSmrg    int            base_group;      /* group index of base group */
9960f8248bfSmrg    int            latched_group;   /* group index of latched group */
9970f8248bfSmrg    int            locked_group;    /* group index of locked group */
9980f8248bfSmrg    unsigned int   mods;            /* effective modifiers */
9990f8248bfSmrg    unsigned int   base_mods;       /* base modifiers */
10000f8248bfSmrg    unsigned int   latched_mods;    /* latched modifiers */
10010f8248bfSmrg    unsigned int   locked_mods;     /* locked modifiers */
10020f8248bfSmrg    int            compat_state;    /* computed compatibility state */
10030f8248bfSmrg    unsigned char  grab_mods;       /* modifiers used for grabs */
10040f8248bfSmrg    unsigned char  compat_grab_mods; /* modifiers used for compatibility grabs */
10050f8248bfSmrg    unsigned char  lookup_mods;     /* modifiers used to lookup symbols */
10060f8248bfSmrg    unsigned char  compat_lookup_mods; /* mods used for compatibility look up */
10070f8248bfSmrg    int            ptr_buttons;     /* core pointer buttons */
10080f8248bfSmrg    KeyCode        keycode;         /* keycode causing event,
10090f8248bfSmrg                                       0 if programmatic */
10100f8248bfSmrg    char           event_type;      /* core event if <structfield>req_major</structfield> or <structfield>req_minor</structfield>
10110f8248bfSmrg                                       non zero */
10120f8248bfSmrg    char           req_major;       /* major request code if program trigger,
10130f8248bfSmrg                                       else 0 */
10140f8248bfSmrg    char           req_minor;       /* minor request code if program trigger,
10150f8248bfSmrg                                       else 0 */
10160f8248bfSmrg} <structname>XkbStateNotifyEvent</structname>;
1017e9fcaa8aSmrg</programlisting></para>
1018e9fcaa8aSmrg
1019e9fcaa8aSmrg<para>
10200f8248bfSmrgWhen you receive an
10210f8248bfSmrg<symbol>XkbStateNotify</symbol>
10220f8248bfSmrgevent, the
10230f8248bfSmrg<structfield>changed</structfield>
10240f8248bfSmrgfield indicates which elements of keyboard state have changed.
10250f8248bfSmrgThis will be the bitwise inclusive OR of one or more of the
10260f8248bfSmrg<symbol>XkbStateNotify</symbol>
10270f8248bfSmrgevent detail masks shown in <link linkend="table5.3">Table 5.3</link>.
10280f8248bfSmrgAll fields reported in the event are valid, but only those indicated in
10290f8248bfSmrg<structfield>changed</structfield>
10300f8248bfSmrghave changed values.
1031e9fcaa8aSmrg</para>
1032e9fcaa8aSmrg
1033e9fcaa8aSmrg
1034e9fcaa8aSmrg<para>
10350f8248bfSmrgThe
10360f8248bfSmrg<structfield>group</structfield>
10370f8248bfSmrgfield is the group index of the effective keysym group. The
10380f8248bfSmrg<structfield>base_group</structfield>,
10390f8248bfSmrg<structfield>latched_group</structfield>,
10400f8248bfSmrgand
10410f8248bfSmrg<structfield>locked_group</structfield>
10420f8248bfSmrgfields are set to a group index value representing the base group,
1043e9fcaa8aSmrgthe latched group, and the locked group, respectively. The X
1044e9fcaa8aSmrgserver can set the modifier and compatibility state fields to
1045e9fcaa8aSmrga union of the core modifier mask bits; this union represents the
10460f8248bfSmrgcorresponding modifier states. The <structfield>ptr_buttons</structfield>
10470f8248bfSmrgfield gives the state of the core pointer buttons as a
1048e9fcaa8aSmrgmask composed of an inclusive OR of zero or more of the
1049e9fcaa8aSmrgcore pointer button masks.
1050e9fcaa8aSmrg</para>
1051e9fcaa8aSmrg
1052e9fcaa8aSmrg
1053e9fcaa8aSmrg<para>
1054e9fcaa8aSmrgXkb state changes can occur either in response to keyboard
1055e9fcaa8aSmrgactivity or under application control. If a key event
10560f8248bfSmrgcaused the state change, the
10570f8248bfSmrg<structfield>keycode</structfield>
10580f8248bfSmrgfield gives the keycode of the key event, and the
10590f8248bfSmrg<structfield>event_type</structfield>
10600f8248bfSmrgfield is set to either <symbol>KeyPress</symbol>
10610f8248bfSmrgor
10620f8248bfSmrg<symbol>KeyRelease</symbol>.
10630f8248bfSmrgIf a pointer button event caused the state change, the
10640f8248bfSmrg<structfield>keycode</structfield>
10650f8248bfSmrgfield is zero, and the <structfield>event_type</structfield>
10660f8248bfSmrgfield is set to either <symbol>ButtonPress</symbol>
10670f8248bfSmrgor <symbol>ButtonRelease</symbol>.
10680f8248bfSmrgOtherwise, the major and minor codes of the request that caused the
10690f8248bfSmrgstate change are given in the
10700f8248bfSmrg<structfield>req_major</structfield>
10710f8248bfSmrgand
10720f8248bfSmrg<structfield>req_minor</structfield>
10730f8248bfSmrgfields, and the
10740f8248bfSmrg<structfield>keycode</structfield>
10750f8248bfSmrgfield is zero. The
10760f8248bfSmrg<structfield>req_major</structfield>
10770f8248bfSmrgvalue is the same as the major extension opcode.
1078e9fcaa8aSmrg</para>
1079e9fcaa8aSmrg</sect1>
1080e9fcaa8aSmrg</chapter>
1081