ch15.xml revision e9fcaa8a
1e9fcaa8aSmrg<chapter id='xkb_client_keyboard_mapping'> 2e9fcaa8aSmrg<title>Xkb Client Keyboard Mapping</title> 3e9fcaa8aSmrg 4e9fcaa8aSmrg<para> 5e9fcaa8aSmrgThe Xkb client map for a keyboard is the collection of information a client 6e9fcaa8aSmrgneeds to interpret key events from the keyboard. It contains a global list of 7e9fcaa8aSmrgkey types and an array of key symbol maps, each of which describes the symbols 8e9fcaa8aSmrgbound to a key and the rules to be used to interpret those symbols. 9e9fcaa8aSmrg</para> 10e9fcaa8aSmrg 11e9fcaa8aSmrg 12e9fcaa8aSmrg<para> 13e9fcaa8aSmrgFigure 15.1 shows the relationships between elements in the client map: 14e9fcaa8aSmrg</para> 15e9fcaa8aSmrg 16e9fcaa8aSmrg<mediaobject> 17e9fcaa8aSmrg <imageobject> <imagedata format="SVG" fileref="XKBlib-15.svg"/> 18e9fcaa8aSmrg </imageobject> 19e9fcaa8aSmrg<caption>Xkb Client Map</caption> 20e9fcaa8aSmrg </mediaobject> 21e9fcaa8aSmrg 22e9fcaa8aSmrg 23e9fcaa8aSmrg<!-- 24e9fcaa8aSmrg<H5 CLASS="Figure"> 25e9fcaa8aSmrgXkb Client Map</H5> 26e9fcaa8aSmrg--> 27e9fcaa8aSmrg 28e9fcaa8aSmrg<sect1 id='the_xkbclientmaprec_structure'> 29e9fcaa8aSmrg<title>The XkbClientMapRec Structure</title> 30e9fcaa8aSmrg 31e9fcaa8aSmrg<para> 32e9fcaa8aSmrgThe <emphasis> 33e9fcaa8aSmrgmap </emphasis> 34e9fcaa8aSmrgfield of the complete Xkb keyboard description (see section 6.1) is a pointer 35e9fcaa8aSmrgto the Xkb client map, which is of type <emphasis> 36e9fcaa8aSmrgXkbClientMapRec</emphasis> 37e9fcaa8aSmrg: 38e9fcaa8aSmrg</para> 39e9fcaa8aSmrg 40e9fcaa8aSmrg<para><programlisting> 41e9fcaa8aSmrgtypedef struct { /* Client Map */ 42e9fcaa8aSmrg unsigned char size_types; /* # occupied entries in <emphasis> types</emphasis> */ 43e9fcaa8aSmrg unsigned char num_types; /* # entries in <emphasis>types</emphasis> */ 44e9fcaa8aSmrg XkbKeyTypePtr types; /* vector of key types used by this keymap */ 45e9fcaa8aSmrg unsigned short size_syms; /* length of the <emphasis>syms</emphasis> array */ 46e9fcaa8aSmrg unsigned short num_syms; /* # entries in <emphasis>syms</emphasis> */ 47e9fcaa8aSmrg KeySym * syms; /* linear 2d tables of keysyms, 1 per key */ 48e9fcaa8aSmrg XkbSymMapPtr key_sym_map; /* 1 per keycode, maps keycode to <emphasis>syms</emphasis> */ 49e9fcaa8aSmrg unsigned char * modmap; /* 1 per keycode, real mods bound to key */ 50e9fcaa8aSmrg} <emphasis>XkbClientMapRec</emphasis>, *XkbClientMapPtr; 51e9fcaa8aSmrg</programlisting></para> 52e9fcaa8aSmrg 53e9fcaa8aSmrg<para> 54e9fcaa8aSmrgThe following sections describe each of the elements of the <emphasis> 55e9fcaa8aSmrgXkbClientMapRec</emphasis> 56e9fcaa8aSmrg structure in more detail. 57e9fcaa8aSmrg</para> 58e9fcaa8aSmrg 59e9fcaa8aSmrg 60e9fcaa8aSmrg</sect1> 61e9fcaa8aSmrg<sect1 id='key_types'> 62e9fcaa8aSmrg<title>Key Types</title> 63e9fcaa8aSmrg 64e9fcaa8aSmrg<para> 65e9fcaa8aSmrgKey types are used to determine the shift level of a key given the current 66e9fcaa8aSmrgstate of the keyboard. The set of all possible key types for the Xkb keyboard 67e9fcaa8aSmrgdescription are held in the <emphasis> 68e9fcaa8aSmrgtypes</emphasis> 69e9fcaa8aSmrg field of the client map, whose total size is stored in <emphasis> 70e9fcaa8aSmrgsize_types</emphasis> 71e9fcaa8aSmrg, and whose total number of valid entries is stored in <emphasis> 72e9fcaa8aSmrgnum_types</emphasis> 73e9fcaa8aSmrg. Key types are defined using the following structures: 74e9fcaa8aSmrg</para> 75e9fcaa8aSmrg 76e9fcaa8aSmrg<para><programlisting> 77e9fcaa8aSmrgtypedef struct { /* Key Type */ 78e9fcaa8aSmrg XkbModsRec mods; /* modifiers used to compute shift 79e9fcaa8aSmrg level */ 80e9fcaa8aSmrg unsigned char num_levels; /* total # shift levels, do not 81e9fcaa8aSmrg modify directly */ 82e9fcaa8aSmrg unsigned char map_count; /* # entries in <emphasis>map</emphasis>, 83e9fcaa8aSmrg <emphasis> preserve</emphasis> 84e9fcaa8aSmrg (if non-<emphasis> NULL</emphasis>) */ 85e9fcaa8aSmrg XkbKTMapEntryPtr map; /* vector of modifiers for each 86e9fcaa8aSmrg shift level */ 87e9fcaa8aSmrg XkbModsPtr preserve; /* mods to preserve for corresponding 88e9fcaa8aSmrg <emphasis>map</emphasis> entry */ 89e9fcaa8aSmrg Atom name; /* name of key type */ 90e9fcaa8aSmrg Atom * level_names; /* array of names of each shift level */ 91e9fcaa8aSmrg} <emphasis>XkbKeyTypeRec</emphasis>, *XkbKeyTypePtr; 92e9fcaa8aSmrg</programlisting></para> 93e9fcaa8aSmrg 94e9fcaa8aSmrg<para><programlisting> 95e9fcaa8aSmrgtypedef struct { /* Modifiers for a key type */ 96e9fcaa8aSmrg Bool active; /* <emphasis> True</emphasis> => entry 97e9fcaa8aSmrg active when determining shift level */ 98e9fcaa8aSmrg unsigned char level; /* shift level if modifiers match <emphasis> mods</emphasis> */ 99e9fcaa8aSmrg XkbModsRec mods; /* mods needed for this level to be 100e9fcaa8aSmrg selected */ 101e9fcaa8aSmrg} <emphasis>XkbKTMapEntryRec</emphasis>,*XkbKTMapEntryPtr; 102e9fcaa8aSmrg</programlisting></para> 103e9fcaa8aSmrg 104e9fcaa8aSmrg<para> 105e9fcaa8aSmrgThe <emphasis> 106e9fcaa8aSmrgmods</emphasis> 107e9fcaa8aSmrg field of a key type is an <emphasis> 108e9fcaa8aSmrgXkbModsRec</emphasis> 109e9fcaa8aSmrg (see section 7.2) specifying the modifiers the key type uses when calculating 110e9fcaa8aSmrgthe shift level, and can be composed of both the core modifiers and virtual 111e9fcaa8aSmrgmodifiers. To set the modifiers associated with a key type, modify the 112e9fcaa8aSmrg<emphasis> 113e9fcaa8aSmrgreal_mods</emphasis> 114e9fcaa8aSmrg and <emphasis> 115e9fcaa8aSmrgvmods</emphasis> 116e9fcaa8aSmrg fields of the <emphasis> 117e9fcaa8aSmrgmods</emphasis> 118e9fcaa8aSmrg <emphasis> 119e9fcaa8aSmrgXkbModsRec</emphasis> 120e9fcaa8aSmrg accordingly. The <emphasis> 121e9fcaa8aSmrgmask</emphasis> 122e9fcaa8aSmrg field of the <emphasis> 123e9fcaa8aSmrgXkbModsRec</emphasis> 124e9fcaa8aSmrg is reserved for use by Xkb and is calculated from the <emphasis> 125e9fcaa8aSmrgreal_mods</emphasis> 126e9fcaa8aSmrg and <emphasis> 127e9fcaa8aSmrgvmods</emphasis> 128e9fcaa8aSmrg fields. 129e9fcaa8aSmrg</para> 130e9fcaa8aSmrg 131e9fcaa8aSmrg 132e9fcaa8aSmrg<para> 133e9fcaa8aSmrgThe <emphasis> 134e9fcaa8aSmrgnum_levels</emphasis> 135e9fcaa8aSmrg field holds the total number of shift levels for the key type. Xkb uses 136e9fcaa8aSmrg<emphasis> 137e9fcaa8aSmrgnum_levels</emphasis> 138e9fcaa8aSmrg to ensure the array of symbols bound to a key is large enough. Do not modify 139e9fcaa8aSmrg<emphasis> 140e9fcaa8aSmrgnum_levels</emphasis> 141e9fcaa8aSmrg directly to change the number if shift levels for a key type. Instead, use 142e9fcaa8aSmrg<emphasis> 143e9fcaa8aSmrgXkbResizeKeyType</emphasis> 144e9fcaa8aSmrg (see section 15.2.3). 145e9fcaa8aSmrg</para> 146e9fcaa8aSmrg 147e9fcaa8aSmrg 148e9fcaa8aSmrg<para> 149e9fcaa8aSmrgThe <emphasis> 150e9fcaa8aSmrgmap</emphasis> 151e9fcaa8aSmrg field is a vector of <emphasis> 152e9fcaa8aSmrgXkbKTMapEntryRec</emphasis> 153e9fcaa8aSmrg structures, with <emphasis> 154e9fcaa8aSmrgmap_count</emphasis> 155e9fcaa8aSmrg entries, that specify the modifier combinations for each possible shift level. 156e9fcaa8aSmrgEach map entry contains an <emphasis> 157e9fcaa8aSmrgactive</emphasis> 158e9fcaa8aSmrg field, a <emphasis> 159e9fcaa8aSmrgmods</emphasis> 160e9fcaa8aSmrg field, and a <emphasis> 161e9fcaa8aSmrglevel</emphasis> 162e9fcaa8aSmrg field. The <emphasis> 163e9fcaa8aSmrgactive</emphasis> 164e9fcaa8aSmrg field determines whether the modifier combination listed in the <emphasis> 165e9fcaa8aSmrgmods</emphasis> 166e9fcaa8aSmrg field should be considered when determining shift level. If <emphasis> 167e9fcaa8aSmrgactive</emphasis> 168e9fcaa8aSmrg is <emphasis> 169e9fcaa8aSmrgFalse</emphasis> 170e9fcaa8aSmrg, this <emphasis> 171e9fcaa8aSmrgmap</emphasis> 172e9fcaa8aSmrg entry is ignored. If <emphasis> 173e9fcaa8aSmrgactive</emphasis> 174e9fcaa8aSmrg is <emphasis> 175e9fcaa8aSmrgTrue</emphasis> 176e9fcaa8aSmrg, the <emphasis> 177e9fcaa8aSmrglevel</emphasis> 178e9fcaa8aSmrg field of the <emphasis> 179e9fcaa8aSmrgmap </emphasis> 180e9fcaa8aSmrgentry specifies the shift level to use when the current modifier combination 181e9fcaa8aSmrgmatches the combination specified in the <emphasis> 182e9fcaa8aSmrgmods</emphasis> 183e9fcaa8aSmrg field of the <emphasis> 184e9fcaa8aSmrgmap</emphasis> 185e9fcaa8aSmrg entry. 186e9fcaa8aSmrg</para> 187e9fcaa8aSmrg 188e9fcaa8aSmrg 189e9fcaa8aSmrg<para> 190e9fcaa8aSmrgAny combination of modifiers not explicitly listed somewhere in the <emphasis> 191e9fcaa8aSmrgmap</emphasis> 192e9fcaa8aSmrg yields shift level one. In addition, <emphasis> 193e9fcaa8aSmrgmap</emphasis> 194e9fcaa8aSmrg entries specifying unbound virtual modifiers are not considered. 195e9fcaa8aSmrg</para> 196e9fcaa8aSmrg 197e9fcaa8aSmrg 198e9fcaa8aSmrg<para> 199e9fcaa8aSmrgAny modifiers specified in <emphasis> 200e9fcaa8aSmrgmods</emphasis> 201e9fcaa8aSmrg are normally <emphasis> 202e9fcaa8aSmrgconsumed</emphasis> 203e9fcaa8aSmrg by <emphasis> 204e9fcaa8aSmrgXkbTranslateKeyCode</emphasis> 205e9fcaa8aSmrg (see section 12.1.3). For those rare occasions a modifier <emphasis> 206e9fcaa8aSmrgshould</emphasis> 207e9fcaa8aSmrg be considered despite having been used to look up a symbol, key types include 208e9fcaa8aSmrgan optional <emphasis> 209e9fcaa8aSmrgpreserve</emphasis> 210e9fcaa8aSmrg field. If a <emphasis> 211e9fcaa8aSmrgpreserve</emphasis> 212e9fcaa8aSmrg member of a key type is not <emphasis> 213e9fcaa8aSmrgNULL</emphasis> 214e9fcaa8aSmrg, it represents a list of modifiers where each entry corresponds directly to 215e9fcaa8aSmrgone of the key type’s <emphasis> 216e9fcaa8aSmrgmap</emphasis> 217e9fcaa8aSmrg. Each entry lists the modifiers that should <emphasis> 218e9fcaa8aSmrgnot</emphasis> 219e9fcaa8aSmrg be consumed if the matching map entry is used to determine shift level. 220e9fcaa8aSmrg</para> 221e9fcaa8aSmrg 222e9fcaa8aSmrg 223e9fcaa8aSmrg<para> 224e9fcaa8aSmrgEach shift level has a name and these names are held in the <emphasis> 225e9fcaa8aSmrglevel_names</emphasis> 226e9fcaa8aSmrg array, whose length is <emphasis> 227e9fcaa8aSmrgnum_levels</emphasis> 228e9fcaa8aSmrg. The type itself also has a name, which is held in the <emphasis> 229e9fcaa8aSmrgname</emphasis> 230e9fcaa8aSmrg field. 231e9fcaa8aSmrg</para> 232e9fcaa8aSmrg 233e9fcaa8aSmrg 234e9fcaa8aSmrg<para> 235e9fcaa8aSmrgFor example, consider how the server handles the following possible symbolic 236e9fcaa8aSmrgdescription of a possible key type (note that the format used to specify 237e9fcaa8aSmrgkeyboard mappings in the server database is not specified by the Xkb extension, 238e9fcaa8aSmrgalthough this format is one possible example): 239e9fcaa8aSmrg</para> 240e9fcaa8aSmrg 241e9fcaa8aSmrg<table frame='none'> 242e9fcaa8aSmrg<title>Example Key Type</title> 243e9fcaa8aSmrg<tgroup cols='2'> 244e9fcaa8aSmrg<colspec colsep='0'/> 245e9fcaa8aSmrg<colspec colsep='0'/> 246e9fcaa8aSmrg<thead> 247e9fcaa8aSmrg<row rowsep='0'> 248e9fcaa8aSmrg <entry>Symbolic Description</entry> 249e9fcaa8aSmrg <entry>Key Type Data Structure</entry> 250e9fcaa8aSmrg</row> 251e9fcaa8aSmrg</thead> 252e9fcaa8aSmrg<tbody> 253e9fcaa8aSmrg <row rowsep='0'> 254e9fcaa8aSmrg <entry>type "ALPHATHREE" {</entry> 255e9fcaa8aSmrg <entry>Xkb->map->types[i].name</entry> 256e9fcaa8aSmrg </row> 257e9fcaa8aSmrg <row rowsep='0'> 258e9fcaa8aSmrg <entry>modifiers = Shift+Lock+LevelThree;</entry> 259e9fcaa8aSmrg <entry>Xkb->map->types[i].mods</entry> 260e9fcaa8aSmrg </row> 261e9fcaa8aSmrg <row rowsep='0'> 262e9fcaa8aSmrg <entry><emphasis>map[None]= Level1;</emphasis></entry> 263e9fcaa8aSmrg <entry>Xkb->map->types[i].map[0]</entry> 264e9fcaa8aSmrg </row> 265e9fcaa8aSmrg <row rowsep='0'> 266e9fcaa8aSmrg <entry><emphasis>map[Lock]= Level1;</emphasis></entry> 267e9fcaa8aSmrg <entry>Xkb->map->types[i].map[1]</entry> 268e9fcaa8aSmrg </row> 269e9fcaa8aSmrg <row rowsep='0'> 270e9fcaa8aSmrg <entry>map[Shift]= Level2;</entry> 271e9fcaa8aSmrg <entry>Xkb->map->types[i].map[2]</entry> 272e9fcaa8aSmrg </row> 273e9fcaa8aSmrg <row rowsep='0'> 274e9fcaa8aSmrg <entry>map[LevelThree]= Level3;</entry> 275e9fcaa8aSmrg <entry>Xkb->map->types[i].map[3]</entry> 276e9fcaa8aSmrg </row> 277e9fcaa8aSmrg <row rowsep='0'> 278e9fcaa8aSmrg <entry>map[Shift+LevelThree]= Level3;</entry> 279e9fcaa8aSmrg <entry>Xkb->map->types[i].map[4]</entry> 280e9fcaa8aSmrg </row> 281e9fcaa8aSmrg <row rowsep='0'> 282e9fcaa8aSmrg <entry><emphasis>preserve[None]= None;</emphasis></entry> 283e9fcaa8aSmrg <entry>Xkb->map->types[i].perserve[0]</entry> 284e9fcaa8aSmrg </row> 285e9fcaa8aSmrg <row rowsep='0'> 286e9fcaa8aSmrg <entry>preserve[Lock]= Lock;</entry> 287e9fcaa8aSmrg <entry>Xkb->map->types[i].preserve[1]</entry> 288e9fcaa8aSmrg </row> 289e9fcaa8aSmrg <row rowsep='0'> 290e9fcaa8aSmrg <entry><emphasis>preserve[Shift]= None;</emphasis></entry> 291e9fcaa8aSmrg <entry>Xkb->map->types[i].preserve[2]</entry> 292e9fcaa8aSmrg </row> 293e9fcaa8aSmrg <row rowsep='0'> 294e9fcaa8aSmrg <entry><emphasis>preserve[LevelThree]= None;</emphasis></entry> 295e9fcaa8aSmrg <entry>Xkb->map->types[i].preserve[3]</entry> 296e9fcaa8aSmrg </row> 297e9fcaa8aSmrg <row rowsep='0'> 298e9fcaa8aSmrg <entry><emphasis>preserve[Shift+Level3]= None;</emphasis> </entry> 299e9fcaa8aSmrg <entry>Xkb->map->types[i].preserve[4]</entry> 300e9fcaa8aSmrg </row> 301e9fcaa8aSmrg <row rowsep='0'> 302e9fcaa8aSmrg <entry>level_name[Level1]= "Base";</entry> 303e9fcaa8aSmrg <entry>Xkb->map->types[i].level_names[0]</entry> 304e9fcaa8aSmrg </row> 305e9fcaa8aSmrg <row rowsep='0'> 306e9fcaa8aSmrg <entry>level_name[Level2]= "Caps";</entry> 307e9fcaa8aSmrg <entry>Xkb->map->types[i].level_names[1]</entry> 308e9fcaa8aSmrg </row> 309e9fcaa8aSmrg <row rowsep='0'> 310e9fcaa8aSmrg <entry>level_name[Level3]= "Level3";</entry> 311e9fcaa8aSmrg <entry>Xkb->map->types[i].level_names[2]</entry> 312e9fcaa8aSmrg </row> 313e9fcaa8aSmrg <row rowsep='0'> 314e9fcaa8aSmrg <entry>};</entry> 315e9fcaa8aSmrg <entry></entry> 316e9fcaa8aSmrg </row> 317e9fcaa8aSmrg</tbody> 318e9fcaa8aSmrg</tgroup> 319e9fcaa8aSmrg</table> 320e9fcaa8aSmrg 321e9fcaa8aSmrg<para> 322e9fcaa8aSmrgThe <emphasis> 323e9fcaa8aSmrgname</emphasis> 324e9fcaa8aSmrg of the example key type is "ALPHATHREE," and the modifiers it pays attention 325e9fcaa8aSmrgto are <emphasis> 326e9fcaa8aSmrgShift</emphasis> 327e9fcaa8aSmrg, <emphasis> 328e9fcaa8aSmrgLock</emphasis> 329e9fcaa8aSmrg, and the virtual modifier <emphasis> 330e9fcaa8aSmrgLevelThree</emphasis> 331e9fcaa8aSmrg. There are three shift levels. The name of shift level one is "Base," the name 332e9fcaa8aSmrgof shift level two is "Caps," and the name of shift level three is "Level3." 333e9fcaa8aSmrg</para> 334e9fcaa8aSmrg 335e9fcaa8aSmrg 336e9fcaa8aSmrg<para> 337e9fcaa8aSmrgGiven the combination of the <emphasis> 338e9fcaa8aSmrgmap</emphasis> 339e9fcaa8aSmrg and <emphasis> 340e9fcaa8aSmrgpreserve</emphasis> 341e9fcaa8aSmrg specifications, there are five <emphasis> 342e9fcaa8aSmrgmap</emphasis> 343e9fcaa8aSmrg entries. The first map entry specifies that shift level one is to be used if 344e9fcaa8aSmrgno modifiers are set. The second entry specifies the <emphasis> 345e9fcaa8aSmrgLock</emphasis> 346e9fcaa8aSmrg modifier alone also yields shift level one. The third entry specifies the 347e9fcaa8aSmrg<emphasis> 348e9fcaa8aSmrgShift</emphasis> 349e9fcaa8aSmrg modifier alone yields shift level two. The fourth and fifth entries specify 350e9fcaa8aSmrgthat the virtual <emphasis> 351e9fcaa8aSmrgLevelThree</emphasis> 352e9fcaa8aSmrg modifier alone, or in combination with the <emphasis> 353e9fcaa8aSmrgShift</emphasis> 354e9fcaa8aSmrg modifier, yields shift level three. 355e9fcaa8aSmrg</para> 356e9fcaa8aSmrg 357e9fcaa8aSmrg<note><para>Shift level three can be reached only if the virtual modifier 358e9fcaa8aSmrg<emphasis> 359e9fcaa8aSmrgLevelThree</emphasis> 360e9fcaa8aSmrg is bound to a real modifier (see section 16.4). If <emphasis> 361e9fcaa8aSmrgLevelThree</emphasis> 362e9fcaa8aSmrg is not bound to a real modifier, the <emphasis> 363e9fcaa8aSmrgmap</emphasis> 364e9fcaa8aSmrg entries associated with it are ignored.</para></note> 365e9fcaa8aSmrg 366e9fcaa8aSmrg<para> 367e9fcaa8aSmrgBecause the <emphasis> 368e9fcaa8aSmrgLock</emphasis> 369e9fcaa8aSmrg modifier is to be preserved for further event processing, the <emphasis> 370e9fcaa8aSmrgpreserve</emphasis> 371e9fcaa8aSmrg list is not <emphasis> 372e9fcaa8aSmrgNULL</emphasis> 373e9fcaa8aSmrg and parallels the <emphasis> 374e9fcaa8aSmrgmap</emphasis> 375e9fcaa8aSmrg list. All <emphasis> 376e9fcaa8aSmrgpreserve</emphasis> 377e9fcaa8aSmrg entries, except for the one corresponding to the <emphasis> 378e9fcaa8aSmrgmap</emphasis> 379e9fcaa8aSmrg entry that specifies the <emphasis> 380e9fcaa8aSmrgLock </emphasis> 381e9fcaa8aSmrgmodifier, do not list any modifiers. For the <emphasis> 382e9fcaa8aSmrgmap</emphasis> 383e9fcaa8aSmrg entry that specifies the <emphasis> 384e9fcaa8aSmrgLock</emphasis> 385e9fcaa8aSmrg modifier, the corresponding <emphasis> 386e9fcaa8aSmrgpreserve</emphasis> 387e9fcaa8aSmrg list entry lists the <emphasis> 388e9fcaa8aSmrgLock</emphasis> 389e9fcaa8aSmrg modifier, meaning do not consume the <emphasis> 390e9fcaa8aSmrgLock</emphasis> 391e9fcaa8aSmrg modifier. In this particular case, the preserved modifier is passed to Xlib 392e9fcaa8aSmrgtranslation functions and causes them to notice that the <emphasis> 393e9fcaa8aSmrgLock</emphasis> 394e9fcaa8aSmrg modifier is set; consequently, the Xlib functions apply the appropriate 395e9fcaa8aSmrgcapitalization rules to the symbol. Because this preserve entry is set only for 396e9fcaa8aSmrga modifier that yields shift level one, the capitalization occurs only for 397e9fcaa8aSmrglevel-one symbols. 398e9fcaa8aSmrg</para> 399e9fcaa8aSmrg 400e9fcaa8aSmrg 401e9fcaa8aSmrg<sect2 id='the_canonical_key_types'> 402e9fcaa8aSmrg<title>The Canonical Key Types</title> 403e9fcaa8aSmrg 404e9fcaa8aSmrg<para> 405e9fcaa8aSmrgXkb allows up to <emphasis> 406e9fcaa8aSmrgXkbMaxKeyTypes</emphasis> 407e9fcaa8aSmrg (255) key types to be defined, but requires at least <emphasis> 408e9fcaa8aSmrgXkbNumRequiredTypes</emphasis> 409e9fcaa8aSmrg (4) predefined types to be in a key map. These predefined key types are 410e9fcaa8aSmrgreferred to as the canonical key types and describe the types of keys available 411e9fcaa8aSmrgon most keyboards. The definitions for the canonical key types are held in the 412e9fcaa8aSmrgfirst <emphasis> 413e9fcaa8aSmrgXkbNumRequiredTypes</emphasis> 414e9fcaa8aSmrg entries of the <emphasis> 415e9fcaa8aSmrgtypes</emphasis> 416e9fcaa8aSmrg field of the client map and are indexed using the following constants: 417e9fcaa8aSmrg</para> 418e9fcaa8aSmrg 419e9fcaa8aSmrg<para><programlisting> 420e9fcaa8aSmrg <emphasis>XkbOneLevelIndex</emphasis> 421e9fcaa8aSmrg <emphasis>XkbTwoLevelIndex</emphasis> 422e9fcaa8aSmrg <emphasis>XkbAlphabeticIndex</emphasis> 423e9fcaa8aSmrg <emphasis>XkbKeypadIndex</emphasis> 424e9fcaa8aSmrg</programlisting></para> 425e9fcaa8aSmrg 426e9fcaa8aSmrg<sect3 id='one_level'> 427e9fcaa8aSmrg<title>ONE_LEVEL</title> 428e9fcaa8aSmrg 429e9fcaa8aSmrg<para> 430e9fcaa8aSmrgThe ONE_LEVEL key type describes groups that have only one symbol. The default 431e9fcaa8aSmrgONE_LEVEL key type has no map entries and does not pay attention to any 432e9fcaa8aSmrgmodifiers. A symbolic representation of this key type could look like the 433e9fcaa8aSmrgfollowing: 434e9fcaa8aSmrg</para> 435e9fcaa8aSmrg 436e9fcaa8aSmrg<literallayout> 437e9fcaa8aSmrgtype "ONE_LEVEL" { 438e9fcaa8aSmrg modifiers = None; 439e9fcaa8aSmrg map[None]= Level1; 440e9fcaa8aSmrg level_name[Level1]= "Any"; 441e9fcaa8aSmrg}; 442e9fcaa8aSmrg</literallayout> 443e9fcaa8aSmrg 444e9fcaa8aSmrg<para> 445e9fcaa8aSmrgThe description of the ONE_LEVEL key type is stored in the <emphasis> 446e9fcaa8aSmrgtypes</emphasis> 447e9fcaa8aSmrg[<emphasis> 448e9fcaa8aSmrgXkbOneLevelIndex</emphasis> 449e9fcaa8aSmrg] entry of the client key map. 450e9fcaa8aSmrg</para> 451e9fcaa8aSmrg 452e9fcaa8aSmrg 453e9fcaa8aSmrg</sect3> 454e9fcaa8aSmrg<sect3 id='two_level'> 455e9fcaa8aSmrg<title>TWO_LEVEL</title> 456e9fcaa8aSmrg 457e9fcaa8aSmrg<para> 458e9fcaa8aSmrgThe TWO_LEVEL key type describes groups that consist of two symbols but are 459e9fcaa8aSmrgneither alphabetic nor numeric keypad keys. The default TWO_LEVEL type uses 460e9fcaa8aSmrgonly the <emphasis> 461e9fcaa8aSmrgShift</emphasis> 462e9fcaa8aSmrg modifier. It returns shift level two if <emphasis> 463e9fcaa8aSmrgShift</emphasis> 464e9fcaa8aSmrg is set, and level one if it is not. A symbolic representation of this key type 465e9fcaa8aSmrgcould look like the following: 466e9fcaa8aSmrg</para> 467e9fcaa8aSmrg 468e9fcaa8aSmrg<literallayout> 469e9fcaa8aSmrgtype "TWO_LEVEL" { 470e9fcaa8aSmrg modifiers = Shift; 471e9fcaa8aSmrg map[Shift]= Level2; 472e9fcaa8aSmrg level_name[Level1]= "Base"; 473e9fcaa8aSmrg level_name[Level2]= "Shift"; 474e9fcaa8aSmrg}; 475e9fcaa8aSmrg</literallayout> 476e9fcaa8aSmrg 477e9fcaa8aSmrg<para> 478e9fcaa8aSmrgThe description of the TWO_LEVEL key type is stored in the <emphasis> 479e9fcaa8aSmrgtypes</emphasis> 480e9fcaa8aSmrg[<emphasis> 481e9fcaa8aSmrgXkbTwoLevelIndex</emphasis> 482e9fcaa8aSmrg] entry of the client key map. 483e9fcaa8aSmrg</para> 484e9fcaa8aSmrg 485e9fcaa8aSmrg 486e9fcaa8aSmrg</sect3> 487e9fcaa8aSmrg<sect3 id='alphabetic'> 488e9fcaa8aSmrg<title>ALPHABETIC</title> 489e9fcaa8aSmrg 490e9fcaa8aSmrg<para> 491e9fcaa8aSmrgThe ALPHABETIC key type describes groups consisting of two symbols: the 492e9fcaa8aSmrglowercase form of a symbol followed by the uppercase form of the same symbol. 493e9fcaa8aSmrgThe default ALPHABETIC type implements locale-sensitive "Shift cancels 494e9fcaa8aSmrgCapsLock" behavior using both the <emphasis> 495e9fcaa8aSmrgShift</emphasis> 496e9fcaa8aSmrg and <emphasis> 497e9fcaa8aSmrgLock</emphasis> 498e9fcaa8aSmrg modifiers as follows: 499e9fcaa8aSmrg</para> 500e9fcaa8aSmrg 501e9fcaa8aSmrg<itemizedlist> 502e9fcaa8aSmrg<listitem> 503e9fcaa8aSmrg <para> 504e9fcaa8aSmrgIf <emphasis> 505e9fcaa8aSmrgShift</emphasis> 506e9fcaa8aSmrg and <emphasis> 507e9fcaa8aSmrgLock</emphasis> 508e9fcaa8aSmrg are both set, the default ALPHABETIC type yields level one. 509e9fcaa8aSmrg </para> 510e9fcaa8aSmrg</listitem> 511e9fcaa8aSmrg<listitem> 512e9fcaa8aSmrg <para> 513e9fcaa8aSmrgIf <emphasis> 514e9fcaa8aSmrgShift</emphasis> 515e9fcaa8aSmrg alone is set, it yields level two. 516e9fcaa8aSmrg </para> 517e9fcaa8aSmrg</listitem> 518e9fcaa8aSmrg<listitem> 519e9fcaa8aSmrg <para> 520e9fcaa8aSmrgIf <emphasis> 521e9fcaa8aSmrgLock</emphasis> 522e9fcaa8aSmrg alone is set, it yields level one, but preserves the <emphasis> 523e9fcaa8aSmrgLock</emphasis> 524e9fcaa8aSmrg modifier so Xlib notices and applies the appropriate capitalization rules. The 525e9fcaa8aSmrgXlib functions are locale-sensitive and apply different capitalization rules 526e9fcaa8aSmrgfor different locales. 527e9fcaa8aSmrg </para> 528e9fcaa8aSmrg</listitem> 529e9fcaa8aSmrg<listitem> 530e9fcaa8aSmrg <para> 531e9fcaa8aSmrgIf neither <emphasis> 532e9fcaa8aSmrgShift</emphasis> 533e9fcaa8aSmrg nor <emphasis> 534e9fcaa8aSmrgLock</emphasis> 535e9fcaa8aSmrg is set, it yields level one. 536e9fcaa8aSmrg </para> 537e9fcaa8aSmrg</listitem> 538e9fcaa8aSmrg</itemizedlist> 539e9fcaa8aSmrg 540e9fcaa8aSmrg<para> 541e9fcaa8aSmrgA symbolic representation of this key type could look like the following: 542e9fcaa8aSmrg</para> 543e9fcaa8aSmrg 544e9fcaa8aSmrg<literallayout> 545e9fcaa8aSmrgtype "ALPHABETIC" { 546e9fcaa8aSmrg modifiers = Shift+Lock; 547e9fcaa8aSmrg map[Shift]= Level2; 548e9fcaa8aSmrg preserve[Lock]= Lock; 549e9fcaa8aSmrg level_name[Level1]= "Base"; 550e9fcaa8aSmrg level_name[Level2]= "Caps"; 551e9fcaa8aSmrg}; 552e9fcaa8aSmrg</literallayout> 553e9fcaa8aSmrg 554e9fcaa8aSmrg<para> 555e9fcaa8aSmrgThe description of the ALPHABETIC key type is stored in the <emphasis> 556e9fcaa8aSmrgtypes</emphasis> 557e9fcaa8aSmrg[<emphasis> 558e9fcaa8aSmrgXkbAlphabeticIndex</emphasis> 559e9fcaa8aSmrg] entry of the client key map. 560e9fcaa8aSmrg</para> 561e9fcaa8aSmrg 562e9fcaa8aSmrg 563e9fcaa8aSmrg</sect3> 564e9fcaa8aSmrg<sect3 id='keypad'> 565e9fcaa8aSmrg<title>KEYPAD</title> 566e9fcaa8aSmrg 567e9fcaa8aSmrg<para> 568e9fcaa8aSmrgThe KEYPAD key type describes groups that consist of two symbols, at least one 569e9fcaa8aSmrgof which is a numeric keypad symbol. The numeric keypad symbol is assumed to 570e9fcaa8aSmrgreside at level two. The default KEYPAD key type implements "Shift cancels 571e9fcaa8aSmrgNumLock" behavior using the Shift modifier and the real modifier bound to the 572e9fcaa8aSmrgvirtual modifier named "NumLock," known as the <emphasis> 573e9fcaa8aSmrgNumLock</emphasis> 574e9fcaa8aSmrg modifier, as follows: 575e9fcaa8aSmrg</para> 576e9fcaa8aSmrg 577e9fcaa8aSmrg<itemizedlist> 578e9fcaa8aSmrg<listitem> 579e9fcaa8aSmrg <para> 580e9fcaa8aSmrgIf <emphasis> 581e9fcaa8aSmrgShift</emphasis> 582e9fcaa8aSmrg and <emphasis> 583e9fcaa8aSmrgNumLock</emphasis> 584e9fcaa8aSmrg are both set, the default KEYPAD type yields level one. 585e9fcaa8aSmrg </para> 586e9fcaa8aSmrg</listitem> 587e9fcaa8aSmrg<listitem> 588e9fcaa8aSmrg <para> 589e9fcaa8aSmrgIf <emphasis> 590e9fcaa8aSmrgShift</emphasis> 591e9fcaa8aSmrg alone is set, it yields level two. 592e9fcaa8aSmrg </para> 593e9fcaa8aSmrg</listitem> 594e9fcaa8aSmrg<listitem> 595e9fcaa8aSmrg <para> 596e9fcaa8aSmrgIf <emphasis> 597e9fcaa8aSmrgNumLock</emphasis> 598e9fcaa8aSmrg alone is set, it yields level two. 599e9fcaa8aSmrg </para> 600e9fcaa8aSmrg</listitem> 601e9fcaa8aSmrg<listitem> 602e9fcaa8aSmrg <para> 603e9fcaa8aSmrgIf neither <emphasis> 604e9fcaa8aSmrgShift</emphasis> 605e9fcaa8aSmrg nor <emphasis> 606e9fcaa8aSmrgNumLock</emphasis> 607e9fcaa8aSmrg is set, it yields level one. 608e9fcaa8aSmrg </para> 609e9fcaa8aSmrg</listitem> 610e9fcaa8aSmrg</itemizedlist> 611e9fcaa8aSmrg 612e9fcaa8aSmrg<para> 613e9fcaa8aSmrgA symbolic representation of this key type could look like the following: 614e9fcaa8aSmrg</para> 615e9fcaa8aSmrg 616e9fcaa8aSmrg<literallayout> 617e9fcaa8aSmrgtype "KEYPAD" { 618e9fcaa8aSmrg modifiers = Shift+NumLock; 619e9fcaa8aSmrg map[None]= Level1; 620e9fcaa8aSmrg map[Shift]= Level2; 621e9fcaa8aSmrg map[NumLock]= Level2; 622e9fcaa8aSmrg map[Shift+NumLock]= Level1; 623e9fcaa8aSmrg level_name[Level1]= "Base"; 624e9fcaa8aSmrg level_name[Level2]= "Caps"; 625e9fcaa8aSmrg}; 626e9fcaa8aSmrg</literallayout> 627e9fcaa8aSmrg 628e9fcaa8aSmrg<para> 629e9fcaa8aSmrgThe description of the KEYPAD key type is stored in the <emphasis> 630e9fcaa8aSmrgtypes</emphasis> 631e9fcaa8aSmrg[<emphasis> 632e9fcaa8aSmrgXkbKeypadIndex</emphasis> 633e9fcaa8aSmrg] entry of the client key map. 634e9fcaa8aSmrg</para> 635e9fcaa8aSmrg 636e9fcaa8aSmrg 637e9fcaa8aSmrg</sect3> 638e9fcaa8aSmrg<sect3 id='initializing_the_canonical_key_types_in_a_new_client_map'> 639e9fcaa8aSmrg<title>Initializing the Canonical Key Types in a New Client Map</title> 640e9fcaa8aSmrg 641e9fcaa8aSmrg<para> 642e9fcaa8aSmrgTo set the definitions of the canonical key types in a client map to their 643e9fcaa8aSmrgdefault values, use <emphasis> 644e9fcaa8aSmrgXkbInitCanonicalKeyTypes.</emphasis> 645e9fcaa8aSmrg</para> 646e9fcaa8aSmrg 647e9fcaa8aSmrg<informaltable frame='none'> 648e9fcaa8aSmrg<tgroup cols='1'> 649e9fcaa8aSmrg<colspec colsep='0'/> 650e9fcaa8aSmrg<tbody> 651e9fcaa8aSmrg <row rowsep='0'> 652e9fcaa8aSmrg <entry role='functiondecl'> 653e9fcaa8aSmrgStatus <emphasis> 654e9fcaa8aSmrgXkbInitCanonicalKeyTypes</emphasis> 655e9fcaa8aSmrg(<emphasis> 656e9fcaa8aSmrgxkb, which, keypadVMod</emphasis> 657e9fcaa8aSmrg) 658e9fcaa8aSmrg </entry> 659e9fcaa8aSmrg </row> 660e9fcaa8aSmrg <row rowsep='0'> 661e9fcaa8aSmrg <entry role='functionargdecl'> 662e9fcaa8aSmrgXkbDescPtr <emphasis> 663e9fcaa8aSmrgxkb</emphasis> 664e9fcaa8aSmrg; /* keyboard description containing client map to initialize */ 665e9fcaa8aSmrg </entry> 666e9fcaa8aSmrg </row> 667e9fcaa8aSmrg <row rowsep='0'> 668e9fcaa8aSmrg <entry role='functionargdecl'> 669e9fcaa8aSmrgunsigned int <emphasis> 670e9fcaa8aSmrgwhich</emphasis> 671e9fcaa8aSmrg; /* mask of types to initialize */ 672e9fcaa8aSmrg </entry> 673e9fcaa8aSmrg </row> 674e9fcaa8aSmrg <row rowsep='0'> 675e9fcaa8aSmrg <entry role='functionargdecl'> 676e9fcaa8aSmrgint <emphasis> 677e9fcaa8aSmrgkeypadVMod</emphasis> 678e9fcaa8aSmrg; /* index of NumLock virtual modifier */ 679e9fcaa8aSmrg </entry> 680e9fcaa8aSmrg</row> 681e9fcaa8aSmrg</tbody> 682e9fcaa8aSmrg</tgroup> 683e9fcaa8aSmrg</informaltable> 684e9fcaa8aSmrg 685e9fcaa8aSmrg<para> 686e9fcaa8aSmrg<emphasis> 687e9fcaa8aSmrgXkbInitCanonicalKeyTypes</emphasis> 688e9fcaa8aSmrg initializes the first <emphasis> 689e9fcaa8aSmrgXkbNumRequiredTypes</emphasis> 690e9fcaa8aSmrg key types of the keyboard specified by the <emphasis> 691e9fcaa8aSmrgxkb</emphasis> 692e9fcaa8aSmrg parameter to their default values. The <emphasis> 693e9fcaa8aSmrgwhich</emphasis> 694e9fcaa8aSmrg parameter specifies what canonical key types to initialize and is a bitwise 695e9fcaa8aSmrginclusive OR of the following masks: <emphasis> 696e9fcaa8aSmrgXkbOneLevelMask</emphasis> 697e9fcaa8aSmrg, <emphasis> 698e9fcaa8aSmrgXkbTwoLevelMask</emphasis> 699e9fcaa8aSmrg, <emphasis> 700e9fcaa8aSmrgXkbAlphabeticMask</emphasis> 701e9fcaa8aSmrg, and <emphasis> 702e9fcaa8aSmrgXkbKeypadMask</emphasis> 703e9fcaa8aSmrg. Only those canonical types specified by the <emphasis> 704e9fcaa8aSmrgwhich</emphasis> 705e9fcaa8aSmrg mask are initialized. 706e9fcaa8aSmrg</para> 707e9fcaa8aSmrg 708e9fcaa8aSmrg 709e9fcaa8aSmrg<para> 710e9fcaa8aSmrgIf <emphasis> 711e9fcaa8aSmrgXkbKeypadMask</emphasis> 712e9fcaa8aSmrg is set in the <emphasis> 713e9fcaa8aSmrgwhich</emphasis> 714e9fcaa8aSmrg parameter, <emphasis> 715e9fcaa8aSmrgXkbInitCanonicalKeyTypes</emphasis> 716e9fcaa8aSmrg looks up the <emphasis> 717e9fcaa8aSmrgNumLock</emphasis> 718e9fcaa8aSmrg named virtual modifier to determine which virtual modifier to use when 719e9fcaa8aSmrginitializing the KEYPAD key type. If the <emphasis> 720e9fcaa8aSmrgNumLock</emphasis> 721e9fcaa8aSmrg virtual modifier does not exist, <emphasis> 722e9fcaa8aSmrgXkbInitCanonicalKeyTypes</emphasis> 723e9fcaa8aSmrg creates it. 724e9fcaa8aSmrg</para> 725e9fcaa8aSmrg 726e9fcaa8aSmrg 727e9fcaa8aSmrg<para> 728e9fcaa8aSmrg<emphasis> 729e9fcaa8aSmrgXkbInitCanonicalKeyTypes</emphasis> 730e9fcaa8aSmrg normally returns Success. It returns <emphasis> 731e9fcaa8aSmrgBadAccess</emphasis> 732e9fcaa8aSmrg if the Xkb extension has not been properly initialized, and <emphasis> 733e9fcaa8aSmrgBadAccess</emphasis> 734e9fcaa8aSmrg if the <emphasis> 735e9fcaa8aSmrgxkb</emphasis> 736e9fcaa8aSmrg parameter is not valid. 737e9fcaa8aSmrg</para> 738e9fcaa8aSmrg 739e9fcaa8aSmrg 740e9fcaa8aSmrg 741e9fcaa8aSmrg</sect3> 742e9fcaa8aSmrg</sect2> 743e9fcaa8aSmrg<sect2 id='getting_key_types_from_the_server'> 744e9fcaa8aSmrg<title>Getting Key Types from the Server</title> 745e9fcaa8aSmrg 746e9fcaa8aSmrg<para> 747e9fcaa8aSmrgTo obtain the list of available key types in the server’s keyboard mapping, 748e9fcaa8aSmrguse <emphasis> 749e9fcaa8aSmrgXkbGetKeyTypes</emphasis> 750e9fcaa8aSmrg. 751e9fcaa8aSmrg</para> 752e9fcaa8aSmrg 753e9fcaa8aSmrg<informaltable frame='none'> 754e9fcaa8aSmrg<tgroup cols='1'> 755e9fcaa8aSmrg<colspec colsep='0'/> 756e9fcaa8aSmrg<tbody> 757e9fcaa8aSmrg <row rowsep='0'> 758e9fcaa8aSmrg <entry role='functiondecl'> 759e9fcaa8aSmrgStatus <emphasis> 760e9fcaa8aSmrgXkbGetKeyTypes</emphasis> 761e9fcaa8aSmrg(<emphasis> 762e9fcaa8aSmrgdpy</emphasis> 763e9fcaa8aSmrg,<emphasis> 764e9fcaa8aSmrg first</emphasis> 765e9fcaa8aSmrg,<emphasis> 766e9fcaa8aSmrg num</emphasis> 767e9fcaa8aSmrg,<emphasis> 768e9fcaa8aSmrg xkb</emphasis> 769e9fcaa8aSmrg) 770e9fcaa8aSmrg </entry> 771e9fcaa8aSmrg </row> 772e9fcaa8aSmrg <row rowsep='0'> 773e9fcaa8aSmrg <entry role='functionargdecl'> 774e9fcaa8aSmrgDisplay *<emphasis> 775e9fcaa8aSmrg dpy</emphasis> 776e9fcaa8aSmrg; /* connection to X server */ 777e9fcaa8aSmrg </entry> 778e9fcaa8aSmrg </row> 779e9fcaa8aSmrg <row rowsep='0'> 780e9fcaa8aSmrg <entry role='functionargdecl'> 781e9fcaa8aSmrgunsigned int<emphasis> 782e9fcaa8aSmrg first</emphasis> 783e9fcaa8aSmrg; /* index to first type to get, 0 => 1st type */ 784e9fcaa8aSmrg </entry> 785e9fcaa8aSmrg </row> 786e9fcaa8aSmrg <row rowsep='0'> 787e9fcaa8aSmrg <entry role='functionargdecl'> 788e9fcaa8aSmrgunsigned int <emphasis> 789e9fcaa8aSmrgnum</emphasis> 790e9fcaa8aSmrg; /* number of key types to be returned */ 791e9fcaa8aSmrg </entry> 792e9fcaa8aSmrg </row> 793e9fcaa8aSmrg <row rowsep='0'> 794e9fcaa8aSmrg <entry role='functionargdecl'> 795e9fcaa8aSmrgXkbDescPtr <emphasis> 796e9fcaa8aSmrgxkb</emphasis> 797e9fcaa8aSmrg; /* keyboard description containing client map to update */ 798e9fcaa8aSmrg </entry> 799e9fcaa8aSmrg</row> 800e9fcaa8aSmrg</tbody> 801e9fcaa8aSmrg</tgroup> 802e9fcaa8aSmrg</informaltable> 803e9fcaa8aSmrg<note><para><emphasis> 804e9fcaa8aSmrgXkbGetKeyTypes</emphasis> 805e9fcaa8aSmrg is used to obtain descriptions of the key types themselves, not the key types 806e9fcaa8aSmrgbound to individual keys. To obtain the key types bound to an individual key, 807e9fcaa8aSmrgrefer to the <emphasis> 808e9fcaa8aSmrgkey_sym_map</emphasis> 809e9fcaa8aSmrg field of the client map (see section 15.3.1).</para></note> 810e9fcaa8aSmrg 811e9fcaa8aSmrg<para> 812e9fcaa8aSmrg<emphasis> 813e9fcaa8aSmrgXkbGetKeyTypes</emphasis> 814e9fcaa8aSmrg queries the server for the desired types, waits for a reply, and returns the 815e9fcaa8aSmrgdesired types in the <emphasis> 816e9fcaa8aSmrgxkb->map->types</emphasis> 817e9fcaa8aSmrg. If successful, it returns Success. 818e9fcaa8aSmrg</para> 819e9fcaa8aSmrg 820e9fcaa8aSmrg 821e9fcaa8aSmrg<para> 822e9fcaa8aSmrg<emphasis> 823e9fcaa8aSmrgXkbGetKeyTypes</emphasis> 824e9fcaa8aSmrg returns <emphasis> 825e9fcaa8aSmrgBadAccess</emphasis> 826e9fcaa8aSmrg if the Xkb extension has not been properly initialized and <emphasis> 827e9fcaa8aSmrgBadValue</emphasis> 828e9fcaa8aSmrg if the combination of <emphasis> 829e9fcaa8aSmrgfirst</emphasis> 830e9fcaa8aSmrg and <emphasis> 831e9fcaa8aSmrgnum</emphasis> 832e9fcaa8aSmrg results in numbers out of valid range. 833e9fcaa8aSmrg</para> 834e9fcaa8aSmrg 835e9fcaa8aSmrg 836e9fcaa8aSmrg</sect2> 837e9fcaa8aSmrg<sect2 id='changing_the_number_of_levels_in_a_key_type'> 838e9fcaa8aSmrg<title>Changing the Number of Levels in a Key Type</title> 839e9fcaa8aSmrg 840e9fcaa8aSmrg<para> 841e9fcaa8aSmrgTo change the number of levels in a key type, use <emphasis> 842e9fcaa8aSmrgXkbResizeKeyType</emphasis> 843e9fcaa8aSmrg. 844e9fcaa8aSmrg</para> 845e9fcaa8aSmrg 846e9fcaa8aSmrg<informaltable frame='none'> 847e9fcaa8aSmrg<tgroup cols='1'> 848e9fcaa8aSmrg<colspec colsep='0'/> 849e9fcaa8aSmrg<tbody> 850e9fcaa8aSmrg <row rowsep='0'> 851e9fcaa8aSmrg <entry role='functiondecl'> 852e9fcaa8aSmrgStatus <emphasis> 853e9fcaa8aSmrgXkbResizeKeyType</emphasis> 854e9fcaa8aSmrg(<emphasis> 855e9fcaa8aSmrgxkb</emphasis> 856e9fcaa8aSmrg,<emphasis> 857e9fcaa8aSmrg type_ndx</emphasis> 858e9fcaa8aSmrg,<emphasis> 859e9fcaa8aSmrg map_count</emphasis> 860e9fcaa8aSmrg,<emphasis> 861e9fcaa8aSmrg want_preserve</emphasis> 862e9fcaa8aSmrg,<emphasis> 863e9fcaa8aSmrg new_num_lvls</emphasis> 864e9fcaa8aSmrg) 865e9fcaa8aSmrg </entry> 866e9fcaa8aSmrg </row> 867e9fcaa8aSmrg <row rowsep='0'> 868e9fcaa8aSmrg <entry role='functionargdecl'> 869e9fcaa8aSmrgXkbDescPtr<emphasis> 870e9fcaa8aSmrg xkb</emphasis> 871e9fcaa8aSmrg; /* keyboard description containing client map to update */ 872e9fcaa8aSmrg </entry> 873e9fcaa8aSmrg </row> 874e9fcaa8aSmrg <row rowsep='0'> 875e9fcaa8aSmrg <entry role='functionargdecl'> 876e9fcaa8aSmrgint <emphasis> 877e9fcaa8aSmrg type_ndx</emphasis> 878e9fcaa8aSmrg; /* index in xkb->map->types of type to change */ 879e9fcaa8aSmrg </entry> 880e9fcaa8aSmrg </row> 881e9fcaa8aSmrg <row rowsep='0'> 882e9fcaa8aSmrg <entry role='functionargdecl'> 883e9fcaa8aSmrgint <emphasis> 884e9fcaa8aSmrgmap_count</emphasis> 885e9fcaa8aSmrg; /* total # of map entries needed for the type */ 886e9fcaa8aSmrg </entry> 887e9fcaa8aSmrg </row> 888e9fcaa8aSmrg <row rowsep='0'> 889e9fcaa8aSmrg <entry role='functionargdecl'> 890e9fcaa8aSmrgBool <emphasis> 891e9fcaa8aSmrgwant_preserve</emphasis> 892e9fcaa8aSmrg; /* <emphasis> 893e9fcaa8aSmrgTrue</emphasis> 894e9fcaa8aSmrg => list of preserved modifiers is necessary */ 895e9fcaa8aSmrg </entry> 896e9fcaa8aSmrg </row> 897e9fcaa8aSmrg <row rowsep='0'> 898e9fcaa8aSmrg <entry role='functionargdecl'> 899e9fcaa8aSmrgint <emphasis> 900e9fcaa8aSmrg new_num_lvls</emphasis> 901e9fcaa8aSmrg; /* new max # of levels for type */ 902e9fcaa8aSmrg </entry> 903e9fcaa8aSmrg</row> 904e9fcaa8aSmrg</tbody> 905e9fcaa8aSmrg</tgroup> 906e9fcaa8aSmrg</informaltable> 907e9fcaa8aSmrg 908e9fcaa8aSmrg<para> 909e9fcaa8aSmrg<emphasis> 910e9fcaa8aSmrgXkbResizeKeyType</emphasis> 911e9fcaa8aSmrg changes the type specified by <emphasis> 912e9fcaa8aSmrgxkb</emphasis> 913e9fcaa8aSmrg-><emphasis> 914e9fcaa8aSmrgmap->types</emphasis> 915e9fcaa8aSmrg[<emphasis> 916e9fcaa8aSmrgtype_ndx</emphasis> 917e9fcaa8aSmrg], and reallocates the symbols and actions bound to all keys that use the type, 918e9fcaa8aSmrgif necessary. <emphasis> 919e9fcaa8aSmrgXkbResizeKeyType</emphasis> 920e9fcaa8aSmrg updates only the local copy of the types in <emphasis> 921e9fcaa8aSmrgxkb</emphasis> 922e9fcaa8aSmrg; to update the server’s copy for the physical device, use <emphasis> 923e9fcaa8aSmrgXkbSetMap</emphasis> 924e9fcaa8aSmrg or <emphasis> 925e9fcaa8aSmrgXkbChangeMap</emphasis> 926e9fcaa8aSmrg after calling <emphasis> 927e9fcaa8aSmrgXkbResizeKeyType</emphasis> 928e9fcaa8aSmrg. 929e9fcaa8aSmrg</para> 930e9fcaa8aSmrg 931e9fcaa8aSmrg 932e9fcaa8aSmrg<para> 933e9fcaa8aSmrgThe <emphasis> 934e9fcaa8aSmrgmap_count</emphasis> 935e9fcaa8aSmrg parameter specifies the total number of map entries needed for the type, and 936e9fcaa8aSmrgcan be zero or greater. If <emphasis> 937e9fcaa8aSmrgmap_count</emphasis> 938e9fcaa8aSmrg is zero, <emphasis> 939e9fcaa8aSmrgXkbResizeKeyType</emphasis> 940e9fcaa8aSmrg frees the existing <emphasis> 941e9fcaa8aSmrgmap</emphasis> 942e9fcaa8aSmrg and <emphasis> 943e9fcaa8aSmrgpreserve</emphasis> 944e9fcaa8aSmrg entries for the type if they exist and sets them to <emphasis> 945e9fcaa8aSmrgNULL</emphasis> 946e9fcaa8aSmrg. 947e9fcaa8aSmrg</para> 948e9fcaa8aSmrg 949e9fcaa8aSmrg 950e9fcaa8aSmrg<para> 951e9fcaa8aSmrgThe <emphasis> 952e9fcaa8aSmrgwant_preserve</emphasis> 953e9fcaa8aSmrg parameter specifies whether a <emphasis> 954e9fcaa8aSmrgpreserve</emphasis> 955e9fcaa8aSmrg list for the key should be created. If <emphasis> 956e9fcaa8aSmrgwant_preserve</emphasis> 957e9fcaa8aSmrg is <emphasis> 958e9fcaa8aSmrgTrue</emphasis> 959e9fcaa8aSmrg, the <emphasis> 960e9fcaa8aSmrgpreserve</emphasis> 961e9fcaa8aSmrg list with <emphasis> 962e9fcaa8aSmrgmap_count</emphasis> 963e9fcaa8aSmrg entries is allocated or reallocated if it already exists. Otherwise, if 964e9fcaa8aSmrg<emphasis> 965e9fcaa8aSmrgwant_preserve</emphasis> 966e9fcaa8aSmrg is <emphasis> 967e9fcaa8aSmrgFalse</emphasis> 968e9fcaa8aSmrg, the <emphasis> 969e9fcaa8aSmrgpreserve</emphasis> 970e9fcaa8aSmrg field is freed if necessary and set to <emphasis> 971e9fcaa8aSmrgNULL</emphasis> 972e9fcaa8aSmrg. 973e9fcaa8aSmrg</para> 974e9fcaa8aSmrg 975e9fcaa8aSmrg 976e9fcaa8aSmrg<para> 977e9fcaa8aSmrgThe <emphasis> 978e9fcaa8aSmrgnew_num_lvls</emphasis> 979e9fcaa8aSmrg parameter specifies the new maximum number of shift levels for the type and is 980e9fcaa8aSmrgused to calculate and resize the symbols and actions bound to all keys that use 981e9fcaa8aSmrgthe type. 982e9fcaa8aSmrg</para> 983e9fcaa8aSmrg 984e9fcaa8aSmrg 985e9fcaa8aSmrg<para> 986e9fcaa8aSmrgIf <emphasis> 987e9fcaa8aSmrgtype_ndx</emphasis> 988e9fcaa8aSmrg does not specify a legal type, <emphasis> 989e9fcaa8aSmrgnew_num_lvls</emphasis> 990e9fcaa8aSmrg is less than 1, or the <emphasis> 991e9fcaa8aSmrgmap_count</emphasis> 992e9fcaa8aSmrg is less than zero, <emphasis> 993e9fcaa8aSmrgXkbResizeKeyType</emphasis> 994e9fcaa8aSmrg returns <emphasis> 995e9fcaa8aSmrgBadValue</emphasis> 996e9fcaa8aSmrg. If <emphasis> 997e9fcaa8aSmrgXkbResizeKeyType</emphasis> 998e9fcaa8aSmrg encounters any problems with allocation, it returns <emphasis> 999e9fcaa8aSmrgBadAlloc</emphasis> 1000e9fcaa8aSmrg. Otherwise, it returns <emphasis> 1001e9fcaa8aSmrgSuccess</emphasis> 1002e9fcaa8aSmrg. 1003e9fcaa8aSmrg</para> 1004e9fcaa8aSmrg 1005e9fcaa8aSmrg 1006e9fcaa8aSmrg</sect2> 1007e9fcaa8aSmrg<sect2 id='copying_key_types'> 1008e9fcaa8aSmrg<title>Copying Key Types</title> 1009e9fcaa8aSmrg 1010e9fcaa8aSmrg<para> 1011e9fcaa8aSmrgUse <emphasis> 1012e9fcaa8aSmrgXkbCopyKeyType</emphasis> 1013e9fcaa8aSmrg and <emphasis> 1014e9fcaa8aSmrgXkbCopyKeyTypes</emphasis> 1015e9fcaa8aSmrg to copy one or more <emphasis> 1016e9fcaa8aSmrgXkbKeyTypeRec</emphasis> 1017e9fcaa8aSmrg structures. 1018e9fcaa8aSmrg</para> 1019e9fcaa8aSmrg 1020e9fcaa8aSmrg<informaltable frame='none'> 1021e9fcaa8aSmrg<tgroup cols='1'> 1022e9fcaa8aSmrg<colspec colsep='0'/> 1023e9fcaa8aSmrg<tbody> 1024e9fcaa8aSmrg <row rowsep='0'> 1025e9fcaa8aSmrg <entry role='functiondecl'> 1026e9fcaa8aSmrgStatus <emphasis> 1027e9fcaa8aSmrgXkbCopyKeyType</emphasis> 1028e9fcaa8aSmrg(<emphasis> 1029e9fcaa8aSmrgfrom</emphasis> 1030e9fcaa8aSmrg,<emphasis> 1031e9fcaa8aSmrg into</emphasis> 1032e9fcaa8aSmrg) 1033e9fcaa8aSmrg </entry> 1034e9fcaa8aSmrg </row> 1035e9fcaa8aSmrg <row rowsep='0'> 1036e9fcaa8aSmrg <entry role='functionargdecl'> 1037e9fcaa8aSmrgXkbKeyTypePtr <emphasis> 1038e9fcaa8aSmrg from</emphasis> 1039e9fcaa8aSmrg; /* pointer to XkbKeyTypeRec to be copied */ 1040e9fcaa8aSmrg </entry> 1041e9fcaa8aSmrg </row> 1042e9fcaa8aSmrg <row rowsep='0'> 1043e9fcaa8aSmrg <entry role='functionargdecl'> 1044e9fcaa8aSmrgXkbKeyTypePtr <emphasis> 1045e9fcaa8aSmrg into</emphasis> 1046e9fcaa8aSmrg; /* pointer to XkbKeyTypeRec to be changed */ 1047e9fcaa8aSmrg </entry> 1048e9fcaa8aSmrg</row> 1049e9fcaa8aSmrg</tbody> 1050e9fcaa8aSmrg</tgroup> 1051e9fcaa8aSmrg</informaltable> 1052e9fcaa8aSmrg 1053e9fcaa8aSmrg<para> 1054e9fcaa8aSmrg<emphasis> 1055e9fcaa8aSmrgXkbCopyKeyType</emphasis> 1056e9fcaa8aSmrg copies the key type specified by <emphasis> 1057e9fcaa8aSmrgfrom</emphasis> 1058e9fcaa8aSmrg to the key type specified by <emphasis> 1059e9fcaa8aSmrginto</emphasis> 1060e9fcaa8aSmrg. Both must point to legal <emphasis> 1061e9fcaa8aSmrgXkbKeyTypeRec</emphasis> 1062e9fcaa8aSmrg structures. Xkb assumes <emphasis> 1063e9fcaa8aSmrgfrom</emphasis> 1064e9fcaa8aSmrg and <emphasis> 1065e9fcaa8aSmrginto</emphasis> 1066e9fcaa8aSmrg point to different places. As a result, overlaps can be fatal. <emphasis> 1067e9fcaa8aSmrgXkbCopyKeyType</emphasis> 1068e9fcaa8aSmrg frees any existing <emphasis> 1069e9fcaa8aSmrgmap</emphasis> 1070e9fcaa8aSmrg, <emphasis> 1071e9fcaa8aSmrgpreserve</emphasis> 1072e9fcaa8aSmrg, and <emphasis> 1073e9fcaa8aSmrglevel_names</emphasis> 1074e9fcaa8aSmrg in <emphasis> 1075e9fcaa8aSmrginto</emphasis> 1076e9fcaa8aSmrg prior to copying. If any allocation errors occur while copying <emphasis> 1077e9fcaa8aSmrgfrom</emphasis> 1078e9fcaa8aSmrg to <emphasis> 1079e9fcaa8aSmrginto</emphasis> 1080e9fcaa8aSmrg, <emphasis> 1081e9fcaa8aSmrgXkbCopyKeyType</emphasis> 1082e9fcaa8aSmrg returns <emphasis> 1083e9fcaa8aSmrgBadAlloc</emphasis> 1084e9fcaa8aSmrg. Otherwise, <emphasis> 1085e9fcaa8aSmrgXkbCopyKeyType</emphasis> 1086e9fcaa8aSmrg copies <emphasis> 1087e9fcaa8aSmrgfrom</emphasis> 1088e9fcaa8aSmrg to <emphasis> 1089e9fcaa8aSmrginto</emphasis> 1090e9fcaa8aSmrg and returns <emphasis> 1091e9fcaa8aSmrgSuccess</emphasis> 1092e9fcaa8aSmrg. 1093e9fcaa8aSmrg</para> 1094e9fcaa8aSmrg 1095e9fcaa8aSmrg 1096e9fcaa8aSmrg<informaltable frame='none'> 1097e9fcaa8aSmrg<tgroup cols='1'> 1098e9fcaa8aSmrg<colspec colsep='0'/> 1099e9fcaa8aSmrg<tbody> 1100e9fcaa8aSmrg <row rowsep='0'> 1101e9fcaa8aSmrg <entry role='functiondecl'> 1102e9fcaa8aSmrgStatus <emphasis> 1103e9fcaa8aSmrgXkbCopyKeyTypes</emphasis> 1104e9fcaa8aSmrg(<emphasis> 1105e9fcaa8aSmrgfrom</emphasis> 1106e9fcaa8aSmrg,<emphasis> 1107e9fcaa8aSmrg into</emphasis> 1108e9fcaa8aSmrg, <emphasis> 1109e9fcaa8aSmrgnum_types</emphasis> 1110e9fcaa8aSmrg) 1111e9fcaa8aSmrg </entry> 1112e9fcaa8aSmrg </row> 1113e9fcaa8aSmrg <row rowsep='0'> 1114e9fcaa8aSmrg <entry role='functionargdecl'> 1115e9fcaa8aSmrgXkbKeyTypePtr <emphasis> 1116e9fcaa8aSmrg from</emphasis> 1117e9fcaa8aSmrg; /* pointer to array of XkbKeyTypeRecs to copy */ 1118e9fcaa8aSmrg </entry> 1119e9fcaa8aSmrg </row> 1120e9fcaa8aSmrg <row rowsep='0'> 1121e9fcaa8aSmrg <entry role='functionargdecl'> 1122e9fcaa8aSmrgXkbKeyTypePtr <emphasis> 1123e9fcaa8aSmrg into</emphasis> 1124e9fcaa8aSmrg; /* pointer to array of XkbKeyTypeRecs to change */ 1125e9fcaa8aSmrg </entry> 1126e9fcaa8aSmrg </row> 1127e9fcaa8aSmrg <row rowsep='0'> 1128e9fcaa8aSmrg <entry role='functionargdecl'> 1129e9fcaa8aSmrgint <emphasis> 1130e9fcaa8aSmrg num_types</emphasis> 1131e9fcaa8aSmrg; /* number of types to copy */ 1132e9fcaa8aSmrg </entry> 1133e9fcaa8aSmrg</row> 1134e9fcaa8aSmrg</tbody> 1135e9fcaa8aSmrg</tgroup> 1136e9fcaa8aSmrg</informaltable> 1137e9fcaa8aSmrg 1138e9fcaa8aSmrg<para> 1139e9fcaa8aSmrg<emphasis> 1140e9fcaa8aSmrgXkbCopyKeyTypes</emphasis> 1141e9fcaa8aSmrg copies <emphasis> 1142e9fcaa8aSmrgnum_types</emphasis> 1143e9fcaa8aSmrg <emphasis> 1144e9fcaa8aSmrgXkbKeyTypeRec</emphasis> 1145e9fcaa8aSmrg structures from the array specified by <emphasis> 1146e9fcaa8aSmrgfrom</emphasis> 1147e9fcaa8aSmrg into the array specified by <emphasis> 1148e9fcaa8aSmrginto</emphasis> 1149e9fcaa8aSmrg. It is intended for copying between, rather than within, keyboard 1150e9fcaa8aSmrgdescriptions, so it doesn’t check for overlaps. The same rules that apply to 1151e9fcaa8aSmrgthe <emphasis> 1152e9fcaa8aSmrgfrom</emphasis> 1153e9fcaa8aSmrg and <emphasis> 1154e9fcaa8aSmrginto</emphasis> 1155e9fcaa8aSmrg parameters in <emphasis> 1156e9fcaa8aSmrgXkbCopyKeyType</emphasis> 1157e9fcaa8aSmrg apply to each entry of the <emphasis> 1158e9fcaa8aSmrgfrom</emphasis> 1159e9fcaa8aSmrg and <emphasis> 1160e9fcaa8aSmrginto</emphasis> 1161e9fcaa8aSmrg arrays of <emphasis> 1162e9fcaa8aSmrgXkbCopyKeyTypes</emphasis> 1163e9fcaa8aSmrg. If any allocation errors occur while copying <emphasis> 1164e9fcaa8aSmrgfrom</emphasis> 1165e9fcaa8aSmrg to <emphasis> 1166e9fcaa8aSmrginto</emphasis> 1167e9fcaa8aSmrg, <emphasis> 1168e9fcaa8aSmrgXkbCopyKeyTypes</emphasis> 1169e9fcaa8aSmrg returns <emphasis> 1170e9fcaa8aSmrgBadAlloc</emphasis> 1171e9fcaa8aSmrg. Otherwise, <emphasis> 1172e9fcaa8aSmrgXkbCopyKeyTypes</emphasis> 1173e9fcaa8aSmrg copies <emphasis> 1174e9fcaa8aSmrgfrom</emphasis> 1175e9fcaa8aSmrg to <emphasis> 1176e9fcaa8aSmrginto</emphasis> 1177e9fcaa8aSmrg and returns <emphasis> 1178e9fcaa8aSmrgSuccess</emphasis> 1179e9fcaa8aSmrg. 1180e9fcaa8aSmrg</para> 1181e9fcaa8aSmrg 1182e9fcaa8aSmrg 1183e9fcaa8aSmrg</sect2> 1184e9fcaa8aSmrg</sect1> 1185e9fcaa8aSmrg<sect1 id='key_symbol_map'> 1186e9fcaa8aSmrg<title>Key Symbol Map</title> 1187e9fcaa8aSmrg 1188e9fcaa8aSmrg<para> 1189e9fcaa8aSmrgThe entire list of key symbols for the keyboard mapping is held in the 1190e9fcaa8aSmrg<emphasis> 1191e9fcaa8aSmrgsyms</emphasis> 1192e9fcaa8aSmrg field of the client map. Whereas the core keyboard mapping is a 1193e9fcaa8aSmrgtwo-dimensional array of <emphasis> 1194e9fcaa8aSmrgKeySyms</emphasis> 1195e9fcaa8aSmrg whose rows are indexed by keycode, the <emphasis> 1196e9fcaa8aSmrgsyms</emphasis> 1197e9fcaa8aSmrg field of Xkb is a linear list of <emphasis> 1198e9fcaa8aSmrgKeySyms</emphasis> 1199e9fcaa8aSmrg that needs to be indexed uniquely for each key. This section describes the key 1200e9fcaa8aSmrgsymbol map and the methods for determining the symbols bound to a key. 1201e9fcaa8aSmrg</para> 1202e9fcaa8aSmrg 1203e9fcaa8aSmrg 1204e9fcaa8aSmrg<para> 1205e9fcaa8aSmrgThe reason the <emphasis> 1206e9fcaa8aSmrgsyms</emphasis> 1207e9fcaa8aSmrg field is a linear list of <emphasis> 1208e9fcaa8aSmrgKeySyms</emphasis> 1209e9fcaa8aSmrg is to reduce the memory consumption associated with a keymap; because Xkb 1210e9fcaa8aSmrgallows individual keys to have multiple shift levels and a different number of 1211e9fcaa8aSmrggroups per key, a single two-dimensional array of <emphasis> 1212e9fcaa8aSmrgKeySyms</emphasis> 1213e9fcaa8aSmrg would potentially be very large and sparse. Instead, Xkb provides a small 1214e9fcaa8aSmrgtwo-dimensional array of <emphasis> 1215e9fcaa8aSmrgKeySyms</emphasis> 1216e9fcaa8aSmrg for each key. To store all of these individual arrays, Xkb concatenates each 1217e9fcaa8aSmrgarray together in the <emphasis> 1218e9fcaa8aSmrgsyms</emphasis> 1219e9fcaa8aSmrg field of the client map. 1220e9fcaa8aSmrg</para> 1221e9fcaa8aSmrg 1222e9fcaa8aSmrg 1223e9fcaa8aSmrg<para> 1224e9fcaa8aSmrgIn order to determine which <emphasis> 1225e9fcaa8aSmrgKeySyms</emphasis> 1226e9fcaa8aSmrg in the <emphasis> 1227e9fcaa8aSmrgsyms</emphasis> 1228e9fcaa8aSmrg field are associated with each keycode, the client map contains an array of 1229e9fcaa8aSmrgkey symbol mappings, held in the <emphasis> 1230e9fcaa8aSmrgkey_sym_map</emphasis> 1231e9fcaa8aSmrg field. The <emphasis> 1232e9fcaa8aSmrgkey_sym_map</emphasis> 1233e9fcaa8aSmrg field is an array of <emphasis> 1234e9fcaa8aSmrgXkbSymMapRec</emphasis> 1235e9fcaa8aSmrg structures indexed by keycode. The <emphasis> 1236e9fcaa8aSmrgkey_sym_map</emphasis> 1237e9fcaa8aSmrg array has <emphasis> 1238e9fcaa8aSmrgmin_key_code</emphasis> 1239e9fcaa8aSmrg unused entries at the start to allow direct indexing using a keycode. All 1240e9fcaa8aSmrgkeycodes falling between the minimum and maximum legal keycodes, inclusive, 1241e9fcaa8aSmrghave <emphasis> 1242e9fcaa8aSmrgkey_sym_map</emphasis> 1243e9fcaa8aSmrg arrays, whether or not any key actually yields that code. The <emphasis> 1244e9fcaa8aSmrgKeySymMapRec</emphasis> 1245e9fcaa8aSmrg structure is defined as follows: 1246e9fcaa8aSmrg</para> 1247e9fcaa8aSmrg 1248e9fcaa8aSmrg<para><programlisting> 1249e9fcaa8aSmrg#define XkbNumKbdGroups 4 1250e9fcaa8aSmrg#define XkbMaxKbdGroup (XkbNumKbdGroups-1) 1251e9fcaa8aSmrg</programlisting></para> 1252e9fcaa8aSmrg 1253e9fcaa8aSmrg<para><programlisting> 1254e9fcaa8aSmrgtypedef struct { /* map to keysyms for a single keycode */ 1255e9fcaa8aSmrg unsigned char kt_index[XkbNumKbdGroups]; /* key type index for each group */ 1256e9fcaa8aSmrg unsigned char group_info; /* # of groups and out of range group handling */ 1257e9fcaa8aSmrg unsigned char width; /* max # of shift levels for key */ 1258e9fcaa8aSmrg unsigned short offset; /* index to keysym table in <emphasis> syms</emphasis> array */ 1259e9fcaa8aSmrg} <emphasis>XkbSymMapRec</emphasis>, *XkbSymMapPtr; 1260e9fcaa8aSmrg</programlisting></para> 1261e9fcaa8aSmrg 1262e9fcaa8aSmrg<para> 1263e9fcaa8aSmrgThese fields are described in detail in the following sections. 1264e9fcaa8aSmrg</para> 1265e9fcaa8aSmrg 1266e9fcaa8aSmrg 1267e9fcaa8aSmrg<sect2 id='per_key_key_type_indices'> 1268e9fcaa8aSmrg<title>Per-Key Key Type Indices</title> 1269e9fcaa8aSmrg 1270e9fcaa8aSmrg<para> 1271e9fcaa8aSmrgThe <emphasis> 1272e9fcaa8aSmrgkt_index</emphasis> 1273e9fcaa8aSmrg array of the <emphasis> 1274e9fcaa8aSmrgXkbSymMapRec</emphasis> 1275e9fcaa8aSmrg structure contains the indices of the key types (see section 15.2) for each 1276e9fcaa8aSmrgpossible group of symbols associated with the key. To obtain the index of a key 1277e9fcaa8aSmrgtype or the pointer to a key type, Xkb provides the following macros, to access 1278e9fcaa8aSmrgthe key types: 1279e9fcaa8aSmrg</para> 1280e9fcaa8aSmrg 1281e9fcaa8aSmrg<note><para>The array of key types is of fixed width and is large enough to 1282e9fcaa8aSmrghold key types for the maximum legal number of groups (<emphasis> 1283e9fcaa8aSmrgXkbNumKbdGroups</emphasis> 1284e9fcaa8aSmrg, currently four); if a key has fewer than <emphasis> 1285e9fcaa8aSmrgXkbNumKbdGroups</emphasis> 1286e9fcaa8aSmrg groups, the extra key types are reported but ignored.</para></note> 1287e9fcaa8aSmrg 1288e9fcaa8aSmrg<informaltable frame='none'> 1289e9fcaa8aSmrg<tgroup cols='1'> 1290e9fcaa8aSmrg<colspec colsep='0'/> 1291e9fcaa8aSmrg<tbody> 1292e9fcaa8aSmrg <row rowsep='0'> 1293e9fcaa8aSmrg <entry role='functiondecl'> 1294e9fcaa8aSmrgint <emphasis> 1295e9fcaa8aSmrgXkbKeyTypeIndex</emphasis> 1296e9fcaa8aSmrg(<emphasis> 1297e9fcaa8aSmrgxkb, keycode, group</emphasis> 1298e9fcaa8aSmrg) /* macro*/ 1299e9fcaa8aSmrg </entry> 1300e9fcaa8aSmrg </row> 1301e9fcaa8aSmrg <row rowsep='0'> 1302e9fcaa8aSmrg <entry role='functionargdecl'> 1303e9fcaa8aSmrgXkbDescPtr <emphasis> 1304e9fcaa8aSmrgxkb</emphasis> 1305e9fcaa8aSmrg; /* Xkb description of interest */ 1306e9fcaa8aSmrg </entry> 1307e9fcaa8aSmrg </row> 1308e9fcaa8aSmrg <row rowsep='0'> 1309e9fcaa8aSmrg <entry role='functionargdecl'> 1310e9fcaa8aSmrgKeyCode <emphasis> 1311e9fcaa8aSmrgkeycode</emphasis> 1312e9fcaa8aSmrg; /* keycode of interest */ 1313e9fcaa8aSmrg </entry> 1314e9fcaa8aSmrg </row> 1315e9fcaa8aSmrg <row rowsep='0'> 1316e9fcaa8aSmrg <entry role='functionargdecl'> 1317e9fcaa8aSmrgint <emphasis> 1318e9fcaa8aSmrggroup</emphasis> 1319e9fcaa8aSmrg; /* group index */ 1320e9fcaa8aSmrg </entry> 1321e9fcaa8aSmrg</row> 1322e9fcaa8aSmrg</tbody> 1323e9fcaa8aSmrg</tgroup> 1324e9fcaa8aSmrg</informaltable> 1325e9fcaa8aSmrg 1326e9fcaa8aSmrg<para> 1327e9fcaa8aSmrg<emphasis> 1328e9fcaa8aSmrgXkbKeyTypeIndex</emphasis> 1329e9fcaa8aSmrg computes an index into the <emphasis> 1330e9fcaa8aSmrgtypes</emphasis> 1331e9fcaa8aSmrg vector of the client map in <emphasis> 1332e9fcaa8aSmrgxkb</emphasis> 1333e9fcaa8aSmrg from the given <emphasis> 1334e9fcaa8aSmrgkeycode</emphasis> 1335e9fcaa8aSmrg and <emphasis> 1336e9fcaa8aSmrggroup</emphasis> 1337e9fcaa8aSmrg index. 1338e9fcaa8aSmrg</para> 1339e9fcaa8aSmrg 1340e9fcaa8aSmrg 1341e9fcaa8aSmrg<informaltable frame='none'> 1342e9fcaa8aSmrg<tgroup cols='1'> 1343e9fcaa8aSmrg<colspec colsep='0'/> 1344e9fcaa8aSmrg<tbody> 1345e9fcaa8aSmrg <row rowsep='0'> 1346e9fcaa8aSmrg <entry role='functiondecl'> 1347e9fcaa8aSmrgXkbKeyTypePtr <emphasis> 1348e9fcaa8aSmrgXkbKeyType</emphasis> 1349e9fcaa8aSmrg(<emphasis> 1350e9fcaa8aSmrgxkb, keycode, group</emphasis> 1351e9fcaa8aSmrg) /* macro */ 1352e9fcaa8aSmrg </entry> 1353e9fcaa8aSmrg </row> 1354e9fcaa8aSmrg <row rowsep='0'> 1355e9fcaa8aSmrg <entry role='functionargdecl'> 1356e9fcaa8aSmrgXkbDescPtr <emphasis> 1357e9fcaa8aSmrgxkb</emphasis> 1358e9fcaa8aSmrg; /* Xkb description of interest */ 1359e9fcaa8aSmrg </entry> 1360e9fcaa8aSmrg </row> 1361e9fcaa8aSmrg <row rowsep='0'> 1362e9fcaa8aSmrg <entry role='functionargdecl'> 1363e9fcaa8aSmrgKeyCode <emphasis> 1364e9fcaa8aSmrgkeycode</emphasis> 1365e9fcaa8aSmrg; /* keycode of interest */ 1366e9fcaa8aSmrg </entry> 1367e9fcaa8aSmrg </row> 1368e9fcaa8aSmrg <row rowsep='0'> 1369e9fcaa8aSmrg <entry role='functionargdecl'> 1370e9fcaa8aSmrgint <emphasis> 1371e9fcaa8aSmrggroup</emphasis> 1372e9fcaa8aSmrg; /* group index */ 1373e9fcaa8aSmrg </entry> 1374e9fcaa8aSmrg</row> 1375e9fcaa8aSmrg</tbody> 1376e9fcaa8aSmrg</tgroup> 1377e9fcaa8aSmrg</informaltable> 1378e9fcaa8aSmrg 1379e9fcaa8aSmrg<para> 1380e9fcaa8aSmrg<emphasis> 1381e9fcaa8aSmrgXkbKeyType</emphasis> 1382e9fcaa8aSmrg returns a pointer to the key type in the <emphasis> 1383e9fcaa8aSmrgtypes</emphasis> 1384e9fcaa8aSmrg vector of the client map in <emphasis> 1385e9fcaa8aSmrgxkb</emphasis> 1386e9fcaa8aSmrg corresponding to the given <emphasis> 1387e9fcaa8aSmrgkeycode</emphasis> 1388e9fcaa8aSmrg and <emphasis> 1389e9fcaa8aSmrggroup</emphasis> 1390e9fcaa8aSmrg index. 1391e9fcaa8aSmrg</para> 1392e9fcaa8aSmrg 1393e9fcaa8aSmrg 1394e9fcaa8aSmrg</sect2> 1395e9fcaa8aSmrg<sect2 id='per_key_group_information'> 1396e9fcaa8aSmrg<title>Per-Key Group Information</title> 1397e9fcaa8aSmrg 1398e9fcaa8aSmrg<para> 1399e9fcaa8aSmrgThe <emphasis> 1400e9fcaa8aSmrggroup_info</emphasis> 1401e9fcaa8aSmrg field of an <emphasis> 1402e9fcaa8aSmrgXkbSymMapRec</emphasis> 1403e9fcaa8aSmrg is an encoded value containing the number of groups of symbols bound to the 1404e9fcaa8aSmrgkey as well as the specification of the treatment of out-of-range groups. It is 1405e9fcaa8aSmrglegal for a key to have zero groups, in which case it also has zero symbols and 1406e9fcaa8aSmrgall events from that key yield <emphasis> 1407e9fcaa8aSmrgNoSymbol</emphasis> 1408e9fcaa8aSmrg. To obtain the number of groups of symbols bound to the key, use <emphasis> 1409e9fcaa8aSmrgXkbKeyNumGroups</emphasis> 1410e9fcaa8aSmrg. To change the number of groups bound to a key, use <emphasis> 1411e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 1412e9fcaa8aSmrg (see section 15.3.6). To obtain a mask that determines the treatment of 1413e9fcaa8aSmrgout-of-range groups, use <emphasis> 1414e9fcaa8aSmrgXkbKeyGroupInfo</emphasis> 1415e9fcaa8aSmrg and <emphasis> 1416e9fcaa8aSmrgXkbOutOfRangeGroupInfo</emphasis> 1417e9fcaa8aSmrg. 1418e9fcaa8aSmrg</para> 1419e9fcaa8aSmrg 1420e9fcaa8aSmrg 1421e9fcaa8aSmrg<para> 1422e9fcaa8aSmrgThe keyboard controls (see Chapter 10) contain a <emphasis> 1423e9fcaa8aSmrggroups_wrap</emphasis> 1424e9fcaa8aSmrg field specifying the handling of illegal groups on a global basis. That is, 1425e9fcaa8aSmrgwhen the user performs an action causing the effective group to go out of the 1426e9fcaa8aSmrglegal range, the <emphasis> 1427e9fcaa8aSmrggroups_wrap</emphasis> 1428e9fcaa8aSmrg field specifies how to normalize the effective keyboard group to a group that 1429e9fcaa8aSmrgis legal for the keyboard as a whole, but there is no guarantee that the 1430e9fcaa8aSmrgnormalized group will be within the range of legal groups for any individual 1431e9fcaa8aSmrgkey. The per-key <emphasis> 1432e9fcaa8aSmrggroup_info</emphasis> 1433e9fcaa8aSmrg field specifies how a key treats a legal effective group if the key does not 1434e9fcaa8aSmrghave a type specified for the group of concern. For example, the <emphasis> 1435e9fcaa8aSmrgEnter</emphasis> 1436e9fcaa8aSmrg key usually has just one group defined. If the user performs an action causing 1437e9fcaa8aSmrgthe global keyboard group to change to <emphasis> 1438e9fcaa8aSmrgGroup2</emphasis> 1439e9fcaa8aSmrg, the <emphasis> 1440e9fcaa8aSmrggroup_info</emphasis> 1441e9fcaa8aSmrg field for the <emphasis> 1442e9fcaa8aSmrgEnter</emphasis> 1443e9fcaa8aSmrg key describes how to handle this situation. 1444e9fcaa8aSmrg</para> 1445e9fcaa8aSmrg 1446e9fcaa8aSmrg 1447e9fcaa8aSmrg<para> 1448e9fcaa8aSmrgOut-of-range groups for individual keys are mapped to a legal group using the 1449e9fcaa8aSmrgsame options as are used for the overall keyboard group. The particular type of 1450e9fcaa8aSmrgmapping used is controlled by the bits set in the <emphasis> 1451e9fcaa8aSmrggroup_info</emphasis> 1452e9fcaa8aSmrg flag, as shown in Table 15.2. See section 10.7.1 for more details on the 1453e9fcaa8aSmrgnormalization methods in this table. 1454e9fcaa8aSmrg</para> 1455e9fcaa8aSmrg 1456e9fcaa8aSmrg<table frame='none'> 1457e9fcaa8aSmrg<title>group_info Range Normalization</title> 1458e9fcaa8aSmrg<tgroup cols='2'> 1459e9fcaa8aSmrg<colspec colsep='0'/> 1460e9fcaa8aSmrg<colspec colsep='0'/> 1461e9fcaa8aSmrg<thead> 1462e9fcaa8aSmrg<row rowsep='0'> 1463e9fcaa8aSmrg <entry>Bits set in group_info</entry> 1464e9fcaa8aSmrg <entry>Normalization method</entry> 1465e9fcaa8aSmrg </row> 1466e9fcaa8aSmrg</thead> 1467e9fcaa8aSmrg<tbody> 1468e9fcaa8aSmrg <row rowsep='0'> 1469e9fcaa8aSmrg <entry>XkbRedirectIntoRange</entry> 1470e9fcaa8aSmrg <entry>XkbRedirectIntoRange</entry> 1471e9fcaa8aSmrg </row> 1472e9fcaa8aSmrg <row rowsep='0'> 1473e9fcaa8aSmrg <entry>XkbClampIntoRange</entry> 1474e9fcaa8aSmrg <entry>XkbClampIntoRange</entry> 1475e9fcaa8aSmrg </row> 1476e9fcaa8aSmrg <row rowsep='0'> 1477e9fcaa8aSmrg <entry>none of the above</entry> 1478e9fcaa8aSmrg <entry>XkbWrapIntoRange</entry> 1479e9fcaa8aSmrg </row> 1480e9fcaa8aSmrg</tbody> 1481e9fcaa8aSmrg</tgroup> 1482e9fcaa8aSmrg</table> 1483e9fcaa8aSmrg 1484e9fcaa8aSmrg<para> 1485e9fcaa8aSmrgXkb provides the following macros to access group information: 1486e9fcaa8aSmrg</para> 1487e9fcaa8aSmrg 1488e9fcaa8aSmrg<informaltable frame='none'> 1489e9fcaa8aSmrg<tgroup cols='1'> 1490e9fcaa8aSmrg<colspec colsep='0'/> 1491e9fcaa8aSmrg<tbody> 1492e9fcaa8aSmrg <row rowsep='0'> 1493e9fcaa8aSmrg <entry role='functiondecl'> 1494e9fcaa8aSmrgint <emphasis> 1495e9fcaa8aSmrgXkbKeyNumGroups</emphasis> 1496e9fcaa8aSmrg(<emphasis> 1497e9fcaa8aSmrgxkb, keycode</emphasis> 1498e9fcaa8aSmrg) /* macro */ 1499e9fcaa8aSmrg </entry> 1500e9fcaa8aSmrg </row> 1501e9fcaa8aSmrg <row rowsep='0'> 1502e9fcaa8aSmrg <entry role='functionargdecl'> 1503e9fcaa8aSmrgXkbDescPtr <emphasis> 1504e9fcaa8aSmrgxkb</emphasis> 1505e9fcaa8aSmrg; /* Xkb description of interest */ 1506e9fcaa8aSmrg </entry> 1507e9fcaa8aSmrg </row> 1508e9fcaa8aSmrg <row rowsep='0'> 1509e9fcaa8aSmrg <entry role='functionargdecl'> 1510e9fcaa8aSmrgKeyCode <emphasis> 1511e9fcaa8aSmrgkeycode</emphasis> 1512e9fcaa8aSmrg; /* keycode of interest */ 1513e9fcaa8aSmrg </entry> 1514e9fcaa8aSmrg</row> 1515e9fcaa8aSmrg</tbody> 1516e9fcaa8aSmrg</tgroup> 1517e9fcaa8aSmrg</informaltable> 1518e9fcaa8aSmrg 1519e9fcaa8aSmrg<para> 1520e9fcaa8aSmrg<emphasis> 1521e9fcaa8aSmrgXkbKeyNumGroups</emphasis> 1522e9fcaa8aSmrg returns the number of groups of symbols bound to the key corresponding to 1523e9fcaa8aSmrg<emphasis> 1524e9fcaa8aSmrgkeycode</emphasis> 1525e9fcaa8aSmrg. 1526e9fcaa8aSmrg</para> 1527e9fcaa8aSmrg 1528e9fcaa8aSmrg 1529e9fcaa8aSmrg<informaltable frame='none'> 1530e9fcaa8aSmrg<tgroup cols='1'> 1531e9fcaa8aSmrg<colspec colsep='0'/> 1532e9fcaa8aSmrg<tbody> 1533e9fcaa8aSmrg <row rowsep='0'> 1534e9fcaa8aSmrg <entry role='functiondecl'> 1535e9fcaa8aSmrgunsigned char <emphasis> 1536e9fcaa8aSmrgXkbKeyGroupInfo</emphasis> 1537e9fcaa8aSmrg(<emphasis> 1538e9fcaa8aSmrgxkb, keycode</emphasis> 1539e9fcaa8aSmrg) /*macro */ 1540e9fcaa8aSmrg </entry> 1541e9fcaa8aSmrg </row> 1542e9fcaa8aSmrg <row rowsep='0'> 1543e9fcaa8aSmrg <entry role='functionargdecl'> 1544e9fcaa8aSmrgXkbDescPtr <emphasis> 1545e9fcaa8aSmrgxkb</emphasis> 1546e9fcaa8aSmrg; /* Xkb description of interest */ 1547e9fcaa8aSmrg </entry> 1548e9fcaa8aSmrg </row> 1549e9fcaa8aSmrg <row rowsep='0'> 1550e9fcaa8aSmrg <entry role='functionargdecl'> 1551e9fcaa8aSmrgKeyCode <emphasis> 1552e9fcaa8aSmrgkeycode</emphasis> 1553e9fcaa8aSmrg; /* keycode of interest */ 1554e9fcaa8aSmrg </entry> 1555e9fcaa8aSmrg</row> 1556e9fcaa8aSmrg</tbody> 1557e9fcaa8aSmrg</tgroup> 1558e9fcaa8aSmrg</informaltable> 1559e9fcaa8aSmrg 1560e9fcaa8aSmrg<para> 1561e9fcaa8aSmrg<emphasis> 1562e9fcaa8aSmrgXkbKeyGroupInfo</emphasis> 1563e9fcaa8aSmrg returns the <emphasis> 1564e9fcaa8aSmrggroup_info</emphasis> 1565e9fcaa8aSmrg field from the <emphasis> 1566e9fcaa8aSmrgXkbSymMapRec</emphasis> 1567e9fcaa8aSmrg structure associated with the key corresponding to <emphasis> 1568e9fcaa8aSmrgkeycode</emphasis> 1569e9fcaa8aSmrg. 1570e9fcaa8aSmrg</para> 1571e9fcaa8aSmrg 1572e9fcaa8aSmrg 1573e9fcaa8aSmrg<informaltable frame='none'> 1574e9fcaa8aSmrg<tgroup cols='1'> 1575e9fcaa8aSmrg<colspec colsep='0'/> 1576e9fcaa8aSmrg<tbody> 1577e9fcaa8aSmrg <row rowsep='0'> 1578e9fcaa8aSmrg <entry role='functiondecl'> 1579e9fcaa8aSmrgunsigned char <emphasis> 1580e9fcaa8aSmrgXkbOutOfRangeGroupInfo</emphasis> 1581e9fcaa8aSmrg(<emphasis> 1582e9fcaa8aSmrggrp_inf</emphasis> 1583e9fcaa8aSmrg) /* macro */ 1584e9fcaa8aSmrg </entry> 1585e9fcaa8aSmrg </row> 1586e9fcaa8aSmrg <row rowsep='0'> 1587e9fcaa8aSmrg <entry role='functionargdecl'> 1588e9fcaa8aSmrgunsigned char <emphasis> 1589e9fcaa8aSmrggrp_inf</emphasis> 1590e9fcaa8aSmrg; /* group_info field of <emphasis> 1591e9fcaa8aSmrgXkbSymMapRec</emphasis> 1592e9fcaa8aSmrg */ 1593e9fcaa8aSmrg </entry> 1594e9fcaa8aSmrg</row> 1595e9fcaa8aSmrg</tbody> 1596e9fcaa8aSmrg</tgroup> 1597e9fcaa8aSmrg</informaltable> 1598e9fcaa8aSmrg 1599e9fcaa8aSmrg<para> 1600e9fcaa8aSmrg<emphasis> 1601e9fcaa8aSmrgXkbOutOfRangeGroupInfo</emphasis> 1602e9fcaa8aSmrg returns only the out-of-range processing information from the <emphasis> 1603e9fcaa8aSmrggroup_info</emphasis> 1604e9fcaa8aSmrg field of an <emphasis> 1605e9fcaa8aSmrgXkbSymMapRec</emphasis> 1606e9fcaa8aSmrg structure. 1607e9fcaa8aSmrg</para> 1608e9fcaa8aSmrg 1609e9fcaa8aSmrg 1610e9fcaa8aSmrg<informaltable frame='none'> 1611e9fcaa8aSmrg<tgroup cols='1'> 1612e9fcaa8aSmrg<colspec colsep='0'/> 1613e9fcaa8aSmrg<tbody> 1614e9fcaa8aSmrg <row rowsep='0'> 1615e9fcaa8aSmrg <entry role='functiondecl'> 1616e9fcaa8aSmrgunsigned char <emphasis> 1617e9fcaa8aSmrgXkbOutOfRangeGroupNumber</emphasis> 1618e9fcaa8aSmrg(<emphasis> 1619e9fcaa8aSmrggrp_inf</emphasis> 1620e9fcaa8aSmrg) /* macro */ 1621e9fcaa8aSmrg </entry> 1622e9fcaa8aSmrg </row> 1623e9fcaa8aSmrg <row rowsep='0'> 1624e9fcaa8aSmrg <entry role='functionargdecl'> 1625e9fcaa8aSmrgunsigned char <emphasis> 1626e9fcaa8aSmrggrp_inf</emphasis> 1627e9fcaa8aSmrg; /* group_info field of <emphasis> 1628e9fcaa8aSmrgXkbSymMapRec</emphasis> 1629e9fcaa8aSmrg */ 1630e9fcaa8aSmrg </entry> 1631e9fcaa8aSmrg</row> 1632e9fcaa8aSmrg</tbody> 1633e9fcaa8aSmrg</tgroup> 1634e9fcaa8aSmrg</informaltable> 1635e9fcaa8aSmrg 1636e9fcaa8aSmrg<para> 1637e9fcaa8aSmrg<emphasis> 1638e9fcaa8aSmrgXkbOutOfRangeGroupNumber</emphasis> 1639e9fcaa8aSmrg returns the out-of-range group number, represented as a group index, from the 1640e9fcaa8aSmrg<emphasis> 1641e9fcaa8aSmrggroup_info</emphasis> 1642e9fcaa8aSmrg field of an <emphasis> 1643e9fcaa8aSmrgXkbSymMapRec</emphasis> 1644e9fcaa8aSmrg structure. 1645e9fcaa8aSmrg</para> 1646e9fcaa8aSmrg 1647e9fcaa8aSmrg 1648e9fcaa8aSmrg</sect2> 1649e9fcaa8aSmrg<sect2 id='key_width'> 1650e9fcaa8aSmrg<title>Key Width</title> 1651e9fcaa8aSmrg 1652e9fcaa8aSmrg<para> 1653e9fcaa8aSmrgThe maximum number of shift levels for a type is also referred to as the width 1654e9fcaa8aSmrgof a key type. The <emphasis> 1655e9fcaa8aSmrgwidth</emphasis> 1656e9fcaa8aSmrg field of the <emphasis> 1657e9fcaa8aSmrgkey_sym_map</emphasis> 1658e9fcaa8aSmrg entry for a key contains the width of the widest type associated with the key. 1659e9fcaa8aSmrgThe <emphasis> 1660e9fcaa8aSmrgwidth </emphasis> 1661e9fcaa8aSmrgfield cannot be explicitly changed; it is updated automatically whenever the 1662e9fcaa8aSmrgsymbols or set of types bound to a key are changed. 1663e9fcaa8aSmrg</para> 1664e9fcaa8aSmrg 1665e9fcaa8aSmrg 1666e9fcaa8aSmrg</sect2> 1667e9fcaa8aSmrg<sect2 id='offset_in_to_the_symbol_map'> 1668e9fcaa8aSmrg<title>Offset in to the Symbol Map</title> 1669e9fcaa8aSmrg 1670e9fcaa8aSmrg<para> 1671e9fcaa8aSmrgThe key width and number of groups associated with a key are used to form a 1672e9fcaa8aSmrgsmall two-dimensional array of <emphasis> 1673e9fcaa8aSmrgKeySyms</emphasis> 1674e9fcaa8aSmrg for a key. This array may be different sizes for different keys. The array for 1675e9fcaa8aSmrga single key is stored as a linear list, in row-major order. The arrays for all 1676e9fcaa8aSmrgof the keys are stored in the <emphasis> 1677e9fcaa8aSmrgsyms</emphasis> 1678e9fcaa8aSmrg field of the client map. There is one row for each group associated with a key 1679e9fcaa8aSmrgand one column for each level. The index corresponding to a given group and 1680e9fcaa8aSmrgshift level is computed as: 1681e9fcaa8aSmrg</para> 1682e9fcaa8aSmrg 1683e9fcaa8aSmrg<literallayout> 1684e9fcaa8aSmrg idx = group_index * key_width + shift_level 1685e9fcaa8aSmrg</literallayout> 1686e9fcaa8aSmrg 1687e9fcaa8aSmrg<para> 1688e9fcaa8aSmrgThe <emphasis> 1689e9fcaa8aSmrgoffset</emphasis> 1690e9fcaa8aSmrg field of the <emphasis> 1691e9fcaa8aSmrgkey_sym_map</emphasis> 1692e9fcaa8aSmrg entry for a key is used to access the beginning of the array. 1693e9fcaa8aSmrg</para> 1694e9fcaa8aSmrg 1695e9fcaa8aSmrg 1696e9fcaa8aSmrg<para> 1697e9fcaa8aSmrgXkb provides the following macros for accessing the <emphasis> 1698e9fcaa8aSmrgwidth</emphasis> 1699e9fcaa8aSmrg and <emphasis> 1700e9fcaa8aSmrgoffset</emphasis> 1701e9fcaa8aSmrg for individual keys, as well as macros for accessing the two-dimensional array 1702e9fcaa8aSmrgof symbols bound to the key: 1703e9fcaa8aSmrg</para> 1704e9fcaa8aSmrg 1705e9fcaa8aSmrg<informaltable frame='none'> 1706e9fcaa8aSmrg<tgroup cols='1'> 1707e9fcaa8aSmrg<colspec colsep='0'/> 1708e9fcaa8aSmrg<tbody> 1709e9fcaa8aSmrg <row rowsep='0'> 1710e9fcaa8aSmrg <entry role='functiondecl'> 1711e9fcaa8aSmrgint <emphasis> 1712e9fcaa8aSmrgXkbKeyGroupsWidth</emphasis> 1713e9fcaa8aSmrg(<emphasis> 1714e9fcaa8aSmrgxkb, keycode</emphasis> 1715e9fcaa8aSmrg) /* macro */ 1716e9fcaa8aSmrg </entry> 1717e9fcaa8aSmrg </row> 1718e9fcaa8aSmrg <row rowsep='0'> 1719e9fcaa8aSmrg <entry role='functionargdecl'> 1720e9fcaa8aSmrgXkbDescPtr <emphasis> 1721e9fcaa8aSmrgxkb</emphasis> 1722e9fcaa8aSmrg; /* Xkb description of interest */ 1723e9fcaa8aSmrg </entry> 1724e9fcaa8aSmrg </row> 1725e9fcaa8aSmrg <row rowsep='0'> 1726e9fcaa8aSmrg <entry role='functionargdecl'> 1727e9fcaa8aSmrgKeyCode <emphasis> 1728e9fcaa8aSmrgkeycode</emphasis> 1729e9fcaa8aSmrg; /* keycode of interest */ 1730e9fcaa8aSmrg </entry> 1731e9fcaa8aSmrg</row> 1732e9fcaa8aSmrg</tbody> 1733e9fcaa8aSmrg</tgroup> 1734e9fcaa8aSmrg</informaltable> 1735e9fcaa8aSmrg 1736e9fcaa8aSmrg<para> 1737e9fcaa8aSmrg<emphasis> 1738e9fcaa8aSmrgXkbKeyGroupsWidth</emphasis> 1739e9fcaa8aSmrg computes the maximum width associated with the key corresponding to <emphasis> 1740e9fcaa8aSmrgkeycode</emphasis> 1741e9fcaa8aSmrg. 1742e9fcaa8aSmrg</para> 1743e9fcaa8aSmrg 1744e9fcaa8aSmrg 1745e9fcaa8aSmrg<informaltable frame='none'> 1746e9fcaa8aSmrg<tgroup cols='1'> 1747e9fcaa8aSmrg<colspec colsep='0'/> 1748e9fcaa8aSmrg<tbody> 1749e9fcaa8aSmrg <row rowsep='0'> 1750e9fcaa8aSmrg <entry role='functiondecl'> 1751e9fcaa8aSmrgint <emphasis> 1752e9fcaa8aSmrgXkbKeyGroupWidth</emphasis> 1753e9fcaa8aSmrg(<emphasis> 1754e9fcaa8aSmrgxkb, keycode, grp</emphasis> 1755e9fcaa8aSmrg) /* macro */ 1756e9fcaa8aSmrg </entry> 1757e9fcaa8aSmrg </row> 1758e9fcaa8aSmrg <row rowsep='0'> 1759e9fcaa8aSmrg <entry role='functionargdecl'> 1760e9fcaa8aSmrgXkbDescPtr <emphasis> 1761e9fcaa8aSmrgxkb</emphasis> 1762e9fcaa8aSmrg; /* Xkb description of interest */ 1763e9fcaa8aSmrg </entry> 1764e9fcaa8aSmrg </row> 1765e9fcaa8aSmrg <row rowsep='0'> 1766e9fcaa8aSmrg <entry role='functionargdecl'> 1767e9fcaa8aSmrgKeyCode <emphasis> 1768e9fcaa8aSmrgkeycode</emphasis> 1769e9fcaa8aSmrg; /* keycode of interest */ 1770e9fcaa8aSmrg </entry> 1771e9fcaa8aSmrg </row> 1772e9fcaa8aSmrg <row rowsep='0'> 1773e9fcaa8aSmrg <entry role='functionargdecl'> 1774e9fcaa8aSmrgint <emphasis> 1775e9fcaa8aSmrggrp</emphasis> 1776e9fcaa8aSmrg; /* group of interest */ 1777e9fcaa8aSmrg </entry> 1778e9fcaa8aSmrg</row> 1779e9fcaa8aSmrg</tbody> 1780e9fcaa8aSmrg</tgroup> 1781e9fcaa8aSmrg</informaltable> 1782e9fcaa8aSmrg 1783e9fcaa8aSmrg<para> 1784e9fcaa8aSmrg<emphasis> 1785e9fcaa8aSmrgXkbKeyGroupWidth</emphasis> 1786e9fcaa8aSmrg computes the width of the type associated with the group <emphasis> 1787e9fcaa8aSmrggrp</emphasis> 1788e9fcaa8aSmrg for the key corresponding to <emphasis> 1789e9fcaa8aSmrgkeycode</emphasis> 1790e9fcaa8aSmrg. 1791e9fcaa8aSmrg</para> 1792e9fcaa8aSmrg 1793e9fcaa8aSmrg 1794e9fcaa8aSmrg<informaltable frame='none'> 1795e9fcaa8aSmrg<tgroup cols='1'> 1796e9fcaa8aSmrg<colspec colsep='0'/> 1797e9fcaa8aSmrg<tbody> 1798e9fcaa8aSmrg <row rowsep='0'> 1799e9fcaa8aSmrg <entry role='functiondecl'> 1800e9fcaa8aSmrgint <emphasis> 1801e9fcaa8aSmrgXkbKeySymsOffset</emphasis> 1802e9fcaa8aSmrg(<emphasis> 1803e9fcaa8aSmrgxkb, keycode</emphasis> 1804e9fcaa8aSmrg) /* macro */ 1805e9fcaa8aSmrg </entry> 1806e9fcaa8aSmrg </row> 1807e9fcaa8aSmrg <row rowsep='0'> 1808e9fcaa8aSmrg <entry role='functionargdecl'> 1809e9fcaa8aSmrgXkbDescPtr <emphasis> 1810e9fcaa8aSmrgxkb</emphasis> 1811e9fcaa8aSmrg; /* Xkb description of interest */ 1812e9fcaa8aSmrg </entry> 1813e9fcaa8aSmrg </row> 1814e9fcaa8aSmrg <row rowsep='0'> 1815e9fcaa8aSmrg <entry role='functionargdecl'> 1816e9fcaa8aSmrgKeyCode <emphasis> 1817e9fcaa8aSmrgkeycode</emphasis> 1818e9fcaa8aSmrg; /* keycode of interest */ 1819e9fcaa8aSmrg </entry> 1820e9fcaa8aSmrg</row> 1821e9fcaa8aSmrg</tbody> 1822e9fcaa8aSmrg</tgroup> 1823e9fcaa8aSmrg</informaltable> 1824e9fcaa8aSmrg 1825e9fcaa8aSmrg<para> 1826e9fcaa8aSmrg<emphasis> 1827e9fcaa8aSmrgXkbKeySymsOffset</emphasis> 1828e9fcaa8aSmrg returns the offset of the two-dimensional array of keysyms for the key 1829e9fcaa8aSmrgcorresponding to <emphasis> 1830e9fcaa8aSmrgkeycode</emphasis> 1831e9fcaa8aSmrg. 1832e9fcaa8aSmrg</para> 1833e9fcaa8aSmrg 1834e9fcaa8aSmrg 1835e9fcaa8aSmrg<informaltable frame='none'> 1836e9fcaa8aSmrg<tgroup cols='1'> 1837e9fcaa8aSmrg<colspec colsep='0'/> 1838e9fcaa8aSmrg<tbody> 1839e9fcaa8aSmrg <row rowsep='0'> 1840e9fcaa8aSmrg <entry role='functiondecl'> 1841e9fcaa8aSmrgint <emphasis> 1842e9fcaa8aSmrgXkbKeyNumSyms</emphasis> 1843e9fcaa8aSmrg(<emphasis> 1844e9fcaa8aSmrgxkb, keycode</emphasis> 1845e9fcaa8aSmrg) /* macro */ 1846e9fcaa8aSmrg </entry> 1847e9fcaa8aSmrg </row> 1848e9fcaa8aSmrg <row rowsep='0'> 1849e9fcaa8aSmrg <entry role='functionargdecl'> 1850e9fcaa8aSmrgXkbDescPtr <emphasis> 1851e9fcaa8aSmrgxkb</emphasis> 1852e9fcaa8aSmrg; /* Xkb description of interest */ 1853e9fcaa8aSmrg </entry> 1854e9fcaa8aSmrg </row> 1855e9fcaa8aSmrg <row rowsep='0'> 1856e9fcaa8aSmrg <entry role='functionargdecl'> 1857e9fcaa8aSmrgKeyCode <emphasis> 1858e9fcaa8aSmrgkeycode</emphasis> 1859e9fcaa8aSmrg; /* keycode of interest */ 1860e9fcaa8aSmrg </entry> 1861e9fcaa8aSmrg</row> 1862e9fcaa8aSmrg</tbody> 1863e9fcaa8aSmrg</tgroup> 1864e9fcaa8aSmrg</informaltable> 1865e9fcaa8aSmrg 1866e9fcaa8aSmrg<para> 1867e9fcaa8aSmrg<emphasis> 1868e9fcaa8aSmrgXkbKeyNumSyms</emphasis> 1869e9fcaa8aSmrg returns the total number of keysyms for the key corresponding to <emphasis> 1870e9fcaa8aSmrgkeycode</emphasis> 1871e9fcaa8aSmrg. 1872e9fcaa8aSmrg</para> 1873e9fcaa8aSmrg 1874e9fcaa8aSmrg 1875e9fcaa8aSmrg<informaltable frame='none'> 1876e9fcaa8aSmrg<tgroup cols='1'> 1877e9fcaa8aSmrg<colspec colsep='0'/> 1878e9fcaa8aSmrg<tbody> 1879e9fcaa8aSmrg <row rowsep='0'> 1880e9fcaa8aSmrg <entry role='functiondecl'> 1881e9fcaa8aSmrgKeySym * <emphasis> 1882e9fcaa8aSmrgXkbKeySymsPtr</emphasis> 1883e9fcaa8aSmrg(<emphasis> 1884e9fcaa8aSmrgxkb, keycode</emphasis> 1885e9fcaa8aSmrg) /* macro */ 1886e9fcaa8aSmrg </entry> 1887e9fcaa8aSmrg </row> 1888e9fcaa8aSmrg <row rowsep='0'> 1889e9fcaa8aSmrg <entry role='functionargdecl'> 1890e9fcaa8aSmrgXkbDescPtr <emphasis> 1891e9fcaa8aSmrgxkb</emphasis> 1892e9fcaa8aSmrg; /* Xkb description of interest */ 1893e9fcaa8aSmrg </entry> 1894e9fcaa8aSmrg </row> 1895e9fcaa8aSmrg <row rowsep='0'> 1896e9fcaa8aSmrg <entry role='functionargdecl'> 1897e9fcaa8aSmrgKeyCode <emphasis> 1898e9fcaa8aSmrgkeycode</emphasis> 1899e9fcaa8aSmrg; /* keycode of interest */ 1900e9fcaa8aSmrg </entry> 1901e9fcaa8aSmrg</row> 1902e9fcaa8aSmrg</tbody> 1903e9fcaa8aSmrg</tgroup> 1904e9fcaa8aSmrg</informaltable> 1905e9fcaa8aSmrg 1906e9fcaa8aSmrg<para> 1907e9fcaa8aSmrg<emphasis> 1908e9fcaa8aSmrgXkbKeySymsPtr</emphasis> 1909e9fcaa8aSmrg returns the pointer to the two-dimensional array of keysyms for the key 1910e9fcaa8aSmrgcorresponding to <emphasis> 1911e9fcaa8aSmrgkeycode</emphasis> 1912e9fcaa8aSmrg. 1913e9fcaa8aSmrg</para> 1914e9fcaa8aSmrg 1915e9fcaa8aSmrg 1916e9fcaa8aSmrg<informaltable frame='none'> 1917e9fcaa8aSmrg<tgroup cols='1'> 1918e9fcaa8aSmrg<colspec colsep='0'/> 1919e9fcaa8aSmrg<tbody> 1920e9fcaa8aSmrg <row rowsep='0'> 1921e9fcaa8aSmrg <entry role='functiondecl'> 1922e9fcaa8aSmrgKeySym <emphasis> 1923e9fcaa8aSmrgXkbKeySymEntry</emphasis> 1924e9fcaa8aSmrg(<emphasis> 1925e9fcaa8aSmrgxkb, keycode, shift, grp</emphasis> 1926e9fcaa8aSmrg) /* macro */ 1927e9fcaa8aSmrg </entry> 1928e9fcaa8aSmrg </row> 1929e9fcaa8aSmrg <row rowsep='0'> 1930e9fcaa8aSmrg <entry role='functionargdecl'> 1931e9fcaa8aSmrgXkbDescPtr <emphasis> 1932e9fcaa8aSmrgxkb</emphasis> 1933e9fcaa8aSmrg; /* Xkb description of interest */ 1934e9fcaa8aSmrg </entry> 1935e9fcaa8aSmrg </row> 1936e9fcaa8aSmrg <row rowsep='0'> 1937e9fcaa8aSmrg <entry role='functionargdecl'> 1938e9fcaa8aSmrgKeyCode <emphasis> 1939e9fcaa8aSmrgkeycode</emphasis> 1940e9fcaa8aSmrg; /* keycode of interest */ 1941e9fcaa8aSmrg </entry> 1942e9fcaa8aSmrg </row> 1943e9fcaa8aSmrg <row rowsep='0'> 1944e9fcaa8aSmrg <entry role='functionargdecl'> 1945e9fcaa8aSmrgint <emphasis> 1946e9fcaa8aSmrgshift</emphasis> 1947e9fcaa8aSmrg; /* shift level of interest */ 1948e9fcaa8aSmrg </entry> 1949e9fcaa8aSmrg </row> 1950e9fcaa8aSmrg <row rowsep='0'> 1951e9fcaa8aSmrg <entry role='functionargdecl'> 1952e9fcaa8aSmrgint <emphasis> 1953e9fcaa8aSmrggrp</emphasis> 1954e9fcaa8aSmrg; /* group of interest */ 1955e9fcaa8aSmrg </entry> 1956e9fcaa8aSmrg</row> 1957e9fcaa8aSmrg</tbody> 1958e9fcaa8aSmrg</tgroup> 1959e9fcaa8aSmrg</informaltable> 1960e9fcaa8aSmrg 1961e9fcaa8aSmrg<para> 1962e9fcaa8aSmrg<emphasis> 1963e9fcaa8aSmrgXkbKeySymEntry</emphasis> 1964e9fcaa8aSmrg returns the <emphasis> 1965e9fcaa8aSmrgkeysym</emphasis> 1966e9fcaa8aSmrg corresponding to shift level <emphasis> 1967e9fcaa8aSmrgshift</emphasis> 1968e9fcaa8aSmrg and group <emphasis> 1969e9fcaa8aSmrggrp</emphasis> 1970e9fcaa8aSmrg from the two-dimensional array of keysyms for the key corresponding to 1971e9fcaa8aSmrg<emphasis> 1972e9fcaa8aSmrgkeycode</emphasis> 1973e9fcaa8aSmrg</para> 1974e9fcaa8aSmrg 1975e9fcaa8aSmrg 1976e9fcaa8aSmrg</sect2> 1977e9fcaa8aSmrg<sect2 id='getting_the_symbol_map_for_keys_from_the_server'> 1978e9fcaa8aSmrg<title>Getting the Symbol Map for Keys from the Server</title> 1979e9fcaa8aSmrg 1980e9fcaa8aSmrg<para> 1981e9fcaa8aSmrgTo obtain the symbols for a subset of the keys in a keyboard description, use 1982e9fcaa8aSmrg<emphasis> 1983e9fcaa8aSmrgXkbGetKeySyms</emphasis> 1984e9fcaa8aSmrg: 1985e9fcaa8aSmrg</para> 1986e9fcaa8aSmrg 1987e9fcaa8aSmrg<informaltable frame='none'> 1988e9fcaa8aSmrg<tgroup cols='1'> 1989e9fcaa8aSmrg<colspec colsep='0'/> 1990e9fcaa8aSmrg<tbody> 1991e9fcaa8aSmrg <row rowsep='0'> 1992e9fcaa8aSmrg <entry role='functiondecl'> 1993e9fcaa8aSmrgStatus <emphasis> 1994e9fcaa8aSmrgXkbGetKeySyms</emphasis> 1995e9fcaa8aSmrg(<emphasis> 1996e9fcaa8aSmrgdpy</emphasis> 1997e9fcaa8aSmrg,<emphasis> 1998e9fcaa8aSmrg first</emphasis> 1999e9fcaa8aSmrg, <emphasis> 2000e9fcaa8aSmrgnum</emphasis> 2001e9fcaa8aSmrg,<emphasis> 2002e9fcaa8aSmrg xkb</emphasis> 2003e9fcaa8aSmrg) 2004e9fcaa8aSmrg </entry> 2005e9fcaa8aSmrg </row> 2006e9fcaa8aSmrg <row rowsep='0'> 2007e9fcaa8aSmrg <entry role='functionargdecl'> 2008e9fcaa8aSmrgDisplay *<emphasis> 2009e9fcaa8aSmrg dpy</emphasis> 2010e9fcaa8aSmrg; /* connection to X server */ 2011e9fcaa8aSmrg </entry> 2012e9fcaa8aSmrg </row> 2013e9fcaa8aSmrg <row rowsep='0'> 2014e9fcaa8aSmrg <entry role='functionargdecl'> 2015e9fcaa8aSmrgunsigned int<emphasis> 2016e9fcaa8aSmrg first</emphasis> 2017e9fcaa8aSmrg; /* keycode of first key to get */ 2018e9fcaa8aSmrg </entry> 2019e9fcaa8aSmrg </row> 2020e9fcaa8aSmrg <row rowsep='0'> 2021e9fcaa8aSmrg <entry role='functionargdecl'> 2022e9fcaa8aSmrgunsigned int <emphasis> 2023e9fcaa8aSmrg num</emphasis> 2024e9fcaa8aSmrg; /* number of keycodes for which syms desired */ 2025e9fcaa8aSmrg </entry> 2026e9fcaa8aSmrg </row> 2027e9fcaa8aSmrg <row rowsep='0'> 2028e9fcaa8aSmrg <entry role='functionargdecl'> 2029e9fcaa8aSmrgXkbDescPtr <emphasis> 2030e9fcaa8aSmrgxkb</emphasis> 2031e9fcaa8aSmrg; /* Xkb description to be updated */ 2032e9fcaa8aSmrg </entry> 2033e9fcaa8aSmrg</row> 2034e9fcaa8aSmrg</tbody> 2035e9fcaa8aSmrg</tgroup> 2036e9fcaa8aSmrg</informaltable> 2037e9fcaa8aSmrg 2038e9fcaa8aSmrg<para> 2039e9fcaa8aSmrg<emphasis> 2040e9fcaa8aSmrgXkbGetKeySyms</emphasis> 2041e9fcaa8aSmrg sends a request to the server to obtain the set of keysyms bound to <emphasis> 2042e9fcaa8aSmrgnum</emphasis> 2043e9fcaa8aSmrg keys starting with the key whose keycode is <emphasis> 2044e9fcaa8aSmrgfirst</emphasis> 2045e9fcaa8aSmrg. It waits for a reply and returns the keysyms in the <emphasis> 2046e9fcaa8aSmrgmap.syms</emphasis> 2047e9fcaa8aSmrg field of <emphasis> 2048e9fcaa8aSmrgxkb</emphasis> 2049e9fcaa8aSmrg. If successful, <emphasis> 2050e9fcaa8aSmrgXkbGetKeySyms</emphasis> 2051e9fcaa8aSmrg returns <emphasis> 2052e9fcaa8aSmrgSuccess</emphasis> 2053e9fcaa8aSmrg. The <emphasis> 2054e9fcaa8aSmrgxkb</emphasis> 2055e9fcaa8aSmrg parameter must be a pointer to a valid Xkb keyboard description. 2056e9fcaa8aSmrg</para> 2057e9fcaa8aSmrg 2058e9fcaa8aSmrg 2059e9fcaa8aSmrg<para> 2060e9fcaa8aSmrgIf the client <emphasis> 2061e9fcaa8aSmrgmap</emphasis> 2062e9fcaa8aSmrg in the <emphasis> 2063e9fcaa8aSmrgxkb</emphasis> 2064e9fcaa8aSmrg parameter has not been allocated, <emphasis> 2065e9fcaa8aSmrgXkbGetKeySyms</emphasis> 2066e9fcaa8aSmrg allocates and initializes it before obtaining the symbols. 2067e9fcaa8aSmrg</para> 2068e9fcaa8aSmrg 2069e9fcaa8aSmrg 2070e9fcaa8aSmrg<para> 2071e9fcaa8aSmrgIf a compatible version of Xkb is not available in the server or the Xkb 2072e9fcaa8aSmrgextension has not been properly initialized, <emphasis> 2073e9fcaa8aSmrgXkbGetKeySyms</emphasis> 2074e9fcaa8aSmrg returns <emphasis> 2075e9fcaa8aSmrgBadAccess</emphasis> 2076e9fcaa8aSmrg. If <emphasis> 2077e9fcaa8aSmrgnum</emphasis> 2078e9fcaa8aSmrg is less than 1 or greater than <emphasis> 2079e9fcaa8aSmrgXkbMaxKeyCount</emphasis> 2080e9fcaa8aSmrg, <emphasis> 2081e9fcaa8aSmrgXkbGetKeySyms</emphasis> 2082e9fcaa8aSmrg returns <emphasis> 2083e9fcaa8aSmrgBadValue</emphasis> 2084e9fcaa8aSmrg. If any allocation errors occur, <emphasis> 2085e9fcaa8aSmrgXkbGetKeySyms</emphasis> 2086e9fcaa8aSmrg returns <emphasis> 2087e9fcaa8aSmrgBadAlloc</emphasis> 2088e9fcaa8aSmrg. 2089e9fcaa8aSmrg</para> 2090e9fcaa8aSmrg 2091e9fcaa8aSmrg 2092e9fcaa8aSmrg</sect2> 2093e9fcaa8aSmrg<sect2 id='changing_the_number_of_groups_and_types_bound_to_a_key'> 2094e9fcaa8aSmrg<title>Changing the Number of Groups and Types Bound to a Key</title> 2095e9fcaa8aSmrg 2096e9fcaa8aSmrg<para> 2097e9fcaa8aSmrgTo change the number of groups and the types bound to a key, use <emphasis> 2098e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2099e9fcaa8aSmrg. 2100e9fcaa8aSmrg</para> 2101e9fcaa8aSmrg 2102e9fcaa8aSmrg 2103e9fcaa8aSmrg<para> 2104e9fcaa8aSmrgStatus <emphasis> 2105e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2106e9fcaa8aSmrg(<emphasis> 2107e9fcaa8aSmrgxkb</emphasis> 2108e9fcaa8aSmrg,<emphasis> 2109e9fcaa8aSmrg key</emphasis> 2110e9fcaa8aSmrg,<emphasis> 2111e9fcaa8aSmrg n_groups</emphasis> 2112e9fcaa8aSmrg,<emphasis> 2113e9fcaa8aSmrg groups</emphasis> 2114e9fcaa8aSmrg,<emphasis> 2115e9fcaa8aSmrg new_types_in</emphasis> 2116e9fcaa8aSmrg,<emphasis> 2117e9fcaa8aSmrg p_changes</emphasis> 2118e9fcaa8aSmrg) 2119e9fcaa8aSmrg</para> 2120e9fcaa8aSmrg 2121e9fcaa8aSmrg<informaltable frame='none'> 2122e9fcaa8aSmrg<tgroup cols='1'> 2123e9fcaa8aSmrg<colspec colsep='0'/> 2124e9fcaa8aSmrg<tbody> 2125e9fcaa8aSmrg <row rowsep='0'> 2126e9fcaa8aSmrg <entry role='functionargdecl'> 2127e9fcaa8aSmrgXkbDescPtr <emphasis> 2128e9fcaa8aSmrg xkb</emphasis> 2129e9fcaa8aSmrg; /* keyboard description to be changed */ 2130e9fcaa8aSmrg </entry> 2131e9fcaa8aSmrg </row> 2132e9fcaa8aSmrg <row rowsep='0'> 2133e9fcaa8aSmrg <entry role='functionargdecl'> 2134e9fcaa8aSmrgint <emphasis> 2135e9fcaa8aSmrg key</emphasis> 2136e9fcaa8aSmrg; /* keycode for key of interest */ 2137e9fcaa8aSmrg </entry> 2138e9fcaa8aSmrg </row> 2139e9fcaa8aSmrg <row rowsep='0'> 2140e9fcaa8aSmrg <entry role='functionargdecl'> 2141e9fcaa8aSmrgint <emphasis> 2142e9fcaa8aSmrg n_groups</emphasis> 2143e9fcaa8aSmrg; /* new number of groups for key */ 2144e9fcaa8aSmrg </entry> 2145e9fcaa8aSmrg </row> 2146e9fcaa8aSmrg <row rowsep='0'> 2147e9fcaa8aSmrg <entry role='functionargdecl'> 2148e9fcaa8aSmrgunsigned int <emphasis> 2149e9fcaa8aSmrggroups</emphasis> 2150e9fcaa8aSmrg; /* mask indicating groups to change */ 2151e9fcaa8aSmrg </entry> 2152e9fcaa8aSmrg </row> 2153e9fcaa8aSmrg <row rowsep='0'> 2154e9fcaa8aSmrg <entry role='functionargdecl'> 2155e9fcaa8aSmrgint * <emphasis> 2156e9fcaa8aSmrgnew_types_in</emphasis> 2157e9fcaa8aSmrg; /* indices for new groups specified in <emphasis> 2158e9fcaa8aSmrggroups</emphasis> 2159e9fcaa8aSmrg */ 2160e9fcaa8aSmrg </entry> 2161e9fcaa8aSmrg </row> 2162e9fcaa8aSmrg <row rowsep='0'> 2163e9fcaa8aSmrg <entry role='functionargdecl'> 2164e9fcaa8aSmrgXkbMapChangesPtr <emphasis> 2165e9fcaa8aSmrgp_changes</emphasis> 2166e9fcaa8aSmrg; /* notes changes made to <emphasis> 2167e9fcaa8aSmrgxkb</emphasis> 2168e9fcaa8aSmrg */ 2169e9fcaa8aSmrg </entry> 2170e9fcaa8aSmrg</row> 2171e9fcaa8aSmrg</tbody> 2172e9fcaa8aSmrg</tgroup> 2173e9fcaa8aSmrg</informaltable> 2174e9fcaa8aSmrg 2175e9fcaa8aSmrg<para> 2176e9fcaa8aSmrg<emphasis> 2177e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2178e9fcaa8aSmrg reallocates the symbols and actions bound to the key, if necessary, and 2179e9fcaa8aSmrginitializes any new symbols or actions to <emphasis> 2180e9fcaa8aSmrgNoSymbol</emphasis> 2181e9fcaa8aSmrg or <emphasis> 2182e9fcaa8aSmrgNoAction</emphasis> 2183e9fcaa8aSmrg, as appropriate. If the <emphasis> 2184e9fcaa8aSmrgp_changes</emphasis> 2185e9fcaa8aSmrg parameter is not <emphasis> 2186e9fcaa8aSmrgNULL</emphasis> 2187e9fcaa8aSmrg, <emphasis> 2188e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2189e9fcaa8aSmrg adds the <emphasis> 2190e9fcaa8aSmrgXkbKeySymsMask</emphasis> 2191e9fcaa8aSmrg to the <emphasis> 2192e9fcaa8aSmrgchanges</emphasis> 2193e9fcaa8aSmrg field of <emphasis> 2194e9fcaa8aSmrgp_changes</emphasis> 2195e9fcaa8aSmrg and modifies the <emphasis> 2196e9fcaa8aSmrgfirst_key_sym</emphasis> 2197e9fcaa8aSmrg and <emphasis> 2198e9fcaa8aSmrgnum_key_syms</emphasis> 2199e9fcaa8aSmrg fields of <emphasis> 2200e9fcaa8aSmrgp_changes</emphasis> 2201e9fcaa8aSmrg to include the <emphasis> 2202e9fcaa8aSmrgkey</emphasis> 2203e9fcaa8aSmrg that was changed. See section 14.3.1 for more information on the <emphasis> 2204e9fcaa8aSmrgXkbMapChangesPtr</emphasis> 2205e9fcaa8aSmrg structure. If successful, <emphasis> 2206e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2207e9fcaa8aSmrg returns <emphasis> 2208e9fcaa8aSmrgSuccess</emphasis> 2209e9fcaa8aSmrg. 2210e9fcaa8aSmrg</para> 2211e9fcaa8aSmrg 2212e9fcaa8aSmrg 2213e9fcaa8aSmrg<para> 2214e9fcaa8aSmrgThe <emphasis> 2215e9fcaa8aSmrgn_groups</emphasis> 2216e9fcaa8aSmrg parameter specifies the new number of groups for the key. The <emphasis> 2217e9fcaa8aSmrggroups</emphasis> 2218e9fcaa8aSmrg parameter is a mask specifying the groups for which new types are supplied and 2219e9fcaa8aSmrgis a bitwise inclusive OR of the following masks: <emphasis> 2220e9fcaa8aSmrgXkbGroup1Mask</emphasis> 2221e9fcaa8aSmrg, <emphasis> 2222e9fcaa8aSmrgXkbGroup2Mask</emphasis> 2223e9fcaa8aSmrg, <emphasis> 2224e9fcaa8aSmrgXkbGroup3Mask</emphasis> 2225e9fcaa8aSmrg, and <emphasis> 2226e9fcaa8aSmrgXkbGroup4Mask</emphasis> 2227e9fcaa8aSmrg. 2228e9fcaa8aSmrg</para> 2229e9fcaa8aSmrg 2230e9fcaa8aSmrg 2231e9fcaa8aSmrg<para> 2232e9fcaa8aSmrgThe <emphasis> 2233e9fcaa8aSmrgnew_types_in</emphasis> 2234e9fcaa8aSmrg parameter is an integer array of length <emphasis> 2235e9fcaa8aSmrgn_groups</emphasis> 2236e9fcaa8aSmrg. Each entry represents the type to use for the associated group and is an 2237e9fcaa8aSmrgindex into <emphasis> 2238e9fcaa8aSmrgxkb</emphasis> 2239e9fcaa8aSmrg-><emphasis> 2240e9fcaa8aSmrgmap->types</emphasis> 2241e9fcaa8aSmrg. The <emphasis> 2242e9fcaa8aSmrgnew_types_in</emphasis> 2243e9fcaa8aSmrg array is indexed by group index; if <emphasis> 2244e9fcaa8aSmrgn_groups</emphasis> 2245e9fcaa8aSmrg is four and <emphasis> 2246e9fcaa8aSmrggroups</emphasis> 2247e9fcaa8aSmrg only has <emphasis> 2248e9fcaa8aSmrgGroup1Mask</emphasis> 2249e9fcaa8aSmrg and <emphasis> 2250e9fcaa8aSmrgGroup3Mask</emphasis> 2251e9fcaa8aSmrg set, <emphasis> 2252e9fcaa8aSmrgnew_types_in</emphasis> 2253e9fcaa8aSmrg looks like this: 2254e9fcaa8aSmrg</para> 2255e9fcaa8aSmrg 2256e9fcaa8aSmrg<literallayout> 2257e9fcaa8aSmrg new_types_in[0] = type for Group1 2258e9fcaa8aSmrg new_types_in[1] = ignored 2259e9fcaa8aSmrg new_types_in[2] = type for Group3 2260e9fcaa8aSmrg new_types_in[3] = ignored 2261e9fcaa8aSmrg</literallayout> 2262e9fcaa8aSmrg 2263e9fcaa8aSmrg<para> 2264e9fcaa8aSmrgFor convenience, Xkb provides the following constants to use as indices to the 2265e9fcaa8aSmrggroups: 2266e9fcaa8aSmrg</para> 2267e9fcaa8aSmrg 2268e9fcaa8aSmrg<table frame='none'> 2269e9fcaa8aSmrg<title>Group Index Constants</title> 2270e9fcaa8aSmrg<tgroup cols='2'> 2271e9fcaa8aSmrg<colspec colsep='0'/> 2272e9fcaa8aSmrg<colspec colsep='0'/> 2273e9fcaa8aSmrg<thead> 2274e9fcaa8aSmrg<row rowsep='0'> 2275e9fcaa8aSmrg <entry>Constant Name</entry> 2276e9fcaa8aSmrg <entry>Value</entry> 2277e9fcaa8aSmrg </row> 2278e9fcaa8aSmrg</thead> 2279e9fcaa8aSmrg<tbody> 2280e9fcaa8aSmrg <row rowsep='0'> 2281e9fcaa8aSmrg <entry>XkbGroup1Index</entry> 2282e9fcaa8aSmrg <entry>0</entry> 2283e9fcaa8aSmrg </row> 2284e9fcaa8aSmrg <row rowsep='0'> 2285e9fcaa8aSmrg <entry>XkbGroup2Index</entry> 2286e9fcaa8aSmrg <entry>1</entry> 2287e9fcaa8aSmrg </row> 2288e9fcaa8aSmrg <row rowsep='0'> 2289e9fcaa8aSmrg <entry>XkbGroup3Index</entry> 2290e9fcaa8aSmrg <entry>2</entry> 2291e9fcaa8aSmrg </row> 2292e9fcaa8aSmrg <row rowsep='0'> 2293e9fcaa8aSmrg <entry>XkbGroup4Index</entry> 2294e9fcaa8aSmrg <entry>3</entry> 2295e9fcaa8aSmrg </row> 2296e9fcaa8aSmrg</tbody> 2297e9fcaa8aSmrg</tgroup> 2298e9fcaa8aSmrg</table> 2299e9fcaa8aSmrg 2300e9fcaa8aSmrg<para> 2301e9fcaa8aSmrgIf the Xkb extension has not been properly initialized, <emphasis> 2302e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2303e9fcaa8aSmrg returns <emphasis> 2304e9fcaa8aSmrgBadAccess</emphasis> 2305e9fcaa8aSmrg. If the <emphasis> 2306e9fcaa8aSmrgxkb</emphasis> 2307e9fcaa8aSmrg parameter it not valid (that is, it is <emphasis> 2308e9fcaa8aSmrgNULL</emphasis> 2309e9fcaa8aSmrg or it does not contain a valid client map), <emphasis> 2310e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2311e9fcaa8aSmrg returns <emphasis> 2312e9fcaa8aSmrgBad</emphasis> 2313e9fcaa8aSmrgMatch. If the <emphasis> 2314e9fcaa8aSmrgkey</emphasis> 2315e9fcaa8aSmrg is not a valid keycode, <emphasis> 2316e9fcaa8aSmrgn_groups</emphasis> 2317e9fcaa8aSmrg is greater than <emphasis> 2318e9fcaa8aSmrgXkbNumKbdGroups</emphasis> 2319e9fcaa8aSmrg, or the <emphasis> 2320e9fcaa8aSmrggroups</emphasis> 2321e9fcaa8aSmrg mask does not contain any of the valid group mask bits, <emphasis> 2322e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2323e9fcaa8aSmrg returns <emphasis> 2324e9fcaa8aSmrgBadValue</emphasis> 2325e9fcaa8aSmrg. If it is necessary to resize the key symbols or key actions arrays and any 2326e9fcaa8aSmrgallocation errors occur, <emphasis> 2327e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2328e9fcaa8aSmrg returns <emphasis> 2329e9fcaa8aSmrgBadAlloc</emphasis> 2330e9fcaa8aSmrg. 2331e9fcaa8aSmrg</para> 2332e9fcaa8aSmrg 2333e9fcaa8aSmrg 2334e9fcaa8aSmrg</sect2> 2335e9fcaa8aSmrg<sect2 id='changing_the_number_of_symbols_bound_to_a_key'> 2336e9fcaa8aSmrg<title>Changing the Number of Symbols Bound to a Key</title> 2337e9fcaa8aSmrg 2338e9fcaa8aSmrg<para> 2339e9fcaa8aSmrgTo change the number of symbols bound to a key, use <emphasis> 2340e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2341e9fcaa8aSmrg. 2342e9fcaa8aSmrg</para> 2343e9fcaa8aSmrg 2344e9fcaa8aSmrg<informaltable frame='none'> 2345e9fcaa8aSmrg<tgroup cols='1'> 2346e9fcaa8aSmrg<colspec colsep='0'/> 2347e9fcaa8aSmrg<tbody> 2348e9fcaa8aSmrg <row rowsep='0'> 2349e9fcaa8aSmrg <entry role='functiondecl'> 2350e9fcaa8aSmrgKeySym *<emphasis> 2351e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2352e9fcaa8aSmrg(<emphasis> 2353e9fcaa8aSmrgxkb</emphasis> 2354e9fcaa8aSmrg,<emphasis> 2355e9fcaa8aSmrg key</emphasis> 2356e9fcaa8aSmrg,<emphasis> 2357e9fcaa8aSmrg needed</emphasis> 2358e9fcaa8aSmrg) 2359e9fcaa8aSmrg </entry> 2360e9fcaa8aSmrg </row> 2361e9fcaa8aSmrg <row rowsep='0'> 2362e9fcaa8aSmrg <entry role='functionargdecl'> 2363e9fcaa8aSmrgXkbDescRec *<emphasis> 2364e9fcaa8aSmrg xkb</emphasis> 2365e9fcaa8aSmrg; /* keyboard description to be changed */ 2366e9fcaa8aSmrg </entry> 2367e9fcaa8aSmrg </row> 2368e9fcaa8aSmrg <row rowsep='0'> 2369e9fcaa8aSmrg <entry role='functionargdecl'> 2370e9fcaa8aSmrgint <emphasis> 2371e9fcaa8aSmrg key</emphasis> 2372e9fcaa8aSmrg; /* keycode for key to modify */ 2373e9fcaa8aSmrg </entry> 2374e9fcaa8aSmrg </row> 2375e9fcaa8aSmrg <row rowsep='0'> 2376e9fcaa8aSmrg <entry role='functionargdecl'> 2377e9fcaa8aSmrgint <emphasis> 2378e9fcaa8aSmrg needed</emphasis> 2379e9fcaa8aSmrg; /* new number of keysyms required for key */ 2380e9fcaa8aSmrg </entry> 2381e9fcaa8aSmrg</row> 2382e9fcaa8aSmrg</tbody> 2383e9fcaa8aSmrg</tgroup> 2384e9fcaa8aSmrg</informaltable> 2385e9fcaa8aSmrg 2386e9fcaa8aSmrg<para> 2387e9fcaa8aSmrg<emphasis> 2388e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2389e9fcaa8aSmrg reserves the space needed for <emphasis> 2390e9fcaa8aSmrgneeded</emphasis> 2391e9fcaa8aSmrg keysyms and returns a pointer to the beginning of the new array that holds the 2392e9fcaa8aSmrgkeysyms. It adjusts the <emphasis> 2393e9fcaa8aSmrgoffset</emphasis> 2394e9fcaa8aSmrg field of the <emphasis> 2395e9fcaa8aSmrgkey_sym_map</emphasis> 2396e9fcaa8aSmrg entry for the key if necessary and can also change the <emphasis> 2397e9fcaa8aSmrgsyms</emphasis> 2398e9fcaa8aSmrg, <emphasis> 2399e9fcaa8aSmrgnum_syms</emphasis> 2400e9fcaa8aSmrg, and <emphasis> 2401e9fcaa8aSmrgsize_syms</emphasis> 2402e9fcaa8aSmrg fields of <emphasis> 2403e9fcaa8aSmrgxkb</emphasis> 2404e9fcaa8aSmrg-<emphasis> 2405e9fcaa8aSmrg>map</emphasis> 2406e9fcaa8aSmrg if it is necessary to reallocate the <emphasis> 2407e9fcaa8aSmrgsyms</emphasis> 2408e9fcaa8aSmrg array. <emphasis> 2409e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2410e9fcaa8aSmrg does not modify either the width or number of groups associated with the key. 2411e9fcaa8aSmrg</para> 2412e9fcaa8aSmrg 2413e9fcaa8aSmrg 2414e9fcaa8aSmrg<para> 2415e9fcaa8aSmrgIf <emphasis> 2416e9fcaa8aSmrgneeded</emphasis> 2417e9fcaa8aSmrg is greater than the current number of keysyms for the key, <emphasis> 2418e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2419e9fcaa8aSmrg initializes all new keysyms in the array to <emphasis> 2420e9fcaa8aSmrgNoSymbol</emphasis> 2421e9fcaa8aSmrg. 2422e9fcaa8aSmrg</para> 2423e9fcaa8aSmrg 2424e9fcaa8aSmrg 2425e9fcaa8aSmrg<para> 2426e9fcaa8aSmrgBecause the number of symbols needed by a key is normally computed as width * 2427e9fcaa8aSmrgnumber of groups, and <emphasis> 2428e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2429e9fcaa8aSmrg does not modify either the width or number of groups for the key, a 2430e9fcaa8aSmrgdiscrepancy exists upon return from <emphasis> 2431e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2432e9fcaa8aSmrg between the space allocated for the keysyms and the number required. The 2433e9fcaa8aSmrgunused entries in the list of symbols returned by <emphasis> 2434e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2435e9fcaa8aSmrg are not preserved across future calls to any of the map editing functions, so 2436e9fcaa8aSmrgyou must update the key symbol mapping (which updates the width and number of 2437e9fcaa8aSmrggroups for the key) before calling another allocator function. A call to 2438e9fcaa8aSmrg<emphasis> 2439e9fcaa8aSmrgXkbChangeTypesOfKey</emphasis> 2440e9fcaa8aSmrg will update the mapping. 2441e9fcaa8aSmrg</para> 2442e9fcaa8aSmrg 2443e9fcaa8aSmrg 2444e9fcaa8aSmrg<para> 2445e9fcaa8aSmrgIf any allocation errors occur while resizing the number of symbols bound to 2446e9fcaa8aSmrgthe key, <emphasis> 2447e9fcaa8aSmrgXkbResizeKeySyms</emphasis> 2448e9fcaa8aSmrg returns <emphasis> 2449e9fcaa8aSmrgNULL</emphasis> 2450e9fcaa8aSmrg. 2451e9fcaa8aSmrg</para> 2452e9fcaa8aSmrg 2453e9fcaa8aSmrg<note><para>A change to the number of symbols bound to a key should be 2454e9fcaa8aSmrgaccompanied by a change in the number of actions bound to a key. Refer to 2455e9fcaa8aSmrgsection 16.1.16 for more information on changing the number of actions bound to 2456e9fcaa8aSmrga key.</para></note> 2457e9fcaa8aSmrg 2458e9fcaa8aSmrg 2459e9fcaa8aSmrg</sect2> 2460e9fcaa8aSmrg</sect1> 2461e9fcaa8aSmrg<sect1 id='the_per_key_modifier_map'> 2462e9fcaa8aSmrg<title>The Per-Key Modifier Map</title> 2463e9fcaa8aSmrg 2464e9fcaa8aSmrg<para> 2465e9fcaa8aSmrgThe <emphasis> 2466e9fcaa8aSmrgmodmap</emphasis> 2467e9fcaa8aSmrg entry of the client map is an array, indexed by keycode, specifying the real 2468e9fcaa8aSmrgmodifiers bound to a key. Each entry is a mask composed of a bitwise inclusive 2469e9fcaa8aSmrgOR of the legal real modifiers: <emphasis> 2470e9fcaa8aSmrgShiftMask</emphasis> 2471e9fcaa8aSmrg, <emphasis> 2472e9fcaa8aSmrgLockMask</emphasis> 2473e9fcaa8aSmrg, <emphasis> 2474e9fcaa8aSmrgControlMask</emphasis> 2475e9fcaa8aSmrg, <emphasis> 2476e9fcaa8aSmrgMod1Mask</emphasis> 2477e9fcaa8aSmrg, <emphasis> 2478e9fcaa8aSmrgMod2Mask</emphasis> 2479e9fcaa8aSmrg, <emphasis> 2480e9fcaa8aSmrgMod3Mask</emphasis> 2481e9fcaa8aSmrg, <emphasis> 2482e9fcaa8aSmrgMod4Mask</emphasis> 2483e9fcaa8aSmrg, and <emphasis> 2484e9fcaa8aSmrgMod5Mask</emphasis> 2485e9fcaa8aSmrg. If a bit is set in a <emphasis> 2486e9fcaa8aSmrgmodmap</emphasis> 2487e9fcaa8aSmrg entry, the corresponding key is bound to that modifier. 2488e9fcaa8aSmrg</para> 2489e9fcaa8aSmrg 2490e9fcaa8aSmrg 2491e9fcaa8aSmrg<para> 2492e9fcaa8aSmrgPressing or releasing the key bound to a modifier changes the modifier set and 2493e9fcaa8aSmrgunset state. The particular manner in which the modifier set and unset state 2494e9fcaa8aSmrgchanges is determined by the behavior and actions assigned to the key (see 2495e9fcaa8aSmrgChapter 16). 2496e9fcaa8aSmrg</para> 2497e9fcaa8aSmrg 2498e9fcaa8aSmrg 2499e9fcaa8aSmrg<sect2 id='getting_the_per_key_modifier_map_from_the_server'> 2500e9fcaa8aSmrg<title>Getting the Per-Key Modifier Map from the Server</title> 2501e9fcaa8aSmrg 2502e9fcaa8aSmrg<para> 2503e9fcaa8aSmrgTo update the modifier map for one or more of the keys in a keyboard 2504e9fcaa8aSmrgdescription, use <emphasis> 2505e9fcaa8aSmrgXkbGetKeyModifierMap</emphasis> 2506e9fcaa8aSmrg. 2507e9fcaa8aSmrg</para> 2508e9fcaa8aSmrg 2509e9fcaa8aSmrg<informaltable frame='none'> 2510e9fcaa8aSmrg<tgroup cols='1'> 2511e9fcaa8aSmrg<colspec colsep='0'/> 2512e9fcaa8aSmrg<tbody> 2513e9fcaa8aSmrg <row rowsep='0'> 2514e9fcaa8aSmrg <entry role='functiondecl'> 2515e9fcaa8aSmrgStatus <emphasis> 2516e9fcaa8aSmrgXkbGetKeyModifierMap</emphasis> 2517e9fcaa8aSmrg(<emphasis> 2518e9fcaa8aSmrgdpy</emphasis> 2519e9fcaa8aSmrg,<emphasis> 2520e9fcaa8aSmrg first</emphasis> 2521e9fcaa8aSmrg,<emphasis> 2522e9fcaa8aSmrg num</emphasis> 2523e9fcaa8aSmrg,<emphasis> 2524e9fcaa8aSmrg xkb</emphasis> 2525e9fcaa8aSmrg) 2526e9fcaa8aSmrg </entry> 2527e9fcaa8aSmrg </row> 2528e9fcaa8aSmrg <row rowsep='0'> 2529e9fcaa8aSmrg <entry role='functionargdecl'> 2530e9fcaa8aSmrgDisplay *<emphasis> 2531e9fcaa8aSmrg dpy</emphasis> 2532e9fcaa8aSmrg; /* connection to X server */ 2533e9fcaa8aSmrg </entry> 2534e9fcaa8aSmrg </row> 2535e9fcaa8aSmrg <row rowsep='0'> 2536e9fcaa8aSmrg <entry role='functionargdecl'> 2537e9fcaa8aSmrgunsigned int <emphasis> 2538e9fcaa8aSmrgfirst</emphasis> 2539e9fcaa8aSmrg; /* keycode of first key to get */ 2540e9fcaa8aSmrg </entry> 2541e9fcaa8aSmrg </row> 2542e9fcaa8aSmrg <row rowsep='0'> 2543e9fcaa8aSmrg <entry role='functionargdecl'> 2544e9fcaa8aSmrgunsigned int <emphasis> 2545e9fcaa8aSmrgnum</emphasis> 2546e9fcaa8aSmrg; /* number of keys for which information is desired */ 2547e9fcaa8aSmrg </entry> 2548e9fcaa8aSmrg </row> 2549e9fcaa8aSmrg <row rowsep='0'> 2550e9fcaa8aSmrg <entry role='functionargdecl'> 2551e9fcaa8aSmrgXkbDescPtr <emphasis> 2552e9fcaa8aSmrgxkb</emphasis> 2553e9fcaa8aSmrg; /* keyboard description to update */ 2554e9fcaa8aSmrg </entry> 2555e9fcaa8aSmrg</row> 2556e9fcaa8aSmrg</tbody> 2557e9fcaa8aSmrg</tgroup> 2558e9fcaa8aSmrg</informaltable> 2559e9fcaa8aSmrg 2560e9fcaa8aSmrg<para> 2561e9fcaa8aSmrg<emphasis> 2562e9fcaa8aSmrgXkbGetKeyModifierMap</emphasis> 2563e9fcaa8aSmrg sends a request to the server for the modifier mappings for <emphasis> 2564e9fcaa8aSmrgnum</emphasis> 2565e9fcaa8aSmrg keys starting with the key whose keycode is <emphasis> 2566e9fcaa8aSmrgfirst</emphasis> 2567e9fcaa8aSmrg. It waits for a reply and places the results in the <emphasis> 2568e9fcaa8aSmrgxkb</emphasis> 2569e9fcaa8aSmrg->map->modmap array. If successful, <emphasis> 2570e9fcaa8aSmrgXkbGetKeyModifier</emphasis> 2571e9fcaa8aSmrg returns <emphasis> 2572e9fcaa8aSmrgSuccess</emphasis> 2573e9fcaa8aSmrg. 2574e9fcaa8aSmrg</para> 2575e9fcaa8aSmrg 2576e9fcaa8aSmrg 2577e9fcaa8aSmrg<para> 2578e9fcaa8aSmrgIf the map component of the <emphasis> 2579e9fcaa8aSmrgxkb</emphasis> 2580e9fcaa8aSmrg parameter has not been allocated, <emphasis> 2581e9fcaa8aSmrgXkbGetKeyModifierMap</emphasis> 2582e9fcaa8aSmrg allocates and initializes it. 2583e9fcaa8aSmrg</para> 2584e9fcaa8aSmrg 2585e9fcaa8aSmrg 2586e9fcaa8aSmrg<para> 2587e9fcaa8aSmrgIf a compatible version of Xkb is not available in the server or the Xkb 2588e9fcaa8aSmrgextension has not been properly initialized, <emphasis> 2589e9fcaa8aSmrgXkbGetKeySyms</emphasis> 2590e9fcaa8aSmrg returns <emphasis> 2591e9fcaa8aSmrgBadAccess</emphasis> 2592e9fcaa8aSmrg. If any allocation errors occur while obtaining the modifier map, <emphasis> 2593e9fcaa8aSmrgXkbGetKeyModifierMap</emphasis> 2594e9fcaa8aSmrg returns <emphasis> 2595e9fcaa8aSmrgBadAlloc</emphasis> 2596e9fcaa8aSmrg. 2597e9fcaa8aSmrg</para> 2598e9fcaa8aSmrg</sect2> 2599e9fcaa8aSmrg</sect1> 2600e9fcaa8aSmrg</chapter> 2601