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><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> 51eb411b4bSmrg<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> 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