ch04.xml revision e9fcaa8a
1e9fcaa8aSmrg<chapter id='xkb_events'>
2e9fcaa8aSmrg<title>Xkb Events</title>
3e9fcaa8aSmrg
4e9fcaa8aSmrg<para>
5e9fcaa8aSmrgThe primary way the X server communicates with clients is by sending X events
6e9fcaa8aSmrgto them. Some events are sent to all clients, while others are sent only to
7e9fcaa8aSmrgclients that have requested them. Some of the events that can be requested are
8e9fcaa8aSmrgassociated with a particular window and are only sent to those clients who have
9e9fcaa8aSmrgboth requested the event and specified the window in which the event occurred.
10e9fcaa8aSmrg</para>
11e9fcaa8aSmrg
12e9fcaa8aSmrg
13e9fcaa8aSmrg<para>
14e9fcaa8aSmrgThe Xkb extension uses events to communicate the keyboard status to interested
15e9fcaa8aSmrgclients. These events are not associated with a particular window. Instead, all
16e9fcaa8aSmrgXkb keyboard status events are reported to all interested clients, regardless
17e9fcaa8aSmrgof which window currently has the keyboard focus and regardless of the grab
18e9fcaa8aSmrgstate of the keyboard.<footnote><para>The one exception to this rule is the
19e9fcaa8aSmrgXkbExtensionDeviceNotify event report that is sent when a client attempts to
20e9fcaa8aSmrguse an unsupported feature of an X Input Extension device (see section 21.4).
21e9fcaa8aSmrg</para></footnote> <!-- xref -->
22e9fcaa8aSmrg</para>
23e9fcaa8aSmrg
24e9fcaa8aSmrg
25e9fcaa8aSmrg<para>
26e9fcaa8aSmrgThe X server reports the events defined by the Xkb extension to your client
27e9fcaa8aSmrgapplication only if you have requested them. You may request Xkb events by
28e9fcaa8aSmrgcalling either <emphasis>
29e9fcaa8aSmrgXkbSelectEvents</emphasis>
30e9fcaa8aSmrg or <emphasis>
31e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
32e9fcaa8aSmrg. <emphasis>
33e9fcaa8aSmrgXkbSelectEvents</emphasis>
34e9fcaa8aSmrg requests Xkb events by their event type and causes them to be reported to your
35e9fcaa8aSmrgclient application under all circumstances. You can specify a finer granularity
36e9fcaa8aSmrgfor event reporting by using <emphasis>
37e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
38e9fcaa8aSmrg; in this case events are reported only when the specific detail conditions you
39e9fcaa8aSmrgspecify have been met.
40e9fcaa8aSmrg</para>
41e9fcaa8aSmrg
42e9fcaa8aSmrg<sect1 id='xkb_event_types'>
43e9fcaa8aSmrg<title>Xkb Event Types</title>
44e9fcaa8aSmrg
45e9fcaa8aSmrg<para>
46e9fcaa8aSmrgThe Xkb Extension adds new event types to the X protocol definition. An Xkb
47e9fcaa8aSmrgevent type is defined by two fields in the X event data structure. One is the
48e9fcaa8aSmrg<emphasis>
49e9fcaa8aSmrgtype</emphasis>
50e9fcaa8aSmrg field, containing the <emphasis>
51e9fcaa8aSmrgbase event code.</emphasis>
52e9fcaa8aSmrg This base event code is a value the X server assigns to each X extension at
53e9fcaa8aSmrgruntime and thatidentifies the extension that generated the event; thus, the
54e9fcaa8aSmrgevent code in the <emphasis>
55e9fcaa8aSmrgtype</emphasis>
56e9fcaa8aSmrg field identifies the event as an Xkb extension event, rather than an event
57e9fcaa8aSmrgfrom another extension or a core X protocol event. You can obtain the base
58e9fcaa8aSmrgevent code via a call to <emphasis>
59e9fcaa8aSmrgXkbQueryExtension</emphasis>
60e9fcaa8aSmrg or <emphasis>
61e9fcaa8aSmrgXkbOpenDisplay</emphasis>
62e9fcaa8aSmrg. The second field is the Xkb event type, which contains a value uniquely
63e9fcaa8aSmrgidentifying each different Xkb event type. Possible values are defined by
64e9fcaa8aSmrgconstants declared in the header file &lt;X11/extensions/Xkb.h&gt;.
65e9fcaa8aSmrg</para>
66e9fcaa8aSmrg
67e9fcaa8aSmrg
68e9fcaa8aSmrg<para>
69e9fcaa8aSmrgTable 4.1 lists the categories of events defined by Xkb and their associated
70e9fcaa8aSmrgevent types, as defined in <emphasis>
71e9fcaa8aSmrgXkb.h</emphasis>
72e9fcaa8aSmrg. Each event is described in more detail in the section referenced for that
73e9fcaa8aSmrgevent.
74e9fcaa8aSmrg</para>
75e9fcaa8aSmrg
76e9fcaa8aSmrg<table frame='none'>
77e9fcaa8aSmrg<title>Xkb Event Types</title>
78e9fcaa8aSmrg<tgroup cols='4'>
79e9fcaa8aSmrg<colspec colsep='0'/>
80e9fcaa8aSmrg<colspec colsep='0'/>
81e9fcaa8aSmrg<colspec colsep='0'/>
82e9fcaa8aSmrg<colspec colsep='0'/>
83e9fcaa8aSmrg<thead>
84e9fcaa8aSmrg<row rowsep='0'>
85e9fcaa8aSmrg  <entry>Event Type</entry>
86e9fcaa8aSmrg  <entry>Conditions Generating Event</entry>
87e9fcaa8aSmrg  <entry>Section</entry>
88e9fcaa8aSmrg  <entry>Page</entry>
89e9fcaa8aSmrg</row>
90e9fcaa8aSmrg</thead>
91e9fcaa8aSmrg<tbody>
92e9fcaa8aSmrg<row rowsep='0'>
93e9fcaa8aSmrg  <entry>
94e9fcaa8aSmrg    <para><emphasis>XkbNewKeyboardNotify</emphasis></para>
95e9fcaa8aSmrg  </entry>
96e9fcaa8aSmrg  <entry>
97e9fcaa8aSmrg    <para>Keyboard geometry; keycode range change</para>
98e9fcaa8aSmrg  </entry>
99e9fcaa8aSmrg  <entry>
100e9fcaa8aSmrg    <para>19</para>
101e9fcaa8aSmrg  </entry>
102e9fcaa8aSmrg  <entry>
103e9fcaa8aSmrg    <para>187</para>
104e9fcaa8aSmrg  </entry>
105e9fcaa8aSmrg</row>
106e9fcaa8aSmrg<row rowsep='0'>
107e9fcaa8aSmrg  <entry>
108e9fcaa8aSmrg    <para>
109e9fcaa8aSmrg    <emphasis>XkbMapNotify</emphasis>
110e9fcaa8aSmrg    </para>
111e9fcaa8aSmrg  </entry>
112e9fcaa8aSmrg  <entry>
113e9fcaa8aSmrg    <para>Keyboard mapping change</para>
114e9fcaa8aSmrg  </entry>
115e9fcaa8aSmrg  <entry>
116e9fcaa8aSmrg    <para>14.4</para>
117e9fcaa8aSmrg  </entry>
118e9fcaa8aSmrg  <entry>
119e9fcaa8aSmrg    <para>122</para>
120e9fcaa8aSmrg  </entry>
121e9fcaa8aSmrg</row>
122e9fcaa8aSmrg<row rowsep='0'>
123e9fcaa8aSmrg  <entry>
124e9fcaa8aSmrg    <para><emphasis>XkbStateNotify</emphasis></para>
125e9fcaa8aSmrg  </entry>
126e9fcaa8aSmrg  <entry>
127e9fcaa8aSmrg    <para>Keyboard state change</para>
128e9fcaa8aSmrg  </entry>
129e9fcaa8aSmrg  <entry>
130e9fcaa8aSmrg    <para>5.4</para>
131e9fcaa8aSmrg  </entry>
132e9fcaa8aSmrg  <entry>
133e9fcaa8aSmrg    <para>25</para>
134e9fcaa8aSmrg  </entry>
135e9fcaa8aSmrg</row>
136e9fcaa8aSmrg<row rowsep='0'>
137e9fcaa8aSmrg  <entry>
138e9fcaa8aSmrg    <para><emphasis>XkbControlsNotify</emphasis></para>
139e9fcaa8aSmrg  </entry>
140e9fcaa8aSmrg  <entry>
141e9fcaa8aSmrg    <para>Keyboard controls state change</para>
142e9fcaa8aSmrg  </entry>
143e9fcaa8aSmrg  <entry>
144e9fcaa8aSmrg    <para>10.11</para>
145e9fcaa8aSmrg  </entry>
146e9fcaa8aSmrg  <entry>
147e9fcaa8aSmrg    <para>79</para>
148e9fcaa8aSmrg  </entry>
149e9fcaa8aSmrg</row>
150e9fcaa8aSmrg<row rowsep='0'>
151e9fcaa8aSmrg  <entry>
152e9fcaa8aSmrg    <para><emphasis>XkbIndicatorStateNotify</emphasis></para>
153e9fcaa8aSmrg  </entry>
154e9fcaa8aSmrg  <entry>
155e9fcaa8aSmrg    <para>Keyboard indicators state change</para>
156e9fcaa8aSmrg  </entry>
157e9fcaa8aSmrg  <entry>
158e9fcaa8aSmrg    <para>8.5</para>
159e9fcaa8aSmrg  </entry>
160e9fcaa8aSmrg  <entry>
161e9fcaa8aSmrg    <para>45</para>
162e9fcaa8aSmrg  </entry>
163e9fcaa8aSmrg</row>
164e9fcaa8aSmrg<row rowsep='0'>
165e9fcaa8aSmrg  <entry>
166e9fcaa8aSmrg    <para><emphasis>XkbIndicatorMapNotify</emphasis></para>
167e9fcaa8aSmrg  </entry>
168e9fcaa8aSmrg  <entry>
169e9fcaa8aSmrg    <para>Keyboard indicators map change</para>
170e9fcaa8aSmrg  </entry>
171e9fcaa8aSmrg  <entry>
172e9fcaa8aSmrg    <para>8.5</para>
173e9fcaa8aSmrg  </entry>
174e9fcaa8aSmrg  <entry>
175e9fcaa8aSmrg    <para>45</para>
176e9fcaa8aSmrg  </entry>
177e9fcaa8aSmrg</row>
178e9fcaa8aSmrg<row rowsep='0'>
179e9fcaa8aSmrg  <entry>
180e9fcaa8aSmrg    <para><emphasis>XkbNamesNotify</emphasis></para>
181e9fcaa8aSmrg  </entry>
182e9fcaa8aSmrg  <entry>
183e9fcaa8aSmrg    <para>Keyboard name change</para>
184e9fcaa8aSmrg  </entry>
185e9fcaa8aSmrg  <entry>
186e9fcaa8aSmrg    <para>18.5</para>
187e9fcaa8aSmrg  </entry>
188e9fcaa8aSmrg  <entry>
189e9fcaa8aSmrg    <para>185</para>
190e9fcaa8aSmrg  </entry>
191e9fcaa8aSmrg</row>
192e9fcaa8aSmrg<row rowsep='0'>
193e9fcaa8aSmrg  <entry>
194e9fcaa8aSmrg    <para><emphasis>XkbCompatMapNotify</emphasis></para>
195e9fcaa8aSmrg  </entry>
196e9fcaa8aSmrg  <entry>
197e9fcaa8aSmrg    <para>Keyboard compatibility map change</para>
198e9fcaa8aSmrg  </entry>
199e9fcaa8aSmrg  <entry>
200e9fcaa8aSmrg    <para>17.5</para>
201e9fcaa8aSmrg  </entry>
202e9fcaa8aSmrg  <entry>
203e9fcaa8aSmrg    <para>178</para>
204e9fcaa8aSmrg  </entry>
205e9fcaa8aSmrg</row>
206e9fcaa8aSmrg<row rowsep='0'>
207e9fcaa8aSmrg  <entry>
208e9fcaa8aSmrg    <para><emphasis>XkbBellNotify</emphasis></para>
209e9fcaa8aSmrg  </entry>
210e9fcaa8aSmrg  <entry>
211e9fcaa8aSmrg    <para>Keyboard bell generated</para>
212e9fcaa8aSmrg  </entry>
213e9fcaa8aSmrg  <entry>
214e9fcaa8aSmrg    <para>9.4</para>
215e9fcaa8aSmrg  </entry>
216e9fcaa8aSmrg  <entry>
217e9fcaa8aSmrg    <para>52</para>
218e9fcaa8aSmrg  </entry>
219e9fcaa8aSmrg</row>
220e9fcaa8aSmrg<row rowsep='0'>
221e9fcaa8aSmrg  <entry>
222e9fcaa8aSmrg    <para><emphasis>XkbActionMessage</emphasis></para>
223e9fcaa8aSmrg  </entry>
224e9fcaa8aSmrg  <entry>
225e9fcaa8aSmrg    <para>Keyboard action message</para>
226e9fcaa8aSmrg  </entry>
227e9fcaa8aSmrg  <entry>
228e9fcaa8aSmrg    <para>16.1.11</para>
229e9fcaa8aSmrg  </entry>
230e9fcaa8aSmrg  <entry>
231e9fcaa8aSmrg    <para>155</para>
232e9fcaa8aSmrg  </entry>
233e9fcaa8aSmrg</row>
234e9fcaa8aSmrg<row rowsep='0'>
235e9fcaa8aSmrg  <entry>
236e9fcaa8aSmrg    <para><emphasis>XkbAccessXNotify</emphasis></para>
237e9fcaa8aSmrg  </entry>
238e9fcaa8aSmrg  <entry>
239e9fcaa8aSmrg    <para>AccessX state change</para>
240e9fcaa8aSmrg  </entry>
241e9fcaa8aSmrg  <entry>
242e9fcaa8aSmrg    <para>10.6.4</para>
243e9fcaa8aSmrg  </entry>
244e9fcaa8aSmrg  <entry>
245e9fcaa8aSmrg    <para>65</para>
246e9fcaa8aSmrg  </entry>
247e9fcaa8aSmrg</row>
248e9fcaa8aSmrg<row rowsep='0'>
249e9fcaa8aSmrg  <entry>
250e9fcaa8aSmrg    <para><emphasis>XkbExtensionDeviceNotify</emphasis></para>
251e9fcaa8aSmrg  </entry>
252e9fcaa8aSmrg  <entry>
253e9fcaa8aSmrg    <para>Extension device change</para>
254e9fcaa8aSmrg  </entry>
255e9fcaa8aSmrg  <entry>
256e9fcaa8aSmrg    <para>21.6</para>
257e9fcaa8aSmrg  </entry>
258e9fcaa8aSmrg  <entry>
259e9fcaa8aSmrg    <para>207</para>
260e9fcaa8aSmrg  </entry>
261e9fcaa8aSmrg</row>
262e9fcaa8aSmrg</tbody>
263e9fcaa8aSmrg</tgroup>
264e9fcaa8aSmrg</table>
265e9fcaa8aSmrg
266e9fcaa8aSmrg</sect1>
267e9fcaa8aSmrg<sect1 id='xkb_event_data_structures'>
268e9fcaa8aSmrg<title>Xkb Event Data Structures</title>
269e9fcaa8aSmrg
270e9fcaa8aSmrg<para>
271e9fcaa8aSmrgXkb reports each event it generates in a unique structure holding the data
272e9fcaa8aSmrgvalues needed to describe the conditions the event is reporting. However, all
273e9fcaa8aSmrgXkb events have certain things in common. These common features are contained
274e9fcaa8aSmrgin the same fields at the beginning of all Xkb event structures and are
275e9fcaa8aSmrgdescribed in the <emphasis>
276e9fcaa8aSmrgXkbAnyEvent</emphasis>
277e9fcaa8aSmrg structure:
278e9fcaa8aSmrg</para>
279e9fcaa8aSmrg
280e9fcaa8aSmrg<para><programlisting>
281e9fcaa8aSmrgtypedef struct {
282e9fcaa8aSmrg      int                type;        /* Xkb extension base event code */
283e9fcaa8aSmrg      unsigned long      serial;      /* X server serial number for event */
284e9fcaa8aSmrg      Bool               send_event;  /* <emphasis> True</emphasis> =&gt; synthetically generated */
285e9fcaa8aSmrg      Display *          display;     /* server connection where event
286e9fcaa8aSmrggenerated */
287e9fcaa8aSmrg      Time               time;        /* server time when event generated */
288e9fcaa8aSmrg      int                xkb_type;    /* Xkb minor event code */
289e9fcaa8aSmrg      unsigned int       device;      /* Xkb device ID, will not be
290e9fcaa8aSmrg                                         <emphasis>XkbUseCoreKbd</emphasis> */
291e9fcaa8aSmrg} <emphasis>XkbAnyEvent</emphasis>
292e9fcaa8aSmrg;
293e9fcaa8aSmrg</programlisting></para>
294e9fcaa8aSmrg
295e9fcaa8aSmrg<para>
296e9fcaa8aSmrgFor any Xkb event, the <emphasis>
297e9fcaa8aSmrgtype</emphasis>
298e9fcaa8aSmrg field is set to the base event code for the Xkb extension, assigned by the
299e9fcaa8aSmrgserver to all Xkb extension events. The <emphasis>
300e9fcaa8aSmrgserial</emphasis>
301e9fcaa8aSmrg, <emphasis>
302e9fcaa8aSmrgsend_event</emphasis>
303e9fcaa8aSmrg, and <emphasis>
304e9fcaa8aSmrgdisplay</emphasis>
305e9fcaa8aSmrg fields are as described for all X11 events. The <emphasis>
306e9fcaa8aSmrgtime</emphasis>
307e9fcaa8aSmrg field is set to the time when the event was generated and is expressed in
308e9fcaa8aSmrgmilliseconds. The <emphasis>
309e9fcaa8aSmrgxkb_type</emphasis>
310e9fcaa8aSmrg field contains the minor extension event code, which is the extension event
311e9fcaa8aSmrgtype, and is one of the values listed in Table 4.1. The <emphasis>
312e9fcaa8aSmrgdevice</emphasis>
313e9fcaa8aSmrg field contains the keyboard device identifier associated with the event. This
314e9fcaa8aSmrgis never <emphasis>
315e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
316e9fcaa8aSmrg, even if the request that generated the event specified a device of <emphasis>
317e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
318e9fcaa8aSmrg. If the request that generated the event specified <emphasis>
319e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
320e9fcaa8aSmrg, <emphasis>
321e9fcaa8aSmrgdevice</emphasis>
322e9fcaa8aSmrg contains a value assigned by the server to specify the core keyboard. If the
323e9fcaa8aSmrgrequest that generated the event specified an X input extension device,
324e9fcaa8aSmrg<emphasis>
325e9fcaa8aSmrgdevice</emphasis>
326e9fcaa8aSmrg contains that same identifier.
327e9fcaa8aSmrg</para>
328e9fcaa8aSmrg
329e9fcaa8aSmrg
330e9fcaa8aSmrg<para>
331e9fcaa8aSmrgOther data fields specific to individual Xkb events are described in subsequent
332e9fcaa8aSmrgchapters where the events are described.
333e9fcaa8aSmrg</para>
334e9fcaa8aSmrg
335e9fcaa8aSmrg
336e9fcaa8aSmrg</sect1>
337e9fcaa8aSmrg<sect1 id='selecting_xkb_events'>
338e9fcaa8aSmrg<title>Selecting Xkb Events</title>
339e9fcaa8aSmrg
340e9fcaa8aSmrg<para>
341e9fcaa8aSmrgXkb events are selected using an event mask, much the same as normal core X
342e9fcaa8aSmrgevents are selected. However, unlike selecting core X events, where you must
343e9fcaa8aSmrgspecify the selection status (on or off) for all possible event types whenever
344e9fcaa8aSmrgyou wish to change the selection criteria for any one event, Xkb allows you to
345e9fcaa8aSmrgrestrict the specification to only the event types you wish to change. This
346e9fcaa8aSmrgmeans that you do not need to remember the event selection values for all
347e9fcaa8aSmrgpossible types each time you want to change one of them.
348e9fcaa8aSmrg</para>
349e9fcaa8aSmrg
350e9fcaa8aSmrg
351e9fcaa8aSmrg<para>
352e9fcaa8aSmrgMany Xkb event types are generated under several different circumstances. When
353e9fcaa8aSmrgselecting to receive an Xkb event, you may specify either that you want it
354e9fcaa8aSmrgdelivered under all circumstances, or that you want it delivered only for a
355e9fcaa8aSmrgsubset of the possible circumstances.
356e9fcaa8aSmrg</para>
357e9fcaa8aSmrg
358e9fcaa8aSmrg<para>
359e9fcaa8aSmrgYou can also deselect an event type that was previously selected for, using the
360e9fcaa8aSmrgsame granularity.
361e9fcaa8aSmrg</para>
362e9fcaa8aSmrg
363e9fcaa8aSmrg<para>
364e9fcaa8aSmrgXkb provides two functions to select and deselect delivery of Xkb events.
365e9fcaa8aSmrg<emphasis>
366e9fcaa8aSmrgXkbSelectEvents</emphasis>
367e9fcaa8aSmrg allows you to select or deselect delivery of more than one Xkb event type at
368e9fcaa8aSmrgonce. Events selected using <emphasis>
369e9fcaa8aSmrgXkbSelectEvents</emphasis>
370e9fcaa8aSmrg are delivered to your program under all circumstances that generate the
371e9fcaa8aSmrgevents. To restrict delivery of an event to a subset of the conditions under
372e9fcaa8aSmrgwhich it occurs, use <emphasis>
373e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
374e9fcaa8aSmrg. <emphasis>
375e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
376e9fcaa8aSmrg only allows you to change the selection conditions for a single event at a
377e9fcaa8aSmrgtime, but it provides a means of fine-tuning the conditions under which the
378e9fcaa8aSmrgevent is delivered.
379e9fcaa8aSmrg</para>
380e9fcaa8aSmrg
381e9fcaa8aSmrg
382e9fcaa8aSmrg<para>
383e9fcaa8aSmrgTo select and / or deselect for delivery of one or more Xkb events and have
384e9fcaa8aSmrgthem delivered under all conditions, use <emphasis>
385e9fcaa8aSmrgXkbSelectEvents</emphasis>
386e9fcaa8aSmrg.
387e9fcaa8aSmrg</para>
388e9fcaa8aSmrg
389e9fcaa8aSmrg<informaltable frame='none'>
390e9fcaa8aSmrg<tgroup cols='1'>
391e9fcaa8aSmrg<colspec colsep='0'/>
392e9fcaa8aSmrg<tbody>
393e9fcaa8aSmrg  <row rowsep='0'>
394e9fcaa8aSmrg    <entry role='functiondecl'>
395e9fcaa8aSmrgBool <emphasis>
396e9fcaa8aSmrgXkbSelectEvents</emphasis>
397e9fcaa8aSmrg(<emphasis>
398e9fcaa8aSmrgdisplay, device_spec, bits_to_change, values_for_bits</emphasis>
399e9fcaa8aSmrg)
400e9fcaa8aSmrg    </entry>
401e9fcaa8aSmrg  </row>
402e9fcaa8aSmrg  <row rowsep='0'>
403e9fcaa8aSmrg    <entry role='functionargdecl'>
404e9fcaa8aSmrgDisplay *      <emphasis>
405e9fcaa8aSmrgdisplay</emphasis>
406e9fcaa8aSmrg;      /* connection to the X server */
407e9fcaa8aSmrg    </entry>
408e9fcaa8aSmrg  </row>
409e9fcaa8aSmrg  <row rowsep='0'>
410e9fcaa8aSmrg    <entry role='functionargdecl'>
411e9fcaa8aSmrgunsigned int      <emphasis>
412e9fcaa8aSmrgdevice_spec</emphasis>
413e9fcaa8aSmrg;      /* device ID, or <emphasis>
414e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
415e9fcaa8aSmrg */
416e9fcaa8aSmrg    </entry>
417e9fcaa8aSmrg  </row>
418e9fcaa8aSmrg  <row rowsep='0'>
419e9fcaa8aSmrg    <entry role='functionargdecl'>
420e9fcaa8aSmrgunsigned long int      <emphasis>
421e9fcaa8aSmrgbits_to_change;      </emphasis>
422e9fcaa8aSmrg/* determines events to be selected / deselected */
423e9fcaa8aSmrg    </entry>
424e9fcaa8aSmrg  </row>
425e9fcaa8aSmrg  <row rowsep='0'>
426e9fcaa8aSmrg    <entry role='functionargdecl'>
427e9fcaa8aSmrgunsigned long int      <emphasis>
428e9fcaa8aSmrgvalues_for_bits</emphasis>
429e9fcaa8aSmrg;      /* 1=&gt;select, 0-&gt;deselect; for events in <emphasis>
430e9fcaa8aSmrgbits_to_change</emphasis>
431e9fcaa8aSmrg */
432e9fcaa8aSmrg    </entry>
433e9fcaa8aSmrg</row>
434e9fcaa8aSmrg</tbody>
435e9fcaa8aSmrg</tgroup>
436e9fcaa8aSmrg</informaltable>
437e9fcaa8aSmrg
438e9fcaa8aSmrg<para>
439e9fcaa8aSmrgThis request changes the Xkb event selection mask for the keyboard specified by
440e9fcaa8aSmrg<emphasis>
441e9fcaa8aSmrgdevice_spec</emphasis>
442e9fcaa8aSmrg.
443e9fcaa8aSmrg</para>
444e9fcaa8aSmrg
445e9fcaa8aSmrg
446e9fcaa8aSmrg<para>
447e9fcaa8aSmrgEach Xkb event that can be selected is represented by a bit in the <emphasis>
448e9fcaa8aSmrgbits_to_change</emphasis>
449e9fcaa8aSmrg and <emphasis>
450e9fcaa8aSmrgvalues_for_bits</emphasis>
451e9fcaa8aSmrg masks. Only the event selection bits specified by the <emphasis>
452e9fcaa8aSmrgbits_to_change</emphasis>
453e9fcaa8aSmrg parameter are affected; any unspecified bits are left unchanged. To turn on
454e9fcaa8aSmrgevent selection for an event, set the bit for the event in the <emphasis>
455e9fcaa8aSmrgbits_to_change</emphasis>
456e9fcaa8aSmrg parameter and set the corresponding bit in the <emphasis>
457e9fcaa8aSmrgvalues_for_bits</emphasis>
458e9fcaa8aSmrg parameter. To turn off event selection for an event, set the bit for the event
459e9fcaa8aSmrgin the <emphasis>
460e9fcaa8aSmrgbits_to_change</emphasis>
461e9fcaa8aSmrg parameter and do not set the corresponding bit in the <emphasis>
462e9fcaa8aSmrgvalues_for_bits</emphasis>
463e9fcaa8aSmrg parameter. The valid values for both of these parameters are an inclusive
464e9fcaa8aSmrgbitwise OR of the masks shown in Table 4.2. There is no interface to return
465e9fcaa8aSmrgyour client’s current event selection mask. Clients cannot set other
466e9fcaa8aSmrgclients’ event selection masks.
467e9fcaa8aSmrg</para>
468e9fcaa8aSmrg
469e9fcaa8aSmrg
470e9fcaa8aSmrg<para>
471e9fcaa8aSmrgIf a bit is not set in the <emphasis>
472e9fcaa8aSmrgbits_to_change</emphasis>
473e9fcaa8aSmrg parameter, but the corresponding bit is set in the <emphasis>
474e9fcaa8aSmrgvalues_for_bits</emphasis>
475e9fcaa8aSmrg parameter, a <emphasis>
476e9fcaa8aSmrgBadMatch</emphasis>
477e9fcaa8aSmrg protocol error results. If an undefined bit is set in either the <emphasis>
478e9fcaa8aSmrgbits_to_change</emphasis>
479e9fcaa8aSmrg or the <emphasis>
480e9fcaa8aSmrgvalues_for_bits</emphasis>
481e9fcaa8aSmrg parameter, a <emphasis>
482e9fcaa8aSmrgBadValue</emphasis>
483e9fcaa8aSmrg protocol error results.
484e9fcaa8aSmrg</para>
485e9fcaa8aSmrg
486e9fcaa8aSmrg
487e9fcaa8aSmrg<para>
488e9fcaa8aSmrgAll event selection bits are initially zero for clients using the Xkb
489e9fcaa8aSmrgextension. Once you set some bits, they remain set for your client until you
490e9fcaa8aSmrgclear them via another call to <emphasis>
491e9fcaa8aSmrgXkbSelectEvents</emphasis>
492e9fcaa8aSmrg.
493e9fcaa8aSmrg</para>
494e9fcaa8aSmrg
495e9fcaa8aSmrg
496e9fcaa8aSmrg<para>
497e9fcaa8aSmrg<emphasis>
498e9fcaa8aSmrgXkbSelectEvents</emphasis>
499e9fcaa8aSmrg returns <emphasis>
500e9fcaa8aSmrgFalse</emphasis>
501e9fcaa8aSmrg if the Xkb extension has not been initilialized and <emphasis>
502e9fcaa8aSmrgTrue</emphasis>
503e9fcaa8aSmrg otherwise.
504e9fcaa8aSmrg</para>
505e9fcaa8aSmrg
506e9fcaa8aSmrg
507e9fcaa8aSmrg<para>
508e9fcaa8aSmrgTo select or deselect for a specific Xkb event and optionally place conditions
509e9fcaa8aSmrgon when events of that type are reported to your client, use <emphasis>
510e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
511e9fcaa8aSmrg. This allows you to exercise a finer granularity of control over delivery of
512e9fcaa8aSmrgXkb events with <emphasis>
513e9fcaa8aSmrgXkbSelectEvents</emphasis>
514e9fcaa8aSmrg.
515e9fcaa8aSmrg</para>
516e9fcaa8aSmrg
517e9fcaa8aSmrg
518e9fcaa8aSmrg<informaltable frame='none'>
519e9fcaa8aSmrg<tgroup cols='1'>
520e9fcaa8aSmrg<colspec colsep='0'/>
521e9fcaa8aSmrg<tbody>
522e9fcaa8aSmrg  <row rowsep='0'>
523e9fcaa8aSmrg    <entry role='functiondecl'>
524e9fcaa8aSmrgBool <emphasis>
525e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
526e9fcaa8aSmrg(<emphasis>
527e9fcaa8aSmrgdisplay, device_spec, event_type, bits_to_change</emphasis>
528e9fcaa8aSmrg, <emphasis>
529e9fcaa8aSmrgvalues_for_bits</emphasis>
530e9fcaa8aSmrg)
531e9fcaa8aSmrg    </entry>
532e9fcaa8aSmrg  </row>
533e9fcaa8aSmrg  <row rowsep='0'>
534e9fcaa8aSmrg    <entry role='functionargdecl'>
535e9fcaa8aSmrgDisplay *      <emphasis>
536e9fcaa8aSmrgdisplay</emphasis>
537e9fcaa8aSmrg;      /* connection to the X server */
538e9fcaa8aSmrg    </entry>
539e9fcaa8aSmrg  </row>
540e9fcaa8aSmrg  <row rowsep='0'>
541e9fcaa8aSmrg    <entry role='functionargdecl'>
542e9fcaa8aSmrgunsigned int      <emphasis>
543e9fcaa8aSmrgdevice_spec</emphasis>
544e9fcaa8aSmrg;      /* device ID, or <emphasis>
545e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
546e9fcaa8aSmrg */
547e9fcaa8aSmrg    </entry>
548e9fcaa8aSmrg  </row>
549e9fcaa8aSmrg  <row rowsep='0'>
550e9fcaa8aSmrg    <entry role='functionargdecl'>
551e9fcaa8aSmrgunsigned int      <emphasis>
552e9fcaa8aSmrgevent_type</emphasis>
553e9fcaa8aSmrg;      /* Xkb event type of interest */
554e9fcaa8aSmrg    </entry>
555e9fcaa8aSmrg  </row>
556e9fcaa8aSmrg  <row rowsep='0'>
557e9fcaa8aSmrg    <entry role='functionargdecl'>
558e9fcaa8aSmrgunsigned long int      <emphasis>
559e9fcaa8aSmrgbits_to_change</emphasis>
560e9fcaa8aSmrg;      /* event selection details */
561e9fcaa8aSmrg    </entry>
562e9fcaa8aSmrg  </row>
563e9fcaa8aSmrg  <row rowsep='0'>
564e9fcaa8aSmrg    <entry role='functionargdecl'>
565e9fcaa8aSmrgunsigned long int      <emphasis>
566e9fcaa8aSmrgvalues_for_bits</emphasis>
567e9fcaa8aSmrg;      /* values for bits selected by <emphasis>
568e9fcaa8aSmrgbits_to_change</emphasis>
569e9fcaa8aSmrg */
570e9fcaa8aSmrg    </entry>
571e9fcaa8aSmrg</row>
572e9fcaa8aSmrg</tbody>
573e9fcaa8aSmrg</tgroup>
574e9fcaa8aSmrg</informaltable>
575e9fcaa8aSmrg
576e9fcaa8aSmrg<para>
577e9fcaa8aSmrgWhile <emphasis>
578e9fcaa8aSmrgXkbSelectEvents</emphasis>
579e9fcaa8aSmrg allows multiple events to be selected, <emphasis>
580e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
581e9fcaa8aSmrg changes the selection criteria for a single type of Xkb event. The
582e9fcaa8aSmrginterpretation of the <emphasis>
583e9fcaa8aSmrgbits_to_change</emphasis>
584e9fcaa8aSmrg and <emphasis>
585e9fcaa8aSmrgvalues_for_bits</emphasis>
586e9fcaa8aSmrg masks depends on the event type in question.
587e9fcaa8aSmrg</para>
588e9fcaa8aSmrg
589e9fcaa8aSmrg
590e9fcaa8aSmrg<para>
591e9fcaa8aSmrg<emphasis>
592e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
593e9fcaa8aSmrg changes the Xkb event selection mask for the keyboard specified by <emphasis>
594e9fcaa8aSmrgdevice_spec</emphasis>
595e9fcaa8aSmrg and the Xkb event specified by <emphasis>
596e9fcaa8aSmrgevent_type</emphasis>
597e9fcaa8aSmrg. To turn on event selection for an event detail, set the bit for the detail in
598e9fcaa8aSmrgthe <emphasis>
599e9fcaa8aSmrgbits_to_change</emphasis>
600e9fcaa8aSmrg parameter and set the corresponding bit in the <emphasis>
601e9fcaa8aSmrgvalues_for_bits</emphasis>
602e9fcaa8aSmrg parameter. To turn off event detail selection for a detail, set the bit for
603e9fcaa8aSmrgthe detail in the <emphasis>
604e9fcaa8aSmrgbits_to_change</emphasis>
605e9fcaa8aSmrg parameter and do not set the corresponding bit in the <emphasis>
606e9fcaa8aSmrgvalues_for_bits</emphasis>
607e9fcaa8aSmrg parameter.
608e9fcaa8aSmrg</para>
609e9fcaa8aSmrg
610e9fcaa8aSmrg
611e9fcaa8aSmrg<para>
612e9fcaa8aSmrgIf an invalid event type is specified, a <emphasis>
613e9fcaa8aSmrgBadValue</emphasis>
614e9fcaa8aSmrg protocol error results. If a bit is not set in the <emphasis>
615e9fcaa8aSmrgbits_to_change</emphasis>
616e9fcaa8aSmrg parameter, but the corresponding bit is set in the <emphasis>
617e9fcaa8aSmrgvalues_for_bits</emphasis>
618e9fcaa8aSmrg parameter, a <emphasis>
619e9fcaa8aSmrgBadMatch</emphasis>
620e9fcaa8aSmrg protocol error results. If an undefined bit is set in either the <emphasis>
621e9fcaa8aSmrgbits_to_change</emphasis>
622e9fcaa8aSmrg or the <emphasis>
623e9fcaa8aSmrgvalues_for_bits</emphasis>
624e9fcaa8aSmrg parameter, a <emphasis>
625e9fcaa8aSmrgBadValue</emphasis>
626e9fcaa8aSmrg protocol error results.
627e9fcaa8aSmrg</para>
628e9fcaa8aSmrg
629e9fcaa8aSmrg
630e9fcaa8aSmrg<para>
631e9fcaa8aSmrgFor each type of Xkb event, the legal event details that you can specify in the
632e9fcaa8aSmrg<emphasis>
633e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
634e9fcaa8aSmrg request are listed in the chapters that describe each event in detail.
635e9fcaa8aSmrg</para>
636e9fcaa8aSmrg
637e9fcaa8aSmrg
638e9fcaa8aSmrg<sect2 id='event_masks'>
639e9fcaa8aSmrg<title>Event Masks</title>
640e9fcaa8aSmrg
641e9fcaa8aSmrg<para>
642e9fcaa8aSmrgThe X server reports the events defined by Xkb to your client application only
643e9fcaa8aSmrgif you have requested them via a call to <emphasis>
644e9fcaa8aSmrgXkbSelectEvents</emphasis>
645e9fcaa8aSmrg or <emphasis>
646e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
647e9fcaa8aSmrg. Specify the event types in which you are interested in a mask, as described
648e9fcaa8aSmrgin section 4.3.
649e9fcaa8aSmrg</para>
650e9fcaa8aSmrg
651e9fcaa8aSmrg
652e9fcaa8aSmrg<para>
653e9fcaa8aSmrgTable 4.2 lists the event mask constants that can be specified with the  <!-- xref -->
654e9fcaa8aSmrg<emphasis>
655e9fcaa8aSmrgXkbSelectEvents</emphasis>
656e9fcaa8aSmrg request and the circumstances in which the mask should be specified.
657e9fcaa8aSmrg</para>
658e9fcaa8aSmrg
659e9fcaa8aSmrg<table frame='none'>
660e9fcaa8aSmrg<title>XkbSelectEvents Mask Constants</title>
661e9fcaa8aSmrg<tgroup cols='3'>
662e9fcaa8aSmrg<colspec colsep='0'/>
663e9fcaa8aSmrg<colspec colsep='0'/>
664e9fcaa8aSmrg<colspec colsep='0'/>
665e9fcaa8aSmrg<thead>
666e9fcaa8aSmrg<row rowsep='0'>
667e9fcaa8aSmrg  <entry>Event Mask</entry>
668e9fcaa8aSmrg  <entry>Value</entry>
669e9fcaa8aSmrg  <entry>Notification Wanted</entry>
670e9fcaa8aSmrg</row>
671e9fcaa8aSmrg</thead>
672e9fcaa8aSmrg<tbody>
673e9fcaa8aSmrg  <row rowsep='0'>
674e9fcaa8aSmrg    <entry>
675e9fcaa8aSmrg<emphasis>XkbNewKeyboardNotifyMask</emphasis>
676e9fcaa8aSmrg    </entry>
677e9fcaa8aSmrg    <entry>(1L&lt;&lt;0)</entry>
678e9fcaa8aSmrg    <entry>Keyboard geometry change</entry>
679e9fcaa8aSmrg  </row>
680e9fcaa8aSmrg  <row rowsep='0'>
681e9fcaa8aSmrg    <entry>
682e9fcaa8aSmrg      <emphasis>XkbMapNotifyMask</emphasis>
683e9fcaa8aSmrg    </entry>
684e9fcaa8aSmrg    <entry>(1L&lt;&lt;1)</entry>
685e9fcaa8aSmrg    <entry>Keyboard mapping change</entry>
686e9fcaa8aSmrg  </row>
687e9fcaa8aSmrg  <row rowsep='0'>
688e9fcaa8aSmrg    <entry>
689e9fcaa8aSmrg<para><emphasis>XkbStateNotifyMask</emphasis></para>
690e9fcaa8aSmrg    </entry>
691e9fcaa8aSmrg    <entry>(1L&lt;&lt;2)</entry>
692e9fcaa8aSmrg    <entry><para>Keyboard state change</para></entry>
693e9fcaa8aSmrg  </row>
694e9fcaa8aSmrg  <row rowsep='0'>
695e9fcaa8aSmrg    <entry>
696e9fcaa8aSmrg<para><emphasis>XkbControlsNotifyMask</emphasis></para>
697e9fcaa8aSmrg    </entry>
698e9fcaa8aSmrg    <entry>(1L&lt;&lt;3)</entry>
699e9fcaa8aSmrg    <entry>Keyboard control change</entry>
700e9fcaa8aSmrg  </row>
701e9fcaa8aSmrg  <row rowsep='0'>
702e9fcaa8aSmrg    <entry>
703e9fcaa8aSmrg<emphasis>XkbIndicatorStateNotifyMask</emphasis>
704e9fcaa8aSmrg    </entry>
705e9fcaa8aSmrg    <entry>(1L&lt;&lt;4)</entry>
706e9fcaa8aSmrg    <entry>Keyboard indicator state change</entry>
707e9fcaa8aSmrg  </row>
708e9fcaa8aSmrg  <row rowsep='0'>
709e9fcaa8aSmrg    <entry>
710e9fcaa8aSmrg<emphasis>XkbIndicatorMapNotifyMask</emphasis>
711e9fcaa8aSmrg    </entry>
712e9fcaa8aSmrg    <entry>(1L&lt;&lt;5)</entry>
713e9fcaa8aSmrg    <entry>Keyboard indicator map change</entry>
714e9fcaa8aSmrg  </row>
715e9fcaa8aSmrg  <row rowsep='0'>
716e9fcaa8aSmrg    <entry>
717e9fcaa8aSmrg<emphasis>XkbNamesNotifyMask</emphasis>
718e9fcaa8aSmrg    </entry>
719e9fcaa8aSmrg    <entry>(1L&lt;&lt;6)</entry>
720e9fcaa8aSmrg    <entry>Keyboard name change</entry>
721e9fcaa8aSmrg  </row>
722e9fcaa8aSmrg  <row rowsep='0'>
723e9fcaa8aSmrg    <entry>
724e9fcaa8aSmrg<emphasis>XkbCompatMapNotifyMask</emphasis>
725e9fcaa8aSmrg    </entry>
726e9fcaa8aSmrg    <entry>(1L&lt;&lt;7)</entry>
727e9fcaa8aSmrg    <entry>Keyboard compat map change</entry>
728e9fcaa8aSmrg  </row>
729e9fcaa8aSmrg  <row rowsep='0'>
730e9fcaa8aSmrg    <entry>
731e9fcaa8aSmrg<emphasis>XkbBellNotifyMask</emphasis>
732e9fcaa8aSmrg    </entry>
733e9fcaa8aSmrg    <entry>(1L&lt;&lt;8)</entry>
734e9fcaa8aSmrg    <entry>Bell</entry>
735e9fcaa8aSmrg  </row>
736e9fcaa8aSmrg  <row rowsep='0'>
737e9fcaa8aSmrg    <entry>
738e9fcaa8aSmrg<emphasis>XkbActionMessageMask</emphasis>
739e9fcaa8aSmrg    </entry>
740e9fcaa8aSmrg    <entry>(1L&lt;&lt;9)</entry>
741e9fcaa8aSmrg    <entry>Action message</entry>
742e9fcaa8aSmrg  </row>
743e9fcaa8aSmrg  <row rowsep='0'>
744e9fcaa8aSmrg    <entry>
745e9fcaa8aSmrg<emphasis>XkbAccessXNotifyMask</emphasis>
746e9fcaa8aSmrg    </entry>
747e9fcaa8aSmrg    <entry>(1L&lt;&lt;10)</entry>
748e9fcaa8aSmrg    <entry>AccessX features</entry>
749e9fcaa8aSmrg  </row>
750e9fcaa8aSmrg  <row rowsep='0'>
751e9fcaa8aSmrg    <entry>
752e9fcaa8aSmrg<emphasis>XkbExtensionDeviceNotifyMask</emphasis>
753e9fcaa8aSmrg    </entry>
754e9fcaa8aSmrg    <entry>(1L&lt;&lt;11)</entry>
755e9fcaa8aSmrg    <entry>Extension device</entry>
756e9fcaa8aSmrg  </row>
757e9fcaa8aSmrg  <row rowsep='0'>
758e9fcaa8aSmrg    <entry>
759e9fcaa8aSmrg<emphasis>XkbAllEventsMask</emphasis>
760e9fcaa8aSmrg    </entry>
761e9fcaa8aSmrg    <entry>(0xFFF)</entry>
762e9fcaa8aSmrg    <entry>All Xkb events</entry>
763e9fcaa8aSmrg  </row>
764e9fcaa8aSmrg</tbody>
765e9fcaa8aSmrg</tgroup>
766e9fcaa8aSmrg</table>
767e9fcaa8aSmrg
768e9fcaa8aSmrg</sect2>
769e9fcaa8aSmrg</sect1>
770e9fcaa8aSmrg<sect1 id='unified_xkb_event_type'>
771e9fcaa8aSmrg<title>Unified Xkb Event Type</title>
772e9fcaa8aSmrg
773e9fcaa8aSmrg<para>
774e9fcaa8aSmrgThe <emphasis>
775e9fcaa8aSmrgXkbEvent</emphasis>
776e9fcaa8aSmrg structure is a union of the individual structures declared for each Xkb event
777e9fcaa8aSmrgtype and for the core protocol <emphasis>
778e9fcaa8aSmrgXEvent</emphasis>
779e9fcaa8aSmrg type. Given an <emphasis>
780e9fcaa8aSmrgXkbEvent</emphasis>
781e9fcaa8aSmrg structure, you may use the <emphasis>
782e9fcaa8aSmrgtype</emphasis>
783e9fcaa8aSmrg field to determine if the event is an Xkb event (<emphasis>
784e9fcaa8aSmrgtype</emphasis>
785e9fcaa8aSmrg equals the Xkb base event code; see section 2.4). If the event is an Xkb
786e9fcaa8aSmrgevent, you may then use the <emphasis>
787e9fcaa8aSmrgany.xkb_type</emphasis>
788e9fcaa8aSmrg field to determine the type of Xkb event and thereafter access the
789e9fcaa8aSmrgevent-dependent components using the union member corresponding to the
790e9fcaa8aSmrgparticular Xkb event type.
791e9fcaa8aSmrg</para>
792e9fcaa8aSmrg
793e9fcaa8aSmrg<para><programlisting>
794e9fcaa8aSmrgtypedef union _XkbEvent {
795e9fcaa8aSmrg      int                            type;
796e9fcaa8aSmrg      XkbAnyEvent                    any;
797e9fcaa8aSmrg      XkbStateNotifyEvent            state;
798e9fcaa8aSmrg      XkbMapNotifyEvent              map;
799e9fcaa8aSmrg      XkbControlsNotifyEvent         ctrls;
800e9fcaa8aSmrg      XkbIndicatorNotifyEvent        indicators;
801e9fcaa8aSmrg      XkbBellNotifyEvent             bell;
802e9fcaa8aSmrg      XkbAccessXNotifyEvent          accessx;
803e9fcaa8aSmrg      XkbNamesNotifyEvent            names;
804e9fcaa8aSmrg      XkbCompatMapNotifyEvent        compat;
805e9fcaa8aSmrg      XkbActionMessageEvent          message;
806e9fcaa8aSmrg      XkbExtensionDeviceNotifyEvent  device;
807e9fcaa8aSmrg      XkbNewKeyboardNotifyEvent      new_kbd;
808e9fcaa8aSmrg      XEvent                         core;
809e9fcaa8aSmrg} <emphasis>XkbEvent</emphasis>;
810e9fcaa8aSmrg</programlisting></para>
811e9fcaa8aSmrg
812e9fcaa8aSmrg<para>
813e9fcaa8aSmrgThis unified Xkb event type includes a normal <emphasis>
814e9fcaa8aSmrgXEvent</emphasis>
815e9fcaa8aSmrg as used by the core protocol, so it is straightforward for applications that
816e9fcaa8aSmrguse Xkb events to call the X library event functions without having to cast
817e9fcaa8aSmrgevery reference. For example, to get the next event, you can simply declare a
818e9fcaa8aSmrgvariable of type <emphasis>
819e9fcaa8aSmrgXkbEvent</emphasis>
820e9fcaa8aSmrg and call:
821e9fcaa8aSmrg</para>
822e9fcaa8aSmrg
823e9fcaa8aSmrg<para>XNextEvent(dpy,&amp;xkbev.core);</para>
824e9fcaa8aSmrg</sect1>
825e9fcaa8aSmrg</chapter>
826