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