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