ch06.xml revision e9fcaa8a
1e9fcaa8aSmrg<chapter id='complete_keyboard_description'> 2e9fcaa8aSmrg<title>Complete Keyboard Description</title> 3e9fcaa8aSmrg 4e9fcaa8aSmrg<para> 5e9fcaa8aSmrgThe complete Xkb description for a keyboard device is accessed using a single 6e9fcaa8aSmrgstructure containing pointers to major Xkb components. This chapter describes 7e9fcaa8aSmrgthis single structure and provides references to other sections of this 8e9fcaa8aSmrgdocument that discuss the major Xkb components in detail. 9e9fcaa8aSmrg</para> 10e9fcaa8aSmrg 11e9fcaa8aSmrg<sect1 id='the_xkbdescrec_structure'> 12e9fcaa8aSmrg<title>The XkbDescRec Structure</title> 13e9fcaa8aSmrg 14e9fcaa8aSmrg<para> 15e9fcaa8aSmrgThe complete description of an Xkb keyboard is given by an <emphasis> 16e9fcaa8aSmrgXkbDescRec</emphasis> 17e9fcaa8aSmrg. The component structures in the <emphasis> 18e9fcaa8aSmrgXkbDescRec</emphasis> 19e9fcaa8aSmrg represent the major Xkb components outlined in Figure 1.1. <!-- xref --> 20e9fcaa8aSmrg</para> 21e9fcaa8aSmrg 22e9fcaa8aSmrg<para><programlisting> 23e9fcaa8aSmrgtypedef struct { 24e9fcaa8aSmrg struct _XDisplay * display; /* connection to 25e9fcaa8aSmrgX server */ 26e9fcaa8aSmrg unsigned short flags; /* private to Xkb, do 27e9fcaa8aSmrgnot modify */ 28e9fcaa8aSmrg unsigned short device_spec; /* device of 29e9fcaa8aSmrginterest */ 30e9fcaa8aSmrg KeyCode min_key_code; /* minimum keycode for 31e9fcaa8aSmrgdevice */ 32e9fcaa8aSmrg KeyCode max_key_code; /* maximum keycode for 33e9fcaa8aSmrgdevice */ 34e9fcaa8aSmrg XkbControlsPtr ctrls; /* controls */ 35e9fcaa8aSmrg XkbServerMapPtr server; /* server keymap */ 36e9fcaa8aSmrg XkbClientMapPtr map; /* client keymap */ 37e9fcaa8aSmrg XkbIndicatorPtr indicators; /* indicator map 38e9fcaa8aSmrg*/ 39e9fcaa8aSmrg XkbNamesPtr names; /* names for all 40e9fcaa8aSmrgcomponents */ 41e9fcaa8aSmrg XkbCompatMapPtr compat; /* compatibility map 42e9fcaa8aSmrg*/ 43e9fcaa8aSmrg XkbGeometryPtr geom; /* physical geometry of 44e9fcaa8aSmrgkeyboard */ 45e9fcaa8aSmrg} <emphasis> 46e9fcaa8aSmrgXkbDescRec</emphasis> 47e9fcaa8aSmrg, *XkbDescPtr; 48e9fcaa8aSmrg</programlisting></para> 49e9fcaa8aSmrg 50e9fcaa8aSmrg<para> 51e9fcaa8aSmrgThe <emphasis> 52e9fcaa8aSmrgdisplay</emphasis> 53e9fcaa8aSmrg field points to an X display structure. The <emphasis> 54e9fcaa8aSmrgflags</emphasis> 55e9fcaa8aSmrg field is private to the library: modifying <emphasis> 56e9fcaa8aSmrgflags</emphasis> 57e9fcaa8aSmrg may yield unpredictable results. The <emphasis> 58e9fcaa8aSmrgdevice_spec</emphasis> 59e9fcaa8aSmrg field specifies the device identifier of the keyboard input device, or 60e9fcaa8aSmrg<emphasis> 61e9fcaa8aSmrgXkbUseCoreKeyboard</emphasis> 62e9fcaa8aSmrg, which specifies the core keyboard device. The <emphasis> 63e9fcaa8aSmrgmin_key_code</emphasis> 64e9fcaa8aSmrg and <emphasis> 65e9fcaa8aSmrgmax_key_code</emphasis> 66e9fcaa8aSmrg fields specify the least and greatest keycode that can be returned by the 67e9fcaa8aSmrgkeyboard. 68e9fcaa8aSmrg</para> 69e9fcaa8aSmrg 70e9fcaa8aSmrg 71e9fcaa8aSmrg<para> 72e9fcaa8aSmrgThe other fields specify structure components of the keyboard description and 73e9fcaa8aSmrgare described in detail in other sections of this document. Table 6.1 74e9fcaa8aSmrgidentifies the subsequent sections of this document that discuss the individual 75e9fcaa8aSmrgcomponents of the <emphasis> 76e9fcaa8aSmrgXkbDescRec</emphasis> 77e9fcaa8aSmrg. 78e9fcaa8aSmrg</para> 79e9fcaa8aSmrg 80e9fcaa8aSmrg<table frame='none'> 81e9fcaa8aSmrg<title>XkbDescRec Component References</title> 82e9fcaa8aSmrg<tgroup cols='2'> 83e9fcaa8aSmrg<colspec colsep='0'/> 84e9fcaa8aSmrg<colspec colsep='0'/> 85e9fcaa8aSmrg<thead> 86e9fcaa8aSmrg<row rowsep='0'> 87e9fcaa8aSmrg <entry>XkbDescRec Field</entry> 88e9fcaa8aSmrg <entry>For more info</entry> 89e9fcaa8aSmrg</row> 90e9fcaa8aSmrg</thead> 91e9fcaa8aSmrg<tbody> 92e9fcaa8aSmrg<row rowsep='0'> 93e9fcaa8aSmrg <entry>ctrls</entry> 94e9fcaa8aSmrg <entry>Chapter 10</entry> 95e9fcaa8aSmrg</row> 96e9fcaa8aSmrg<row rowsep='0'> 97e9fcaa8aSmrg <entry>server</entry> 98e9fcaa8aSmrg <entry>Chapter 16</entry> 99e9fcaa8aSmrg</row> 100e9fcaa8aSmrg<row rowsep='0'> 101e9fcaa8aSmrg <entry>map</entry> 102e9fcaa8aSmrg <entry>Chapter 15</entry> 103e9fcaa8aSmrg</row> 104e9fcaa8aSmrg<row rowsep='0'> 105e9fcaa8aSmrg <entry>indicators</entry> 106e9fcaa8aSmrg <entry>Chapter 8</entry> 107e9fcaa8aSmrg</row> 108e9fcaa8aSmrg<row rowsep='0'> 109e9fcaa8aSmrg <entry>names</entry> 110e9fcaa8aSmrg <entry>Chapter 18</entry> 111e9fcaa8aSmrg</row> 112e9fcaa8aSmrg<row rowsep='0'> 113e9fcaa8aSmrg <entry>compat</entry> 114e9fcaa8aSmrg <entry>Chapter 17</entry> 115e9fcaa8aSmrg</row> 116e9fcaa8aSmrg<row rowsep='0'> 117e9fcaa8aSmrg <entry>geom</entry> 118e9fcaa8aSmrg <entry>Chapter 13</entry> 119e9fcaa8aSmrg </row> 120e9fcaa8aSmrg</tbody> 121e9fcaa8aSmrg</tgroup> 122e9fcaa8aSmrg</table> 123e9fcaa8aSmrg 124e9fcaa8aSmrg<para> 125e9fcaa8aSmrgEach structure component has a corresponding mask bit that is used in function 126e9fcaa8aSmrgcalls to indicate that the structure should be manipulated in some manner, such 127e9fcaa8aSmrgas allocating it or freeing it. These masks and their relationships to the 128e9fcaa8aSmrgfields in the <emphasis> 129e9fcaa8aSmrgXkbDescRec</emphasis> 130e9fcaa8aSmrg are shown in Table 6.2. <!-- xref --> 131e9fcaa8aSmrg</para> 132e9fcaa8aSmrg 133e9fcaa8aSmrg<table frame='none'> 134e9fcaa8aSmrg<title>Mask Bits for XkbDescRec</title> 135e9fcaa8aSmrg<tgroup cols='3'> 136e9fcaa8aSmrg<colspec colsep='0'/> 137e9fcaa8aSmrg<colspec colsep='0'/> 138e9fcaa8aSmrg<colspec colsep='0'/> 139e9fcaa8aSmrg<thead> 140e9fcaa8aSmrg<row rowsep='0'> 141e9fcaa8aSmrg <entry>Mask Bit</entry> 142e9fcaa8aSmrg <entry>XkbDescRec Field</entry> 143e9fcaa8aSmrg <entry>Value</entry> 144e9fcaa8aSmrg</row> 145e9fcaa8aSmrg</thead> 146e9fcaa8aSmrg<tbody> 147e9fcaa8aSmrg<row rowsep='0'> 148e9fcaa8aSmrg <entry>XkbControlsMask</entry> 149e9fcaa8aSmrg <entry>ctrls</entry> 150e9fcaa8aSmrg <entry>(1L<<0)</entry> 151e9fcaa8aSmrg</row> 152e9fcaa8aSmrg<row rowsep='0'> 153e9fcaa8aSmrg <entry>XkbServerMapMask</entry> 154e9fcaa8aSmrg <entry>server</entry> 155e9fcaa8aSmrg <entry>(1L<<1)</entry> 156e9fcaa8aSmrg</row> 157e9fcaa8aSmrg<row rowsep='0'> 158e9fcaa8aSmrg <entry>XkbIClientMapMask</entry> 159e9fcaa8aSmrg <entry>map</entry> 160e9fcaa8aSmrg <entry>(1L<<2)</entry> 161e9fcaa8aSmrg</row> 162e9fcaa8aSmrg<row rowsep='0'> 163e9fcaa8aSmrg <entry>XkbIndicatorMapMask</entry> 164e9fcaa8aSmrg <entry>indicators</entry> 165e9fcaa8aSmrg <entry>(1L<<3)</entry> 166e9fcaa8aSmrg</row> 167e9fcaa8aSmrg<row rowsep='0'> 168e9fcaa8aSmrg <entry>XkbNamesMask</entry> 169e9fcaa8aSmrg <entry>names</entry> 170e9fcaa8aSmrg <entry>(1L<<4)</entry> 171e9fcaa8aSmrg</row> 172e9fcaa8aSmrg<row rowsep='0'> 173e9fcaa8aSmrg <entry>XkbCompatMapMask</entry> 174e9fcaa8aSmrg <entry>compat</entry> 175e9fcaa8aSmrg <entry>(1L<<5)</entry> 176e9fcaa8aSmrg</row> 177e9fcaa8aSmrg<row rowsep='0'> 178e9fcaa8aSmrg <entry>XkbGeometryMask</entry> 179e9fcaa8aSmrg <entry>geom</entry> 180e9fcaa8aSmrg <entry>(1L<<6)</entry> 181e9fcaa8aSmrg</row> 182e9fcaa8aSmrg<row rowsep='0'> 183e9fcaa8aSmrg <entry>XkbAllComponentsMask</entry> 184e9fcaa8aSmrg <entry>All Fields</entry> 185e9fcaa8aSmrg <entry>(0x7f)</entry> 186e9fcaa8aSmrg </row> 187e9fcaa8aSmrg</tbody> 188e9fcaa8aSmrg</tgroup> 189e9fcaa8aSmrg</table> 190e9fcaa8aSmrg 191e9fcaa8aSmrg</sect1> 192e9fcaa8aSmrg<sect1 id='obtaining_a_keyboard_description_from_the_server'> 193e9fcaa8aSmrg<title>Obtaining a Keyboard Description from the Server</title> 194e9fcaa8aSmrg 195e9fcaa8aSmrg<para> 196e9fcaa8aSmrgTo retrieve one or more components of a keyboard device description, use 197e9fcaa8aSmrg<emphasis> 198e9fcaa8aSmrgXkbGetKeyboard</emphasis> 199e9fcaa8aSmrg (see also <emphasis> 200e9fcaa8aSmrgXkbGetKeyboardbyName</emphasis> 201e9fcaa8aSmrg). 202e9fcaa8aSmrg</para> 203e9fcaa8aSmrg 204e9fcaa8aSmrg<informaltable frame='none'> 205e9fcaa8aSmrg<tgroup cols='1'> 206e9fcaa8aSmrg<colspec colsep='0'/> 207e9fcaa8aSmrg<tbody> 208e9fcaa8aSmrg <row rowsep='0'> 209e9fcaa8aSmrg <entry role='functiondecl'> 210e9fcaa8aSmrgXkbDescPtr <emphasis> 211e9fcaa8aSmrgXkbGetKeyboard</emphasis> 212e9fcaa8aSmrg(<emphasis> 213e9fcaa8aSmrgdisplay, which, device_spec</emphasis> 214e9fcaa8aSmrg) 215e9fcaa8aSmrg </entry> 216e9fcaa8aSmrg </row> 217e9fcaa8aSmrg <row rowsep='0'> 218e9fcaa8aSmrg <entry role='functionargdecl'> 219e9fcaa8aSmrgDisplay * <emphasis> 220e9fcaa8aSmrg display</emphasis> 221e9fcaa8aSmrg; /* connection to X server */ 222e9fcaa8aSmrg </entry> 223e9fcaa8aSmrg </row> 224e9fcaa8aSmrg <row rowsep='0'> 225e9fcaa8aSmrg <entry role='functionargdecl'> 226e9fcaa8aSmrgunsigned int <emphasis> 227e9fcaa8aSmrgwhich</emphasis> 228e9fcaa8aSmrg; /* mask indicating components to return */ 229e9fcaa8aSmrg </entry> 230e9fcaa8aSmrg </row> 231e9fcaa8aSmrg <row rowsep='0'> 232e9fcaa8aSmrg <entry role='functionargdecl'> 233e9fcaa8aSmrgunsigned int<emphasis> 234e9fcaa8aSmrg device_spec</emphasis> 235e9fcaa8aSmrg; /* device for which to fetch description, or <emphasis> 236e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 237e9fcaa8aSmrg */ 238e9fcaa8aSmrg </entry> 239e9fcaa8aSmrg</row> 240e9fcaa8aSmrg</tbody> 241e9fcaa8aSmrg</tgroup> 242e9fcaa8aSmrg</informaltable> 243e9fcaa8aSmrg 244e9fcaa8aSmrg<para> 245e9fcaa8aSmrg<emphasis> 246e9fcaa8aSmrgXkbGetKeyboard </emphasis> 247e9fcaa8aSmrgallocates and returns a pointer to a keyboard description. It queries the 248e9fcaa8aSmrgserver for those components specified in the <emphasis> 249e9fcaa8aSmrgwhich</emphasis> 250e9fcaa8aSmrg parameter for device <emphasis> 251e9fcaa8aSmrgdevice_spec</emphasis> 252e9fcaa8aSmrg and copies the results to the <emphasis> 253e9fcaa8aSmrgXkbDescRec</emphasis> 254e9fcaa8aSmrg it allocated. The remaining fields in the keyboard description are set to 255e9fcaa8aSmrg<emphasis> 256e9fcaa8aSmrgNULL</emphasis> 257e9fcaa8aSmrg. The valid masks for <emphasis> 258e9fcaa8aSmrgwhich</emphasis> 259e9fcaa8aSmrg are those listed in Table 6.2. <!-- xref --> 260e9fcaa8aSmrg</para> 261e9fcaa8aSmrg 262e9fcaa8aSmrg 263e9fcaa8aSmrg<para> 264e9fcaa8aSmrg<emphasis> 265e9fcaa8aSmrgXkbGetKeyboard</emphasis> 266e9fcaa8aSmrg can generate <emphasis> 267e9fcaa8aSmrgBadAlloc</emphasis> 268e9fcaa8aSmrg protocol errors. 269e9fcaa8aSmrg</para> 270e9fcaa8aSmrg 271e9fcaa8aSmrg 272e9fcaa8aSmrg<para> 273e9fcaa8aSmrgTo free the returned keyboard description, use <emphasis> 274e9fcaa8aSmrgXkbFreeKeyboard</emphasis> 275e9fcaa8aSmrg (see section 6.4). <!-- xref --> 276e9fcaa8aSmrg</para> 277e9fcaa8aSmrg 278e9fcaa8aSmrg 279e9fcaa8aSmrg</sect1> 280e9fcaa8aSmrg<sect1 id='tracking_changes_to_the_keyboard_description_in_the_server'> 281e9fcaa8aSmrg<title>Tracking Changes to the Keyboard Description in the Server</title> 282e9fcaa8aSmrg 283e9fcaa8aSmrg<para> 284e9fcaa8aSmrgThe server can generate events whenever its copy of the keyboard description 285e9fcaa8aSmrgfor a device changes. Refer to section 14.4 for detailed information on <!-- xref --> 286e9fcaa8aSmrgtracking changes to the keyboard description. 287e9fcaa8aSmrg</para> 288e9fcaa8aSmrg 289e9fcaa8aSmrg 290e9fcaa8aSmrg</sect1> 291e9fcaa8aSmrg<sect1 id='allocating_and_freeing_a_keyboard_description'> 292e9fcaa8aSmrg<title>Allocating and Freeing a Keyboard Description</title> 293e9fcaa8aSmrg 294e9fcaa8aSmrg<para> 295e9fcaa8aSmrgApplications seldom need to directly allocate a keyboard description; calling 296e9fcaa8aSmrg<emphasis> 297e9fcaa8aSmrgXkbGetKeyboard</emphasis> 298e9fcaa8aSmrg usually suffices. In the event you need to create a keyboard description from 299e9fcaa8aSmrgscratch, however, use <emphasis> 300e9fcaa8aSmrgXkbAllocKeyboard</emphasis> 301e9fcaa8aSmrg rather than directly calling <emphasis> 302e9fcaa8aSmrgmalloc </emphasis> 303e9fcaa8aSmrgor <emphasis> 304e9fcaa8aSmrgXmalloc</emphasis> 305e9fcaa8aSmrg. 306e9fcaa8aSmrg</para> 307e9fcaa8aSmrg 308e9fcaa8aSmrg<informaltable frame='none'> 309e9fcaa8aSmrg<tgroup cols='1'> 310e9fcaa8aSmrg<colspec colsep='0'/> 311e9fcaa8aSmrg<tbody> 312e9fcaa8aSmrg <row rowsep='0'> 313e9fcaa8aSmrg <entry role='functiondecl'> 314e9fcaa8aSmrgXkbDescRec * <emphasis> 315e9fcaa8aSmrgXkbAllocKeyboard</emphasis> 316e9fcaa8aSmrg(void) 317e9fcaa8aSmrg </entry> 318e9fcaa8aSmrg </row> 319e9fcaa8aSmrg</tbody> 320e9fcaa8aSmrg</tgroup> 321e9fcaa8aSmrg</informaltable> 322e9fcaa8aSmrg 323e9fcaa8aSmrg<para> 324e9fcaa8aSmrgIf <emphasis> 325e9fcaa8aSmrgXkbAllocKeyboard</emphasis> 326e9fcaa8aSmrg fails to allocate the keyboard description, it returns <emphasis> 327e9fcaa8aSmrgNULL</emphasis> 328e9fcaa8aSmrg. Otherwise, it returns a pointer to an empty keyboard description structure. 329e9fcaa8aSmrgThe <emphasis> 330e9fcaa8aSmrgdevice_spec</emphasis> 331e9fcaa8aSmrg field will have been initialized to <emphasis> 332e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 333e9fcaa8aSmrg. You may then either fill in the structure components or use Xkb functions to 334e9fcaa8aSmrgobtain values for the structure components from a keyboard device. 335e9fcaa8aSmrg</para> 336e9fcaa8aSmrg 337e9fcaa8aSmrg 338e9fcaa8aSmrg<para> 339e9fcaa8aSmrgTo destroy either an entire an <emphasis> 340e9fcaa8aSmrgXkbDescRec</emphasis> 341e9fcaa8aSmrg or just some of its members, use <emphasis> 342e9fcaa8aSmrgXkbFreeKeyboard.</emphasis> 343e9fcaa8aSmrg</para> 344e9fcaa8aSmrg 345e9fcaa8aSmrg 346e9fcaa8aSmrg<informaltable frame='none'> 347e9fcaa8aSmrg<tgroup cols='1'> 348e9fcaa8aSmrg<colspec colsep='0'/> 349e9fcaa8aSmrg<tbody> 350e9fcaa8aSmrg <row rowsep='0'> 351e9fcaa8aSmrg <entry role='functiondecl'> 352e9fcaa8aSmrgvoid <emphasis> 353e9fcaa8aSmrgXkbFreeKeyboard</emphasis> 354e9fcaa8aSmrg<emphasis> 355e9fcaa8aSmrg(xkb, which, free_all</emphasis> 356e9fcaa8aSmrg) 357e9fcaa8aSmrg </entry> 358e9fcaa8aSmrg </row> 359e9fcaa8aSmrg <row rowsep='0'> 360e9fcaa8aSmrg <entry role='functionargdecl'> 361e9fcaa8aSmrgXkbDescPtr <emphasis> 362e9fcaa8aSmrg xkb</emphasis> 363e9fcaa8aSmrg; /* keyboard description with components to free */ 364e9fcaa8aSmrg </entry> 365e9fcaa8aSmrg </row> 366e9fcaa8aSmrg <row rowsep='0'> 367e9fcaa8aSmrg <entry role='functionargdecl'> 368e9fcaa8aSmrgunsigned int <emphasis> 369e9fcaa8aSmrg which</emphasis> 370e9fcaa8aSmrg; /* mask selecting components to free */ 371e9fcaa8aSmrg </entry> 372e9fcaa8aSmrg </row> 373e9fcaa8aSmrg <row rowsep='0'> 374e9fcaa8aSmrg <entry role='functionargdecl'> 375e9fcaa8aSmrgBool <emphasis> 376e9fcaa8aSmrg free_all</emphasis> 377e9fcaa8aSmrg; /* <emphasis> 378e9fcaa8aSmrgTrue</emphasis> 379e9fcaa8aSmrg => free all components and <emphasis> 380e9fcaa8aSmrgxkb</emphasis> 381e9fcaa8aSmrg */ 382e9fcaa8aSmrg </entry> 383e9fcaa8aSmrg</row> 384e9fcaa8aSmrg</tbody> 385e9fcaa8aSmrg</tgroup> 386e9fcaa8aSmrg</informaltable> 387e9fcaa8aSmrg 388e9fcaa8aSmrg<para> 389e9fcaa8aSmrg<emphasis> 390e9fcaa8aSmrgXkbFreeKeyboard</emphasis> 391e9fcaa8aSmrg frees the components of <emphasis> 392e9fcaa8aSmrgxkb</emphasis> 393e9fcaa8aSmrg specified by <emphasis> 394e9fcaa8aSmrgwhich</emphasis> 395e9fcaa8aSmrg and sets the corresponding values to <emphasis> 396e9fcaa8aSmrgNULL</emphasis> 397e9fcaa8aSmrg. If <emphasis> 398e9fcaa8aSmrgfree_all</emphasis> 399e9fcaa8aSmrg is <emphasis> 400e9fcaa8aSmrgTrue</emphasis> 401e9fcaa8aSmrg, <emphasis> 402e9fcaa8aSmrgXkbFreeKeyboard</emphasis> 403e9fcaa8aSmrg frees every non-<emphasis> 404e9fcaa8aSmrgNULL</emphasis> 405e9fcaa8aSmrg component of <emphasis> 406e9fcaa8aSmrgxkb</emphasis> 407e9fcaa8aSmrg and then frees the <emphasis> 408e9fcaa8aSmrgxkb</emphasis> 409e9fcaa8aSmrg structure itself. 410e9fcaa8aSmrg</para> 411e9fcaa8aSmrg 412e9fcaa8aSmrg</sect1> 413e9fcaa8aSmrg</chapter> 414