2011-10-07 22:52:30 -06:00
|
|
|
<chapter id='Complete_Keyboard_Description'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<title>Complete Keyboard Description</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
The complete Xkb description for a keyboard device is accessed using a single
|
|
|
|
|
structure containing pointers to major Xkb components. This chapter describes
|
|
|
|
|
this single structure and provides references to other sections of this
|
|
|
|
|
document that discuss the major Xkb components in detail.
|
|
|
|
|
</para>
|
|
|
|
|
|
2011-10-07 22:52:30 -06:00
|
|
|
<sect1 id='The_XkbDescRec_Structure'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<title>The XkbDescRec Structure</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
2014-07-06 20:25:46 -07:00
|
|
|
The complete description of an Xkb keyboard is given by an
|
|
|
|
|
<emphasis>XkbDescRec</emphasis>.
|
|
|
|
|
The component structures in the
|
|
|
|
|
<emphasis>XkbDescRec</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
represent the major Xkb components outlined in Figure 1.1. <!-- xref -->
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para><programlisting>
|
|
|
|
|
typedef struct {
|
|
|
|
|
struct _XDisplay * display; /* connection to
|
|
|
|
|
X server */
|
|
|
|
|
unsigned short flags; /* private to Xkb, do
|
|
|
|
|
not modify */
|
|
|
|
|
unsigned short device_spec; /* device of
|
|
|
|
|
interest */
|
|
|
|
|
KeyCode min_key_code; /* minimum keycode for
|
|
|
|
|
device */
|
|
|
|
|
KeyCode max_key_code; /* maximum keycode for
|
|
|
|
|
device */
|
|
|
|
|
XkbControlsPtr ctrls; /* controls */
|
|
|
|
|
XkbServerMapPtr server; /* server keymap */
|
|
|
|
|
XkbClientMapPtr map; /* client keymap */
|
|
|
|
|
XkbIndicatorPtr indicators; /* indicator map
|
|
|
|
|
*/
|
|
|
|
|
XkbNamesPtr names; /* names for all
|
|
|
|
|
components */
|
|
|
|
|
XkbCompatMapPtr compat; /* compatibility map
|
|
|
|
|
*/
|
|
|
|
|
XkbGeometryPtr geom; /* physical geometry of
|
|
|
|
|
keyboard */
|
2014-07-06 20:25:46 -07:00
|
|
|
}
|
|
|
|
|
<emphasis>XkbDescRec</emphasis>,
|
|
|
|
|
*XkbDescPtr;
|
2010-11-30 10:52:07 -05:00
|
|
|
</programlisting></para>
|
|
|
|
|
|
|
|
|
|
<para>
|
2014-07-06 20:25:46 -07:00
|
|
|
The
|
|
|
|
|
<emphasis>display</emphasis>
|
|
|
|
|
field points to an X display structure. The
|
|
|
|
|
<emphasis>flags</emphasis>
|
|
|
|
|
field is private to the library: modifying
|
|
|
|
|
<emphasis>flags</emphasis>
|
|
|
|
|
may yield unpredictable results. The
|
|
|
|
|
<emphasis>device_spec</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
field specifies the device identifier of the keyboard input device, or
|
2014-07-06 20:25:46 -07:00
|
|
|
<emphasis>XkbUseCoreKeyboard</emphasis>,
|
|
|
|
|
which specifies the core keyboard device. The
|
|
|
|
|
<emphasis>min_key_code</emphasis>
|
|
|
|
|
and
|
|
|
|
|
<emphasis>max_key_code</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
fields specify the least and greatest keycode that can be returned by the
|
|
|
|
|
keyboard.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
The other fields specify structure components of the keyboard description and
|
|
|
|
|
are described in detail in other sections of this document. Table 6.1
|
|
|
|
|
identifies the subsequent sections of this document that discuss the individual
|
2014-07-06 20:25:46 -07:00
|
|
|
components of the
|
|
|
|
|
<emphasis>XkbDescRec</emphasis>.
|
2010-11-30 10:52:07 -05:00
|
|
|
</para>
|
|
|
|
|
|
2012-01-21 17:59:51 -07:00
|
|
|
<table frame='topbot'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<title>XkbDescRec Component References</title>
|
2012-01-21 17:59:51 -07:00
|
|
|
<?dbfo keep-together="always" ?>
|
|
|
|
|
<tgroup cols='2' align='left' colsep='0' rowsep='0'>
|
|
|
|
|
<colspec colname='c1' colwidth='1.0*'/>
|
|
|
|
|
<colspec colname='c2' colwidth='2.0*'/>
|
2010-11-30 10:52:07 -05:00
|
|
|
<thead>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row rowsep='1'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbDescRec Field</entry>
|
|
|
|
|
<entry>For more info</entry>
|
|
|
|
|
</row>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>ctrls</entry>
|
|
|
|
|
<entry>Chapter 10</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>server</entry>
|
|
|
|
|
<entry>Chapter 16</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>map</entry>
|
|
|
|
|
<entry>Chapter 15</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>indicators</entry>
|
|
|
|
|
<entry>Chapter 8</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>names</entry>
|
|
|
|
|
<entry>Chapter 18</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>compat</entry>
|
|
|
|
|
<entry>Chapter 17</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>geom</entry>
|
|
|
|
|
<entry>Chapter 13</entry>
|
|
|
|
|
</row>
|
|
|
|
|
</tbody>
|
|
|
|
|
</tgroup>
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Each structure component has a corresponding mask bit that is used in function
|
|
|
|
|
calls to indicate that the structure should be manipulated in some manner, such
|
|
|
|
|
as allocating it or freeing it. These masks and their relationships to the
|
2014-07-06 20:25:46 -07:00
|
|
|
fields in the
|
|
|
|
|
<emphasis>XkbDescRec</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
are shown in Table 6.2. <!-- xref -->
|
|
|
|
|
</para>
|
|
|
|
|
|
2012-01-21 17:59:51 -07:00
|
|
|
<table frame='topbot'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<title>Mask Bits for XkbDescRec</title>
|
2012-01-21 17:59:51 -07:00
|
|
|
<?dbfo keep-together="always" ?>
|
|
|
|
|
<tgroup cols='3' align='left' colsep='0' rowsep='0'>
|
|
|
|
|
<colspec colname='c1' colwidth='1.0*'/>
|
|
|
|
|
<colspec colname='c2' colwidth='1.0*'/>
|
|
|
|
|
<colspec colname='c3' colwidth='1.0*'/>
|
2010-11-30 10:52:07 -05:00
|
|
|
<thead>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row rowsep='1'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>Mask Bit</entry>
|
|
|
|
|
<entry>XkbDescRec Field</entry>
|
|
|
|
|
<entry>Value</entry>
|
|
|
|
|
</row>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbControlsMask</entry>
|
|
|
|
|
<entry>ctrls</entry>
|
|
|
|
|
<entry>(1L<<0)</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbServerMapMask</entry>
|
|
|
|
|
<entry>server</entry>
|
|
|
|
|
<entry>(1L<<1)</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbIClientMapMask</entry>
|
|
|
|
|
<entry>map</entry>
|
|
|
|
|
<entry>(1L<<2)</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbIndicatorMapMask</entry>
|
|
|
|
|
<entry>indicators</entry>
|
|
|
|
|
<entry>(1L<<3)</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbNamesMask</entry>
|
|
|
|
|
<entry>names</entry>
|
|
|
|
|
<entry>(1L<<4)</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbCompatMapMask</entry>
|
|
|
|
|
<entry>compat</entry>
|
|
|
|
|
<entry>(1L<<5)</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbGeometryMask</entry>
|
|
|
|
|
<entry>geom</entry>
|
|
|
|
|
<entry>(1L<<6)</entry>
|
|
|
|
|
</row>
|
2012-01-21 17:59:51 -07:00
|
|
|
<row>
|
2010-11-30 10:52:07 -05:00
|
|
|
<entry>XkbAllComponentsMask</entry>
|
|
|
|
|
<entry>All Fields</entry>
|
|
|
|
|
<entry>(0x7f)</entry>
|
|
|
|
|
</row>
|
|
|
|
|
</tbody>
|
|
|
|
|
</tgroup>
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
</sect1>
|
2011-10-07 22:52:30 -06:00
|
|
|
<sect1 id='Obtaining_a_Keyboard_Description_from_the_Server'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<title>Obtaining a Keyboard Description from the Server</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
To retrieve one or more components of a keyboard device description, use
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbGetKeyboard</function>
|
2014-07-06 20:25:46 -07:00
|
|
|
(see also
|
|
|
|
|
<emphasis>XkbGetKeyboardbyName</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
).
|
|
|
|
|
</para>
|
|
|
|
|
|
2014-07-06 15:57:41 -07:00
|
|
|
<indexterm significance="preferred" zone="XkbGetKeyboard"><primary><function>XkbGetKeyboard</function></primary></indexterm>
|
|
|
|
|
<funcsynopsis id="XkbGetKeyboard">
|
|
|
|
|
<funcprototype>
|
|
|
|
|
<funcdef>XkbDescPtr <function>XkbGetKeyboard</function></funcdef>
|
2014-07-06 20:25:46 -07:00
|
|
|
<!-- (
|
|
|
|
|
<emphasis>display, which, device_spec</emphasis>
|
2014-07-06 15:57:41 -07:00
|
|
|
) -->
|
|
|
|
|
|
|
|
|
|
<paramdef>Display *<parameter>display</parameter></paramdef>
|
|
|
|
|
<paramdef>unsigned int <parameter>which</parameter></paramdef>
|
|
|
|
|
<paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
|
|
|
|
|
</funcprototype>
|
|
|
|
|
</funcsynopsis>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>
|
|
|
|
|
<parameter>display</parameter>
|
|
|
|
|
</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
connection to X server
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>
|
|
|
|
|
<parameter>which</parameter>
|
|
|
|
|
</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
mask indicating components to return
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>
|
|
|
|
|
<parameter>device_spec</parameter>
|
|
|
|
|
</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
2014-07-06 20:25:46 -07:00
|
|
|
device for which to fetch description, or
|
|
|
|
|
<emphasis>XkbUseCoreKbd</emphasis>
|
2014-07-06 15:57:41 -07:00
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
2010-11-30 10:52:07 -05:00
|
|
|
|
|
|
|
|
<para>
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbGetKeyboard</function>
|
2010-11-30 10:52:07 -05:00
|
|
|
allocates and returns a pointer to a keyboard description. It queries the
|
2014-07-06 20:25:46 -07:00
|
|
|
server for those components specified in the
|
|
|
|
|
<emphasis>which</emphasis>
|
|
|
|
|
parameter for device
|
|
|
|
|
<emphasis>device_spec</emphasis>
|
|
|
|
|
and copies the results to the
|
|
|
|
|
<emphasis>XkbDescRec</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
it allocated. The remaining fields in the keyboard description are set to
|
2014-07-06 20:25:46 -07:00
|
|
|
<emphasis>NULL</emphasis>.
|
|
|
|
|
The valid masks for
|
|
|
|
|
<emphasis>which</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
are those listed in Table 6.2. <!-- xref -->
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<para>
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbGetKeyboard</function>
|
2014-07-06 20:25:46 -07:00
|
|
|
can generate
|
|
|
|
|
<emphasis>BadAlloc</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
protocol errors.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<para>
|
2014-07-06 20:25:46 -07:00
|
|
|
To free the returned keyboard description, use
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbFreeKeyboard</function>
|
2010-11-30 10:52:07 -05:00
|
|
|
(see section 6.4). <!-- xref -->
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</sect1>
|
2011-10-07 22:52:30 -06:00
|
|
|
<sect1 id='Tracking_Changes_to_the_Keyboard_Description_in_the_Server'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<title>Tracking Changes to the Keyboard Description in the Server</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
The server can generate events whenever its copy of the keyboard description
|
|
|
|
|
for a device changes. Refer to section 14.4 for detailed information on <!-- xref -->
|
|
|
|
|
tracking changes to the keyboard description.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</sect1>
|
2011-10-07 22:52:30 -06:00
|
|
|
<sect1 id='Allocating_and_Freeing_a_Keyboard_Description'>
|
2010-11-30 10:52:07 -05:00
|
|
|
<title>Allocating and Freeing a Keyboard Description</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Applications seldom need to directly allocate a keyboard description; calling
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbGetKeyboard</function>
|
2010-11-30 10:52:07 -05:00
|
|
|
usually suffices. In the event you need to create a keyboard description from
|
2014-07-06 20:25:46 -07:00
|
|
|
scratch, however, use
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbAllocKeyboard</function>
|
2014-07-06 20:25:46 -07:00
|
|
|
rather than directly calling
|
|
|
|
|
<emphasis>malloc </emphasis>
|
|
|
|
|
or
|
|
|
|
|
<emphasis>Xmalloc</emphasis>.
|
2010-11-30 10:52:07 -05:00
|
|
|
</para>
|
|
|
|
|
|
2014-07-06 15:57:41 -07:00
|
|
|
<indexterm significance="preferred" zone="XkbAllocKeyboard"><primary><function>XkbAllocKeyboard</function></primary></indexterm>
|
|
|
|
|
<funcsynopsis id="XkbAllocKeyboard">
|
|
|
|
|
<funcprototype>
|
|
|
|
|
<funcdef>XkbDescRec *<function>XkbAllocKeyboard</function></funcdef>
|
|
|
|
|
<void />
|
|
|
|
|
|
|
|
|
|
</funcprototype>
|
|
|
|
|
</funcsynopsis>
|
2010-11-30 10:52:07 -05:00
|
|
|
|
|
|
|
|
<para>
|
2014-07-06 20:25:46 -07:00
|
|
|
If
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbAllocKeyboard</function>
|
2014-07-06 20:25:46 -07:00
|
|
|
fails to allocate the keyboard description, it returns
|
|
|
|
|
<emphasis>NULL</emphasis>.
|
|
|
|
|
Otherwise, it returns a pointer to an empty keyboard description structure.
|
|
|
|
|
The
|
|
|
|
|
<emphasis>device_spec</emphasis>
|
|
|
|
|
field will have been initialized to
|
|
|
|
|
<emphasis>XkbUseCoreKbd</emphasis>.
|
|
|
|
|
You may then either fill in the structure components or use Xkb functions to
|
2010-11-30 10:52:07 -05:00
|
|
|
obtain values for the structure components from a keyboard device.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<para>
|
2014-07-06 20:25:46 -07:00
|
|
|
To destroy either an entire an
|
|
|
|
|
<emphasis>XkbDescRec</emphasis>
|
|
|
|
|
or just some of its members, use
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbFreeKeyboard</function>.
|
2010-11-30 10:52:07 -05:00
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
|
2014-07-06 15:57:41 -07:00
|
|
|
<indexterm significance="preferred" zone="XkbFreeKeyboard"><primary><function>XkbFreeKeyboard</function></primary></indexterm>
|
|
|
|
|
<funcsynopsis id="XkbFreeKeyboard">
|
|
|
|
|
<funcprototype>
|
|
|
|
|
<funcdef>void <function>XkbFreeKeyboard</function></funcdef>
|
2014-07-06 20:25:46 -07:00
|
|
|
<!--
|
|
|
|
|
<emphasis>(xkb, which, free_all</emphasis>
|
2014-07-06 15:57:41 -07:00
|
|
|
) -->
|
|
|
|
|
|
|
|
|
|
<paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
|
|
|
|
|
<paramdef>unsigned int <parameter>which</parameter></paramdef>
|
|
|
|
|
<paramdef>Bool <parameter>free_all</parameter></paramdef>
|
|
|
|
|
</funcprototype>
|
|
|
|
|
</funcsynopsis>
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>
|
|
|
|
|
<parameter>xkb</parameter>
|
|
|
|
|
</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
keyboard description with components to free
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>
|
|
|
|
|
<parameter>which</parameter>
|
|
|
|
|
</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
mask selecting components to free
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>
|
|
|
|
|
<parameter>free_all</parameter>
|
|
|
|
|
</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>
|
|
|
|
|
<emphasis>True</emphasis> => free all components and <parameter>xkb</parameter>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
2010-11-30 10:52:07 -05:00
|
|
|
|
|
|
|
|
<para>
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbFreeKeyboard</function>
|
2014-07-06 20:25:46 -07:00
|
|
|
frees the components of
|
|
|
|
|
<emphasis>xkb</emphasis>
|
|
|
|
|
specified by
|
|
|
|
|
<emphasis>which</emphasis>
|
|
|
|
|
and sets the corresponding values to
|
|
|
|
|
<emphasis>NULL</emphasis>.
|
|
|
|
|
If
|
|
|
|
|
<emphasis>free_all</emphasis>
|
|
|
|
|
is
|
|
|
|
|
<emphasis>True</emphasis>,
|
2014-07-06 20:34:51 -07:00
|
|
|
<function>XkbFreeKeyboard</function>
|
2014-07-06 20:25:46 -07:00
|
|
|
frees every non-
|
|
|
|
|
<emphasis>NULL</emphasis>
|
|
|
|
|
component of
|
|
|
|
|
<emphasis>xkb</emphasis>
|
|
|
|
|
and then frees the
|
|
|
|
|
<emphasis>xkb</emphasis>
|
2010-11-30 10:52:07 -05:00
|
|
|
structure itself.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
</sect1>
|
|
|
|
|
</chapter>
|