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