ch06.xml revision e9fcaa8a
1e9fcaa8aSmrg<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
11e9fcaa8aSmrg<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
80e9fcaa8aSmrg<table frame='none'>
81e9fcaa8aSmrg<title>XkbDescRec Component References</title>
82e9fcaa8aSmrg<tgroup cols='2'>
83e9fcaa8aSmrg<colspec colsep='0'/>
84e9fcaa8aSmrg<colspec colsep='0'/>
85e9fcaa8aSmrg<thead>
86e9fcaa8aSmrg<row rowsep='0'>
87e9fcaa8aSmrg  <entry>XkbDescRec Field</entry>
88e9fcaa8aSmrg  <entry>For more info</entry>
89e9fcaa8aSmrg</row>
90e9fcaa8aSmrg</thead>
91e9fcaa8aSmrg<tbody>
92e9fcaa8aSmrg<row rowsep='0'>
93e9fcaa8aSmrg    <entry>ctrls</entry>
94e9fcaa8aSmrg    <entry>Chapter 10</entry>
95e9fcaa8aSmrg</row>
96e9fcaa8aSmrg<row rowsep='0'>
97e9fcaa8aSmrg    <entry>server</entry>
98e9fcaa8aSmrg    <entry>Chapter 16</entry>
99e9fcaa8aSmrg</row>
100e9fcaa8aSmrg<row rowsep='0'>
101e9fcaa8aSmrg    <entry>map</entry>
102e9fcaa8aSmrg    <entry>Chapter 15</entry>
103e9fcaa8aSmrg</row>
104e9fcaa8aSmrg<row rowsep='0'>
105e9fcaa8aSmrg    <entry>indicators</entry>
106e9fcaa8aSmrg    <entry>Chapter 8</entry>
107e9fcaa8aSmrg</row>
108e9fcaa8aSmrg<row rowsep='0'>
109e9fcaa8aSmrg    <entry>names</entry>
110e9fcaa8aSmrg    <entry>Chapter 18</entry>
111e9fcaa8aSmrg</row>
112e9fcaa8aSmrg<row rowsep='0'>
113e9fcaa8aSmrg    <entry>compat</entry>
114e9fcaa8aSmrg    <entry>Chapter 17</entry>
115e9fcaa8aSmrg</row>
116e9fcaa8aSmrg<row rowsep='0'>
117e9fcaa8aSmrg    <entry>geom</entry>
118e9fcaa8aSmrg    <entry>Chapter 13</entry>
119e9fcaa8aSmrg  </row>
120e9fcaa8aSmrg</tbody>
121e9fcaa8aSmrg</tgroup>
122e9fcaa8aSmrg</table>
123e9fcaa8aSmrg
124e9fcaa8aSmrg<para>
125e9fcaa8aSmrgEach structure component has a corresponding mask bit that is used in function
126e9fcaa8aSmrgcalls to indicate that the structure should be manipulated in some manner, such
127e9fcaa8aSmrgas allocating it or freeing it. These masks and their relationships to the
128e9fcaa8aSmrgfields in the <emphasis>
129e9fcaa8aSmrgXkbDescRec</emphasis>
130e9fcaa8aSmrg are shown in Table 6.2. <!-- xref -->
131e9fcaa8aSmrg</para>
132e9fcaa8aSmrg
133e9fcaa8aSmrg<table frame='none'>
134e9fcaa8aSmrg<title>Mask Bits for XkbDescRec</title>
135e9fcaa8aSmrg<tgroup cols='3'>
136e9fcaa8aSmrg<colspec colsep='0'/>
137e9fcaa8aSmrg<colspec colsep='0'/>
138e9fcaa8aSmrg<colspec colsep='0'/>
139e9fcaa8aSmrg<thead>
140e9fcaa8aSmrg<row rowsep='0'>
141e9fcaa8aSmrg  <entry>Mask Bit</entry>
142e9fcaa8aSmrg  <entry>XkbDescRec Field</entry>
143e9fcaa8aSmrg  <entry>Value</entry>
144e9fcaa8aSmrg</row>
145e9fcaa8aSmrg</thead>
146e9fcaa8aSmrg<tbody>
147e9fcaa8aSmrg<row rowsep='0'>
148e9fcaa8aSmrg    <entry>XkbControlsMask</entry>
149e9fcaa8aSmrg    <entry>ctrls</entry>
150e9fcaa8aSmrg    <entry>(1L&lt;&lt;0)</entry>
151e9fcaa8aSmrg</row>
152e9fcaa8aSmrg<row rowsep='0'>
153e9fcaa8aSmrg    <entry>XkbServerMapMask</entry>
154e9fcaa8aSmrg    <entry>server</entry>
155e9fcaa8aSmrg    <entry>(1L&lt;&lt;1)</entry>
156e9fcaa8aSmrg</row>
157e9fcaa8aSmrg<row rowsep='0'>
158e9fcaa8aSmrg    <entry>XkbIClientMapMask</entry>
159e9fcaa8aSmrg    <entry>map</entry>
160e9fcaa8aSmrg    <entry>(1L&lt;&lt;2)</entry>
161e9fcaa8aSmrg</row>
162e9fcaa8aSmrg<row rowsep='0'>
163e9fcaa8aSmrg    <entry>XkbIndicatorMapMask</entry>
164e9fcaa8aSmrg    <entry>indicators</entry>
165e9fcaa8aSmrg    <entry>(1L&lt;&lt;3)</entry>
166e9fcaa8aSmrg</row>
167e9fcaa8aSmrg<row rowsep='0'>
168e9fcaa8aSmrg    <entry>XkbNamesMask</entry>
169e9fcaa8aSmrg    <entry>names</entry>
170e9fcaa8aSmrg    <entry>(1L&lt;&lt;4)</entry>
171e9fcaa8aSmrg</row>
172e9fcaa8aSmrg<row rowsep='0'>
173e9fcaa8aSmrg    <entry>XkbCompatMapMask</entry>
174e9fcaa8aSmrg    <entry>compat</entry>
175e9fcaa8aSmrg    <entry>(1L&lt;&lt;5)</entry>
176e9fcaa8aSmrg</row>
177e9fcaa8aSmrg<row rowsep='0'>
178e9fcaa8aSmrg    <entry>XkbGeometryMask</entry>
179e9fcaa8aSmrg    <entry>geom</entry>
180e9fcaa8aSmrg    <entry>(1L&lt;&lt;6)</entry>
181e9fcaa8aSmrg</row>
182e9fcaa8aSmrg<row rowsep='0'>
183e9fcaa8aSmrg    <entry>XkbAllComponentsMask</entry>
184e9fcaa8aSmrg    <entry>All Fields</entry>
185e9fcaa8aSmrg    <entry>(0x7f)</entry>
186e9fcaa8aSmrg  </row>
187e9fcaa8aSmrg</tbody>
188e9fcaa8aSmrg</tgroup>
189e9fcaa8aSmrg</table>
190e9fcaa8aSmrg
191e9fcaa8aSmrg</sect1>
192e9fcaa8aSmrg<sect1 id='obtaining_a_keyboard_description_from_the_server'>
193e9fcaa8aSmrg<title>Obtaining a Keyboard Description from the Server</title>
194e9fcaa8aSmrg
195e9fcaa8aSmrg<para>
196e9fcaa8aSmrgTo retrieve one or more components of a keyboard device description, use
197e9fcaa8aSmrg<emphasis>
198e9fcaa8aSmrgXkbGetKeyboard</emphasis>
199e9fcaa8aSmrg (see also <emphasis>
200e9fcaa8aSmrgXkbGetKeyboardbyName</emphasis>
201e9fcaa8aSmrg).
202e9fcaa8aSmrg</para>
203e9fcaa8aSmrg
204e9fcaa8aSmrg<informaltable frame='none'>
205e9fcaa8aSmrg<tgroup cols='1'>
206e9fcaa8aSmrg<colspec colsep='0'/>
207e9fcaa8aSmrg<tbody>
208e9fcaa8aSmrg  <row rowsep='0'>
209e9fcaa8aSmrg    <entry role='functiondecl'>
210e9fcaa8aSmrgXkbDescPtr <emphasis>
211e9fcaa8aSmrgXkbGetKeyboard</emphasis>
212e9fcaa8aSmrg(<emphasis>
213e9fcaa8aSmrgdisplay, which, device_spec</emphasis>
214e9fcaa8aSmrg)
215e9fcaa8aSmrg    </entry>
216e9fcaa8aSmrg  </row>
217e9fcaa8aSmrg  <row rowsep='0'>
218e9fcaa8aSmrg    <entry role='functionargdecl'>
219e9fcaa8aSmrgDisplay * <emphasis>
220e9fcaa8aSmrg      display</emphasis>
221e9fcaa8aSmrg;            /* connection to X server */
222e9fcaa8aSmrg    </entry>
223e9fcaa8aSmrg  </row>
224e9fcaa8aSmrg  <row rowsep='0'>
225e9fcaa8aSmrg    <entry role='functionargdecl'>
226e9fcaa8aSmrgunsigned int      <emphasis>
227e9fcaa8aSmrgwhich</emphasis>
228e9fcaa8aSmrg;            /* mask indicating components to return */
229e9fcaa8aSmrg    </entry>
230e9fcaa8aSmrg  </row>
231e9fcaa8aSmrg  <row rowsep='0'>
232e9fcaa8aSmrg    <entry role='functionargdecl'>
233e9fcaa8aSmrgunsigned int<emphasis>
234e9fcaa8aSmrg      device_spec</emphasis>
235e9fcaa8aSmrg;            /* device for which to fetch description, or <emphasis>
236e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
237e9fcaa8aSmrg */
238e9fcaa8aSmrg    </entry>
239e9fcaa8aSmrg</row>
240e9fcaa8aSmrg</tbody>
241e9fcaa8aSmrg</tgroup>
242e9fcaa8aSmrg</informaltable>
243e9fcaa8aSmrg
244e9fcaa8aSmrg<para>
245e9fcaa8aSmrg<emphasis>
246e9fcaa8aSmrgXkbGetKeyboard </emphasis>
247e9fcaa8aSmrgallocates and returns a pointer to a keyboard description. It queries the
248e9fcaa8aSmrgserver for those components specified in the <emphasis>
249e9fcaa8aSmrgwhich</emphasis>
250e9fcaa8aSmrg parameter for device <emphasis>
251e9fcaa8aSmrgdevice_spec</emphasis>
252e9fcaa8aSmrg and copies the results to the <emphasis>
253e9fcaa8aSmrgXkbDescRec</emphasis>
254e9fcaa8aSmrg it allocated. The remaining fields in the keyboard description are set to
255e9fcaa8aSmrg<emphasis>
256e9fcaa8aSmrgNULL</emphasis>
257e9fcaa8aSmrg. The valid masks for <emphasis>
258e9fcaa8aSmrgwhich</emphasis>
259e9fcaa8aSmrg are those listed in Table 6.2. <!-- xref -->
260e9fcaa8aSmrg</para>
261e9fcaa8aSmrg
262e9fcaa8aSmrg
263e9fcaa8aSmrg<para>
264e9fcaa8aSmrg<emphasis>
265e9fcaa8aSmrgXkbGetKeyboard</emphasis>
266e9fcaa8aSmrg can generate <emphasis>
267e9fcaa8aSmrgBadAlloc</emphasis>
268e9fcaa8aSmrg protocol errors.
269e9fcaa8aSmrg</para>
270e9fcaa8aSmrg
271e9fcaa8aSmrg
272e9fcaa8aSmrg<para>
273e9fcaa8aSmrgTo free the returned keyboard description, use <emphasis>
274e9fcaa8aSmrgXkbFreeKeyboard</emphasis>
275e9fcaa8aSmrg (see section 6.4). <!-- xref -->
276e9fcaa8aSmrg</para>
277e9fcaa8aSmrg
278e9fcaa8aSmrg
279e9fcaa8aSmrg</sect1>
280e9fcaa8aSmrg<sect1 id='tracking_changes_to_the_keyboard_description_in_the_server'>
281e9fcaa8aSmrg<title>Tracking Changes to the Keyboard Description in the Server</title>
282e9fcaa8aSmrg
283e9fcaa8aSmrg<para>
284e9fcaa8aSmrgThe server can generate events whenever its copy of the keyboard description
285e9fcaa8aSmrgfor a device changes. Refer to section 14.4 for detailed information on  <!-- xref -->
286e9fcaa8aSmrgtracking changes to the keyboard description.
287e9fcaa8aSmrg</para>
288e9fcaa8aSmrg
289e9fcaa8aSmrg
290e9fcaa8aSmrg</sect1>
291e9fcaa8aSmrg<sect1 id='allocating_and_freeing_a_keyboard_description'>
292e9fcaa8aSmrg<title>Allocating and Freeing a Keyboard Description</title>
293e9fcaa8aSmrg
294e9fcaa8aSmrg<para>
295e9fcaa8aSmrgApplications seldom need to directly allocate a keyboard description; calling
296e9fcaa8aSmrg<emphasis>
297e9fcaa8aSmrgXkbGetKeyboard</emphasis>
298e9fcaa8aSmrg usually suffices. In the event you need to create a keyboard description from
299e9fcaa8aSmrgscratch, however, use <emphasis>
300e9fcaa8aSmrgXkbAllocKeyboard</emphasis>
301e9fcaa8aSmrg rather than directly calling <emphasis>
302e9fcaa8aSmrgmalloc </emphasis>
303e9fcaa8aSmrgor <emphasis>
304e9fcaa8aSmrgXmalloc</emphasis>
305e9fcaa8aSmrg.
306e9fcaa8aSmrg</para>
307e9fcaa8aSmrg
308e9fcaa8aSmrg<informaltable frame='none'>
309e9fcaa8aSmrg<tgroup cols='1'>
310e9fcaa8aSmrg<colspec colsep='0'/>
311e9fcaa8aSmrg<tbody>
312e9fcaa8aSmrg  <row rowsep='0'>
313e9fcaa8aSmrg    <entry role='functiondecl'>
314e9fcaa8aSmrgXkbDescRec * <emphasis>
315e9fcaa8aSmrgXkbAllocKeyboard</emphasis>
316e9fcaa8aSmrg(void)
317e9fcaa8aSmrg    </entry>
318e9fcaa8aSmrg  </row>
319e9fcaa8aSmrg</tbody>
320e9fcaa8aSmrg</tgroup>
321e9fcaa8aSmrg</informaltable>
322e9fcaa8aSmrg
323e9fcaa8aSmrg<para>
324e9fcaa8aSmrgIf <emphasis>
325e9fcaa8aSmrgXkbAllocKeyboard</emphasis>
326e9fcaa8aSmrg fails to allocate the keyboard description, it returns <emphasis>
327e9fcaa8aSmrgNULL</emphasis>
328e9fcaa8aSmrg. Otherwise, it returns a pointer to an empty keyboard description structure.
329e9fcaa8aSmrgThe <emphasis>
330e9fcaa8aSmrgdevice_spec</emphasis>
331e9fcaa8aSmrg field will have been initialized to <emphasis>
332e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
333e9fcaa8aSmrg. You may then either fill in the structure components or use Xkb functions to
334e9fcaa8aSmrgobtain values for the structure components from a keyboard device.
335e9fcaa8aSmrg</para>
336e9fcaa8aSmrg
337e9fcaa8aSmrg
338e9fcaa8aSmrg<para>
339e9fcaa8aSmrgTo destroy either an entire an <emphasis>
340e9fcaa8aSmrgXkbDescRec</emphasis>
341e9fcaa8aSmrg or just some of its members, use <emphasis>
342e9fcaa8aSmrgXkbFreeKeyboard.</emphasis>
343e9fcaa8aSmrg</para>
344e9fcaa8aSmrg
345e9fcaa8aSmrg
346e9fcaa8aSmrg<informaltable frame='none'>
347e9fcaa8aSmrg<tgroup cols='1'>
348e9fcaa8aSmrg<colspec colsep='0'/>
349e9fcaa8aSmrg<tbody>
350e9fcaa8aSmrg  <row rowsep='0'>
351e9fcaa8aSmrg    <entry role='functiondecl'>
352e9fcaa8aSmrgvoid <emphasis>
353e9fcaa8aSmrgXkbFreeKeyboard</emphasis>
354e9fcaa8aSmrg<emphasis>
355e9fcaa8aSmrg(xkb, which, free_all</emphasis>
356e9fcaa8aSmrg)
357e9fcaa8aSmrg    </entry>
358e9fcaa8aSmrg  </row>
359e9fcaa8aSmrg  <row rowsep='0'>
360e9fcaa8aSmrg    <entry role='functionargdecl'>
361e9fcaa8aSmrgXkbDescPtr <emphasis>
362e9fcaa8aSmrg            xkb</emphasis>
363e9fcaa8aSmrg;            /* keyboard description with components to free */
364e9fcaa8aSmrg    </entry>
365e9fcaa8aSmrg  </row>
366e9fcaa8aSmrg  <row rowsep='0'>
367e9fcaa8aSmrg    <entry role='functionargdecl'>
368e9fcaa8aSmrgunsigned int      <emphasis>
369e9fcaa8aSmrg      which</emphasis>
370e9fcaa8aSmrg;            /* mask selecting components to free */
371e9fcaa8aSmrg    </entry>
372e9fcaa8aSmrg  </row>
373e9fcaa8aSmrg  <row rowsep='0'>
374e9fcaa8aSmrg    <entry role='functionargdecl'>
375e9fcaa8aSmrgBool <emphasis>
376e9fcaa8aSmrg            free_all</emphasis>
377e9fcaa8aSmrg;            /* <emphasis>
378e9fcaa8aSmrgTrue</emphasis>
379e9fcaa8aSmrg =&gt; free all components and <emphasis>
380e9fcaa8aSmrgxkb</emphasis>
381e9fcaa8aSmrg */
382e9fcaa8aSmrg    </entry>
383e9fcaa8aSmrg</row>
384e9fcaa8aSmrg</tbody>
385e9fcaa8aSmrg</tgroup>
386e9fcaa8aSmrg</informaltable>
387e9fcaa8aSmrg
388e9fcaa8aSmrg<para>
389e9fcaa8aSmrg<emphasis>
390e9fcaa8aSmrgXkbFreeKeyboard</emphasis>
391e9fcaa8aSmrg frees the components of <emphasis>
392e9fcaa8aSmrgxkb</emphasis>
393e9fcaa8aSmrg specified by <emphasis>
394e9fcaa8aSmrgwhich</emphasis>
395e9fcaa8aSmrg and sets the corresponding values to <emphasis>
396e9fcaa8aSmrgNULL</emphasis>
397e9fcaa8aSmrg. If <emphasis>
398e9fcaa8aSmrgfree_all</emphasis>
399e9fcaa8aSmrg is <emphasis>
400e9fcaa8aSmrgTrue</emphasis>
401e9fcaa8aSmrg, <emphasis>
402e9fcaa8aSmrgXkbFreeKeyboard</emphasis>
403e9fcaa8aSmrg frees every non-<emphasis>
404e9fcaa8aSmrgNULL</emphasis>
405e9fcaa8aSmrg component of <emphasis>
406e9fcaa8aSmrgxkb</emphasis>
407e9fcaa8aSmrg and then frees the <emphasis>
408e9fcaa8aSmrgxkb</emphasis>
409e9fcaa8aSmrg structure itself.
410e9fcaa8aSmrg</para>
411e9fcaa8aSmrg
412e9fcaa8aSmrg</sect1>
413e9fcaa8aSmrg</chapter>
414