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->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<<0)</entry> 268e9fcaa8aSmrg <entry>Xkb->names</entry> 269e9fcaa8aSmrg <entry>keycodes</entry> 270e9fcaa8aSmrg</row> 271eb411b4bSmrg<row> 2720f8248bfSmrg <entry><symbol>XkbGeometryNameMask</symbol></entry> 273e9fcaa8aSmrg <entry>(1<<1)</entry> 274e9fcaa8aSmrg <entry>Xkb->names</entry> 275e9fcaa8aSmrg <entry>geometry</entry> 276e9fcaa8aSmrg</row> 277eb411b4bSmrg<row> 2780f8248bfSmrg <entry><symbol>XkbSymbolsNameMask</symbol></entry> 279e9fcaa8aSmrg <entry>(1<<2)</entry> 280e9fcaa8aSmrg <entry>Xkb->names</entry> 281e9fcaa8aSmrg <entry>symbols</entry> 282e9fcaa8aSmrg</row> 283eb411b4bSmrg<row> 2840f8248bfSmrg <entry><symbol>XkbPhysSymbolsNameMask</symbol></entry> 285e9fcaa8aSmrg <entry>(1<<3)</entry> 286e9fcaa8aSmrg <entry>Xkb->names</entry> 287e9fcaa8aSmrg <entry>phys_symbols</entry> 288e9fcaa8aSmrg</row> 289eb411b4bSmrg<row> 2900f8248bfSmrg <entry><symbol>XkbTypesNameMask</symbol></entry> 291e9fcaa8aSmrg <entry>(1<<4)</entry> 292e9fcaa8aSmrg <entry>Xkb->names</entry> 293e9fcaa8aSmrg <entry>type</entry> 294e9fcaa8aSmrg</row> 295eb411b4bSmrg<row> 2960f8248bfSmrg <entry><symbol>XkbCompatNameMask</symbol></entry> 297e9fcaa8aSmrg <entry>(1<<5)</entry> 298e9fcaa8aSmrg <entry>Xkb->names</entry> 299e9fcaa8aSmrg <entry>compat</entry> 300e9fcaa8aSmrg</row> 301eb411b4bSmrg<row> 3020f8248bfSmrg <entry><symbol>XkbKeyTypeNamesMask</symbol></entry> 303e9fcaa8aSmrg <entry>(1<<6)</entry> 304e9fcaa8aSmrg <entry>Xkb->map</entry> 305e9fcaa8aSmrg <entry>type[*].name</entry> 306e9fcaa8aSmrg</row> 307eb411b4bSmrg<row> 3080f8248bfSmrg <entry><symbol>XkbKTLevelNamesMask</symbol></entry> 309e9fcaa8aSmrg <entry>(1<<7)</entry> 310e9fcaa8aSmrg <entry>Xkb->map</entry> 311e9fcaa8aSmrg <entry>type[*].lvl_names[*]</entry> 312e9fcaa8aSmrg</row> 313eb411b4bSmrg<row> 3140f8248bfSmrg <entry><symbol>XkbIndicatorNamesMask</symbol></entry> 315e9fcaa8aSmrg <entry>(1<<8)</entry> 316e9fcaa8aSmrg <entry>Xkb->names</entry> 317e9fcaa8aSmrg <entry>indicators[*]</entry> 318e9fcaa8aSmrg</row> 319eb411b4bSmrg<row> 3200f8248bfSmrg <entry><symbol>XkbKeyNamesMask</symbol></entry> 321e9fcaa8aSmrg <entry>(1<<9)</entry> 322e9fcaa8aSmrg <entry>Xkb->names</entry> 323e9fcaa8aSmrg <entry>keys[*], num_keys</entry> 324e9fcaa8aSmrg</row> 325eb411b4bSmrg<row> 3260f8248bfSmrg <entry><symbol>XkbKeyAliasesMask</symbol></entry> 327e9fcaa8aSmrg <entry>(1<<10)</entry> 328e9fcaa8aSmrg <entry>Xkb->names</entry> 329e9fcaa8aSmrg <entry>key_aliases[*], num_key_aliases</entry> 330e9fcaa8aSmrg</row> 331eb411b4bSmrg<row> 3320f8248bfSmrg <entry><symbol>XkbVirtualModNamesMask</symbol></entry> 333e9fcaa8aSmrg <entry>(1<<11)</entry> 334e9fcaa8aSmrg <entry>Xkb->names</entry> 335e9fcaa8aSmrg <entry>vmods[*]</entry> 336e9fcaa8aSmrg</row> 337eb411b4bSmrg<row> 3380f8248bfSmrg <entry><symbol>XkbGroupNamesMask</symbol></entry> 339e9fcaa8aSmrg <entry>(1<<12)</entry> 340e9fcaa8aSmrg <entry>Xkb->names</entry> 341e9fcaa8aSmrg <entry>groups[*]</entry> 342e9fcaa8aSmrg</row> 343eb411b4bSmrg<row> 3440f8248bfSmrg <entry><symbol>XkbRGNamesMask</symbol></entry> 345e9fcaa8aSmrg <entry>(1<<13)</entry> 346e9fcaa8aSmrg <entry>Xkb->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->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->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->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->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->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->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->names</entry> 743e9fcaa8aSmrg <entry>keys[*]</entry> 744e9fcaa8aSmrg</row> 745eb411b4bSmrg<row> 7460f8248bfSmrg <entry><symbol>XkbVirtualModNamesMask</symbol></entry> 747e9fcaa8aSmrg <entry>changed_vmods</entry> 748e9fcaa8aSmrg <entry>Xkb->names</entry> 749e9fcaa8aSmrg <entry>vmods[*]</entry> 750e9fcaa8aSmrg</row> 751eb411b4bSmrg<row> 7520f8248bfSmrg <entry><symbol>XkbIndicatorNamesMask</symbol></entry> 753e9fcaa8aSmrg <entry>changed_indicators</entry> 754e9fcaa8aSmrg <entry>Xkb->names</entry> 755e9fcaa8aSmrg <entry>indicators[*]</entry> 756e9fcaa8aSmrg</row> 757eb411b4bSmrg<row> 7580f8248bfSmrg <entry><symbol>XkbGroupNamesMask</symbol></entry> 759e9fcaa8aSmrg <entry>changed_groups</entry> 760e9fcaa8aSmrg <entry>Xkb->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> ⇒ 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 ⇒ 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