ch06.xml revision eb411b4b
1eb411b4bSmrg<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 11eb411b4bSmrg<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 80eb411b4bSmrg<table frame='topbot'> 81e9fcaa8aSmrg<title>XkbDescRec Component References</title> 82eb411b4bSmrg<?dbfo keep-together="always" ?> 83eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 84eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 85eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/> 86e9fcaa8aSmrg<thead> 87eb411b4bSmrg<row rowsep='1'> 88e9fcaa8aSmrg <entry>XkbDescRec Field</entry> 89e9fcaa8aSmrg <entry>For more info</entry> 90e9fcaa8aSmrg</row> 91e9fcaa8aSmrg</thead> 92e9fcaa8aSmrg<tbody> 93eb411b4bSmrg<row> 94e9fcaa8aSmrg <entry>ctrls</entry> 95e9fcaa8aSmrg <entry>Chapter 10</entry> 96e9fcaa8aSmrg</row> 97eb411b4bSmrg<row> 98e9fcaa8aSmrg <entry>server</entry> 99e9fcaa8aSmrg <entry>Chapter 16</entry> 100e9fcaa8aSmrg</row> 101eb411b4bSmrg<row> 102e9fcaa8aSmrg <entry>map</entry> 103e9fcaa8aSmrg <entry>Chapter 15</entry> 104e9fcaa8aSmrg</row> 105eb411b4bSmrg<row> 106e9fcaa8aSmrg <entry>indicators</entry> 107e9fcaa8aSmrg <entry>Chapter 8</entry> 108e9fcaa8aSmrg</row> 109eb411b4bSmrg<row> 110e9fcaa8aSmrg <entry>names</entry> 111e9fcaa8aSmrg <entry>Chapter 18</entry> 112e9fcaa8aSmrg</row> 113eb411b4bSmrg<row> 114e9fcaa8aSmrg <entry>compat</entry> 115e9fcaa8aSmrg <entry>Chapter 17</entry> 116e9fcaa8aSmrg</row> 117eb411b4bSmrg<row> 118e9fcaa8aSmrg <entry>geom</entry> 119e9fcaa8aSmrg <entry>Chapter 13</entry> 120e9fcaa8aSmrg </row> 121e9fcaa8aSmrg</tbody> 122e9fcaa8aSmrg</tgroup> 123e9fcaa8aSmrg</table> 124e9fcaa8aSmrg 125e9fcaa8aSmrg<para> 126e9fcaa8aSmrgEach structure component has a corresponding mask bit that is used in function 127e9fcaa8aSmrgcalls to indicate that the structure should be manipulated in some manner, such 128e9fcaa8aSmrgas allocating it or freeing it. These masks and their relationships to the 129e9fcaa8aSmrgfields in the <emphasis> 130e9fcaa8aSmrgXkbDescRec</emphasis> 131e9fcaa8aSmrg are shown in Table 6.2. <!-- xref --> 132e9fcaa8aSmrg</para> 133e9fcaa8aSmrg 134eb411b4bSmrg<table frame='topbot'> 135e9fcaa8aSmrg<title>Mask Bits for XkbDescRec</title> 136eb411b4bSmrg<?dbfo keep-together="always" ?> 137eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'> 138eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 139eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 140eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/> 141e9fcaa8aSmrg<thead> 142eb411b4bSmrg<row rowsep='1'> 143e9fcaa8aSmrg <entry>Mask Bit</entry> 144e9fcaa8aSmrg <entry>XkbDescRec Field</entry> 145e9fcaa8aSmrg <entry>Value</entry> 146e9fcaa8aSmrg</row> 147e9fcaa8aSmrg</thead> 148e9fcaa8aSmrg<tbody> 149eb411b4bSmrg<row> 150e9fcaa8aSmrg <entry>XkbControlsMask</entry> 151e9fcaa8aSmrg <entry>ctrls</entry> 152e9fcaa8aSmrg <entry>(1L<<0)</entry> 153e9fcaa8aSmrg</row> 154eb411b4bSmrg<row> 155e9fcaa8aSmrg <entry>XkbServerMapMask</entry> 156e9fcaa8aSmrg <entry>server</entry> 157e9fcaa8aSmrg <entry>(1L<<1)</entry> 158e9fcaa8aSmrg</row> 159eb411b4bSmrg<row> 160e9fcaa8aSmrg <entry>XkbIClientMapMask</entry> 161e9fcaa8aSmrg <entry>map</entry> 162e9fcaa8aSmrg <entry>(1L<<2)</entry> 163e9fcaa8aSmrg</row> 164eb411b4bSmrg<row> 165e9fcaa8aSmrg <entry>XkbIndicatorMapMask</entry> 166e9fcaa8aSmrg <entry>indicators</entry> 167e9fcaa8aSmrg <entry>(1L<<3)</entry> 168e9fcaa8aSmrg</row> 169eb411b4bSmrg<row> 170e9fcaa8aSmrg <entry>XkbNamesMask</entry> 171e9fcaa8aSmrg <entry>names</entry> 172e9fcaa8aSmrg <entry>(1L<<4)</entry> 173e9fcaa8aSmrg</row> 174eb411b4bSmrg<row> 175e9fcaa8aSmrg <entry>XkbCompatMapMask</entry> 176e9fcaa8aSmrg <entry>compat</entry> 177e9fcaa8aSmrg <entry>(1L<<5)</entry> 178e9fcaa8aSmrg</row> 179eb411b4bSmrg<row> 180e9fcaa8aSmrg <entry>XkbGeometryMask</entry> 181e9fcaa8aSmrg <entry>geom</entry> 182e9fcaa8aSmrg <entry>(1L<<6)</entry> 183e9fcaa8aSmrg</row> 184eb411b4bSmrg<row> 185e9fcaa8aSmrg <entry>XkbAllComponentsMask</entry> 186e9fcaa8aSmrg <entry>All Fields</entry> 187e9fcaa8aSmrg <entry>(0x7f)</entry> 188e9fcaa8aSmrg </row> 189e9fcaa8aSmrg</tbody> 190e9fcaa8aSmrg</tgroup> 191e9fcaa8aSmrg</table> 192e9fcaa8aSmrg 193e9fcaa8aSmrg</sect1> 194eb411b4bSmrg<sect1 id='Obtaining_a_Keyboard_Description_from_the_Server'> 195e9fcaa8aSmrg<title>Obtaining a Keyboard Description from the Server</title> 196e9fcaa8aSmrg 197e9fcaa8aSmrg<para> 198e9fcaa8aSmrgTo retrieve one or more components of a keyboard device description, use 199e9fcaa8aSmrg<emphasis> 200e9fcaa8aSmrgXkbGetKeyboard</emphasis> 201e9fcaa8aSmrg (see also <emphasis> 202e9fcaa8aSmrgXkbGetKeyboardbyName</emphasis> 203e9fcaa8aSmrg). 204e9fcaa8aSmrg</para> 205e9fcaa8aSmrg 206e9fcaa8aSmrg<informaltable frame='none'> 207eb411b4bSmrg<?dbfo keep-together="always" ?> 208eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 209eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 210e9fcaa8aSmrg<tbody> 211eb411b4bSmrg <row> 212e9fcaa8aSmrg <entry role='functiondecl'> 213e9fcaa8aSmrgXkbDescPtr <emphasis> 214e9fcaa8aSmrgXkbGetKeyboard</emphasis> 215e9fcaa8aSmrg(<emphasis> 216e9fcaa8aSmrgdisplay, which, device_spec</emphasis> 217e9fcaa8aSmrg) 218e9fcaa8aSmrg </entry> 219e9fcaa8aSmrg </row> 220eb411b4bSmrg <row> 221e9fcaa8aSmrg <entry role='functionargdecl'> 222e9fcaa8aSmrgDisplay * <emphasis> 223e9fcaa8aSmrg display</emphasis> 224e9fcaa8aSmrg; /* connection to X server */ 225e9fcaa8aSmrg </entry> 226e9fcaa8aSmrg </row> 227eb411b4bSmrg <row> 228e9fcaa8aSmrg <entry role='functionargdecl'> 229e9fcaa8aSmrgunsigned int <emphasis> 230e9fcaa8aSmrgwhich</emphasis> 231e9fcaa8aSmrg; /* mask indicating components to return */ 232e9fcaa8aSmrg </entry> 233e9fcaa8aSmrg </row> 234eb411b4bSmrg <row> 235e9fcaa8aSmrg <entry role='functionargdecl'> 236e9fcaa8aSmrgunsigned int<emphasis> 237e9fcaa8aSmrg device_spec</emphasis> 238e9fcaa8aSmrg; /* device for which to fetch description, or <emphasis> 239e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 240e9fcaa8aSmrg */ 241e9fcaa8aSmrg </entry> 242e9fcaa8aSmrg</row> 243e9fcaa8aSmrg</tbody> 244e9fcaa8aSmrg</tgroup> 245e9fcaa8aSmrg</informaltable> 246e9fcaa8aSmrg 247e9fcaa8aSmrg<para> 248e9fcaa8aSmrg<emphasis> 249e9fcaa8aSmrgXkbGetKeyboard </emphasis> 250e9fcaa8aSmrgallocates and returns a pointer to a keyboard description. It queries the 251e9fcaa8aSmrgserver for those components specified in the <emphasis> 252e9fcaa8aSmrgwhich</emphasis> 253e9fcaa8aSmrg parameter for device <emphasis> 254e9fcaa8aSmrgdevice_spec</emphasis> 255e9fcaa8aSmrg and copies the results to the <emphasis> 256e9fcaa8aSmrgXkbDescRec</emphasis> 257e9fcaa8aSmrg it allocated. The remaining fields in the keyboard description are set to 258e9fcaa8aSmrg<emphasis> 259e9fcaa8aSmrgNULL</emphasis> 260e9fcaa8aSmrg. The valid masks for <emphasis> 261e9fcaa8aSmrgwhich</emphasis> 262e9fcaa8aSmrg are those listed in Table 6.2. <!-- xref --> 263e9fcaa8aSmrg</para> 264e9fcaa8aSmrg 265e9fcaa8aSmrg 266e9fcaa8aSmrg<para> 267e9fcaa8aSmrg<emphasis> 268e9fcaa8aSmrgXkbGetKeyboard</emphasis> 269e9fcaa8aSmrg can generate <emphasis> 270e9fcaa8aSmrgBadAlloc</emphasis> 271e9fcaa8aSmrg protocol errors. 272e9fcaa8aSmrg</para> 273e9fcaa8aSmrg 274e9fcaa8aSmrg 275e9fcaa8aSmrg<para> 276e9fcaa8aSmrgTo free the returned keyboard description, use <emphasis> 277e9fcaa8aSmrgXkbFreeKeyboard</emphasis> 278e9fcaa8aSmrg (see section 6.4). <!-- xref --> 279e9fcaa8aSmrg</para> 280e9fcaa8aSmrg 281e9fcaa8aSmrg 282e9fcaa8aSmrg</sect1> 283eb411b4bSmrg<sect1 id='Tracking_Changes_to_the_Keyboard_Description_in_the_Server'> 284e9fcaa8aSmrg<title>Tracking Changes to the Keyboard Description in the Server</title> 285e9fcaa8aSmrg 286e9fcaa8aSmrg<para> 287e9fcaa8aSmrgThe server can generate events whenever its copy of the keyboard description 288e9fcaa8aSmrgfor a device changes. Refer to section 14.4 for detailed information on <!-- xref --> 289e9fcaa8aSmrgtracking changes to the keyboard description. 290e9fcaa8aSmrg</para> 291e9fcaa8aSmrg 292e9fcaa8aSmrg 293e9fcaa8aSmrg</sect1> 294eb411b4bSmrg<sect1 id='Allocating_and_Freeing_a_Keyboard_Description'> 295e9fcaa8aSmrg<title>Allocating and Freeing a Keyboard Description</title> 296e9fcaa8aSmrg 297e9fcaa8aSmrg<para> 298e9fcaa8aSmrgApplications seldom need to directly allocate a keyboard description; calling 299e9fcaa8aSmrg<emphasis> 300e9fcaa8aSmrgXkbGetKeyboard</emphasis> 301e9fcaa8aSmrg usually suffices. In the event you need to create a keyboard description from 302e9fcaa8aSmrgscratch, however, use <emphasis> 303e9fcaa8aSmrgXkbAllocKeyboard</emphasis> 304e9fcaa8aSmrg rather than directly calling <emphasis> 305e9fcaa8aSmrgmalloc </emphasis> 306e9fcaa8aSmrgor <emphasis> 307e9fcaa8aSmrgXmalloc</emphasis> 308e9fcaa8aSmrg. 309e9fcaa8aSmrg</para> 310e9fcaa8aSmrg 311e9fcaa8aSmrg<informaltable frame='none'> 312eb411b4bSmrg<?dbfo keep-together="always" ?> 313eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 314eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 315e9fcaa8aSmrg<tbody> 316eb411b4bSmrg <row> 317e9fcaa8aSmrg <entry role='functiondecl'> 318e9fcaa8aSmrgXkbDescRec * <emphasis> 319e9fcaa8aSmrgXkbAllocKeyboard</emphasis> 320e9fcaa8aSmrg(void) 321e9fcaa8aSmrg </entry> 322e9fcaa8aSmrg </row> 323e9fcaa8aSmrg</tbody> 324e9fcaa8aSmrg</tgroup> 325e9fcaa8aSmrg</informaltable> 326e9fcaa8aSmrg 327e9fcaa8aSmrg<para> 328e9fcaa8aSmrgIf <emphasis> 329e9fcaa8aSmrgXkbAllocKeyboard</emphasis> 330e9fcaa8aSmrg fails to allocate the keyboard description, it returns <emphasis> 331e9fcaa8aSmrgNULL</emphasis> 332e9fcaa8aSmrg. Otherwise, it returns a pointer to an empty keyboard description structure. 333e9fcaa8aSmrgThe <emphasis> 334e9fcaa8aSmrgdevice_spec</emphasis> 335e9fcaa8aSmrg field will have been initialized to <emphasis> 336e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 337e9fcaa8aSmrg. You may then either fill in the structure components or use Xkb functions to 338e9fcaa8aSmrgobtain values for the structure components from a keyboard device. 339e9fcaa8aSmrg</para> 340e9fcaa8aSmrg 341e9fcaa8aSmrg 342e9fcaa8aSmrg<para> 343e9fcaa8aSmrgTo destroy either an entire an <emphasis> 344e9fcaa8aSmrgXkbDescRec</emphasis> 345e9fcaa8aSmrg or just some of its members, use <emphasis> 346e9fcaa8aSmrgXkbFreeKeyboard.</emphasis> 347e9fcaa8aSmrg</para> 348e9fcaa8aSmrg 349e9fcaa8aSmrg 350e9fcaa8aSmrg<informaltable frame='none'> 351eb411b4bSmrg<?dbfo keep-together="always" ?> 352eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 353eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 354e9fcaa8aSmrg<tbody> 355eb411b4bSmrg <row> 356e9fcaa8aSmrg <entry role='functiondecl'> 357e9fcaa8aSmrgvoid <emphasis> 358e9fcaa8aSmrgXkbFreeKeyboard</emphasis> 359e9fcaa8aSmrg<emphasis> 360e9fcaa8aSmrg(xkb, which, free_all</emphasis> 361e9fcaa8aSmrg) 362e9fcaa8aSmrg </entry> 363e9fcaa8aSmrg </row> 364eb411b4bSmrg <row> 365e9fcaa8aSmrg <entry role='functionargdecl'> 366e9fcaa8aSmrgXkbDescPtr <emphasis> 367e9fcaa8aSmrg xkb</emphasis> 368e9fcaa8aSmrg; /* keyboard description with components to free */ 369e9fcaa8aSmrg </entry> 370e9fcaa8aSmrg </row> 371eb411b4bSmrg <row> 372e9fcaa8aSmrg <entry role='functionargdecl'> 373e9fcaa8aSmrgunsigned int <emphasis> 374e9fcaa8aSmrg which</emphasis> 375e9fcaa8aSmrg; /* mask selecting components to free */ 376e9fcaa8aSmrg </entry> 377e9fcaa8aSmrg </row> 378eb411b4bSmrg <row> 379e9fcaa8aSmrg <entry role='functionargdecl'> 380e9fcaa8aSmrgBool <emphasis> 381e9fcaa8aSmrg free_all</emphasis> 382e9fcaa8aSmrg; /* <emphasis> 383e9fcaa8aSmrgTrue</emphasis> 384e9fcaa8aSmrg => free all components and <emphasis> 385e9fcaa8aSmrgxkb</emphasis> 386e9fcaa8aSmrg */ 387e9fcaa8aSmrg </entry> 388e9fcaa8aSmrg</row> 389e9fcaa8aSmrg</tbody> 390e9fcaa8aSmrg</tgroup> 391e9fcaa8aSmrg</informaltable> 392e9fcaa8aSmrg 393e9fcaa8aSmrg<para> 394e9fcaa8aSmrg<emphasis> 395e9fcaa8aSmrgXkbFreeKeyboard</emphasis> 396e9fcaa8aSmrg frees the components of <emphasis> 397e9fcaa8aSmrgxkb</emphasis> 398e9fcaa8aSmrg specified by <emphasis> 399e9fcaa8aSmrgwhich</emphasis> 400e9fcaa8aSmrg and sets the corresponding values to <emphasis> 401e9fcaa8aSmrgNULL</emphasis> 402e9fcaa8aSmrg. If <emphasis> 403e9fcaa8aSmrgfree_all</emphasis> 404e9fcaa8aSmrg is <emphasis> 405e9fcaa8aSmrgTrue</emphasis> 406e9fcaa8aSmrg, <emphasis> 407e9fcaa8aSmrgXkbFreeKeyboard</emphasis> 408e9fcaa8aSmrg frees every non-<emphasis> 409e9fcaa8aSmrgNULL</emphasis> 410e9fcaa8aSmrg component of <emphasis> 411e9fcaa8aSmrgxkb</emphasis> 412e9fcaa8aSmrg and then frees the <emphasis> 413e9fcaa8aSmrgxkb</emphasis> 414e9fcaa8aSmrg structure itself. 415e9fcaa8aSmrg</para> 416e9fcaa8aSmrg 417e9fcaa8aSmrg</sect1> 418e9fcaa8aSmrg</chapter> 419