ch06.xml revision eb411b4b
1eb411b4bSmrg<chapter id='Complete_Keyboard_Description'>
2e9fcaa8aSmrg<title>Complete Keyboard Description</title>
3e9fcaa8aSmrg
4e9fcaa8aSmrg<para>
5e9fcaa8aSmrgThe complete Xkb description for a keyboard device is accessed using a single
6e9fcaa8aSmrgstructure containing pointers to major Xkb components. This chapter describes
7e9fcaa8aSmrgthis single structure and provides references to other sections of this
8e9fcaa8aSmrgdocument that discuss the major Xkb components in detail.
9e9fcaa8aSmrg</para>
10e9fcaa8aSmrg
11eb411b4bSmrg<sect1 id='The_XkbDescRec_Structure'>
12e9fcaa8aSmrg<title>The XkbDescRec Structure</title>
13e9fcaa8aSmrg
14e9fcaa8aSmrg<para>
15e9fcaa8aSmrgThe complete description of an Xkb keyboard is given by an <emphasis>
16e9fcaa8aSmrgXkbDescRec</emphasis>
17e9fcaa8aSmrg. The component structures in the <emphasis>
18e9fcaa8aSmrgXkbDescRec</emphasis>
19e9fcaa8aSmrg represent the major Xkb components outlined in Figure 1.1. <!-- xref -->
20e9fcaa8aSmrg</para>
21e9fcaa8aSmrg
22e9fcaa8aSmrg<para><programlisting>
23e9fcaa8aSmrgtypedef struct {
24e9fcaa8aSmrg      struct _XDisplay *                  display;            /* connection to
25e9fcaa8aSmrgX server */
26e9fcaa8aSmrg      unsigned short                  flags;            /* private to Xkb, do
27e9fcaa8aSmrgnot modify */
28e9fcaa8aSmrg      unsigned short                  device_spec;            /* device of
29e9fcaa8aSmrginterest */
30e9fcaa8aSmrg      KeyCode                  min_key_code;            /* minimum keycode for
31e9fcaa8aSmrgdevice */
32e9fcaa8aSmrg      KeyCode                  max_key_code;            /* maximum keycode for
33e9fcaa8aSmrgdevice */
34e9fcaa8aSmrg      XkbControlsPtr                  ctrls;            /* controls */
35e9fcaa8aSmrg      XkbServerMapPtr                  server;            /* server keymap */
36e9fcaa8aSmrg      XkbClientMapPtr                  map;            /* client keymap */
37e9fcaa8aSmrg      XkbIndicatorPtr                  indicators;            /* indicator map
38e9fcaa8aSmrg*/
39e9fcaa8aSmrg      XkbNamesPtr                  names;            /* names for all
40e9fcaa8aSmrgcomponents */
41e9fcaa8aSmrg      XkbCompatMapPtr                  compat;            /* compatibility map
42e9fcaa8aSmrg*/
43e9fcaa8aSmrg      XkbGeometryPtr                  geom;            /* physical geometry of
44e9fcaa8aSmrgkeyboard */
45e9fcaa8aSmrg} <emphasis>
46e9fcaa8aSmrgXkbDescRec</emphasis>
47e9fcaa8aSmrg, *XkbDescPtr;
48e9fcaa8aSmrg</programlisting></para>
49e9fcaa8aSmrg
50e9fcaa8aSmrg<para>
51e9fcaa8aSmrgThe <emphasis>
52e9fcaa8aSmrgdisplay</emphasis>
53e9fcaa8aSmrg field points to an X display structure. The <emphasis>
54e9fcaa8aSmrgflags</emphasis>
55e9fcaa8aSmrg field is private to the library: modifying <emphasis>
56e9fcaa8aSmrgflags</emphasis>
57e9fcaa8aSmrg may yield unpredictable results. The <emphasis>
58e9fcaa8aSmrgdevice_spec</emphasis>
59e9fcaa8aSmrg field specifies the device identifier of the keyboard input device, or
60e9fcaa8aSmrg<emphasis>
61e9fcaa8aSmrgXkbUseCoreKeyboard</emphasis>
62e9fcaa8aSmrg, which specifies the core keyboard device. The <emphasis>
63e9fcaa8aSmrgmin_key_code</emphasis>
64e9fcaa8aSmrg and <emphasis>
65e9fcaa8aSmrgmax_key_code</emphasis>
66e9fcaa8aSmrg fields specify the least and greatest keycode that can be returned by the
67e9fcaa8aSmrgkeyboard.
68e9fcaa8aSmrg</para>
69e9fcaa8aSmrg
70e9fcaa8aSmrg
71e9fcaa8aSmrg<para>
72e9fcaa8aSmrgThe other fields specify structure components of the keyboard description and
73e9fcaa8aSmrgare described in detail in other sections of this document. Table 6.1
74e9fcaa8aSmrgidentifies the subsequent sections of this document that discuss the individual
75e9fcaa8aSmrgcomponents of the <emphasis>
76e9fcaa8aSmrgXkbDescRec</emphasis>
77e9fcaa8aSmrg.
78e9fcaa8aSmrg</para>
79e9fcaa8aSmrg
80eb411b4bSmrg<table frame='topbot'>
81e9fcaa8aSmrg<title>XkbDescRec Component References</title>
82eb411b4bSmrg<?dbfo keep-together="always" ?>
83eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
84eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
85eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
86e9fcaa8aSmrg<thead>
87eb411b4bSmrg<row rowsep='1'>
88e9fcaa8aSmrg  <entry>XkbDescRec Field</entry>
89e9fcaa8aSmrg  <entry>For more info</entry>
90e9fcaa8aSmrg</row>
91e9fcaa8aSmrg</thead>
92e9fcaa8aSmrg<tbody>
93eb411b4bSmrg<row>
94e9fcaa8aSmrg    <entry>ctrls</entry>
95e9fcaa8aSmrg    <entry>Chapter 10</entry>
96e9fcaa8aSmrg</row>
97eb411b4bSmrg<row>
98e9fcaa8aSmrg    <entry>server</entry>
99e9fcaa8aSmrg    <entry>Chapter 16</entry>
100e9fcaa8aSmrg</row>
101eb411b4bSmrg<row>
102e9fcaa8aSmrg    <entry>map</entry>
103e9fcaa8aSmrg    <entry>Chapter 15</entry>
104e9fcaa8aSmrg</row>
105eb411b4bSmrg<row>
106e9fcaa8aSmrg    <entry>indicators</entry>
107e9fcaa8aSmrg    <entry>Chapter 8</entry>
108e9fcaa8aSmrg</row>
109eb411b4bSmrg<row>
110e9fcaa8aSmrg    <entry>names</entry>
111e9fcaa8aSmrg    <entry>Chapter 18</entry>
112e9fcaa8aSmrg</row>
113eb411b4bSmrg<row>
114e9fcaa8aSmrg    <entry>compat</entry>
115e9fcaa8aSmrg    <entry>Chapter 17</entry>
116e9fcaa8aSmrg</row>
117eb411b4bSmrg<row>
118e9fcaa8aSmrg    <entry>geom</entry>
119e9fcaa8aSmrg    <entry>Chapter 13</entry>
120e9fcaa8aSmrg  </row>
121e9fcaa8aSmrg</tbody>
122e9fcaa8aSmrg</tgroup>
123e9fcaa8aSmrg</table>
124e9fcaa8aSmrg
125e9fcaa8aSmrg<para>
126e9fcaa8aSmrgEach structure component has a corresponding mask bit that is used in function
127e9fcaa8aSmrgcalls to indicate that the structure should be manipulated in some manner, such
128e9fcaa8aSmrgas allocating it or freeing it. These masks and their relationships to the
129e9fcaa8aSmrgfields in the <emphasis>
130e9fcaa8aSmrgXkbDescRec</emphasis>
131e9fcaa8aSmrg are shown in Table 6.2. <!-- xref -->
132e9fcaa8aSmrg</para>
133e9fcaa8aSmrg
134eb411b4bSmrg<table frame='topbot'>
135e9fcaa8aSmrg<title>Mask Bits for XkbDescRec</title>
136eb411b4bSmrg<?dbfo keep-together="always" ?>
137eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
138eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
139eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
140eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/>
141e9fcaa8aSmrg<thead>
142eb411b4bSmrg<row rowsep='1'>
143e9fcaa8aSmrg  <entry>Mask Bit</entry>
144e9fcaa8aSmrg  <entry>XkbDescRec Field</entry>
145e9fcaa8aSmrg  <entry>Value</entry>
146e9fcaa8aSmrg</row>
147e9fcaa8aSmrg</thead>
148e9fcaa8aSmrg<tbody>
149eb411b4bSmrg<row>
150e9fcaa8aSmrg    <entry>XkbControlsMask</entry>
151e9fcaa8aSmrg    <entry>ctrls</entry>
152e9fcaa8aSmrg    <entry>(1L&lt;&lt;0)</entry>
153e9fcaa8aSmrg</row>
154eb411b4bSmrg<row>
155e9fcaa8aSmrg    <entry>XkbServerMapMask</entry>
156e9fcaa8aSmrg    <entry>server</entry>
157e9fcaa8aSmrg    <entry>(1L&lt;&lt;1)</entry>
158e9fcaa8aSmrg</row>
159eb411b4bSmrg<row>
160e9fcaa8aSmrg    <entry>XkbIClientMapMask</entry>
161e9fcaa8aSmrg    <entry>map</entry>
162e9fcaa8aSmrg    <entry>(1L&lt;&lt;2)</entry>
163e9fcaa8aSmrg</row>
164eb411b4bSmrg<row>
165e9fcaa8aSmrg    <entry>XkbIndicatorMapMask</entry>
166e9fcaa8aSmrg    <entry>indicators</entry>
167e9fcaa8aSmrg    <entry>(1L&lt;&lt;3)</entry>
168e9fcaa8aSmrg</row>
169eb411b4bSmrg<row>
170e9fcaa8aSmrg    <entry>XkbNamesMask</entry>
171e9fcaa8aSmrg    <entry>names</entry>
172e9fcaa8aSmrg    <entry>(1L&lt;&lt;4)</entry>
173e9fcaa8aSmrg</row>
174eb411b4bSmrg<row>
175e9fcaa8aSmrg    <entry>XkbCompatMapMask</entry>
176e9fcaa8aSmrg    <entry>compat</entry>
177e9fcaa8aSmrg    <entry>(1L&lt;&lt;5)</entry>
178e9fcaa8aSmrg</row>
179eb411b4bSmrg<row>
180e9fcaa8aSmrg    <entry>XkbGeometryMask</entry>
181e9fcaa8aSmrg    <entry>geom</entry>
182e9fcaa8aSmrg    <entry>(1L&lt;&lt;6)</entry>
183e9fcaa8aSmrg</row>
184eb411b4bSmrg<row>
185e9fcaa8aSmrg    <entry>XkbAllComponentsMask</entry>
186e9fcaa8aSmrg    <entry>All Fields</entry>
187e9fcaa8aSmrg    <entry>(0x7f)</entry>
188e9fcaa8aSmrg  </row>
189e9fcaa8aSmrg</tbody>
190e9fcaa8aSmrg</tgroup>
191e9fcaa8aSmrg</table>
192e9fcaa8aSmrg
193e9fcaa8aSmrg</sect1>
194eb411b4bSmrg<sect1 id='Obtaining_a_Keyboard_Description_from_the_Server'>
195e9fcaa8aSmrg<title>Obtaining a Keyboard Description from the Server</title>
196e9fcaa8aSmrg
197e9fcaa8aSmrg<para>
198e9fcaa8aSmrgTo retrieve one or more components of a keyboard device description, use
199e9fcaa8aSmrg<emphasis>
200e9fcaa8aSmrgXkbGetKeyboard</emphasis>
201e9fcaa8aSmrg (see also <emphasis>
202e9fcaa8aSmrgXkbGetKeyboardbyName</emphasis>
203e9fcaa8aSmrg).
204e9fcaa8aSmrg</para>
205e9fcaa8aSmrg
206e9fcaa8aSmrg<informaltable frame='none'>
207eb411b4bSmrg<?dbfo keep-together="always" ?>
208eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'>
209eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
210e9fcaa8aSmrg<tbody>
211eb411b4bSmrg  <row>
212e9fcaa8aSmrg    <entry role='functiondecl'>
213e9fcaa8aSmrgXkbDescPtr <emphasis>
214e9fcaa8aSmrgXkbGetKeyboard</emphasis>
215e9fcaa8aSmrg(<emphasis>
216e9fcaa8aSmrgdisplay, which, device_spec</emphasis>
217e9fcaa8aSmrg)
218e9fcaa8aSmrg    </entry>
219e9fcaa8aSmrg  </row>
220eb411b4bSmrg  <row>
221e9fcaa8aSmrg    <entry role='functionargdecl'>
222e9fcaa8aSmrgDisplay * <emphasis>
223e9fcaa8aSmrg      display</emphasis>
224e9fcaa8aSmrg;            /* connection to X server */
225e9fcaa8aSmrg    </entry>
226e9fcaa8aSmrg  </row>
227eb411b4bSmrg  <row>
228e9fcaa8aSmrg    <entry role='functionargdecl'>
229e9fcaa8aSmrgunsigned int      <emphasis>
230e9fcaa8aSmrgwhich</emphasis>
231e9fcaa8aSmrg;            /* mask indicating components to return */
232e9fcaa8aSmrg    </entry>
233e9fcaa8aSmrg  </row>
234eb411b4bSmrg  <row>
235e9fcaa8aSmrg    <entry role='functionargdecl'>
236e9fcaa8aSmrgunsigned int<emphasis>
237e9fcaa8aSmrg      device_spec</emphasis>
238e9fcaa8aSmrg;            /* device for which to fetch description, or <emphasis>
239e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
240e9fcaa8aSmrg */
241e9fcaa8aSmrg    </entry>
242e9fcaa8aSmrg</row>
243e9fcaa8aSmrg</tbody>
244e9fcaa8aSmrg</tgroup>
245e9fcaa8aSmrg</informaltable>
246e9fcaa8aSmrg
247e9fcaa8aSmrg<para>
248e9fcaa8aSmrg<emphasis>
249e9fcaa8aSmrgXkbGetKeyboard </emphasis>
250e9fcaa8aSmrgallocates and returns a pointer to a keyboard description. It queries the
251e9fcaa8aSmrgserver for those components specified in the <emphasis>
252e9fcaa8aSmrgwhich</emphasis>
253e9fcaa8aSmrg parameter for device <emphasis>
254e9fcaa8aSmrgdevice_spec</emphasis>
255e9fcaa8aSmrg and copies the results to the <emphasis>
256e9fcaa8aSmrgXkbDescRec</emphasis>
257e9fcaa8aSmrg it allocated. The remaining fields in the keyboard description are set to
258e9fcaa8aSmrg<emphasis>
259e9fcaa8aSmrgNULL</emphasis>
260e9fcaa8aSmrg. The valid masks for <emphasis>
261e9fcaa8aSmrgwhich</emphasis>
262e9fcaa8aSmrg are those listed in Table 6.2. <!-- xref -->
263e9fcaa8aSmrg</para>
264e9fcaa8aSmrg
265e9fcaa8aSmrg
266e9fcaa8aSmrg<para>
267e9fcaa8aSmrg<emphasis>
268e9fcaa8aSmrgXkbGetKeyboard</emphasis>
269e9fcaa8aSmrg can generate <emphasis>
270e9fcaa8aSmrgBadAlloc</emphasis>
271e9fcaa8aSmrg protocol errors.
272e9fcaa8aSmrg</para>
273e9fcaa8aSmrg
274e9fcaa8aSmrg
275e9fcaa8aSmrg<para>
276e9fcaa8aSmrgTo free the returned keyboard description, use <emphasis>
277e9fcaa8aSmrgXkbFreeKeyboard</emphasis>
278e9fcaa8aSmrg (see section 6.4). <!-- xref -->
279e9fcaa8aSmrg</para>
280e9fcaa8aSmrg
281e9fcaa8aSmrg
282e9fcaa8aSmrg</sect1>
283eb411b4bSmrg<sect1 id='Tracking_Changes_to_the_Keyboard_Description_in_the_Server'>
284e9fcaa8aSmrg<title>Tracking Changes to the Keyboard Description in the Server</title>
285e9fcaa8aSmrg
286e9fcaa8aSmrg<para>
287e9fcaa8aSmrgThe server can generate events whenever its copy of the keyboard description
288e9fcaa8aSmrgfor a device changes. Refer to section 14.4 for detailed information on  <!-- xref -->
289e9fcaa8aSmrgtracking changes to the keyboard description.
290e9fcaa8aSmrg</para>
291e9fcaa8aSmrg
292e9fcaa8aSmrg
293e9fcaa8aSmrg</sect1>
294eb411b4bSmrg<sect1 id='Allocating_and_Freeing_a_Keyboard_Description'>
295e9fcaa8aSmrg<title>Allocating and Freeing a Keyboard Description</title>
296e9fcaa8aSmrg
297e9fcaa8aSmrg<para>
298e9fcaa8aSmrgApplications seldom need to directly allocate a keyboard description; calling
299e9fcaa8aSmrg<emphasis>
300e9fcaa8aSmrgXkbGetKeyboard</emphasis>
301e9fcaa8aSmrg usually suffices. In the event you need to create a keyboard description from
302e9fcaa8aSmrgscratch, however, use <emphasis>
303e9fcaa8aSmrgXkbAllocKeyboard</emphasis>
304e9fcaa8aSmrg rather than directly calling <emphasis>
305e9fcaa8aSmrgmalloc </emphasis>
306e9fcaa8aSmrgor <emphasis>
307e9fcaa8aSmrgXmalloc</emphasis>
308e9fcaa8aSmrg.
309e9fcaa8aSmrg</para>
310e9fcaa8aSmrg
311e9fcaa8aSmrg<informaltable frame='none'>
312eb411b4bSmrg<?dbfo keep-together="always" ?>
313eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'>
314eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
315e9fcaa8aSmrg<tbody>
316eb411b4bSmrg  <row>
317e9fcaa8aSmrg    <entry role='functiondecl'>
318e9fcaa8aSmrgXkbDescRec * <emphasis>
319e9fcaa8aSmrgXkbAllocKeyboard</emphasis>
320e9fcaa8aSmrg(void)
321e9fcaa8aSmrg    </entry>
322e9fcaa8aSmrg  </row>
323e9fcaa8aSmrg</tbody>
324e9fcaa8aSmrg</tgroup>
325e9fcaa8aSmrg</informaltable>
326e9fcaa8aSmrg
327e9fcaa8aSmrg<para>
328e9fcaa8aSmrgIf <emphasis>
329e9fcaa8aSmrgXkbAllocKeyboard</emphasis>
330e9fcaa8aSmrg fails to allocate the keyboard description, it returns <emphasis>
331e9fcaa8aSmrgNULL</emphasis>
332e9fcaa8aSmrg. Otherwise, it returns a pointer to an empty keyboard description structure.
333e9fcaa8aSmrgThe <emphasis>
334e9fcaa8aSmrgdevice_spec</emphasis>
335e9fcaa8aSmrg field will have been initialized to <emphasis>
336e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
337e9fcaa8aSmrg. You may then either fill in the structure components or use Xkb functions to
338e9fcaa8aSmrgobtain values for the structure components from a keyboard device.
339e9fcaa8aSmrg</para>
340e9fcaa8aSmrg
341e9fcaa8aSmrg
342e9fcaa8aSmrg<para>
343e9fcaa8aSmrgTo destroy either an entire an <emphasis>
344e9fcaa8aSmrgXkbDescRec</emphasis>
345e9fcaa8aSmrg or just some of its members, use <emphasis>
346e9fcaa8aSmrgXkbFreeKeyboard.</emphasis>
347e9fcaa8aSmrg</para>
348e9fcaa8aSmrg
349e9fcaa8aSmrg
350e9fcaa8aSmrg<informaltable frame='none'>
351eb411b4bSmrg<?dbfo keep-together="always" ?>
352eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'>
353eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
354e9fcaa8aSmrg<tbody>
355eb411b4bSmrg  <row>
356e9fcaa8aSmrg    <entry role='functiondecl'>
357e9fcaa8aSmrgvoid <emphasis>
358e9fcaa8aSmrgXkbFreeKeyboard</emphasis>
359e9fcaa8aSmrg<emphasis>
360e9fcaa8aSmrg(xkb, which, free_all</emphasis>
361e9fcaa8aSmrg)
362e9fcaa8aSmrg    </entry>
363e9fcaa8aSmrg  </row>
364eb411b4bSmrg  <row>
365e9fcaa8aSmrg    <entry role='functionargdecl'>
366e9fcaa8aSmrgXkbDescPtr <emphasis>
367e9fcaa8aSmrg            xkb</emphasis>
368e9fcaa8aSmrg;            /* keyboard description with components to free */
369e9fcaa8aSmrg    </entry>
370e9fcaa8aSmrg  </row>
371eb411b4bSmrg  <row>
372e9fcaa8aSmrg    <entry role='functionargdecl'>
373e9fcaa8aSmrgunsigned int      <emphasis>
374e9fcaa8aSmrg      which</emphasis>
375e9fcaa8aSmrg;            /* mask selecting components to free */
376e9fcaa8aSmrg    </entry>
377e9fcaa8aSmrg  </row>
378eb411b4bSmrg  <row>
379e9fcaa8aSmrg    <entry role='functionargdecl'>
380e9fcaa8aSmrgBool <emphasis>
381e9fcaa8aSmrg            free_all</emphasis>
382e9fcaa8aSmrg;            /* <emphasis>
383e9fcaa8aSmrgTrue</emphasis>
384e9fcaa8aSmrg =&gt; free all components and <emphasis>
385e9fcaa8aSmrgxkb</emphasis>
386e9fcaa8aSmrg */
387e9fcaa8aSmrg    </entry>
388e9fcaa8aSmrg</row>
389e9fcaa8aSmrg</tbody>
390e9fcaa8aSmrg</tgroup>
391e9fcaa8aSmrg</informaltable>
392e9fcaa8aSmrg
393e9fcaa8aSmrg<para>
394e9fcaa8aSmrg<emphasis>
395e9fcaa8aSmrgXkbFreeKeyboard</emphasis>
396e9fcaa8aSmrg frees the components of <emphasis>
397e9fcaa8aSmrgxkb</emphasis>
398e9fcaa8aSmrg specified by <emphasis>
399e9fcaa8aSmrgwhich</emphasis>
400e9fcaa8aSmrg and sets the corresponding values to <emphasis>
401e9fcaa8aSmrgNULL</emphasis>
402e9fcaa8aSmrg. If <emphasis>
403e9fcaa8aSmrgfree_all</emphasis>
404e9fcaa8aSmrg is <emphasis>
405e9fcaa8aSmrgTrue</emphasis>
406e9fcaa8aSmrg, <emphasis>
407e9fcaa8aSmrgXkbFreeKeyboard</emphasis>
408e9fcaa8aSmrg frees every non-<emphasis>
409e9fcaa8aSmrgNULL</emphasis>
410e9fcaa8aSmrg component of <emphasis>
411e9fcaa8aSmrgxkb</emphasis>
412e9fcaa8aSmrg and then frees the <emphasis>
413e9fcaa8aSmrgxkb</emphasis>
414e9fcaa8aSmrg structure itself.
415e9fcaa8aSmrg</para>
416e9fcaa8aSmrg
417e9fcaa8aSmrg</sect1>
418e9fcaa8aSmrg</chapter>
419