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