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> &rArr; 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-&gt;map-&gt;types[i].name</entry>
263e9fcaa8aSmrg  </row>
264eb411b4bSmrg  <row>
265e9fcaa8aSmrg    <entry>modifiers = Shift+Lock+LevelThree;</entry>
266e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].mods</entry>
267e9fcaa8aSmrg  </row>
268eb411b4bSmrg  <row>
269e9fcaa8aSmrg    <entry><emphasis>map[None]= Level1;</emphasis></entry>
270e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].map[0]</entry>
271e9fcaa8aSmrg  </row>
272eb411b4bSmrg  <row>
273e9fcaa8aSmrg    <entry><emphasis>map[Lock]= Level1;</emphasis></entry>
274e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].map[1]</entry>
275e9fcaa8aSmrg  </row>
276eb411b4bSmrg  <row>
277e9fcaa8aSmrg    <entry>map[Shift]= Level2;</entry>
278e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].map[2]</entry>
279e9fcaa8aSmrg  </row>
280eb411b4bSmrg  <row>
281e9fcaa8aSmrg    <entry>map[LevelThree]= Level3;</entry>
282e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].map[3]</entry>
283e9fcaa8aSmrg  </row>
284eb411b4bSmrg  <row>
285e9fcaa8aSmrg    <entry>map[Shift+LevelThree]= Level3;</entry>
286e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].map[4]</entry>
287e9fcaa8aSmrg  </row>
288eb411b4bSmrg  <row>
289e9fcaa8aSmrg    <entry><emphasis>preserve[None]= None;</emphasis></entry>
2900f8248bfSmrg    <entry>Xkb-&gt;map-&gt;types[i].preserve[0]</entry>
291e9fcaa8aSmrg  </row>
292eb411b4bSmrg  <row>
293e9fcaa8aSmrg    <entry>preserve[Lock]= Lock;</entry>
294e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].preserve[1]</entry>
295e9fcaa8aSmrg  </row>
296eb411b4bSmrg  <row>
297e9fcaa8aSmrg    <entry><emphasis>preserve[Shift]= None;</emphasis></entry>
298e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].preserve[2]</entry>
299e9fcaa8aSmrg  </row>
300eb411b4bSmrg  <row>
301e9fcaa8aSmrg    <entry><emphasis>preserve[LevelThree]= None;</emphasis></entry>
302e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].preserve[3]</entry>
303e9fcaa8aSmrg  </row>
304eb411b4bSmrg  <row>
305e9fcaa8aSmrg    <entry><emphasis>preserve[Shift+Level3]= None;</emphasis> </entry>
306e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].preserve[4]</entry>
307e9fcaa8aSmrg  </row>
308eb411b4bSmrg  <row>
309e9fcaa8aSmrg    <entry>level_name[Level1]= "Base";</entry>
310e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].level_names[0]</entry>
311e9fcaa8aSmrg  </row>
312eb411b4bSmrg  <row>
313e9fcaa8aSmrg    <entry>level_name[Level2]= "Caps";</entry>
314e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;types[i].level_names[1]</entry>
315e9fcaa8aSmrg  </row>
316eb411b4bSmrg  <row>
317e9fcaa8aSmrg    <entry>level_name[Level3]= "Level3";</entry>
318e9fcaa8aSmrg    <entry>Xkb-&gt;map-&gt;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 &rArr; 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-&gt;map-&gt;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-&gt;map-&gt;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         &rArr; 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>-&gt;<structfield>map-&gt;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>-&gt;<structfield>map-&gt;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-&gt;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>-&gt;map-&gt;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