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='Symbolic_Names'>
5e9fcaa8aSmrg<title>Symbolic Names</title>
6e9fcaa8aSmrg
7e9fcaa8aSmrg<para>
8e9fcaa8aSmrgThe core protocol does not provide any information to clients other than that
9e9fcaa8aSmrgactually used to interpret events. This makes it difficult to write an
10e9fcaa8aSmrgapplication that presents the keyboard to a user in an easy-to-understand way.
11e9fcaa8aSmrgSuch applications have to examine the vendor string and keycodes to determine
12e9fcaa8aSmrgthe type of keyboard connected to the server and then examine keysyms and
130f8248bfSmrgmodifier mappings to determine the effects of most modifiers (the
140f8248bfSmrg<symbol>Shift</symbol>,
150f8248bfSmrg<symbol>Lock</symbol>
160f8248bfSmrgand
170f8248bfSmrg<symbol>Control</symbol>
180f8248bfSmrgmodifiers are defined by the core protocol but no semantics are implied for
19e9fcaa8aSmrgany other modifiers).
20e9fcaa8aSmrg</para>
21e9fcaa8aSmrg
22e9fcaa8aSmrg
23e9fcaa8aSmrg<para>
24e9fcaa8aSmrgTo make it easier for applications to present a keyboard to the user, Xkb
25e9fcaa8aSmrgsupports symbolic names for most components of the keyboard extension. Most of
260f8248bfSmrgthese symbolic names are grouped into the
270f8248bfSmrg<structfield>names</structfield>
280f8248bfSmrgcomponent of the keyboard description.
29e9fcaa8aSmrg</para>
30e9fcaa8aSmrg
31eb411b4bSmrg<sect1 id='The_XkbNamesRec_Structure'>
32e9fcaa8aSmrg<title>The XkbNamesRec Structure</title>
330f8248bfSmrg<indexterm significance="preferred" zone="The_XkbNamesRec_Structure">
340f8248bfSmrg<primary><structname>XkbKeyNameRec</structname></primary></indexterm>
350f8248bfSmrg<indexterm significance="preferred" zone="The_XkbNamesRec_Structure">
360f8248bfSmrg<primary><structname>XkbKeyAliasRec</structname></primary></indexterm>
370f8248bfSmrg<indexterm significance="preferred" zone="The_XkbNamesRec_Structure">
380f8248bfSmrg<primary><structname>XkbNamesRec</structname></primary></indexterm>
39e9fcaa8aSmrg
40e9fcaa8aSmrg<para>
41e9fcaa8aSmrgThe names component of the keyboard description is defined as follows:
42e9fcaa8aSmrg
430f8248bfSmrg<programlisting>
44e9fcaa8aSmrg#define      XkbKeyNameLength      4
45e9fcaa8aSmrg#define      XkbKeyNumVirtualMods  16
46e9fcaa8aSmrg#define      XkbKeyNumIndicators   32
47e9fcaa8aSmrg#define      XkbKeyNumKbdGroups    4
48e9fcaa8aSmrg#define      XkbMaxRadioGroups     32
49e9fcaa8aSmrg
50e9fcaa8aSmrgtypedef struct {
510f8248bfSmrg    char      name[XkbKeyNameLength];      /* symbolic key names */
520f8248bfSmrg} <structname>XkbKeyNameRec</structname>, *XkbKeyNamePtr;
53e9fcaa8aSmrg
54e9fcaa8aSmrgtypedef struct {
550f8248bfSmrg    char      real[XkbKeyNameLength];
560f8248bfSmrg              /* this key name must be in the keys array */
570f8248bfSmrg    char      alias[XkbKeyNameLength];
580f8248bfSmrg              /* symbolic key name as alias for the key */
590f8248bfSmrg} <structname>XkbKeyAliasRec</structname>, *XkbKeyAliasPtr;
60e9fcaa8aSmrg
61e9fcaa8aSmrgtypedef struct _XkbNamesRec {
620f8248bfSmrg    Atom            keycodes;        /* identifies range and meaning
630f8248bfSmrg                                        of keycodes */
640f8248bfSmrg    Atom            geometry;        /* identifies physical location,
650f8248bfSmrg                                        size, and shape of keys */
660f8248bfSmrg    Atom            symbols;         /* identifies the symbols logically
670f8248bfSmrg                                        bound to the keys */
680f8248bfSmrg    Atom            types;           /* identifies the set of key types */
690f8248bfSmrg    Atom            compat;          /* identifies actions for keys using
700f8248bfSmrg                                        core protocol */
710f8248bfSmrg    Atom            vmods[XkbNumVirtualMods]; /* symbolic names for
720f8248bfSmrg                                                 virtual modifiers */
730f8248bfSmrg    Atom            indicators[XkbNumIndicators]; /* symbolic names
740f8248bfSmrg                                                     for indicators */
750f8248bfSmrg    Atom            groups[XkbNumKbdGroups];  /* symbolic names for
760f8248bfSmrg                                                 keyboard groups */
770f8248bfSmrg    XkbKeyNamePtr   keys;            /* symbolic key name array */
780f8248bfSmrg    XkbKeyAliasPtr  key_aliases;     /* real/alias symbolic name pairs array */
790f8248bfSmrg    Atom *          radio_groups;    /* radio group name array */
800f8248bfSmrg    Atom            phys_symbols;    /* identifies the symbols engraved
810f8248bfSmrg                                        on the keyboard */
820f8248bfSmrg    unsigned char   num_keys;        /* number of keys in the <structfield>keys</structfield> array */
830f8248bfSmrg    unsigned char   num_key_aliases; /* number of keys in the
840f8248bfSmrg                                        <structfield>key_aliases</structfield> array */
850f8248bfSmrg    unsigned short  num_rg;          /* number of radio groups */
860f8248bfSmrg} <structname>XkbNamesRec</structname>, *XkbNamesPtr;
87e9fcaa8aSmrg</programlisting></para>
88e9fcaa8aSmrg
89e9fcaa8aSmrg<para>
900f8248bfSmrgThe
910f8248bfSmrg<structfield>keycodes</structfield>
920f8248bfSmrgname identifies the range and meaning of the keycodes returned by the keyboard
930f8248bfSmrgin question. The
940f8248bfSmrg<structfield>geometry</structfield>
950f8248bfSmrgname, on the other hand, identifies the physical location, size and shape of
96e9fcaa8aSmrgthe various keys on the keyboard. As an example to distinguish between these
97e9fcaa8aSmrgtwo names, consider function keys on PC-compatible keyboards. Function keys are
98e9fcaa8aSmrgsometimes above the main keyboard and sometimes to the left of the main
99e9fcaa8aSmrgkeyboard, but the same keycode is used for the key that is logically F1
100e9fcaa8aSmrgregardless of physical position. Thus, all PC-compatible keyboards share a
101e9fcaa8aSmrgsimilar keycodes name but may have different geometry names.
102e9fcaa8aSmrg</para>
103e9fcaa8aSmrg
104e9fcaa8aSmrg<note><para>The keycodes name is intended to be a very general description of
105e9fcaa8aSmrgthe keycodes returned by a keyboard; a single keycodes name might cover
106e9fcaa8aSmrgkeyboards with differing numbers of keys provided all keys have the same
107e9fcaa8aSmrgsemantics when present. For example, 101 and 102 key PC keyboards might use the
1080f8248bfSmrgsame name. In these cases, applications can use the keyboard
1090f8248bfSmrg<structfield>geometry</structfield>
1100f8248bfSmrgname to determine which subset of the named keycodes is in use.</para></note>
111e9fcaa8aSmrg
112e9fcaa8aSmrg<para>
1130f8248bfSmrgThe
1140f8248bfSmrg<structfield>symbols</structfield>
1150f8248bfSmrgname identifies the symbols logically bound to the keys. The symbols name is a
116e9fcaa8aSmrghuman or application-readable description of the intended locale or usage of
1170f8248bfSmrgthe keyboard with these symbols. The
1180f8248bfSmrg<structfield>phys_symbols</structfield>
1190f8248bfSmrgname, on the other hand, identifies the symbols actually engraved on the
1200f8248bfSmrgkeyboard. Given this, the
1210f8248bfSmrg<structfield>symbols</structfield>
1220f8248bfSmrgname and
1230f8248bfSmrg<structfield>phys_symbols</structfield>
1240f8248bfSmrgnames might be different. For example, the description for a keyboard that has
125e9fcaa8aSmrgEnglish US engravings, but that is using Swiss German symbols might have a
1260f8248bfSmrg<structfield>phys_symbols</structfield>
1270f8248bfSmrgname of "en_US" and a
1280f8248bfSmrg<structfield>symbols</structfield>
1290f8248bfSmrgname of "de_CH."
130e9fcaa8aSmrg</para>
131e9fcaa8aSmrg
132e9fcaa8aSmrg
133e9fcaa8aSmrg<para>
1340f8248bfSmrgThe
1350f8248bfSmrg<structfield>types</structfield>
1360f8248bfSmrgname provides some information about the set of key types (see <link linkend="Key_Types">section 15.2</link>)
137e9fcaa8aSmrgthat can be associated with the keyboard. In addition, each key type can have a
138e9fcaa8aSmrgname, and each shift level of a type can have a name. Although these names are
139e9fcaa8aSmrgstored in the map description with each of the types, they are accessed using
140e9fcaa8aSmrgthe same methods as the other symbolic names.
141e9fcaa8aSmrg</para>
142e9fcaa8aSmrg
143e9fcaa8aSmrg
144e9fcaa8aSmrg<para>
1450f8248bfSmrgThe
1460f8248bfSmrg<structfield>compat</structfield>
1470f8248bfSmrgname provides some information about the rules used to bind actions to keys
148e9fcaa8aSmrgthat are changed using core protocol requests.
149e9fcaa8aSmrg</para>
150e9fcaa8aSmrg
151e9fcaa8aSmrg
152e9fcaa8aSmrg<para>
153e9fcaa8aSmrgXkb provides symbolic names for each of the 4 keyboard groups, 16 virtual
154e9fcaa8aSmrgmodifiers, 32 keyboard indicators, and 4 keyboard groups. These names are held
1550f8248bfSmrgin the
1560f8248bfSmrg<structfield>vmods</structfield>,
1570f8248bfSmrg<structfield>indicators</structfield>,
1580f8248bfSmrgand
1590f8248bfSmrg<structfield>groups</structfield>
1600f8248bfSmrgfixed-length arrays.
161e9fcaa8aSmrg</para>
162e9fcaa8aSmrg
163e9fcaa8aSmrg
164e9fcaa8aSmrg<para>
165e9fcaa8aSmrgEach key has a four-byte symbolic name. All of the symbolic key names are held
1660f8248bfSmrgin the
1670f8248bfSmrg<structfield>keys</structfield>
1680f8248bfSmrgarray, and
1690f8248bfSmrg<structfield>num_keys</structfield>
1700f8248bfSmrgreports the number of entries that are in the keys array. For each key, the
171e9fcaa8aSmrgkey name links keys with similar functions or in similar positions on keyboards
1720f8248bfSmrgthat report different keycodes. For example, the
1730f8248bfSmrg<keycap>F1</keycap>
1740f8248bfSmrgkey may emit keycode 23 on one keyboard and keycode 86 on another. By naming
175e9fcaa8aSmrgthis key "FK01" on both keyboards, the keyboard layout designer can reuse parts
176e9fcaa8aSmrgof keyboard descriptions for different keyboards.
177e9fcaa8aSmrg</para>
178e9fcaa8aSmrg
179e9fcaa8aSmrg
180e9fcaa8aSmrg<para>
181e9fcaa8aSmrgKey aliases allow the keyboard layout designer to assign multiple key names to
182e9fcaa8aSmrga single key. This allows the keyboard layout designer to refer to keys using
1830f8248bfSmrgeither their position or their <quote>function</quote>.
1840f8248bfSmrgFor example, a keyboard layout
185e9fcaa8aSmrgdesigner may wish to refer to the left arrow key on a PC keyboard using the
186e9fcaa8aSmrgISO9995-5 positional specification of A31 or using the functional specification
1870f8248bfSmrgof LEFT. The
1880f8248bfSmrg<structfield>key_aliases</structfield>
1890f8248bfSmrgfield holds a variable-length array of real and alias key name pairs, and the
1900f8248bfSmrgtotal number of entries in the
1910f8248bfSmrg<structfield>key_aliases</structfield>
1920f8248bfSmrgarray is held in
1930f8248bfSmrg<structfield>num_key_aliases</structfield>.
1940f8248bfSmrgFor each real and alias key name pair, the
1950f8248bfSmrg<structfield>real</structfield>
1960f8248bfSmrgfield refers to the a name in the keys array, and the
1970f8248bfSmrg<structfield>alias</structfield>
1980f8248bfSmrgfield refers to the alias for that key. Using the previous example, the
199e9fcaa8aSmrgkeyboard designer may use the name A31 in the keys array, but also define the
2000f8248bfSmrgname LEFT as an alias for A31 in the
2010f8248bfSmrg<structfield>key_aliases</structfield>
2020f8248bfSmrgarray.
203e9fcaa8aSmrg</para>
204e9fcaa8aSmrg
205e9fcaa8aSmrg<note><para>Key aliases defined in the geometry component of a keyboard mapping
2060f8248bfSmrg(see <xref linkend="Keyboard_Geometry" />) override those defined in the keycodes component of the server
2070f8248bfSmrgdatabase, which are stored in the
2080f8248bfSmrg<structname>XkbNamesRec</structname>
2090f8248bfSmrg
2100f8248bfSmrg(<structfield>xkb-&gt;names</structfield>).
2110f8248bfSmrgTherefore, consider the key aliases defined by the geometry before
2120f8248bfSmrgconsidering key aliases supplied by the
2130f8248bfSmrg<structname>XkbNamesRec</structname>.
2140f8248bfSmrg</para></note>
215e9fcaa8aSmrg
216e9fcaa8aSmrg<para>
217e9fcaa8aSmrgA radio group is a set of keys whose behavior simulates a set of radio buttons.
218e9fcaa8aSmrgOnce a key in a radio group is pressed, it stays logically depressed until
219e9fcaa8aSmrganother key in the group is pressed, at which point the previously depressed
220e9fcaa8aSmrgkey is logically released. Consequently, at most one key in a radio group can
221e9fcaa8aSmrgbe logically depressed at one time.
222e9fcaa8aSmrg</para>
223e9fcaa8aSmrg
224e9fcaa8aSmrg
225e9fcaa8aSmrg<para>
226e9fcaa8aSmrgEach radio group in the keyboard description can have a name. These names are
2270f8248bfSmrgheld in the variable-length array
2280f8248bfSmrg<structfield>radio_groups</structfield>,
2290f8248bfSmrgand
2300f8248bfSmrg<structfield>num_rg</structfield>
2310f8248bfSmrgtells how many elements are in the
2320f8248bfSmrg<structfield>radio_groups</structfield>
2330f8248bfSmrgarray.
234e9fcaa8aSmrg</para>
235e9fcaa8aSmrg
236e9fcaa8aSmrg
237e9fcaa8aSmrg</sect1>
238eb411b4bSmrg<sect1 id='Symbolic_Names_Masks'>
239e9fcaa8aSmrg<title>Symbolic Names Masks</title>
240e9fcaa8aSmrg
241e9fcaa8aSmrg<para>
242e9fcaa8aSmrgXkb provides several functions that work with symbolic names. Each of these
243e9fcaa8aSmrgfunctions uses a mask to specify individual fields of the structures described
244e9fcaa8aSmrgabove. These masks and their relationships to the fields in a keyboard
2450f8248bfSmrgdescription are shown in <link linkend="table18.1">Table 18.1</link>.
246e9fcaa8aSmrg</para>
247e9fcaa8aSmrg
2480f8248bfSmrg<table id='table18.1' frame='topbot'>
249e9fcaa8aSmrg<title>Symbolic Names Masks</title>
250eb411b4bSmrg<?dbfo keep-together="always" ?>
251eb411b4bSmrg<tgroup cols='4' align='left' colsep='0' rowsep='0'>
252eb411b4bSmrg<colspec colname='c1' colwidth='3.0*'/>
253eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
254eb411b4bSmrg<colspec colname='c3' colwidth='1.5*'/>
255eb411b4bSmrg<colspec colname='c4' colwidth='2.0*'/>
256e9fcaa8aSmrg<thead>
257eb411b4bSmrg<row rowsep='1'>
258e9fcaa8aSmrg  <entry>Mask Bit</entry>
259e9fcaa8aSmrg  <entry>Value</entry>
260e9fcaa8aSmrg  <entry>Keyboard Component</entry>
261e9fcaa8aSmrg  <entry>Field</entry>
262e9fcaa8aSmrg</row>
263e9fcaa8aSmrg</thead>
264e9fcaa8aSmrg<tbody>
265eb411b4bSmrg<row>
2660f8248bfSmrg    <entry><symbol>XkbKeycodesNameMask</symbol></entry>
267e9fcaa8aSmrg    <entry>(1&lt;&lt;0)</entry>
268e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
269e9fcaa8aSmrg    <entry>keycodes</entry>
270e9fcaa8aSmrg</row>
271eb411b4bSmrg<row>
2720f8248bfSmrg    <entry><symbol>XkbGeometryNameMask</symbol></entry>
273e9fcaa8aSmrg    <entry>(1&lt;&lt;1)</entry>
274e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
275e9fcaa8aSmrg    <entry>geometry</entry>
276e9fcaa8aSmrg</row>
277eb411b4bSmrg<row>
2780f8248bfSmrg    <entry><symbol>XkbSymbolsNameMask</symbol></entry>
279e9fcaa8aSmrg    <entry>(1&lt;&lt;2)</entry>
280e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
281e9fcaa8aSmrg    <entry>symbols</entry>
282e9fcaa8aSmrg</row>
283eb411b4bSmrg<row>
2840f8248bfSmrg    <entry><symbol>XkbPhysSymbolsNameMask</symbol></entry>
285e9fcaa8aSmrg    <entry>(1&lt;&lt;3)</entry>
286e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
287e9fcaa8aSmrg    <entry>phys_symbols</entry>
288e9fcaa8aSmrg</row>
289eb411b4bSmrg<row>
2900f8248bfSmrg    <entry><symbol>XkbTypesNameMask</symbol></entry>
291e9fcaa8aSmrg    <entry>(1&lt;&lt;4)</entry>
292e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
293e9fcaa8aSmrg    <entry>type</entry>
294e9fcaa8aSmrg</row>
295eb411b4bSmrg<row>
2960f8248bfSmrg    <entry><symbol>XkbCompatNameMask</symbol></entry>
297e9fcaa8aSmrg    <entry>(1&lt;&lt;5)</entry>
298e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
299e9fcaa8aSmrg    <entry>compat</entry>
300e9fcaa8aSmrg</row>
301eb411b4bSmrg<row>
3020f8248bfSmrg    <entry><symbol>XkbKeyTypeNamesMask</symbol></entry>
303e9fcaa8aSmrg    <entry>(1&lt;&lt;6)</entry>
304e9fcaa8aSmrg    <entry>Xkb-&gt;map</entry>
305e9fcaa8aSmrg    <entry>type[*].name</entry>
306e9fcaa8aSmrg</row>
307eb411b4bSmrg<row>
3080f8248bfSmrg    <entry><symbol>XkbKTLevelNamesMask</symbol></entry>
309e9fcaa8aSmrg    <entry>(1&lt;&lt;7)</entry>
310e9fcaa8aSmrg    <entry>Xkb-&gt;map</entry>
311e9fcaa8aSmrg    <entry>type[*].lvl_names[*]</entry>
312e9fcaa8aSmrg</row>
313eb411b4bSmrg<row>
3140f8248bfSmrg    <entry><symbol>XkbIndicatorNamesMask</symbol></entry>
315e9fcaa8aSmrg    <entry>(1&lt;&lt;8)</entry>
316e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
317e9fcaa8aSmrg    <entry>indicators[*]</entry>
318e9fcaa8aSmrg</row>
319eb411b4bSmrg<row>
3200f8248bfSmrg    <entry><symbol>XkbKeyNamesMask</symbol></entry>
321e9fcaa8aSmrg    <entry>(1&lt;&lt;9)</entry>
322e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
323e9fcaa8aSmrg    <entry>keys[*], num_keys</entry>
324e9fcaa8aSmrg</row>
325eb411b4bSmrg<row>
3260f8248bfSmrg    <entry><symbol>XkbKeyAliasesMask</symbol></entry>
327e9fcaa8aSmrg    <entry>(1&lt;&lt;10)</entry>
328e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
329e9fcaa8aSmrg    <entry>key_aliases[*], num_key_aliases</entry>
330e9fcaa8aSmrg</row>
331eb411b4bSmrg<row>
3320f8248bfSmrg    <entry><symbol>XkbVirtualModNamesMask</symbol></entry>
333e9fcaa8aSmrg    <entry>(1&lt;&lt;11)</entry>
334e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
335e9fcaa8aSmrg    <entry>vmods[*]</entry>
336e9fcaa8aSmrg</row>
337eb411b4bSmrg<row>
3380f8248bfSmrg    <entry><symbol>XkbGroupNamesMask</symbol></entry>
339e9fcaa8aSmrg    <entry>(1&lt;&lt;12)</entry>
340e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
341e9fcaa8aSmrg    <entry>groups[*]</entry>
342e9fcaa8aSmrg</row>
343eb411b4bSmrg<row>
3440f8248bfSmrg    <entry><symbol>XkbRGNamesMask</symbol></entry>
345e9fcaa8aSmrg    <entry>(1&lt;&lt;13)</entry>
346e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
347e9fcaa8aSmrg    <entry>radio_groups[*], num_rg</entry>
348e9fcaa8aSmrg</row>
349eb411b4bSmrg<row>
3500f8248bfSmrg    <entry><symbol>XkbComponentNamesMask</symbol></entry>
351e9fcaa8aSmrg    <entry>(0x3f)</entry>
352e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
353e9fcaa8aSmrg    <entry>
354e9fcaa8aSmrg<para>keycodes,</para>
355e9fcaa8aSmrg<para>geometry,</para>
356e9fcaa8aSmrg<para>symbols,</para>
357e9fcaa8aSmrg<para>physical symbols,</para>
358e9fcaa8aSmrg<para>types, and</para>
359e9fcaa8aSmrg<para>compatibility map</para>
360e9fcaa8aSmrg    </entry>
361e9fcaa8aSmrg</row>
362eb411b4bSmrg<row>
3630f8248bfSmrg    <entry><symbol>XkbAllNamesMask</symbol></entry>
364e9fcaa8aSmrg    <entry>(0x3fff)</entry>
365e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
366e9fcaa8aSmrg    <entry>all name components</entry>
367e9fcaa8aSmrg  </row>
368e9fcaa8aSmrg</tbody>
369e9fcaa8aSmrg</tgroup>
370e9fcaa8aSmrg</table>
371e9fcaa8aSmrg
372e9fcaa8aSmrg</sect1>
373eb411b4bSmrg<sect1 id='Getting_Symbolic_Names_From_the_Server'>
374e9fcaa8aSmrg<title>Getting Symbolic Names From the Server</title>
375e9fcaa8aSmrg
376e9fcaa8aSmrg<para>
3770f8248bfSmrgTo obtain symbolic names from the server, use
3780f8248bfSmrg<function>XkbGetNames</function>.
379e9fcaa8aSmrg</para>
380e9fcaa8aSmrg
3810f8248bfSmrg<indexterm significance="preferred" zone="XkbGetNames"><primary><function>XkbGetNames</function></primary></indexterm>
3820f8248bfSmrg<funcsynopsis id="XkbGetNames">
3830f8248bfSmrg  <funcprototype>
3840f8248bfSmrg    <funcdef>Status <function>XkbGetNames</function></funcdef>
3850f8248bfSmrg<!-- (
3860f8248bfSmrg<parameter>dpy, which, Xkb</parameter>
3870f8248bfSmrg) -->
3880f8248bfSmrg
3890f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
3900f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
3910f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
3920f8248bfSmrg  </funcprototype>
3930f8248bfSmrg</funcsynopsis>
3940f8248bfSmrg<variablelist>
3950f8248bfSmrg  <varlistentry>
3960f8248bfSmrg    <term>
3970f8248bfSmrg      <parameter>dpy</parameter>
3980f8248bfSmrg    </term>
3990f8248bfSmrg    <listitem>
4000f8248bfSmrg      <para>
4010f8248bfSmrg        connection to the X server
4020f8248bfSmrg      </para>
4030f8248bfSmrg    </listitem>
4040f8248bfSmrg  </varlistentry>
4050f8248bfSmrg  <varlistentry>
4060f8248bfSmrg    <term>
4070f8248bfSmrg      <parameter>which</parameter>
4080f8248bfSmrg    </term>
4090f8248bfSmrg    <listitem>
4100f8248bfSmrg      <para>
4110f8248bfSmrg        mask of names or map components to be updated
4120f8248bfSmrg      </para>
4130f8248bfSmrg    </listitem>
4140f8248bfSmrg  </varlistentry>
4150f8248bfSmrg  <varlistentry>
4160f8248bfSmrg    <term>
4170f8248bfSmrg      <parameter>xkb</parameter>
4180f8248bfSmrg    </term>
4190f8248bfSmrg    <listitem>
4200f8248bfSmrg      <para>
4210f8248bfSmrg        keyboard description to be updated
4220f8248bfSmrg      </para>
4230f8248bfSmrg    </listitem>
4240f8248bfSmrg  </varlistentry>
4250f8248bfSmrg</variablelist>
426e9fcaa8aSmrg
427e9fcaa8aSmrg<para>
4280f8248bfSmrg<function>XkbGetNames</function>
4290f8248bfSmrgretrieves symbolic names for the components of the keyboard extension from the
4300f8248bfSmrgX server. The
4310f8248bfSmrg<parameter>which</parameter>
4320f8248bfSmrgparameter specifies the name components to be updated in the
4330f8248bfSmrg<parameter>xkb</parameter>
4340f8248bfSmrgparameter, and is the bitwise inclusive OR of the valid names mask bits
4350f8248bfSmrgdefined in <link linkend="table18.1">Table 18.1</link>.
436e9fcaa8aSmrg</para>
437e9fcaa8aSmrg
438e9fcaa8aSmrg
439e9fcaa8aSmrg<para>
4400f8248bfSmrgIf the
4410f8248bfSmrg<structfield>names</structfield>
4420f8248bfSmrgfield of the keyboard description
4430f8248bfSmrg<parameter>xkb</parameter>
4440f8248bfSmrgis
4450f8248bfSmrg<symbol>NULL</symbol>,
4460f8248bfSmrg<function>XkbGetNames</function>
4470f8248bfSmrgallocates and initializes the
4480f8248bfSmrg<structfield>names</structfield>
4490f8248bfSmrgcomponent of the keyboard description before obtaining the values specified by
4500f8248bfSmrg<parameter>which</parameter>.
4510f8248bfSmrgIf the
4520f8248bfSmrg<structfield>names</structfield>
4530f8248bfSmrgfield of
4540f8248bfSmrg<parameter>xkb</parameter>
4550f8248bfSmrgis not
4560f8248bfSmrg<symbol>NULL</symbol>,
4570f8248bfSmrg<function>XkbGetNames</function>
4580f8248bfSmrgobtains the values specified by
4590f8248bfSmrg<parameter>which</parameter>
4600f8248bfSmrgand copies them into the keyboard description
4610f8248bfSmrg<parameter>xkb</parameter>.
462e9fcaa8aSmrg</para>
463e9fcaa8aSmrg
464e9fcaa8aSmrg
465e9fcaa8aSmrg<para>
4660f8248bfSmrgIf the
4670f8248bfSmrg<structfield>map</structfield>
4680f8248bfSmrgcomponent of the
4690f8248bfSmrg<parameter>xkb</parameter>
4700f8248bfSmrgparameter is
4710f8248bfSmrg<symbol>NULL</symbol>,
4720f8248bfSmrg<function>XkbGetNames</function>
4730f8248bfSmrgdoes not retrieve type or shift level names, even if
4740f8248bfSmrg<symbol>XkbKeyTypeNamesMask</symbol>
4750f8248bfSmrgor
4760f8248bfSmrg<symbol>XkbKTLevelNamesMask</symbol>
4770f8248bfSmrgare set in
4780f8248bfSmrg<parameter>which</parameter>.
479e9fcaa8aSmrg</para>
480e9fcaa8aSmrg
481e9fcaa8aSmrg
482e9fcaa8aSmrg<para>
4830f8248bfSmrg<function>XkbGetNames</function>
4840f8248bfSmrgcan return
4850f8248bfSmrg<symbol>Success</symbol>,
4860f8248bfSmrgor
4870f8248bfSmrg<errorname>BadAlloc</errorname>,
4880f8248bfSmrg<errorname>BadLength</errorname>,
4890f8248bfSmrg<errorname>BadMatch</errorname>,
4900f8248bfSmrgand
4910f8248bfSmrg<errorname>BadImplementation</errorname>
4920f8248bfSmrgerrors.
493e9fcaa8aSmrg</para>
494e9fcaa8aSmrg
495e9fcaa8aSmrg
496e9fcaa8aSmrg<para>
4970f8248bfSmrgTo free symbolic names, use
4980f8248bfSmrg<function>XkbFreeNames</function>
4990f8248bfSmrg(see <link linkend="Allocating_and_Freeing_Symbolic_Names">section 18.6</link>)
500e9fcaa8aSmrg</para>
501e9fcaa8aSmrg
502e9fcaa8aSmrg
503e9fcaa8aSmrg</sect1>
504eb411b4bSmrg<sect1 id='Changing_Symbolic_Names_on_the_Server'>
505e9fcaa8aSmrg<title>Changing Symbolic Names on the Server</title>
506e9fcaa8aSmrg
507e9fcaa8aSmrg<para>
508e9fcaa8aSmrgTo change the symbolic names in the server, first modify a local copy of the
5090f8248bfSmrgkeyboard description and then use either
5100f8248bfSmrg<function>XkbSetNames</function>,
5110f8248bfSmrgor, to save network traffic, use a
5120f8248bfSmrg<structname>XkbNameChangesRec</structname>
5130f8248bfSmrgstructure and call
5140f8248bfSmrg<function>XkbChangeNames</function>
5150f8248bfSmrgto download the changes to the server.
5160f8248bfSmrg<function>XkbSetNames</function>
5170f8248bfSmrgand
5180f8248bfSmrg<function>XkbChangeNames</function>
5190f8248bfSmrgcan generate
5200f8248bfSmrg<errorname>BadAlloc</errorname>,
5210f8248bfSmrg<errorname>BadAtom</errorname>,
5220f8248bfSmrg<errorname>BadLength</errorname>,
5230f8248bfSmrg<errorname>BadMatch</errorname>,
5240f8248bfSmrgand
5250f8248bfSmrg<errorname>BadImplementation</errorname>
5260f8248bfSmrgerrors.
527e9fcaa8aSmrg</para>
528e9fcaa8aSmrg
5290f8248bfSmrg<indexterm significance="preferred" zone="XkbSetNames"><primary><function>XkbSetNames</function></primary></indexterm>
5300f8248bfSmrg<funcsynopsis id="XkbSetNames">
5310f8248bfSmrg  <funcprototype>
5320f8248bfSmrg    <funcdef>Bool <function>XkbSetNames</function></funcdef>
5330f8248bfSmrg<!-- (
5340f8248bfSmrg<parameter>dpy, which, first_type, num_types, xkb</parameter>
5350f8248bfSmrg) -->
5360f8248bfSmrg
5370f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
5380f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
5390f8248bfSmrg    <paramdef>unsigned int <parameter>first_type</parameter></paramdef>
5400f8248bfSmrg    <paramdef>unsigned int <parameter>num_types</parameter></paramdef>
5410f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
5420f8248bfSmrg  </funcprototype>
5430f8248bfSmrg</funcsynopsis>
5440f8248bfSmrg<variablelist>
5450f8248bfSmrg  <varlistentry>
5460f8248bfSmrg    <term>
5470f8248bfSmrg      <parameter>dpy</parameter>
5480f8248bfSmrg    </term>
5490f8248bfSmrg    <listitem>
5500f8248bfSmrg      <para>
5510f8248bfSmrg        connection to the X server
5520f8248bfSmrg      </para>
5530f8248bfSmrg    </listitem>
5540f8248bfSmrg  </varlistentry>
5550f8248bfSmrg  <varlistentry>
5560f8248bfSmrg    <term>
5570f8248bfSmrg      <parameter>which</parameter>
5580f8248bfSmrg    </term>
5590f8248bfSmrg    <listitem>
5600f8248bfSmrg      <para>
5610f8248bfSmrg        mask of names or map components to be changed
5620f8248bfSmrg      </para>
5630f8248bfSmrg    </listitem>
5640f8248bfSmrg  </varlistentry>
5650f8248bfSmrg  <varlistentry>
5660f8248bfSmrg    <term>
5670f8248bfSmrg      <parameter>first_type</parameter>
5680f8248bfSmrg    </term>
5690f8248bfSmrg    <listitem>
5700f8248bfSmrg      <para>
5710f8248bfSmrg        first type whose name is to be changed
5720f8248bfSmrg      </para>
5730f8248bfSmrg    </listitem>
5740f8248bfSmrg  </varlistentry>
5750f8248bfSmrg  <varlistentry>
5760f8248bfSmrg    <term>
5770f8248bfSmrg      <parameter>num_types</parameter>
5780f8248bfSmrg    </term>
5790f8248bfSmrg    <listitem>
5800f8248bfSmrg      <para>
5810f8248bfSmrg        number of types for which names are to be changed
5820f8248bfSmrg      </para>
5830f8248bfSmrg    </listitem>
5840f8248bfSmrg  </varlistentry>
5850f8248bfSmrg  <varlistentry>
5860f8248bfSmrg    <term>
5870f8248bfSmrg      <parameter>xkb</parameter>
5880f8248bfSmrg    </term>
5890f8248bfSmrg    <listitem>
5900f8248bfSmrg      <para>
5910f8248bfSmrg        keyboard description from which names are to be taken
5920f8248bfSmrg      </para>
5930f8248bfSmrg    </listitem>
5940f8248bfSmrg  </varlistentry>
5950f8248bfSmrg</variablelist>
596e9fcaa8aSmrg
597e9fcaa8aSmrg<para>
5980f8248bfSmrgUse
5990f8248bfSmrg<function>XkbSetNames</function>
6000f8248bfSmrgto change many names at the same time. For each bit set in
6010f8248bfSmrg<parameter>which</parameter>,
6020f8248bfSmrg<function>XkbSetNames</function>
6030f8248bfSmrgtakes the corresponding value (or values in the case of arrays) from the
6040f8248bfSmrgkeyboard description
6050f8248bfSmrg<parameter>xkb</parameter>
6060f8248bfSmrgand sends it to the server.
607e9fcaa8aSmrg</para>
608e9fcaa8aSmrg
609e9fcaa8aSmrg
610e9fcaa8aSmrg<para>
6110f8248bfSmrgThe
6120f8248bfSmrg<parameter>first_type</parameter>
6130f8248bfSmrgand
6140f8248bfSmrg<parameter>num_types</parameter>
6150f8248bfSmrgarguments are used only if
6160f8248bfSmrg<symbol>XkbKeyTypeNamesMask</symbol>
6170f8248bfSmrgor
6180f8248bfSmrg<symbol>XkbKTLevelNamesMask</symbol>
6190f8248bfSmrgis set in
6200f8248bfSmrg<parameter>which</parameter>
6210f8248bfSmrgand specify a subset of the types for which the corresponding names are to be
622e9fcaa8aSmrgchanged. If either or both of these mask bits are set but the specified types
6230f8248bfSmrgare illegal,
6240f8248bfSmrg<function>XkbSetNames</function>
6250f8248bfSmrgreturns
6260f8248bfSmrg<symbol>False</symbol>
6270f8248bfSmrgand does not update any of the names specified in
6280f8248bfSmrg<parameter>which</parameter>.
6290f8248bfSmrgThe specified types are illegal if
6300f8248bfSmrg<parameter>xkb</parameter>
6310f8248bfSmrgdoes not include a map component or if
6320f8248bfSmrg<parameter>first_type</parameter>
6330f8248bfSmrgand
6340f8248bfSmrg<parameter>num_types</parameter>
6350f8248bfSmrgspecify types that are not defined in the keyboard description.
636e9fcaa8aSmrg</para>
637e9fcaa8aSmrg
638e9fcaa8aSmrg
639e9fcaa8aSmrg<sect2>
640e9fcaa8aSmrg<title/>
641e9fcaa8aSmrg
642eb411b4bSmrg<sect3 id='The_XkbNameChangesRec_Structure'>
643e9fcaa8aSmrg<title>The XkbNameChangesRec Structure</title>
6440f8248bfSmrg<indexterm significance="preferred" zone="The_XkbNameChangesRec_Structure">
6450f8248bfSmrg<primary><structname>XkbNameChangesRec</structname></primary></indexterm>
646e9fcaa8aSmrg
647e9fcaa8aSmrg<para>
6480f8248bfSmrgThe
6490f8248bfSmrg<structname>XkbNameChangesRec</structname>
6500f8248bfSmrgallows applications to identify small modifications to the symbolic names and
651e9fcaa8aSmrgeffectively reduces the amount of traffic sent to the server:
652e9fcaa8aSmrg
6530f8248bfSmrg<programlisting>
654e9fcaa8aSmrgtypedef struct _XkbNameChanges {
6550f8248bfSmrg    unsigned int       changed;           /* name components that have
6560f8248bfSmrg                                             changed */
6570f8248bfSmrg    unsigned char      first_type;        /* first key type with a new name */
6580f8248bfSmrg    unsigned char      num_types;         /* number of types with new names */
6590f8248bfSmrg    unsigned char      first_lvl;         /* first key type with new level
6600f8248bfSmrg                                             names */
6610f8248bfSmrg    unsigned char      num_lvls;          /* number of key types with new
6620f8248bfSmrg                                             level names */
6630f8248bfSmrg    unsigned char      num_aliases;       /* if key aliases changed,
6640f8248bfSmrg                                             total number of key aliases */
6650f8248bfSmrg    unsigned char      num_rg;            /* if radio groups changed, total
6660f8248bfSmrg                                             number of radio groups */
6670f8248bfSmrg    unsigned char      first_key;         /* first key with a new name */
6680f8248bfSmrg    unsigned char      num_keys;          /* number of keys with new names */
6690f8248bfSmrg    unsigned short     changed_vmods;     /* mask of virtual modifiers
6700f8248bfSmrg                                             for which names have changed */
6710f8248bfSmrg    unsigned long      changed_indicators;  /* mask of indicators
6720f8248bfSmrg                                               for which names were changed */
6730f8248bfSmrg    unsigned char      changed_groups;    /* mask of groups for
6740f8248bfSmrg                                             which names were changed */
6750f8248bfSmrg} <structname>XkbNameChangesRec</structname>, *XkbNameChangesPtr;
676e9fcaa8aSmrg</programlisting></para>
677e9fcaa8aSmrg
678e9fcaa8aSmrg<para>
6790f8248bfSmrgThe
6800f8248bfSmrg<structfield>changed</structfield>
6810f8248bfSmrgfield specifies the name components that have changed and is the bitwise
6820f8248bfSmrginclusive OR of the valid names mask bits defined in
6830f8248bfSmrg<link linkend="table18.1">Table 18.1</link>. The rest of
684e9fcaa8aSmrgthe fields in the structure specify the ranges that have changed for the
6850f8248bfSmrgvarious kinds of symbolic names, as shown in
6860f8248bfSmrg<link linkend="table18.2">Table 18.2</link>.
687e9fcaa8aSmrg</para>
688e9fcaa8aSmrg
6890f8248bfSmrg<table id='table18.2' frame='topbot'>
690e9fcaa8aSmrg<title>XkbNameChanges Fields</title>
691eb411b4bSmrg<?dbfo keep-together="always" ?>
692eb411b4bSmrg<tgroup cols='4' align='left' colsep='0' rowsep='0'>
693eb411b4bSmrg<colspec colname='c1' colwidth='2.0*'/>
694eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
695eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/>
696eb411b4bSmrg<colspec colname='c4' colwidth='2.0*'/>
697e9fcaa8aSmrg<thead>
698eb411b4bSmrg<row rowsep='1'>
699e9fcaa8aSmrg  <entry>Mask</entry>
700e9fcaa8aSmrg  <entry>Fields</entry>
701e9fcaa8aSmrg  <entry>Component</entry>
702e9fcaa8aSmrg  <entry>Field</entry>
703e9fcaa8aSmrg</row>
704e9fcaa8aSmrg</thead>
705e9fcaa8aSmrg<tbody>
706eb411b4bSmrg<row>
7070f8248bfSmrg    <entry><symbol>XkbKeyTypeNamesMask</symbol></entry>
708e9fcaa8aSmrg    <entry>
709e9fcaa8aSmrg<para>first_type,</para>
710e9fcaa8aSmrg<para>num_types</para>
711e9fcaa8aSmrg    </entry>
712e9fcaa8aSmrg    <entry>Xkb-&gt;map</entry>
713e9fcaa8aSmrg    <entry>type[*].name</entry>
714e9fcaa8aSmrg</row>
715eb411b4bSmrg<row>
7160f8248bfSmrg    <entry><symbol>XkbKTLevelNamesMask</symbol></entry>
717e9fcaa8aSmrg    <entry>
718e9fcaa8aSmrg<para>first_lvl,</para>
719e9fcaa8aSmrg<para>num_lvls</para>
720e9fcaa8aSmrg    </entry>
721e9fcaa8aSmrg    <entry>Xkb-&gt;map</entry>
722e9fcaa8aSmrg    <entry>type[*].lvl_names[*]</entry>
723e9fcaa8aSmrg</row>
724eb411b4bSmrg<row>
7250f8248bfSmrg    <entry><symbol>XkbKeyAliasesMask</symbol></entry>
726e9fcaa8aSmrg    <entry>num_aliases</entry>
727e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
728e9fcaa8aSmrg    <entry>key_aliases[*]</entry>
729e9fcaa8aSmrg</row>
730eb411b4bSmrg<row>
7310f8248bfSmrg    <entry><symbol>XkbRGNamesMask</symbol></entry>
732e9fcaa8aSmrg    <entry>num_rg</entry>
733e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
734e9fcaa8aSmrg    <entry>radio_groups[*]</entry>
735e9fcaa8aSmrg</row>
736eb411b4bSmrg<row>
7370f8248bfSmrg    <entry><symbol>XkbKeyNamesMask</symbol></entry>
738e9fcaa8aSmrg    <entry>
739e9fcaa8aSmrg<para>first_key,</para>
740e9fcaa8aSmrg<para>num_keys</para>
741e9fcaa8aSmrg    </entry>
742e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
743e9fcaa8aSmrg    <entry>keys[*]</entry>
744e9fcaa8aSmrg</row>
745eb411b4bSmrg<row>
7460f8248bfSmrg    <entry><symbol>XkbVirtualModNamesMask</symbol></entry>
747e9fcaa8aSmrg    <entry>changed_vmods</entry>
748e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
749e9fcaa8aSmrg    <entry>vmods[*]</entry>
750e9fcaa8aSmrg</row>
751eb411b4bSmrg<row>
7520f8248bfSmrg    <entry><symbol>XkbIndicatorNamesMask</symbol></entry>
753e9fcaa8aSmrg    <entry>changed_indicators</entry>
754e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
755e9fcaa8aSmrg    <entry>indicators[*]</entry>
756e9fcaa8aSmrg</row>
757eb411b4bSmrg<row>
7580f8248bfSmrg    <entry><symbol>XkbGroupNamesMask</symbol></entry>
759e9fcaa8aSmrg    <entry>changed_groups</entry>
760e9fcaa8aSmrg    <entry>Xkb-&gt;names</entry>
761e9fcaa8aSmrg    <entry>groups[*]</entry>
762e9fcaa8aSmrg  </row>
763e9fcaa8aSmrg</tbody>
764e9fcaa8aSmrg</tgroup>
765e9fcaa8aSmrg</table>
766e9fcaa8aSmrg
767e9fcaa8aSmrg<para>
7680f8248bfSmrg<function>XkbChangeNames</function>
7690f8248bfSmrgprovides a more flexible method for changing symbolic names than
7700f8248bfSmrg<function>XkbSetNames</function>
7710f8248bfSmrgand requires the use of an
7720f8248bfSmrg<structname>XkbNameChangesRec</structname>
7730f8248bfSmrgstructure.
774e9fcaa8aSmrg</para>
775e9fcaa8aSmrg
7760f8248bfSmrg<indexterm significance="preferred" zone="XkbChangeNames"><primary><function>XkbChangeNames</function></primary></indexterm>
7770f8248bfSmrg<funcsynopsis id="XkbChangeNames">
7780f8248bfSmrg  <funcprototype>
7790f8248bfSmrg    <funcdef>Bool <function>XkbChangeNames</function></funcdef>
7800f8248bfSmrg<!-- (
7810f8248bfSmrg<parameter>dpy, xkb, changes</parameter>
7820f8248bfSmrg) -->
7830f8248bfSmrg
7840f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
7850f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
7860f8248bfSmrg    <paramdef>XkbNameChangesPtr <parameter>changes</parameter></paramdef>
7870f8248bfSmrg  </funcprototype>
7880f8248bfSmrg</funcsynopsis>
7890f8248bfSmrg<variablelist>
7900f8248bfSmrg  <varlistentry>
7910f8248bfSmrg    <term>
7920f8248bfSmrg      <parameter>dpy</parameter>
7930f8248bfSmrg    </term>
7940f8248bfSmrg    <listitem>
7950f8248bfSmrg      <para>
7960f8248bfSmrg        connection to the X server
7970f8248bfSmrg      </para>
7980f8248bfSmrg    </listitem>
7990f8248bfSmrg  </varlistentry>
8000f8248bfSmrg  <varlistentry>
8010f8248bfSmrg    <term>
8020f8248bfSmrg      <parameter>xkb</parameter>
8030f8248bfSmrg    </term>
8040f8248bfSmrg    <listitem>
8050f8248bfSmrg      <para>
8060f8248bfSmrg        keyboard description from which names are to be taken
8070f8248bfSmrg      </para>
8080f8248bfSmrg    </listitem>
8090f8248bfSmrg  </varlistentry>
8100f8248bfSmrg  <varlistentry>
8110f8248bfSmrg    <term>
8120f8248bfSmrg      <parameter>changes</parameter>
8130f8248bfSmrg    </term>
8140f8248bfSmrg    <listitem>
8150f8248bfSmrg      <para>
8160f8248bfSmrg        names map components to be updated on the server
8170f8248bfSmrg      </para>
8180f8248bfSmrg    </listitem>
8190f8248bfSmrg  </varlistentry>
8200f8248bfSmrg</variablelist>
821e9fcaa8aSmrg
822e9fcaa8aSmrg<para>
8230f8248bfSmrg<function>XkbChangeNames</function>
8240f8248bfSmrgcopies any names specified by
8250f8248bfSmrg<parameter>changes</parameter>
8260f8248bfSmrgfrom the keyboard description,
8270f8248bfSmrg<parameter>xkb</parameter>,
8280f8248bfSmrgto the X server specified by
8290f8248bfSmrg<parameter>dpy</parameter>.
8300f8248bfSmrg<function>XkbChangeNames</function>
8310f8248bfSmrgaborts and returns
8320f8248bfSmrg<symbol>False</symbol>
8330f8248bfSmrgif any illegal type names or type shift level names are specified by
8340f8248bfSmrg<parameter>changes</parameter>.
835e9fcaa8aSmrg</para>
836e9fcaa8aSmrg
837e9fcaa8aSmrg</sect3>
838e9fcaa8aSmrg</sect2>
839e9fcaa8aSmrg</sect1>
840eb411b4bSmrg<sect1 id='Tracking_Name_Changes'>
841e9fcaa8aSmrg<title>Tracking Name Changes</title>
8420f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Name_Changes">
8430f8248bfSmrg<primary>events</primary><secondary><symbol>XkbNamesNotify</symbol></secondary></indexterm>
8440f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Name_Changes">
8450f8248bfSmrg<primary><structname>XkbNamesNotifyEvent</structname></primary></indexterm>
846e9fcaa8aSmrg
847e9fcaa8aSmrg<para>
848e9fcaa8aSmrgWhenever a symbolic name changes in the server’s keyboard description, the
8490f8248bfSmrgserver sends a
8500f8248bfSmrg<symbol>XkbNamesNotify</symbol>
8510f8248bfSmrgevent to all interested clients. To receive name notify events, use
8520f8248bfSmrg<function>XkbSelectEvents</function>
8530f8248bfSmrg(see <link linkend="Selecting_Xkb_Events">section 4.3</link>) with
8540f8248bfSmrg<symbol>XkbNamesNotifyMask</symbol>
8550f8248bfSmrgin both the
8560f8248bfSmrg<parameter>bits_to_change</parameter>
8570f8248bfSmrgand
8580f8248bfSmrg<parameter>values_for_bits</parameter>
8590f8248bfSmrgparameters.
860e9fcaa8aSmrg</para>
861e9fcaa8aSmrg
862e9fcaa8aSmrg
863e9fcaa8aSmrg<para>
8640f8248bfSmrgTo receive events for only specific names, use
8650f8248bfSmrg<function>XkbSelectEventDetails</function>.
8660f8248bfSmrgSet the
8670f8248bfSmrg<structfield>event_type</structfield>
8680f8248bfSmrgparameter to
8690f8248bfSmrg<symbol>XkbNamesNotify</symbol>,
8700f8248bfSmrgand set both the
8710f8248bfSmrg<parameter>bits_to_change</parameter>
8720f8248bfSmrgand
8730f8248bfSmrg<parameter>values_for_bits</parameter>
8740f8248bfSmrgdetail parameter to a mask composed of a bitwise OR of masks in
8750f8248bfSmrg<link linkend="table18.1">Table 18.1</link>.
876e9fcaa8aSmrg</para>
877e9fcaa8aSmrg
878e9fcaa8aSmrg
879e9fcaa8aSmrg<para>
8800f8248bfSmrgThe structure for the
8810f8248bfSmrg<symbol>XkbNamesNotify</symbol>
8820f8248bfSmrgevent is defined as follows:
883e9fcaa8aSmrg
8840f8248bfSmrg<programlisting>
885e9fcaa8aSmrgtypedef struct {
8860f8248bfSmrg    int             type;           /* Xkb extension base event code */
8870f8248bfSmrg    unsigned long   serial;         /* X server serial number for event */
8880f8248bfSmrg    Bool            send_event;     /* <symbol>True</symbol> &rArr; synthetically generated */
8890f8248bfSmrg    Display *       display;        /* server connection where event generated */
8900f8248bfSmrg    Time            time;           /* server time when event generated */
8910f8248bfSmrg    int             xkb_type;       /* <symbol>XkbNamesNotify</symbol> */
8920f8248bfSmrg    int             device;         /* Xkb device ID, will not be
8930f8248bfSmrg                                       <symbol>XkbUseCoreKbd</symbol> */
8940f8248bfSmrg    unsigned int    changed;        /* mask of name components
8950f8248bfSmrg                                       that have changed */
8960f8248bfSmrg    int             first_type;     /* first key type with a new name */
8970f8248bfSmrg    int             num_types;      /* number of types with new names */
8980f8248bfSmrg    int             first_lvl;      /* first key type with new level names */
8990f8248bfSmrg    int             num_lvls;       /* number of key types with new level names */
9000f8248bfSmrg    int             num_aliases;    /* if key aliases changed, total number
9010f8248bfSmrg                                       of key aliases */
9020f8248bfSmrg    int             num_radio_groups;  /* if radio groups changed,
903e9fcaa8aSmrg                                         total number of radio groups */
9040f8248bfSmrg    unsigned int    changed_vmods;  /* mask of virtual modifiers for
9050f8248bfSmrg                                       which names have changed */
9060f8248bfSmrg    unsigned int    changed_groups; /* mask of groups for
9070f8248bfSmrg                                       which names were changed */
9080f8248bfSmrg    unsigned int    changed_indicators;  /* mask of indicators for which
9090f8248bfSmrg                                              names were changed */
9100f8248bfSmrg    int             first_key;      /* first key with a new name */
9110f8248bfSmrg    int             num_keys;       /* number of keys with new names */
9120f8248bfSmrg} <structname>XkbNamesNotifyEvent</structname>;
913e9fcaa8aSmrg</programlisting></para>
914e9fcaa8aSmrg
915e9fcaa8aSmrg<para>
9160f8248bfSmrgThe
9170f8248bfSmrg<structfield>changed</structfield>
9180f8248bfSmrgfield specifies the name components that have changed and is the bitwise
9190f8248bfSmrginclusive OR of the valid names mask bits defined in
9200f8248bfSmrg<link linkend="table18.1">Table 18.1</link>. The other
9210f8248bfSmrgfields in this event are interpreted as the like-named fields in an
9220f8248bfSmrg<structname>XkbNameChangesRec</structname> , as previously defined.
923e9fcaa8aSmrg</para>
924e9fcaa8aSmrg
925e9fcaa8aSmrg
926e9fcaa8aSmrg<para>
9270f8248bfSmrgWhen your application receives a
9280f8248bfSmrg<symbol>XkbNamesNotify</symbol>
9290f8248bfSmrgevent, you can note the changed names in a changes structure using
9300f8248bfSmrg<function>XkbNoteNameChanges</function>.
931e9fcaa8aSmrg</para>
932e9fcaa8aSmrg
9330f8248bfSmrg<indexterm significance="preferred" zone="XkbNoteNameChanges"><primary><function>XkbNoteNameChanges</function></primary></indexterm>
9340f8248bfSmrg<funcsynopsis id="XkbNoteNameChanges">
9350f8248bfSmrg  <funcprototype>
9360f8248bfSmrg    <funcdef>void <function>XkbNoteNameChanges</function></funcdef>
9370f8248bfSmrg<!-- (
9380f8248bfSmrg<parameter>old</parameter>,
9390f8248bfSmrg<parameter>new</parameter>,
9400f8248bfSmrg<parameter>wanted</parameter>
9410f8248bfSmrg) -->
9420f8248bfSmrg
9430f8248bfSmrg    <paramdef>XkbNameChangesPtr <parameter>old</parameter></paramdef>
9440f8248bfSmrg    <paramdef>XkbNamesNotifyEvent *<parameter>new</parameter></paramdef>
9450f8248bfSmrg    <paramdef>unsigned int <parameter>wanted</parameter></paramdef>
9460f8248bfSmrg  </funcprototype>
9470f8248bfSmrg</funcsynopsis>
9480f8248bfSmrg<variablelist>
9490f8248bfSmrg  <varlistentry>
9500f8248bfSmrg    <term>
9510f8248bfSmrg      <parameter>old</parameter>
9520f8248bfSmrg    </term>
9530f8248bfSmrg    <listitem>
9540f8248bfSmrg      <para>
9550f8248bfSmrg        <structname>XkbNameChangesRec</structname> structure to be updated
9560f8248bfSmrg      </para>
9570f8248bfSmrg    </listitem>
9580f8248bfSmrg  </varlistentry>
9590f8248bfSmrg  <varlistentry>
9600f8248bfSmrg    <term>
9610f8248bfSmrg      <parameter>new</parameter>
9620f8248bfSmrg    </term>
9630f8248bfSmrg    <listitem>
9640f8248bfSmrg      <para>
9650f8248bfSmrg        event from which changes are to be copied
9660f8248bfSmrg      </para>
9670f8248bfSmrg    </listitem>
9680f8248bfSmrg  </varlistentry>
9690f8248bfSmrg  <varlistentry>
9700f8248bfSmrg    <term>
9710f8248bfSmrg      <parameter>wanted</parameter>
9720f8248bfSmrg    </term>
9730f8248bfSmrg    <listitem>
9740f8248bfSmrg      <para>
9750f8248bfSmrg        types of names for which changes are to be noted
9760f8248bfSmrg      </para>
9770f8248bfSmrg    </listitem>
9780f8248bfSmrg  </varlistentry>
9790f8248bfSmrg</variablelist>
980e9fcaa8aSmrg
981e9fcaa8aSmrg<para>
9820f8248bfSmrgThe
9830f8248bfSmrg<parameter>wanted</parameter>
9840f8248bfSmrgparameter is the bitwise inclusive OR of the valid names mask bits shown in
9850f8248bfSmrg<link linkend="table18.1">Table 18.1</link>.
9860f8248bfSmrg<function>XkbNoteNameChanges</function>
9870f8248bfSmrgcopies any changes that are reported in
9880f8248bfSmrg<parameter>new</parameter>
9890f8248bfSmrgand specified in
9900f8248bfSmrg<parameter>wanted</parameter>
9910f8248bfSmrginto the changes record specified by
9920f8248bfSmrg<parameter>old</parameter>.
993e9fcaa8aSmrg</para>
994e9fcaa8aSmrg
995e9fcaa8aSmrg
996e9fcaa8aSmrg</sect1>
997eb411b4bSmrg<sect1 id='Allocating_and_Freeing_Symbolic_Names'>
998e9fcaa8aSmrg<title>Allocating and Freeing Symbolic Names</title>
999e9fcaa8aSmrg
1000e9fcaa8aSmrg<para>
1001e9fcaa8aSmrgMost applications do not need to directly allocate symbolic names structures.
10020f8248bfSmrgDo not allocate a names structure directly using
10030f8248bfSmrg<function>malloc</function>
10040f8248bfSmrgor
10050f8248bfSmrg<function>Xmalloc</function>
10060f8248bfSmrgif your application changes the number of key aliases or radio groups or
1007e9fcaa8aSmrgconstructs a symbolic names structure without loading the necessary components
10080f8248bfSmrgfrom the X server. Instead use
10090f8248bfSmrg<function>XkbAllocNames</function>.
1010e9fcaa8aSmrg</para>
1011e9fcaa8aSmrg
10120f8248bfSmrg<indexterm significance="preferred" zone="XkbAllocNames"><primary><function>XkbAllocNames</function></primary></indexterm>
10130f8248bfSmrg<funcsynopsis id="XkbAllocNames">
10140f8248bfSmrg  <funcprototype>
10150f8248bfSmrg    <funcdef>Status <function>XkbAllocNames</function></funcdef>
10160f8248bfSmrg<!-- (
10170f8248bfSmrg<parameter>xkb, which, num_rg, num_key_aliases)</parameter> -->
10180f8248bfSmrg
10190f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
10200f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
10210f8248bfSmrg    <paramdef>int <parameter>num_rg</parameter></paramdef>
10220f8248bfSmrg    <paramdef>int <parameter>num_key_aliases</parameter></paramdef>
10230f8248bfSmrg  </funcprototype>
10240f8248bfSmrg</funcsynopsis>
10250f8248bfSmrg<variablelist>
10260f8248bfSmrg  <varlistentry>
10270f8248bfSmrg    <term>
10280f8248bfSmrg      <parameter>xkb</parameter>
10290f8248bfSmrg    </term>
10300f8248bfSmrg    <listitem>
10310f8248bfSmrg      <para>
10320f8248bfSmrg        keyboard description for which names are to be allocated
10330f8248bfSmrg      </para>
10340f8248bfSmrg    </listitem>
10350f8248bfSmrg  </varlistentry>
10360f8248bfSmrg  <varlistentry>
10370f8248bfSmrg    <term>
10380f8248bfSmrg      <parameter>which</parameter>
10390f8248bfSmrg    </term>
10400f8248bfSmrg    <listitem>
10410f8248bfSmrg      <para>
10420f8248bfSmrg        mask of names to be allocated
10430f8248bfSmrg      </para>
10440f8248bfSmrg    </listitem>
10450f8248bfSmrg  </varlistentry>
10460f8248bfSmrg  <varlistentry>
10470f8248bfSmrg    <term>
10480f8248bfSmrg      <parameter>num_rg</parameter>
10490f8248bfSmrg    </term>
10500f8248bfSmrg    <listitem>
10510f8248bfSmrg      <para>
10520f8248bfSmrg        total number of radio group names needed
10530f8248bfSmrg      </para>
10540f8248bfSmrg    </listitem>
10550f8248bfSmrg  </varlistentry>
10560f8248bfSmrg  <varlistentry>
10570f8248bfSmrg    <term>
10580f8248bfSmrg      <parameter>num_key_aliases</parameter>
10590f8248bfSmrg    </term>
10600f8248bfSmrg    <listitem>
10610f8248bfSmrg      <para>
10620f8248bfSmrg        total number of key aliases needed
10630f8248bfSmrg      </para>
10640f8248bfSmrg    </listitem>
10650f8248bfSmrg  </varlistentry>
10660f8248bfSmrg</variablelist>
1067e9fcaa8aSmrg
1068e9fcaa8aSmrg<para>
10690f8248bfSmrg<function>XkbAllocNames</function>
10700f8248bfSmrgcan return
10710f8248bfSmrg<errorname>BadAlloc</errorname>,
10720f8248bfSmrg<errorname>BadMatch</errorname>,
10730f8248bfSmrgand
10740f8248bfSmrg<errorname>BadValue</errorname>
10750f8248bfSmrgerrors.
10760f8248bfSmrgThe
10770f8248bfSmrg<parameter>which</parameter>
10780f8248bfSmrgparameter is the bitwise inclusive OR of the valid names mask bits defined in
10790f8248bfSmrg<link linkend="table18.1">Table 18.1</link>.
1080e9fcaa8aSmrg</para>
1081e9fcaa8aSmrg
1082e9fcaa8aSmrg
1083e9fcaa8aSmrg<para>
10840f8248bfSmrgDo not free symbolic names structures directly using
10850f8248bfSmrg<function>free</function>
10860f8248bfSmrgor
10870f8248bfSmrg<function>XFree</function>.
10880f8248bfSmrgUse
10890f8248bfSmrg<function>XkbFreeNames</function>
10900f8248bfSmrginstead.
1091e9fcaa8aSmrg</para>
1092e9fcaa8aSmrg
1093e9fcaa8aSmrg
10940f8248bfSmrg<indexterm significance="preferred" zone="XkbFreeNames"><primary><function>XkbFreeNames</function></primary></indexterm>
10950f8248bfSmrg<funcsynopsis id="XkbFreeNames">
10960f8248bfSmrg  <funcprototype>
10970f8248bfSmrg    <funcdef>void <function>XkbFreeNames</function></funcdef>
10980f8248bfSmrg<!-- (
10990f8248bfSmrg<parameter>xkb, which, free_map)</parameter> -->
11000f8248bfSmrg
11010f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
11020f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
11030f8248bfSmrg    <paramdef>Bool <parameter>free_map</parameter></paramdef>
11040f8248bfSmrg  </funcprototype>
11050f8248bfSmrg</funcsynopsis>
11060f8248bfSmrg<variablelist>
11070f8248bfSmrg  <varlistentry>
11080f8248bfSmrg    <term>
11090f8248bfSmrg      <parameter>xkb</parameter>
11100f8248bfSmrg    </term>
11110f8248bfSmrg    <listitem>
11120f8248bfSmrg      <para>
11130f8248bfSmrg        keyboard description for which names are to be freed
11140f8248bfSmrg      </para>
11150f8248bfSmrg    </listitem>
11160f8248bfSmrg  </varlistentry>
11170f8248bfSmrg  <varlistentry>
11180f8248bfSmrg    <term>
11190f8248bfSmrg      <parameter>which</parameter>
11200f8248bfSmrg    </term>
11210f8248bfSmrg    <listitem>
11220f8248bfSmrg      <para>
11230f8248bfSmrg        mask of names components to be freed
11240f8248bfSmrg      </para>
11250f8248bfSmrg    </listitem>
11260f8248bfSmrg  </varlistentry>
11270f8248bfSmrg  <varlistentry>
11280f8248bfSmrg    <term>
11290f8248bfSmrg      <parameter>free_map</parameter>
11300f8248bfSmrg    </term>
11310f8248bfSmrg    <listitem>
11320f8248bfSmrg      <para>
11330f8248bfSmrg        <symbol>True</symbol>
11340f8248bfSmrg         &rArr; XkbNamesRec structure itself should be freed
11350f8248bfSmrg      </para>
11360f8248bfSmrg    </listitem>
11370f8248bfSmrg  </varlistentry>
11380f8248bfSmrg</variablelist>
1139e9fcaa8aSmrg
1140e9fcaa8aSmrg<para>
11410f8248bfSmrgThe
11420f8248bfSmrg<parameter>which</parameter>
11430f8248bfSmrgparameter is the bitwise inclusive OR of the valid names mask bits defined in
11440f8248bfSmrg<link linkend="table18.1">Table 18.1</link>.
1145e9fcaa8aSmrg</para>
1146e9fcaa8aSmrg</sect1>
1147e9fcaa8aSmrg</chapter>
1148