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='Complete_Keyboard_Description'> 5e9fcaa8aSmrg<title>Complete Keyboard Description</title> 6e9fcaa8aSmrg 7e9fcaa8aSmrg<para> 8e9fcaa8aSmrgThe complete Xkb description for a keyboard device is accessed using a single 9e9fcaa8aSmrgstructure containing pointers to major Xkb components. This chapter describes 10e9fcaa8aSmrgthis single structure and provides references to other sections of this 11e9fcaa8aSmrgdocument that discuss the major Xkb components in detail. 12e9fcaa8aSmrg</para> 13e9fcaa8aSmrg 14eb411b4bSmrg<sect1 id='The_XkbDescRec_Structure'> 15e9fcaa8aSmrg<title>The XkbDescRec Structure</title> 16e9fcaa8aSmrg 170f8248bfSmrg<indexterm significance="preferred" zone="The_XkbDescRec_Structure"> 180f8248bfSmrg<primary><structname>XkbDescRec</structname></primary></indexterm> 190f8248bfSmrg 20e9fcaa8aSmrg<para> 210f8248bfSmrgThe complete description of an Xkb keyboard is given by an 220f8248bfSmrg<structname>XkbDescRec</structname>. 230f8248bfSmrgThe component structures in the 240f8248bfSmrg<structname>XkbDescRec</structname> 250f8248bfSmrgrepresent the major Xkb components outlined in <link linkend="figure1.1">Figure 1.1</link>. 26e9fcaa8aSmrg</para> 27e9fcaa8aSmrg 28e9fcaa8aSmrg<para><programlisting> 29e9fcaa8aSmrgtypedef struct { 300f8248bfSmrg struct _XDisplay * display; /* connection to X server */ 310f8248bfSmrg unsigned short flags; /* private to Xkb, do not modify */ 320f8248bfSmrg unsigned short device_spec; /* device of interest */ 330f8248bfSmrg KeyCode min_key_code; /* minimum keycode for device */ 340f8248bfSmrg KeyCode max_key_code; /* maximum keycode for device */ 350f8248bfSmrg XkbControlsPtr ctrls; /* controls */ 360f8248bfSmrg XkbServerMapPtr server; /* server keymap */ 370f8248bfSmrg XkbClientMapPtr map; /* client keymap */ 380f8248bfSmrg XkbIndicatorPtr indicators; /* indicator map */ 390f8248bfSmrg XkbNamesPtr names; /* names for all components */ 400f8248bfSmrg XkbCompatMapPtr compat; /* compatibility map */ 410f8248bfSmrg XkbGeometryPtr geom; /* physical geometry of keyboard */ 420f8248bfSmrg} <structname>XkbDescRec</structname>, *XkbDescPtr; 43e9fcaa8aSmrg</programlisting></para> 44e9fcaa8aSmrg 45e9fcaa8aSmrg<para> 460f8248bfSmrgThe 470f8248bfSmrg<parameter>display</parameter> 480f8248bfSmrgfield points to an X display structure. The 490f8248bfSmrg<structfield>flags</structfield> 500f8248bfSmrgfield is private to the library: modifying 510f8248bfSmrg<structfield>flags</structfield> 520f8248bfSmrgmay yield unpredictable results. The 530f8248bfSmrg<parameter>device_spec</parameter> 540f8248bfSmrgfield specifies the device identifier of the keyboard input device, or 550f8248bfSmrg<symbol>XkbUseCoreKbd</symbol>, 560f8248bfSmrgwhich specifies the core keyboard device. The 570f8248bfSmrg<structfield>min_key_code</structfield> 580f8248bfSmrgand 590f8248bfSmrg<structfield>max_key_code</structfield> 600f8248bfSmrgfields specify the least and greatest keycode that can be returned by the 61e9fcaa8aSmrgkeyboard. 62e9fcaa8aSmrg</para> 63e9fcaa8aSmrg 64e9fcaa8aSmrg 65e9fcaa8aSmrg<para> 66e9fcaa8aSmrgThe other fields specify structure components of the keyboard description and 670f8248bfSmrgare described in detail in other sections of this document. 680f8248bfSmrg<link linkend="table6.1">Table 6.1</link> 69e9fcaa8aSmrgidentifies the subsequent sections of this document that discuss the individual 700f8248bfSmrgcomponents of the 710f8248bfSmrg<structname>XkbDescRec</structname>. 72e9fcaa8aSmrg</para> 73e9fcaa8aSmrg 740f8248bfSmrg<table id='table6.1' frame='topbot'> 75e9fcaa8aSmrg<title>XkbDescRec Component References</title> 76eb411b4bSmrg<?dbfo keep-together="always" ?> 77eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 78eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 79eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/> 80e9fcaa8aSmrg<thead> 81eb411b4bSmrg<row rowsep='1'> 82e9fcaa8aSmrg <entry>XkbDescRec Field</entry> 83e9fcaa8aSmrg <entry>For more info</entry> 84e9fcaa8aSmrg</row> 85e9fcaa8aSmrg</thead> 86e9fcaa8aSmrg<tbody> 87eb411b4bSmrg<row> 88e9fcaa8aSmrg <entry>ctrls</entry> 890f8248bfSmrg <entry><xref linkend="Keyboard_Controls" /></entry> 90e9fcaa8aSmrg</row> 91eb411b4bSmrg<row> 92e9fcaa8aSmrg <entry>server</entry> 930f8248bfSmrg <entry><xref linkend="Xkb_Server_Keyboard_Mapping" /></entry> 94e9fcaa8aSmrg</row> 95eb411b4bSmrg<row> 96e9fcaa8aSmrg <entry>map</entry> 970f8248bfSmrg <entry><xref linkend="Xkb_Client_Keyboard_Mapping" /></entry> 98e9fcaa8aSmrg</row> 99eb411b4bSmrg<row> 100e9fcaa8aSmrg <entry>indicators</entry> 1010f8248bfSmrg <entry><xref linkend="Indicators" /></entry> 102e9fcaa8aSmrg</row> 103eb411b4bSmrg<row> 104e9fcaa8aSmrg <entry>names</entry> 1050f8248bfSmrg <entry><xref linkend="Symbolic_Names" /></entry> 106e9fcaa8aSmrg</row> 107eb411b4bSmrg<row> 108e9fcaa8aSmrg <entry>compat</entry> 1090f8248bfSmrg <entry><xref linkend="The_Xkb_Compatibility_Map" /></entry> 110e9fcaa8aSmrg</row> 111eb411b4bSmrg<row> 112e9fcaa8aSmrg <entry>geom</entry> 1130f8248bfSmrg <entry><xref linkend="Keyboard_Geometry" /></entry> 114e9fcaa8aSmrg </row> 115e9fcaa8aSmrg</tbody> 116e9fcaa8aSmrg</tgroup> 117e9fcaa8aSmrg</table> 118e9fcaa8aSmrg 119e9fcaa8aSmrg<para> 120e9fcaa8aSmrgEach structure component has a corresponding mask bit that is used in function 121e9fcaa8aSmrgcalls to indicate that the structure should be manipulated in some manner, such 122e9fcaa8aSmrgas allocating it or freeing it. These masks and their relationships to the 1230f8248bfSmrgfields in the 1240f8248bfSmrg<structname>XkbDescRec</structname> 1250f8248bfSmrgare shown in <link linkend="table6.2">Table 6.2</link>. 126e9fcaa8aSmrg</para> 127e9fcaa8aSmrg 1280f8248bfSmrg<table id='table6.2' frame='topbot'> 129e9fcaa8aSmrg<title>Mask Bits for XkbDescRec</title> 130eb411b4bSmrg<?dbfo keep-together="always" ?> 131eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'> 132eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 133eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 134eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/> 135e9fcaa8aSmrg<thead> 136eb411b4bSmrg<row rowsep='1'> 137e9fcaa8aSmrg <entry>Mask Bit</entry> 138e9fcaa8aSmrg <entry>XkbDescRec Field</entry> 139e9fcaa8aSmrg <entry>Value</entry> 140e9fcaa8aSmrg</row> 141e9fcaa8aSmrg</thead> 142e9fcaa8aSmrg<tbody> 143eb411b4bSmrg<row> 1440f8248bfSmrg <entry><symbol>XkbControlsMask</symbol></entry> 145e9fcaa8aSmrg <entry>ctrls</entry> 146e9fcaa8aSmrg <entry>(1L<<0)</entry> 147e9fcaa8aSmrg</row> 148eb411b4bSmrg<row> 1490f8248bfSmrg <entry><symbol>XkbServerMapMask</symbol></entry> 150e9fcaa8aSmrg <entry>server</entry> 151e9fcaa8aSmrg <entry>(1L<<1)</entry> 152e9fcaa8aSmrg</row> 153eb411b4bSmrg<row> 154e9fcaa8aSmrg <entry>XkbIClientMapMask</entry> 155e9fcaa8aSmrg <entry>map</entry> 156e9fcaa8aSmrg <entry>(1L<<2)</entry> 157e9fcaa8aSmrg</row> 158eb411b4bSmrg<row> 1590f8248bfSmrg <entry><symbol>XkbIndicatorMapMask</symbol></entry> 160e9fcaa8aSmrg <entry>indicators</entry> 161e9fcaa8aSmrg <entry>(1L<<3)</entry> 162e9fcaa8aSmrg</row> 163eb411b4bSmrg<row> 1640f8248bfSmrg <entry><symbol>XkbNamesMask</symbol></entry> 165e9fcaa8aSmrg <entry>names</entry> 166e9fcaa8aSmrg <entry>(1L<<4)</entry> 167e9fcaa8aSmrg</row> 168eb411b4bSmrg<row> 1690f8248bfSmrg <entry><symbol>XkbCompatMapMask</symbol></entry> 170e9fcaa8aSmrg <entry>compat</entry> 171e9fcaa8aSmrg <entry>(1L<<5)</entry> 172e9fcaa8aSmrg</row> 173eb411b4bSmrg<row> 1740f8248bfSmrg <entry><symbol>XkbGeometryMask</symbol></entry> 175e9fcaa8aSmrg <entry>geom</entry> 176e9fcaa8aSmrg <entry>(1L<<6)</entry> 177e9fcaa8aSmrg</row> 178eb411b4bSmrg<row> 1790f8248bfSmrg <entry><symbol>XkbAllComponentsMask</symbol></entry> 180e9fcaa8aSmrg <entry>All Fields</entry> 181e9fcaa8aSmrg <entry>(0x7f)</entry> 182e9fcaa8aSmrg </row> 183e9fcaa8aSmrg</tbody> 184e9fcaa8aSmrg</tgroup> 185e9fcaa8aSmrg</table> 186e9fcaa8aSmrg 187e9fcaa8aSmrg</sect1> 188eb411b4bSmrg<sect1 id='Obtaining_a_Keyboard_Description_from_the_Server'> 189e9fcaa8aSmrg<title>Obtaining a Keyboard Description from the Server</title> 190e9fcaa8aSmrg 191e9fcaa8aSmrg<para> 192e9fcaa8aSmrgTo retrieve one or more components of a keyboard device description, use 1930f8248bfSmrg<function>XkbGetKeyboard</function> 1940f8248bfSmrg(see also 1950f8248bfSmrg<link linkend="XkbGetKeyboardByName"><function>XkbGetKeyboardByName</function></link>). 1960f8248bfSmrg 197e9fcaa8aSmrg</para> 198e9fcaa8aSmrg 1990f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyboard"><primary><function>XkbGetKeyboard</function></primary></indexterm> 2000f8248bfSmrg<funcsynopsis id="XkbGetKeyboard"> 2010f8248bfSmrg <funcprototype> 2020f8248bfSmrg <funcdef>XkbDescPtr <function>XkbGetKeyboard</function></funcdef> 2030f8248bfSmrg<!-- ( 2040f8248bfSmrg<parameter>display, which, device_spec</parameter> 2050f8248bfSmrg) --> 2060f8248bfSmrg 2070f8248bfSmrg <paramdef>Display *<parameter>display</parameter></paramdef> 2080f8248bfSmrg <paramdef>unsigned int <parameter>which</parameter></paramdef> 2090f8248bfSmrg <paramdef>unsigned int <parameter>device_spec</parameter></paramdef> 2100f8248bfSmrg </funcprototype> 2110f8248bfSmrg</funcsynopsis> 2120f8248bfSmrg<variablelist> 2130f8248bfSmrg <varlistentry> 2140f8248bfSmrg <term> 2150f8248bfSmrg <parameter>display</parameter> 2160f8248bfSmrg </term> 2170f8248bfSmrg <listitem> 2180f8248bfSmrg <para> 2190f8248bfSmrg connection to X server 2200f8248bfSmrg </para> 2210f8248bfSmrg </listitem> 2220f8248bfSmrg </varlistentry> 2230f8248bfSmrg <varlistentry> 2240f8248bfSmrg <term> 2250f8248bfSmrg <parameter>which</parameter> 2260f8248bfSmrg </term> 2270f8248bfSmrg <listitem> 2280f8248bfSmrg <para> 2290f8248bfSmrg mask indicating components to return 2300f8248bfSmrg </para> 2310f8248bfSmrg </listitem> 2320f8248bfSmrg </varlistentry> 2330f8248bfSmrg <varlistentry> 2340f8248bfSmrg <term> 2350f8248bfSmrg <parameter>device_spec</parameter> 2360f8248bfSmrg </term> 2370f8248bfSmrg <listitem> 2380f8248bfSmrg <para> 2390f8248bfSmrg device for which to fetch description, or 2400f8248bfSmrg<symbol>XkbUseCoreKbd</symbol> 2410f8248bfSmrg </para> 2420f8248bfSmrg </listitem> 2430f8248bfSmrg </varlistentry> 2440f8248bfSmrg</variablelist> 245e9fcaa8aSmrg 246e9fcaa8aSmrg<para> 2470f8248bfSmrg<function>XkbGetKeyboard</function> 248e9fcaa8aSmrgallocates and returns a pointer to a keyboard description. It queries the 2490f8248bfSmrgserver for those components specified in the 2500f8248bfSmrg<parameter>which</parameter> 2510f8248bfSmrgparameter for device 2520f8248bfSmrg<parameter>device_spec</parameter> 2530f8248bfSmrgand copies the results to the 2540f8248bfSmrg<structname>XkbDescRec</structname> 2550f8248bfSmrgit allocated. The remaining fields in the keyboard description are set to 2560f8248bfSmrg<symbol>NULL</symbol>. 2570f8248bfSmrgThe valid masks for 2580f8248bfSmrg<parameter>which</parameter> 2590f8248bfSmrgare those listed in <link linkend="table6.2">Table 6.2</link>. 260e9fcaa8aSmrg</para> 261e9fcaa8aSmrg 262e9fcaa8aSmrg 263e9fcaa8aSmrg<para> 2640f8248bfSmrg<function>XkbGetKeyboard</function> 2650f8248bfSmrgcan generate 2660f8248bfSmrg<errorname>BadAlloc</errorname> 2670f8248bfSmrgprotocol errors. 268e9fcaa8aSmrg</para> 269e9fcaa8aSmrg 270e9fcaa8aSmrg 271e9fcaa8aSmrg<para> 2720f8248bfSmrgTo free the returned keyboard description, use 2730f8248bfSmrg<function>XkbFreeKeyboard</function> 2740f8248bfSmrg(see <link linkend="Allocating_and_Freeing_a_Keyboard_Description">section 6.4</link>). 275e9fcaa8aSmrg</para> 276e9fcaa8aSmrg 277e9fcaa8aSmrg 278e9fcaa8aSmrg</sect1> 279eb411b4bSmrg<sect1 id='Tracking_Changes_to_the_Keyboard_Description_in_the_Server'> 280e9fcaa8aSmrg<title>Tracking Changes to the Keyboard Description in the Server</title> 281e9fcaa8aSmrg 282e9fcaa8aSmrg<para> 283e9fcaa8aSmrgThe server can generate events whenever its copy of the keyboard description 2840f8248bfSmrgfor a device changes. Refer to <link linkend="Tracking_Changes_to_Map_Components">section 14.4</link> for detailed information on 285e9fcaa8aSmrgtracking changes to the keyboard description. 286e9fcaa8aSmrg</para> 287e9fcaa8aSmrg 288e9fcaa8aSmrg 289e9fcaa8aSmrg</sect1> 290eb411b4bSmrg<sect1 id='Allocating_and_Freeing_a_Keyboard_Description'> 291e9fcaa8aSmrg<title>Allocating and Freeing a Keyboard Description</title> 292e9fcaa8aSmrg 293e9fcaa8aSmrg<para> 294e9fcaa8aSmrgApplications seldom need to directly allocate a keyboard description; calling 2950f8248bfSmrg<function>XkbGetKeyboard</function> 2960f8248bfSmrgusually suffices. In the event you need to create a keyboard description from 2970f8248bfSmrgscratch, however, use 2980f8248bfSmrg<function>XkbAllocKeyboard</function> 2990f8248bfSmrgrather than directly calling 3000f8248bfSmrg<function>malloc</function> 3010f8248bfSmrgor 3020f8248bfSmrg<function>Xmalloc</function>. 303e9fcaa8aSmrg</para> 304e9fcaa8aSmrg 3050f8248bfSmrg<indexterm significance="preferred" zone="XkbAllocKeyboard"><primary><function>XkbAllocKeyboard</function></primary></indexterm> 3060f8248bfSmrg<funcsynopsis id="XkbAllocKeyboard"> 3070f8248bfSmrg <funcprototype> 3080f8248bfSmrg <funcdef>XkbDescRec *<function>XkbAllocKeyboard</function></funcdef> 3090f8248bfSmrg <void /> 3100f8248bfSmrg 3110f8248bfSmrg </funcprototype> 3120f8248bfSmrg</funcsynopsis> 313e9fcaa8aSmrg 314e9fcaa8aSmrg<para> 3150f8248bfSmrgIf 3160f8248bfSmrg<function>XkbAllocKeyboard</function> 3170f8248bfSmrgfails to allocate the keyboard description, it returns 3180f8248bfSmrg<symbol>NULL</symbol>. 3190f8248bfSmrgOtherwise, it returns a pointer to an empty keyboard description structure. 3200f8248bfSmrgThe 3210f8248bfSmrg<structfield>device_spec</structfield> 3220f8248bfSmrgfield will have been initialized to 3230f8248bfSmrg<symbol>XkbUseCoreKbd</symbol>. 3240f8248bfSmrgYou may then either fill in the structure components or use Xkb functions to 325e9fcaa8aSmrgobtain values for the structure components from a keyboard device. 326e9fcaa8aSmrg</para> 327e9fcaa8aSmrg 328e9fcaa8aSmrg 329e9fcaa8aSmrg<para> 3300f8248bfSmrgTo destroy either an entire an 3310f8248bfSmrg<structname>XkbDescRec</structname> 3320f8248bfSmrgor just some of its members, use 3330f8248bfSmrg<function>XkbFreeKeyboard</function>. 334e9fcaa8aSmrg</para> 335e9fcaa8aSmrg 336e9fcaa8aSmrg 3370f8248bfSmrg<indexterm significance="preferred" zone="XkbFreeKeyboard"><primary><function>XkbFreeKeyboard</function></primary></indexterm> 3380f8248bfSmrg<funcsynopsis id="XkbFreeKeyboard"> 3390f8248bfSmrg <funcprototype> 3400f8248bfSmrg <funcdef>void <function>XkbFreeKeyboard</function></funcdef> 3410f8248bfSmrg<!-- 3420f8248bfSmrg<parameter>(xkb, which, free_all</parameter> 3430f8248bfSmrg) --> 3440f8248bfSmrg 3450f8248bfSmrg <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef> 3460f8248bfSmrg <paramdef>unsigned int <parameter>which</parameter></paramdef> 3470f8248bfSmrg <paramdef>Bool <parameter>free_all</parameter></paramdef> 3480f8248bfSmrg </funcprototype> 3490f8248bfSmrg</funcsynopsis> 3500f8248bfSmrg<variablelist> 3510f8248bfSmrg <varlistentry> 3520f8248bfSmrg <term> 3530f8248bfSmrg <parameter>xkb</parameter> 3540f8248bfSmrg </term> 3550f8248bfSmrg <listitem> 3560f8248bfSmrg <para> 3570f8248bfSmrg keyboard description with components to free 3580f8248bfSmrg </para> 3590f8248bfSmrg </listitem> 3600f8248bfSmrg </varlistentry> 3610f8248bfSmrg <varlistentry> 3620f8248bfSmrg <term> 3630f8248bfSmrg <parameter>which</parameter> 3640f8248bfSmrg </term> 3650f8248bfSmrg <listitem> 3660f8248bfSmrg <para> 3670f8248bfSmrg mask selecting components to free 3680f8248bfSmrg </para> 3690f8248bfSmrg </listitem> 3700f8248bfSmrg </varlistentry> 3710f8248bfSmrg <varlistentry> 3720f8248bfSmrg <term> 3730f8248bfSmrg <parameter>free_all</parameter> 3740f8248bfSmrg </term> 3750f8248bfSmrg <listitem> 3760f8248bfSmrg <para> 3770f8248bfSmrg <symbol>True</symbol> ⇒ free all components and <parameter>xkb</parameter> 3780f8248bfSmrg </para> 3790f8248bfSmrg </listitem> 3800f8248bfSmrg </varlistentry> 3810f8248bfSmrg</variablelist> 382e9fcaa8aSmrg 383e9fcaa8aSmrg<para> 3840f8248bfSmrg<function>XkbFreeKeyboard</function> 3850f8248bfSmrgfrees the components of 3860f8248bfSmrg<parameter>xkb</parameter> 3870f8248bfSmrgspecified by 3880f8248bfSmrg<parameter>which</parameter> 3890f8248bfSmrgand sets the corresponding values to 3900f8248bfSmrg<symbol>NULL</symbol>. 3910f8248bfSmrgIf 3920f8248bfSmrg<parameter>free_all</parameter> 3930f8248bfSmrgis 3940f8248bfSmrg<symbol>True</symbol>, 3950f8248bfSmrg<function>XkbFreeKeyboard</function> 3960f8248bfSmrgfrees every non- 3970f8248bfSmrg<symbol>NULL</symbol> 3980f8248bfSmrgcomponent of 3990f8248bfSmrg<parameter>xkb</parameter> 4000f8248bfSmrgand then frees the 4010f8248bfSmrg<parameter>xkb</parameter> 4020f8248bfSmrgstructure itself. 403e9fcaa8aSmrg</para> 404e9fcaa8aSmrg 405e9fcaa8aSmrg</sect1> 406e9fcaa8aSmrg</chapter> 407