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='Server_Database_of_Keyboard_Components'>
5e9fcaa8aSmrg<title>Server Database of Keyboard Components</title>
6e9fcaa8aSmrg
7e9fcaa8aSmrg<para>
8e9fcaa8aSmrgThe X server maintains a database of keyboard components, identified by
9e9fcaa8aSmrgcomponent type. The database contains all the information necessary to build a
10e9fcaa8aSmrgcomplete keyboard description for a particular device, as well as to assemble
110f8248bfSmrgpartial descriptions. <link linkend="table20.1">Table 20.1</link>
120f8248bfSmrgidentifies the component types and the type of information they contain.
13e9fcaa8aSmrg</para>
14e9fcaa8aSmrg
150f8248bfSmrg<table id='table20.1' frame='topbot'>
16e9fcaa8aSmrg<title>Server Database Keyboard Components</title>
17eb411b4bSmrg<?dbfo keep-together="always" ?>
18eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
19eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
20eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
21eb411b4bSmrg<colspec colname='c3' colwidth='1.5*'/>
22e9fcaa8aSmrg<thead>
23eb411b4bSmrg<row rowsep='1'>
24e9fcaa8aSmrg  <entry>Component Type</entry>
25e9fcaa8aSmrg  <entry>Component Primary Contents</entry>
26e9fcaa8aSmrg  <entry>May also contain</entry>
27e9fcaa8aSmrg  </row>
28e9fcaa8aSmrg</thead>
29e9fcaa8aSmrg<tbody>
30eb411b4bSmrg  <row>
31e9fcaa8aSmrg    <entry>Keymap</entry>
32e9fcaa8aSmrg    <entry>
33e9fcaa8aSmrg<para>Complete keyboard description</para>
34e9fcaa8aSmrg<para>Normally assembled using a complete component from each of the other types</para>
35e9fcaa8aSmrg    </entry>
36e9fcaa8aSmrg    <entry></entry>
37e9fcaa8aSmrg  </row>
38eb411b4bSmrg  <row>
39e9fcaa8aSmrg    <entry>Keycodes</entry>
40e9fcaa8aSmrg    <entry>
41e9fcaa8aSmrg<para>Symbolic name for each key</para>
42e9fcaa8aSmrg<para>Minimum and maximum legal keycodes</para>
43e9fcaa8aSmrg    </entry>
44e9fcaa8aSmrg    <entry>
45e9fcaa8aSmrg<para>Aliases for some keys</para>
46e9fcaa8aSmrg<para>Symbolic names for indicators</para>
47e9fcaa8aSmrg<para>Description of indicators physically present</para>
48e9fcaa8aSmrg    </entry>
49e9fcaa8aSmrg  </row>
50eb411b4bSmrg  <row>
51e9fcaa8aSmrg    <entry>Types</entry>
52e9fcaa8aSmrg    <entry>Key types</entry>
53e9fcaa8aSmrg    <entry>
54e9fcaa8aSmrgReal modifier bindings and symbolic names for some virtual modifiers
55e9fcaa8aSmrg    </entry>
56e9fcaa8aSmrg  </row>
57eb411b4bSmrg  <row>
58e9fcaa8aSmrg    <entry>Compatibility</entry>
59e9fcaa8aSmrg    <entry>Rules used to assign actions to keysyms</entry>
60e9fcaa8aSmrg    <entry>
61e9fcaa8aSmrg<para>Maps for some indicators</para>
62e9fcaa8aSmrg<para>Real modifier bindings and symbolic names for some virtual modifiers</para>
63e9fcaa8aSmrg    </entry>
64e9fcaa8aSmrg  </row>
65eb411b4bSmrg  <row>
66e9fcaa8aSmrg    <entry>Symbols</entry>
67e9fcaa8aSmrg    <entry>
68e9fcaa8aSmrg<para>Symbol mapping for keyboard keys</para>
69e9fcaa8aSmrg<para>Modifier mapping</para>
70e9fcaa8aSmrg<para>Symbolic names for groups</para>
71e9fcaa8aSmrg    </entry>
72e9fcaa8aSmrg    <entry>
73e9fcaa8aSmrg<para>Explicit actions and behaviors for some keys</para>
74e9fcaa8aSmrg<para>Real modifier bindings and symbolic names for some virtual modifiers</para>
75e9fcaa8aSmrg    </entry>
76e9fcaa8aSmrg  </row>
77eb411b4bSmrg  <row>
78e9fcaa8aSmrg    <entry>Geometry</entry>
79e9fcaa8aSmrg    <entry>Layout of the keyboard</entry>
80e9fcaa8aSmrg    <entry>
81e9fcaa8aSmrg<para>Aliases for some keys; overrides keycodes component aliases</para>
82e9fcaa8aSmrg<para>Symbolic names for some indicators</para>
83e9fcaa8aSmrg<para>Description of indicators physically present</para>
84e9fcaa8aSmrg    </entry>
85e9fcaa8aSmrg  </row>
86e9fcaa8aSmrg</tbody>
87e9fcaa8aSmrg</tgroup>
88e9fcaa8aSmrg</table>
89e9fcaa8aSmrg
90e9fcaa8aSmrg<para>
91e9fcaa8aSmrgWhile a keymap is a database entry for a complete keyboard description, and
92e9fcaa8aSmrgtherefore logically different from the individual component database entries,
93e9fcaa8aSmrgthe rules for processing keymap entries are identical to those for the
94e9fcaa8aSmrgindividual components. In the discussion that follows, the term component is
95e9fcaa8aSmrgused to refer to either individual components or a keymap.
96e9fcaa8aSmrg</para>
97e9fcaa8aSmrg
98e9fcaa8aSmrg<para>
99e9fcaa8aSmrgThere may be multiple entries for each of the component types. An entry may be
1000f8248bfSmrgeither
1010f8248bfSmrg<emphasis>complete</emphasis>
1020f8248bfSmrgor
1030f8248bfSmrg<emphasis>partial</emphasis>.
1040f8248bfSmrgPartial entries describe only a piece of the corresponding keyboard component
105e9fcaa8aSmrgand are designed to be combined with other entries of the same type to form a
106e9fcaa8aSmrgcomplete entry.
107e9fcaa8aSmrg</para>
108e9fcaa8aSmrg
109e9fcaa8aSmrg<para>
110e9fcaa8aSmrgFor example, a partial symbols map might describe the differences between a
111e9fcaa8aSmrgcommon ASCII keyboard and some national layout. Such a partial map is not
112e9fcaa8aSmrguseful on its own because it does not include those symbols that are the same
113e9fcaa8aSmrgon both the ASCII and national layouts (such as function keys). On the other
1140f8248bfSmrghand, this partial map can be used to configure
1150f8248bfSmrg<emphasis>any</emphasis>
1160f8248bfSmrgASCII keyboard to use a national layout.
117e9fcaa8aSmrg</para>
118e9fcaa8aSmrg
119e9fcaa8aSmrg<para>
120e9fcaa8aSmrgWhen a keyboard description is built, the components are processed in the order
1210f8248bfSmrgin which they appear in <link linkend="table20.1">Table 20.1</link>;
1220f8248bfSmrglater definitions override earlier ones.
123e9fcaa8aSmrg</para>
124e9fcaa8aSmrg
125eb411b4bSmrg<sect1 id='Component_Names'>
126e9fcaa8aSmrg<title>Component Names</title>
127e9fcaa8aSmrg
128e9fcaa8aSmrg<para>
1290f8248bfSmrgComponent names have the form “<replaceable>class(member)</replaceable>” where
1300f8248bfSmrg<replaceable>class</replaceable>
1310f8248bfSmrgdescribes a subset of the available components for a particular type and the
1320f8248bfSmrgoptional
1330f8248bfSmrg<replaceable>member</replaceable>
1340f8248bfSmrgidentifies a specific component from that subset. For example, the name
135e9fcaa8aSmrg"atlantis(acme)" for a symbols component might specify the symbols used for the
136e9fcaa8aSmrgatlantis national keyboard layout by the vendor "acme." Each class has an
1370f8248bfSmrgoptional
1380f8248bfSmrg<emphasis>default</emphasis>
1390f8248bfSmrgmember — references that specify a class but not a member refer to the
140e9fcaa8aSmrgdefault member of the class, if one exists. Xkb places no constraints on the
141e9fcaa8aSmrginterpretation of the class and member names used in component names.
142e9fcaa8aSmrg</para>
143e9fcaa8aSmrg
144e9fcaa8aSmrg<para>
1450f8248bfSmrgThe
1460f8248bfSmrg<replaceable>class</replaceable>
1470f8248bfSmrgand
1480f8248bfSmrg<replaceable>member</replaceable>
1490f8248bfSmrgnames are both specified using characters from the Latin-1 character set. Xkb
150e9fcaa8aSmrgimplementations must accept all alphanumeric characters, minus (‘-’) and
151e9fcaa8aSmrgunderscore (‘_’) in class or member names, and must not accept parentheses,
152e9fcaa8aSmrgplus, vertical bar, percent sign, asterisk, question mark, or white space. The
153e9fcaa8aSmrguse of other characters is implementation-dependent.
154e9fcaa8aSmrg</para>
155e9fcaa8aSmrg
156e9fcaa8aSmrg</sect1>
157eb411b4bSmrg<sect1 id='Listing_the_Known_Keyboard_Components'>
158e9fcaa8aSmrg<title>Listing the Known Keyboard Components</title>
159e9fcaa8aSmrg
160e9fcaa8aSmrg<para>
161e9fcaa8aSmrgYou may ask the server for a list of components for one or more component
162e9fcaa8aSmrgtypes. The request takes the form of a set of patterns, one pattern for each of
163e9fcaa8aSmrgthe component types, including a pattern for the complete keyboard description.
1640f8248bfSmrgTo obtain this list, use
1650f8248bfSmrg<function>XkbListComponents</function>.
166e9fcaa8aSmrg</para>
167e9fcaa8aSmrg
1680f8248bfSmrg<indexterm significance="preferred" zone="XkbListComponents"><primary><function>XkbListComponents</function></primary></indexterm>
1690f8248bfSmrg<funcsynopsis id="XkbListComponents">
1700f8248bfSmrg  <funcprototype>
1710f8248bfSmrg    <funcdef>XkbComponentListPtr <function>XkbListComponents</function></funcdef>
1720f8248bfSmrg<!-- (
1730f8248bfSmrg<parameter>dpy</parameter>,
1740f8248bfSmrg<parameter>device_spec</parameter>,
1750f8248bfSmrg<parameter>ptrns</parameter>,
1760f8248bfSmrg<parameter>max_inout</parameter>
1770f8248bfSmrg) -->
1780f8248bfSmrg
1790f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
1800f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
1810f8248bfSmrg    <paramdef>XkbComponentNamesPtr <parameter>ptrns</parameter></paramdef>
1820f8248bfSmrg    <paramdef>int *<parameter>max_inout</parameter></paramdef>
1830f8248bfSmrg  </funcprototype>
1840f8248bfSmrg</funcsynopsis>
1850f8248bfSmrg<variablelist>
1860f8248bfSmrg  <varlistentry>
1870f8248bfSmrg    <term>
1880f8248bfSmrg      <parameter>dpy</parameter>
1890f8248bfSmrg    </term>
1900f8248bfSmrg    <listitem>
1910f8248bfSmrg      <para>
1920f8248bfSmrg        connection to X server
1930f8248bfSmrg      </para>
1940f8248bfSmrg    </listitem>
1950f8248bfSmrg  </varlistentry>
1960f8248bfSmrg  <varlistentry>
1970f8248bfSmrg    <term>
1980f8248bfSmrg      <parameter>device_spec</parameter>
1990f8248bfSmrg    </term>
2000f8248bfSmrg    <listitem>
2010f8248bfSmrg      <para>
2020f8248bfSmrg        device ID, or <symbol>XkbUseCoreKbd</symbol>
2030f8248bfSmrg      </para>
2040f8248bfSmrg    </listitem>
2050f8248bfSmrg  </varlistentry>
2060f8248bfSmrg  <varlistentry>
2070f8248bfSmrg    <term>
2080f8248bfSmrg      <parameter>ptrns</parameter>
2090f8248bfSmrg    </term>
2100f8248bfSmrg    <listitem>
2110f8248bfSmrg      <para>
2120f8248bfSmrg        namelist for components of interest
2130f8248bfSmrg      </para>
2140f8248bfSmrg    </listitem>
2150f8248bfSmrg  </varlistentry>
2160f8248bfSmrg  <varlistentry>
2170f8248bfSmrg    <term>
2180f8248bfSmrg      <parameter>max_inout</parameter>
2190f8248bfSmrg    </term>
2200f8248bfSmrg    <listitem>
2210f8248bfSmrg      <para>
2220f8248bfSmrg        max # returned names, # left over
2230f8248bfSmrg      </para>
2240f8248bfSmrg    </listitem>
2250f8248bfSmrg  </varlistentry>
2260f8248bfSmrg</variablelist>
227e9fcaa8aSmrg
228e9fcaa8aSmrg<para>
2290f8248bfSmrg<function>XkbListComponents</function>
2300f8248bfSmrgqueries the server for a list of component names matching the patterns
2310f8248bfSmrgspecified in
2320f8248bfSmrg<parameter>ptrns</parameter>.
2330f8248bfSmrgIt waits for a reply and returns the matching component names in an
2340f8248bfSmrg<structname>XkbComponentListRec</structname>
2350f8248bfSmrgstructure. When you are done using the structure, you should free it using
2360f8248bfSmrg<function>XkbFreeComponentList</function>.
2370f8248bfSmrg<parameter>device_spec</parameter>
2380f8248bfSmrgindicates a particular device in which the caller is interested. A server is
239e9fcaa8aSmrgallowed (but not required) to restrict its reply to portions of the database
240e9fcaa8aSmrgthat are relevant for that particular device.
241e9fcaa8aSmrg</para>
242e9fcaa8aSmrg
243e9fcaa8aSmrg
244e9fcaa8aSmrg<para>
2450f8248bfSmrg<parameter>ptrns</parameter>
2460f8248bfSmrgis a pointer to an
2470f8248bfSmrg<structname>XkbComponentNamesRec</structname>,
2480f8248bfSmrgdescribed below. Each of the fields in
2490f8248bfSmrg<parameter>ptrns</parameter>
2500f8248bfSmrgcontains a pattern naming the components of interest. Each of the patterns is
2510f8248bfSmrgcomposed of characters from the ISO
2520f8248bfSmrg<emphasis>Latin1</emphasis>
2530f8248bfSmrgencoding, but can contain only parentheses, the wildcard characters
2540f8248bfSmrg‘<literal>?</literal>’ and ‘<literal>*</literal>’,
2550f8248bfSmrgand characters permitted in a component class or member name
2560f8248bfSmrg(see <link linkend="Component_Names">section 20.1</link>). A pattern may be
2570f8248bfSmrg<symbol>NULL</symbol>,
2580f8248bfSmrgin which case no components for that type is returned. Pattern matches with
2590f8248bfSmrgcomponent names are case sensitive. The
2600f8248bfSmrg‘<literal>?</literal>’
2610f8248bfSmrgwildcard matches any single character, except a left or right parenthesis;
2620f8248bfSmrgthe ‘<literal>*</literal>’
2630f8248bfSmrgwildcard matches any number of characters, except a left or right
264e9fcaa8aSmrgparenthesis. If an implementation allows additional characters in a component
265e9fcaa8aSmrgclass or member name other than those required by the Xkb extension (see
2660f8248bfSmrg<link linkend="Component_Names">section 20.1</link>), the result of comparing one of the additional characters to
267e9fcaa8aSmrgeither of the wildcard characters is implementation-dependent.
268e9fcaa8aSmrg</para>
269e9fcaa8aSmrg
270e9fcaa8aSmrg
271e9fcaa8aSmrg<para>
272e9fcaa8aSmrgIf a pattern contains illegal characters, the illegal characters are ignored.
273e9fcaa8aSmrgThe matching process is carried out as if the illegal characters were omitted
274e9fcaa8aSmrgfrom the pattern.
275e9fcaa8aSmrg</para>
276e9fcaa8aSmrg
277e9fcaa8aSmrg
278e9fcaa8aSmrg<para>
2790f8248bfSmrg<parameter>max_inout</parameter>
2800f8248bfSmrgis used to throttle the amount of data passed to and from the server. On
281e9fcaa8aSmrginput, it specifies the maximum number of names to be returned (the total
2820f8248bfSmrgnumber of names in all component categories). Upon return from
2830f8248bfSmrg<function>XkbListComponents</function>,
2840f8248bfSmrg<parameter>max_inout</parameter>
2850f8248bfSmrgcontains the number of names that matched the request but were not returned
286e9fcaa8aSmrgbecause of the limit.
287e9fcaa8aSmrg</para>
288e9fcaa8aSmrg
289e9fcaa8aSmrg
2900f8248bfSmrg<para id='XkbComponentNamesRec'>
2910f8248bfSmrg<indexterm significance="preferred" zone="XkbComponentNamesRec">
2920f8248bfSmrg<primary><structname>XkbComponentNamesRec</structname></primary></indexterm>
293e9fcaa8aSmrgThe component name patterns used to describe the request are passed to
2940f8248bfSmrg<function>XkbListComponents</function>
2950f8248bfSmrgusing an
2960f8248bfSmrg<structname>XkbComponentNamesRec</structname>
2970f8248bfSmrgstructure. This structure has no special allocation constraints or
298e9fcaa8aSmrginterrelationships with other structures; allocate and free this structure
2990f8248bfSmrgusing standard
3000f8248bfSmrg<function>malloc</function>
3010f8248bfSmrgand
3020f8248bfSmrg<function>free</function>
3030f8248bfSmrgcalls or their equivalent:
304e9fcaa8aSmrg
3050f8248bfSmrg<programlisting>
306e9fcaa8aSmrgtypedef struct _XkbComponentNames {
3070f8248bfSmrg    char *       keymap;    /* keymap names */
3080f8248bfSmrg    char *       keycodes;  /* keycode names */
3090f8248bfSmrg    char *       types;     /* type names */
3100f8248bfSmrg    char *       compat;    /* compatibility map names */
3110f8248bfSmrg    char *       symbols;   /* symbol names */
3120f8248bfSmrg    char *       geometry;  /* geometry names */
3130f8248bfSmrg} <structname>XkbComponentNamesRec</structname>, *XkbComponentNamesPtr;
314e9fcaa8aSmrg</programlisting></para>
315e9fcaa8aSmrg
3160f8248bfSmrg<para id='XkbComponentListRec'>
3170f8248bfSmrg<indexterm significance="preferred" zone="XkbComponentListRec">
3180f8248bfSmrg<primary><structname>XkbComponentListRec</structname></primary></indexterm>
3190f8248bfSmrg<indexterm significance="preferred" zone="XkbComponentListRec">
3200f8248bfSmrg<primary><structname>XkbComponentNameRec</structname></primary></indexterm>
3210f8248bfSmrg<function>XkbListComponents</function>
3220f8248bfSmrgreturns a pointer to an
3230f8248bfSmrg<structname>XkbComponentListRec</structname>:
324e9fcaa8aSmrg
3250f8248bfSmrg<programlisting>
326e9fcaa8aSmrgtypedef struct _XkbComponentList {
3270f8248bfSmrg    int                  num_keymaps;     /* number of entries in keymap */
3280f8248bfSmrg    int                  num_keycodes;    /* number of entries in keycodes */
3290f8248bfSmrg    int                  num_types;       /* number of entries in types */
3300f8248bfSmrg    int                  num_compat;      /* number of entries in compat */
3310f8248bfSmrg    int                  num_symbols;     /* number of entries in symbols */
3320f8248bfSmrg    int                  num_geometry;    /* number of entries in geometry;
3330f8248bfSmrg    XkbComponentNamePtr  keymap;          /* keymap names */
3340f8248bfSmrg    XkbComponentNamePtr  keycodes;        /* keycode names */
3350f8248bfSmrg    XkbComponentNamePtr  types;           /* type names */
3360f8248bfSmrg    XkbComponentNamePtr  compat;          /* compatibility map names */
3370f8248bfSmrg    XkbComponentNamePtr  symbols;         /* symbol names */
3380f8248bfSmrg    XkbComponentNamePtr  geometry;        /* geometry names */
3390f8248bfSmrg} <structname>XkbComponentListRec</structname>, *XkbComponentListPtr;
340e9fcaa8aSmrg
341e9fcaa8aSmrgtypedef struct _XkbComponentName {
3420f8248bfSmrg    unsigned short       flags;           /* hints regarding component name */
3430f8248bfSmrg    char *               name;            /* name of component */
3440f8248bfSmrg} <structname>XkbComponentNameRec</structname>, *XkbComponentNamePtr;
345e9fcaa8aSmrg</programlisting></para>
346e9fcaa8aSmrg
347e9fcaa8aSmrg<para>
3480f8248bfSmrgNote that the structure used to specify patterns on input is an
3490f8248bfSmrg<structname>XkbComponentNamesRec</structname>,
3500f8248bfSmrgand that used to hold the individual component names upon return is an
3510f8248bfSmrg<structname>XkbComponentNameRec</structname>
3520f8248bfSmrg(no trailing ‘s’ in Name).
353e9fcaa8aSmrg</para>
354e9fcaa8aSmrg
355e9fcaa8aSmrg
356e9fcaa8aSmrg<para>
3570f8248bfSmrgWhen you are done using the structure returned by
3580f8248bfSmrg<function>XkbListComponents</function>,
3590f8248bfSmrgfree it using
3600f8248bfSmrg<function>XkbFreeComponentList</function>.
361e9fcaa8aSmrg</para>
362e9fcaa8aSmrg
363e9fcaa8aSmrg
3640f8248bfSmrg<indexterm significance="preferred" zone="XkbFreeComponentList"><primary><function>XkbFreeComponentList</function></primary></indexterm>
3650f8248bfSmrg<funcsynopsis id="XkbFreeComponentList">
3660f8248bfSmrg  <funcprototype>
3670f8248bfSmrg    <funcdef>void <function>XkbFreeComponentList</function></funcdef>
3680f8248bfSmrg<!-- (list) -->
3690f8248bfSmrg
3700f8248bfSmrg    <paramdef>XkbComponentListPtr <parameter>list</parameter></paramdef>
3710f8248bfSmrg  </funcprototype>
3720f8248bfSmrg</funcsynopsis>
3730f8248bfSmrg<variablelist>
3740f8248bfSmrg  <varlistentry>
3750f8248bfSmrg    <term>
3760f8248bfSmrg      <parameter>list</parameter>
3770f8248bfSmrg    </term>
3780f8248bfSmrg    <listitem>
3790f8248bfSmrg      <para>
3800f8248bfSmrg        pointer to <structname>XkbComponentListRec</structname> to free
3810f8248bfSmrg      </para>
3820f8248bfSmrg    </listitem>
3830f8248bfSmrg  </varlistentry>
3840f8248bfSmrg</variablelist>
385e9fcaa8aSmrg
386e9fcaa8aSmrg
387e9fcaa8aSmrg</sect1>
388eb411b4bSmrg<sect1 id='Component_Hints'>
389e9fcaa8aSmrg<title>Component Hints</title>
390e9fcaa8aSmrg
391e9fcaa8aSmrg<para>
392e9fcaa8aSmrgA set of flags is associated with each component; these flags provide
393e9fcaa8aSmrgadditional hints about the component’s use. These hints are designated by bit
3940f8248bfSmrgmasks in the flags field of the
3950f8248bfSmrg<structname>XkbComponentNameRec</structname>
3960f8248bfSmrgstructures contained in the
3970f8248bfSmrg<structname>XkbComponentListRec</structname>
3980f8248bfSmrgreturned from
3990f8248bfSmrg<function>XkbListComponents</function>.
4000f8248bfSmrgThe least significant byte of the flags field has the same meaning for all
401e9fcaa8aSmrgtypes of keyboard components; the interpretation of the most significant byte
4020f8248bfSmrgis dependent on the type of component. The flags bits are defined in
4030f8248bfSmrg<link linkend="table20.2">Table 20.2</link>.
4040f8248bfSmrgThe symbols hints in <link linkend="table20.2">Table 20.2</link>
4050f8248bfSmrgapply only to partial symbols components
4060f8248bfSmrg(those with
4070f8248bfSmrg<symbol>XkbLC_Partial</symbol>
4080f8248bfSmrgalso set); full symbols components are assumed to specify all of the pieces.
409e9fcaa8aSmrg</para>
410e9fcaa8aSmrg
411e9fcaa8aSmrg
412e9fcaa8aSmrg<para>
413e9fcaa8aSmrgThe alphanumeric, modifier, keypad or function keys symbols hints should
414e9fcaa8aSmrgdescribe the primary intent of the component designer and should not be simply
415e9fcaa8aSmrgan exhaustive list of the kinds of keys that are affected. For example,
416e9fcaa8aSmrgnational keyboard layouts affect primarily alphanumeric keys, but many affect a
4170f8248bfSmrgfew modifier keys as well; such mappings should set only the
4180f8248bfSmrg<symbol>XkbLC_AlphanumericKeys</symbol>
4190f8248bfSmrghint. In general, symbols components should set only one of the four flags
4200f8248bfSmrg(
4210f8248bfSmrg<symbol>XkbLC_AlternateGroup</symbol>
4220f8248bfSmrgmay be combined with any of the other flags).
423e9fcaa8aSmrg</para>
424e9fcaa8aSmrg
4250f8248bfSmrg<table id='table20.2' frame='topbot'>
426e9fcaa8aSmrg<title>XkbComponentNameRec Flags Bits</title>
427eb411b4bSmrg<?dbfo keep-together="always" ?>
428eb411b4bSmrg<tgroup cols='4' align='left' colsep='0' rowsep='0'>
429eb411b4bSmrg<colspec colname='c1' colwidth='1.5*'/>
430eb411b4bSmrg<colspec colname='c2' colwidth='3.0*'/>
431eb411b4bSmrg<colspec colname='c3' colwidth='2.0*'/>
432eb411b4bSmrg<colspec colname='c4' colwidth='1.0*'/>
433e9fcaa8aSmrg<thead>
434eb411b4bSmrg<row rowsep='1'>
435e9fcaa8aSmrg  <entry>Component Type</entry>
436e9fcaa8aSmrg  <entry>Component Hints (flags)</entry>
437e9fcaa8aSmrg  <entry>Meaning</entry>
438e9fcaa8aSmrg  <entry>Value</entry>
439e9fcaa8aSmrg</row>
440e9fcaa8aSmrg</thead>
441e9fcaa8aSmrg<tbody>
442eb411b4bSmrg<row>
443e9fcaa8aSmrg    <entry>All Components</entry>
4440f8248bfSmrg    <entry><para><symbol>XkbLC_Hidden</symbol></para></entry>
445e9fcaa8aSmrg    <entry>Do not present to user</entry>
446e9fcaa8aSmrg    <entry>(1L&lt;&lt;0)</entry>
447e9fcaa8aSmrg</row>
448eb411b4bSmrg<row>
449e9fcaa8aSmrg    <entry></entry>
4500f8248bfSmrg    <entry><symbol>XkbLC_Default</symbol></entry>
451e9fcaa8aSmrg    <entry>Default member of class</entry>
452e9fcaa8aSmrg    <entry>(1L&lt;&lt;1)</entry>
453e9fcaa8aSmrg</row>
454eb411b4bSmrg<row>
455e9fcaa8aSmrg    <entry></entry>
4560f8248bfSmrg    <entry><symbol>XkbLC_Partial</symbol></entry>
457e9fcaa8aSmrg    <entry>Partial component</entry>
458e9fcaa8aSmrg    <entry>(1L&lt;&lt;2)</entry>
459e9fcaa8aSmrg</row>
460eb411b4bSmrg<row>
461e9fcaa8aSmrg    <entry>Keymap</entry>
462e9fcaa8aSmrg    <entry>none</entry>
463e9fcaa8aSmrg    <entry></entry>
464e9fcaa8aSmrg    <entry></entry>
465e9fcaa8aSmrg</row>
466eb411b4bSmrg<row>
467e9fcaa8aSmrg    <entry>Keycodes</entry>
468e9fcaa8aSmrg    <entry>none</entry>
469e9fcaa8aSmrg    <entry></entry>
470e9fcaa8aSmrg    <entry></entry>
471e9fcaa8aSmrg</row>
472eb411b4bSmrg<row>
473e9fcaa8aSmrg    <entry>Types</entry>
474e9fcaa8aSmrg    <entry>none</entry>
475e9fcaa8aSmrg    <entry></entry>
476e9fcaa8aSmrg    <entry></entry>
477e9fcaa8aSmrg</row>
478eb411b4bSmrg<row>
479e9fcaa8aSmrg    <entry>Compatibility</entry>
480e9fcaa8aSmrg    <entry>none</entry>
481e9fcaa8aSmrg    <entry></entry>
482e9fcaa8aSmrg    <entry></entry>
483e9fcaa8aSmrg</row>
484eb411b4bSmrg<row>
485e9fcaa8aSmrg    <entry>Symbols</entry>
4860f8248bfSmrg    <entry><symbol>XkbLC_AlphanumericKeys</symbol></entry>
487e9fcaa8aSmrg    <entry>Bindings primarily for alphanumeric keyboard section</entry>
488e9fcaa8aSmrg    <entry>(1L&lt;&lt;8)</entry>
489e9fcaa8aSmrg</row>
490eb411b4bSmrg<row>
491e9fcaa8aSmrg    <entry></entry>
4920f8248bfSmrg    <entry><symbol>XkbLC_ModifierKeys</symbol></entry>
493e9fcaa8aSmrg    <entry>Bindings primarily for modifier keys</entry>
494e9fcaa8aSmrg    <entry>(1L&lt;&lt;9)</entry>
495e9fcaa8aSmrg</row>
496eb411b4bSmrg<row>
497e9fcaa8aSmrg    <entry></entry>
4980f8248bfSmrg    <entry><symbol>XkbLC_KeypadKeys</symbol></entry>
499e9fcaa8aSmrg    <entry>Bindings primarily for numeric keypad keys</entry>
500e9fcaa8aSmrg    <entry>(1L&lt;&lt;10)</entry>
501e9fcaa8aSmrg</row>
502eb411b4bSmrg<row>
503e9fcaa8aSmrg    <entry></entry>
5040f8248bfSmrg    <entry><symbol>XkbLC_FunctionKeys</symbol></entry>
505e9fcaa8aSmrg    <entry>Bindings primarily for function keys</entry>
506e9fcaa8aSmrg    <entry>(1L&lt;&lt;11)</entry>
507e9fcaa8aSmrg</row>
508eb411b4bSmrg<row>
509e9fcaa8aSmrg    <entry></entry>
5100f8248bfSmrg    <entry><symbol>XkbLC_AlternateGroup</symbol></entry>
511e9fcaa8aSmrg    <entry>Bindings for an alternate group</entry>
512e9fcaa8aSmrg    <entry>(1L&lt;&lt;12)</entry>
513e9fcaa8aSmrg</row>
514eb411b4bSmrg<row>
515e9fcaa8aSmrg    <entry>Geometry</entry>
516e9fcaa8aSmrg    <entry>none</entry>
517e9fcaa8aSmrg    <entry></entry>
518e9fcaa8aSmrg    <entry></entry>
519e9fcaa8aSmrg  </row>
520e9fcaa8aSmrg</tbody>
521e9fcaa8aSmrg</tgroup>
522e9fcaa8aSmrg</table>
523e9fcaa8aSmrg
524e9fcaa8aSmrg</sect1>
525eb411b4bSmrg<sect1 id='Building_a_Keyboard_Description_Using_the_Server_Database'>
526e9fcaa8aSmrg<title>Building a Keyboard Description Using the Server Database</title>
527e9fcaa8aSmrg
528e9fcaa8aSmrg<para>
529e9fcaa8aSmrgA client may request that the server fetch one or more components from its
530e9fcaa8aSmrgdatabase and use those components to build a new server keyboard description.
531e9fcaa8aSmrgThe new keyboard description may be built from scratch, or it may be built
532e9fcaa8aSmrgstarting with the current keyboard description for a particular device. Once
533e9fcaa8aSmrgthe keyboard description is built, all or part of it may be returned to the
534e9fcaa8aSmrgclient. The parts returned to the client need not include all of the parts used
535e9fcaa8aSmrgto build the description. At the time it requests the server to build a new
536e9fcaa8aSmrgkeyboard description, a client may also request that the server use the new
537e9fcaa8aSmrgdescription internally to replace the current keyboard description for a
538e9fcaa8aSmrgspecific device, in which case the behavior of the device changes accordingly.
539e9fcaa8aSmrg</para>
540e9fcaa8aSmrg
541e9fcaa8aSmrg
542e9fcaa8aSmrg<para>
543e9fcaa8aSmrgTo build a new keyboard description from a set of named components, and to
544e9fcaa8aSmrgoptionally have the server use the resulting description to replace an active
5450f8248bfSmrgone, use
5460f8248bfSmrg<function>XkbGetKeyboardByName</function>.
547e9fcaa8aSmrg</para>
548e9fcaa8aSmrg
5490f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyboardByName"><primary><function>XkbGetKeyboardByName</function></primary></indexterm>
5500f8248bfSmrg<funcsynopsis id="XkbGetKeyboardByName">
5510f8248bfSmrg  <funcprototype>
5520f8248bfSmrg    <funcdef>XkbDescPtr <function>XkbGetKeyboardByName</function></funcdef>
5530f8248bfSmrg<!-- (
5540f8248bfSmrg<parameter>dpy</parameter>,
5550f8248bfSmrg<parameter>device_spec</parameter>,
5560f8248bfSmrg<parameter>names</parameter>,
5570f8248bfSmrg<parameter>want</parameter>,
5580f8248bfSmrg<parameter>need</parameter>,
5590f8248bfSmrg<parameter>load</parameter>
5600f8248bfSmrg) -->
5610f8248bfSmrg
5620f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
5630f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
5640f8248bfSmrg    <paramdef>XkbComponentNamesPtr <parameter>names</parameter></paramdef>
5650f8248bfSmrg    <paramdef>unsigned int <parameter>want</parameter></paramdef>
5660f8248bfSmrg    <paramdef>unsigned int <parameter>need</parameter></paramdef>
5670f8248bfSmrg    <paramdef>Bool <parameter>load</parameter></paramdef>
5680f8248bfSmrg  </funcprototype>
5690f8248bfSmrg</funcsynopsis>
5700f8248bfSmrg<variablelist>
5710f8248bfSmrg  <varlistentry>
5720f8248bfSmrg    <term>
5730f8248bfSmrg      <parameter>dpy</parameter>
5740f8248bfSmrg    </term>
5750f8248bfSmrg    <listitem>
5760f8248bfSmrg      <para>
5770f8248bfSmrg        connection to X server
5780f8248bfSmrg      </para>
5790f8248bfSmrg    </listitem>
5800f8248bfSmrg  </varlistentry>
5810f8248bfSmrg  <varlistentry>
5820f8248bfSmrg    <term>
5830f8248bfSmrg      <parameter>device_spec</parameter>
5840f8248bfSmrg    </term>
5850f8248bfSmrg    <listitem>
5860f8248bfSmrg      <para>
5870f8248bfSmrg        device ID, or <symbol>XkbUseCoreKbd</symbol>
5880f8248bfSmrg      </para>
5890f8248bfSmrg    </listitem>
5900f8248bfSmrg  </varlistentry>
5910f8248bfSmrg  <varlistentry>
5920f8248bfSmrg    <term>
5930f8248bfSmrg      <parameter>names</parameter>
5940f8248bfSmrg    </term>
5950f8248bfSmrg    <listitem>
5960f8248bfSmrg      <para>
5970f8248bfSmrg        names of components to fetch
5980f8248bfSmrg      </para>
5990f8248bfSmrg    </listitem>
6000f8248bfSmrg  </varlistentry>
6010f8248bfSmrg  <varlistentry>
6020f8248bfSmrg    <term>
6030f8248bfSmrg      <parameter>want</parameter>
6040f8248bfSmrg    </term>
6050f8248bfSmrg    <listitem>
6060f8248bfSmrg      <para>
6070f8248bfSmrg        desired structures in returned record
6080f8248bfSmrg      </para>
6090f8248bfSmrg    </listitem>
6100f8248bfSmrg  </varlistentry>
6110f8248bfSmrg  <varlistentry>
6120f8248bfSmrg    <term>
6130f8248bfSmrg      <parameter>need</parameter>
6140f8248bfSmrg    </term>
6150f8248bfSmrg    <listitem>
6160f8248bfSmrg      <para>
6170f8248bfSmrg        mandatory structures in returned record
6180f8248bfSmrg      </para>
6190f8248bfSmrg    </listitem>
6200f8248bfSmrg  </varlistentry>
6210f8248bfSmrg  <varlistentry>
6220f8248bfSmrg    <term>
6230f8248bfSmrg      <parameter>load</parameter>
6240f8248bfSmrg    </term>
6250f8248bfSmrg    <listitem>
6260f8248bfSmrg      <para>
6270f8248bfSmrg        <symbol>True</symbol> &rArr; load into <parameter>device_spec</parameter>
6280f8248bfSmrg      </para>
6290f8248bfSmrg    </listitem>
6300f8248bfSmrg  </varlistentry>
6310f8248bfSmrg</variablelist>
632e9fcaa8aSmrg
633e9fcaa8aSmrg<para>
6340f8248bfSmrg<parameter>names</parameter>
6350f8248bfSmrgcontains a set of expressions describing the keyboard components the server
6360f8248bfSmrgshould use to build the new keyboard description.
6370f8248bfSmrg<parameter>want</parameter>
6380f8248bfSmrgand
6390f8248bfSmrg<parameter>need</parameter>
6400f8248bfSmrgare bit fields describing the parts of the resulting keyboard description that
6410f8248bfSmrgshould be present in the returned
6420f8248bfSmrg<structname>XkbDescRec</structname>.
643e9fcaa8aSmrg</para>
644e9fcaa8aSmrg
645e9fcaa8aSmrg
646e9fcaa8aSmrg<para>
6470f8248bfSmrgThe individual fields in
6480f8248bfSmrg<parameter>names</parameter>
6490f8248bfSmrgare
6500f8248bfSmrg<firstterm>component expressions</firstterm>
6510f8248bfSmrgcomposed of keyboard component names (no wildcarding as may be used in
6520f8248bfSmrg<function>XkbListComponents</function>),
6530f8248bfSmrgthe special component name symbol ‘<literal>%</literal>’,
6540f8248bfSmrgand the special operator characters
6550f8248bfSmrg‘<literal>+</literal>’ and ‘<literal>|</literal>’.
6560f8248bfSmrgA component expression is parsed left to right, as follows:
657e9fcaa8aSmrg</para>
658e9fcaa8aSmrg
659e9fcaa8aSmrg<itemizedlist>
660e9fcaa8aSmrg<listitem>
661e9fcaa8aSmrg  <para>
6620f8248bfSmrgThe special component name “<literal>computed</literal>”
6630f8248bfSmrgmay be used in
6640f8248bfSmrg<structfield>keycodes</structfield>
6650f8248bfSmrgcomponent expressions and refers to a component consisting of a set of
666e9fcaa8aSmrgkeycodes computed automatically by the server as needed.
667e9fcaa8aSmrg  </para>
668e9fcaa8aSmrg</listitem>
669e9fcaa8aSmrg<listitem>
670e9fcaa8aSmrg  <para>
6710f8248bfSmrgThe special component name “<literal>canonical</literal>” may be used in
6720f8248bfSmrg<structfield>types</structfield>
6730f8248bfSmrgcomponent expressions and refers to a partial component defining the four
6740f8248bfSmrgstandard key types:
6750f8248bfSmrg<emphasis>ALPHABETIC</emphasis>,
6760f8248bfSmrg<emphasis>ONE_LEVEL</emphasis>,
6770f8248bfSmrg<emphasis>TWO_LEVEL</emphasis>,
6780f8248bfSmrgand
6790f8248bfSmrg<emphasis>KEYPAD</emphasis>.
6800f8248bfSmrg</para>
681e9fcaa8aSmrg</listitem>
682e9fcaa8aSmrg<listitem>
683e9fcaa8aSmrg  <para>
6840f8248bfSmrgThe special component name ‘<literal>%</literal>’
6850f8248bfSmrgrefers to the keyboard description for the device specified in
6860f8248bfSmrg<parameter>device_spec</parameter>
6870f8248bfSmrgor the keymap names component. If a keymap names component is specified that
6880f8248bfSmrgdoes not begin with
6890f8248bfSmrg‘<literal>+</literal>’ or ‘<literal>|</literal>’ and does not contain
6900f8248bfSmrg‘<literal>%</literal>’, then ‘<literal>%</literal>’
6910f8248bfSmrgrefers to the description generated by the keymap names component.
6920f8248bfSmrgOtherwise, it refers to the keyboard description for
6930f8248bfSmrg<parameter>device_spec</parameter>.
6940f8248bfSmrg</para>
695e9fcaa8aSmrg</listitem>
696e9fcaa8aSmrg<listitem>
697e9fcaa8aSmrg  <para>
6980f8248bfSmrgThe ‘<literal>+</literal>’
6990f8248bfSmrgoperator specifies that the following component should
7000f8248bfSmrg<emphasis>override</emphasis>
7010f8248bfSmrgthe currently assembled description; any definitions that are present in both
702e9fcaa8aSmrgcomponents are taken from the second.
703e9fcaa8aSmrg  </para>
704e9fcaa8aSmrg</listitem>
705e9fcaa8aSmrg<listitem>
706e9fcaa8aSmrg  <para>
7070f8248bfSmrgThe ‘<literal>|</literal>’
7080f8248bfSmrgoperator specifies that the next specified component should
7090f8248bfSmrg<emphasis>augment</emphasis>
7100f8248bfSmrgthe currently assembled description; any definitions that are present in both
711e9fcaa8aSmrgcomponents are taken from the first.
712e9fcaa8aSmrg  </para>
713e9fcaa8aSmrg</listitem>
714e9fcaa8aSmrg<listitem>
715e9fcaa8aSmrg  <para>
7160f8248bfSmrgIf the component expression begins with an operator, a leading
7170f8248bfSmrg‘<literal>%</literal>’ is implied.
718e9fcaa8aSmrg  </para>
719e9fcaa8aSmrg</listitem>
720e9fcaa8aSmrg<listitem>
721e9fcaa8aSmrg  <para>
722e9fcaa8aSmrgIf any unknown or illegal characters appear anywhere in the expression, the
723e9fcaa8aSmrgentire expression is invalid and is ignored.
724e9fcaa8aSmrg  </para>
725e9fcaa8aSmrg</listitem>
726e9fcaa8aSmrg</itemizedlist>
727e9fcaa8aSmrg
728e9fcaa8aSmrg<para>
7290f8248bfSmrgFor example, if
7300f8248bfSmrg<structfield>names-&gt;symbols</structfield>
7310f8248bfSmrgcontained the expression "+de", it specifies that the default member of the
732e9fcaa8aSmrg"de" class of symbols should be applied to the current keyboard mapping,
733e9fcaa8aSmrgoverriding any existing definitions (it could also be written "+de(default)").
734e9fcaa8aSmrg</para>
735e9fcaa8aSmrg
736e9fcaa8aSmrg
737e9fcaa8aSmrg<para>
738e9fcaa8aSmrgHere is a slightly more involved example: the expression
739e9fcaa8aSmrg"acme(ascii)+de(basic)|iso9995-3" constructs a German (de) mapping for the
740e9fcaa8aSmrgASCII keyboard supplied by the "acme" vendor. The new definition begins with
7410f8248bfSmrgthe symbols for the ASCII keyboard for Acme
7420f8248bfSmrg(<literal>acme(ascii)</literal>),
7430f8248bfSmrgoverrides them with definitions for the basic German keyboard
7440f8248bfSmrg(<literal>de(basic)</literal>),
7450f8248bfSmrgand then applies the definitions from the default iso9995-3 keyboard
7460f8248bfSmrg(
7470f8248bfSmrg<literal>iso9995-3</literal>)
7480f8248bfSmrgto any undefined keys or groups of keys (part three of the iso9995 standard
749e9fcaa8aSmrgdefines a common set of bindings for the secondary group, but allows national
750e9fcaa8aSmrglayouts to override those definitions where necessary).
751e9fcaa8aSmrg</para>
752e9fcaa8aSmrg
753e9fcaa8aSmrg<note><para>The interpretation of the above expression components (acme, ascii,
754e9fcaa8aSmrgde, basic, iso9995-3) is not defined by Xkb; only the operations and their
755e9fcaa8aSmrgordering are.</para></note>
756e9fcaa8aSmrg
757e9fcaa8aSmrg<para>
7580f8248bfSmrgNote that the presence of a keymap
7590f8248bfSmrg<parameter>names</parameter>
7600f8248bfSmrgcomponent that does not contain
7610f8248bfSmrg‘<literal>%</literal>’
7620f8248bfSmrg(either explicit or implied by virtue of an expression starting with an
763e9fcaa8aSmrgoperator) indicates a description that is independent of the keyboard
7640f8248bfSmrgdescription for the device specified in
7650f8248bfSmrg<parameter>device_spec</parameter>.
7660f8248bfSmrgThe same is true of requests in which the keymap names component is empty and
767e9fcaa8aSmrgall five other names components contain expressions void of references to
7680f8248bfSmrg‘<literal>%</literal>’.
7690f8248bfSmrgRequests of this form allow you to deal with keyboard definitions
770e9fcaa8aSmrgindependent of any actual device.
771e9fcaa8aSmrg</para>
772e9fcaa8aSmrg
773e9fcaa8aSmrg
774e9fcaa8aSmrg<para>
7750f8248bfSmrgThe server parses all non-
7760f8248bfSmrg<symbol>NULL</symbol>
7770f8248bfSmrgfields in
7780f8248bfSmrg<parameter>names</parameter>
7790f8248bfSmrgand uses them to build a keyboard description. However, before parsing the
7800f8248bfSmrgexpressions in
7810f8248bfSmrg<parameter>names</parameter>,
7820f8248bfSmrgthe server ORs the bits in
7830f8248bfSmrg<parameter>want</parameter>
7840f8248bfSmrgand
7850f8248bfSmrg<parameter>need</parameter>
7860f8248bfSmrgtogether and examines the result in relationship to the expressions in
7870f8248bfSmrg<parameter>names</parameter>.
7880f8248bfSmrg<link linkend="table20.3">Table 20.3</link>
7890f8248bfSmrgidentifies the components that are required for each of the
7900f8248bfSmrgpossible bits in
7910f8248bfSmrg<parameter>want</parameter>
7920f8248bfSmrgor
7930f8248bfSmrg<parameter>need</parameter>.
7940f8248bfSmrgIf a required component has not been specified in the
7950f8248bfSmrg<parameter>names</parameter>
7960f8248bfSmrgstructure (the corresponding field is
7970f8248bfSmrg<symbol>NULL</symbol>),
7980f8248bfSmrgthe server substitutes the expression
7990f8248bfSmrg“<literal>%</literal>”,
8000f8248bfSmrgresulting in the component values being taken from
8010f8248bfSmrg<parameter>device_spec</parameter>.
8020f8248bfSmrgIn addition, if
8030f8248bfSmrg<parameter>load</parameter>
8040f8248bfSmrgis
8050f8248bfSmrg<symbol>True</symbol>,
8060f8248bfSmrgthe server modifies
8070f8248bfSmrg<parameter>names</parameter>
8080f8248bfSmrgif necessary (again using a
8090f8248bfSmrg“<literal>%</literal>”
8100f8248bfSmrgentry) to ensure all of the following fields are non-
8110f8248bfSmrg<symbol>NULL</symbol>:
8120f8248bfSmrg
8130f8248bfSmrg<structfield>types</structfield>,
8140f8248bfSmrg<structfield>keycodes</structfield>,
8150f8248bfSmrg<structfield>symbols</structfield>,
8160f8248bfSmrgand
8170f8248bfSmrg<structfield>compat</structfield>.
818e9fcaa8aSmrg</para>
819e9fcaa8aSmrg
8200f8248bfSmrg<table id='table20.3' frame='topbot'>
821e9fcaa8aSmrg<title>Want and Need Mask Bits and Required Names Components</title>
822eb411b4bSmrg<?dbfo keep-together="always" ?>
823eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
824eb411b4bSmrg<colspec colname='c1' colwidth='2.4*'/>
825eb411b4bSmrg<colspec colname='c2' colwidth='2.6*'/>
826eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/>
827e9fcaa8aSmrg<thead>
828eb411b4bSmrg<row rowsep='1'>
829e9fcaa8aSmrg  <entry>want or need mask bit</entry>
830e9fcaa8aSmrg  <entry>Required names Components</entry>
831e9fcaa8aSmrg  <entry>value</entry>
832e9fcaa8aSmrg  </row>
833e9fcaa8aSmrg</thead>
834e9fcaa8aSmrg<tbody>
835eb411b4bSmrg  <row>
8360f8248bfSmrg    <entry><symbol>XkbGBN_TypesMask</symbol></entry>
837e9fcaa8aSmrg    <entry>Types</entry>
838e9fcaa8aSmrg    <entry>(1L&lt;&lt;0)</entry>
839e9fcaa8aSmrg  </row>
840eb411b4bSmrg  <row>
8410f8248bfSmrg    <entry><symbol>XkbGBN_CompatMapMask</symbol></entry>
842e9fcaa8aSmrg    <entry>Compat</entry>
843e9fcaa8aSmrg    <entry>(1L&lt;&lt;1)</entry>
844e9fcaa8aSmrg  </row>
845eb411b4bSmrg  <row>
8460f8248bfSmrg    <entry><symbol>XkbGBN_ClientSymbolsMask</symbol></entry>
847e9fcaa8aSmrg    <entry>Types + Symbols + Keycodes</entry>
848e9fcaa8aSmrg    <entry>(1L&lt;&lt;2)</entry>
849e9fcaa8aSmrg  </row>
850eb411b4bSmrg  <row>
8510f8248bfSmrg    <entry><symbol>XkbGBN_ServerSymbolsMask</symbol></entry>
852e9fcaa8aSmrg    <entry>Types + Symbols + Keycodes</entry>
853e9fcaa8aSmrg    <entry>(1L&lt;&lt;3)</entry>
854e9fcaa8aSmrg  </row>
855eb411b4bSmrg  <row>
8560f8248bfSmrg    <entry><symbol>XkbGBN_SymbolsMask</symbol></entry>
857e9fcaa8aSmrg    <entry>Symbols</entry>
858e9fcaa8aSmrg    <entry>(1L&lt;&lt;1)</entry>
859e9fcaa8aSmrg  </row>
860eb411b4bSmrg  <row>
8610f8248bfSmrg    <entry><symbol>XkbGBN_IndicatorMapMask</symbol></entry>
862e9fcaa8aSmrg    <entry>Compat</entry>
863e9fcaa8aSmrg    <entry>(1L&lt;&lt;4)</entry>
864e9fcaa8aSmrg  </row>
865eb411b4bSmrg  <row>
8660f8248bfSmrg    <entry><symbol>XkbGBN_KeyNamesMask</symbol></entry>
867e9fcaa8aSmrg    <entry>Keycodes</entry>
868e9fcaa8aSmrg    <entry>(1L&lt;&lt;5)</entry>
869e9fcaa8aSmrg  </row>
870eb411b4bSmrg  <row>
8710f8248bfSmrg    <entry><symbol>XkbGBN_GeometryMask</symbol></entry>
872e9fcaa8aSmrg    <entry>Geometry</entry>
873e9fcaa8aSmrg    <entry>(1L&lt;&lt;6)</entry>
874e9fcaa8aSmrg  </row>
875eb411b4bSmrg  <row>
8760f8248bfSmrg    <entry><symbol>XkbGBN_OtherNamesMask</symbol></entry>
877e9fcaa8aSmrg    <entry>Types + Symbols + Keycodes + Compat + Geometry</entry>
878e9fcaa8aSmrg    <entry>(1L&lt;&lt;7)</entry>
879e9fcaa8aSmrg  </row>
880eb411b4bSmrg  <row>
8810f8248bfSmrg    <entry><symbol>XkbGBN_AllComponentsMask</symbol></entry>
882e9fcaa8aSmrg    <entry></entry>
883e9fcaa8aSmrg    <entry>(0xff)</entry>
884e9fcaa8aSmrg  </row>
885e9fcaa8aSmrg</tbody>
886e9fcaa8aSmrg</tgroup>
887e9fcaa8aSmrg</table>
888e9fcaa8aSmrg
889e9fcaa8aSmrg<para>
8900f8248bfSmrg<parameter>need</parameter>
8910f8248bfSmrgspecifies a set of keyboard components that the server must be able to resolve
8920f8248bfSmrgin order for
8930f8248bfSmrg<function>XkbGetKeyboardByName</function>
8940f8248bfSmrgto succeed; if any of the components specified in
8950f8248bfSmrg<parameter>need</parameter>
8960f8248bfSmrgcannot be successfully resolved,
8970f8248bfSmrg<function>XkbGetKeyboardByName</function>
8980f8248bfSmrgfails.
899e9fcaa8aSmrg</para>
900e9fcaa8aSmrg
901e9fcaa8aSmrg
902e9fcaa8aSmrg<para>
9030f8248bfSmrg<parameter>want</parameter>
9040f8248bfSmrgspecifies a set of keyboard components that the server should attempt to
905e9fcaa8aSmrgresolve, but that are not mandatory. If the server is unable to resolve any of
9060f8248bfSmrgthese components,
9070f8248bfSmrg<function>XkbGetKeyboardByName</function>
9080f8248bfSmrgstill succeeds. Bits specified in
9090f8248bfSmrg<parameter>want</parameter>
9100f8248bfSmrgthat are also specified in
9110f8248bfSmrg<parameter>need</parameter>
9120f8248bfSmrghave no effect in the context of
9130f8248bfSmrg<parameter>want</parameter>.
914e9fcaa8aSmrg</para>
915e9fcaa8aSmrg
916e9fcaa8aSmrg
917e9fcaa8aSmrg<para>
9180f8248bfSmrgIf
9190f8248bfSmrg<parameter>load</parameter>
9200f8248bfSmrgis
9210f8248bfSmrg<symbol>True</symbol>,
9220f8248bfSmrgthe server updates its keyboard description for
9230f8248bfSmrg<parameter>device_spec</parameter>
9240f8248bfSmrgto match the result of the keyboard description just built. If load is
9250f8248bfSmrg<symbol>False</symbol>,
9260f8248bfSmrgthe server’s description for device
9270f8248bfSmrg<parameter>device_spec</parameter>
9280f8248bfSmrgis not updated. In all cases, the parts specified by
9290f8248bfSmrg<parameter>want</parameter>
9300f8248bfSmrgand
9310f8248bfSmrg<parameter>need</parameter>
9320f8248bfSmrgfrom the just-built keyboard description are returned.
933e9fcaa8aSmrg</para>
934e9fcaa8aSmrg
935e9fcaa8aSmrg
936e9fcaa8aSmrg<para>
9370f8248bfSmrgThe
9380f8248bfSmrg<parameter>names</parameter>
9390f8248bfSmrgstructure in an
9400f8248bfSmrg<structname>XkbDescRec</structname>
9410f8248bfSmrgkeyboard description record (see <xref linkend="Symbolic_Names" />) contains one field for each of
942e9fcaa8aSmrgthe five component types used to build a keyboard description. When a keyboard
943e9fcaa8aSmrgdescription is built from a set of database components, the corresponding
9440f8248bfSmrgfields in this
9450f8248bfSmrg<parameter>names</parameter>
9460f8248bfSmrgstructure are set to match the expressions used to build the component.
947e9fcaa8aSmrg</para>
948e9fcaa8aSmrg
949e9fcaa8aSmrg
950e9fcaa8aSmrg<para>
951e9fcaa8aSmrgThe entire process of building a new keyboard description from the server
952e9fcaa8aSmrgdatabase of components and returning all or part of it is diagrammed in Figure
953e9fcaa8aSmrg20.1:
954e9fcaa8aSmrg</para>
955e9fcaa8aSmrg
9560f8248bfSmrg<figure id='figure20.1'>
9570f8248bfSmrg  <title>Building a New Keyboard Description from the Server Database</title>
9580f8248bfSmrg  <mediaobject>
9590f8248bfSmrg   <imageobject> <imagedata format="SVG" fileref="XKBlib-21.svg"/>
9600f8248bfSmrg   </imageobject>
9610f8248bfSmrg  </mediaobject>
9620f8248bfSmrg</figure>
963e9fcaa8aSmrg
964e9fcaa8aSmrg<para>
9650f8248bfSmrgThe information returned to the client in the
9660f8248bfSmrg<structname>XkbDescRec</structname>
9670f8248bfSmrgis essentially the result of a series of calls to extract information from a
968e9fcaa8aSmrgfictitious device whose description matches the one just built. The calls
9690f8248bfSmrgcorresponding to each of the mask bits are summarized in
9700f8248bfSmrg<link linkend="table20.4">Table 20.4</link>, together with the
9710f8248bfSmrg<structname>XkbDescRec</structname>
9720f8248bfSmrgcomponents that are filled in.
973e9fcaa8aSmrg</para>
974e9fcaa8aSmrg
9750f8248bfSmrg<table id='table20.4' frame='topbot'>
976e9fcaa8aSmrg<title>XkbDescRec Components Returned for Values of Want &amp; Needs</title>
977eb411b4bSmrg<?dbfo keep-together="always" ?>
978eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
979eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
980eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
981eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/>
982e9fcaa8aSmrg<thead>
983eb411b4bSmrg<row rowsep='1'>
984e9fcaa8aSmrg  <entry>Request (want+need)</entry>
985e9fcaa8aSmrg  <entry>Fills in Xkb components</entry>
986e9fcaa8aSmrg  <entry>Equivalent Function Call</entry>
987e9fcaa8aSmrg  </row>
988e9fcaa8aSmrg</thead>
989e9fcaa8aSmrg<tbody>
990eb411b4bSmrg  <row>
9910f8248bfSmrg    <entry><symbol>XkbGBN_TypesMask</symbol></entry>
992e9fcaa8aSmrg    <entry>map.types</entry>
993e9fcaa8aSmrg    <entry>XkbGetUpdatedMap(dpy, XkbTypesMask, Xkb)</entry>
994e9fcaa8aSmrg  </row>
995eb411b4bSmrg  <row>
9960f8248bfSmrg    <entry><symbol>XkbGBN_ServerSymbolsMask</symbol></entry>
997e9fcaa8aSmrg    <entry>server</entry>
998e9fcaa8aSmrg    <entry>XkbGetUpdatedMap(dpy, XkbAllClientInfoMask, Xkb)</entry>
999e9fcaa8aSmrg  </row>
1000eb411b4bSmrg  <row>
10010f8248bfSmrg    <entry><symbol>XkbGBN_ClientSymbolsMask</symbol></entry>
1002e9fcaa8aSmrg    <entry>map, including map.types</entry>
1003e9fcaa8aSmrg    <entry>XkbGetUpdatedMap(dpy, XkbAllServerInfoMask, Xkb)</entry>
1004e9fcaa8aSmrg  </row>
1005eb411b4bSmrg  <row>
1006e9fcaa8aSmrg    <entry>XkbGBN_IndicatorMaps</entry>
1007e9fcaa8aSmrg    <entry>indicators</entry>
1008e9fcaa8aSmrg    <entry>XkbGetIndicatorMap(dpy, XkbAllIndicators, Xkb)</entry>
1009e9fcaa8aSmrg  </row>
1010eb411b4bSmrg  <row>
10110f8248bfSmrg    <entry><symbol>XkbGBN_CompatMapMask</symbol></entry>
1012e9fcaa8aSmrg    <entry>compat</entry>
1013e9fcaa8aSmrg    <entry>XkbGetCompatMap(dpy, XkbAllCompatMask, Xkb)</entry>
1014e9fcaa8aSmrg  </row>
1015eb411b4bSmrg  <row>
10160f8248bfSmrg    <entry><symbol>XkbGBN_GeometryMask</symbol></entry>
1017e9fcaa8aSmrg    <entry>geom</entry>
1018e9fcaa8aSmrg    <entry>XkbGetGeometry(dpy, Xkb)</entry>
1019e9fcaa8aSmrg  </row>
1020eb411b4bSmrg  <row>
10210f8248bfSmrg    <entry><symbol>XkbGBN_KeyNamesMask</symbol></entry>
1022e9fcaa8aSmrg    <entry>
1023e9fcaa8aSmrg<para>names.keys</para>
1024e9fcaa8aSmrg<para>names.key_aliases</para>
1025e9fcaa8aSmrg    </entry>
1026e9fcaa8aSmrg    <entry>
1027e9fcaa8aSmrgXkbGetNames(dpy, XkbKeyNamesMask | XkbKeyAliasesMask, Xkb)
1028e9fcaa8aSmrg    </entry>
1029e9fcaa8aSmrg  </row>
1030eb411b4bSmrg  <row>
10310f8248bfSmrg    <entry><symbol>XkbGBN_OtherNamesMask</symbol></entry>
1032e9fcaa8aSmrg    <entry>
1033e9fcaa8aSmrg<para>names.keycodes</para>
1034e9fcaa8aSmrg<para>names.geometry</para>
1035e9fcaa8aSmrg<para>names.symbols</para>
1036e9fcaa8aSmrg<para>names.types</para>
1037e9fcaa8aSmrg<para>map.types[*].lvl_names[*]</para>
1038e9fcaa8aSmrg<para>names.compat</para>
1039e9fcaa8aSmrg<para>names.vmods</para>
1040e9fcaa8aSmrg<para>names.indicators</para>
1041e9fcaa8aSmrg<para>names.groups</para>
1042e9fcaa8aSmrg<para>names.radio_groups</para>
1043e9fcaa8aSmrg<para>names.phys_symbols</para>
1044e9fcaa8aSmrg    </entry>
1045e9fcaa8aSmrg    <entry>
1046e9fcaa8aSmrg<para>XkbGetNames(dpy, XkbAllNamesMask &amp;</para>
1047e9fcaa8aSmrg<para>~(XkbKeyNamesMask | XkbKeyAliasesMask),</para>
1048e9fcaa8aSmrg<para>Xkb)</para>
1049e9fcaa8aSmrg    </entry>
1050e9fcaa8aSmrg  </row>
1051e9fcaa8aSmrg</tbody>
1052e9fcaa8aSmrg</tgroup>
1053e9fcaa8aSmrg</table>
1054e9fcaa8aSmrg
1055e9fcaa8aSmrg<para>
10560f8248bfSmrgThere is no way to determine which components specified in
10570f8248bfSmrg<parameter>want</parameter>
10580f8248bfSmrg(but not in
10590f8248bfSmrg<parameter>need</parameter>)
10600f8248bfSmrgwere actually fetched, other than breaking the call into successive calls to
10610f8248bfSmrg<function>XkbGetKeyboardByName</function>
10620f8248bfSmrgand specifying individual components.
1063e9fcaa8aSmrg</para>
1064e9fcaa8aSmrg
1065e9fcaa8aSmrg
1066e9fcaa8aSmrg<para>
10670f8248bfSmrg<function>XkbGetKeyboardByName</function>
10680f8248bfSmrgalways sets
10690f8248bfSmrg<structfield>min_key_code</structfield>
10700f8248bfSmrgand
10710f8248bfSmrg<structfield>max_key_code</structfield>
10720f8248bfSmrgin the returned
10730f8248bfSmrg<structname>XkbDescRec</structname>
10740f8248bfSmrgstructure.
1075e9fcaa8aSmrg</para>
1076e9fcaa8aSmrg
1077e9fcaa8aSmrg
1078e9fcaa8aSmrg<para>
10790f8248bfSmrg<function>XkbGetKeyboardByName</function>
1080e9fcaa8aSmrgis synchronous; it sends the request to the server to build a new keyboard
1081e9fcaa8aSmrgdescription and waits for the reply. If successful, the return value is
10820f8248bfSmrgnon-<symbol>NULL</symbol>.
10830f8248bfSmrg<function>XkbGetKeyboardByName</function>
10840f8248bfSmrggenerates a <errorname>BadMatch</errorname>
1085e9fcaa8aSmrgprotocol error if errors are encountered when building the keyboard
1086e9fcaa8aSmrgdescription.
1087e9fcaa8aSmrg</para>
1088e9fcaa8aSmrg
1089e9fcaa8aSmrg
1090e9fcaa8aSmrg<para>
1091e9fcaa8aSmrgIf you simply want to obtain information about the current keyboard device,
1092e9fcaa8aSmrgrather than generating a new keyboard description from elements in the server
10930f8248bfSmrgdatabase, use
10940f8248bfSmrg<function>XkbGetKeyboard</function>
10950f8248bfSmrg(see <link linkend="Obtaining_a_Keyboard_Description_from_the_Server">section 6.2</link>).
1096e9fcaa8aSmrg</para>
1097e9fcaa8aSmrg
10980f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyboard"><primary><function>XkbGetKeyboard</function></primary></indexterm>
10990f8248bfSmrg<funcsynopsis id="XkbGetKeyboard.20">
11000f8248bfSmrg  <funcprototype>
11010f8248bfSmrg    <funcdef>XkbDescPtr <function>XkbGetKeyboard</function></funcdef>
11020f8248bfSmrg<!-- (
11030f8248bfSmrg<parameter>dpy</parameter>,
11040f8248bfSmrg<parameter>which</parameter>,
11050f8248bfSmrg<parameter>device_spec</parameter>
11060f8248bfSmrg) -->
11070f8248bfSmrg
11080f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
11090f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
11100f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
11110f8248bfSmrg  </funcprototype>
11120f8248bfSmrg</funcsynopsis>
11130f8248bfSmrg<variablelist>
11140f8248bfSmrg  <varlistentry>
11150f8248bfSmrg    <term>
11160f8248bfSmrg      <parameter>dpy</parameter>
11170f8248bfSmrg    </term>
11180f8248bfSmrg    <listitem>
11190f8248bfSmrg      <para>
11200f8248bfSmrg        connection to X server
11210f8248bfSmrg      </para>
11220f8248bfSmrg    </listitem>
11230f8248bfSmrg  </varlistentry>
11240f8248bfSmrg  <varlistentry>
11250f8248bfSmrg    <term>
11260f8248bfSmrg      <parameter>which</parameter>
11270f8248bfSmrg    </term>
11280f8248bfSmrg    <listitem>
11290f8248bfSmrg      <para>
11300f8248bfSmrg        mask of components of <structname>XkbDescRec</structname> of interest
11310f8248bfSmrg      </para>
11320f8248bfSmrg    </listitem>
11330f8248bfSmrg  </varlistentry>
11340f8248bfSmrg  <varlistentry>
11350f8248bfSmrg    <term>
11360f8248bfSmrg      <parameter>device_spec</parameter>
11370f8248bfSmrg    </term>
11380f8248bfSmrg    <listitem>
11390f8248bfSmrg      <para>
11400f8248bfSmrg        device ID
11410f8248bfSmrg      </para>
11420f8248bfSmrg    </listitem>
11430f8248bfSmrg  </varlistentry>
11440f8248bfSmrg</variablelist>
1145e9fcaa8aSmrg
1146e9fcaa8aSmrg<para>
11470f8248bfSmrg<function>XkbGetKeyboard</function>
11480f8248bfSmrgis used to read the current description for one or more components of a
11490f8248bfSmrgkeyboard device. It calls
11500f8248bfSmrg<function>XkbGetKeyboardByName</function>
11510f8248bfSmrgas follows:
1152e9fcaa8aSmrg</para>
1153e9fcaa8aSmrg
1154e9fcaa8aSmrg
1155e9fcaa8aSmrg<para>
11560f8248bfSmrg<function>XkbGetKeyboardByName</function>
11570f8248bfSmrg(
11580f8248bfSmrg<parameter>dpy</parameter>,
11590f8248bfSmrg<parameter>device_spec</parameter>,
11600f8248bfSmrg<symbol>NULL</symbol>,
11610f8248bfSmrg<parameter>which</parameter>,
11620f8248bfSmrg<parameter>which</parameter>,
11630f8248bfSmrg<symbol>False</symbol>).
11640f8248bfSmrg
1165e9fcaa8aSmrg</para>
1166e9fcaa8aSmrg
1167e9fcaa8aSmrg</sect1>
1168e9fcaa8aSmrg</chapter>
1169