ch02.xml revision eb411b4b
1eb411b4bSmrg<chapter id='Initialization_and_General_Programming_Information'>
2e9fcaa8aSmrg<title>Initialization and General Programming Information</title>
3eb411b4bSmrg<sect1 id='Extension_Header_Files'>
4e9fcaa8aSmrg<title>Extension Header Files</title>
5e9fcaa8aSmrg<para>
6e9fcaa8aSmrgThe following include files are part of the Xkb standard:
7e9fcaa8aSmrg</para>
8e9fcaa8aSmrg<itemizedlist>
9e9fcaa8aSmrg  <listitem>
10e9fcaa8aSmrg    <para>
11e9fcaa8aSmrg<emphasis>&lt;X11/XKBlib.h&gt;</emphasis>
12e9fcaa8aSmrg    </para>
13e9fcaa8aSmrg    <para><emphasis>XKBlib.h</emphasis>
14e9fcaa8aSmrgis the main header file for Xkb; it declares constants, types, and
15e9fcaa8aSmrgfunctions.
16e9fcaa8aSmrg    </para>
17e9fcaa8aSmrg  </listitem>
18e9fcaa8aSmrg  <listitem>
19e9fcaa8aSmrg    <para>
20e9fcaa8aSmrg<emphasis>&lt;X11/extensions/XKBstr.h&gt;</emphasis>
21e9fcaa8aSmrg    </para>
22e9fcaa8aSmrg    <para>
23e9fcaa8aSmrg<emphasis>XKBstr.h</emphasis> declares types and
24e9fcaa8aSmrgconstants for Xkb. It is included automatically from
25e9fcaa8aSmrg<emphasis>&lt;X11/XKBlib.h&gt;</emphasis>
26e9fcaa8aSmrg; you should never need to reference it directly in your application code.
27e9fcaa8aSmrg    </para>
28e9fcaa8aSmrg  </listitem>
29e9fcaa8aSmrg  <listitem>
30e9fcaa8aSmrg    <para>
31e9fcaa8aSmrg<emphasis>&lt;X11/extensions/XKB.h&gt;</emphasis>
32e9fcaa8aSmrg    </para>
33e9fcaa8aSmrg    <para>
34e9fcaa8aSmrg<emphasis>XKB.h</emphasis>
35e9fcaa8aSmrgdefines constants for Xkb. It is included automatically from <emphasis>
36e9fcaa8aSmrg&lt;X11/XKBstr.h&gt;</emphasis>
37e9fcaa8aSmrg; you should never need to reference it directly in your application code.
38e9fcaa8aSmrg    </para>
39e9fcaa8aSmrg  </listitem>
40e9fcaa8aSmrg  <listitem>
41e9fcaa8aSmrg    <para>
42e9fcaa8aSmrg<emphasis>&lt;X11/extensions/XKBgeom.h&gt;</emphasis>
43e9fcaa8aSmrg   </para>
44e9fcaa8aSmrg   <para><emphasis>XKBgeom.h</emphasis>
45e9fcaa8aSmrgdeclares types, symbolic constants, and functions for manipulating
46e9fcaa8aSmrgkeyboard geometry descriptions.
47e9fcaa8aSmrg    </para>
48e9fcaa8aSmrg  </listitem>
49e9fcaa8aSmrg</itemizedlist>
50e9fcaa8aSmrg</sect1>
51eb411b4bSmrg<sect1 id='Extension_Name'>
52e9fcaa8aSmrg<title>Extension Name</title>
53e9fcaa8aSmrg<para>
54e9fcaa8aSmrgThe name of the Xkb extension is given in <emphasis>
55e9fcaa8aSmrg&lt;X11/extensions/Xkb.h&gt;:</emphasis>
56e9fcaa8aSmrg</para>
57e9fcaa8aSmrg
58e9fcaa8aSmrg<para>
59e9fcaa8aSmrg<emphasis>
60e9fcaa8aSmrg#define XkbName "XKEYBOARD"</emphasis>
61e9fcaa8aSmrg</para>
62e9fcaa8aSmrg
63e9fcaa8aSmrg<para>
64e9fcaa8aSmrgMost extensions to the X protocol are initialized by calling <emphasis>
65e9fcaa8aSmrgXInitExtension</emphasis>
66e9fcaa8aSmrg and passing the extension name. However, as explained in section 2.4, Xkb
67e9fcaa8aSmrgrequires a more complex initialization sequence, and a client program should
68e9fcaa8aSmrgnot call <emphasis>
69e9fcaa8aSmrgXInitExtension</emphasis>
70e9fcaa8aSmrg directly.
71e9fcaa8aSmrg</para>
72e9fcaa8aSmrg</sect1>
73eb411b4bSmrg<sect1 id='Determining_Library_Compatibility'>
74e9fcaa8aSmrg<title>Determining Library Compatibility</title>
75e9fcaa8aSmrg<para>
76e9fcaa8aSmrgIf an application is dynamically linked, both the X server and the client-side
77e9fcaa8aSmrgX library must contain the Xkb extension in order for the client to use the Xkb
78e9fcaa8aSmrgextension capabilities. Therefore a dynamically linked application must check
79e9fcaa8aSmrgboth the library and the server for compatibility before using Xkb function
80e9fcaa8aSmrgcalls. A properly written program must check for compatibility between the
81e9fcaa8aSmrgversion of the Xkb library that is dynamically loaded and the one used when the
82e9fcaa8aSmrgapplication was built. It must then check the server version for compatibility
83e9fcaa8aSmrgwith the version of Xkb in the library.
84e9fcaa8aSmrg</para>
85e9fcaa8aSmrg<para>
86e9fcaa8aSmrgIf your application is statically linked, you must still check for server
87e9fcaa8aSmrgcompatibility and may check library compatibility. (It is possible to compile
88e9fcaa8aSmrgagainst one set of header files and link against a different, incompatible,
89e9fcaa8aSmrgversion of the library, although this should not normally occur.)
90e9fcaa8aSmrg</para>
91e9fcaa8aSmrg<para>
92e9fcaa8aSmrgTo determine the compatibility of a library at runtime, call <emphasis>
93e9fcaa8aSmrgXkbLibraryVersion</emphasis>.
94e9fcaa8aSmrg</para>
95e9fcaa8aSmrg<informaltable frame='none'>
96eb411b4bSmrg<?dbfo keep-together="always" ?>
97eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'>
98eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
99e9fcaa8aSmrg<tbody>
100eb411b4bSmrg  <row>
101e9fcaa8aSmrg    <entry role='functiondecl'>
102e9fcaa8aSmrgBool <emphasis>
103e9fcaa8aSmrgXkbLibraryVersion</emphasis>
104e9fcaa8aSmrg(<emphasis>
105e9fcaa8aSmrglib_major_in_out</emphasis>
106e9fcaa8aSmrg, <emphasis>
107e9fcaa8aSmrglib_minor_in_out</emphasis>
108e9fcaa8aSmrg)
109e9fcaa8aSmrg    </entry>
110e9fcaa8aSmrg  </row>
111eb411b4bSmrg  <row>
112e9fcaa8aSmrg    <entry role='functionargdecl'>
113e9fcaa8aSmrgint *      <emphasis>
114e9fcaa8aSmrglib_major_in_out;</emphasis>
115e9fcaa8aSmrg                  /* specifies and returns the major Xkb library version. */
116e9fcaa8aSmrg    </entry>
117e9fcaa8aSmrg  </row>
118eb411b4bSmrg  <row>
119e9fcaa8aSmrg    <entry role='functionargdecl'>
120e9fcaa8aSmrgint *      <emphasis>
121e9fcaa8aSmrglib_minor_in_out;</emphasis>
122e9fcaa8aSmrg                  /* specifies and returns the minor Xkb library version. */
123e9fcaa8aSmrg    </entry>
124e9fcaa8aSmrg</row>
125e9fcaa8aSmrg</tbody>
126e9fcaa8aSmrg</tgroup>
127e9fcaa8aSmrg</informaltable>
128e9fcaa8aSmrg
129e9fcaa8aSmrg<para>
130e9fcaa8aSmrgPass the symbolic value <emphasis>
131e9fcaa8aSmrgXkbMajorVersion</emphasis>
132e9fcaa8aSmrg in <emphasis>
133e9fcaa8aSmrglib_major_in_out</emphasis>
134e9fcaa8aSmrg and <emphasis>
135e9fcaa8aSmrgXkbMinorVersion</emphasis>
136e9fcaa8aSmrg in <emphasis>
137e9fcaa8aSmrglib_minor_in_out</emphasis>
138e9fcaa8aSmrg. These arguments represent the version of the library used at compile time.
139e9fcaa8aSmrgThe <emphasis>
140e9fcaa8aSmrgXkbLibraryVersion </emphasis>
141e9fcaa8aSmrgfunction backfills the major and minor version numbers of the library used at
142e9fcaa8aSmrgrun time in <emphasis>
143e9fcaa8aSmrglib_major_in_out</emphasis>
144e9fcaa8aSmrg and <emphasis>
145e9fcaa8aSmrglib_minor_in_out</emphasis>
146e9fcaa8aSmrg. If the versions of the compile time and run time libraries are compatible,
147e9fcaa8aSmrg<emphasis>
148e9fcaa8aSmrgXkbLibraryVersion </emphasis>
149e9fcaa8aSmrgreturns <emphasis>
150e9fcaa8aSmrgTrue</emphasis>
151e9fcaa8aSmrg, otherwise, it returns <emphasis>
152e9fcaa8aSmrgFalse.</emphasis>
153e9fcaa8aSmrg</para>
154e9fcaa8aSmrg
155e9fcaa8aSmrg<para>
156e9fcaa8aSmrgIn addition, in order to use the Xkb extension, you must ensure that the
157e9fcaa8aSmrgextension is present in the server and that the server supports the version of
158e9fcaa8aSmrgthe extension expected by the client. Use <emphasis>
159e9fcaa8aSmrgXkbQueryExtension</emphasis>
160e9fcaa8aSmrg to do this, as described in the next section.
161e9fcaa8aSmrg</para>
162e9fcaa8aSmrg
163e9fcaa8aSmrg</sect1>
164eb411b4bSmrg<sect1 id='Initializing_the_Keyboard_Extension'>
165e9fcaa8aSmrg<title>Initializing the Keyboard Extension</title>
166e9fcaa8aSmrg<para>
167e9fcaa8aSmrgCall <emphasis>
168e9fcaa8aSmrgXkbQueryExtension</emphasis>
169e9fcaa8aSmrg to check for the presence and compatibility of the extension in the server and
170e9fcaa8aSmrgto initialize the extension. Because of potential version mismatches, you
171e9fcaa8aSmrgcannot use the generic extension mechanism functions (<emphasis>
172e9fcaa8aSmrgXQueryExtension </emphasis>
173e9fcaa8aSmrgand<emphasis>
174e9fcaa8aSmrg XInitExtension</emphasis>
175e9fcaa8aSmrg) for checking for the presence of, and initializing the Xkb extension.
176e9fcaa8aSmrg</para>
177e9fcaa8aSmrg
178e9fcaa8aSmrg<para>
179e9fcaa8aSmrgYou must call <emphasis>
180e9fcaa8aSmrgXkbQueryExtension</emphasis>
181e9fcaa8aSmrg or <emphasis>
182e9fcaa8aSmrgXkbOpenDisplay</emphasis>
183e9fcaa8aSmrg before using any other Xkb library interfaces, unless such usage is explicitly
184e9fcaa8aSmrgallowed in the interface description in this document. The exceptions are:
185e9fcaa8aSmrg<emphasis>
186e9fcaa8aSmrgXkbIgnoreExtension</emphasis>
187e9fcaa8aSmrg, <emphasis>
188e9fcaa8aSmrgXkbLibraryVersion</emphasis>
189e9fcaa8aSmrg, and a handful of audible-bell functions. You should not use any other Xkb
190e9fcaa8aSmrgfunctions if the extension is not present or is uninitialized. In general,
191e9fcaa8aSmrgcalls to Xkb library functions made prior to initializing the Xkb extension
192e9fcaa8aSmrgcause <emphasis>
193e9fcaa8aSmrgBadAccess</emphasis>
194e9fcaa8aSmrg protocol errors.
195e9fcaa8aSmrg</para>
196e9fcaa8aSmrg
197e9fcaa8aSmrg<para>
198e9fcaa8aSmrg<emphasis>
199e9fcaa8aSmrgXkbQueryExtension</emphasis>
200e9fcaa8aSmrg both determines whether a compatible Xkb extension is present in the X server
201e9fcaa8aSmrgand initializes the extension when it is present.
202e9fcaa8aSmrg</para>
203e9fcaa8aSmrg
204e9fcaa8aSmrg<informaltable frame='none'>
205eb411b4bSmrg<?dbfo keep-together="always" ?>
206eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'>
207eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
208e9fcaa8aSmrg<tbody>
209eb411b4bSmrg  <row>
210e9fcaa8aSmrg    <entry role='functiondecl'>
211e9fcaa8aSmrgBool <emphasis>
212e9fcaa8aSmrgXkbQueryExtension</emphasis>
213e9fcaa8aSmrg(<emphasis>
214e9fcaa8aSmrgdpy, opcode_rtrn, event_rtrn, error_rtrn, major_in_out, minor_in_out</emphasis>
215e9fcaa8aSmrg)
216e9fcaa8aSmrg    </entry>
217e9fcaa8aSmrg  </row>
218eb411b4bSmrg  <row>
219e9fcaa8aSmrg    <entry role='functionargdecl'>
220e9fcaa8aSmrgDisplay *      <emphasis>
221e9fcaa8aSmrgdpy;      </emphasis>
222e9fcaa8aSmrg      /* connection to the X server */
223e9fcaa8aSmrg    </entry>
224e9fcaa8aSmrg  </row>
225eb411b4bSmrg  <row>
226e9fcaa8aSmrg    <entry role='functionargdecl'>
227e9fcaa8aSmrgint *      <emphasis>
228e9fcaa8aSmrgopcode_rtrn</emphasis>
229e9fcaa8aSmrg;            /* backfilled with the major extension opcode */
230e9fcaa8aSmrg    </entry>
231e9fcaa8aSmrg  </row>
232eb411b4bSmrg  <row>
233e9fcaa8aSmrg    <entry role='functionargdecl'>
234e9fcaa8aSmrgint *      <emphasis>
235e9fcaa8aSmrgevent_rtrn</emphasis>
236e9fcaa8aSmrg;            /* backfilled with the extension base event code */
237e9fcaa8aSmrg    </entry>
238e9fcaa8aSmrg  </row>
239eb411b4bSmrg  <row>
240e9fcaa8aSmrg    <entry role='functionargdecl'>
241e9fcaa8aSmrgint *      <emphasis>
242e9fcaa8aSmrgerror_rtrn</emphasis>
243e9fcaa8aSmrg;            /* backfilled with the extension base error code */
244e9fcaa8aSmrg    </entry>
245e9fcaa8aSmrg  </row>
246eb411b4bSmrg  <row>
247e9fcaa8aSmrg    <entry role='functionargdecl'>
248e9fcaa8aSmrgint *      <emphasis>
249e9fcaa8aSmrgmajor_in_out</emphasis>
250e9fcaa8aSmrg;            /* compile time lib major version in, server major version out */
251e9fcaa8aSmrg    </entry>
252e9fcaa8aSmrg  </row>
253eb411b4bSmrg  <row>
254e9fcaa8aSmrg    <entry role='functionargdecl'>
255e9fcaa8aSmrgint *      <emphasis>
256e9fcaa8aSmrgminor_in_out;      </emphasis>
257e9fcaa8aSmrg      /* compile time lib min version in, server minor version out */
258e9fcaa8aSmrg    </entry>
259e9fcaa8aSmrg</row>
260e9fcaa8aSmrg</tbody>
261e9fcaa8aSmrg</tgroup>
262e9fcaa8aSmrg</informaltable>
263e9fcaa8aSmrg
264e9fcaa8aSmrg<para>
265e9fcaa8aSmrgThe <emphasis>
266e9fcaa8aSmrgXkbQueryExtension</emphasis>
267e9fcaa8aSmrg function determines whether a compatible version of the X Keyboard Extension
268e9fcaa8aSmrgis present in the server. If a compatible extension is present, <emphasis>
269e9fcaa8aSmrgXkbQueryExtension</emphasis>
270e9fcaa8aSmrg returns <emphasis>
271e9fcaa8aSmrgTrue</emphasis>
272e9fcaa8aSmrg; otherwise, it returns <emphasis>
273e9fcaa8aSmrgFalse</emphasis>
274e9fcaa8aSmrg.
275e9fcaa8aSmrg</para>
276e9fcaa8aSmrg
277e9fcaa8aSmrg<para>
278e9fcaa8aSmrgIf a compatible version of Xkb is present, <emphasis>
279e9fcaa8aSmrgXkbQueryExtension</emphasis>
280e9fcaa8aSmrg initializes the extension. It backfills the major opcode for the keyboard
281e9fcaa8aSmrgextension in <emphasis>
282e9fcaa8aSmrgopcode_rtrn</emphasis>
283e9fcaa8aSmrg, the base event code in <emphasis>
284e9fcaa8aSmrgevent_rtrn</emphasis>
285e9fcaa8aSmrg<emphasis>
286e9fcaa8aSmrg, the base error code</emphasis>
287e9fcaa8aSmrg in <emphasis>
288e9fcaa8aSmrgerror_rtrn</emphasis>
289e9fcaa8aSmrg, and the major and minor version numbers of the extension in <emphasis>
290e9fcaa8aSmrgmajor_in_out</emphasis>
291e9fcaa8aSmrg and <emphasis>
292e9fcaa8aSmrgminor_in_out</emphasis>
293e9fcaa8aSmrg. The major opcode is reported in the <emphasis>
294e9fcaa8aSmrgreq_major</emphasis>
295e9fcaa8aSmrg fields of some Xkb events. For a discussion of the base event code, see
296e9fcaa8aSmrgsection 4.1. <!-- xref -->
297e9fcaa8aSmrg</para>
298e9fcaa8aSmrg
299e9fcaa8aSmrg<para>
300e9fcaa8aSmrgAs a convenience, you can use the function <emphasis>
301e9fcaa8aSmrgXkbOpenDisplay</emphasis>
302e9fcaa8aSmrg to perform these three tasks at once: open a connection to an X server, check
303e9fcaa8aSmrgfor a compatible version of the Xkb extension in both the library and the
304e9fcaa8aSmrgserver, and initialize the extension for use.
305e9fcaa8aSmrg</para>
306e9fcaa8aSmrg
307e9fcaa8aSmrg<informaltable frame='none'>
308eb411b4bSmrg<?dbfo keep-together="always" ?>
309eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'>
310eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
311e9fcaa8aSmrg<tbody>
312eb411b4bSmrg  <row>
313e9fcaa8aSmrg    <entry role='functiondecl'>
314e9fcaa8aSmrgDisplay *<emphasis>
315e9fcaa8aSmrgXkbOpenDisplay</emphasis>
316e9fcaa8aSmrg(<emphasis>
317e9fcaa8aSmrgdisplay_name, event_rtrn, error_rtrn, major_in_out, minor_in_out,
318e9fcaa8aSmrgreason_rtrn)</emphasis>
319e9fcaa8aSmrg    </entry>
320e9fcaa8aSmrg  </row>
321eb411b4bSmrg  <row>
322e9fcaa8aSmrg    <entry role='functionargdecl'>
323e9fcaa8aSmrgchar *      <emphasis>
324e9fcaa8aSmrgdisplay_name</emphasis>
325e9fcaa8aSmrg;      /* hardware display name, which determines the display and
326e9fcaa8aSmrgcommunications domain to be used */
327e9fcaa8aSmrg    </entry>
328e9fcaa8aSmrg  </row>
329eb411b4bSmrg  <row>
330e9fcaa8aSmrg    <entry role='functionargdecl'>
331e9fcaa8aSmrgint *      <emphasis>
332e9fcaa8aSmrgevent_rtrn</emphasis>
333e9fcaa8aSmrg;      /* backfilled with the extension base event code */
334e9fcaa8aSmrg    </entry>
335e9fcaa8aSmrg  </row>
336eb411b4bSmrg  <row>
337e9fcaa8aSmrg    <entry role='functionargdecl'>
338e9fcaa8aSmrgint *      <emphasis>
339e9fcaa8aSmrgerror_rtrn</emphasis>
340e9fcaa8aSmrg;      /* backfilled with the extension base error code */
341e9fcaa8aSmrg    </entry>
342e9fcaa8aSmrg  </row>
343eb411b4bSmrg  <row>
344e9fcaa8aSmrg    <entry role='functionargdecl'>
345e9fcaa8aSmrgint *      <emphasis>
346e9fcaa8aSmrgmajor_in_out</emphasis>
347e9fcaa8aSmrg;      /* compile time lib major version in, server major version out */
348e9fcaa8aSmrg    </entry>
349e9fcaa8aSmrg  </row>
350eb411b4bSmrg  <row>
351e9fcaa8aSmrg    <entry role='functionargdecl'>
352e9fcaa8aSmrgint *      <emphasis>
353e9fcaa8aSmrgminor_in_out</emphasis>
354e9fcaa8aSmrg;      /* compile time lib minor version in, server minor version out */
355e9fcaa8aSmrg    </entry>
356e9fcaa8aSmrg  </row>
357eb411b4bSmrg  <row>
358e9fcaa8aSmrg    <entry role='functionargdecl'>
359e9fcaa8aSmrgint *      <emphasis>
360e9fcaa8aSmrgreason_rtrn</emphasis>
361e9fcaa8aSmrg;      /* backfilled with a status code */
362e9fcaa8aSmrg    </entry>
363e9fcaa8aSmrg</row>
364e9fcaa8aSmrg</tbody>
365e9fcaa8aSmrg</tgroup>
366e9fcaa8aSmrg</informaltable>
367e9fcaa8aSmrg
368e9fcaa8aSmrg<para>
369e9fcaa8aSmrg<emphasis>
370e9fcaa8aSmrgXkbOpenDisplay </emphasis>
371e9fcaa8aSmrgis a convenience function that opens an X display connection and initializes
372e9fcaa8aSmrgthe X keyboard extension. In all cases, upon return <emphasis>
373e9fcaa8aSmrgreason_rtrn</emphasis>
374e9fcaa8aSmrg contains a status value indicating success or the type of failure. If
375e9fcaa8aSmrg<emphasis>
376e9fcaa8aSmrgmajor_in_out</emphasis>
377e9fcaa8aSmrg and <emphasis>
378e9fcaa8aSmrgminor_in_out</emphasis>
379e9fcaa8aSmrg are not <emphasis>
380e9fcaa8aSmrgNULL</emphasis>
381e9fcaa8aSmrg, <emphasis>
382e9fcaa8aSmrgXkbOpenDisplay</emphasis>
383e9fcaa8aSmrg first calls <emphasis>
384e9fcaa8aSmrgXkbLibraryVersion</emphasis>
385e9fcaa8aSmrg to determine whether the client library is compatible, passing it the values
386e9fcaa8aSmrgpointed to by <emphasis>
387e9fcaa8aSmrgmajor_in_out</emphasis>
388e9fcaa8aSmrg and <emphasis>
389e9fcaa8aSmrgminor_in_out</emphasis>
390e9fcaa8aSmrg. If the library is incompatible, <emphasis>
391e9fcaa8aSmrgXkbOpenDisplay</emphasis>
392e9fcaa8aSmrg backfills <emphasis>
393e9fcaa8aSmrgmajor_in_out</emphasis>
394e9fcaa8aSmrg and <emphasis>
395e9fcaa8aSmrgminor_in_out</emphasis>
396e9fcaa8aSmrg with the major and minor extension versions of the library being used and
397e9fcaa8aSmrgreturns <emphasis>
398e9fcaa8aSmrgNULL</emphasis>
399e9fcaa8aSmrg. If the library is compatible,<emphasis>
400e9fcaa8aSmrg XkbOpenDisplay </emphasis>
401e9fcaa8aSmrgnext calls <emphasis>
402e9fcaa8aSmrgXOpenDisplay</emphasis>
403e9fcaa8aSmrg with the <emphasis>
404e9fcaa8aSmrgdisplay_name</emphasis>
405e9fcaa8aSmrg. If this fails, the function returns <emphasis>
406e9fcaa8aSmrgNULL</emphasis>
407e9fcaa8aSmrg. If successful, <emphasis>
408e9fcaa8aSmrgXkbOpenDisplay </emphasis>
409e9fcaa8aSmrgcalls <emphasis>
410e9fcaa8aSmrgXkbQueryExtension</emphasis>
411e9fcaa8aSmrg and<emphasis>
412e9fcaa8aSmrg </emphasis>
413e9fcaa8aSmrgbackfills the major and minor Xkb server extension version numbers in <emphasis>
414e9fcaa8aSmrgmajor_in_out</emphasis>
415e9fcaa8aSmrg and <emphasis>
416e9fcaa8aSmrgminor_in_out</emphasis>
417e9fcaa8aSmrg.<emphasis>
418e9fcaa8aSmrg </emphasis>
419e9fcaa8aSmrgIf the server extension version is not compatible with the library extension
420e9fcaa8aSmrgversion or if the server extension is not present, <emphasis>
421e9fcaa8aSmrgXkbOpenDisplay </emphasis>
422e9fcaa8aSmrgcloses the display and returns <emphasis>
423e9fcaa8aSmrgNULL</emphasis>
424e9fcaa8aSmrg. When successful, the function returns the display connection<emphasis>
425e9fcaa8aSmrg.</emphasis>
426e9fcaa8aSmrg</para>
427e9fcaa8aSmrg
428e9fcaa8aSmrg<para>
429e9fcaa8aSmrgThe possible values for <emphasis>
430e9fcaa8aSmrgreason_rtrn</emphasis> are:
431e9fcaa8aSmrg</para>
432e9fcaa8aSmrg
433e9fcaa8aSmrg<itemizedlist>
434e9fcaa8aSmrg<listitem>
435e9fcaa8aSmrg  <para>
436e9fcaa8aSmrg<emphasis>
437e9fcaa8aSmrgXkbOD_BadLibraryVersion</emphasis>
438e9fcaa8aSmrg indicates <emphasis>
439e9fcaa8aSmrgXkbLibraryVersion </emphasis>
440e9fcaa8aSmrgreturned <emphasis>
441e9fcaa8aSmrgFalse</emphasis>.
442e9fcaa8aSmrg  </para>
443e9fcaa8aSmrg</listitem>
444e9fcaa8aSmrg<listitem>
445e9fcaa8aSmrg  <para>
446e9fcaa8aSmrg<emphasis>
447e9fcaa8aSmrgXkbOD_ConnectionRefused</emphasis>
448e9fcaa8aSmrg indicates the display could not be opened.
449e9fcaa8aSmrg  </para>
450e9fcaa8aSmrg</listitem>
451e9fcaa8aSmrg<listitem>
452e9fcaa8aSmrg  <para>
453e9fcaa8aSmrg<emphasis>
454e9fcaa8aSmrgXkbOD_BadServerVersion</emphasis>
455e9fcaa8aSmrg indicates the library and the server have incompatible extension versions.
456e9fcaa8aSmrg  </para>
457e9fcaa8aSmrg</listitem>
458e9fcaa8aSmrg<listitem>
459e9fcaa8aSmrg  <para>
460e9fcaa8aSmrg<emphasis>
461e9fcaa8aSmrgXkbOD_NonXkbServer</emphasis>
462e9fcaa8aSmrg indicates the extension is not present in the X server.
463e9fcaa8aSmrg  </para>
464e9fcaa8aSmrg</listitem>
465e9fcaa8aSmrg<listitem>
466e9fcaa8aSmrg  <para>
467e9fcaa8aSmrg<emphasis>
468e9fcaa8aSmrgXkbOD_Success</emphasis>
469e9fcaa8aSmrg indicates that the function succeeded.
470e9fcaa8aSmrg  </para>
471e9fcaa8aSmrg</listitem>
472e9fcaa8aSmrg</itemizedlist>
473e9fcaa8aSmrg</sect1>
474e9fcaa8aSmrg
475eb411b4bSmrg<sect1 id='Disabling_the_Keyboard_Extension'>
476e9fcaa8aSmrg<title>Disabling the Keyboard Extension</title>
477e9fcaa8aSmrg<para>
478e9fcaa8aSmrgIf a server supports the Xkb extension, the X library normally implements
479e9fcaa8aSmrgpreXkb keyboard functions using the Xkb keyboard description and state. The
480e9fcaa8aSmrgserver Xkb keyboard state may differ from the preXkb keyboard state. This
481e9fcaa8aSmrgdifference does not affect most clients, but there are exceptions. To allow
482e9fcaa8aSmrgthese clients to work properly, you may instruct the extension not to use Xkb
483e9fcaa8aSmrgfunctionality.
484e9fcaa8aSmrg</para>
485e9fcaa8aSmrg
486e9fcaa8aSmrg<para>
487e9fcaa8aSmrgCall <emphasis>
488e9fcaa8aSmrgXkbIgnoreExtension</emphasis>
489e9fcaa8aSmrg to prevent core X library keyboard functions from using the X Keyboard
490e9fcaa8aSmrgExtension. You must call <emphasis>
491e9fcaa8aSmrgXkbIgnoreExtension</emphasis>
492e9fcaa8aSmrg before you open a server connection; Xkb does not provide a way to enable or
493e9fcaa8aSmrgdisable use of the extension once a connection is established.
494e9fcaa8aSmrg</para>
495e9fcaa8aSmrg
496e9fcaa8aSmrg<informaltable frame='none'>
497eb411b4bSmrg<?dbfo keep-together="always" ?>
498eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'>
499eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
500e9fcaa8aSmrg<tbody>
501eb411b4bSmrg  <row>
502e9fcaa8aSmrg    <entry role='functiondecl'>
503e9fcaa8aSmrgBool<emphasis>
504e9fcaa8aSmrg XkbIgnoreExtension</emphasis>
505e9fcaa8aSmrg(<emphasis>
506e9fcaa8aSmrgignore</emphasis>
507e9fcaa8aSmrg)
508e9fcaa8aSmrg    </entry>
509e9fcaa8aSmrg  </row>
510eb411b4bSmrg  <row>
511e9fcaa8aSmrg    <entry role='functionargdecl'>
512e9fcaa8aSmrgBool      <emphasis>
513e9fcaa8aSmrgignore</emphasis>
514e9fcaa8aSmrg;      /* <emphasis>
515e9fcaa8aSmrgTrue</emphasis>
516e9fcaa8aSmrg means ignore the extension */
517e9fcaa8aSmrg    </entry>
518e9fcaa8aSmrg</row>
519e9fcaa8aSmrg</tbody>
520e9fcaa8aSmrg</tgroup>
521e9fcaa8aSmrg</informaltable>
522e9fcaa8aSmrg
523e9fcaa8aSmrg<para>
524e9fcaa8aSmrg<emphasis>
525e9fcaa8aSmrgXkbIgnoreExtension</emphasis>
526e9fcaa8aSmrg tells the X library whether to use the X Keyboard Extension on any
527e9fcaa8aSmrgsubsequently opened X display connections. If ignore is <emphasis>
528e9fcaa8aSmrgTrue</emphasis>
529e9fcaa8aSmrg, the library does not initialize the Xkb extension when it opens a new
530e9fcaa8aSmrgdisplay. This forces the X server to use compatibility mode and communicate
531e9fcaa8aSmrgwith the client using only core protocol requests and events. If ignore is
532e9fcaa8aSmrg<emphasis>
533e9fcaa8aSmrgFalse</emphasis>
534e9fcaa8aSmrg, the library treats subsequent calls to <emphasis>
535e9fcaa8aSmrgXOpenDisplay</emphasis>
536e9fcaa8aSmrg normally and uses Xkb extension requests, events, and state. Do not explicitly
537e9fcaa8aSmrguse Xkb on a connection for which it is disabled.<emphasis>
538e9fcaa8aSmrg XkbIgnoreExtension</emphasis>
539e9fcaa8aSmrg returns <emphasis>
540e9fcaa8aSmrgFalse</emphasis>
541e9fcaa8aSmrg if it was unable to apply the ignore request.
542e9fcaa8aSmrg</para>
543e9fcaa8aSmrg
544e9fcaa8aSmrg</sect1>
545eb411b4bSmrg<sect1 id='Protocol_Errors'>
546e9fcaa8aSmrg<title>Protocol Errors</title>
547e9fcaa8aSmrg<para>
548e9fcaa8aSmrgMany of the Xkb extension library functions described in this document can
549e9fcaa8aSmrgcause the X server to report an error, referred to in this document as a
550e9fcaa8aSmrg<emphasis>
551e9fcaa8aSmrgBadXxx</emphasis>
552e9fcaa8aSmrg protocol error, where <emphasis>
553e9fcaa8aSmrgXxx</emphasis>
554e9fcaa8aSmrg is some name. These errors are fielded in the normal manner, by the default
555e9fcaa8aSmrgXlib error handler or one replacing it. Note that X protocol errors are not
556e9fcaa8aSmrgnecessarily reported immediately because of the buffering of X protocol
557e9fcaa8aSmrgrequests in Xlib and the server.
558e9fcaa8aSmrg</para>
559e9fcaa8aSmrg
560e9fcaa8aSmrg<para>
561e9fcaa8aSmrgTable 2.1 lists the protocol errors that can be generated, and their causes. <!-- xref -->
562e9fcaa8aSmrg</para>
563e9fcaa8aSmrg
564eb411b4bSmrg<table frame='topbot'>
565e9fcaa8aSmrg<title>Xkb Protocol Errors</title>
566eb411b4bSmrg<?dbfo keep-together="always" ?>
567eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
568eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
569eb411b4bSmrg<colspec colname='c2' colwidth='3.0*'/>
570e9fcaa8aSmrg<thead>
571e9fcaa8aSmrg  <row rowsep='1'>
572e9fcaa8aSmrg    <entry>Error</entry>
573e9fcaa8aSmrg    <entry>Cause</entry>
574e9fcaa8aSmrg  </row>
575e9fcaa8aSmrg</thead>
576e9fcaa8aSmrg<tbody>
577eb411b4bSmrg  <row>
578e9fcaa8aSmrg    <entry>BadAccess</entry>
579e9fcaa8aSmrg    <entry>
580e9fcaa8aSmrg<para>
581e9fcaa8aSmrgThe Xkb extension has not been properly initialized
582e9fcaa8aSmrg</para>
583e9fcaa8aSmrg    </entry>
584e9fcaa8aSmrg  </row>
585eb411b4bSmrg  <row>
586e9fcaa8aSmrg    <entry>BadKeyboard</entry>
587e9fcaa8aSmrg    <entry>
588e9fcaa8aSmrg<para>
589e9fcaa8aSmrgThe device specified was not a valid core or input extension device
590e9fcaa8aSmrg</para>
591e9fcaa8aSmrg    </entry>
592e9fcaa8aSmrg  </row>
593eb411b4bSmrg  <row>
594e9fcaa8aSmrg    <entry>BadImplementation</entry>
595e9fcaa8aSmrg    <entry>
596e9fcaa8aSmrg<para>
597e9fcaa8aSmrgInvalid reply from server
598e9fcaa8aSmrg</para>
599e9fcaa8aSmrg    </entry>
600e9fcaa8aSmrg  </row>
601eb411b4bSmrg  <row>
602e9fcaa8aSmrg    <entry>BadAlloc</entry>
603e9fcaa8aSmrg    <entry>
604e9fcaa8aSmrg<para>
605e9fcaa8aSmrgUnable to allocate storage
606e9fcaa8aSmrg</para>
607e9fcaa8aSmrg    </entry>
608e9fcaa8aSmrg  </row>
609eb411b4bSmrg  <row>
610e9fcaa8aSmrg    <entry>BadMatch</entry>
611e9fcaa8aSmrg    <entry>
612e9fcaa8aSmrg<para>
613e9fcaa8aSmrgA compatible version of Xkb was not available in the server or an argument has
614e9fcaa8aSmrgcorrect type and range, but is otherwise invalid
615e9fcaa8aSmrg</para>
616e9fcaa8aSmrg    </entry>
617e9fcaa8aSmrg  </row>
618eb411b4bSmrg  <row>
619e9fcaa8aSmrg    <entry>BadValue</entry>
620e9fcaa8aSmrg    <entry>
621e9fcaa8aSmrg<para>
622e9fcaa8aSmrgAn argument is out of range
623e9fcaa8aSmrg</para>
624e9fcaa8aSmrg    </entry>
625e9fcaa8aSmrg  </row>
626eb411b4bSmrg  <row>
627e9fcaa8aSmrg    <entry>BadAtom</entry>
628e9fcaa8aSmrg    <entry>
629e9fcaa8aSmrg<para>
630e9fcaa8aSmrgA name is neither a valid Atom or <emphasis>
631e9fcaa8aSmrgNone</emphasis>
632e9fcaa8aSmrg</para>
633e9fcaa8aSmrg    </entry>
634e9fcaa8aSmrg  </row>
635eb411b4bSmrg  <row>
636e9fcaa8aSmrg    <entry>BadDevice</entry>
637e9fcaa8aSmrg    <entry>
638e9fcaa8aSmrg<para>
639e9fcaa8aSmrgDevice, Feedback Class, or Feedback ID invalid
640e9fcaa8aSmrg</para>
641e9fcaa8aSmrg    </entry>
642e9fcaa8aSmrg  </row>
643e9fcaa8aSmrg</tbody>
644e9fcaa8aSmrg</tgroup>
645e9fcaa8aSmrg</table>
646e9fcaa8aSmrg
647e9fcaa8aSmrg<para>
648e9fcaa8aSmrgThe Xkb extension adds a single protocol error, <emphasis>
649e9fcaa8aSmrgBadKeyboard</emphasis>
650e9fcaa8aSmrg, to the core protocol error set. This error code will be reported as the
651e9fcaa8aSmrg<emphasis>
652e9fcaa8aSmrgerror_rtrn</emphasis>
653e9fcaa8aSmrg when <emphasis>
654e9fcaa8aSmrgXkbQueryExtension</emphasis>
655e9fcaa8aSmrg is called. When a <emphasis>
656e9fcaa8aSmrgBadKeyboard</emphasis>
657e9fcaa8aSmrg error is reported in an <emphasis>
658e9fcaa8aSmrgXErrorEvent</emphasis>
659e9fcaa8aSmrg, additional information is reported in the <emphasis>
660e9fcaa8aSmrgresource_id</emphasis>
661e9fcaa8aSmrg field. The most significant byte of the <emphasis>
662e9fcaa8aSmrgresource_id</emphasis>
663e9fcaa8aSmrg is a further refinement of the error cause, as defined in Table 2.2. The least
664e9fcaa8aSmrgsignificant byte will contain the device, class, or feedback ID as indicated in
665e9fcaa8aSmrgthe table.
666e9fcaa8aSmrg</para>
667e9fcaa8aSmrg
668eb411b4bSmrg<table frame='topbot'>
669e9fcaa8aSmrg<title>BadKeyboard Protocol Error resource_id Values</title>
670eb411b4bSmrg<?dbfo keep-together="always" ?>
671eb411b4bSmrg<tgroup cols='4' align='left' colsep='0' rowsep='0'>
672eb411b4bSmrg<colspec colname='c1' colwidth='2.0*'/>
673eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
674eb411b4bSmrg<colspec colname='c3' colwidth='3.0*'/>
675eb411b4bSmrg<colspec colname='c4' colwidth='2.0*'/>
676e9fcaa8aSmrg<thead>
677eb411b4bSmrg  <row rowsep='1'>
678e9fcaa8aSmrg    <entry>high-order byte</entry>
679e9fcaa8aSmrg    <entry>value</entry>
680e9fcaa8aSmrg    <entry>meaning</entry>
681e9fcaa8aSmrg    <entry>low-order byte</entry>
682e9fcaa8aSmrg  </row>
683e9fcaa8aSmrg</thead>
684e9fcaa8aSmrg<tbody>
685eb411b4bSmrg  <row>
686e9fcaa8aSmrg    <entry>XkbErr_BadDevice</entry>
687e9fcaa8aSmrg    <entry>0xff</entry>
688e9fcaa8aSmrg    <entry>
689e9fcaa8aSmrg<para>
690e9fcaa8aSmrgdevice not found
691e9fcaa8aSmrg</para>
692e9fcaa8aSmrg    </entry>
693e9fcaa8aSmrg    <entry>device ID</entry>
694e9fcaa8aSmrg  </row>
695eb411b4bSmrg  <row>
696e9fcaa8aSmrg    <entry>XkbErr_BadClass</entry>
697e9fcaa8aSmrg    <entry>0xfe</entry>
698e9fcaa8aSmrg    <entry>
699e9fcaa8aSmrg<para>
700e9fcaa8aSmrgdevice found, but it is of the wrong class
701e9fcaa8aSmrg</para>
702e9fcaa8aSmrg    </entry>
703e9fcaa8aSmrg    <entry>class ID</entry>
704e9fcaa8aSmrg  </row>
705eb411b4bSmrg  <row>
706e9fcaa8aSmrg    <entry>XkbErr_BadId</entry>
707e9fcaa8aSmrg    <entry>0xfd</entry>
708e9fcaa8aSmrg    <entry>
709e9fcaa8aSmrg<para>
710e9fcaa8aSmrgdevice found, class ok, but device does not contain a feedback with the
711e9fcaa8aSmrgindicated ID
712e9fcaa8aSmrg</para>
713e9fcaa8aSmrg    </entry>
714e9fcaa8aSmrg    <entry>feedback ID</entry>
715e9fcaa8aSmrg  </row>
716e9fcaa8aSmrg</tbody>
717e9fcaa8aSmrg</tgroup>
718e9fcaa8aSmrg</table>
719e9fcaa8aSmrg</sect1>
720e9fcaa8aSmrg
721eb411b4bSmrg<sect1 id='Display_and_Device_Specifications_in_Function_Calls'>
722e9fcaa8aSmrg<title>Display and Device Specifications in Function Calls</title>
723e9fcaa8aSmrg<para>
724e9fcaa8aSmrgWhere a connection to the server is passed as an argument (Display*) and an
725e9fcaa8aSmrg<emphasis>
726e9fcaa8aSmrgXkbDescPtr</emphasis>
727e9fcaa8aSmrg is also passed as an argument, the Display* argument must match the <emphasis>
728e9fcaa8aSmrgdpy</emphasis>
729e9fcaa8aSmrg field of the <emphasis>
730e9fcaa8aSmrgXkbDescRec</emphasis>
731e9fcaa8aSmrg pointed to by the <emphasis>
732e9fcaa8aSmrgXkbDescPtr</emphasis>
733e9fcaa8aSmrg argument, or else the <emphasis>
734e9fcaa8aSmrgdpy</emphasis>
735e9fcaa8aSmrg field of the <emphasis>
736e9fcaa8aSmrgXkbDescRec</emphasis>
737e9fcaa8aSmrg must be <emphasis>
738e9fcaa8aSmrgNULL</emphasis>
739e9fcaa8aSmrg. If they don’t match or the <emphasis>
740e9fcaa8aSmrgdpy</emphasis>
741e9fcaa8aSmrg field is not <emphasis>
742e9fcaa8aSmrgNULL</emphasis>
743e9fcaa8aSmrg, a <emphasis>
744e9fcaa8aSmrgBadMatch</emphasis>
745e9fcaa8aSmrg error is returned (either in the return value or a backfilled <emphasis>
746e9fcaa8aSmrgStatus</emphasis>
747e9fcaa8aSmrg variable). Upon successful return, the <emphasis>
748e9fcaa8aSmrgdpy</emphasis>
749e9fcaa8aSmrg field of the <emphasis>
750e9fcaa8aSmrgXkbDescRec</emphasis>
751e9fcaa8aSmrg always contains the Display* value passed in.
752e9fcaa8aSmrg</para>
753e9fcaa8aSmrg
754e9fcaa8aSmrg<para>
755e9fcaa8aSmrgThe Xkb extension can communicate with the X input extension if it is present.
756e9fcaa8aSmrgConsequently, there can potentially be more than one input device connected to
757e9fcaa8aSmrgthe server. Most Xkb library calls that require communicating with the server
758e9fcaa8aSmrginvolve both a server connection (Display * <emphasis>
759e9fcaa8aSmrgdpy</emphasis>
760e9fcaa8aSmrg) and a device identifier (unsigned int <emphasis>
761e9fcaa8aSmrgdevice_spec</emphasis>
762e9fcaa8aSmrg). In some cases, the device identifier is implicit and is taken as the
763e9fcaa8aSmrg<emphasis>
764e9fcaa8aSmrgdevice_spec</emphasis>
765e9fcaa8aSmrg field of an <emphasis>
766e9fcaa8aSmrgXkbDescRec</emphasis>
767e9fcaa8aSmrg structure passed as an argument.
768e9fcaa8aSmrg</para>
769e9fcaa8aSmrg
770e9fcaa8aSmrg<para>
771e9fcaa8aSmrgThe device identifier can specify any X input extension device with a <emphasis>
772e9fcaa8aSmrgKeyClass</emphasis>
773e9fcaa8aSmrg component, or it can specify the constant, <emphasis>
774e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
775e9fcaa8aSmrg. The use of <emphasis>
776e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
777e9fcaa8aSmrg allows applications to indicate the core keyboard without having to determine
778e9fcaa8aSmrgits device identifier.
779e9fcaa8aSmrg</para>
780e9fcaa8aSmrg
781e9fcaa8aSmrg<para>
782e9fcaa8aSmrgWhere an Xkb device identifier is passed as an argument and an <emphasis>
783e9fcaa8aSmrgXkbDescPtr</emphasis>
784e9fcaa8aSmrg is also passed as an argument, if either the argument or the <emphasis>
785e9fcaa8aSmrgXkbDescRec</emphasis>
786e9fcaa8aSmrg <emphasis>
787e9fcaa8aSmrgdevice_spec</emphasis>
788e9fcaa8aSmrg field is <emphasis>
789e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
790e9fcaa8aSmrg, and if the function returns successfully, the <emphasis>
791e9fcaa8aSmrgXkbDescPtr</emphasis>
792e9fcaa8aSmrg <emphasis>
793e9fcaa8aSmrgdevice_spec</emphasis>
794e9fcaa8aSmrg field will have been converted from <emphasis>
795e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
796e9fcaa8aSmrg to a real Xkb device ID. If the function does not complete successfully, the
797e9fcaa8aSmrg<emphasis>
798e9fcaa8aSmrgdevice_spec</emphasis>
799e9fcaa8aSmrg field remains unchanged. Subsequently, the device id argument must match the
800e9fcaa8aSmrg<emphasis>
801e9fcaa8aSmrgdevice_spec</emphasis>
802e9fcaa8aSmrg field of the <emphasis>
803e9fcaa8aSmrgXkbDescPtr</emphasis>
804e9fcaa8aSmrg argument. If they don’t match, a <emphasis>
805e9fcaa8aSmrgBadMatch</emphasis>
806e9fcaa8aSmrg error is returned (either in the return value or a backfilled <emphasis>
807e9fcaa8aSmrgStatus</emphasis>
808e9fcaa8aSmrg variable).
809e9fcaa8aSmrg</para>
810e9fcaa8aSmrg
811e9fcaa8aSmrg<para>
812e9fcaa8aSmrgWhen the Xkb extension in the server hands an application a device identifier
813e9fcaa8aSmrgto use for the keyboard, that ID is the input extension identifier for the
814e9fcaa8aSmrgdevice if the server supports the X Input Extension. If the server does not
815e9fcaa8aSmrgsupport the input extension, the meaning of the identifier is undefined — the
816e9fcaa8aSmrgonly guarantee is that when you use <emphasis>
817e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
818e9fcaa8aSmrg, <emphasis>
819e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
820e9fcaa8aSmrg will work and the identifier returned by the server will refer to the core
821e9fcaa8aSmrgkeyboard device.
822e9fcaa8aSmrg</para>
823e9fcaa8aSmrg</sect1>
824e9fcaa8aSmrg</chapter>
825