10f8248bfSmrg<?xml version="1.0" encoding="UTF-8" ?> 20f8248bfSmrg<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" 30f8248bfSmrg "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"> 4eb411b4bSmrg<chapter id='Xkb_Client_Keyboard_Mapping'> 5e9fcaa8aSmrg<title>Xkb Client Keyboard Mapping</title> 6e9fcaa8aSmrg 70f8248bfSmrg<indexterm zone="Xkb_Client_Keyboard_Mapping"> 80f8248bfSmrg<primary>client map</primary></indexterm> 90f8248bfSmrg<indexterm zone="Xkb_Client_Keyboard_Mapping"> 100f8248bfSmrg<primary>map</primary><secondary>client</secondary></indexterm> 110f8248bfSmrg 12e9fcaa8aSmrg<para> 13e9fcaa8aSmrgThe Xkb client map for a keyboard is the collection of information a client 14e9fcaa8aSmrgneeds to interpret key events from the keyboard. It contains a global list of 15e9fcaa8aSmrgkey types and an array of key symbol maps, each of which describes the symbols 16e9fcaa8aSmrgbound to a key and the rules to be used to interpret those symbols. 17e9fcaa8aSmrg</para> 18e9fcaa8aSmrg 19e9fcaa8aSmrg 20e9fcaa8aSmrg<para> 210f8248bfSmrg<link linkend="figure15.1">Figure 15.1</link> shows the relationships between elements in the client map: 22e9fcaa8aSmrg</para> 23e9fcaa8aSmrg 240f8248bfSmrg<figure id='figure15.1'> 250f8248bfSmrg <title>Xkb Client Map</title> 260f8248bfSmrg <mediaobject> 270f8248bfSmrg <imageobject> <imagedata format="SVG" fileref="XKBlib-15.svg"/> 280f8248bfSmrg </imageobject> 290f8248bfSmrg </mediaobject> 300f8248bfSmrg</figure> 31e9fcaa8aSmrg 32e9fcaa8aSmrg 33e9fcaa8aSmrg<!-- 34e9fcaa8aSmrg<H5 CLASS="Figure"> 35e9fcaa8aSmrgXkb Client Map</H5> 36e9fcaa8aSmrg--> 37e9fcaa8aSmrg 38eb411b4bSmrg<sect1 id='The_XkbClientMapRec_Structure'> 39e9fcaa8aSmrg<title>The XkbClientMapRec Structure</title> 400f8248bfSmrg<indexterm significance="preferred" zone="The_XkbClientMapRec_Structure"> 410f8248bfSmrg<primary><structname>XkbClientMapRec</structname></primary></indexterm> 420f8248bfSmrg 430f8248bfSmrg<para> 440f8248bfSmrgThe 450f8248bfSmrg<structfield>map</structfield> 460f8248bfSmrgfield of the complete Xkb keyboard description (see <link linkend="The_XkbDescRec_Structure">section 6.1</link>) is a pointer 470f8248bfSmrgto the Xkb client map, which is of type 480f8248bfSmrg<structname>XkbClientMapRec</structname>: 490f8248bfSmrg 500f8248bfSmrg<programlisting> 510f8248bfSmrgtypedef struct { /* Client Map */ 520f8248bfSmrg unsigned char size_types; /* # occupied entries in <structfield>types</structfield> */ 530f8248bfSmrg unsigned char num_types; /* # entries in <structfield>types</structfield> */ 540f8248bfSmrg XkbKeyTypePtr types; /* vector of key types used by this keymap */ 550f8248bfSmrg unsigned short size_syms; /* length of the <structfield>syms</structfield> array */ 560f8248bfSmrg unsigned short num_syms; /* # entries in <structfield>syms</structfield> */ 570f8248bfSmrg KeySym * syms; /* linear 2d tables of keysyms, 1 per key */ 580f8248bfSmrg XkbSymMapPtr key_sym_map; /* 1 per keycode, maps keycode to <structfield>syms</structfield> */ 590f8248bfSmrg unsigned char * modmap; /* 1 per keycode, real mods bound to key */ 600f8248bfSmrg} <structname>XkbClientMapRec</structname>, *XkbClientMapPtr; 61e9fcaa8aSmrg</programlisting></para> 62e9fcaa8aSmrg 63e9fcaa8aSmrg<para> 640f8248bfSmrgThe following sections describe each of the elements of the 650f8248bfSmrg<structname>XkbClientMapRec</structname> 660f8248bfSmrgstructure in more detail. 67e9fcaa8aSmrg</para> 68e9fcaa8aSmrg 69e9fcaa8aSmrg 70e9fcaa8aSmrg</sect1> 71eb411b4bSmrg<sect1 id='Key_Types'> 72e9fcaa8aSmrg<title>Key Types</title> 730f8248bfSmrg<indexterm significance="preferred" zone="Key_Types"> 740f8248bfSmrg<primary><structname>XkbKeyTypeRec</structname></primary></indexterm> 750f8248bfSmrg<indexterm significance="preferred" zone="Key_Types"> 760f8248bfSmrg<primary><structname>XkbKTMapEntryRec</structname></primary></indexterm> 77e9fcaa8aSmrg 78e9fcaa8aSmrg<para> 79e9fcaa8aSmrgKey types are used to determine the shift level of a key given the current 80e9fcaa8aSmrgstate of the keyboard. The set of all possible key types for the Xkb keyboard 810f8248bfSmrgdescription are held in the 820f8248bfSmrg<structfield>types</structfield> 830f8248bfSmrgfield of the client map, whose total size is stored in 840f8248bfSmrg<structfield>size_types</structfield>, 850f8248bfSmrgand whose total number of valid entries is stored in 860f8248bfSmrg<structfield>num_types</structfield>. 870f8248bfSmrgKey types are defined using the following structures: 880f8248bfSmrg 890f8248bfSmrg<programlisting> 900f8248bfSmrgtypedef struct { /* Key Type */ 910f8248bfSmrg XkbModsRec mods; /* modifiers used to compute shift level */ 920f8248bfSmrg unsigned char num_levels; /* total # shift levels, do not 930f8248bfSmrg modify directly */ 940f8248bfSmrg unsigned char map_count; /* # entries in <structfield>map</structfield>, <structfield>preserve</structfield> 950f8248bfSmrg (if non-<symbol>NULL</symbol>) */ 960f8248bfSmrg XkbKTMapEntryPtr map; /* vector of modifiers for each 970f8248bfSmrg shift level */ 980f8248bfSmrg XkbModsPtr preserve; /* mods to preserve for 990f8248bfSmrg corresponding <structfield>map</structfield> entry */ 1000f8248bfSmrg Atom name; /* name of key type */ 1010f8248bfSmrg Atom * level_names; /* array of names of each shift level */ 1020f8248bfSmrg} <structname>XkbKeyTypeRec</structname>, *XkbKeyTypePtr; 1030f8248bfSmrg</programlisting> 1040f8248bfSmrg 1050f8248bfSmrg<programlisting> 1060f8248bfSmrgtypedef struct { /* Modifiers for a key type */ 1070f8248bfSmrg Bool active; /* <symbol>True</symbol> ⇒ entry active when 1080f8248bfSmrg determining shift level */ 1090f8248bfSmrg unsigned char level; /* shift level if modifiers match <structfield>mods</structfield> */ 1100f8248bfSmrg XkbModsRec mods; /* mods needed for this level to be 1110f8248bfSmrg selected */ 1120f8248bfSmrg} <structname>XkbKTMapEntryRec</structname>, *XkbKTMapEntryPtr; 113e9fcaa8aSmrg</programlisting></para> 114e9fcaa8aSmrg 115e9fcaa8aSmrg<para> 1160f8248bfSmrgThe 1170f8248bfSmrg<structfield>mods</structfield> 1180f8248bfSmrgfield of a key type is an 1190f8248bfSmrg<structname>XkbModsRec</structname> 1200f8248bfSmrg(see <link linkend="Modifier_Definitions">section 7.2</link>) specifying the modifiers the key type uses when calculating 121e9fcaa8aSmrgthe shift level, and can be composed of both the core modifiers and virtual 122e9fcaa8aSmrgmodifiers. To set the modifiers associated with a key type, modify the 1230f8248bfSmrg<structfield>real_mods</structfield> 1240f8248bfSmrgand 1250f8248bfSmrg<structfield>vmods</structfield> 1260f8248bfSmrgfields of the 1270f8248bfSmrg<structfield>mods</structfield> 1280f8248bfSmrg<structname>XkbModsRec</structname> 1290f8248bfSmrgaccordingly. The 1300f8248bfSmrg<structfield>mask</structfield> 1310f8248bfSmrgfield of the 1320f8248bfSmrg<structname>XkbModsRec</structname> 1330f8248bfSmrgis reserved for use by Xkb and is calculated from the 1340f8248bfSmrg<structfield>real_mods</structfield> 1350f8248bfSmrgand 1360f8248bfSmrg<structfield>vmods</structfield> 1370f8248bfSmrgfields. 1380f8248bfSmrg</para> 1390f8248bfSmrg 1400f8248bfSmrg 1410f8248bfSmrg<para> 1420f8248bfSmrgThe 1430f8248bfSmrg<structfield>num_levels</structfield> 1440f8248bfSmrgfield holds the total number of shift levels for the key type. Xkb uses 1450f8248bfSmrg<structfield>num_levels</structfield> 1460f8248bfSmrgto ensure the array of symbols bound to a key is large enough. Do not modify 1470f8248bfSmrg<structfield>num_levels</structfield> 1480f8248bfSmrgdirectly to change the number if shift levels for a key type. Instead, use 1490f8248bfSmrg<function>XkbResizeKeyType</function> 1500f8248bfSmrg(see <link linkend="Changing_the_Number_of_Levels_in_a_Key_Type">section 15.2.3</link>). 1510f8248bfSmrg</para> 1520f8248bfSmrg 1530f8248bfSmrg 1540f8248bfSmrg<para> 1550f8248bfSmrgThe 1560f8248bfSmrg<structfield>map</structfield> 1570f8248bfSmrgfield is a vector of 1580f8248bfSmrg<structname>XkbKTMapEntryRec</structname> 1590f8248bfSmrgstructures, with 1600f8248bfSmrg<structfield>map_count</structfield> 1610f8248bfSmrgentries, that specify the modifier combinations for each possible shift level. 1620f8248bfSmrgEach map entry contains an 1630f8248bfSmrg<structfield>active</structfield> 1640f8248bfSmrgfield, a 1650f8248bfSmrg<structfield>mods</structfield> 1660f8248bfSmrgfield, and a 1670f8248bfSmrg<structfield>level</structfield> 1680f8248bfSmrgfield. The 1690f8248bfSmrg<structfield>active</structfield> 1700f8248bfSmrgfield determines whether the modifier combination listed in the 1710f8248bfSmrg<structfield>mods</structfield> 1720f8248bfSmrgfield should be considered when determining shift level. If 1730f8248bfSmrg<structfield>active</structfield> 1740f8248bfSmrgis 1750f8248bfSmrg<symbol>False</symbol>, 1760f8248bfSmrgthis 1770f8248bfSmrg<structfield>map</structfield> 1780f8248bfSmrgentry is ignored. If 1790f8248bfSmrg<structfield>active</structfield> 1800f8248bfSmrgis 1810f8248bfSmrg<symbol>True</symbol>, 1820f8248bfSmrgthe 1830f8248bfSmrg<structfield>level</structfield> 1840f8248bfSmrgfield of the 1850f8248bfSmrg<structfield>map</structfield> 186e9fcaa8aSmrgentry specifies the shift level to use when the current modifier combination 1870f8248bfSmrgmatches the combination specified in the 1880f8248bfSmrg<structfield>mods</structfield> 1890f8248bfSmrgfield of the 1900f8248bfSmrg<structfield>map</structfield> 1910f8248bfSmrgentry. 192e9fcaa8aSmrg</para> 193e9fcaa8aSmrg 194e9fcaa8aSmrg 195e9fcaa8aSmrg<para> 1960f8248bfSmrgAny combination of modifiers not explicitly listed somewhere in the 1970f8248bfSmrg<structfield>map</structfield> 1980f8248bfSmrgyields shift level one. In addition, 1990f8248bfSmrg<structfield>map</structfield> 2000f8248bfSmrgentries specifying unbound virtual modifiers are not considered. 201e9fcaa8aSmrg</para> 202e9fcaa8aSmrg 203e9fcaa8aSmrg 204e9fcaa8aSmrg<para> 2050f8248bfSmrgAny modifiers specified in 2060f8248bfSmrg<structfield>mods</structfield> 2070f8248bfSmrgare normally 2080f8248bfSmrg<emphasis>consumed</emphasis> 2090f8248bfSmrgby 2100f8248bfSmrg<function>XkbTranslateKeyCode</function> 2110f8248bfSmrg(see <link linkend="X_Library_Functions_Affected_by_Xkb">section 12.1.3</link>). For those rare occasions a modifier 2120f8248bfSmrg<emphasis>should</emphasis> 2130f8248bfSmrgbe considered despite having been used to look up a symbol, key types include 2140f8248bfSmrgan optional 2150f8248bfSmrg<structfield>preserve</structfield> 2160f8248bfSmrgfield. If a 2170f8248bfSmrg<structfield>preserve</structfield> 2180f8248bfSmrgmember of a key type is not 2190f8248bfSmrg<symbol>NULL</symbol>, 2200f8248bfSmrgit represents a list of modifiers where each entry corresponds directly to 2210f8248bfSmrgone of the key type’s 2220f8248bfSmrg<structfield>map</structfield>. 2230f8248bfSmrgEach entry lists the modifiers that should 2240f8248bfSmrg<emphasis>not</emphasis> 2250f8248bfSmrgbe consumed if the matching map entry is used to determine shift level. 226e9fcaa8aSmrg</para> 227e9fcaa8aSmrg 228e9fcaa8aSmrg 229e9fcaa8aSmrg<para> 2300f8248bfSmrgEach shift level has a name and these names are held in the 2310f8248bfSmrg<structfield>level_names</structfield> 2320f8248bfSmrgarray, whose length is 2330f8248bfSmrg<structfield>num_levels</structfield>. 2340f8248bfSmrgThe type itself also has a name, which is held in the 2350f8248bfSmrg<structfield>name</structfield> 2360f8248bfSmrgfield. 237e9fcaa8aSmrg</para> 238e9fcaa8aSmrg 239e9fcaa8aSmrg 240e9fcaa8aSmrg<para> 241e9fcaa8aSmrgFor example, consider how the server handles the following possible symbolic 242e9fcaa8aSmrgdescription of a possible key type (note that the format used to specify 243e9fcaa8aSmrgkeyboard mappings in the server database is not specified by the Xkb extension, 244e9fcaa8aSmrgalthough this format is one possible example): 245e9fcaa8aSmrg</para> 246e9fcaa8aSmrg 2470f8248bfSmrg<table id='table15.1' frame='topbot'> 248e9fcaa8aSmrg<title>Example Key Type</title> 249eb411b4bSmrg<?dbfo keep-together="always" ?> 250eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 251eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 252eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 253e9fcaa8aSmrg<thead> 254eb411b4bSmrg<row rowsep='1'> 255e9fcaa8aSmrg <entry>Symbolic Description</entry> 256e9fcaa8aSmrg <entry>Key Type Data Structure</entry> 257e9fcaa8aSmrg</row> 258e9fcaa8aSmrg</thead> 259e9fcaa8aSmrg<tbody> 260eb411b4bSmrg <row> 261e9fcaa8aSmrg <entry>type "ALPHATHREE" {</entry> 262e9fcaa8aSmrg <entry>Xkb->map->types[i].name</entry> 263e9fcaa8aSmrg </row> 264eb411b4bSmrg <row> 265e9fcaa8aSmrg <entry>modifiers = Shift+Lock+LevelThree;</entry> 266e9fcaa8aSmrg <entry>Xkb->map->types[i].mods</entry> 267e9fcaa8aSmrg </row> 268eb411b4bSmrg <row> 269e9fcaa8aSmrg <entry><emphasis>map[None]= Level1;</emphasis></entry> 270e9fcaa8aSmrg <entry>Xkb->map->types[i].map[0]</entry> 271e9fcaa8aSmrg </row> 272eb411b4bSmrg <row> 273e9fcaa8aSmrg <entry><emphasis>map[Lock]= Level1;</emphasis></entry> 274e9fcaa8aSmrg <entry>Xkb->map->types[i].map[1]</entry> 275e9fcaa8aSmrg </row> 276eb411b4bSmrg <row> 277e9fcaa8aSmrg <entry>map[Shift]= Level2;</entry> 278e9fcaa8aSmrg <entry>Xkb->map->types[i].map[2]</entry> 279e9fcaa8aSmrg </row> 280eb411b4bSmrg <row> 281e9fcaa8aSmrg <entry>map[LevelThree]= Level3;</entry> 282e9fcaa8aSmrg <entry>Xkb->map->types[i].map[3]</entry> 283e9fcaa8aSmrg </row> 284eb411b4bSmrg <row> 285e9fcaa8aSmrg <entry>map[Shift+LevelThree]= Level3;</entry> 286e9fcaa8aSmrg <entry>Xkb->map->types[i].map[4]</entry> 287e9fcaa8aSmrg </row> 288eb411b4bSmrg <row> 289e9fcaa8aSmrg <entry><emphasis>preserve[None]= None;</emphasis></entry> 2900f8248bfSmrg <entry>Xkb->map->types[i].preserve[0]</entry> 291e9fcaa8aSmrg </row> 292eb411b4bSmrg <row> 293e9fcaa8aSmrg <entry>preserve[Lock]= Lock;</entry> 294e9fcaa8aSmrg <entry>Xkb->map->types[i].preserve[1]</entry> 295e9fcaa8aSmrg </row> 296eb411b4bSmrg <row> 297e9fcaa8aSmrg <entry><emphasis>preserve[Shift]= None;</emphasis></entry> 298e9fcaa8aSmrg <entry>Xkb->map->types[i].preserve[2]</entry> 299e9fcaa8aSmrg </row> 300eb411b4bSmrg <row> 301e9fcaa8aSmrg <entry><emphasis>preserve[LevelThree]= None;</emphasis></entry> 302e9fcaa8aSmrg <entry>Xkb->map->types[i].preserve[3]</entry> 303e9fcaa8aSmrg </row> 304eb411b4bSmrg <row> 305e9fcaa8aSmrg <entry><emphasis>preserve[Shift+Level3]= None;</emphasis> </entry> 306e9fcaa8aSmrg <entry>Xkb->map->types[i].preserve[4]</entry> 307e9fcaa8aSmrg </row> 308eb411b4bSmrg <row> 309e9fcaa8aSmrg <entry>level_name[Level1]= "Base";</entry> 310e9fcaa8aSmrg <entry>Xkb->map->types[i].level_names[0]</entry> 311e9fcaa8aSmrg </row> 312eb411b4bSmrg <row> 313e9fcaa8aSmrg <entry>level_name[Level2]= "Caps";</entry> 314e9fcaa8aSmrg <entry>Xkb->map->types[i].level_names[1]</entry> 315e9fcaa8aSmrg </row> 316eb411b4bSmrg <row> 317e9fcaa8aSmrg <entry>level_name[Level3]= "Level3";</entry> 318e9fcaa8aSmrg <entry>Xkb->map->types[i].level_names[2]</entry> 319e9fcaa8aSmrg </row> 320eb411b4bSmrg <row> 321e9fcaa8aSmrg <entry>};</entry> 322e9fcaa8aSmrg <entry></entry> 323e9fcaa8aSmrg </row> 324e9fcaa8aSmrg</tbody> 325e9fcaa8aSmrg</tgroup> 326e9fcaa8aSmrg</table> 327e9fcaa8aSmrg 328e9fcaa8aSmrg<para> 3290f8248bfSmrgThe 3300f8248bfSmrg<structfield>name</structfield> 3310f8248bfSmrgof the example key type is "ALPHATHREE," and the modifiers it pays attention 3320f8248bfSmrgto are 3330f8248bfSmrg<symbol>Shift</symbol>, 3340f8248bfSmrg<symbol>Lock</symbol>, 3350f8248bfSmrgand the virtual modifier 3360f8248bfSmrg<emphasis>LevelThree</emphasis>. 3370f8248bfSmrgThere are three shift levels. The name of shift level one is "Base," the name 338e9fcaa8aSmrgof shift level two is "Caps," and the name of shift level three is "Level3." 339e9fcaa8aSmrg</para> 340e9fcaa8aSmrg 341e9fcaa8aSmrg 342e9fcaa8aSmrg<para> 3430f8248bfSmrgGiven the combination of the 3440f8248bfSmrg<structfield>map</structfield> 3450f8248bfSmrgand 3460f8248bfSmrg<structfield>preserve</structfield> 3470f8248bfSmrgspecifications, there are five 3480f8248bfSmrg<structfield>map</structfield> 3490f8248bfSmrgentries. The first map entry specifies that shift level one is to be used if 3500f8248bfSmrgno modifiers are set. The second entry specifies the 3510f8248bfSmrg<symbol>Lock</symbol> 3520f8248bfSmrgmodifier alone also yields shift level one. The third entry specifies the 3530f8248bfSmrg<symbol>Shift</symbol> 3540f8248bfSmrgmodifier alone yields shift level two. The fourth and fifth entries specify 3550f8248bfSmrgthat the virtual 3560f8248bfSmrg<emphasis>LevelThree</emphasis> 3570f8248bfSmrgmodifier alone, or in combination with the 3580f8248bfSmrg<symbol>Shift</symbol> 3590f8248bfSmrgmodifier, yields shift level three. 360e9fcaa8aSmrg</para> 361e9fcaa8aSmrg 362e9fcaa8aSmrg<note><para>Shift level three can be reached only if the virtual modifier 3630f8248bfSmrg<emphasis>LevelThree</emphasis> 3640f8248bfSmrgis bound to a real modifier (see <link linkend="Virtual_Modifier_Mapping">section 16.4</link>). If 3650f8248bfSmrg<emphasis>LevelThree</emphasis> 3660f8248bfSmrgis not bound to a real modifier, the 3670f8248bfSmrg<structfield>map</structfield> 3680f8248bfSmrgentries associated with it are ignored.</para></note> 3690f8248bfSmrg 3700f8248bfSmrg<para> 3710f8248bfSmrgBecause the 3720f8248bfSmrg<symbol>Lock</symbol> 3730f8248bfSmrgmodifier is to be preserved for further event processing, the 3740f8248bfSmrg<structfield>preserve</structfield> 3750f8248bfSmrglist is not 3760f8248bfSmrg<symbol>NULL</symbol> 3770f8248bfSmrgand parallels the 3780f8248bfSmrg<structfield>map</structfield> 3790f8248bfSmrglist. All 3800f8248bfSmrg<structfield>preserve</structfield> 3810f8248bfSmrgentries, except for the one corresponding to the 3820f8248bfSmrg<structfield>map</structfield> 3830f8248bfSmrgentry that specifies the 3840f8248bfSmrg<symbol>Lock</symbol> 3850f8248bfSmrgmodifier, do not list any modifiers. For the 3860f8248bfSmrg<structfield>map</structfield> 3870f8248bfSmrgentry that specifies the 3880f8248bfSmrg<symbol>Lock</symbol> 3890f8248bfSmrgmodifier, the corresponding 3900f8248bfSmrg<structfield>preserve</structfield> 3910f8248bfSmrglist entry lists the 3920f8248bfSmrg<symbol>Lock</symbol> 3930f8248bfSmrgmodifier, meaning do not consume the 3940f8248bfSmrg<symbol>Lock</symbol> 3950f8248bfSmrgmodifier. In this particular case, the preserved modifier is passed to Xlib 3960f8248bfSmrgtranslation functions and causes them to notice that the 3970f8248bfSmrg<symbol>Lock</symbol> 3980f8248bfSmrgmodifier is set; consequently, the Xlib functions apply the appropriate 399e9fcaa8aSmrgcapitalization rules to the symbol. Because this preserve entry is set only for 400e9fcaa8aSmrga modifier that yields shift level one, the capitalization occurs only for 401e9fcaa8aSmrglevel-one symbols. 402e9fcaa8aSmrg</para> 403e9fcaa8aSmrg 404e9fcaa8aSmrg 405eb411b4bSmrg<sect2 id='The_Canonical_Key_Types'> 406e9fcaa8aSmrg<title>The Canonical Key Types</title> 407e9fcaa8aSmrg 408e9fcaa8aSmrg<para> 4090f8248bfSmrgXkb allows up to 4100f8248bfSmrg<symbol>XkbMaxKeyTypes</symbol> 4110f8248bfSmrg(255) key types to be defined, but requires at least 4120f8248bfSmrg<symbol>XkbNumRequiredTypes</symbol> 4130f8248bfSmrg(4) predefined types to be in a key map. These predefined key types are 414e9fcaa8aSmrgreferred to as the canonical key types and describe the types of keys available 415e9fcaa8aSmrgon most keyboards. The definitions for the canonical key types are held in the 4160f8248bfSmrgfirst 4170f8248bfSmrg<symbol>XkbNumRequiredTypes</symbol> 4180f8248bfSmrgentries of the 4190f8248bfSmrg<structfield>types</structfield> 4200f8248bfSmrgfield of the client map and are indexed using the following constants: 4210f8248bfSmrg 4220f8248bfSmrg <simplelist type='vert' columns='1'> 4230f8248bfSmrg <member><symbol>XkbOneLevelIndex</symbol></member> 4240f8248bfSmrg <member><symbol>XkbTwoLevelIndex</symbol></member> 4250f8248bfSmrg <member><symbol>XkbAlphabeticIndex</symbol></member> 4260f8248bfSmrg <member><symbol>XkbKeypadIndex</symbol></member> 4270f8248bfSmrg </simplelist> 4280f8248bfSmrg</para> 429e9fcaa8aSmrg 430eb411b4bSmrg<sect3 id='ONE_LEVEL'> 431e9fcaa8aSmrg<title>ONE_LEVEL</title> 432e9fcaa8aSmrg 433e9fcaa8aSmrg<para> 434e9fcaa8aSmrgThe ONE_LEVEL key type describes groups that have only one symbol. The default 435e9fcaa8aSmrgONE_LEVEL key type has no map entries and does not pay attention to any 436e9fcaa8aSmrgmodifiers. A symbolic representation of this key type could look like the 437e9fcaa8aSmrgfollowing: 438e9fcaa8aSmrg</para> 439e9fcaa8aSmrg 440e9fcaa8aSmrg<literallayout> 4410f8248bfSmrg type "ONE_LEVEL" { 4420f8248bfSmrg modifiers = None; 4430f8248bfSmrg map[None]= Level1; 4440f8248bfSmrg level_name[Level1]= "Any"; 4450f8248bfSmrg }; 446e9fcaa8aSmrg</literallayout> 447e9fcaa8aSmrg 448e9fcaa8aSmrg<para> 4490f8248bfSmrgThe description of the ONE_LEVEL key type is stored in the 4500f8248bfSmrg<structfield>types</structfield> 4510f8248bfSmrg[ 4520f8248bfSmrg<symbol>XkbOneLevelIndex</symbol> 453e9fcaa8aSmrg] entry of the client key map. 454e9fcaa8aSmrg</para> 455e9fcaa8aSmrg 456e9fcaa8aSmrg 457e9fcaa8aSmrg</sect3> 458eb411b4bSmrg<sect3 id='TWO_LEVEL'> 459e9fcaa8aSmrg<title>TWO_LEVEL</title> 460e9fcaa8aSmrg 461e9fcaa8aSmrg<para> 462e9fcaa8aSmrgThe TWO_LEVEL key type describes groups that consist of two symbols but are 463e9fcaa8aSmrgneither alphabetic nor numeric keypad keys. The default TWO_LEVEL type uses 4640f8248bfSmrgonly the 4650f8248bfSmrg<symbol>Shift</symbol> 4660f8248bfSmrgmodifier. It returns shift level two if 4670f8248bfSmrg<symbol>Shift</symbol> 4680f8248bfSmrgis set, and level one if it is not. A symbolic representation of this key type 469e9fcaa8aSmrgcould look like the following: 470e9fcaa8aSmrg</para> 471e9fcaa8aSmrg 472e9fcaa8aSmrg<literallayout> 4730f8248bfSmrg type "TWO_LEVEL" { 4740f8248bfSmrg modifiers = Shift; 4750f8248bfSmrg map[Shift]= Level2; 4760f8248bfSmrg level_name[Level1]= "Base"; 4770f8248bfSmrg level_name[Level2]= "Shift"; 4780f8248bfSmrg }; 479e9fcaa8aSmrg</literallayout> 480e9fcaa8aSmrg 481e9fcaa8aSmrg<para> 4820f8248bfSmrgThe description of the TWO_LEVEL key type is stored in the 4830f8248bfSmrg<structfield>types</structfield> 4840f8248bfSmrg[ 4850f8248bfSmrg<symbol>XkbTwoLevelIndex</symbol> 486e9fcaa8aSmrg] entry of the client key map. 487e9fcaa8aSmrg</para> 488e9fcaa8aSmrg 489e9fcaa8aSmrg 490e9fcaa8aSmrg</sect3> 491eb411b4bSmrg<sect3 id='ALPHABETIC'> 492e9fcaa8aSmrg<title>ALPHABETIC</title> 493e9fcaa8aSmrg 494e9fcaa8aSmrg<para> 495e9fcaa8aSmrgThe ALPHABETIC key type describes groups consisting of two symbols: the 496e9fcaa8aSmrglowercase form of a symbol followed by the uppercase form of the same symbol. 4970f8248bfSmrgThe default ALPHABETIC type implements locale-sensitive <quote>Shift cancels 4980f8248bfSmrgCapsLock</quote> behavior using both the 4990f8248bfSmrg<symbol>Shift</symbol> 5000f8248bfSmrgand 5010f8248bfSmrg<symbol>Lock</symbol> 5020f8248bfSmrgmodifiers as follows: 503e9fcaa8aSmrg</para> 504e9fcaa8aSmrg 505e9fcaa8aSmrg<itemizedlist> 506e9fcaa8aSmrg<listitem> 507e9fcaa8aSmrg <para> 5080f8248bfSmrgIf 5090f8248bfSmrg<symbol>Shift</symbol> 5100f8248bfSmrgand 5110f8248bfSmrg<symbol>Lock</symbol> 5120f8248bfSmrgare both set, the default ALPHABETIC type yields level one. 513e9fcaa8aSmrg </para> 514e9fcaa8aSmrg</listitem> 515e9fcaa8aSmrg<listitem> 516e9fcaa8aSmrg <para> 5170f8248bfSmrgIf 5180f8248bfSmrg<symbol>Shift</symbol> 5190f8248bfSmrgalone is set, it yields level two. 520e9fcaa8aSmrg </para> 521e9fcaa8aSmrg</listitem> 522e9fcaa8aSmrg<listitem> 523e9fcaa8aSmrg <para> 5240f8248bfSmrgIf 5250f8248bfSmrg<symbol>Lock</symbol> 5260f8248bfSmrgalone is set, it yields level one, but preserves the 5270f8248bfSmrg<symbol>Lock</symbol> 5280f8248bfSmrgmodifier so Xlib notices and applies the appropriate capitalization rules. The 529e9fcaa8aSmrgXlib functions are locale-sensitive and apply different capitalization rules 530e9fcaa8aSmrgfor different locales. 531e9fcaa8aSmrg </para> 532e9fcaa8aSmrg</listitem> 533e9fcaa8aSmrg<listitem> 534e9fcaa8aSmrg <para> 5350f8248bfSmrgIf neither 5360f8248bfSmrg<symbol>Shift</symbol> 5370f8248bfSmrgnor 5380f8248bfSmrg<symbol>Lock</symbol> 5390f8248bfSmrgis set, it yields level one. 540e9fcaa8aSmrg </para> 541e9fcaa8aSmrg</listitem> 542e9fcaa8aSmrg</itemizedlist> 543e9fcaa8aSmrg 544e9fcaa8aSmrg<para> 545e9fcaa8aSmrgA symbolic representation of this key type could look like the following: 546e9fcaa8aSmrg</para> 547e9fcaa8aSmrg 548e9fcaa8aSmrg<literallayout> 5490f8248bfSmrg type "ALPHABETIC" { 5500f8248bfSmrg modifiers = Shift+Lock; 5510f8248bfSmrg map[Shift]= Level2; 5520f8248bfSmrg preserve[Lock]= Lock; 5530f8248bfSmrg level_name[Level1]= "Base"; 5540f8248bfSmrg level_name[Level2]= "Caps"; 5550f8248bfSmrg }; 556e9fcaa8aSmrg</literallayout> 557e9fcaa8aSmrg 558e9fcaa8aSmrg<para> 5590f8248bfSmrgThe description of the ALPHABETIC key type is stored in the 5600f8248bfSmrg<structfield>types</structfield> 5610f8248bfSmrg[ 5620f8248bfSmrg<symbol>XkbAlphabeticIndex</symbol> 563e9fcaa8aSmrg] entry of the client key map. 564e9fcaa8aSmrg</para> 565e9fcaa8aSmrg 566e9fcaa8aSmrg 567e9fcaa8aSmrg</sect3> 568eb411b4bSmrg<sect3 id='KEYPAD'> 569e9fcaa8aSmrg<title>KEYPAD</title> 570e9fcaa8aSmrg 571e9fcaa8aSmrg<para> 572e9fcaa8aSmrgThe KEYPAD key type describes groups that consist of two symbols, at least one 573e9fcaa8aSmrgof which is a numeric keypad symbol. The numeric keypad symbol is assumed to 5740f8248bfSmrgreside at level two. The default KEYPAD key type implements 5750f8248bfSmrg<quote>Shift cancels NumLock</quote> behavior using the Shift modifier 5760f8248bfSmrgand the real modifier bound to the virtual modifier named 5770f8248bfSmrg<quote>NumLock</quote>, known as the 5780f8248bfSmrg<emphasis>NumLock</emphasis> 5790f8248bfSmrgmodifier, as follows: 580e9fcaa8aSmrg</para> 581e9fcaa8aSmrg 582e9fcaa8aSmrg<itemizedlist> 583e9fcaa8aSmrg<listitem> 584e9fcaa8aSmrg <para> 5850f8248bfSmrgIf 5860f8248bfSmrg<symbol>Shift</symbol> 5870f8248bfSmrgand 5880f8248bfSmrg<emphasis>NumLock</emphasis> 5890f8248bfSmrgare both set, the default KEYPAD type yields level one. 590e9fcaa8aSmrg </para> 591e9fcaa8aSmrg</listitem> 592e9fcaa8aSmrg<listitem> 593e9fcaa8aSmrg <para> 5940f8248bfSmrgIf 5950f8248bfSmrg<symbol>Shift</symbol> 5960f8248bfSmrgalone is set, it yields level two. 597e9fcaa8aSmrg </para> 598e9fcaa8aSmrg</listitem> 599e9fcaa8aSmrg<listitem> 600e9fcaa8aSmrg <para> 6010f8248bfSmrgIf 6020f8248bfSmrg<emphasis>NumLock</emphasis> 6030f8248bfSmrgalone is set, it yields level two. 604e9fcaa8aSmrg </para> 605e9fcaa8aSmrg</listitem> 606e9fcaa8aSmrg<listitem> 607e9fcaa8aSmrg <para> 6080f8248bfSmrgIf neither 6090f8248bfSmrg<symbol>Shift</symbol> 6100f8248bfSmrgnor 6110f8248bfSmrg<emphasis>NumLock</emphasis> 6120f8248bfSmrgis set, it yields level one. 613e9fcaa8aSmrg </para> 614e9fcaa8aSmrg</listitem> 615e9fcaa8aSmrg</itemizedlist> 616e9fcaa8aSmrg 617e9fcaa8aSmrg<para> 618e9fcaa8aSmrgA symbolic representation of this key type could look like the following: 619e9fcaa8aSmrg</para> 620e9fcaa8aSmrg 621e9fcaa8aSmrg<literallayout> 6220f8248bfSmrg type "KEYPAD" { 6230f8248bfSmrg modifiers = Shift+NumLock; 6240f8248bfSmrg map[None]= Level1; 6250f8248bfSmrg map[Shift]= Level2; 6260f8248bfSmrg map[NumLock]= Level2; 6270f8248bfSmrg map[Shift+NumLock]= Level1; 6280f8248bfSmrg level_name[Level1]= "Base"; 6290f8248bfSmrg level_name[Level2]= "Caps"; 6300f8248bfSmrg }; 631e9fcaa8aSmrg</literallayout> 632e9fcaa8aSmrg 633e9fcaa8aSmrg<para> 6340f8248bfSmrgThe description of the KEYPAD key type is stored in the 6350f8248bfSmrg<structfield>types</structfield> 6360f8248bfSmrg[ 6370f8248bfSmrg<symbol>XkbKeypadIndex</symbol> 638e9fcaa8aSmrg] entry of the client key map. 639e9fcaa8aSmrg</para> 640e9fcaa8aSmrg 641e9fcaa8aSmrg 642e9fcaa8aSmrg</sect3> 643eb411b4bSmrg<sect3 id='Initializing_the_Canonical_Key_Types_in_a_New_Client_Map'> 644e9fcaa8aSmrg<title>Initializing the Canonical Key Types in a New Client Map</title> 645e9fcaa8aSmrg 646e9fcaa8aSmrg<para> 647e9fcaa8aSmrgTo set the definitions of the canonical key types in a client map to their 6480f8248bfSmrgdefault values, use 6490f8248bfSmrg<function>XkbInitCanonicalKeyTypes</function>. 6500f8248bfSmrg</para> 6510f8248bfSmrg 6520f8248bfSmrg<indexterm significance="preferred" zone="XkbInitCanonicalKeyTypes"><primary><function>XkbInitCanonicalKeyTypes</function></primary></indexterm> 6530f8248bfSmrg<funcsynopsis id="XkbInitCanonicalKeyTypes"> 6540f8248bfSmrg <funcprototype> 6550f8248bfSmrg <funcdef>Status <function>XkbInitCanonicalKeyTypes</function></funcdef> 6560f8248bfSmrg<!-- ( 6570f8248bfSmrg<parameter>xkb, which, keypadVMod</parameter> 6580f8248bfSmrg) --> 6590f8248bfSmrg 6600f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 6610f8248bfSmrg <paramdef>unsigned int <parameter>which</parameter></paramdef> 6620f8248bfSmrg <paramdef>int <parameter>keypadVMod</parameter></paramdef> 6630f8248bfSmrg </funcprototype> 6640f8248bfSmrg</funcsynopsis> 6650f8248bfSmrg<variablelist> 6660f8248bfSmrg <varlistentry> 6670f8248bfSmrg <term> 6680f8248bfSmrg <parameter>xkb</parameter> 6690f8248bfSmrg </term> 6700f8248bfSmrg <listitem> 6710f8248bfSmrg <para> 6720f8248bfSmrg keyboard description containing client map to initialize 6730f8248bfSmrg </para> 6740f8248bfSmrg </listitem> 6750f8248bfSmrg </varlistentry> 6760f8248bfSmrg <varlistentry> 6770f8248bfSmrg <term> 6780f8248bfSmrg <parameter>which</parameter> 6790f8248bfSmrg </term> 6800f8248bfSmrg <listitem> 6810f8248bfSmrg <para> 6820f8248bfSmrg mask of types to initialize 6830f8248bfSmrg </para> 6840f8248bfSmrg </listitem> 6850f8248bfSmrg </varlistentry> 6860f8248bfSmrg <varlistentry> 6870f8248bfSmrg <term> 6880f8248bfSmrg <parameter>keypadVMod</parameter> 6890f8248bfSmrg </term> 6900f8248bfSmrg <listitem> 6910f8248bfSmrg <para> 6920f8248bfSmrg index of NumLock virtual modifier 6930f8248bfSmrg </para> 6940f8248bfSmrg </listitem> 6950f8248bfSmrg </varlistentry> 6960f8248bfSmrg</variablelist> 6970f8248bfSmrg 6980f8248bfSmrg<para> 6990f8248bfSmrg<function>XkbInitCanonicalKeyTypes</function> 7000f8248bfSmrginitializes the first 7010f8248bfSmrg<symbol>XkbNumRequiredTypes</symbol> 7020f8248bfSmrgkey types of the keyboard specified by the 7030f8248bfSmrg<parameter>xkb</parameter> 7040f8248bfSmrgparameter to their default values. The 7050f8248bfSmrg<parameter>which</parameter> 7060f8248bfSmrgparameter specifies what canonical key types to initialize and is a bitwise 7070f8248bfSmrginclusive OR of the following masks: 7080f8248bfSmrg<symbol>XkbOneLevelMask</symbol>, 7090f8248bfSmrg<symbol>XkbTwoLevelMask</symbol>, 7100f8248bfSmrg<symbol>XkbAlphabeticMask</symbol>, 7110f8248bfSmrgand 7120f8248bfSmrg<symbol>XkbKeypadMask</symbol>. 7130f8248bfSmrgOnly those canonical types specified by the 7140f8248bfSmrg<parameter>which</parameter> 7150f8248bfSmrgmask are initialized. 7160f8248bfSmrg</para> 7170f8248bfSmrg 7180f8248bfSmrg 7190f8248bfSmrg<para> 7200f8248bfSmrgIf 7210f8248bfSmrg<symbol>XkbKeypadMask</symbol> 7220f8248bfSmrgis set in the 7230f8248bfSmrg<parameter>which</parameter> 7240f8248bfSmrgparameter, 7250f8248bfSmrg<function>XkbInitCanonicalKeyTypes</function> 7260f8248bfSmrglooks up the 7270f8248bfSmrg<emphasis>NumLock</emphasis> 7280f8248bfSmrgnamed virtual modifier to determine which virtual modifier to use when 7290f8248bfSmrginitializing the KEYPAD key type. If the 7300f8248bfSmrg<emphasis>NumLock</emphasis> 7310f8248bfSmrgvirtual modifier does not exist, 7320f8248bfSmrg<function>XkbInitCanonicalKeyTypes</function> 7330f8248bfSmrgcreates it. 7340f8248bfSmrg</para> 7350f8248bfSmrg 7360f8248bfSmrg 7370f8248bfSmrg<para> 7380f8248bfSmrg<function>XkbInitCanonicalKeyTypes</function> 7390f8248bfSmrgnormally returns Success. It returns 7400f8248bfSmrg<errorname>BadAccess</errorname> 7410f8248bfSmrgif the Xkb extension has not been properly initialized, and 7420f8248bfSmrg<errorname>BadAccess</errorname> 7430f8248bfSmrgif the 7440f8248bfSmrg<parameter>xkb</parameter> 7450f8248bfSmrgparameter is not valid. 746e9fcaa8aSmrg</para> 747e9fcaa8aSmrg 748e9fcaa8aSmrg 749e9fcaa8aSmrg 750e9fcaa8aSmrg</sect3> 751e9fcaa8aSmrg</sect2> 752eb411b4bSmrg<sect2 id='Getting_Key_Types_from_the_Server'> 753e9fcaa8aSmrg<title>Getting Key Types from the Server</title> 754e9fcaa8aSmrg 755e9fcaa8aSmrg<para> 756e9fcaa8aSmrgTo obtain the list of available key types in the server’s keyboard mapping, 7570f8248bfSmrguse 7580f8248bfSmrg<function>XkbGetKeyTypes</function>. 7590f8248bfSmrg</para> 7600f8248bfSmrg 7610f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyTypes"><primary><function>XkbGetKeyTypes</function></primary></indexterm> 7620f8248bfSmrg<funcsynopsis id="XkbGetKeyTypes"> 7630f8248bfSmrg <funcprototype> 7640f8248bfSmrg <funcdef>Status <function>XkbGetKeyTypes</function></funcdef> 7650f8248bfSmrg<!-- ( 7660f8248bfSmrg<parameter>dpy</parameter>, 7670f8248bfSmrg<parameter>first</parameter>, 7680f8248bfSmrg<parameter>num</parameter>, 7690f8248bfSmrg<parameter>xkb</parameter> 7700f8248bfSmrg) --> 7710f8248bfSmrg 7720f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 7730f8248bfSmrg <paramdef>unsigned int <parameter>first</parameter></paramdef> 7740f8248bfSmrg <paramdef>unsigned int <parameter>num</parameter></paramdef> 7750f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 7760f8248bfSmrg </funcprototype> 7770f8248bfSmrg</funcsynopsis> 7780f8248bfSmrg<variablelist> 7790f8248bfSmrg <varlistentry> 7800f8248bfSmrg <term> 7810f8248bfSmrg <parameter>dpy</parameter> 7820f8248bfSmrg </term> 7830f8248bfSmrg <listitem> 7840f8248bfSmrg <para> 7850f8248bfSmrg connection to X server 7860f8248bfSmrg </para> 7870f8248bfSmrg </listitem> 7880f8248bfSmrg </varlistentry> 7890f8248bfSmrg <varlistentry> 7900f8248bfSmrg <term> 7910f8248bfSmrg <parameter>first</parameter> 7920f8248bfSmrg </term> 7930f8248bfSmrg <listitem> 7940f8248bfSmrg <para> 7950f8248bfSmrg index to first type to get, 0 ⇒ 1st type 7960f8248bfSmrg </para> 7970f8248bfSmrg </listitem> 7980f8248bfSmrg </varlistentry> 7990f8248bfSmrg <varlistentry> 8000f8248bfSmrg <term> 8010f8248bfSmrg <parameter>num</parameter> 8020f8248bfSmrg </term> 8030f8248bfSmrg <listitem> 8040f8248bfSmrg <para> 8050f8248bfSmrg number of key types to be returned 8060f8248bfSmrg </para> 8070f8248bfSmrg </listitem> 8080f8248bfSmrg </varlistentry> 8090f8248bfSmrg <varlistentry> 8100f8248bfSmrg <term> 8110f8248bfSmrg <parameter>xkb</parameter> 8120f8248bfSmrg </term> 8130f8248bfSmrg <listitem> 8140f8248bfSmrg <para> 8150f8248bfSmrg keyboard description containing client map to update 8160f8248bfSmrg </para> 8170f8248bfSmrg </listitem> 8180f8248bfSmrg </varlistentry> 8190f8248bfSmrg</variablelist> 8200f8248bfSmrg<note><para> 8210f8248bfSmrg<function>XkbGetKeyTypes</function> 8220f8248bfSmrgis used to obtain descriptions of the key types themselves, not the key types 823e9fcaa8aSmrgbound to individual keys. To obtain the key types bound to an individual key, 8240f8248bfSmrgrefer to the 8250f8248bfSmrg<structfield>key_sym_map</structfield> 8260f8248bfSmrgfield of the client map (see <link linkend="Per_Key_Key_Type_Indices">section 15.3.1</link>).</para></note> 827e9fcaa8aSmrg 828e9fcaa8aSmrg<para> 8290f8248bfSmrg<function>XkbGetKeyTypes</function> 8300f8248bfSmrgqueries the server for the desired types, waits for a reply, and returns the 8310f8248bfSmrgdesired types in the 8320f8248bfSmrg<structfield>xkb->map->types</structfield>. 8330f8248bfSmrgIf successful, it returns Success. 834e9fcaa8aSmrg</para> 835e9fcaa8aSmrg 836e9fcaa8aSmrg 837e9fcaa8aSmrg<para> 8380f8248bfSmrg<function>XkbGetKeyTypes</function> 8390f8248bfSmrgreturns 8400f8248bfSmrg<errorname>BadAccess</errorname> 8410f8248bfSmrgif the Xkb extension has not been properly initialized and 8420f8248bfSmrg<errorname>BadValue</errorname> 8430f8248bfSmrgif the combination of 8440f8248bfSmrg<parameter>first</parameter> 8450f8248bfSmrgand 8460f8248bfSmrg<parameter>num</parameter> 8470f8248bfSmrgresults in numbers out of valid range. 848e9fcaa8aSmrg</para> 849e9fcaa8aSmrg 850e9fcaa8aSmrg 851e9fcaa8aSmrg</sect2> 852eb411b4bSmrg<sect2 id='Changing_the_Number_of_Levels_in_a_Key_Type'> 853e9fcaa8aSmrg<title>Changing the Number of Levels in a Key Type</title> 854e9fcaa8aSmrg 855e9fcaa8aSmrg<para> 8560f8248bfSmrgTo change the number of levels in a key type, use 8570f8248bfSmrg<function>XkbResizeKeyType</function>. 8580f8248bfSmrg</para> 8590f8248bfSmrg 8600f8248bfSmrg<indexterm significance="preferred" zone="XkbResizeKeyType"><primary><function>XkbResizeKeyType</function></primary></indexterm> 8610f8248bfSmrg<funcsynopsis id="XkbResizeKeyType"> 8620f8248bfSmrg <funcprototype> 8630f8248bfSmrg <funcdef>Status <function>XkbResizeKeyType</function></funcdef> 8640f8248bfSmrg<!-- ( 8650f8248bfSmrg<parameter>xkb</parameter>, 8660f8248bfSmrg<parameter>type_ndx</parameter>, 8670f8248bfSmrg<parameter>map_count</parameter>, 8680f8248bfSmrg<parameter>want_preserve</parameter>, 8690f8248bfSmrg<parameter>new_num_lvls</parameter> 8700f8248bfSmrg) --> 8710f8248bfSmrg 8720f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 8730f8248bfSmrg <paramdef>int <parameter>type_ndx</parameter></paramdef> 8740f8248bfSmrg <paramdef>int <parameter>map_count</parameter></paramdef> 8750f8248bfSmrg <paramdef>Bool <parameter>want_preserve</parameter></paramdef> 8760f8248bfSmrg <paramdef>int <parameter>new_num_lvls</parameter></paramdef> 8770f8248bfSmrg </funcprototype> 8780f8248bfSmrg</funcsynopsis> 8790f8248bfSmrg<variablelist> 8800f8248bfSmrg <varlistentry> 8810f8248bfSmrg <term> 8820f8248bfSmrg <parameter>xkb</parameter> 8830f8248bfSmrg </term> 8840f8248bfSmrg <listitem> 8850f8248bfSmrg <para> 8860f8248bfSmrg keyboard description containing client map to update 8870f8248bfSmrg </para> 8880f8248bfSmrg </listitem> 8890f8248bfSmrg </varlistentry> 8900f8248bfSmrg <varlistentry> 8910f8248bfSmrg <term> 8920f8248bfSmrg <parameter>type_ndx</parameter> 8930f8248bfSmrg </term> 8940f8248bfSmrg <listitem> 8950f8248bfSmrg <para> 8960f8248bfSmrg index in xkb->map->types of type to change 8970f8248bfSmrg </para> 8980f8248bfSmrg </listitem> 8990f8248bfSmrg </varlistentry> 9000f8248bfSmrg <varlistentry> 9010f8248bfSmrg <term> 9020f8248bfSmrg <parameter>map_count</parameter> 9030f8248bfSmrg </term> 9040f8248bfSmrg <listitem> 9050f8248bfSmrg <para> 9060f8248bfSmrg total # of map entries needed for the type 9070f8248bfSmrg </para> 9080f8248bfSmrg </listitem> 9090f8248bfSmrg </varlistentry> 9100f8248bfSmrg <varlistentry> 9110f8248bfSmrg <term> 9120f8248bfSmrg <parameter>want_preserve</parameter> 9130f8248bfSmrg </term> 9140f8248bfSmrg <listitem> 9150f8248bfSmrg <para> 9160f8248bfSmrg <symbol>True</symbol> 9170f8248bfSmrg ⇒ list of preserved modifiers is necessary 9180f8248bfSmrg </para> 9190f8248bfSmrg </listitem> 9200f8248bfSmrg </varlistentry> 9210f8248bfSmrg <varlistentry> 9220f8248bfSmrg <term> 9230f8248bfSmrg <parameter>new_num_lvls</parameter> 9240f8248bfSmrg </term> 9250f8248bfSmrg <listitem> 9260f8248bfSmrg <para> 9270f8248bfSmrg new max # of levels for type 9280f8248bfSmrg </para> 9290f8248bfSmrg </listitem> 9300f8248bfSmrg </varlistentry> 9310f8248bfSmrg</variablelist> 9320f8248bfSmrg 9330f8248bfSmrg<para> 9340f8248bfSmrg<function>XkbResizeKeyType</function> 9350f8248bfSmrgchanges the type specified by 9360f8248bfSmrg<parameter>xkb</parameter>-><structfield>map->types</structfield> 9370f8248bfSmrg[ 9380f8248bfSmrg<parameter>type_ndx</parameter> 939e9fcaa8aSmrg], and reallocates the symbols and actions bound to all keys that use the type, 9400f8248bfSmrgif necessary. 9410f8248bfSmrg<function>XkbResizeKeyType</function> 9420f8248bfSmrgupdates only the local copy of the types in 9430f8248bfSmrg<parameter>xkb</parameter>; 9440f8248bfSmrgto update the server’s copy for the physical device, use 9450f8248bfSmrg<function>XkbSetMap</function> 9460f8248bfSmrgor 9470f8248bfSmrg<function>XkbChangeMap</function> 9480f8248bfSmrgafter calling 9490f8248bfSmrg<function>XkbResizeKeyType</function>. 9500f8248bfSmrg</para> 9510f8248bfSmrg 9520f8248bfSmrg 9530f8248bfSmrg<para> 9540f8248bfSmrgThe 9550f8248bfSmrg<parameter>map_count</parameter> 9560f8248bfSmrgparameter specifies the total number of map entries needed for the type, and 9570f8248bfSmrgcan be zero or greater. If 9580f8248bfSmrg<parameter>map_count</parameter> 9590f8248bfSmrgis zero, 9600f8248bfSmrg<function>XkbResizeKeyType</function> 9610f8248bfSmrgfrees the existing 9620f8248bfSmrg<structfield>map</structfield> 9630f8248bfSmrgand 9640f8248bfSmrg<structfield>preserve</structfield> 9650f8248bfSmrgentries for the type if they exist and sets them to 9660f8248bfSmrg<symbol>NULL</symbol>. 9670f8248bfSmrg</para> 9680f8248bfSmrg 9690f8248bfSmrg 9700f8248bfSmrg<para> 9710f8248bfSmrgThe 9720f8248bfSmrg<parameter>want_preserve</parameter> 9730f8248bfSmrgparameter specifies whether a 9740f8248bfSmrg<structfield>preserve</structfield> 9750f8248bfSmrglist for the key should be created. If 9760f8248bfSmrg<parameter>want_preserve</parameter> 9770f8248bfSmrgis 9780f8248bfSmrg<symbol>True</symbol>, 9790f8248bfSmrgthe 9800f8248bfSmrg<structfield>preserve</structfield> 9810f8248bfSmrglist with 9820f8248bfSmrg<parameter>map_count</parameter> 9830f8248bfSmrgentries is allocated or reallocated if it already exists. Otherwise, if 9840f8248bfSmrg<parameter>want_preserve</parameter> 9850f8248bfSmrgis 9860f8248bfSmrg<symbol>False</symbol>, 9870f8248bfSmrgthe 9880f8248bfSmrg<structfield>preserve</structfield> 9890f8248bfSmrgfield is freed if necessary and set to 9900f8248bfSmrg<symbol>NULL</symbol>. 9910f8248bfSmrg</para> 9920f8248bfSmrg 9930f8248bfSmrg 9940f8248bfSmrg<para> 9950f8248bfSmrgThe 9960f8248bfSmrg<parameter>new_num_lvls</parameter> 9970f8248bfSmrgparameter specifies the new maximum number of shift levels for the type and is 998e9fcaa8aSmrgused to calculate and resize the symbols and actions bound to all keys that use 999e9fcaa8aSmrgthe type. 1000e9fcaa8aSmrg</para> 1001e9fcaa8aSmrg 1002e9fcaa8aSmrg 1003e9fcaa8aSmrg<para> 10040f8248bfSmrgIf 10050f8248bfSmrg<parameter>type_ndx</parameter> 10060f8248bfSmrgdoes not specify a legal type, 10070f8248bfSmrg<parameter>new_num_lvls</parameter> 10080f8248bfSmrgis less than 1, or the 10090f8248bfSmrg<parameter>map_count</parameter> 10100f8248bfSmrgis less than zero, 10110f8248bfSmrg<function>XkbResizeKeyType</function> 10120f8248bfSmrgreturns 10130f8248bfSmrg<errorname>BadValue</errorname>. 10140f8248bfSmrgIf 10150f8248bfSmrg<function>XkbResizeKeyType</function> 10160f8248bfSmrgencounters any problems with allocation, it returns 10170f8248bfSmrg<errorname>BadAlloc</errorname>. 10180f8248bfSmrgOtherwise, it returns 10190f8248bfSmrg<symbol>Success</symbol>. 1020e9fcaa8aSmrg</para> 1021e9fcaa8aSmrg 1022e9fcaa8aSmrg 1023e9fcaa8aSmrg</sect2> 1024eb411b4bSmrg<sect2 id='Copying_Key_Types'> 1025e9fcaa8aSmrg<title>Copying Key Types</title> 1026e9fcaa8aSmrg 1027e9fcaa8aSmrg<para> 10280f8248bfSmrgUse 10290f8248bfSmrg<function>XkbCopyKeyType</function> 10300f8248bfSmrgand 10310f8248bfSmrg<function>XkbCopyKeyTypes</function> 10320f8248bfSmrgto copy one or more 10330f8248bfSmrg<structname>XkbKeyTypeRec</structname> 10340f8248bfSmrgstructures. 10350f8248bfSmrg</para> 10360f8248bfSmrg 10370f8248bfSmrg<indexterm significance="preferred" zone="XkbCopyKeyType"><primary><function>XkbCopyKeyType</function></primary></indexterm> 10380f8248bfSmrg<funcsynopsis id="XkbCopyKeyType"> 10390f8248bfSmrg <funcprototype> 10400f8248bfSmrg <funcdef>Status <function>XkbCopyKeyType</function></funcdef> 10410f8248bfSmrg<!-- ( 10420f8248bfSmrg<parameter>from</parameter>, 10430f8248bfSmrg<parameter>into</parameter> 10440f8248bfSmrg) --> 10450f8248bfSmrg 10460f8248bfSmrg <paramdef>XkbKeyTypePtr <parameter>from</parameter></paramdef> 10470f8248bfSmrg <paramdef>XkbKeyTypePtr <parameter>into</parameter></paramdef> 10480f8248bfSmrg </funcprototype> 10490f8248bfSmrg</funcsynopsis> 10500f8248bfSmrg<variablelist> 10510f8248bfSmrg <varlistentry> 10520f8248bfSmrg <term> 10530f8248bfSmrg <parameter>from</parameter> 10540f8248bfSmrg </term> 10550f8248bfSmrg <listitem> 10560f8248bfSmrg <para> 10570f8248bfSmrg pointer to XkbKeyTypeRec to be copied 10580f8248bfSmrg </para> 10590f8248bfSmrg </listitem> 10600f8248bfSmrg </varlistentry> 10610f8248bfSmrg <varlistentry> 10620f8248bfSmrg <term> 10630f8248bfSmrg <parameter>into</parameter> 10640f8248bfSmrg </term> 10650f8248bfSmrg <listitem> 10660f8248bfSmrg <para> 10670f8248bfSmrg pointer to XkbKeyTypeRec to be changed 10680f8248bfSmrg </para> 10690f8248bfSmrg </listitem> 10700f8248bfSmrg </varlistentry> 10710f8248bfSmrg</variablelist> 10720f8248bfSmrg 10730f8248bfSmrg<para> 10740f8248bfSmrg<function>XkbCopyKeyType</function> 10750f8248bfSmrgcopies the key type specified by 10760f8248bfSmrg<parameter>from</parameter> 10770f8248bfSmrgto the key type specified by 10780f8248bfSmrg<parameter>into</parameter>. 10790f8248bfSmrgBoth must point to legal 10800f8248bfSmrg<structname>XkbKeyTypeRec</structname> 10810f8248bfSmrgstructures. Xkb assumes 10820f8248bfSmrg<parameter>from</parameter> 10830f8248bfSmrgand 10840f8248bfSmrg<parameter>into</parameter> 10850f8248bfSmrgpoint to different places. As a result, overlaps can be fatal. 10860f8248bfSmrg<function>XkbCopyKeyType</function> 10870f8248bfSmrgfrees any existing 10880f8248bfSmrg<structfield>map</structfield>, 10890f8248bfSmrg<structfield>preserve</structfield>, 10900f8248bfSmrgand 10910f8248bfSmrg<structfield>level_names</structfield> 10920f8248bfSmrgin 10930f8248bfSmrg<parameter>into</parameter> 10940f8248bfSmrgprior to copying. If any allocation errors occur while copying 10950f8248bfSmrg<parameter>from</parameter> 10960f8248bfSmrgto 10970f8248bfSmrg<parameter>into</parameter>, 10980f8248bfSmrg<function>XkbCopyKeyType</function> 10990f8248bfSmrgreturns 11000f8248bfSmrg<errorname>BadAlloc</errorname>. 11010f8248bfSmrgOtherwise, 11020f8248bfSmrg<function>XkbCopyKeyType</function> 11030f8248bfSmrgcopies 11040f8248bfSmrg<parameter>from</parameter> 11050f8248bfSmrgto 11060f8248bfSmrg<parameter>into</parameter> 11070f8248bfSmrgand returns 11080f8248bfSmrg<symbol>Success</symbol>. 11090f8248bfSmrg</para> 11100f8248bfSmrg 11110f8248bfSmrg 11120f8248bfSmrg<indexterm significance="preferred" zone="XkbCopyKeyTypes"><primary><function>XkbCopyKeyTypes</function></primary></indexterm> 11130f8248bfSmrg<funcsynopsis id="XkbCopyKeyTypes"> 11140f8248bfSmrg <funcprototype> 11150f8248bfSmrg <funcdef>Status <function>XkbCopyKeyTypes</function></funcdef> 11160f8248bfSmrg<!-- ( 11170f8248bfSmrg<parameter>from</parameter>, 11180f8248bfSmrg<parameter>into</parameter>, 11190f8248bfSmrg<parameter>num_types</parameter> 11200f8248bfSmrg) --> 11210f8248bfSmrg 11220f8248bfSmrg <paramdef>XkbKeyTypePtr <parameter>from</parameter></paramdef> 11230f8248bfSmrg <paramdef>XkbKeyTypePtr <parameter>into</parameter></paramdef> 11240f8248bfSmrg <paramdef>int <parameter>num_types</parameter></paramdef> 11250f8248bfSmrg </funcprototype> 11260f8248bfSmrg</funcsynopsis> 11270f8248bfSmrg<variablelist> 11280f8248bfSmrg <varlistentry> 11290f8248bfSmrg <term> 11300f8248bfSmrg <parameter>from</parameter> 11310f8248bfSmrg </term> 11320f8248bfSmrg <listitem> 11330f8248bfSmrg <para> 11340f8248bfSmrg pointer to array of XkbKeyTypeRecs to copy 11350f8248bfSmrg </para> 11360f8248bfSmrg </listitem> 11370f8248bfSmrg </varlistentry> 11380f8248bfSmrg <varlistentry> 11390f8248bfSmrg <term> 11400f8248bfSmrg <parameter>into</parameter> 11410f8248bfSmrg </term> 11420f8248bfSmrg <listitem> 11430f8248bfSmrg <para> 11440f8248bfSmrg pointer to array of XkbKeyTypeRecs to change 11450f8248bfSmrg </para> 11460f8248bfSmrg </listitem> 11470f8248bfSmrg </varlistentry> 11480f8248bfSmrg <varlistentry> 11490f8248bfSmrg <term> 11500f8248bfSmrg <parameter>num_types</parameter> 11510f8248bfSmrg </term> 11520f8248bfSmrg <listitem> 11530f8248bfSmrg <para> 11540f8248bfSmrg number of types to copy 11550f8248bfSmrg </para> 11560f8248bfSmrg </listitem> 11570f8248bfSmrg </varlistentry> 11580f8248bfSmrg</variablelist> 11590f8248bfSmrg 11600f8248bfSmrg<para> 11610f8248bfSmrg<function>XkbCopyKeyTypes</function> 11620f8248bfSmrgcopies 11630f8248bfSmrg<parameter>num_types</parameter> 11640f8248bfSmrg<structname>XkbKeyTypeRec</structname> 11650f8248bfSmrgstructures from the array specified by 11660f8248bfSmrg<parameter>from</parameter> 11670f8248bfSmrginto the array specified by 11680f8248bfSmrg<parameter>into</parameter>. 11690f8248bfSmrgIt is intended for copying between, rather than within, keyboard 1170e9fcaa8aSmrgdescriptions, so it doesn’t check for overlaps. The same rules that apply to 11710f8248bfSmrgthe 11720f8248bfSmrg<parameter>from</parameter> 11730f8248bfSmrgand 11740f8248bfSmrg<parameter>into</parameter> 11750f8248bfSmrgparameters in 11760f8248bfSmrg<function>XkbCopyKeyType</function> 11770f8248bfSmrgapply to each entry of the 11780f8248bfSmrg<parameter>from</parameter> 11790f8248bfSmrgand 11800f8248bfSmrg<parameter>into</parameter> 11810f8248bfSmrgarrays of 11820f8248bfSmrg<function>XkbCopyKeyTypes</function>. 11830f8248bfSmrgIf any allocation errors occur while copying 11840f8248bfSmrg<parameter>from</parameter> 11850f8248bfSmrgto 11860f8248bfSmrg<parameter>into</parameter>, 11870f8248bfSmrg<function>XkbCopyKeyTypes</function> 11880f8248bfSmrgreturns 11890f8248bfSmrg<errorname>BadAlloc</errorname>. 11900f8248bfSmrgOtherwise, 11910f8248bfSmrg<function>XkbCopyKeyTypes</function> 11920f8248bfSmrgcopies 11930f8248bfSmrg<parameter>from</parameter> 11940f8248bfSmrgto 11950f8248bfSmrg<parameter>into</parameter> 11960f8248bfSmrgand returns 11970f8248bfSmrg<symbol>Success</symbol>. 1198e9fcaa8aSmrg</para> 1199e9fcaa8aSmrg 1200e9fcaa8aSmrg 1201e9fcaa8aSmrg</sect2> 1202e9fcaa8aSmrg</sect1> 1203eb411b4bSmrg<sect1 id='Key_Symbol_Map'> 1204e9fcaa8aSmrg<title>Key Symbol Map</title> 12050f8248bfSmrg<indexterm significance="preferred" zone="Key_Symbol_Map"> 12060f8248bfSmrg<primary><structname>XkbSymMapRec</structname></primary></indexterm> 1207e9fcaa8aSmrg 1208e9fcaa8aSmrg<para> 1209e9fcaa8aSmrgThe entire list of key symbols for the keyboard mapping is held in the 12100f8248bfSmrg<structfield>syms</structfield> 12110f8248bfSmrgfield of the client map. Whereas the core keyboard mapping is a 12120f8248bfSmrgtwo-dimensional array of 12130f8248bfSmrg<type>KeySym</type>s 12140f8248bfSmrgwhose rows are indexed by keycode, the 12150f8248bfSmrg<structfield>syms</structfield> 12160f8248bfSmrgfield of Xkb is a linear list of 12170f8248bfSmrg<type>KeySym</type>s 12180f8248bfSmrgthat needs to be indexed uniquely for each key. This section describes the key 1219e9fcaa8aSmrgsymbol map and the methods for determining the symbols bound to a key. 1220e9fcaa8aSmrg</para> 1221e9fcaa8aSmrg 1222e9fcaa8aSmrg 1223e9fcaa8aSmrg<para> 12240f8248bfSmrgThe reason the 12250f8248bfSmrg<structfield>syms</structfield> 12260f8248bfSmrgfield is a linear list of 12270f8248bfSmrg<type>KeySym</type>s 12280f8248bfSmrgis to reduce the memory consumption associated with a keymap; because Xkb 1229e9fcaa8aSmrgallows individual keys to have multiple shift levels and a different number of 12300f8248bfSmrggroups per key, a single two-dimensional array of 12310f8248bfSmrg<type>KeySym</type>s 12320f8248bfSmrgwould potentially be very large and sparse. Instead, Xkb provides a small 12330f8248bfSmrgtwo-dimensional array of 12340f8248bfSmrg<type>KeySym</type>s 12350f8248bfSmrgfor each key. To store all of these individual arrays, Xkb concatenates each 12360f8248bfSmrgarray together in the 12370f8248bfSmrg<structfield>syms</structfield> 12380f8248bfSmrgfield of the client map. 12390f8248bfSmrg</para> 12400f8248bfSmrg 12410f8248bfSmrg 12420f8248bfSmrg<para> 12430f8248bfSmrgIn order to determine which 12440f8248bfSmrg<type>KeySym</type>s 12450f8248bfSmrgin the 12460f8248bfSmrg<structfield>syms</structfield> 12470f8248bfSmrgfield are associated with each keycode, the client map contains an array of 12480f8248bfSmrgkey symbol mappings, held in the 12490f8248bfSmrg<structfield>key_sym_map</structfield> 12500f8248bfSmrgfield. The 12510f8248bfSmrg<structfield>key_sym_map</structfield> 12520f8248bfSmrgfield is an array of 12530f8248bfSmrg<structname>XkbSymMapRec</structname> 12540f8248bfSmrgstructures indexed by keycode. The 12550f8248bfSmrg<structfield>key_sym_map</structfield> 12560f8248bfSmrgarray has 12570f8248bfSmrg<structfield>min_key_code</structfield> 12580f8248bfSmrgunused entries at the start to allow direct indexing using a keycode. All 1259e9fcaa8aSmrgkeycodes falling between the minimum and maximum legal keycodes, inclusive, 12600f8248bfSmrghave 12610f8248bfSmrg<structfield>key_sym_map</structfield> 12620f8248bfSmrgarrays, whether or not any key actually yields that code. The 12630f8248bfSmrg<structname>KeySymMapRec</structname> 12640f8248bfSmrgstructure is defined as follows: 1265e9fcaa8aSmrg 12660f8248bfSmrg<programlisting> 1267e9fcaa8aSmrg#define XkbNumKbdGroups 4 1268e9fcaa8aSmrg#define XkbMaxKbdGroup (XkbNumKbdGroups-1) 1269e9fcaa8aSmrg 12700f8248bfSmrgtypedef struct { /* map to keysyms for a single keycode */ 12710f8248bfSmrg unsigned char kt_index[XkbNumKbdGroups]; 12720f8248bfSmrg /* key type index for each group */ 12730f8248bfSmrg unsigned char group_info; /* # of groups and out of range 12740f8248bfSmrg group handling */ 12750f8248bfSmrg unsigned char width; /* max # of shift levels for key */ 12760f8248bfSmrg unsigned short offset; /* index to keysym table in 12770f8248bfSmrg <structfield>syms</structfield> array */ 12780f8248bfSmrg} <structname>XkbSymMapRec</structname>, *XkbSymMapPtr; 1279e9fcaa8aSmrg</programlisting></para> 1280e9fcaa8aSmrg 1281e9fcaa8aSmrg<para> 1282e9fcaa8aSmrgThese fields are described in detail in the following sections. 1283e9fcaa8aSmrg</para> 1284e9fcaa8aSmrg 1285e9fcaa8aSmrg 1286eb411b4bSmrg<sect2 id='Per_Key_Key_Type_Indices'> 1287e9fcaa8aSmrg<title>Per-Key Key Type Indices</title> 1288e9fcaa8aSmrg 1289e9fcaa8aSmrg<para> 12900f8248bfSmrgThe 12910f8248bfSmrg<structfield>kt_index</structfield> 12920f8248bfSmrgarray of the 12930f8248bfSmrg<structname>XkbSymMapRec</structname> 12940f8248bfSmrgstructure contains the indices of the key types (see <link linkend="Key_Types">section 15.2</link>) for each 1295e9fcaa8aSmrgpossible group of symbols associated with the key. To obtain the index of a key 1296e9fcaa8aSmrgtype or the pointer to a key type, Xkb provides the following macros, to access 1297e9fcaa8aSmrgthe key types: 1298e9fcaa8aSmrg</para> 1299e9fcaa8aSmrg 1300e9fcaa8aSmrg<note><para>The array of key types is of fixed width and is large enough to 13010f8248bfSmrghold key types for the maximum legal number of groups 13020f8248bfSmrg(<symbol>XkbNumKbdGroups</symbol>, 13030f8248bfSmrgcurrently four); if a key has fewer than 13040f8248bfSmrg<symbol>XkbNumKbdGroups</symbol> 13050f8248bfSmrggroups, the extra key types are reported but ignored.</para></note> 13060f8248bfSmrg 1307cbfda780Smrg<indexterm significance="preferred" zone="XkbKeyKeyTypeIndex"><primary><function>XkbKeyKeyTypeIndex</function></primary></indexterm> 1308cbfda780Smrg<funcsynopsis id="XkbKeyKeyTypeIndex"> 13090f8248bfSmrg <funcprototype> 1310cbfda780Smrg <funcdef>int <function>XkbKeyKeyTypeIndex</function></funcdef> 13110f8248bfSmrg<!-- ( 13120f8248bfSmrg<parameter>xkb, keycode, group</parameter> 13130f8248bfSmrg) /* macro*/ --> 13140f8248bfSmrg 13150f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 13160f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 13170f8248bfSmrg <paramdef>int <parameter>group</parameter></paramdef> 13180f8248bfSmrg </funcprototype> 13190f8248bfSmrg</funcsynopsis> 13200f8248bfSmrg<variablelist> 13210f8248bfSmrg <varlistentry> 13220f8248bfSmrg <term> 13230f8248bfSmrg <parameter>xkb</parameter> 13240f8248bfSmrg </term> 13250f8248bfSmrg <listitem> 13260f8248bfSmrg <para> 13270f8248bfSmrg Xkb description of interest 13280f8248bfSmrg </para> 13290f8248bfSmrg </listitem> 13300f8248bfSmrg </varlistentry> 13310f8248bfSmrg <varlistentry> 13320f8248bfSmrg <term> 13330f8248bfSmrg <parameter>keycode</parameter> 13340f8248bfSmrg </term> 13350f8248bfSmrg <listitem> 13360f8248bfSmrg <para> 13370f8248bfSmrg keycode of interest 13380f8248bfSmrg </para> 13390f8248bfSmrg </listitem> 13400f8248bfSmrg </varlistentry> 13410f8248bfSmrg <varlistentry> 13420f8248bfSmrg <term> 13430f8248bfSmrg <parameter>group</parameter> 13440f8248bfSmrg </term> 13450f8248bfSmrg <listitem> 13460f8248bfSmrg <para> 13470f8248bfSmrg group index 13480f8248bfSmrg </para> 13490f8248bfSmrg </listitem> 13500f8248bfSmrg </varlistentry> 13510f8248bfSmrg</variablelist> 13520f8248bfSmrg 13530f8248bfSmrg<para> 1354cbfda780Smrg<function>XkbKeyKeyTypeIndex</function> 13550f8248bfSmrgcomputes an index into the 13560f8248bfSmrg<structfield>types</structfield> 13570f8248bfSmrgvector of the client map in 13580f8248bfSmrg<parameter>xkb</parameter> 13590f8248bfSmrgfrom the given 13600f8248bfSmrg<parameter>keycode</parameter> 13610f8248bfSmrgand 13620f8248bfSmrg<parameter>group</parameter> 13630f8248bfSmrgindex. 13640f8248bfSmrg</para> 13650f8248bfSmrg 13660f8248bfSmrg 1367cbfda780Smrg<indexterm significance="preferred" zone="XkbKeyKeyType"><primary><function>XkbKeyKeyType</function></primary></indexterm> 1368cbfda780Smrg<funcsynopsis id="XkbKeyKeyType"> 13690f8248bfSmrg <funcprototype> 1370cbfda780Smrg <funcdef>XkbKeyTypePtr <function>XkbKeyKeyType</function></funcdef> 13710f8248bfSmrg<!-- ( 13720f8248bfSmrg<parameter>xkb, keycode, group</parameter> 13730f8248bfSmrg) /* macro */ --> 13740f8248bfSmrg 13750f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 13760f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 13770f8248bfSmrg <paramdef>int <parameter>group</parameter></paramdef> 13780f8248bfSmrg </funcprototype> 13790f8248bfSmrg</funcsynopsis> 13800f8248bfSmrg<variablelist> 13810f8248bfSmrg <varlistentry> 13820f8248bfSmrg <term> 13830f8248bfSmrg <parameter>xkb</parameter> 13840f8248bfSmrg </term> 13850f8248bfSmrg <listitem> 13860f8248bfSmrg <para> 13870f8248bfSmrg Xkb description of interest 13880f8248bfSmrg </para> 13890f8248bfSmrg </listitem> 13900f8248bfSmrg </varlistentry> 13910f8248bfSmrg <varlistentry> 13920f8248bfSmrg <term> 13930f8248bfSmrg <parameter>keycode</parameter> 13940f8248bfSmrg </term> 13950f8248bfSmrg <listitem> 13960f8248bfSmrg <para> 13970f8248bfSmrg keycode of interest 13980f8248bfSmrg </para> 13990f8248bfSmrg </listitem> 14000f8248bfSmrg </varlistentry> 14010f8248bfSmrg <varlistentry> 14020f8248bfSmrg <term> 14030f8248bfSmrg <parameter>group</parameter> 14040f8248bfSmrg </term> 14050f8248bfSmrg <listitem> 14060f8248bfSmrg <para> 14070f8248bfSmrg group index 14080f8248bfSmrg </para> 14090f8248bfSmrg </listitem> 14100f8248bfSmrg </varlistentry> 14110f8248bfSmrg</variablelist> 14120f8248bfSmrg 14130f8248bfSmrg<para> 1414cbfda780Smrg<function>XkbKeyKeyType</function> 14150f8248bfSmrgreturns a pointer to the key type in the 14160f8248bfSmrg<structfield>types</structfield> 14170f8248bfSmrgvector of the client map in 14180f8248bfSmrg<parameter>xkb</parameter> 14190f8248bfSmrgcorresponding to the given 14200f8248bfSmrg<parameter>keycode</parameter> 14210f8248bfSmrgand 14220f8248bfSmrg<parameter>group</parameter> 14230f8248bfSmrgindex. 1424e9fcaa8aSmrg</para> 1425e9fcaa8aSmrg 1426e9fcaa8aSmrg 1427e9fcaa8aSmrg</sect2> 1428eb411b4bSmrg<sect2 id='Per_Key_Group_Information'> 1429e9fcaa8aSmrg<title>Per-Key Group Information</title> 1430e9fcaa8aSmrg 1431e9fcaa8aSmrg<para> 14320f8248bfSmrgThe 14330f8248bfSmrg<structfield>group_info</structfield> 14340f8248bfSmrgfield of an 14350f8248bfSmrg<structname>XkbSymMapRec</structname> 14360f8248bfSmrgis an encoded value containing the number of groups of symbols bound to the 1437e9fcaa8aSmrgkey as well as the specification of the treatment of out-of-range groups. It is 1438e9fcaa8aSmrglegal for a key to have zero groups, in which case it also has zero symbols and 14390f8248bfSmrgall events from that key yield 14400f8248bfSmrg<symbol>NoSymbol</symbol>. 14410f8248bfSmrgTo obtain the number of groups of symbols bound to the key, use 14420f8248bfSmrg<function>XkbKeyNumGroups</function>. 14430f8248bfSmrgTo change the number of groups bound to a key, use 14440f8248bfSmrg<function>XkbChangeTypesOfKey</function> 14450f8248bfSmrg(see <link linkend="Changing_the_Number_of_Groups_and_Types_Bound_to_a_Key">section 15.3.6</link>). To obtain a mask that determines the treatment of 14460f8248bfSmrgout-of-range groups, use 14470f8248bfSmrg<function>XkbKeyGroupInfo</function> 14480f8248bfSmrgand 14490f8248bfSmrg<function>XkbOutOfRangeGroupInfo</function>. 1450e9fcaa8aSmrg</para> 1451e9fcaa8aSmrg 1452e9fcaa8aSmrg 1453e9fcaa8aSmrg<para> 14540f8248bfSmrgThe keyboard controls (see <xref linkend="Keyboard_Controls" />) contain a 14550f8248bfSmrg<structfield>groups_wrap</structfield> 14560f8248bfSmrgfield specifying the handling of illegal groups on a global basis. That is, 1457e9fcaa8aSmrgwhen the user performs an action causing the effective group to go out of the 14580f8248bfSmrglegal range, the 14590f8248bfSmrg<structfield>groups_wrap</structfield> 14600f8248bfSmrgfield specifies how to normalize the effective keyboard group to a group that 1461e9fcaa8aSmrgis legal for the keyboard as a whole, but there is no guarantee that the 1462e9fcaa8aSmrgnormalized group will be within the range of legal groups for any individual 14630f8248bfSmrgkey. The per-key 14640f8248bfSmrg<structfield>group_info</structfield> 14650f8248bfSmrgfield specifies how a key treats a legal effective group if the key does not 14660f8248bfSmrghave a type specified for the group of concern. For example, the 14670f8248bfSmrg<keycap>Enter</keycap> 14680f8248bfSmrgkey usually has just one group defined. If the user performs an action causing 14690f8248bfSmrgthe global keyboard group to change to 14700f8248bfSmrg<emphasis>Group2</emphasis>, 14710f8248bfSmrgthe 14720f8248bfSmrg<structfield>group_info</structfield> 14730f8248bfSmrgfield for the 14740f8248bfSmrg<keycap>Enter</keycap> 14750f8248bfSmrgkey describes how to handle this situation. 1476e9fcaa8aSmrg</para> 1477e9fcaa8aSmrg 1478e9fcaa8aSmrg 1479e9fcaa8aSmrg<para> 1480e9fcaa8aSmrgOut-of-range groups for individual keys are mapped to a legal group using the 1481e9fcaa8aSmrgsame options as are used for the overall keyboard group. The particular type of 14820f8248bfSmrgmapping used is controlled by the bits set in the 14830f8248bfSmrg<structfield>group_info</structfield> 14840f8248bfSmrgflag, as shown in <link linkend="table15.2">Table 15.2</link>. 14850f8248bfSmrgSee <link linkend="The_GroupsWrap_Control">section 10.7.1</link> 14860f8248bfSmrgfor more details on the normalization methods in this table. 1487e9fcaa8aSmrg</para> 1488e9fcaa8aSmrg 14890f8248bfSmrg<table id='table15.2' frame='topbot'> 1490e9fcaa8aSmrg<title>group_info Range Normalization</title> 1491eb411b4bSmrg<?dbfo keep-together="always" ?> 1492eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 1493eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1494eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 1495e9fcaa8aSmrg<thead> 1496eb411b4bSmrg<row rowsep='1'> 1497e9fcaa8aSmrg <entry>Bits set in group_info</entry> 1498e9fcaa8aSmrg <entry>Normalization method</entry> 1499e9fcaa8aSmrg </row> 1500e9fcaa8aSmrg</thead> 1501e9fcaa8aSmrg<tbody> 1502eb411b4bSmrg <row> 15030f8248bfSmrg <entry><symbol>XkbRedirectIntoRange</symbol></entry> 15040f8248bfSmrg <entry><symbol>XkbRedirectIntoRange</symbol></entry> 1505e9fcaa8aSmrg </row> 1506eb411b4bSmrg <row> 15070f8248bfSmrg <entry><symbol>XkbClampIntoRange</symbol></entry> 15080f8248bfSmrg <entry><symbol>XkbClampIntoRange</symbol></entry> 1509e9fcaa8aSmrg </row> 1510eb411b4bSmrg <row> 1511e9fcaa8aSmrg <entry>none of the above</entry> 15120f8248bfSmrg <entry><symbol>XkbWrapIntoRange</symbol></entry> 1513e9fcaa8aSmrg </row> 1514e9fcaa8aSmrg</tbody> 1515e9fcaa8aSmrg</tgroup> 1516e9fcaa8aSmrg</table> 1517e9fcaa8aSmrg 1518e9fcaa8aSmrg<para> 1519e9fcaa8aSmrgXkb provides the following macros to access group information: 1520e9fcaa8aSmrg</para> 1521e9fcaa8aSmrg 15220f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyNumGroups"><primary><function>XkbKeyNumGroups</function></primary></indexterm> 15230f8248bfSmrg<funcsynopsis id="XkbKeyNumGroups"> 15240f8248bfSmrg <funcprototype> 15250f8248bfSmrg <funcdef>int <function>XkbKeyNumGroups</function></funcdef> 15260f8248bfSmrg<!-- ( 15270f8248bfSmrg<parameter>xkb, keycode</parameter> 15280f8248bfSmrg) /* macro */ --> 15290f8248bfSmrg 15300f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 15310f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 15320f8248bfSmrg </funcprototype> 15330f8248bfSmrg</funcsynopsis> 15340f8248bfSmrg<variablelist> 15350f8248bfSmrg <varlistentry> 15360f8248bfSmrg <term> 15370f8248bfSmrg <parameter>xkb</parameter> 15380f8248bfSmrg </term> 15390f8248bfSmrg <listitem> 15400f8248bfSmrg <para> 15410f8248bfSmrg Xkb description of interest 15420f8248bfSmrg </para> 15430f8248bfSmrg </listitem> 15440f8248bfSmrg </varlistentry> 15450f8248bfSmrg <varlistentry> 15460f8248bfSmrg <term> 15470f8248bfSmrg <parameter>keycode</parameter> 15480f8248bfSmrg </term> 15490f8248bfSmrg <listitem> 15500f8248bfSmrg <para> 15510f8248bfSmrg keycode of interest 15520f8248bfSmrg </para> 15530f8248bfSmrg </listitem> 15540f8248bfSmrg </varlistentry> 15550f8248bfSmrg</variablelist> 15560f8248bfSmrg 15570f8248bfSmrg<para> 15580f8248bfSmrg<function>XkbKeyNumGroups</function> 15590f8248bfSmrgreturns the number of groups of symbols bound to the key corresponding to 15600f8248bfSmrg<parameter>keycode</parameter>. 15610f8248bfSmrg</para> 15620f8248bfSmrg 15630f8248bfSmrg 15640f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyGroupInfo"><primary><function>XkbKeyGroupInfo</function></primary></indexterm> 15650f8248bfSmrg<funcsynopsis id="XkbKeyGroupInfo"> 15660f8248bfSmrg <funcprototype> 15670f8248bfSmrg <funcdef>unsigned char <function>XkbKeyGroupInfo</function></funcdef> 15680f8248bfSmrg<!-- ( 15690f8248bfSmrg<parameter>xkb, keycode</parameter> 15700f8248bfSmrg) /*macro */ --> 15710f8248bfSmrg 15720f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 15730f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 15740f8248bfSmrg </funcprototype> 15750f8248bfSmrg</funcsynopsis> 15760f8248bfSmrg<variablelist> 15770f8248bfSmrg <varlistentry> 15780f8248bfSmrg <term> 15790f8248bfSmrg <parameter>xkb</parameter> 15800f8248bfSmrg </term> 15810f8248bfSmrg <listitem> 15820f8248bfSmrg <para> 15830f8248bfSmrg Xkb description of interest 15840f8248bfSmrg </para> 15850f8248bfSmrg </listitem> 15860f8248bfSmrg </varlistentry> 15870f8248bfSmrg <varlistentry> 15880f8248bfSmrg <term> 15890f8248bfSmrg <parameter>keycode</parameter> 15900f8248bfSmrg </term> 15910f8248bfSmrg <listitem> 15920f8248bfSmrg <para> 15930f8248bfSmrg keycode of interest 15940f8248bfSmrg </para> 15950f8248bfSmrg </listitem> 15960f8248bfSmrg </varlistentry> 15970f8248bfSmrg</variablelist> 15980f8248bfSmrg 15990f8248bfSmrg<para> 16000f8248bfSmrg<function>XkbKeyGroupInfo</function> 16010f8248bfSmrgreturns the 16020f8248bfSmrg<structfield>group_info</structfield> 16030f8248bfSmrgfield from the 16040f8248bfSmrg<structname>XkbSymMapRec</structname> 16050f8248bfSmrgstructure associated with the key corresponding to 16060f8248bfSmrg<parameter>keycode</parameter>. 16070f8248bfSmrg</para> 16080f8248bfSmrg 16090f8248bfSmrg 16100f8248bfSmrg<indexterm significance="preferred" zone="XkbOutOfRangeGroupInfo"><primary><function>XkbOutOfRangeGroupInfo</function></primary></indexterm> 16110f8248bfSmrg<funcsynopsis id="XkbOutOfRangeGroupInfo"> 16120f8248bfSmrg <funcprototype> 16130f8248bfSmrg <funcdef>unsigned char <function>XkbOutOfRangeGroupInfo</function></funcdef> 16140f8248bfSmrg<!-- ( 16150f8248bfSmrg<parameter>grp_inf</parameter> 16160f8248bfSmrg) /* macro */ --> 16170f8248bfSmrg 16180f8248bfSmrg <paramdef>unsigned char <parameter>grp_inf</parameter></paramdef> 16190f8248bfSmrg </funcprototype> 16200f8248bfSmrg</funcsynopsis> 16210f8248bfSmrg<variablelist> 16220f8248bfSmrg <varlistentry> 16230f8248bfSmrg <term> 16240f8248bfSmrg <parameter>grp_inf</parameter> 16250f8248bfSmrg </term> 16260f8248bfSmrg <listitem> 16270f8248bfSmrg <para> 16280f8248bfSmrg group_info field of <structname>XkbSymMapRec</structname> 16290f8248bfSmrg </para> 16300f8248bfSmrg </listitem> 16310f8248bfSmrg </varlistentry> 16320f8248bfSmrg</variablelist> 16330f8248bfSmrg 16340f8248bfSmrg<para> 16350f8248bfSmrg<function>XkbOutOfRangeGroupInfo</function> 16360f8248bfSmrgreturns only the out-of-range processing information from the 16370f8248bfSmrg<structfield>group_info</structfield> 16380f8248bfSmrgfield of an 16390f8248bfSmrg<structname>XkbSymMapRec</structname> 16400f8248bfSmrgstructure. 16410f8248bfSmrg</para> 16420f8248bfSmrg 16430f8248bfSmrg 16440f8248bfSmrg<indexterm significance="preferred" zone="XkbOutOfRangeGroupNumber"><primary><function>XkbOutOfRangeGroupNumber</function></primary></indexterm> 16450f8248bfSmrg<funcsynopsis id="XkbOutOfRangeGroupNumber"> 16460f8248bfSmrg <funcprototype> 16470f8248bfSmrg <funcdef>unsigned char <function>XkbOutOfRangeGroupNumber</function></funcdef> 16480f8248bfSmrg<!-- ( 16490f8248bfSmrg<parameter>grp_inf</parameter> 16500f8248bfSmrg) /* macro */ --> 16510f8248bfSmrg 16520f8248bfSmrg <paramdef>unsigned char <parameter>grp_inf</parameter></paramdef> 16530f8248bfSmrg </funcprototype> 16540f8248bfSmrg</funcsynopsis> 16550f8248bfSmrg<variablelist> 16560f8248bfSmrg <varlistentry> 16570f8248bfSmrg <term> 16580f8248bfSmrg <parameter>grp_inf</parameter> 16590f8248bfSmrg </term> 16600f8248bfSmrg <listitem> 16610f8248bfSmrg <para> 16620f8248bfSmrg group_info field of <structname>XkbSymMapRec</structname> 16630f8248bfSmrg </para> 16640f8248bfSmrg </listitem> 16650f8248bfSmrg </varlistentry> 16660f8248bfSmrg</variablelist> 16670f8248bfSmrg 16680f8248bfSmrg<para> 16690f8248bfSmrg<function>XkbOutOfRangeGroupNumber</function> 16700f8248bfSmrgreturns the out-of-range group number, represented as a group index, from the 16710f8248bfSmrg<structfield>group_info</structfield> 16720f8248bfSmrgfield of an 16730f8248bfSmrg<structname>XkbSymMapRec</structname> 16740f8248bfSmrgstructure. 1675e9fcaa8aSmrg</para> 1676e9fcaa8aSmrg 1677e9fcaa8aSmrg 1678e9fcaa8aSmrg</sect2> 1679eb411b4bSmrg<sect2 id='Key_Width'> 1680e9fcaa8aSmrg<title>Key Width</title> 1681e9fcaa8aSmrg 1682e9fcaa8aSmrg<para> 1683e9fcaa8aSmrgThe maximum number of shift levels for a type is also referred to as the width 16840f8248bfSmrgof a key type. The 16850f8248bfSmrg<structfield>width</structfield> 16860f8248bfSmrgfield of the 16870f8248bfSmrg<structfield>key_sym_map</structfield> 16880f8248bfSmrgentry for a key contains the width of the widest type associated with the key. 16890f8248bfSmrgThe 16900f8248bfSmrg<structfield>width</structfield> 1691e9fcaa8aSmrgfield cannot be explicitly changed; it is updated automatically whenever the 1692e9fcaa8aSmrgsymbols or set of types bound to a key are changed. 1693e9fcaa8aSmrg</para> 1694e9fcaa8aSmrg 1695e9fcaa8aSmrg 1696e9fcaa8aSmrg</sect2> 1697eb411b4bSmrg<sect2 id='Offset_in_to_the_Symbol_Map'> 1698e9fcaa8aSmrg<title>Offset in to the Symbol Map</title> 1699e9fcaa8aSmrg 1700e9fcaa8aSmrg<para> 1701e9fcaa8aSmrgThe key width and number of groups associated with a key are used to form a 17020f8248bfSmrgsmall two-dimensional array of 17030f8248bfSmrg<type>KeySym</type>s 17040f8248bfSmrgfor a key. This array may be different sizes for different keys. The array for 1705e9fcaa8aSmrga single key is stored as a linear list, in row-major order. The arrays for all 17060f8248bfSmrgof the keys are stored in the 17070f8248bfSmrg<structfield>syms</structfield> 17080f8248bfSmrgfield of the client map. There is one row for each group associated with a key 1709e9fcaa8aSmrgand one column for each level. The index corresponding to a given group and 1710e9fcaa8aSmrgshift level is computed as: 1711e9fcaa8aSmrg</para> 1712e9fcaa8aSmrg 1713e9fcaa8aSmrg<literallayout> 1714e9fcaa8aSmrg idx = group_index * key_width + shift_level 1715e9fcaa8aSmrg</literallayout> 1716e9fcaa8aSmrg 1717e9fcaa8aSmrg<para> 17180f8248bfSmrgThe 17190f8248bfSmrg<structfield>offset</structfield> 17200f8248bfSmrgfield of the 17210f8248bfSmrg<structfield>key_sym_map</structfield> 17220f8248bfSmrgentry for a key is used to access the beginning of the array. 1723e9fcaa8aSmrg</para> 1724e9fcaa8aSmrg 1725e9fcaa8aSmrg 1726e9fcaa8aSmrg<para> 17270f8248bfSmrgXkb provides the following macros for accessing the 17280f8248bfSmrg<structfield>width</structfield> 17290f8248bfSmrgfor individual keys, as well as macros for accessing the two-dimensional array 1730e9fcaa8aSmrgof symbols bound to the key: 1731e9fcaa8aSmrg</para> 1732e9fcaa8aSmrg 17330f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyGroupsWidth"><primary><function>XkbKeyGroupsWidth</function></primary></indexterm> 17340f8248bfSmrg<funcsynopsis id="XkbKeyGroupsWidth"> 17350f8248bfSmrg <funcprototype> 17360f8248bfSmrg <funcdef>int <function>XkbKeyGroupsWidth</function></funcdef> 17370f8248bfSmrg<!-- ( 17380f8248bfSmrg<parameter>xkb, keycode</parameter> 17390f8248bfSmrg) /* macro */ --> 17400f8248bfSmrg 17410f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 17420f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 17430f8248bfSmrg </funcprototype> 17440f8248bfSmrg</funcsynopsis> 17450f8248bfSmrg<variablelist> 17460f8248bfSmrg <varlistentry> 17470f8248bfSmrg <term> 17480f8248bfSmrg <parameter>xkb</parameter> 17490f8248bfSmrg </term> 17500f8248bfSmrg <listitem> 17510f8248bfSmrg <para> 17520f8248bfSmrg Xkb description of interest 17530f8248bfSmrg </para> 17540f8248bfSmrg </listitem> 17550f8248bfSmrg </varlistentry> 17560f8248bfSmrg <varlistentry> 17570f8248bfSmrg <term> 17580f8248bfSmrg <parameter>keycode</parameter> 17590f8248bfSmrg </term> 17600f8248bfSmrg <listitem> 17610f8248bfSmrg <para> 17620f8248bfSmrg keycode of interest 17630f8248bfSmrg </para> 17640f8248bfSmrg </listitem> 17650f8248bfSmrg </varlistentry> 17660f8248bfSmrg</variablelist> 17670f8248bfSmrg 17680f8248bfSmrg<para> 17690f8248bfSmrg<function>XkbKeyGroupsWidth</function> 17700f8248bfSmrgcomputes the maximum width associated with the key corresponding to 17710f8248bfSmrg<parameter>keycode</parameter>. 17720f8248bfSmrg</para> 17730f8248bfSmrg 17740f8248bfSmrg 17750f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyGroupWidth"><primary><function>XkbKeyGroupWidth</function></primary></indexterm> 17760f8248bfSmrg<funcsynopsis id="XkbKeyGroupWidth"> 17770f8248bfSmrg <funcprototype> 17780f8248bfSmrg <funcdef>int <function>XkbKeyGroupWidth</function></funcdef> 17790f8248bfSmrg<!-- ( 17800f8248bfSmrg<parameter>xkb, keycode, grp</parameter> 17810f8248bfSmrg) /* macro */ --> 17820f8248bfSmrg 17830f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 17840f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 17850f8248bfSmrg <paramdef>int <parameter>grp</parameter></paramdef> 17860f8248bfSmrg </funcprototype> 17870f8248bfSmrg</funcsynopsis> 17880f8248bfSmrg<variablelist> 17890f8248bfSmrg <varlistentry> 17900f8248bfSmrg <term> 17910f8248bfSmrg <parameter>xkb</parameter> 17920f8248bfSmrg </term> 17930f8248bfSmrg <listitem> 17940f8248bfSmrg <para> 17950f8248bfSmrg Xkb description of interest 17960f8248bfSmrg </para> 17970f8248bfSmrg </listitem> 17980f8248bfSmrg </varlistentry> 17990f8248bfSmrg <varlistentry> 18000f8248bfSmrg <term> 18010f8248bfSmrg <parameter>keycode</parameter> 18020f8248bfSmrg </term> 18030f8248bfSmrg <listitem> 18040f8248bfSmrg <para> 18050f8248bfSmrg keycode of interest 18060f8248bfSmrg </para> 18070f8248bfSmrg </listitem> 18080f8248bfSmrg </varlistentry> 18090f8248bfSmrg <varlistentry> 18100f8248bfSmrg <term> 18110f8248bfSmrg <parameter>grp</parameter> 18120f8248bfSmrg </term> 18130f8248bfSmrg <listitem> 18140f8248bfSmrg <para> 18150f8248bfSmrg group of interest 18160f8248bfSmrg </para> 18170f8248bfSmrg </listitem> 18180f8248bfSmrg </varlistentry> 18190f8248bfSmrg</variablelist> 18200f8248bfSmrg 18210f8248bfSmrg<para> 18220f8248bfSmrg<function>XkbKeyGroupWidth</function> 18230f8248bfSmrgcomputes the width of the type associated with the group 18240f8248bfSmrg<parameter>grp</parameter> 18250f8248bfSmrgfor the key corresponding to 18260f8248bfSmrg<parameter>keycode</parameter>. 18270f8248bfSmrg</para> 18280f8248bfSmrg 18290f8248bfSmrg 18300f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyNumSyms"><primary><function>XkbKeyNumSyms</function></primary></indexterm> 18310f8248bfSmrg<funcsynopsis id="XkbKeyNumSyms"> 18320f8248bfSmrg <funcprototype> 18330f8248bfSmrg <funcdef>int <function>XkbKeyNumSyms</function></funcdef> 18340f8248bfSmrg<!-- ( 18350f8248bfSmrg<parameter>xkb, keycode</parameter> 18360f8248bfSmrg) /* macro */ --> 18370f8248bfSmrg 18380f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 18390f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 18400f8248bfSmrg </funcprototype> 18410f8248bfSmrg</funcsynopsis> 18420f8248bfSmrg<variablelist> 18430f8248bfSmrg <varlistentry> 18440f8248bfSmrg <term> 18450f8248bfSmrg <parameter>xkb</parameter> 18460f8248bfSmrg </term> 18470f8248bfSmrg <listitem> 18480f8248bfSmrg <para> 18490f8248bfSmrg Xkb description of interest 18500f8248bfSmrg </para> 18510f8248bfSmrg </listitem> 18520f8248bfSmrg </varlistentry> 18530f8248bfSmrg <varlistentry> 18540f8248bfSmrg <term> 18550f8248bfSmrg <parameter>keycode</parameter> 18560f8248bfSmrg </term> 18570f8248bfSmrg <listitem> 18580f8248bfSmrg <para> 18590f8248bfSmrg keycode of interest 18600f8248bfSmrg </para> 18610f8248bfSmrg </listitem> 18620f8248bfSmrg </varlistentry> 18630f8248bfSmrg</variablelist> 18640f8248bfSmrg 18650f8248bfSmrg<para> 18660f8248bfSmrg<function>XkbKeyNumSyms</function> 18670f8248bfSmrgreturns the total number of keysyms for the key corresponding to 18680f8248bfSmrg<parameter>keycode</parameter>. 18690f8248bfSmrg</para> 18700f8248bfSmrg 18710f8248bfSmrg 18720f8248bfSmrg<indexterm significance="preferred" zone="XkbKeySymsPtr"><primary><function>XkbKeySymsPtr</function></primary></indexterm> 18730f8248bfSmrg<funcsynopsis id="XkbKeySymsPtr"> 18740f8248bfSmrg <funcprototype> 18750f8248bfSmrg <funcdef>KeySym *<function>XkbKeySymsPtr</function></funcdef> 18760f8248bfSmrg<!-- ( 18770f8248bfSmrg<parameter>xkb, keycode</parameter> 18780f8248bfSmrg) /* macro */ --> 18790f8248bfSmrg 18800f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 18810f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 18820f8248bfSmrg </funcprototype> 18830f8248bfSmrg</funcsynopsis> 18840f8248bfSmrg<variablelist> 18850f8248bfSmrg <varlistentry> 18860f8248bfSmrg <term> 18870f8248bfSmrg <parameter>xkb</parameter> 18880f8248bfSmrg </term> 18890f8248bfSmrg <listitem> 18900f8248bfSmrg <para> 18910f8248bfSmrg Xkb description of interest 18920f8248bfSmrg </para> 18930f8248bfSmrg </listitem> 18940f8248bfSmrg </varlistentry> 18950f8248bfSmrg <varlistentry> 18960f8248bfSmrg <term> 18970f8248bfSmrg <parameter>keycode</parameter> 18980f8248bfSmrg </term> 18990f8248bfSmrg <listitem> 19000f8248bfSmrg <para> 19010f8248bfSmrg keycode of interest 19020f8248bfSmrg </para> 19030f8248bfSmrg </listitem> 19040f8248bfSmrg </varlistentry> 19050f8248bfSmrg</variablelist> 19060f8248bfSmrg 19070f8248bfSmrg<para> 19080f8248bfSmrg<function>XkbKeySymsPtr</function> 19090f8248bfSmrgreturns the pointer to the two-dimensional array of keysyms for the key 19100f8248bfSmrgcorresponding to 19110f8248bfSmrg<parameter>keycode</parameter>. 19120f8248bfSmrg</para> 19130f8248bfSmrg 19140f8248bfSmrg 19150f8248bfSmrg<indexterm significance="preferred" zone="XkbKeySymEntry"><primary><function>XkbKeySymEntry</function></primary></indexterm> 19160f8248bfSmrg<funcsynopsis id="XkbKeySymEntry"> 19170f8248bfSmrg <funcprototype> 19180f8248bfSmrg <funcdef>KeySym <function>XkbKeySymEntry</function></funcdef> 19190f8248bfSmrg<!-- ( 19200f8248bfSmrg<parameter>xkb, keycode, shift, grp</parameter> 19210f8248bfSmrg) /* macro */ --> 19220f8248bfSmrg 19230f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 19240f8248bfSmrg <paramdef>KeyCode <parameter>keycode</parameter></paramdef> 19250f8248bfSmrg <paramdef>int <parameter>shift</parameter></paramdef> 19260f8248bfSmrg <paramdef>int <parameter>grp</parameter></paramdef> 19270f8248bfSmrg </funcprototype> 19280f8248bfSmrg</funcsynopsis> 19290f8248bfSmrg<variablelist> 19300f8248bfSmrg <varlistentry> 19310f8248bfSmrg <term> 19320f8248bfSmrg <parameter>xkb</parameter> 19330f8248bfSmrg </term> 19340f8248bfSmrg <listitem> 19350f8248bfSmrg <para> 19360f8248bfSmrg Xkb description of interest 19370f8248bfSmrg </para> 19380f8248bfSmrg </listitem> 19390f8248bfSmrg </varlistentry> 19400f8248bfSmrg <varlistentry> 19410f8248bfSmrg <term> 19420f8248bfSmrg <parameter>keycode</parameter> 19430f8248bfSmrg </term> 19440f8248bfSmrg <listitem> 19450f8248bfSmrg <para> 19460f8248bfSmrg keycode of interest 19470f8248bfSmrg </para> 19480f8248bfSmrg </listitem> 19490f8248bfSmrg </varlistentry> 19500f8248bfSmrg <varlistentry> 19510f8248bfSmrg <term> 19520f8248bfSmrg <parameter>shift</parameter> 19530f8248bfSmrg </term> 19540f8248bfSmrg <listitem> 19550f8248bfSmrg <para> 19560f8248bfSmrg shift level of interest 19570f8248bfSmrg </para> 19580f8248bfSmrg </listitem> 19590f8248bfSmrg </varlistentry> 19600f8248bfSmrg <varlistentry> 19610f8248bfSmrg <term> 19620f8248bfSmrg <parameter>grp</parameter> 19630f8248bfSmrg </term> 19640f8248bfSmrg <listitem> 19650f8248bfSmrg <para> 19660f8248bfSmrg group of interest 19670f8248bfSmrg </para> 19680f8248bfSmrg </listitem> 19690f8248bfSmrg </varlistentry> 19700f8248bfSmrg</variablelist> 19710f8248bfSmrg 19720f8248bfSmrg<para> 19730f8248bfSmrg<function>XkbKeySymEntry</function> 19740f8248bfSmrgreturns the 19750f8248bfSmrg<type>KeySym</type> 19760f8248bfSmrgcorresponding to shift level 19770f8248bfSmrg<parameter>shift</parameter> 19780f8248bfSmrgand group 19790f8248bfSmrg<parameter>grp</parameter> 19800f8248bfSmrgfrom the two-dimensional array of keysyms for the key corresponding to 19810f8248bfSmrg<parameter>keycode</parameter> 1982e9fcaa8aSmrg</para> 1983e9fcaa8aSmrg 1984e9fcaa8aSmrg 1985e9fcaa8aSmrg</sect2> 1986eb411b4bSmrg<sect2 id='Getting_the_Symbol_Map_for_Keys_from_the_Server'> 1987e9fcaa8aSmrg<title>Getting the Symbol Map for Keys from the Server</title> 1988e9fcaa8aSmrg 1989e9fcaa8aSmrg<para> 1990e9fcaa8aSmrgTo obtain the symbols for a subset of the keys in a keyboard description, use 19910f8248bfSmrg<function>XkbGetKeySyms</function>: 19920f8248bfSmrg 19930f8248bfSmrg</para> 19940f8248bfSmrg 19950f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeySyms"><primary><function>XkbGetKeySyms</function></primary></indexterm> 19960f8248bfSmrg<funcsynopsis id="XkbGetKeySyms"> 19970f8248bfSmrg <funcprototype> 19980f8248bfSmrg <funcdef>Status <function>XkbGetKeySyms</function></funcdef> 19990f8248bfSmrg<!-- ( 20000f8248bfSmrg<parameter>dpy</parameter>, 20010f8248bfSmrg<parameter>first</parameter>, 20020f8248bfSmrg<parameter>num</parameter>, 20030f8248bfSmrg<parameter>xkb</parameter> 20040f8248bfSmrg) --> 20050f8248bfSmrg 20060f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 20070f8248bfSmrg <paramdef>unsigned int <parameter>first</parameter></paramdef> 20080f8248bfSmrg <paramdef>unsigned int <parameter>num</parameter></paramdef> 20090f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 20100f8248bfSmrg </funcprototype> 20110f8248bfSmrg</funcsynopsis> 20120f8248bfSmrg<variablelist> 20130f8248bfSmrg <varlistentry> 20140f8248bfSmrg <term> 20150f8248bfSmrg <parameter>dpy</parameter> 20160f8248bfSmrg </term> 20170f8248bfSmrg <listitem> 20180f8248bfSmrg <para> 20190f8248bfSmrg connection to X server 20200f8248bfSmrg </para> 20210f8248bfSmrg </listitem> 20220f8248bfSmrg </varlistentry> 20230f8248bfSmrg <varlistentry> 20240f8248bfSmrg <term> 20250f8248bfSmrg <parameter>first</parameter> 20260f8248bfSmrg </term> 20270f8248bfSmrg <listitem> 20280f8248bfSmrg <para> 20290f8248bfSmrg keycode of first key to get 20300f8248bfSmrg </para> 20310f8248bfSmrg </listitem> 20320f8248bfSmrg </varlistentry> 20330f8248bfSmrg <varlistentry> 20340f8248bfSmrg <term> 20350f8248bfSmrg <parameter>num</parameter> 20360f8248bfSmrg </term> 20370f8248bfSmrg <listitem> 20380f8248bfSmrg <para> 20390f8248bfSmrg number of keycodes for which syms desired 20400f8248bfSmrg </para> 20410f8248bfSmrg </listitem> 20420f8248bfSmrg </varlistentry> 20430f8248bfSmrg <varlistentry> 20440f8248bfSmrg <term> 20450f8248bfSmrg <parameter>xkb</parameter> 20460f8248bfSmrg </term> 20470f8248bfSmrg <listitem> 20480f8248bfSmrg <para> 20490f8248bfSmrg Xkb description to be updated 20500f8248bfSmrg </para> 20510f8248bfSmrg </listitem> 20520f8248bfSmrg </varlistentry> 20530f8248bfSmrg</variablelist> 20540f8248bfSmrg 20550f8248bfSmrg<para> 20560f8248bfSmrg<function>XkbGetKeySyms</function> 20570f8248bfSmrgsends a request to the server to obtain the set of keysyms bound to 20580f8248bfSmrg<parameter>num</parameter> 20590f8248bfSmrgkeys starting with the key whose keycode is 20600f8248bfSmrg<parameter>first</parameter>. 20610f8248bfSmrgIt waits for a reply and returns the keysyms in the 20620f8248bfSmrg<structfield>map.syms</structfield> 20630f8248bfSmrgfield of 20640f8248bfSmrg<parameter>xkb</parameter>. 20650f8248bfSmrgIf successful, 20660f8248bfSmrg<function>XkbGetKeySyms</function> 20670f8248bfSmrgreturns 20680f8248bfSmrg<symbol>Success</symbol>. 20690f8248bfSmrgThe 20700f8248bfSmrg<parameter>xkb</parameter> 20710f8248bfSmrgparameter must be a pointer to a valid Xkb keyboard description. 20720f8248bfSmrg</para> 20730f8248bfSmrg 20740f8248bfSmrg 20750f8248bfSmrg<para> 20760f8248bfSmrgIf the client 20770f8248bfSmrg<structfield>map</structfield> 20780f8248bfSmrgin the 20790f8248bfSmrg<parameter>xkb</parameter> 20800f8248bfSmrgparameter has not been allocated, 20810f8248bfSmrg<function>XkbGetKeySyms</function> 20820f8248bfSmrgallocates and initializes it before obtaining the symbols. 2083e9fcaa8aSmrg</para> 2084e9fcaa8aSmrg 2085e9fcaa8aSmrg 2086e9fcaa8aSmrg<para> 2087e9fcaa8aSmrgIf a compatible version of Xkb is not available in the server or the Xkb 20880f8248bfSmrgextension has not been properly initialized, 20890f8248bfSmrg<function>XkbGetKeySyms</function> 20900f8248bfSmrgreturns 20910f8248bfSmrg<errorname>BadAccess</errorname>. 20920f8248bfSmrgIf 20930f8248bfSmrg<parameter>num</parameter> 20940f8248bfSmrgis less than 1 or greater than 20950f8248bfSmrg<symbol>XkbMaxKeyCount</symbol>, 20960f8248bfSmrg<function>XkbGetKeySyms</function> 20970f8248bfSmrgreturns 20980f8248bfSmrg<errorname>BadValue</errorname>. 20990f8248bfSmrgIf any allocation errors occur, 21000f8248bfSmrg<function>XkbGetKeySyms</function> 21010f8248bfSmrgreturns 21020f8248bfSmrg<errorname>BadAlloc</errorname>. 2103e9fcaa8aSmrg</para> 2104e9fcaa8aSmrg 2105e9fcaa8aSmrg 2106e9fcaa8aSmrg</sect2> 2107eb411b4bSmrg<sect2 id='Changing_the_Number_of_Groups_and_Types_Bound_to_a_Key'> 2108e9fcaa8aSmrg<title>Changing the Number of Groups and Types Bound to a Key</title> 2109e9fcaa8aSmrg 2110e9fcaa8aSmrg<para> 21110f8248bfSmrgTo change the number of groups and the types bound to a key, use 21120f8248bfSmrg<function>XkbChangeTypesOfKey</function>. 21130f8248bfSmrg</para> 21140f8248bfSmrg 21150f8248bfSmrg 21160f8248bfSmrg<indexterm significance="preferred" zone="XkbChangeTypesOfKey"><primary><function>XkbChangeTypesOfKey</function></primary></indexterm> 21170f8248bfSmrg<funcsynopsis id="XkbChangeTypesOfKey"> 21180f8248bfSmrg <funcprototype> 21190f8248bfSmrg <funcdef>Status <function>XkbChangeTypesOfKey</function></funcdef> 21200f8248bfSmrg<!-- ( 21210f8248bfSmrg<parameter>xkb</parameter>, 21220f8248bfSmrg<parameter>key</parameter>, 21230f8248bfSmrg<parameter>n_groups</parameter>, 21240f8248bfSmrg<parameter>groups</parameter>, 21250f8248bfSmrg<parameter>new_types_in</parameter>, 21260f8248bfSmrg<parameter>p_changes</parameter> 21270f8248bfSmrg) --> 21280f8248bfSmrg 21290f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 21300f8248bfSmrg <paramdef>int <parameter>key</parameter></paramdef> 21310f8248bfSmrg <paramdef>int <parameter>n_groups</parameter></paramdef> 21320f8248bfSmrg <paramdef>unsigned int <parameter>groups</parameter></paramdef> 21330f8248bfSmrg <paramdef>int *<parameter>new_types_in</parameter></paramdef> 21340f8248bfSmrg <paramdef>XkbMapChangesPtr <parameter>p_changes</parameter></paramdef> 21350f8248bfSmrg </funcprototype> 21360f8248bfSmrg</funcsynopsis> 21370f8248bfSmrg<variablelist> 21380f8248bfSmrg <varlistentry> 21390f8248bfSmrg <term> 21400f8248bfSmrg <parameter>xkb</parameter> 21410f8248bfSmrg </term> 21420f8248bfSmrg <listitem> 21430f8248bfSmrg <para> 21440f8248bfSmrg keyboard description to be changed 21450f8248bfSmrg </para> 21460f8248bfSmrg </listitem> 21470f8248bfSmrg </varlistentry> 21480f8248bfSmrg <varlistentry> 21490f8248bfSmrg <term> 21500f8248bfSmrg <parameter>key</parameter> 21510f8248bfSmrg </term> 21520f8248bfSmrg <listitem> 21530f8248bfSmrg <para> 21540f8248bfSmrg keycode for key of interest 21550f8248bfSmrg </para> 21560f8248bfSmrg </listitem> 21570f8248bfSmrg </varlistentry> 21580f8248bfSmrg <varlistentry> 21590f8248bfSmrg <term> 21600f8248bfSmrg <parameter>n_groups</parameter> 21610f8248bfSmrg </term> 21620f8248bfSmrg <listitem> 21630f8248bfSmrg <para> 21640f8248bfSmrg new number of groups for key 21650f8248bfSmrg </para> 21660f8248bfSmrg </listitem> 21670f8248bfSmrg </varlistentry> 21680f8248bfSmrg <varlistentry> 21690f8248bfSmrg <term> 21700f8248bfSmrg <parameter>groups</parameter> 21710f8248bfSmrg </term> 21720f8248bfSmrg <listitem> 21730f8248bfSmrg <para> 21740f8248bfSmrg mask indicating groups to change 21750f8248bfSmrg </para> 21760f8248bfSmrg </listitem> 21770f8248bfSmrg </varlistentry> 21780f8248bfSmrg <varlistentry> 21790f8248bfSmrg <term> 21800f8248bfSmrg <parameter>new_types_in</parameter> 21810f8248bfSmrg </term> 21820f8248bfSmrg <listitem> 21830f8248bfSmrg <para> 21840f8248bfSmrg indices for new groups specified in <parameter>groups</parameter> 21850f8248bfSmrg </para> 21860f8248bfSmrg </listitem> 21870f8248bfSmrg </varlistentry> 21880f8248bfSmrg <varlistentry> 21890f8248bfSmrg <term> 21900f8248bfSmrg <parameter>p_changes</parameter> 21910f8248bfSmrg </term> 21920f8248bfSmrg <listitem> 21930f8248bfSmrg <para> 21940f8248bfSmrg notes changes made to <parameter>xkb</parameter> 21950f8248bfSmrg </para> 21960f8248bfSmrg </listitem> 21970f8248bfSmrg </varlistentry> 21980f8248bfSmrg</variablelist> 21990f8248bfSmrg 22000f8248bfSmrg<para> 22010f8248bfSmrg<function>XkbChangeTypesOfKey</function> 22020f8248bfSmrgreallocates the symbols and actions bound to the key, if necessary, and 22030f8248bfSmrginitializes any new symbols or actions to 22040f8248bfSmrg<symbol>NoSymbol</symbol> 22050f8248bfSmrgor 22060f8248bfSmrg<emphasis>NoAction</emphasis>, 22070f8248bfSmrgas appropriate. If the 22080f8248bfSmrg<parameter>p_changes</parameter> 22090f8248bfSmrgparameter is not 22100f8248bfSmrg<symbol>NULL</symbol>, 22110f8248bfSmrg<function>XkbChangeTypesOfKey</function> 22120f8248bfSmrgadds the 22130f8248bfSmrg<symbol>XkbKeySymsMask</symbol> 22140f8248bfSmrgto the 22150f8248bfSmrg<structfield>changes</structfield> 22160f8248bfSmrgfield of 22170f8248bfSmrg<parameter>p_changes</parameter> 22180f8248bfSmrgand modifies the 22190f8248bfSmrg<structfield>first_key_sym</structfield> 22200f8248bfSmrgand 22210f8248bfSmrg<structfield>num_key_syms</structfield> 22220f8248bfSmrgfields of 22230f8248bfSmrg<parameter>p_changes</parameter> 22240f8248bfSmrgto include the 22250f8248bfSmrg<parameter>key</parameter> 22260f8248bfSmrgthat was changed. See <link linkend="The_XkbMapChangesRec_Structure">section 14.3.1</link> for more information on the 22270f8248bfSmrg<type>XkbMapChangesPtr</type> 22280f8248bfSmrgstructure. If successful, 22290f8248bfSmrg<function>XkbChangeTypesOfKey</function> 22300f8248bfSmrgreturns 22310f8248bfSmrg<symbol>Success</symbol>. 22320f8248bfSmrg</para> 22330f8248bfSmrg 22340f8248bfSmrg 22350f8248bfSmrg<para> 22360f8248bfSmrgThe 22370f8248bfSmrg<parameter>n_groups</parameter> 22380f8248bfSmrgparameter specifies the new number of groups for the key. The 22390f8248bfSmrg<parameter>groups</parameter> 22400f8248bfSmrgparameter is a mask specifying the groups for which new types are supplied and 22410f8248bfSmrgis a bitwise inclusive OR of the following masks: 22420f8248bfSmrg<symbol>XkbGroup1Mask</symbol>, 22430f8248bfSmrg<symbol>XkbGroup2Mask</symbol>, 22440f8248bfSmrg<symbol>XkbGroup3Mask</symbol>, 22450f8248bfSmrgand 22460f8248bfSmrg<symbol>XkbGroup4Mask</symbol>. 22470f8248bfSmrg</para> 22480f8248bfSmrg 22490f8248bfSmrg 22500f8248bfSmrg<para> 22510f8248bfSmrgThe 22520f8248bfSmrg<parameter>new_types_in</parameter> 22530f8248bfSmrgparameter is an integer array of length 22540f8248bfSmrg<parameter>n_groups</parameter>. 22550f8248bfSmrgEach entry represents the type to use for the associated group and is an 22560f8248bfSmrgindex into 22570f8248bfSmrg<parameter>xkb</parameter>-><structfield>map->types</structfield>. 22580f8248bfSmrgThe 22590f8248bfSmrg<parameter>new_types_in</parameter> 22600f8248bfSmrgarray is indexed by group index; if 22610f8248bfSmrg<parameter>n_groups</parameter> 22620f8248bfSmrgis four and 22630f8248bfSmrg<parameter>groups</parameter> 22640f8248bfSmrgonly has 22650f8248bfSmrg<symbol>XkbGroup1Mask</symbol> 22660f8248bfSmrgand 22670f8248bfSmrg<symbol>XkbGroup3Mask</symbol> 22680f8248bfSmrgset, 22690f8248bfSmrg<parameter>new_types_in</parameter> 22700f8248bfSmrglooks like this: 2271e9fcaa8aSmrg</para> 2272e9fcaa8aSmrg 2273e9fcaa8aSmrg<literallayout> 2274e9fcaa8aSmrg new_types_in[0] = type for Group1 2275e9fcaa8aSmrg new_types_in[1] = ignored 2276e9fcaa8aSmrg new_types_in[2] = type for Group3 2277e9fcaa8aSmrg new_types_in[3] = ignored 2278e9fcaa8aSmrg</literallayout> 2279e9fcaa8aSmrg 2280e9fcaa8aSmrg<para> 2281e9fcaa8aSmrgFor convenience, Xkb provides the following constants to use as indices to the 2282e9fcaa8aSmrggroups: 2283e9fcaa8aSmrg</para> 2284e9fcaa8aSmrg 22850f8248bfSmrg<table id='table15.3' frame='topbot'> 2286e9fcaa8aSmrg<title>Group Index Constants</title> 2287eb411b4bSmrg<?dbfo keep-together="always" ?> 2288eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 2289eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 2290eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 2291e9fcaa8aSmrg<thead> 2292eb411b4bSmrg<row rowsep='1'> 2293e9fcaa8aSmrg <entry>Constant Name</entry> 2294e9fcaa8aSmrg <entry>Value</entry> 2295e9fcaa8aSmrg </row> 2296e9fcaa8aSmrg</thead> 2297e9fcaa8aSmrg<tbody> 2298eb411b4bSmrg <row> 22990f8248bfSmrg <entry><symbol>XkbGroup1Index</symbol></entry> 2300e9fcaa8aSmrg <entry>0</entry> 2301e9fcaa8aSmrg </row> 2302eb411b4bSmrg <row> 23030f8248bfSmrg <entry><symbol>XkbGroup2Index</symbol></entry> 2304e9fcaa8aSmrg <entry>1</entry> 2305e9fcaa8aSmrg </row> 2306eb411b4bSmrg <row> 23070f8248bfSmrg <entry><symbol>XkbGroup3Index</symbol></entry> 2308e9fcaa8aSmrg <entry>2</entry> 2309e9fcaa8aSmrg </row> 2310eb411b4bSmrg <row> 23110f8248bfSmrg <entry><symbol>XkbGroup4Index</symbol></entry> 2312e9fcaa8aSmrg <entry>3</entry> 2313e9fcaa8aSmrg </row> 2314e9fcaa8aSmrg</tbody> 2315e9fcaa8aSmrg</tgroup> 2316e9fcaa8aSmrg</table> 2317e9fcaa8aSmrg 2318e9fcaa8aSmrg<para> 23190f8248bfSmrgIf the Xkb extension has not been properly initialized, 23200f8248bfSmrg<function>XkbChangeTypesOfKey</function> 23210f8248bfSmrgreturns 23220f8248bfSmrg<errorname>BadAccess</errorname>. 23230f8248bfSmrgIf the 23240f8248bfSmrg<parameter>xkb</parameter> 23250f8248bfSmrgparameter it not valid (that is, it is 23260f8248bfSmrg<symbol>NULL</symbol> 23270f8248bfSmrgor it does not contain a valid client map), 23280f8248bfSmrg<function>XkbChangeTypesOfKey</function> 23290f8248bfSmrgreturns 23300f8248bfSmrg<errorname>BadMatch</errorname>. 23310f8248bfSmrgIf the 23320f8248bfSmrg<parameter>key</parameter> 23330f8248bfSmrgis not a valid keycode, 23340f8248bfSmrg<parameter>n_groups</parameter> 23350f8248bfSmrgis greater than 23360f8248bfSmrg<symbol>XkbNumKbdGroups</symbol>, 23370f8248bfSmrgor the 23380f8248bfSmrg<parameter>groups</parameter> 23390f8248bfSmrgmask does not contain any of the valid group mask bits, 23400f8248bfSmrg<function>XkbChangeTypesOfKey</function> 23410f8248bfSmrgreturns 23420f8248bfSmrg<errorname>BadValue</errorname>. 23430f8248bfSmrgIf it is necessary to resize the key symbols or key actions arrays and any 23440f8248bfSmrgallocation errors occur, 23450f8248bfSmrg<function>XkbChangeTypesOfKey</function> 23460f8248bfSmrgreturns 23470f8248bfSmrg<errorname>BadAlloc</errorname>. 2348e9fcaa8aSmrg</para> 2349e9fcaa8aSmrg 2350e9fcaa8aSmrg 2351e9fcaa8aSmrg</sect2> 2352eb411b4bSmrg<sect2 id='Changing_the_Number_of_Symbols_Bound_to_a_Key'> 2353e9fcaa8aSmrg<title>Changing the Number of Symbols Bound to a Key</title> 2354e9fcaa8aSmrg 2355e9fcaa8aSmrg<para> 23560f8248bfSmrgTo change the number of symbols bound to a key, use 23570f8248bfSmrg<function>XkbResizeKeySyms</function>. 23580f8248bfSmrg</para> 23590f8248bfSmrg 23600f8248bfSmrg<indexterm significance="preferred" zone="XkbResizeKeySyms"><primary><function>XkbResizeKeySyms</function></primary></indexterm> 23610f8248bfSmrg<funcsynopsis id="XkbResizeKeySyms"> 23620f8248bfSmrg <funcprototype> 23630f8248bfSmrg <funcdef>KeySym *<function>XkbResizeKeySyms</function></funcdef> 23640f8248bfSmrg<!-- ( 23650f8248bfSmrg<parameter>xkb</parameter>, 23660f8248bfSmrg<parameter>key</parameter>, 23670f8248bfSmrg<parameter>needed</parameter> 23680f8248bfSmrg) --> 23690f8248bfSmrg 23700f8248bfSmrg <paramdef>XkbDescRec *<parameter>xkb</parameter></paramdef> 23710f8248bfSmrg <paramdef>int <parameter>key</parameter></paramdef> 23720f8248bfSmrg <paramdef>int <parameter>needed</parameter></paramdef> 23730f8248bfSmrg </funcprototype> 23740f8248bfSmrg</funcsynopsis> 23750f8248bfSmrg<variablelist> 23760f8248bfSmrg <varlistentry> 23770f8248bfSmrg <term> 23780f8248bfSmrg <parameter>xkb</parameter> 23790f8248bfSmrg </term> 23800f8248bfSmrg <listitem> 23810f8248bfSmrg <para> 23820f8248bfSmrg keyboard description to be changed 23830f8248bfSmrg </para> 23840f8248bfSmrg </listitem> 23850f8248bfSmrg </varlistentry> 23860f8248bfSmrg <varlistentry> 23870f8248bfSmrg <term> 23880f8248bfSmrg <parameter>key</parameter> 23890f8248bfSmrg </term> 23900f8248bfSmrg <listitem> 23910f8248bfSmrg <para> 23920f8248bfSmrg keycode for key to modify 23930f8248bfSmrg </para> 23940f8248bfSmrg </listitem> 23950f8248bfSmrg </varlistentry> 23960f8248bfSmrg <varlistentry> 23970f8248bfSmrg <term> 23980f8248bfSmrg <parameter>needed</parameter> 23990f8248bfSmrg </term> 24000f8248bfSmrg <listitem> 24010f8248bfSmrg <para> 24020f8248bfSmrg new number of keysyms required for key 24030f8248bfSmrg </para> 24040f8248bfSmrg </listitem> 24050f8248bfSmrg </varlistentry> 24060f8248bfSmrg</variablelist> 24070f8248bfSmrg 24080f8248bfSmrg<para> 24090f8248bfSmrg<function>XkbResizeKeySyms</function> 24100f8248bfSmrgreserves the space needed for 24110f8248bfSmrg<parameter>needed</parameter> 24120f8248bfSmrgkeysyms and returns a pointer to the beginning of the new array that holds the 24130f8248bfSmrgkeysyms. It adjusts the 24140f8248bfSmrg<structfield>offset</structfield> 24150f8248bfSmrgfield of the 24160f8248bfSmrg<structfield>key_sym_map</structfield> 24170f8248bfSmrgentry for the key if necessary and can also change the 24180f8248bfSmrg<structfield>syms</structfield>, 24190f8248bfSmrg<structfield>num_syms</structfield>, 24200f8248bfSmrgand 24210f8248bfSmrg<structfield>size_syms</structfield> 24220f8248bfSmrgfields of 24230f8248bfSmrg<structfield>xkb->map</structfield> 24240f8248bfSmrgif it is necessary to reallocate the 24250f8248bfSmrg<structfield>syms</structfield> 24260f8248bfSmrgarray. 24270f8248bfSmrg<function>XkbResizeKeySyms</function> 24280f8248bfSmrgdoes not modify either the width or number of groups associated with the key. 24290f8248bfSmrg</para> 24300f8248bfSmrg 24310f8248bfSmrg 24320f8248bfSmrg<para> 24330f8248bfSmrgIf 24340f8248bfSmrg<parameter>needed</parameter> 24350f8248bfSmrgis greater than the current number of keysyms for the key, 24360f8248bfSmrg<function>XkbResizeKeySyms</function> 24370f8248bfSmrginitializes all new keysyms in the array to 24380f8248bfSmrg<symbol>NoSymbol</symbol>. 2439e9fcaa8aSmrg</para> 2440e9fcaa8aSmrg 2441e9fcaa8aSmrg 2442e9fcaa8aSmrg<para> 2443e9fcaa8aSmrgBecause the number of symbols needed by a key is normally computed as width * 24440f8248bfSmrgnumber of groups, and 24450f8248bfSmrg<function>XkbResizeKeySyms</function> 24460f8248bfSmrgdoes not modify either the width or number of groups for the key, a 24470f8248bfSmrgdiscrepancy exists upon return from 24480f8248bfSmrg<function>XkbResizeKeySyms</function> 24490f8248bfSmrgbetween the space allocated for the keysyms and the number required. The 24500f8248bfSmrgunused entries in the list of symbols returned by 24510f8248bfSmrg<function>XkbResizeKeySyms</function> 24520f8248bfSmrgare not preserved across future calls to any of the map editing functions, so 2453e9fcaa8aSmrgyou must update the key symbol mapping (which updates the width and number of 2454e9fcaa8aSmrggroups for the key) before calling another allocator function. A call to 24550f8248bfSmrg<function>XkbChangeTypesOfKey</function> 24560f8248bfSmrgwill update the mapping. 2457e9fcaa8aSmrg</para> 2458e9fcaa8aSmrg 2459e9fcaa8aSmrg 2460e9fcaa8aSmrg<para> 2461e9fcaa8aSmrgIf any allocation errors occur while resizing the number of symbols bound to 24620f8248bfSmrgthe key, 24630f8248bfSmrg<function>XkbResizeKeySyms</function> 24640f8248bfSmrgreturns 24650f8248bfSmrg<symbol>NULL</symbol>. 2466e9fcaa8aSmrg</para> 2467e9fcaa8aSmrg 2468e9fcaa8aSmrg<note><para>A change to the number of symbols bound to a key should be 2469e9fcaa8aSmrgaccompanied by a change in the number of actions bound to a key. Refer to 24700f8248bfSmrg<link linkend="Changing_the_Number_of_Actions_Bound_to_a_Key">section 16.1.16</link> for more information on changing the number of actions bound to 2471e9fcaa8aSmrga key.</para></note> 2472e9fcaa8aSmrg 2473e9fcaa8aSmrg 2474e9fcaa8aSmrg</sect2> 2475e9fcaa8aSmrg</sect1> 2476eb411b4bSmrg<sect1 id='The_Per_Key_Modifier_Map'> 2477e9fcaa8aSmrg<title>The Per-Key Modifier Map</title> 2478e9fcaa8aSmrg 2479e9fcaa8aSmrg<para> 24800f8248bfSmrgThe 24810f8248bfSmrg<structfield>modmap</structfield> 24820f8248bfSmrgentry of the client map is an array, indexed by keycode, specifying the real 2483e9fcaa8aSmrgmodifiers bound to a key. Each entry is a mask composed of a bitwise inclusive 24840f8248bfSmrgOR of the legal real modifiers: 24850f8248bfSmrg<symbol>ShiftMask</symbol>, 24860f8248bfSmrg<symbol>LockMask</symbol>, 24870f8248bfSmrg<symbol>ControlMask</symbol>, 24880f8248bfSmrg<symbol>Mod1Mask</symbol>, 24890f8248bfSmrg<symbol>Mod2Mask</symbol>, 24900f8248bfSmrg<symbol>Mod3Mask</symbol>, 24910f8248bfSmrg<symbol>Mod4Mask</symbol>, 24920f8248bfSmrgand 24930f8248bfSmrg<symbol>Mod5Mask</symbol>. 24940f8248bfSmrgIf a bit is set in a 24950f8248bfSmrg<structfield>modmap</structfield> 24960f8248bfSmrgentry, the corresponding key is bound to that modifier. 2497e9fcaa8aSmrg</para> 2498e9fcaa8aSmrg 2499e9fcaa8aSmrg 2500e9fcaa8aSmrg<para> 2501e9fcaa8aSmrgPressing or releasing the key bound to a modifier changes the modifier set and 2502e9fcaa8aSmrgunset state. The particular manner in which the modifier set and unset state 2503e9fcaa8aSmrgchanges is determined by the behavior and actions assigned to the key (see 25040f8248bfSmrg<xref linkend="Xkb_Server_Keyboard_Mapping" />). 2505e9fcaa8aSmrg</para> 2506e9fcaa8aSmrg 2507e9fcaa8aSmrg 2508eb411b4bSmrg<sect2 id='Getting_the_Per_Key_Modifier_Map_from_the_Server'> 2509e9fcaa8aSmrg<title>Getting the Per-Key Modifier Map from the Server</title> 2510e9fcaa8aSmrg 2511e9fcaa8aSmrg<para> 2512e9fcaa8aSmrgTo update the modifier map for one or more of the keys in a keyboard 25130f8248bfSmrgdescription, use 25140f8248bfSmrg<function>XkbGetKeyModifierMap</function>. 25150f8248bfSmrg</para> 25160f8248bfSmrg 25170f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyModifierMap"><primary><function>XkbGetKeyModifierMap</function></primary></indexterm> 25180f8248bfSmrg<funcsynopsis id="XkbGetKeyModifierMap"> 25190f8248bfSmrg <funcprototype> 25200f8248bfSmrg <funcdef>Status <function>XkbGetKeyModifierMap</function></funcdef> 25210f8248bfSmrg<!-- ( 25220f8248bfSmrg<parameter>dpy</parameter>, 25230f8248bfSmrg<parameter>first</parameter>, 25240f8248bfSmrg<parameter>num</parameter>, 25250f8248bfSmrg<parameter>xkb</parameter> 25260f8248bfSmrg) --> 25270f8248bfSmrg 25280f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 25290f8248bfSmrg <paramdef>unsigned int <parameter>first</parameter></paramdef> 25300f8248bfSmrg <paramdef>unsigned int <parameter>num</parameter></paramdef> 25310f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 25320f8248bfSmrg </funcprototype> 25330f8248bfSmrg</funcsynopsis> 25340f8248bfSmrg<variablelist> 25350f8248bfSmrg <varlistentry> 25360f8248bfSmrg <term> 25370f8248bfSmrg <parameter>dpy</parameter> 25380f8248bfSmrg </term> 25390f8248bfSmrg <listitem> 25400f8248bfSmrg <para> 25410f8248bfSmrg connection to X server 25420f8248bfSmrg </para> 25430f8248bfSmrg </listitem> 25440f8248bfSmrg </varlistentry> 25450f8248bfSmrg <varlistentry> 25460f8248bfSmrg <term> 25470f8248bfSmrg <parameter>first</parameter> 25480f8248bfSmrg </term> 25490f8248bfSmrg <listitem> 25500f8248bfSmrg <para> 25510f8248bfSmrg keycode of first key to get 25520f8248bfSmrg </para> 25530f8248bfSmrg </listitem> 25540f8248bfSmrg </varlistentry> 25550f8248bfSmrg <varlistentry> 25560f8248bfSmrg <term> 25570f8248bfSmrg <parameter>num</parameter> 25580f8248bfSmrg </term> 25590f8248bfSmrg <listitem> 25600f8248bfSmrg <para> 25610f8248bfSmrg number of keys for which information is desired 25620f8248bfSmrg </para> 25630f8248bfSmrg </listitem> 25640f8248bfSmrg </varlistentry> 25650f8248bfSmrg <varlistentry> 25660f8248bfSmrg <term> 25670f8248bfSmrg <parameter>xkb</parameter> 25680f8248bfSmrg </term> 25690f8248bfSmrg <listitem> 25700f8248bfSmrg <para> 25710f8248bfSmrg keyboard description to update 25720f8248bfSmrg </para> 25730f8248bfSmrg </listitem> 25740f8248bfSmrg </varlistentry> 25750f8248bfSmrg</variablelist> 25760f8248bfSmrg 25770f8248bfSmrg<para> 25780f8248bfSmrg<function>XkbGetKeyModifierMap</function> 25790f8248bfSmrgsends a request to the server for the modifier mappings for 25800f8248bfSmrg<parameter>num</parameter> 25810f8248bfSmrgkeys starting with the key whose keycode is 25820f8248bfSmrg<parameter>first</parameter>. 25830f8248bfSmrgIt waits for a reply and places the results in the 25840f8248bfSmrg<parameter>xkb</parameter>->map->modmap array. If successful, 25850f8248bfSmrg<function>XkbGetKeyModifierMap</function> 25860f8248bfSmrgreturns 25870f8248bfSmrg<symbol>Success</symbol>. 25880f8248bfSmrg</para> 25890f8248bfSmrg 25900f8248bfSmrg 25910f8248bfSmrg<para> 25920f8248bfSmrgIf the map component of the 25930f8248bfSmrg<parameter>xkb</parameter> 25940f8248bfSmrgparameter has not been allocated, 25950f8248bfSmrg<function>XkbGetKeyModifierMap</function> 25960f8248bfSmrgallocates and initializes it. 2597e9fcaa8aSmrg</para> 2598e9fcaa8aSmrg 2599e9fcaa8aSmrg 2600e9fcaa8aSmrg<para> 2601e9fcaa8aSmrgIf a compatible version of Xkb is not available in the server or the Xkb 26020f8248bfSmrgextension has not been properly initialized, 26030f8248bfSmrg<function>XkbGetKeySyms</function> 26040f8248bfSmrgreturns 26050f8248bfSmrg<errorname>BadAccess</errorname>. 26060f8248bfSmrgIf any allocation errors occur while obtaining the modifier map, 26070f8248bfSmrg<function>XkbGetKeyModifierMap</function> 26080f8248bfSmrgreturns 26090f8248bfSmrg<errorname>BadAlloc</errorname>. 2610e9fcaa8aSmrg</para> 2611e9fcaa8aSmrg</sect2> 2612e9fcaa8aSmrg</sect1> 2613e9fcaa8aSmrg</chapter> 2614