10f8248bfSmrg<?xml version="1.0" encoding="UTF-8" ?>
20f8248bfSmrg<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
30f8248bfSmrg	  "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
4eb411b4bSmrg<chapter id='Complete_Keyboard_Description'>
5e9fcaa8aSmrg<title>Complete Keyboard Description</title>
6e9fcaa8aSmrg
7e9fcaa8aSmrg<para>
8e9fcaa8aSmrgThe complete Xkb description for a keyboard device is accessed using a single
9e9fcaa8aSmrgstructure containing pointers to major Xkb components. This chapter describes
10e9fcaa8aSmrgthis single structure and provides references to other sections of this
11e9fcaa8aSmrgdocument that discuss the major Xkb components in detail.
12e9fcaa8aSmrg</para>
13e9fcaa8aSmrg
14eb411b4bSmrg<sect1 id='The_XkbDescRec_Structure'>
15e9fcaa8aSmrg<title>The XkbDescRec Structure</title>
16e9fcaa8aSmrg
170f8248bfSmrg<indexterm significance="preferred" zone="The_XkbDescRec_Structure">
180f8248bfSmrg<primary><structname>XkbDescRec</structname></primary></indexterm>
190f8248bfSmrg
20e9fcaa8aSmrg<para>
210f8248bfSmrgThe complete description of an Xkb keyboard is given by an
220f8248bfSmrg<structname>XkbDescRec</structname>.
230f8248bfSmrgThe component structures in the
240f8248bfSmrg<structname>XkbDescRec</structname>
250f8248bfSmrgrepresent the major Xkb components outlined in <link linkend="figure1.1">Figure 1.1</link>.
26e9fcaa8aSmrg</para>
27e9fcaa8aSmrg
28e9fcaa8aSmrg<para><programlisting>
29e9fcaa8aSmrgtypedef struct {
300f8248bfSmrg    struct _XDisplay *  display;        /* connection to X server */
310f8248bfSmrg    unsigned short      flags;          /* private to Xkb, do not modify */
320f8248bfSmrg    unsigned short      device_spec;    /* device of interest */
330f8248bfSmrg    KeyCode             min_key_code;   /* minimum keycode for device */
340f8248bfSmrg    KeyCode             max_key_code;   /* maximum keycode for device */
350f8248bfSmrg    XkbControlsPtr      ctrls;          /* controls */
360f8248bfSmrg    XkbServerMapPtr     server;         /* server keymap */
370f8248bfSmrg    XkbClientMapPtr     map;            /* client keymap */
380f8248bfSmrg    XkbIndicatorPtr     indicators;     /* indicator map */
390f8248bfSmrg    XkbNamesPtr         names;          /* names for all components */
400f8248bfSmrg    XkbCompatMapPtr     compat;         /* compatibility map */
410f8248bfSmrg    XkbGeometryPtr      geom;           /* physical geometry of keyboard */
420f8248bfSmrg} <structname>XkbDescRec</structname>, *XkbDescPtr;
43e9fcaa8aSmrg</programlisting></para>
44e9fcaa8aSmrg
45e9fcaa8aSmrg<para>
460f8248bfSmrgThe
470f8248bfSmrg<parameter>display</parameter>
480f8248bfSmrgfield points to an X display structure. The
490f8248bfSmrg<structfield>flags</structfield>
500f8248bfSmrgfield is private to the library: modifying
510f8248bfSmrg<structfield>flags</structfield>
520f8248bfSmrgmay yield unpredictable results. The
530f8248bfSmrg<parameter>device_spec</parameter>
540f8248bfSmrgfield specifies the device identifier of the keyboard input device, or
550f8248bfSmrg<symbol>XkbUseCoreKbd</symbol>,
560f8248bfSmrgwhich specifies the core keyboard device. The
570f8248bfSmrg<structfield>min_key_code</structfield>
580f8248bfSmrgand
590f8248bfSmrg<structfield>max_key_code</structfield>
600f8248bfSmrgfields specify the least and greatest keycode that can be returned by the
61e9fcaa8aSmrgkeyboard.
62e9fcaa8aSmrg</para>
63e9fcaa8aSmrg
64e9fcaa8aSmrg
65e9fcaa8aSmrg<para>
66e9fcaa8aSmrgThe other fields specify structure components of the keyboard description and
670f8248bfSmrgare described in detail in other sections of this document.
680f8248bfSmrg<link linkend="table6.1">Table 6.1</link>
69e9fcaa8aSmrgidentifies the subsequent sections of this document that discuss the individual
700f8248bfSmrgcomponents of the
710f8248bfSmrg<structname>XkbDescRec</structname>.
72e9fcaa8aSmrg</para>
73e9fcaa8aSmrg
740f8248bfSmrg<table id='table6.1' frame='topbot'>
75e9fcaa8aSmrg<title>XkbDescRec Component References</title>
76eb411b4bSmrg<?dbfo keep-together="always" ?>
77eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
78eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
79eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
80e9fcaa8aSmrg<thead>
81eb411b4bSmrg<row rowsep='1'>
82e9fcaa8aSmrg  <entry>XkbDescRec Field</entry>
83e9fcaa8aSmrg  <entry>For more info</entry>
84e9fcaa8aSmrg</row>
85e9fcaa8aSmrg</thead>
86e9fcaa8aSmrg<tbody>
87eb411b4bSmrg<row>
88e9fcaa8aSmrg    <entry>ctrls</entry>
890f8248bfSmrg    <entry><xref linkend="Keyboard_Controls" /></entry>
90e9fcaa8aSmrg</row>
91eb411b4bSmrg<row>
92e9fcaa8aSmrg    <entry>server</entry>
930f8248bfSmrg    <entry><xref linkend="Xkb_Server_Keyboard_Mapping" /></entry>
94e9fcaa8aSmrg</row>
95eb411b4bSmrg<row>
96e9fcaa8aSmrg    <entry>map</entry>
970f8248bfSmrg    <entry><xref linkend="Xkb_Client_Keyboard_Mapping" /></entry>
98e9fcaa8aSmrg</row>
99eb411b4bSmrg<row>
100e9fcaa8aSmrg    <entry>indicators</entry>
1010f8248bfSmrg    <entry><xref linkend="Indicators" /></entry>
102e9fcaa8aSmrg</row>
103eb411b4bSmrg<row>
104e9fcaa8aSmrg    <entry>names</entry>
1050f8248bfSmrg    <entry><xref linkend="Symbolic_Names" /></entry>
106e9fcaa8aSmrg</row>
107eb411b4bSmrg<row>
108e9fcaa8aSmrg    <entry>compat</entry>
1090f8248bfSmrg    <entry><xref linkend="The_Xkb_Compatibility_Map" /></entry>
110e9fcaa8aSmrg</row>
111eb411b4bSmrg<row>
112e9fcaa8aSmrg    <entry>geom</entry>
1130f8248bfSmrg    <entry><xref linkend="Keyboard_Geometry" /></entry>
114e9fcaa8aSmrg  </row>
115e9fcaa8aSmrg</tbody>
116e9fcaa8aSmrg</tgroup>
117e9fcaa8aSmrg</table>
118e9fcaa8aSmrg
119e9fcaa8aSmrg<para>
120e9fcaa8aSmrgEach structure component has a corresponding mask bit that is used in function
121e9fcaa8aSmrgcalls to indicate that the structure should be manipulated in some manner, such
122e9fcaa8aSmrgas allocating it or freeing it. These masks and their relationships to the
1230f8248bfSmrgfields in the
1240f8248bfSmrg<structname>XkbDescRec</structname>
1250f8248bfSmrgare shown in <link linkend="table6.2">Table 6.2</link>.
126e9fcaa8aSmrg</para>
127e9fcaa8aSmrg
1280f8248bfSmrg<table id='table6.2' frame='topbot'>
129e9fcaa8aSmrg<title>Mask Bits for XkbDescRec</title>
130eb411b4bSmrg<?dbfo keep-together="always" ?>
131eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
132eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
133eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
134eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/>
135e9fcaa8aSmrg<thead>
136eb411b4bSmrg<row rowsep='1'>
137e9fcaa8aSmrg  <entry>Mask Bit</entry>
138e9fcaa8aSmrg  <entry>XkbDescRec Field</entry>
139e9fcaa8aSmrg  <entry>Value</entry>
140e9fcaa8aSmrg</row>
141e9fcaa8aSmrg</thead>
142e9fcaa8aSmrg<tbody>
143eb411b4bSmrg<row>
1440f8248bfSmrg    <entry><symbol>XkbControlsMask</symbol></entry>
145e9fcaa8aSmrg    <entry>ctrls</entry>
146e9fcaa8aSmrg    <entry>(1L&lt;&lt;0)</entry>
147e9fcaa8aSmrg</row>
148eb411b4bSmrg<row>
1490f8248bfSmrg    <entry><symbol>XkbServerMapMask</symbol></entry>
150e9fcaa8aSmrg    <entry>server</entry>
151e9fcaa8aSmrg    <entry>(1L&lt;&lt;1)</entry>
152e9fcaa8aSmrg</row>
153eb411b4bSmrg<row>
154e9fcaa8aSmrg    <entry>XkbIClientMapMask</entry>
155e9fcaa8aSmrg    <entry>map</entry>
156e9fcaa8aSmrg    <entry>(1L&lt;&lt;2)</entry>
157e9fcaa8aSmrg</row>
158eb411b4bSmrg<row>
1590f8248bfSmrg    <entry><symbol>XkbIndicatorMapMask</symbol></entry>
160e9fcaa8aSmrg    <entry>indicators</entry>
161e9fcaa8aSmrg    <entry>(1L&lt;&lt;3)</entry>
162e9fcaa8aSmrg</row>
163eb411b4bSmrg<row>
1640f8248bfSmrg    <entry><symbol>XkbNamesMask</symbol></entry>
165e9fcaa8aSmrg    <entry>names</entry>
166e9fcaa8aSmrg    <entry>(1L&lt;&lt;4)</entry>
167e9fcaa8aSmrg</row>
168eb411b4bSmrg<row>
1690f8248bfSmrg    <entry><symbol>XkbCompatMapMask</symbol></entry>
170e9fcaa8aSmrg    <entry>compat</entry>
171e9fcaa8aSmrg    <entry>(1L&lt;&lt;5)</entry>
172e9fcaa8aSmrg</row>
173eb411b4bSmrg<row>
1740f8248bfSmrg    <entry><symbol>XkbGeometryMask</symbol></entry>
175e9fcaa8aSmrg    <entry>geom</entry>
176e9fcaa8aSmrg    <entry>(1L&lt;&lt;6)</entry>
177e9fcaa8aSmrg</row>
178eb411b4bSmrg<row>
1790f8248bfSmrg    <entry><symbol>XkbAllComponentsMask</symbol></entry>
180e9fcaa8aSmrg    <entry>All Fields</entry>
181e9fcaa8aSmrg    <entry>(0x7f)</entry>
182e9fcaa8aSmrg  </row>
183e9fcaa8aSmrg</tbody>
184e9fcaa8aSmrg</tgroup>
185e9fcaa8aSmrg</table>
186e9fcaa8aSmrg
187e9fcaa8aSmrg</sect1>
188eb411b4bSmrg<sect1 id='Obtaining_a_Keyboard_Description_from_the_Server'>
189e9fcaa8aSmrg<title>Obtaining a Keyboard Description from the Server</title>
190e9fcaa8aSmrg
191e9fcaa8aSmrg<para>
192e9fcaa8aSmrgTo retrieve one or more components of a keyboard device description, use
1930f8248bfSmrg<function>XkbGetKeyboard</function>
1940f8248bfSmrg(see also
1950f8248bfSmrg<link linkend="XkbGetKeyboardByName"><function>XkbGetKeyboardByName</function></link>).
1960f8248bfSmrg
197e9fcaa8aSmrg</para>
198e9fcaa8aSmrg
1990f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyboard"><primary><function>XkbGetKeyboard</function></primary></indexterm>
2000f8248bfSmrg<funcsynopsis id="XkbGetKeyboard">
2010f8248bfSmrg  <funcprototype>
2020f8248bfSmrg    <funcdef>XkbDescPtr <function>XkbGetKeyboard</function></funcdef>
2030f8248bfSmrg<!-- (
2040f8248bfSmrg<parameter>display, which, device_spec</parameter>
2050f8248bfSmrg) -->
2060f8248bfSmrg
2070f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
2080f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
2090f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
2100f8248bfSmrg  </funcprototype>
2110f8248bfSmrg</funcsynopsis>
2120f8248bfSmrg<variablelist>
2130f8248bfSmrg  <varlistentry>
2140f8248bfSmrg    <term>
2150f8248bfSmrg      <parameter>display</parameter>
2160f8248bfSmrg    </term>
2170f8248bfSmrg    <listitem>
2180f8248bfSmrg      <para>
2190f8248bfSmrg        connection to X server
2200f8248bfSmrg      </para>
2210f8248bfSmrg    </listitem>
2220f8248bfSmrg  </varlistentry>
2230f8248bfSmrg  <varlistentry>
2240f8248bfSmrg    <term>
2250f8248bfSmrg      <parameter>which</parameter>
2260f8248bfSmrg    </term>
2270f8248bfSmrg    <listitem>
2280f8248bfSmrg      <para>
2290f8248bfSmrg        mask indicating components to return
2300f8248bfSmrg      </para>
2310f8248bfSmrg    </listitem>
2320f8248bfSmrg  </varlistentry>
2330f8248bfSmrg  <varlistentry>
2340f8248bfSmrg    <term>
2350f8248bfSmrg      <parameter>device_spec</parameter>
2360f8248bfSmrg    </term>
2370f8248bfSmrg    <listitem>
2380f8248bfSmrg      <para>
2390f8248bfSmrg        device for which to fetch description, or
2400f8248bfSmrg<symbol>XkbUseCoreKbd</symbol>
2410f8248bfSmrg      </para>
2420f8248bfSmrg    </listitem>
2430f8248bfSmrg  </varlistentry>
2440f8248bfSmrg</variablelist>
245e9fcaa8aSmrg
246e9fcaa8aSmrg<para>
2470f8248bfSmrg<function>XkbGetKeyboard</function>
248e9fcaa8aSmrgallocates and returns a pointer to a keyboard description. It queries the
2490f8248bfSmrgserver for those components specified in the
2500f8248bfSmrg<parameter>which</parameter>
2510f8248bfSmrgparameter for device
2520f8248bfSmrg<parameter>device_spec</parameter>
2530f8248bfSmrgand copies the results to the
2540f8248bfSmrg<structname>XkbDescRec</structname>
2550f8248bfSmrgit allocated. The remaining fields in the keyboard description are set to
2560f8248bfSmrg<symbol>NULL</symbol>.
2570f8248bfSmrgThe valid masks for
2580f8248bfSmrg<parameter>which</parameter>
2590f8248bfSmrgare those listed in <link linkend="table6.2">Table 6.2</link>.
260e9fcaa8aSmrg</para>
261e9fcaa8aSmrg
262e9fcaa8aSmrg
263e9fcaa8aSmrg<para>
2640f8248bfSmrg<function>XkbGetKeyboard</function>
2650f8248bfSmrgcan generate
2660f8248bfSmrg<errorname>BadAlloc</errorname>
2670f8248bfSmrgprotocol errors.
268e9fcaa8aSmrg</para>
269e9fcaa8aSmrg
270e9fcaa8aSmrg
271e9fcaa8aSmrg<para>
2720f8248bfSmrgTo free the returned keyboard description, use
2730f8248bfSmrg<function>XkbFreeKeyboard</function>
2740f8248bfSmrg(see <link linkend="Allocating_and_Freeing_a_Keyboard_Description">section 6.4</link>).
275e9fcaa8aSmrg</para>
276e9fcaa8aSmrg
277e9fcaa8aSmrg
278e9fcaa8aSmrg</sect1>
279eb411b4bSmrg<sect1 id='Tracking_Changes_to_the_Keyboard_Description_in_the_Server'>
280e9fcaa8aSmrg<title>Tracking Changes to the Keyboard Description in the Server</title>
281e9fcaa8aSmrg
282e9fcaa8aSmrg<para>
283e9fcaa8aSmrgThe server can generate events whenever its copy of the keyboard description
2840f8248bfSmrgfor a device changes. Refer to <link linkend="Tracking_Changes_to_Map_Components">section 14.4</link> for detailed information on
285e9fcaa8aSmrgtracking changes to the keyboard description.
286e9fcaa8aSmrg</para>
287e9fcaa8aSmrg
288e9fcaa8aSmrg
289e9fcaa8aSmrg</sect1>
290eb411b4bSmrg<sect1 id='Allocating_and_Freeing_a_Keyboard_Description'>
291e9fcaa8aSmrg<title>Allocating and Freeing a Keyboard Description</title>
292e9fcaa8aSmrg
293e9fcaa8aSmrg<para>
294e9fcaa8aSmrgApplications seldom need to directly allocate a keyboard description; calling
2950f8248bfSmrg<function>XkbGetKeyboard</function>
2960f8248bfSmrgusually suffices. In the event you need to create a keyboard description from
2970f8248bfSmrgscratch, however, use
2980f8248bfSmrg<function>XkbAllocKeyboard</function>
2990f8248bfSmrgrather than directly calling
3000f8248bfSmrg<function>malloc</function>
3010f8248bfSmrgor
3020f8248bfSmrg<function>Xmalloc</function>.
303e9fcaa8aSmrg</para>
304e9fcaa8aSmrg
3050f8248bfSmrg<indexterm significance="preferred" zone="XkbAllocKeyboard"><primary><function>XkbAllocKeyboard</function></primary></indexterm>
3060f8248bfSmrg<funcsynopsis id="XkbAllocKeyboard">
3070f8248bfSmrg  <funcprototype>
3080f8248bfSmrg    <funcdef>XkbDescRec *<function>XkbAllocKeyboard</function></funcdef>
3090f8248bfSmrg  <void />
3100f8248bfSmrg
3110f8248bfSmrg  </funcprototype>
3120f8248bfSmrg</funcsynopsis>
313e9fcaa8aSmrg
314e9fcaa8aSmrg<para>
3150f8248bfSmrgIf
3160f8248bfSmrg<function>XkbAllocKeyboard</function>
3170f8248bfSmrgfails to allocate the keyboard description, it returns
3180f8248bfSmrg<symbol>NULL</symbol>.
3190f8248bfSmrgOtherwise, it returns a pointer to an empty keyboard description structure.
3200f8248bfSmrgThe
3210f8248bfSmrg<structfield>device_spec</structfield>
3220f8248bfSmrgfield will have been initialized to
3230f8248bfSmrg<symbol>XkbUseCoreKbd</symbol>.
3240f8248bfSmrgYou may then either fill in the structure components or use Xkb functions to
325e9fcaa8aSmrgobtain values for the structure components from a keyboard device.
326e9fcaa8aSmrg</para>
327e9fcaa8aSmrg
328e9fcaa8aSmrg
329e9fcaa8aSmrg<para>
3300f8248bfSmrgTo destroy either an entire an
3310f8248bfSmrg<structname>XkbDescRec</structname>
3320f8248bfSmrgor just some of its members, use
3330f8248bfSmrg<function>XkbFreeKeyboard</function>.
334e9fcaa8aSmrg</para>
335e9fcaa8aSmrg
336e9fcaa8aSmrg
3370f8248bfSmrg<indexterm significance="preferred" zone="XkbFreeKeyboard"><primary><function>XkbFreeKeyboard</function></primary></indexterm>
3380f8248bfSmrg<funcsynopsis id="XkbFreeKeyboard">
3390f8248bfSmrg  <funcprototype>
3400f8248bfSmrg    <funcdef>void <function>XkbFreeKeyboard</function></funcdef>
3410f8248bfSmrg<!--
3420f8248bfSmrg<parameter>(xkb, which, free_all</parameter>
3430f8248bfSmrg) -->
3440f8248bfSmrg
3450f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
3460f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
3470f8248bfSmrg    <paramdef>Bool <parameter>free_all</parameter></paramdef>
3480f8248bfSmrg  </funcprototype>
3490f8248bfSmrg</funcsynopsis>
3500f8248bfSmrg<variablelist>
3510f8248bfSmrg  <varlistentry>
3520f8248bfSmrg    <term>
3530f8248bfSmrg      <parameter>xkb</parameter>
3540f8248bfSmrg    </term>
3550f8248bfSmrg    <listitem>
3560f8248bfSmrg      <para>
3570f8248bfSmrg        keyboard description with components to free
3580f8248bfSmrg      </para>
3590f8248bfSmrg    </listitem>
3600f8248bfSmrg  </varlistentry>
3610f8248bfSmrg  <varlistentry>
3620f8248bfSmrg    <term>
3630f8248bfSmrg      <parameter>which</parameter>
3640f8248bfSmrg    </term>
3650f8248bfSmrg    <listitem>
3660f8248bfSmrg      <para>
3670f8248bfSmrg        mask selecting components to free
3680f8248bfSmrg      </para>
3690f8248bfSmrg    </listitem>
3700f8248bfSmrg  </varlistentry>
3710f8248bfSmrg  <varlistentry>
3720f8248bfSmrg    <term>
3730f8248bfSmrg      <parameter>free_all</parameter>
3740f8248bfSmrg    </term>
3750f8248bfSmrg    <listitem>
3760f8248bfSmrg      <para>
3770f8248bfSmrg        <symbol>True</symbol> &rArr; free all components and <parameter>xkb</parameter>
3780f8248bfSmrg      </para>
3790f8248bfSmrg    </listitem>
3800f8248bfSmrg  </varlistentry>
3810f8248bfSmrg</variablelist>
382e9fcaa8aSmrg
383e9fcaa8aSmrg<para>
3840f8248bfSmrg<function>XkbFreeKeyboard</function>
3850f8248bfSmrgfrees the components of
3860f8248bfSmrg<parameter>xkb</parameter>
3870f8248bfSmrgspecified by
3880f8248bfSmrg<parameter>which</parameter>
3890f8248bfSmrgand sets the corresponding values to
3900f8248bfSmrg<symbol>NULL</symbol>.
3910f8248bfSmrgIf
3920f8248bfSmrg<parameter>free_all</parameter>
3930f8248bfSmrgis
3940f8248bfSmrg<symbol>True</symbol>,
3950f8248bfSmrg<function>XkbFreeKeyboard</function>
3960f8248bfSmrgfrees every non-
3970f8248bfSmrg<symbol>NULL</symbol>
3980f8248bfSmrgcomponent of
3990f8248bfSmrg<parameter>xkb</parameter>
4000f8248bfSmrgand then frees the
4010f8248bfSmrg<parameter>xkb</parameter>
4020f8248bfSmrgstructure itself.
403e9fcaa8aSmrg</para>
404e9fcaa8aSmrg
405e9fcaa8aSmrg</sect1>
406e9fcaa8aSmrg</chapter>
407