ch21.xml revision 0f8248bf
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='Attaching_Xkb_Actions_to_X_Input_Extension_Devices'> 5e9fcaa8aSmrg<title>Attaching Xkb Actions to X Input Extension Devices</title> 6e9fcaa8aSmrg 7e9fcaa8aSmrg<para> 8e9fcaa8aSmrgThe X input extension allows an X server to support multiple keyboards, as well 9e9fcaa8aSmrgas other input devices, in addition to the core X keyboard and pointer. The 10e9fcaa8aSmrginput extension categorizes devices by grouping them into classes. Keyboards 11e9fcaa8aSmrgand other input devices with keys are classified as KeyClass devices by the 12e9fcaa8aSmrginput extension. Other types of devices supported by the input extension 13e9fcaa8aSmrginclude, but are not limited to: mice, tablets, touchscreens, barcode readers, 14e9fcaa8aSmrgbutton boxes, trackballs, identifier devices, data gloves, and eye trackers. 15e9fcaa8aSmrgXkb provides additional control over all X input extension devices, whether 160f8248bfSmrgthey are <symbol>KeyClass</symbol> 170f8248bfSmrgdevices or not, as well as the core keyboard and pointer. 18e9fcaa8aSmrg</para> 19e9fcaa8aSmrg 20e9fcaa8aSmrg 21e9fcaa8aSmrg<para> 22e9fcaa8aSmrgIf an X server implements support for both the input extension and Xkb, the 23e9fcaa8aSmrgserver implementor determines whether interaction between Xkb and the input 24e9fcaa8aSmrgextension is allowed. Implementors are free to restrict the effects of Xkb to 25e9fcaa8aSmrgonly the core X keyboard device or allow interaction between Xkb and the input 26e9fcaa8aSmrgextension. 27e9fcaa8aSmrg</para> 28e9fcaa8aSmrg 29e9fcaa8aSmrg 30e9fcaa8aSmrg<para> 31e9fcaa8aSmrgSeveral types of interaction between Xkb and the input extension are defined by 32e9fcaa8aSmrgXkb. Some or all may be allowed by the X server implementation. 33e9fcaa8aSmrg</para> 34e9fcaa8aSmrg 35e9fcaa8aSmrg 36e9fcaa8aSmrg<para> 37e9fcaa8aSmrgRegardless of whether the server allows interaction between Xkb and the input 38e9fcaa8aSmrgextension, the following access is provided: 39e9fcaa8aSmrg</para> 40e9fcaa8aSmrg 41e9fcaa8aSmrg<itemizedlist> 42e9fcaa8aSmrg<listitem> 43e9fcaa8aSmrg <para> 44e9fcaa8aSmrgXkb functionality for the core X keyboard device and its mapping is accessed 45e9fcaa8aSmrgvia the functions described in the other chapters of this specification. 46e9fcaa8aSmrg </para> 47e9fcaa8aSmrg</listitem> 48e9fcaa8aSmrg<listitem> 49e9fcaa8aSmrg <para> 50e9fcaa8aSmrgXkb functionality for the core X pointer device is accessed via the 51e9fcaa8aSmrgXkbGetDeviceInfo and XkbSetDeviceInfo functions described in this chapter. 52e9fcaa8aSmrg </para> 53e9fcaa8aSmrg</listitem> 54e9fcaa8aSmrg</itemizedlist> 55e9fcaa8aSmrg 56e9fcaa8aSmrg<para> 57e9fcaa8aSmrgIf all types of interaction are allowed between Xkb and the input extension, 58e9fcaa8aSmrgthe following additional access is provided: 59e9fcaa8aSmrg</para> 60e9fcaa8aSmrg 61e9fcaa8aSmrg<itemizedlist> 62e9fcaa8aSmrg<listitem> 63e9fcaa8aSmrg <para> 640f8248bfSmrgIf allowed, Xkb functionality for additional 650f8248bfSmrg<symbol>KeyClass</symbol> 660f8248bfSmrgdevices supported by the input extension is accessed via those same functions. 67e9fcaa8aSmrg </para> 68e9fcaa8aSmrg</listitem> 69e9fcaa8aSmrg<listitem> 70e9fcaa8aSmrg <para> 710f8248bfSmrgIf allowed, Xkb functionality for non- 720f8248bfSmrg<symbol>KeyClass</symbol> 730f8248bfSmrgdevices supported by the input extension is also accessed via the 74e9fcaa8aSmrgXkbGetDeviceInfo and XkbSetDeviceInfo functions described in this chapter. 75e9fcaa8aSmrg </para> 76e9fcaa8aSmrg</listitem> 77e9fcaa8aSmrg</itemizedlist> 78e9fcaa8aSmrg 79e9fcaa8aSmrg<para> 80e9fcaa8aSmrgEach device has an X Input Extension device ID. Each device may have several 81e9fcaa8aSmrgclasses of feedback. For example, there are two types of feedbacks that can 820f8248bfSmrggenerate bells: bell feedback and keyboard feedback 830f8248bfSmrg(<symbol>BellFeedbackClass</symbol> 840f8248bfSmrgand 850f8248bfSmrg<symbol>KbdFeedbackClass</symbol>). 860f8248bfSmrgA device can have more than one feedback of each type; the feedback ID 87e9fcaa8aSmrgidentifies the particular feedback within its class. 88e9fcaa8aSmrg</para> 89e9fcaa8aSmrg 90e9fcaa8aSmrg 91e9fcaa8aSmrg<para> 92e9fcaa8aSmrgA keyboard feedback has: 93e9fcaa8aSmrg</para> 94e9fcaa8aSmrg 95e9fcaa8aSmrg<itemizedlist> 96e9fcaa8aSmrg<listitem> 97e9fcaa8aSmrg <para> 98e9fcaa8aSmrgAuto-repeat status (global and per key) 99e9fcaa8aSmrg </para> 100e9fcaa8aSmrg</listitem> 101e9fcaa8aSmrg<listitem> 102e9fcaa8aSmrg <para> 103e9fcaa8aSmrg32 LEDs 104e9fcaa8aSmrg </para> 105e9fcaa8aSmrg</listitem> 106e9fcaa8aSmrg<listitem> 107e9fcaa8aSmrg <para> 108e9fcaa8aSmrgA bell 109e9fcaa8aSmrg </para> 110e9fcaa8aSmrg</listitem> 111e9fcaa8aSmrg</itemizedlist> 112e9fcaa8aSmrg 113e9fcaa8aSmrg<para> 114e9fcaa8aSmrgAn indicator feedback has: 115e9fcaa8aSmrg</para> 116e9fcaa8aSmrg 117e9fcaa8aSmrg<itemizedlist> 118e9fcaa8aSmrg<listitem> 119e9fcaa8aSmrg <para> 120e9fcaa8aSmrgUp to 32 LEDs 121e9fcaa8aSmrg </para> 122e9fcaa8aSmrg</listitem> 123e9fcaa8aSmrg</itemizedlist> 124e9fcaa8aSmrg 125e9fcaa8aSmrg<para> 126e9fcaa8aSmrgIf the input extension is present and the server allows interaction between the 127e9fcaa8aSmrginput extension and Xkb, then the core keyboard, the core keyboard indicators, 128e9fcaa8aSmrgand the core keyboard bells may each be addressed using an appropriate device 1290f8248bfSmrgspec, class, and ID. The constant 1300f8248bfSmrg<symbol>XkbDfltXIId</symbol> 1310f8248bfSmrgmay be used as the device ID to specify the core keyboard indicators for the 132e9fcaa8aSmrgcore indicator feedback. The particular device ID corresponding to the core 133e9fcaa8aSmrgkeyboard feedback and the core indicator feedback may be obtained by calling 1340f8248bfSmrg<function>XkbGetDeviceInfo</function> 1350f8248bfSmrgand specifying 1360f8248bfSmrg<symbol>XkbUseCoreKbd</symbol> 1370f8248bfSmrgas the 1380f8248bfSmrg<parameter>device_spec</parameter>; 1390f8248bfSmrgthe values will be returned in 1400f8248bfSmrg<structfield>dflt_kbd_fb</structfield> 1410f8248bfSmrgand 1420f8248bfSmrg<structfield>dflt_led_fb</structfield>. 1430f8248bfSmrg</para> 1440f8248bfSmrg 1450f8248bfSmrg 1460f8248bfSmrg<para> 1470f8248bfSmrgIf the server does not allow Xkb access to input extension 1480f8248bfSmrg<symbol>KeyClass</symbol> 1490f8248bfSmrgdevices, attempts to use Xkb requests with those devices fail with a 1500f8248bfSmrg<errorname>BadKeyboard</errorname> 1510f8248bfSmrgerror. Attempts to access non- 1520f8248bfSmrg<symbol>KeyClass</symbol> 1530f8248bfSmrginput extension devices via XkbGetDeviceInfo and XkbSetDeviceInfo fail 154e9fcaa8aSmrgsilently if Xkb access to those devices is not supported by the X server. 155e9fcaa8aSmrg</para> 156e9fcaa8aSmrg 157eb411b4bSmrg<sect1 id='XkbDeviceInfoRec'> 158e9fcaa8aSmrg<title>XkbDeviceInfoRec</title> 1590f8248bfSmrg<indexterm significance="preferred" zone="XkbDeviceInfoRec"> 1600f8248bfSmrg<primary><structname>XkbDeviceInfoRec</structname></primary></indexterm> 1610f8248bfSmrg<indexterm significance="preferred" zone="XkbDeviceInfoRec"> 1620f8248bfSmrg<primary><structname>XkbDeviceLedInfoRec</structname></primary></indexterm> 163e9fcaa8aSmrg 164e9fcaa8aSmrg<para> 165e9fcaa8aSmrgInformation about X Input Extension devices is transferred between a client 1660f8248bfSmrgprogram and the Xkb extension in an 1670f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 1680f8248bfSmrgstructure: 169e9fcaa8aSmrg 1700f8248bfSmrg<programlisting> 171e9fcaa8aSmrgtypedef struct { 1720f8248bfSmrg char * name; /* name for device */ 1730f8248bfSmrg Atom type; /* name for class of devices */ 1740f8248bfSmrg unsigned short device_spec; /* device of interest */ 1750f8248bfSmrg Bool has_own_state; /* <symbol>True</symbol> ⇒ this device has 1760f8248bfSmrg its own state */ 1770f8248bfSmrg unsigned short supported; /* bits indicating supported capabilities */ 1780f8248bfSmrg unsigned short unsupported; /* bits indicating unsupported capabilities */ 1790f8248bfSmrg unsigned short num_btns; /* number of entries in <structfield>btn_acts</structfield> */ 1800f8248bfSmrg XkbAction * btn_acts; /* button actions */ 1810f8248bfSmrg unsigned short sz_leds; /* total number of entries in LEDs vector */ 1820f8248bfSmrg unsigned short num_leds; /* number of valid entries in LEDs vector */ 1830f8248bfSmrg unsigned short dflt_kbd_fb; /* input extension ID of default 1840f8248bfSmrg (core kbd) indicator */ 1850f8248bfSmrg unsigned short dflt_led_fb; /* input extension ID of default 1860f8248bfSmrg indicator feedback */ 1870f8248bfSmrg XkbDeviceLedInfoPtr leds; /* LED descriptions */ 1880f8248bfSmrg} <structname>XkbDeviceInfoRec</structname>, *XkbDeviceInfoPtr; 189e9fcaa8aSmrg 190e9fcaa8aSmrgtypedef struct { 1910f8248bfSmrg unsigned short led_class; /* class for this LED device */ 1920f8248bfSmrg unsigned short led_id; /* ID for this LED device */ 1930f8248bfSmrg unsigned int phys_indicators; /* bits for which LEDs physically present */ 1940f8248bfSmrg unsigned int maps_present; /* bits for which LEDs have maps in <structfield>maps</structfield> */ 1950f8248bfSmrg unsigned int names_present; /* bits for which LEDs are in <structfield>names</structfield> */ 1960f8248bfSmrg unsigned int state; /* 1 bit ⇒ corresponding LED is on */ 1970f8248bfSmrg Atom names[XkbNumIndicators]; /* names for LEDs */ 1980f8248bfSmrg XkbIndicatorMapRec maps; /* indicator maps for each LED */ 1990f8248bfSmrg} <structname>XkbDeviceLedInfoRec</structname>, *XkbDeviceLedInfoPtr; 200e9fcaa8aSmrg</programlisting></para> 201e9fcaa8aSmrg 202e9fcaa8aSmrg<para> 2030f8248bfSmrgThe 2040f8248bfSmrg<structfield>type</structfield> 2050f8248bfSmrgfield is a registered symbolic name for a class of devices (for example, 2060f8248bfSmrg"TABLET"). If a device is a keyboard (that is, is a member of 2070f8248bfSmrg<symbol>KeyClass</symbol>), 2080f8248bfSmrgit has its own state, and 2090f8248bfSmrg<structfield>has_own_state</structfield> 2100f8248bfSmrgis 2110f8248bfSmrg<symbol>True</symbol>. 2120f8248bfSmrgIf 2130f8248bfSmrg<structfield>has_own_state</structfield> 2140f8248bfSmrgis 2150f8248bfSmrg<symbol>False</symbol>, 2160f8248bfSmrgthe state of the core keyboard is used. The 2170f8248bfSmrg<structfield>supported</structfield> 2180f8248bfSmrgand 2190f8248bfSmrg<structfield>unsupported</structfield> 2200f8248bfSmrgfields are masks where each bit indicates a capability. The meaning of the 2210f8248bfSmrgmask bits is listed in <link linkend="table21.1">Table 21.1</link>, 2220f8248bfSmrgtogether with the fields in the 2230f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 2240f8248bfSmrgstructure that are associated with the capability represented by each bit. The 225e9fcaa8aSmrgsame bits are used to indicate the specific information desired in many of the 226e9fcaa8aSmrgfunctions described subsequently in this section. 227e9fcaa8aSmrg</para> 228e9fcaa8aSmrg 2290f8248bfSmrg<table id='table21.1' frame='topbot'> 230e9fcaa8aSmrg<title>XkbDeviceInfoRec Mask Bits</title> 231eb411b4bSmrg<?dbfo keep-together="always" ?> 232eb411b4bSmrg<tgroup cols='4' align='left' colsep='0' rowsep='0'> 233eb411b4bSmrg<colspec colname='c1' colwidth='2.9*'/> 234eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/> 235eb411b4bSmrg<colspec colname='c3' colwidth='0.9*'/> 236eb411b4bSmrg<colspec colname='c4' colwidth='2.0*'/> 237e9fcaa8aSmrg<thead> 238eb411b4bSmrg <row rowsep='1'> 239e9fcaa8aSmrg <entry>Name</entry> 240e9fcaa8aSmrg <entry>XkbDeviceInfoRec Fields Effected</entry> 241e9fcaa8aSmrg <entry>Value</entry> 242e9fcaa8aSmrg <entry>Capability If Set</entry> 243e9fcaa8aSmrg </row> 244e9fcaa8aSmrg</thead> 245e9fcaa8aSmrg<tbody> 246eb411b4bSmrg <row> 2470f8248bfSmrg <entry><symbol>XkbXI_KeyboardsMask</symbol></entry> 248e9fcaa8aSmrg <entry></entry> 249e9fcaa8aSmrg <entry>(1L << 0)</entry> 250e9fcaa8aSmrg <entry> 251e9fcaa8aSmrgClients can use all Xkb requests and events with 2520f8248bfSmrg<symbol>KeyClass</symbol> 253e9fcaa8aSmrgdevices supported by the input device extension. 254e9fcaa8aSmrg </entry> 255e9fcaa8aSmrg </row> 256eb411b4bSmrg <row> 2570f8248bfSmrg <entry><symbol>XkbXI_ButtonActionsMask</symbol></entry> 258e9fcaa8aSmrg <entry> 259e9fcaa8aSmrg<para>num_btns</para> 260e9fcaa8aSmrg<para>btn_acts</para> 261e9fcaa8aSmrg </entry> 262e9fcaa8aSmrg <entry>(1L <<1)</entry> 263e9fcaa8aSmrg <entry> 2640f8248bfSmrgClients can assign key actions to buttons on non- 2650f8248bfSmrg<symbol>KeyClass</symbol> 266e9fcaa8aSmrginput extension devices. 267e9fcaa8aSmrg </entry> 268e9fcaa8aSmrg </row> 269eb411b4bSmrg <row> 2700f8248bfSmrg <entry><symbol>XkbXI_IndicatorNamesMask</symbol></entry> 271e9fcaa8aSmrg <entry>leds->names</entry> 272e9fcaa8aSmrg <entry>(1L <<2)</entry> 273e9fcaa8aSmrg <entry> 2740f8248bfSmrgClients can assign names to indicators on non- 2750f8248bfSmrg<symbol>KeyClass</symbol> 2760f8248bfSmrginput extension devices. 277e9fcaa8aSmrg </entry> 278e9fcaa8aSmrg </row> 279eb411b4bSmrg <row> 2800f8248bfSmrg <entry><symbol>XkbXI_IndicatorMapsMask</symbol></entry> 281e9fcaa8aSmrg <entry>leds->maps</entry> 282e9fcaa8aSmrg <entry>(1L <<3)</entry> 283e9fcaa8aSmrg <entry> 2840f8248bfSmrgClients can assign indicator maps to indicators on non- 2850f8248bfSmrg<symbol>KeyClass</symbol> 2860f8248bfSmrginput extension devices. 287e9fcaa8aSmrg </entry> 288e9fcaa8aSmrg </row> 289eb411b4bSmrg <row> 2900f8248bfSmrg <entry><symbol>XkbXI_IndicatorStateMask</symbol></entry> 291e9fcaa8aSmrg <entry>leds->state</entry> 292e9fcaa8aSmrg <entry>(1L <<4)</entry> 293e9fcaa8aSmrg <entry> 2940f8248bfSmrgClients can request the status of indicators on non- 2950f8248bfSmrg<symbol>KeyClass</symbol> 2960f8248bfSmrginput extension devices. 297e9fcaa8aSmrg </entry> 298e9fcaa8aSmrg </row> 299eb411b4bSmrg <row> 3000f8248bfSmrg <entry><symbol>XkbXI_IndicatorsMask</symbol></entry> 301e9fcaa8aSmrg <entry> 302e9fcaa8aSmrg<para>sz_leds</para> 303e9fcaa8aSmrg<para>num_leds</para> 304e9fcaa8aSmrg<para>leds->*</para> 305e9fcaa8aSmrg </entry> 306e9fcaa8aSmrg <entry>(0x1c)</entry> 307e9fcaa8aSmrg <entry> 3080f8248bfSmrg<para><symbol>XkbXI_IndicatorNames­Mask</symbol> |</para> 3090f8248bfSmrg<para><symbol>XkbXI_IndicatorMaps­Mask</symbol> |</para> 3100f8248bfSmrg<para><symbol>XkbXI_IndicatorState­Mask</symbol></para> 311e9fcaa8aSmrg </entry> 312e9fcaa8aSmrg </row> 313eb411b4bSmrg <row> 3140f8248bfSmrg <entry><symbol>XkbXI_UnsupportedFeaturesMask</symbol></entry> 315e9fcaa8aSmrg <entry>unsupported</entry> 316e9fcaa8aSmrg <entry>(1L <<15)</entry> 317e9fcaa8aSmrg <entry></entry> 318e9fcaa8aSmrg </row> 319eb411b4bSmrg <row> 3200f8248bfSmrg <entry><symbol>XkbXI_AllDeviceFeaturesMask</symbol></entry> 321e9fcaa8aSmrg <entry>Those selected by Value column masks</entry> 322e9fcaa8aSmrg <entry>(0x1e)</entry> 323e9fcaa8aSmrg <entry> 3240f8248bfSmrg<para><symbol>XkbXI_Indicators­Mask</symbol> | </para> 3250f8248bfSmrg<para><symbol>XkbXI_ButtonActions­Mask</symbol> </para> 326e9fcaa8aSmrg </entry> 327e9fcaa8aSmrg </row> 328eb411b4bSmrg <row> 3290f8248bfSmrg <entry><symbol>XkbXI_AllFeaturesMask</symbol></entry> 330e9fcaa8aSmrg <entry>Those selected by Value column masks</entry> 331e9fcaa8aSmrg <entry>(0x1f)</entry> 332e9fcaa8aSmrg <entry> 3330f8248bfSmrg<para><symbol>XkbXI_AllDevice­FeaturesMask</symbol> | </para> 3340f8248bfSmrg<para><symbol>XkbXI_Keyboards­Mask</symbol> </para> 335e9fcaa8aSmrg </entry> 336e9fcaa8aSmrg </row> 337eb411b4bSmrg <row> 3380f8248bfSmrg <entry><symbol>XkbXI_AllDetailsMask</symbol></entry> 339e9fcaa8aSmrg <entry>Those selected by Value column masks</entry> 340e9fcaa8aSmrg <entry>(0x801f)</entry> 341e9fcaa8aSmrg <entry> 3420f8248bfSmrg<para><symbol>XkbXI_AllFeatures­Mask</symbol> | </para> 3430f8248bfSmrg<para><symbol>XkbXI_Unsupported­FeaturesMask</symbol></para> 344e9fcaa8aSmrg </entry> 345e9fcaa8aSmrg </row> 346e9fcaa8aSmrg</tbody> 347e9fcaa8aSmrg</tgroup> 348e9fcaa8aSmrg</table> 349e9fcaa8aSmrg 350e9fcaa8aSmrg<para> 3510f8248bfSmrgThe 3520f8248bfSmrg<structfield>name</structfield>, 3530f8248bfSmrg<structfield>type</structfield>, 3540f8248bfSmrg<structfield>has_own_state</structfield>, 3550f8248bfSmrg<structfield>supported</structfield>, 3560f8248bfSmrgand 3570f8248bfSmrg<structfield>unsupported</structfield> 3580f8248bfSmrgfields are always filled in when a valid reply is returned from the server 3590f8248bfSmrginvolving an 3600f8248bfSmrg<structname>XkbDeviceInfoRec</structname>. 3610f8248bfSmrgAll of the other fields are modified only if the particular function asks for 362e9fcaa8aSmrgthem. 363e9fcaa8aSmrg</para> 364e9fcaa8aSmrg 365e9fcaa8aSmrg</sect1> 366eb411b4bSmrg<sect1 id='Querying_Xkb_Features_for_Non_KeyClass_Input_Extension_Devices'> 367e9fcaa8aSmrg<title>Querying Xkb Features for Non-KeyClass Input Extension Devices</title> 368e9fcaa8aSmrg 369e9fcaa8aSmrg<para> 370e9fcaa8aSmrgTo determine whether the X server allows Xkb access to particular capabilities 371e9fcaa8aSmrgof input devices other than the core X keyboard, or to determine the status of 3720f8248bfSmrgindicator maps, indicator names or button actions on a non- 3730f8248bfSmrg<symbol>KeyClass</symbol> 3740f8248bfSmrgextension device, use XkbGetDeviceInfo. 3750f8248bfSmrg</para> 3760f8248bfSmrg 3770f8248bfSmrg<indexterm significance="preferred" zone="XkbGetDeviceInfo"><primary><function>XkbGetDeviceInfo</function></primary></indexterm> 3780f8248bfSmrg<funcsynopsis id="XkbGetDeviceInfo"> 3790f8248bfSmrg <funcprototype> 3800f8248bfSmrg <funcdef>XkbDeviceInfoPtr <function>XkbGetDeviceInfo</function></funcdef> 3810f8248bfSmrg<!-- ( 3820f8248bfSmrg<parameter>dpy</parameter>, 3830f8248bfSmrgwhich, device_spec, ind_class, ind_id) --> 3840f8248bfSmrg 3850f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 3860f8248bfSmrg <paramdef>unsigned int <parameter>which</parameter></paramdef> 3870f8248bfSmrg <paramdef>unsigned int <parameter>device_spec</parameter></paramdef> 3880f8248bfSmrg <paramdef>unsigned int <parameter>ind_class</parameter></paramdef> 3890f8248bfSmrg <paramdef>unsigned int <parameter>ind_id</parameter></paramdef> 3900f8248bfSmrg </funcprototype> 3910f8248bfSmrg</funcsynopsis> 3920f8248bfSmrg<variablelist> 3930f8248bfSmrg <varlistentry> 3940f8248bfSmrg <term> 3950f8248bfSmrg <parameter>dpy</parameter> 3960f8248bfSmrg </term> 3970f8248bfSmrg <listitem> 3980f8248bfSmrg <para> 3990f8248bfSmrg connection to X server 4000f8248bfSmrg </para> 4010f8248bfSmrg </listitem> 4020f8248bfSmrg </varlistentry> 4030f8248bfSmrg <varlistentry> 4040f8248bfSmrg <term> 4050f8248bfSmrg <parameter>which</parameter> 4060f8248bfSmrg </term> 4070f8248bfSmrg <listitem> 4080f8248bfSmrg <para> 4090f8248bfSmrg mask indicating information to return 4100f8248bfSmrg </para> 4110f8248bfSmrg </listitem> 4120f8248bfSmrg </varlistentry> 4130f8248bfSmrg <varlistentry> 4140f8248bfSmrg <term> 4150f8248bfSmrg <parameter>device_spec</parameter> 4160f8248bfSmrg </term> 4170f8248bfSmrg <listitem> 4180f8248bfSmrg <para> 4190f8248bfSmrg device ID, or <symbol>XkbUseCoreKbd</symbol> 4200f8248bfSmrg </para> 4210f8248bfSmrg </listitem> 4220f8248bfSmrg </varlistentry> 4230f8248bfSmrg <varlistentry> 4240f8248bfSmrg <term> 4250f8248bfSmrg <parameter>ind_class</parameter> 4260f8248bfSmrg </term> 4270f8248bfSmrg <listitem> 4280f8248bfSmrg <para> 4290f8248bfSmrg feedback class for indicator requests 4300f8248bfSmrg </para> 4310f8248bfSmrg </listitem> 4320f8248bfSmrg </varlistentry> 4330f8248bfSmrg <varlistentry> 4340f8248bfSmrg <term> 4350f8248bfSmrg <parameter>ind_id</parameter> 4360f8248bfSmrg </term> 4370f8248bfSmrg <listitem> 4380f8248bfSmrg <para> 4390f8248bfSmrg feedback ID for indicator requests 4400f8248bfSmrg </para> 4410f8248bfSmrg </listitem> 4420f8248bfSmrg </varlistentry> 4430f8248bfSmrg</variablelist> 4440f8248bfSmrg 4450f8248bfSmrg<para> 4460f8248bfSmrg<function>XkbGetDeviceInfo</function> 4470f8248bfSmrgreturns information about the input device specified by 4480f8248bfSmrg<parameter>device_spec</parameter>. 4490f8248bfSmrgUnlike the 4500f8248bfSmrg<parameter>device_spec</parameter> 4510f8248bfSmrgparameter of most Xkb functions, 4520f8248bfSmrg<parameter>device_spec</parameter> 4530f8248bfSmrgdoes not need to be a keyboard device. It must, however, indicate either the 454e9fcaa8aSmrgcore keyboard or a valid X Input Extension device. 455e9fcaa8aSmrg</para> 456e9fcaa8aSmrg 457e9fcaa8aSmrg 458e9fcaa8aSmrg<para> 4590f8248bfSmrgThe 4600f8248bfSmrg<parameter>which</parameter> 4610f8248bfSmrgparameter 462e9fcaa8aSmrgis a mask specifying optional information to be returned. It is an inclusive OR 4630f8248bfSmrgof one or more of the values from <link linkend="table21.1">Table 21.1</link> 4640f8248bfSmrgand causes the returned 4650f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 4660f8248bfSmrgto contain values for the corresponding fields specified in the table. 467e9fcaa8aSmrg</para> 468e9fcaa8aSmrg 469e9fcaa8aSmrg 470e9fcaa8aSmrg<para> 4710f8248bfSmrgThe 4720f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 4730f8248bfSmrgreturned by 4740f8248bfSmrg<function>XkbGetDeviceInfo</function> 4750f8248bfSmrgalways has values for 4760f8248bfSmrg<structfield>name</structfield> 4770f8248bfSmrg(may be a null string, ""), 4780f8248bfSmrg<structfield>type</structfield>, 4790f8248bfSmrg<structfield>supported</structfield>, 4800f8248bfSmrg<structfield>unsupported</structfield>, 4810f8248bfSmrg<structfield>has_own_state</structfield>, 4820f8248bfSmrg<structfield>dflt_kbd_fb</structfield>, 4830f8248bfSmrgand 4840f8248bfSmrg<structfield>dflt_led_fb</structfield>. 4850f8248bfSmrgOther fields are filled in as specified by 4860f8248bfSmrg<parameter>which</parameter>. 487e9fcaa8aSmrg</para> 488e9fcaa8aSmrg 489e9fcaa8aSmrg 490e9fcaa8aSmrg<para> 4910f8248bfSmrgUpon return, the 4920f8248bfSmrg<structfield>supported</structfield> 4930f8248bfSmrgfield will be set to the inclusive OR of zero or more bits from 4940f8248bfSmrg<link linkend="table21.1">Table 21.1</link>; 495e9fcaa8aSmrgeach bit set indicates an optional Xkb extension device feature supported by 496e9fcaa8aSmrgthe server implementation, and a client may modify the associated behavior. 497e9fcaa8aSmrg</para> 498e9fcaa8aSmrg 499e9fcaa8aSmrg 500e9fcaa8aSmrg<para> 5010f8248bfSmrgIf the 5020f8248bfSmrg<symbol>XkbXI_ButtonActionsMask</symbol> 5030f8248bfSmrgbit is set in 5040f8248bfSmrg<parameter>which</parameter>, 5050f8248bfSmrgthe 5060f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 5070f8248bfSmrgreturned will have the button actions 5080f8248bfSmrg(<structfield>btn_acts</structfield> 5090f8248bfSmrgfield) filled in for all buttons. 510e9fcaa8aSmrg</para> 511e9fcaa8aSmrg 512e9fcaa8aSmrg 513e9fcaa8aSmrg<para> 5140f8248bfSmrgIf 5150f8248bfSmrg<parameter>which</parameter> 5160f8248bfSmrgincludes one of the bits in <symbol>XkbXI_IndicatorsMask</symbol>, 5170f8248bfSmrgthe feedback class of the 518e9fcaa8aSmrgindicators must be specified in ind_class, and the feedback ID of the 519e9fcaa8aSmrgindicators must be specified in ind_id. If the request does not include any of 5200f8248bfSmrgthe bits in <symbol>XkbXI_IndicatorsMask</symbol>, 5210f8248bfSmrgthe ind_class and ind_id parameters are 522e9fcaa8aSmrgignored. The class and ID can be obtained via the input device extension 523e9fcaa8aSmrgXListInputDevices request. 524e9fcaa8aSmrg</para> 525e9fcaa8aSmrg 526e9fcaa8aSmrg 527e9fcaa8aSmrg<para> 5280f8248bfSmrgIf any of the 5290f8248bfSmrg<symbol>XkbXI_IndicatorsMask</symbol> 5300f8248bfSmrgbits are set in 5310f8248bfSmrg<parameter>which</parameter>, 5320f8248bfSmrgthe 5330f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 5340f8248bfSmrgreturned will have filled in the portions of the 5350f8248bfSmrg<structfield>leds</structfield> 5360f8248bfSmrgstructure corresponding to the indicator feedback identified by 5370f8248bfSmrg<parameter>ind_class</parameter> 5380f8248bfSmrgand 5390f8248bfSmrg<parameter>ind_id</parameter>. 5400f8248bfSmrgThe 5410f8248bfSmrg<structfield>leds</structfield> 5420f8248bfSmrgvector of the 5430f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 5440f8248bfSmrgis allocated if necessary and 5450f8248bfSmrg<structfield>sz_leds</structfield> 5460f8248bfSmrgand 5470f8248bfSmrg<structfield>num_leds</structfield> 5480f8248bfSmrgfilled in. The 5490f8248bfSmrg<structfield>led_class</structfield>, 5500f8248bfSmrg<structfield>led_id</structfield> 5510f8248bfSmrgand 5520f8248bfSmrg<structfield>phys_indicators</structfield> 5530f8248bfSmrgfields of the 5540f8248bfSmrg<structfield>leds</structfield> 5550f8248bfSmrgentry corresponding to 5560f8248bfSmrg<parameter>ind_class</parameter> 5570f8248bfSmrgand 5580f8248bfSmrg<parameter>ind_id</parameter> 5590f8248bfSmrgare always filled in. If 5600f8248bfSmrg<parameter>which</parameter> 5610f8248bfSmrgcontains 5620f8248bfSmrg<symbol>XkbXI_IndicatorNamesMask</symbol>, 5630f8248bfSmrgthe 5640f8248bfSmrg<structfield>names_present</structfield> 5650f8248bfSmrgand 5660f8248bfSmrg<structfield>names</structfield> 5670f8248bfSmrgfields of the 5680f8248bfSmrg<structfield>leds</structfield> 5690f8248bfSmrgstructure corresponding to 5700f8248bfSmrg<parameter>ind_class</parameter> 5710f8248bfSmrgand 5720f8248bfSmrg<parameter>ind_id</parameter> 5730f8248bfSmrgare returned. 5740f8248bfSmrgIf 5750f8248bfSmrg<parameter>which</parameter> 5760f8248bfSmrgcontains 5770f8248bfSmrg<symbol>XkbXI_IndicatorStateMask</symbol>, 5780f8248bfSmrgthe corresponding 5790f8248bfSmrg<structfield>state</structfield> 5800f8248bfSmrgfield is updated. If 5810f8248bfSmrg<parameter>which</parameter> 5820f8248bfSmrgcontains 5830f8248bfSmrg<symbol>XkbXI_IndicatorMapsMask</symbol>, 5840f8248bfSmrgthe 5850f8248bfSmrg<structfield>maps_present</structfield> 5860f8248bfSmrgand 5870f8248bfSmrg<structfield>maps</structfield> 5880f8248bfSmrgfields are updated. 589e9fcaa8aSmrg</para> 590e9fcaa8aSmrg 591e9fcaa8aSmrg 592e9fcaa8aSmrg<para> 593e9fcaa8aSmrgXkb provides convenience functions to request subsets of the information 5940f8248bfSmrgavailable via 5950f8248bfSmrg<function>XkbGetDeviceInfo</function>. 5960f8248bfSmrgThese convenience functions mirror some of the mask bits. The functions all 5970f8248bfSmrgtake an 5980f8248bfSmrg<type>XkbDeviceInfoPtr</type> 5990f8248bfSmrgas an input argument and operate on the X Input Extension device specified by 6000f8248bfSmrgthe 6010f8248bfSmrg<parameter>device_spec</parameter> 6020f8248bfSmrgfield of the structure. Only the parts of the structure indicated in the 6030f8248bfSmrgfunction description are updated. The 6040f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 6050f8248bfSmrgstructure used in the function call can be obtained by calling 6060f8248bfSmrgXkbGetDeviceInfo or can be allocated by calling XkbAllocDeviceInfo 6070f8248bfSmrg(see <link linkend="Allocating_Initializing_and_Freeing_the_XkbDeviceInfoRecStructure">section 21.3</link>). 608e9fcaa8aSmrg</para> 609e9fcaa8aSmrg 610e9fcaa8aSmrg 611e9fcaa8aSmrg<para> 612e9fcaa8aSmrgThese convenience functions are described as follows. 613e9fcaa8aSmrg</para> 614e9fcaa8aSmrg 615e9fcaa8aSmrg 616e9fcaa8aSmrg<para> 617e9fcaa8aSmrgTo query the button actions associated with an X Input Extension device, use 618e9fcaa8aSmrgXkbGetDeviceButtonActions. 619e9fcaa8aSmrg</para> 620e9fcaa8aSmrg 621e9fcaa8aSmrg 6220f8248bfSmrg<indexterm significance="preferred" zone="XkbGetDeviceButtonActions"><primary><function>XkbGetDeviceButtonActions</function></primary></indexterm> 6230f8248bfSmrg<funcsynopsis id="XkbGetDeviceButtonActions"> 6240f8248bfSmrg <funcprototype> 6250f8248bfSmrg <funcdef>Status <function>XkbGetDeviceButtonActions</function></funcdef> 6260f8248bfSmrg<!-- ( 6270f8248bfSmrg<parameter>dpy, device_info, all_buttons, first_button, num_buttons</parameter> 6280f8248bfSmrg) --> 6290f8248bfSmrg 6300f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 6310f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 6320f8248bfSmrg <paramdef>Bool <parameter>all_buttons</parameter></paramdef> 6330f8248bfSmrg <paramdef>unsigned int <parameter>first_button</parameter></paramdef> 6340f8248bfSmrg <paramdef>unsigned int <parameter>num_buttons</parameter></paramdef> 6350f8248bfSmrg </funcprototype> 6360f8248bfSmrg</funcsynopsis> 6370f8248bfSmrg<variablelist> 6380f8248bfSmrg <varlistentry> 6390f8248bfSmrg <term> 6400f8248bfSmrg <parameter>dpy</parameter> 6410f8248bfSmrg </term> 6420f8248bfSmrg <listitem> 6430f8248bfSmrg <para> 6440f8248bfSmrg connection to X server 6450f8248bfSmrg </para> 6460f8248bfSmrg </listitem> 6470f8248bfSmrg </varlistentry> 6480f8248bfSmrg <varlistentry> 6490f8248bfSmrg <term> 6500f8248bfSmrg <parameter>device_info</parameter> 6510f8248bfSmrg </term> 6520f8248bfSmrg <listitem> 6530f8248bfSmrg <para> 6540f8248bfSmrg structure to update with results 6550f8248bfSmrg </para> 6560f8248bfSmrg </listitem> 6570f8248bfSmrg </varlistentry> 6580f8248bfSmrg <varlistentry> 6590f8248bfSmrg <term> 6600f8248bfSmrg <parameter>all_buttons</parameter> 6610f8248bfSmrg </term> 6620f8248bfSmrg <listitem> 6630f8248bfSmrg <para> 6640f8248bfSmrg <symbol>True</symbol> ⇒ get information for all buttons 6650f8248bfSmrg </para> 6660f8248bfSmrg </listitem> 6670f8248bfSmrg </varlistentry> 6680f8248bfSmrg <varlistentry> 6690f8248bfSmrg <term> 6700f8248bfSmrg <parameter>first_button</parameter> 6710f8248bfSmrg </term> 6720f8248bfSmrg <listitem> 6730f8248bfSmrg <para> 6740f8248bfSmrg number of first button for which info is desired 6750f8248bfSmrg </para> 6760f8248bfSmrg </listitem> 6770f8248bfSmrg </varlistentry> 6780f8248bfSmrg <varlistentry> 6790f8248bfSmrg <term> 6800f8248bfSmrg <parameter>num_buttons</parameter> 6810f8248bfSmrg </term> 6820f8248bfSmrg <listitem> 6830f8248bfSmrg <para> 6840f8248bfSmrg number of buttons for which info is desired 6850f8248bfSmrg </para> 6860f8248bfSmrg </listitem> 6870f8248bfSmrg </varlistentry> 6880f8248bfSmrg</variablelist> 6890f8248bfSmrg 6900f8248bfSmrg<para> 6910f8248bfSmrg<function>XkbGetDeviceButtonActions</function> 6920f8248bfSmrgqueries the server for the desired button information for the device indicated 6930f8248bfSmrgby the 6940f8248bfSmrg<structfield>device_spec</structfield> 6950f8248bfSmrgfield of 6960f8248bfSmrg<parameter>device_info</parameter> 6970f8248bfSmrgand waits for a reply. If successful, 6980f8248bfSmrg<function>XkbGetDeviceButtonActions</function> 6990f8248bfSmrgbackfills the button actions 7000f8248bfSmrg(<structfield>btn_acts</structfield> 7010f8248bfSmrgfield of 7020f8248bfSmrg<parameter>device_info</parameter>) 7030f8248bfSmrgfor only the requested buttons, updates the 7040f8248bfSmrg<structfield>name</structfield>, 7050f8248bfSmrg<structfield>type</structfield>, 7060f8248bfSmrg<structfield>supported</structfield>, 7070f8248bfSmrgand 7080f8248bfSmrg<structfield>unsupported</structfield> 7090f8248bfSmrgfields, and returns 7100f8248bfSmrg<symbol>Success</symbol>. 7110f8248bfSmrg</para> 7120f8248bfSmrg 7130f8248bfSmrg 7140f8248bfSmrg<para> 7150f8248bfSmrg<parameter>all_buttons</parameter>, 7160f8248bfSmrg<parameter>first_button</parameter> 7170f8248bfSmrgand 7180f8248bfSmrg<parameter>num_buttons</parameter> 7190f8248bfSmrgspecify the device buttons for which actions should be returned. Setting 7200f8248bfSmrg<parameter>all_buttons</parameter> 7210f8248bfSmrgto 7220f8248bfSmrg<symbol>True</symbol> 7230f8248bfSmrgrequests actions for all device buttons; if 7240f8248bfSmrg<parameter>all_buttons</parameter> 7250f8248bfSmrgis 7260f8248bfSmrg<symbol>False</symbol>, 7270f8248bfSmrg<parameter>first_button</parameter> 7280f8248bfSmrgand 7290f8248bfSmrg<parameter>num_buttons</parameter> 7300f8248bfSmrgspecify a range of buttons for which actions are requested. 731e9fcaa8aSmrg</para> 732e9fcaa8aSmrg 733e9fcaa8aSmrg 734e9fcaa8aSmrg<para> 735e9fcaa8aSmrgIf a compatible version of Xkb is not available in the server or the Xkb 736e9fcaa8aSmrgextension has not been properly initialized, XkbGetDeviceButtonActions returns 7370f8248bfSmrg<errorname>BadAccess</errorname>. 7380f8248bfSmrgIf allocation errors occur, a 7390f8248bfSmrg<errorname>BadAlloc</errorname> 7400f8248bfSmrgstatus is returned. If the specified device 7410f8248bfSmrg(<parameter>device_info</parameter>-><structfield>device_spec</structfield>) 7420f8248bfSmrgis invalid, a 7430f8248bfSmrg<errorname>BadKeyboard</errorname> 7440f8248bfSmrgstatus is returned. If the device has no buttons, a 7450f8248bfSmrg<errorname>BadMatch</errorname> 7460f8248bfSmrgstatus is returned. If 7470f8248bfSmrg<parameter>first_button</parameter> 7480f8248bfSmrgand 7490f8248bfSmrg<parameter>num_buttons</parameter> 7500f8248bfSmrgspecify illegal buttons, a 7510f8248bfSmrg<errorname>BadValue</errorname> 7520f8248bfSmrgstatus is returned. 753e9fcaa8aSmrg</para> 754e9fcaa8aSmrg 755e9fcaa8aSmrg 756e9fcaa8aSmrg<para> 757e9fcaa8aSmrgTo query the indicator names, maps, and state associated with an LED feedback 758e9fcaa8aSmrgof an input extension device, use XkbGetDeviceLedInfo. 759e9fcaa8aSmrg</para> 760e9fcaa8aSmrg 761e9fcaa8aSmrg 7620f8248bfSmrg<indexterm significance="preferred" zone="XkbGetDeviceLedInfo"><primary><function>XkbGetDeviceLedInfo</function></primary></indexterm> 7630f8248bfSmrg<funcsynopsis id="XkbGetDeviceLedInfo"> 7640f8248bfSmrg <funcprototype> 7650f8248bfSmrg <funcdef>Status <function>XkbGetDeviceLedInfo</function></funcdef> 7660f8248bfSmrg<!-- ( 7670f8248bfSmrg<parameter>dpy, device_i</parameter> 7680f8248bfSmrgnfo, led_class, led_id, which) --> 7690f8248bfSmrg 7700f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 7710f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 7720f8248bfSmrg <paramdef>unsigned int <parameter>led_class</parameter></paramdef> 7730f8248bfSmrg <paramdef>unsigned int <parameter>led_id</parameter></paramdef> 7740f8248bfSmrg <paramdef>unsigned int <parameter>which</parameter></paramdef> 7750f8248bfSmrg </funcprototype> 7760f8248bfSmrg</funcsynopsis> 7770f8248bfSmrg<variablelist> 7780f8248bfSmrg <varlistentry> 7790f8248bfSmrg <term> 7800f8248bfSmrg <parameter>dpy</parameter> 7810f8248bfSmrg </term> 7820f8248bfSmrg <listitem> 7830f8248bfSmrg <para> 7840f8248bfSmrg connection to X server 7850f8248bfSmrg </para> 7860f8248bfSmrg </listitem> 7870f8248bfSmrg </varlistentry> 7880f8248bfSmrg <varlistentry> 7890f8248bfSmrg <term> 7900f8248bfSmrg <parameter>device_info</parameter> 7910f8248bfSmrg </term> 7920f8248bfSmrg <listitem> 7930f8248bfSmrg <para> 7940f8248bfSmrg structure to update with results 7950f8248bfSmrg </para> 7960f8248bfSmrg </listitem> 7970f8248bfSmrg </varlistentry> 7980f8248bfSmrg <varlistentry> 7990f8248bfSmrg <term> 8000f8248bfSmrg <parameter>led_class</parameter> 8010f8248bfSmrg </term> 8020f8248bfSmrg <listitem> 8030f8248bfSmrg <para> 8040f8248bfSmrg LED feedback class assigned by input extension 8050f8248bfSmrg </para> 8060f8248bfSmrg </listitem> 8070f8248bfSmrg </varlistentry> 8080f8248bfSmrg <varlistentry> 8090f8248bfSmrg <term> 8100f8248bfSmrg <parameter>led_id</parameter> 8110f8248bfSmrg </term> 8120f8248bfSmrg <listitem> 8130f8248bfSmrg <para> 8140f8248bfSmrg LED feedback ID assigned by input extension 8150f8248bfSmrg </para> 8160f8248bfSmrg </listitem> 8170f8248bfSmrg </varlistentry> 8180f8248bfSmrg <varlistentry> 8190f8248bfSmrg <term> 8200f8248bfSmrg <parameter>which</parameter> 8210f8248bfSmrg </term> 8220f8248bfSmrg <listitem> 8230f8248bfSmrg <para> 8240f8248bfSmrg mask indicating desired information 8250f8248bfSmrg </para> 8260f8248bfSmrg </listitem> 8270f8248bfSmrg </varlistentry> 8280f8248bfSmrg</variablelist> 8290f8248bfSmrg 8300f8248bfSmrg<para> 8310f8248bfSmrg<function>XkbGetDeviceLedInfo</function> 8320f8248bfSmrgqueries the server for the desired LED information for the feedback specified 8330f8248bfSmrgby 8340f8248bfSmrg<parameter>led_class</parameter> 8350f8248bfSmrgand 8360f8248bfSmrg<parameter>led_id</parameter> 8370f8248bfSmrgfor the X input extension device indicated by 8380f8248bfSmrg<structfield>device_spec</structfield>-><parameter>device_info</parameter> 8390f8248bfSmrgand waits for a reply. If successful, 8400f8248bfSmrg<function>XkbGetDeviceLedInfo</function> 8410f8248bfSmrgbackfills the relevant fields of 8420f8248bfSmrg<parameter>device_info</parameter> 8430f8248bfSmrgas determined by 8440f8248bfSmrg<parameter>which</parameter> 8450f8248bfSmrgwith the results and returns 8460f8248bfSmrg<symbol>Success</symbol>. 8470f8248bfSmrgValid values for 8480f8248bfSmrg<parameter>which</parameter> 8490f8248bfSmrgare the inclusive OR of any of 8500f8248bfSmrg<symbol>XkbXI_IndicatorNamesMask</symbol>, 8510f8248bfSmrg<symbol>XkbXI_IndicatorMapsMask</symbol>, 8520f8248bfSmrgand 8530f8248bfSmrg<symbol>XkbXI_IndicatorStateMask</symbol>. 8540f8248bfSmrg</para> 8550f8248bfSmrg 8560f8248bfSmrg 8570f8248bfSmrg<para> 8580f8248bfSmrgThe fields of 8590f8248bfSmrg<parameter>device_info</parameter> 8600f8248bfSmrgthat are filled in when this request succeeds are 8610f8248bfSmrg<structfield>name</structfield>, 8620f8248bfSmrg<structfield>type</structfield>, 8630f8248bfSmrg<structfield>supported</structfield>, 8640f8248bfSmrgand 8650f8248bfSmrg<structfield>unsupported</structfield>, 8660f8248bfSmrgand portions of the 8670f8248bfSmrg<structfield>leds</structfield> 8680f8248bfSmrgstructure corresponding to 8690f8248bfSmrg<parameter>led_class</parameter> 8700f8248bfSmrgand 8710f8248bfSmrg<parameter>led_id</parameter> 8720f8248bfSmrgas indicated by the bits set in 8730f8248bfSmrg<parameter>which</parameter>. 8740f8248bfSmrgThe 8750f8248bfSmrg<structfield>device_info->leds</structfield> 8760f8248bfSmrgvector is allocated if necessary and 8770f8248bfSmrg<structfield>sz_leds</structfield> 8780f8248bfSmrgand 8790f8248bfSmrg<structfield>num_leds</structfield> 8800f8248bfSmrgfilled in. The 8810f8248bfSmrg<parameter>led_class</parameter>, 8820f8248bfSmrg<parameter>led_id</parameter> 8830f8248bfSmrgand 8840f8248bfSmrg<structfield>phys_indicators</structfield> 8850f8248bfSmrgfields of the 8860f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds</structfield> 8870f8248bfSmrgentry corresponding to 8880f8248bfSmrg<parameter>led_class</parameter> 8890f8248bfSmrgand 8900f8248bfSmrg<parameter>led_id</parameter> 8910f8248bfSmrgare always filled in. 8920f8248bfSmrg</para> 8930f8248bfSmrg 8940f8248bfSmrg 8950f8248bfSmrg<para> 8960f8248bfSmrgIf 8970f8248bfSmrg<parameter>which</parameter> 8980f8248bfSmrgcontains 8990f8248bfSmrg<symbol>XkbXI_IndicatorNamesMask</symbol>, 9000f8248bfSmrgthe 9010f8248bfSmrg<structfield>names_present</structfield> 9020f8248bfSmrgand 9030f8248bfSmrg<structfield>names</structfield> 9040f8248bfSmrgfields of the 9050f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds</structfield> 9060f8248bfSmrgstructure corresponding to 9070f8248bfSmrg<parameter>led_class</parameter> 9080f8248bfSmrgand 9090f8248bfSmrg<parameter>led_id</parameter> 9100f8248bfSmrgare updated, if 9110f8248bfSmrg<parameter>which</parameter> 9120f8248bfSmrgcontains 9130f8248bfSmrg<symbol>XkbXI_IndicatorStateMask</symbol>, 9140f8248bfSmrgthe corresponding 9150f8248bfSmrg<structfield>state</structfield> 9160f8248bfSmrgfield is updated, and if 9170f8248bfSmrg<parameter>which</parameter> 9180f8248bfSmrgcontains 9190f8248bfSmrg<symbol>XkbXI_IndicatorMapsMask</symbol>, 9200f8248bfSmrgthe 9210f8248bfSmrg<structfield>maps_present</structfield> 9220f8248bfSmrgand 9230f8248bfSmrg<structfield>maps</structfield> 9240f8248bfSmrgfields are updated. 925e9fcaa8aSmrg</para> 926e9fcaa8aSmrg 927e9fcaa8aSmrg 928e9fcaa8aSmrg<para> 929e9fcaa8aSmrgIf a compatible version of Xkb is not available in the server or the Xkb 9300f8248bfSmrgextension has not been properly initialized, 9310f8248bfSmrg<function>XkbGetDeviceLedInfo</function> 9320f8248bfSmrgreturns 9330f8248bfSmrg<errorname>BadAccess</errorname>. 9340f8248bfSmrgIf allocation errors occur, a 9350f8248bfSmrg<errorname>BadAlloc</errorname> 9360f8248bfSmrgstatus is returned. If the device has no indicators, a 9370f8248bfSmrg<errorname>BadMatch</errorname> 9380f8248bfSmrgerror is returned. If 9390f8248bfSmrg<structfield>ledClass</structfield> 9400f8248bfSmrgor 9410f8248bfSmrg<structfield>ledID</structfield> 9420f8248bfSmrghave illegal values, a 9430f8248bfSmrg<errorname>BadValue</errorname> 9440f8248bfSmrgerror is returned. If they have legal values but do not specify a feedback 9450f8248bfSmrgthat contains LEDs and is associated with the specified device, a 9460f8248bfSmrg<errorname>BadMatch</errorname> 9470f8248bfSmrgerror is returned. 948e9fcaa8aSmrg</para> 949e9fcaa8aSmrg 950e9fcaa8aSmrg 951e9fcaa8aSmrg</sect1> 952eb411b4bSmrg<sect1 id='Allocating_Initializing_and_Freeing_the_XkbDeviceInfoRecStructure'> 953e9fcaa8aSmrg<title>Allocating, Initializing, and Freeing the XkbDeviceInfoRec 954e9fcaa8aSmrgStructure</title> 955e9fcaa8aSmrg 956e9fcaa8aSmrg<para> 9570f8248bfSmrgTo obtain an 9580f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 9590f8248bfSmrgstructure, use XkbGetDeviceInfo or XkbAllocDeviceInfo. 9600f8248bfSmrg</para> 9610f8248bfSmrg 9620f8248bfSmrg<indexterm significance="preferred" zone="XkbAllocDeviceInfo"><primary><function>XkbAllocDeviceInfo</function></primary></indexterm> 9630f8248bfSmrg<funcsynopsis id="XkbAllocDeviceInfo"> 9640f8248bfSmrg <funcprototype> 9650f8248bfSmrg <funcdef>XkbDeviceInfoPtr <function>XkbAllocDeviceInfo</function></funcdef> 9660f8248bfSmrg<!-- (device_spec, n_buttons, sz_leds) --> 9670f8248bfSmrg 9680f8248bfSmrg <paramdef>unsigned int <parameter>device_spec</parameter></paramdef> 9690f8248bfSmrg <paramdef>unsigned int <parameter>n_buttons</parameter></paramdef> 9700f8248bfSmrg <paramdef>unsigned int <parameter>sz_leds</parameter></paramdef> 9710f8248bfSmrg </funcprototype> 9720f8248bfSmrg</funcsynopsis> 9730f8248bfSmrg<variablelist> 9740f8248bfSmrg <varlistentry> 9750f8248bfSmrg <term> 9760f8248bfSmrg <parameter>device_spec</parameter> 9770f8248bfSmrg </term> 9780f8248bfSmrg <listitem> 9790f8248bfSmrg <para> 9800f8248bfSmrg device ID with which structure will be used 9810f8248bfSmrg </para> 9820f8248bfSmrg </listitem> 9830f8248bfSmrg </varlistentry> 9840f8248bfSmrg <varlistentry> 9850f8248bfSmrg <term> 9860f8248bfSmrg <parameter>n_buttons</parameter> 9870f8248bfSmrg </term> 9880f8248bfSmrg <listitem> 9890f8248bfSmrg <para> 9900f8248bfSmrg number of button actions to allocate space for 9910f8248bfSmrg </para> 9920f8248bfSmrg </listitem> 9930f8248bfSmrg </varlistentry> 9940f8248bfSmrg <varlistentry> 9950f8248bfSmrg <term> 9960f8248bfSmrg <parameter>sz_leds</parameter> 9970f8248bfSmrg </term> 9980f8248bfSmrg <listitem> 9990f8248bfSmrg <para> 10000f8248bfSmrg number of LED feedbacks to allocate space for 10010f8248bfSmrg </para> 10020f8248bfSmrg </listitem> 10030f8248bfSmrg </varlistentry> 10040f8248bfSmrg</variablelist> 10050f8248bfSmrg 10060f8248bfSmrg<para> 10070f8248bfSmrg<function>XkbAllocDeviceInfo</function> 10080f8248bfSmrgallocates space for an 10090f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 10100f8248bfSmrgstructure and initializes that structure’s 10110f8248bfSmrg<parameter>device_spec</parameter> 10120f8248bfSmrgfield with the device ID specified by device_spec. If 10130f8248bfSmrg<parameter>n_buttons</parameter> 10140f8248bfSmrgis nonzero, 10150f8248bfSmrg<parameter>n_buttons</parameter> 10160f8248bfSmrg<structname>XkbAction</structname>s 10170f8248bfSmrgare linked into the 10180f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 10190f8248bfSmrgstructure and initialized to zero. If sz_leds is nonzero, 10200f8248bfSmrg<parameter>sz_leds</parameter> 10210f8248bfSmrg<structname>XkbDeviceLedInfoRec</structname> 10220f8248bfSmrgstructures are also allocated and linked into the 10230f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 10240f8248bfSmrgstructure. If you request 10250f8248bfSmrg<structname>XkbDeviceLedInfoRec</structname> 10260f8248bfSmrgstructures be allocated using this request, you must initialize them 1027e9fcaa8aSmrgexplicitly. 1028e9fcaa8aSmrg</para> 1029e9fcaa8aSmrg 1030e9fcaa8aSmrg 1031e9fcaa8aSmrg<para> 10320f8248bfSmrgTo obtain an 10330f8248bfSmrg<structname>XkbDeviceLedInfoRec</structname> 10340f8248bfSmrgstructure, use XkbAllocDeviceLedInfo. 10350f8248bfSmrg</para> 10360f8248bfSmrg 10370f8248bfSmrg 10380f8248bfSmrg<indexterm significance="preferred" zone="XkbAllocDeviceLedInfo"><primary><function>XkbAllocDeviceLedInfo</function></primary></indexterm> 10390f8248bfSmrg<funcsynopsis id="XkbAllocDeviceLedInfo"> 10400f8248bfSmrg <funcprototype> 10410f8248bfSmrg <funcdef>Status <function>XkbAllocDeviceLedInfo</function></funcdef> 10420f8248bfSmrg<!-- (devi, num_needed) --> 10430f8248bfSmrg 10440f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 10450f8248bfSmrg <paramdef>int <parameter>num_needed</parameter></paramdef> 10460f8248bfSmrg </funcprototype> 10470f8248bfSmrg</funcsynopsis> 10480f8248bfSmrg<variablelist> 10490f8248bfSmrg <varlistentry> 10500f8248bfSmrg <term> 10510f8248bfSmrg <parameter>device_info</parameter> 10520f8248bfSmrg </term> 10530f8248bfSmrg <listitem> 10540f8248bfSmrg <para> 10550f8248bfSmrg structure in which to allocate LED space 10560f8248bfSmrg </para> 10570f8248bfSmrg </listitem> 10580f8248bfSmrg </varlistentry> 10590f8248bfSmrg <varlistentry> 10600f8248bfSmrg <term> 10610f8248bfSmrg <parameter>num_needed</parameter> 10620f8248bfSmrg </term> 10630f8248bfSmrg <listitem> 10640f8248bfSmrg <para> 10650f8248bfSmrg number of indicators to allocate space for 10660f8248bfSmrg </para> 10670f8248bfSmrg </listitem> 10680f8248bfSmrg </varlistentry> 10690f8248bfSmrg</variablelist> 10700f8248bfSmrg 10710f8248bfSmrg<para> 10720f8248bfSmrg<function>XkbAllocDeviceLedInfo</function> 10730f8248bfSmrgallocates space for an 10740f8248bfSmrg<structname>XkbDeviceLedInfoRec</structname> 10750f8248bfSmrgand places it in 10760f8248bfSmrg<parameter>device_info</parameter>. 10770f8248bfSmrgIf num_needed is nonzero, 10780f8248bfSmrg<parameter>num_needed</parameter> 10790f8248bfSmrg<structname>XkbIndicatorMapRec</structname> 10800f8248bfSmrgstructures are also allocated and linked into the 10810f8248bfSmrg<structname>XkbDeviceLedInfoRec</structname> 10820f8248bfSmrgstructure. If you request 10830f8248bfSmrg<structname>XkbIndicatorMapRec</structname> 10840f8248bfSmrgstructures be allocated using this request, you must initialize them 1085e9fcaa8aSmrgexplicitly. All other fields are initialized to zero. 1086e9fcaa8aSmrg</para> 1087e9fcaa8aSmrg 1088e9fcaa8aSmrg 1089e9fcaa8aSmrg<para> 10900f8248bfSmrgTo initialize an 10910f8248bfSmrg<structname>XkbDeviceLedInfoRec</structname> 10920f8248bfSmrgstructure, use XkbAddDeviceLedInfo. 10930f8248bfSmrg</para> 10940f8248bfSmrg 10950f8248bfSmrg 10960f8248bfSmrg<indexterm significance="preferred" zone="XkbAddDeviceLedInfo"><primary><function>XkbAddDeviceLedInfo</function></primary></indexterm> 10970f8248bfSmrg<funcsynopsis id="XkbAddDeviceLedInfo"> 10980f8248bfSmrg <funcprototype> 10990f8248bfSmrg <funcdef>XkbDeviceLedInfoPtr <function>XkbAddDeviceLedInfo</function></funcdef> 11000f8248bfSmrg<!-- (device_info, led_class, led_id) --> 11010f8248bfSmrg 11020f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 11030f8248bfSmrg <paramdef>unsigned int <parameter>led_class</parameter></paramdef> 11040f8248bfSmrg <paramdef>unsigned int <parameter>led_id</parameter></paramdef> 11050f8248bfSmrg </funcprototype> 11060f8248bfSmrg</funcsynopsis> 11070f8248bfSmrg<variablelist> 11080f8248bfSmrg <varlistentry> 11090f8248bfSmrg <term> 11100f8248bfSmrg <parameter>device_info</parameter> 11110f8248bfSmrg </term> 11120f8248bfSmrg <listitem> 11130f8248bfSmrg <para> 11140f8248bfSmrg structure in which to add LED info 11150f8248bfSmrg </para> 11160f8248bfSmrg </listitem> 11170f8248bfSmrg </varlistentry> 11180f8248bfSmrg <varlistentry> 11190f8248bfSmrg <term> 11200f8248bfSmrg <parameter>led_class</parameter> 11210f8248bfSmrg </term> 11220f8248bfSmrg <listitem> 11230f8248bfSmrg <para> 11240f8248bfSmrg input extension class for LED device of interest 11250f8248bfSmrg </para> 11260f8248bfSmrg </listitem> 11270f8248bfSmrg </varlistentry> 11280f8248bfSmrg <varlistentry> 11290f8248bfSmrg <term> 11300f8248bfSmrg <parameter>led_id</parameter> 11310f8248bfSmrg </term> 11320f8248bfSmrg <listitem> 11330f8248bfSmrg <para> 11340f8248bfSmrg input extension ID for LED device of interest 11350f8248bfSmrg </para> 11360f8248bfSmrg </listitem> 11370f8248bfSmrg </varlistentry> 11380f8248bfSmrg</variablelist> 11390f8248bfSmrg 11400f8248bfSmrg<para> 11410f8248bfSmrg<function>XkbAddDeviceLedInfo</function> 11420f8248bfSmrgfirst checks to see whether an entry matching 11430f8248bfSmrg<parameter>led_class</parameter> 11440f8248bfSmrgand 11450f8248bfSmrg<parameter>led_id</parameter> 11460f8248bfSmrgalready exists in the 11470f8248bfSmrg<structfield>device_info->leds</structfield> 11480f8248bfSmrgarray. If it finds a matching entry, it returns a pointer to that entry. 11490f8248bfSmrgOtherwise, it checks to be sure there is at least one empty entry in 11500f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds</structfield> 11510f8248bfSmrgand extends it if there is not enough room. It then increments 11520f8248bfSmrg<parameter>device_info</parameter>-><structfield>num_leds</structfield> 11530f8248bfSmrgand fills in the next available entry in 11540f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds</structfield> 11550f8248bfSmrgwith 11560f8248bfSmrg<parameter>led_class</parameter> 11570f8248bfSmrgand 11580f8248bfSmrg<parameter>led_id</parameter>. 11590f8248bfSmrg</para> 11600f8248bfSmrg 11610f8248bfSmrg 11620f8248bfSmrg<para> 11630f8248bfSmrgIf successful, 11640f8248bfSmrg<function>XkbAddDeviceLedInfo</function> 11650f8248bfSmrgreturns a pointer to the 11660f8248bfSmrg<structname>XkbDeviceLedInfoRec</structname> 11670f8248bfSmrgstructure that was initialized. If unable to allocate sufficient storage, or 11680f8248bfSmrgif 11690f8248bfSmrg<parameter>device_info</parameter> 11700f8248bfSmrgpoints to an invalid 11710f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 11720f8248bfSmrgstructure, or if 11730f8248bfSmrg<parameter>led_class</parameter> 11740f8248bfSmrgor 11750f8248bfSmrg<parameter>led_id</parameter> 11760f8248bfSmrgare inappropriate, 11770f8248bfSmrg<function>XkbAddDeviceLedInfo</function> 11780f8248bfSmrgreturns 11790f8248bfSmrg<symbol>NULL</symbol>. 11800f8248bfSmrg</para> 11810f8248bfSmrg 11820f8248bfSmrg 11830f8248bfSmrg<para> 11840f8248bfSmrgTo allocate additional space for button actions in an 11850f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 11860f8248bfSmrgstructure, use XkbResizeDeviceButtonActions. 11870f8248bfSmrg</para> 11880f8248bfSmrg 11890f8248bfSmrg 11900f8248bfSmrg<indexterm significance="preferred" zone="XkbResizeDeviceButtonActions"><primary><function>XkbResizeDeviceButtonActions</function></primary></indexterm> 11910f8248bfSmrg<funcsynopsis id="XkbResizeDeviceButtonActions"> 11920f8248bfSmrg <funcprototype> 11930f8248bfSmrg <funcdef>Status <function>XkbResizeDeviceButtonActions</function></funcdef> 11940f8248bfSmrg<!-- (device_info, new_total) --> 11950f8248bfSmrg 11960f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 11970f8248bfSmrg <paramdef>unsigned int <parameter>new_total</parameter></paramdef> 11980f8248bfSmrg </funcprototype> 11990f8248bfSmrg</funcsynopsis> 12000f8248bfSmrg<variablelist> 12010f8248bfSmrg <varlistentry> 12020f8248bfSmrg <term> 12030f8248bfSmrg <parameter>device_info</parameter> 12040f8248bfSmrg </term> 12050f8248bfSmrg <listitem> 12060f8248bfSmrg <para> 12070f8248bfSmrg structure in which to allocate button actions 12080f8248bfSmrg </para> 12090f8248bfSmrg </listitem> 12100f8248bfSmrg </varlistentry> 12110f8248bfSmrg <varlistentry> 12120f8248bfSmrg <term> 12130f8248bfSmrg <parameter>new_total</parameter> 12140f8248bfSmrg </term> 12150f8248bfSmrg <listitem> 12160f8248bfSmrg <para> 12170f8248bfSmrg new total number of button actions needed 12180f8248bfSmrg </para> 12190f8248bfSmrg </listitem> 12200f8248bfSmrg </varlistentry> 12210f8248bfSmrg</variablelist> 12220f8248bfSmrg 12230f8248bfSmrg<para> 12240f8248bfSmrg<function>XkbResizeDeviceButtonActions</function> 12250f8248bfSmrgreallocates space, if necessary, to make sure there is room for a total of 12260f8248bfSmrg<parameter>new_total</parameter> 12270f8248bfSmrgbutton actions in the 12280f8248bfSmrg<parameter>device_info</parameter> 12290f8248bfSmrgstructure. Any new entries allocated are zeroed. If successful, 12300f8248bfSmrg<function>XkbResizeDeviceButtonActions</function> 12310f8248bfSmrgreturns Success. If new_total is zero, all button actions are deleted, 12320f8248bfSmrg<parameter>device_info</parameter>-><structfield>num_btns</structfield> 12330f8248bfSmrgis set to zero, and 12340f8248bfSmrg<parameter>device_info</parameter>-><structfield>btn_acts</structfield> 12350f8248bfSmrgis set to 12360f8248bfSmrg<symbol>NULL</symbol>. 12370f8248bfSmrgIf device_info is invalid or new_total is greater than 255, 12380f8248bfSmrg<errorname>BadValue</errorname> 12390f8248bfSmrgis returned. If a memory allocation failure occurs, a 12400f8248bfSmrg<errorname>BadAlloc</errorname> 12410f8248bfSmrgis returned. 12420f8248bfSmrg</para> 12430f8248bfSmrg 12440f8248bfSmrg 12450f8248bfSmrg<para> 12460f8248bfSmrgTo free an 12470f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 12480f8248bfSmrgstructure, use XkbFreeDeviceInfo. 12490f8248bfSmrg</para> 12500f8248bfSmrg 12510f8248bfSmrg 12520f8248bfSmrg<indexterm significance="preferred" zone="XkbFreeDeviceInfo"><primary><function>XkbFreeDeviceInfo</function></primary></indexterm> 12530f8248bfSmrg<funcsynopsis id="XkbFreeDeviceInfo"> 12540f8248bfSmrg <funcprototype> 12550f8248bfSmrg <funcdef>void <function>XkbFreeDeviceInfo</function></funcdef> 12560f8248bfSmrg<!-- (device_info, which, free_all) --> 12570f8248bfSmrg 12580f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 12590f8248bfSmrg <paramdef>unsigned int <parameter>which</parameter></paramdef> 12600f8248bfSmrg <paramdef>Bool <parameter>free_all</parameter></paramdef> 12610f8248bfSmrg </funcprototype> 12620f8248bfSmrg</funcsynopsis> 12630f8248bfSmrg<variablelist> 12640f8248bfSmrg <varlistentry> 12650f8248bfSmrg <term> 12660f8248bfSmrg <parameter>device_info</parameter> 12670f8248bfSmrg </term> 12680f8248bfSmrg <listitem> 12690f8248bfSmrg <para> 12700f8248bfSmrg pointer to <structname>XkbDeviceInfoRec</structname> in which to free items 12710f8248bfSmrg </para> 12720f8248bfSmrg </listitem> 12730f8248bfSmrg </varlistentry> 12740f8248bfSmrg <varlistentry> 12750f8248bfSmrg <term> 12760f8248bfSmrg <parameter>which</parameter> 12770f8248bfSmrg </term> 12780f8248bfSmrg <listitem> 12790f8248bfSmrg <para> 12800f8248bfSmrg mask of components of <parameter>device_info</parameter> to free 12810f8248bfSmrg </para> 12820f8248bfSmrg </listitem> 12830f8248bfSmrg </varlistentry> 12840f8248bfSmrg <varlistentry> 12850f8248bfSmrg <term> 12860f8248bfSmrg <parameter>free_all</parameter> 12870f8248bfSmrg </term> 12880f8248bfSmrg <listitem> 12890f8248bfSmrg <para> 12900f8248bfSmrg <symbol>True</symbol> ⇒ free everything, including device_info 12910f8248bfSmrg </para> 12920f8248bfSmrg </listitem> 12930f8248bfSmrg </varlistentry> 12940f8248bfSmrg</variablelist> 12950f8248bfSmrg 12960f8248bfSmrg<para> 12970f8248bfSmrgIf free_all is 12980f8248bfSmrg<symbol>True</symbol>, 12990f8248bfSmrgthe 13000f8248bfSmrg<function>XkbFreeDeviceInfo</function> 13010f8248bfSmrgfrees all components of 13020f8248bfSmrg<parameter>device_info</parameter> 13030f8248bfSmrgand the 13040f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 13050f8248bfSmrgstructure pointed to by 13060f8248bfSmrg<parameter>device_info</parameter> 13070f8248bfSmrgitself. If free_all is 13080f8248bfSmrg<symbol>False</symbol>, 13090f8248bfSmrgthe value of which determines which subcomponents are freed. 13100f8248bfSmrg<parameter>which</parameter> 13110f8248bfSmrgis an inclusive OR of one or more of the values from 13120f8248bfSmrg<link linkend="table21.1">Table 21.1</link>. If which 13130f8248bfSmrgcontains <symbol>XkbXI_ButtonActionsMask</symbol>, 13140f8248bfSmrgall button actions associated with 13150f8248bfSmrg<parameter>device_info</parameter> 13160f8248bfSmrgare freed, 13170f8248bfSmrg<parameter>device_info</parameter>-><structfield>btn_acts</structfield> 13180f8248bfSmrgis set to 13190f8248bfSmrg<symbol>NULL</symbol>, 13200f8248bfSmrgand 13210f8248bfSmrg<parameter>device_info</parameter>-><structfield>num_btns</structfield> 13220f8248bfSmrgis set to zero. If which contains all bits in 13230f8248bfSmrg<symbol>XkbXI_IndicatorsMask</symbol>, all 13240f8248bfSmrg<structname>XkbDeviceLedInfoRec</structname> 13250f8248bfSmrgstructures associated with 13260f8248bfSmrg<parameter>device_info</parameter> 13270f8248bfSmrgare freed, 13280f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds</structfield> 13290f8248bfSmrgis set to 13300f8248bfSmrg<symbol>NULL</symbol>, 13310f8248bfSmrgand 13320f8248bfSmrg<parameter>device_info</parameter>-><structfield>sz_leds</structfield> 13330f8248bfSmrgand 13340f8248bfSmrg<parameter>device_info</parameter>-><structfield>num_leds</structfield> 13350f8248bfSmrgare set to zero. If which contains <symbol>XkbXI_IndicatorMapsMask</symbol>, 13360f8248bfSmrgall indicator maps associated with 13370f8248bfSmrg<parameter>device_info</parameter> 13380f8248bfSmrgare cleared, but the number of LEDs and the leds structures themselves are 13390f8248bfSmrgpreserved. If which contains <symbol>XkbXI_IndicatorNamesMask</symbol>, 13400f8248bfSmrgall indicator names 1341e9fcaa8aSmrgassociated with device_info are cleared, but the number of LEDs and the leds 1342e9fcaa8aSmrgstructures themselves are preserved. If which contains 13430f8248bfSmrg<symbol>XkbXI_IndicatorStateMask</symbol>, 13440f8248bfSmrgthe indicator state associated with the 13450f8248bfSmrg<parameter>device_info</parameter> 13460f8248bfSmrgleds are set to zeros but the number of LEDs and the leds structures 1347e9fcaa8aSmrgthemselves are preserved. 1348e9fcaa8aSmrg</para> 1349e9fcaa8aSmrg 1350e9fcaa8aSmrg 1351e9fcaa8aSmrg</sect1> 1352eb411b4bSmrg<sect1 id='Setting_Xkb_Features_for_Non_KeyClass_Input_Extension_Devices'> 1353eb411b4bSmrg<title>Setting Xkb Features for Non-KeyClass Input Extension Devices</title> 1354e9fcaa8aSmrg 1355e9fcaa8aSmrg<para> 1356e9fcaa8aSmrgThe Xkb extension allows clients to assign any key action to either core 1357e9fcaa8aSmrgpointer or input extension device buttons. This makes it possible to control 1358e9fcaa8aSmrgthe keyboard or generate keyboard key events from extension devices or from the 1359e9fcaa8aSmrgcore pointer. 1360e9fcaa8aSmrg</para> 1361e9fcaa8aSmrg 1362e9fcaa8aSmrg 1363e9fcaa8aSmrg<para> 1364e9fcaa8aSmrgKey actions assigned to core X pointer buttons or input extension device 1365e9fcaa8aSmrgbuttons cause key events to be generated as if they had originated from the 1366e9fcaa8aSmrgcore X keyboard. 1367e9fcaa8aSmrg</para> 1368e9fcaa8aSmrg 1369e9fcaa8aSmrg 1370e9fcaa8aSmrg<para> 1371e9fcaa8aSmrgXkb implementations are required to support key actions for the buttons of the 1372e9fcaa8aSmrgcore pointer device, but support for actions on extension devices is optional. 1373e9fcaa8aSmrgImplementations that do not support button actions for extension devices must 13740f8248bfSmrgnot set the 13750f8248bfSmrg<symbol>XkbXI_ButtonActionsMask</symbol> 13760f8248bfSmrgbit in the 13770f8248bfSmrg<structfield>supported</structfield> 13780f8248bfSmrgfield of an 13790f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 13800f8248bfSmrgstructure. 1381e9fcaa8aSmrg</para> 1382e9fcaa8aSmrg 1383e9fcaa8aSmrg 1384e9fcaa8aSmrg<para> 1385e9fcaa8aSmrgIf a client attempts to modify valid characteristics of a device using an 1386e9fcaa8aSmrgimplementation that does not support modification of those characteristics, no 1387e9fcaa8aSmrgprotocol error is generated. Instead, the server reports a failure for the 13880f8248bfSmrgrequest; it also sends an 13890f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 13900f8248bfSmrgevent to the client that issued the request if the client has selected to 1391e9fcaa8aSmrgreceive these events. 1392e9fcaa8aSmrg</para> 1393e9fcaa8aSmrg 1394e9fcaa8aSmrg 1395e9fcaa8aSmrg<para> 1396e9fcaa8aSmrgTo change characteristics of an X Input Extension device in the server, first 13970f8248bfSmrgmodify a local copy of the device structure and then use either 13980f8248bfSmrg<function>XkbSetDeviceInfo</function>, 13990f8248bfSmrgor, to save network traffic, use an 14000f8248bfSmrg<structname>XkbDeviceChangesRec</structname> 14010f8248bfSmrgstructure (see <link linkend="Tracking_Changes_to_Extension_Devices">section 21.6</link>) and call 14020f8248bfSmrg<function>XkbChangeDeviceInfo</function> 14030f8248bfSmrgto download the changes to the server. 1404e9fcaa8aSmrg</para> 1405e9fcaa8aSmrg 1406e9fcaa8aSmrg 1407e9fcaa8aSmrg<para> 1408e9fcaa8aSmrgTo modify some or all of the characteristics of an X Input Extension device, 1409e9fcaa8aSmrguse XkbSetDeviceInfo. 1410e9fcaa8aSmrg</para> 1411e9fcaa8aSmrg 14120f8248bfSmrg<indexterm significance="preferred" zone="XkbSetDeviceInfo"><primary><function>XkbSetDeviceInfo</function></primary></indexterm> 14130f8248bfSmrg<funcsynopsis id="XkbSetDeviceInfo"> 14140f8248bfSmrg <funcprototype> 14150f8248bfSmrg <funcdef>Bool <function>XkbSetDeviceInfo</function></funcdef> 14160f8248bfSmrg<!-- ( 14170f8248bfSmrg<parameter>dpy</parameter>, 14180f8248bfSmrgwhich, device_info) --> 14190f8248bfSmrg 14200f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 14210f8248bfSmrg <paramdef>unsigned int <parameter>which</parameter></paramdef> 14220f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 14230f8248bfSmrg </funcprototype> 14240f8248bfSmrg</funcsynopsis> 14250f8248bfSmrg<variablelist> 14260f8248bfSmrg <varlistentry> 14270f8248bfSmrg <term> 14280f8248bfSmrg <parameter>dpy</parameter> 14290f8248bfSmrg </term> 14300f8248bfSmrg <listitem> 14310f8248bfSmrg <para> 14320f8248bfSmrg connection to X server 14330f8248bfSmrg </para> 14340f8248bfSmrg </listitem> 14350f8248bfSmrg </varlistentry> 14360f8248bfSmrg <varlistentry> 14370f8248bfSmrg <term> 14380f8248bfSmrg <parameter>which</parameter> 14390f8248bfSmrg </term> 14400f8248bfSmrg <listitem> 14410f8248bfSmrg <para> 14420f8248bfSmrg mask indicating characteristics to modify 14430f8248bfSmrg </para> 14440f8248bfSmrg </listitem> 14450f8248bfSmrg </varlistentry> 14460f8248bfSmrg <varlistentry> 14470f8248bfSmrg <term> 14480f8248bfSmrg <parameter>device_info</parameter> 14490f8248bfSmrg </term> 14500f8248bfSmrg <listitem> 14510f8248bfSmrg <para> 14520f8248bfSmrg structure defining the device and modifications 14530f8248bfSmrg </para> 14540f8248bfSmrg </listitem> 14550f8248bfSmrg </varlistentry> 14560f8248bfSmrg</variablelist> 14570f8248bfSmrg 14580f8248bfSmrg<para> 14590f8248bfSmrg<function>XkbSetDeviceInfo</function> 14600f8248bfSmrgsends a request to the server to modify the characteristics of the device 14610f8248bfSmrgspecified in the 14620f8248bfSmrg<parameter>device_info</parameter> 14630f8248bfSmrgstructure. The particular characteristics modified are identified by the bits 14640f8248bfSmrgset in 14650f8248bfSmrg<parameter>which</parameter> 14660f8248bfSmrgand take their values from the relevant fields in 14670f8248bfSmrg<parameter>device_info</parameter> 14680f8248bfSmrg(see <link linkend="table21.1">Table 21.1</link>). 14690f8248bfSmrg<function>XkbSetDeviceInfo</function> 14700f8248bfSmrgreturns 14710f8248bfSmrg<symbol>True</symbol> 14720f8248bfSmrgif the request was successfully sent to the server. If the X server 1473e9fcaa8aSmrgimplementation does not allow interaction between the X input extension and the 14740f8248bfSmrgXkb Extension, the function does nothing and returns 14750f8248bfSmrg<symbol>False</symbol>. 1476e9fcaa8aSmrg</para> 1477e9fcaa8aSmrg 1478e9fcaa8aSmrg 1479e9fcaa8aSmrg<para> 14800f8248bfSmrgThe 14810f8248bfSmrg<parameter>which</parameter> 14820f8248bfSmrgparameter specifies which aspects of the device should be changed and is a 1483e9fcaa8aSmrgbitmask composed of an inclusive OR or one or more of the following bits: 14840f8248bfSmrg<symbol>XkbXI_ButtonActionsMask</symbol>, 14850f8248bfSmrg<symbol>XkbXI_IndicatorNamesMask</symbol>, 14860f8248bfSmrg<symbol>XkbXI_IndicatorMapsMask</symbol>. 14870f8248bfSmrgIf the features requested to be manipulated in 14880f8248bfSmrg<parameter>which</parameter> 14890f8248bfSmrgare valid for the device, but the server does not support assignment of one or 1490e9fcaa8aSmrgmore of them, that particular portion of the request is ignored. 1491e9fcaa8aSmrg</para> 1492e9fcaa8aSmrg 1493e9fcaa8aSmrg 1494e9fcaa8aSmrg<para> 14950f8248bfSmrgIf the device specified in 14960f8248bfSmrg<parameter>device_info</parameter>-><structfield>device_spec</structfield> 14970f8248bfSmrgdoes not contain buttons and a request affecting buttons is made, or the 1498e9fcaa8aSmrgdevice does not contain indicators and a request affecting indicators is made, 14990f8248bfSmrga 15000f8248bfSmrg<errorname>BadMatch</errorname> 15010f8248bfSmrgprotocol error results. 1502e9fcaa8aSmrg</para> 1503e9fcaa8aSmrg 1504e9fcaa8aSmrg 1505e9fcaa8aSmrg<para> 15060f8248bfSmrgIf the 15070f8248bfSmrg<symbol>XkbXI_ButtonActionsMask</symbol> 15080f8248bfSmrgbit is set in the supported mask returned by XkbGetDeviceInfo, the Xkb 1509e9fcaa8aSmrgextension allows applications to assign key actions to buttons on input 15100f8248bfSmrgextension devices other than the core keyboard device. If the 15110f8248bfSmrg<symbol>XkbXI_ButtonActionsMask</symbol> 15120f8248bfSmrgis set in 15130f8248bfSmrg<parameter>which</parameter>, 15140f8248bfSmrgthe actions for all buttons specified in device_info are set to the 15150f8248bfSmrg<structname>XkbAction</structname>s 15160f8248bfSmrgspecified in 15170f8248bfSmrg<parameter>device_info</parameter>-><structfield>btn_acts</structfield>. 15180f8248bfSmrgIf the number of buttons requested to be updated is not valid for the device, 15190f8248bfSmrg<function>XkbSetDeviceInfo</function> 15200f8248bfSmrgreturns 15210f8248bfSmrg<symbol>False</symbol> 15220f8248bfSmrgand a 15230f8248bfSmrg<errorname>BadValue</errorname> 15240f8248bfSmrgprotocol error results. 15250f8248bfSmrg</para> 15260f8248bfSmrg 15270f8248bfSmrg 15280f8248bfSmrg<para> 15290f8248bfSmrgIf the 15300f8248bfSmrg<symbol>XkbXI_IndicatorMapsMask</symbol> 15310f8248bfSmrgand / or 15320f8248bfSmrg<symbol>XkbXI_IndicatorNamesMask</symbol> 15330f8248bfSmrgbit is set in the supported mask returned by XkbGetDeviceInfo, the Xkb 1534e9fcaa8aSmrgextension allows applications to assign maps and / or names to the indicators 1535e9fcaa8aSmrgof nonkeyboard extension devices. If supported, maps and / or names can be 1536e9fcaa8aSmrgassigned to all extension device indicators, whether they are part of a 1537e9fcaa8aSmrgkeyboard feedback or part of an indicator feedback. 1538e9fcaa8aSmrg</para> 1539e9fcaa8aSmrg 1540e9fcaa8aSmrg 1541e9fcaa8aSmrg<para> 15420f8248bfSmrgIf the 15430f8248bfSmrg<symbol>XkbXI_IndicatorMapsMask</symbol> 15440f8248bfSmrgand / or 15450f8248bfSmrg<symbol>XkbXI_IndicatorNamesMask</symbol> 15460f8248bfSmrgflag is set in 15470f8248bfSmrg<parameter>which</parameter>, 15480f8248bfSmrgthe indicator maps and / or names for all 15490f8248bfSmrg<parameter>device_info</parameter>-><structfield>num_leds</structfield> 15500f8248bfSmrgindicator devices specified in 15510f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds</structfield> 15520f8248bfSmrgare set to the maps and / or names specified in 15530f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds</structfield>. 15540f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds</structfield>-><structfield>led_class</structfield> 15550f8248bfSmrgand 15560f8248bfSmrg<structfield>led_id</structfield> 15570f8248bfSmrgspecify the input extension class and device ID for each indicator device to 15580f8248bfSmrgmodify; if they have invalid values, a 15590f8248bfSmrg<errorname>BadValue</errorname> 15600f8248bfSmrgprotocol error results and 15610f8248bfSmrg<function>XkbSetDeviceInfo</function> 15620f8248bfSmrgreturns 15630f8248bfSmrg<symbol>False</symbol>. 15640f8248bfSmrgIf they have legal values but do not specify a keyboard or indicator class 15650f8248bfSmrgfeedback for the device in question, a 15660f8248bfSmrg<errorname>BadMatch</errorname> 15670f8248bfSmrgerror results. If any of the values in 15680f8248bfSmrg<parameter>device_info</parameter>-><structfield>leds->names</structfield> 15690f8248bfSmrgare not a valid Atom or 15700f8248bfSmrg<symbol>None</symbol>, 15710f8248bfSmrga 15720f8248bfSmrg<errorname>BadAtom</errorname> 15730f8248bfSmrgprotocol error results. 1574e9fcaa8aSmrg</para> 1575e9fcaa8aSmrg 1576e9fcaa8aSmrg 1577e9fcaa8aSmrg<para> 1578e9fcaa8aSmrgXkb provides convenience functions to modify subsets of the information 15790f8248bfSmrgaccessible via 15800f8248bfSmrg<function>XkbSetDeviceInfo</function>. 15810f8248bfSmrgOnly the parts of the structure indicated in the function description are 1582e9fcaa8aSmrgmodified. These convenience functions are described as follows. 1583e9fcaa8aSmrg</para> 1584e9fcaa8aSmrg 1585e9fcaa8aSmrg 1586e9fcaa8aSmrg<para> 1587e9fcaa8aSmrgTo change only the button actions for an input extension device, use 1588e9fcaa8aSmrgXkbSetDeviceButtonActions. 1589e9fcaa8aSmrg</para> 1590e9fcaa8aSmrg 1591e9fcaa8aSmrg 15920f8248bfSmrg<indexterm significance="preferred" zone="XkbSetDeviceButtonActions"><primary><function>XkbSetDeviceButtonActions</function></primary></indexterm> 15930f8248bfSmrg<funcsynopsis id="XkbSetDeviceButtonActions"> 15940f8248bfSmrg <funcprototype> 15950f8248bfSmrg <funcdef>Bool <function>XkbSetDeviceButtonActions</function></funcdef> 15960f8248bfSmrg<!-- ( 15970f8248bfSmrg<parameter>dpy</parameter>, 15980f8248bfSmrgdevice, first_button, num_buttons, actions) --> 15990f8248bfSmrg 16000f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 16010f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 16020f8248bfSmrg <paramdef>unsigned int <parameter>first_button</parameter></paramdef> 16030f8248bfSmrg <paramdef>unsigned int <parameter>num_buttons</parameter></paramdef> 16040f8248bfSmrg </funcprototype> 16050f8248bfSmrg</funcsynopsis> 16060f8248bfSmrg<variablelist> 16070f8248bfSmrg <varlistentry> 16080f8248bfSmrg <term> 16090f8248bfSmrg <parameter>dpy</parameter> 16100f8248bfSmrg </term> 16110f8248bfSmrg <listitem> 16120f8248bfSmrg <para> 16130f8248bfSmrg connection to X server 16140f8248bfSmrg </para> 16150f8248bfSmrg </listitem> 16160f8248bfSmrg </varlistentry> 16170f8248bfSmrg <varlistentry> 16180f8248bfSmrg <term> 16190f8248bfSmrg <parameter>device_info</parameter> 16200f8248bfSmrg </term> 16210f8248bfSmrg <listitem> 16220f8248bfSmrg <para> 16230f8248bfSmrg structure defining the device and modifications 16240f8248bfSmrg </para> 16250f8248bfSmrg </listitem> 16260f8248bfSmrg </varlistentry> 16270f8248bfSmrg <varlistentry> 16280f8248bfSmrg <term> 16290f8248bfSmrg <parameter>first_button</parameter> 16300f8248bfSmrg </term> 16310f8248bfSmrg <listitem> 16320f8248bfSmrg <para> 16330f8248bfSmrg number of first button to update, 0 relative 16340f8248bfSmrg </para> 16350f8248bfSmrg </listitem> 16360f8248bfSmrg </varlistentry> 16370f8248bfSmrg <varlistentry> 16380f8248bfSmrg <term> 16390f8248bfSmrg <parameter>num_buttons</parameter> 16400f8248bfSmrg </term> 16410f8248bfSmrg <listitem> 16420f8248bfSmrg <para> 16430f8248bfSmrg number of buttons to update 16440f8248bfSmrg </para> 16450f8248bfSmrg </listitem> 16460f8248bfSmrg </varlistentry> 16470f8248bfSmrg</variablelist> 16480f8248bfSmrg 16490f8248bfSmrg<para> 16500f8248bfSmrg<function>XkbSetDeviceButtonActions</function> 16510f8248bfSmrgassigns actions to the buttons of the device specified in 16520f8248bfSmrgdevice_info-><structfield>device_spec</structfield>. 16530f8248bfSmrgActions are assigned to 16540f8248bfSmrg<parameter>num_buttons</parameter> 16550f8248bfSmrgbuttons beginning with 16560f8248bfSmrg<parameter>first_button</parameter> 16570f8248bfSmrgand are taken from the actions specified in 16580f8248bfSmrg<parameter>device_info</parameter>-><structfield>btn_acts</structfield>. 1659e9fcaa8aSmrg</para> 1660e9fcaa8aSmrg 1661e9fcaa8aSmrg 1662e9fcaa8aSmrg<para> 1663e9fcaa8aSmrgIf the server does not support assignment of Xkb actions to extension device 16640f8248bfSmrgbuttons, 16650f8248bfSmrg<function>XkbSetDeviceButtonActions</function> 16660f8248bfSmrghas no effect and returns 16670f8248bfSmrg<symbol>False</symbol>. 16680f8248bfSmrgIf the device has no buttons or if 16690f8248bfSmrg<parameter>first_button</parameter> 16700f8248bfSmrgor 16710f8248bfSmrg<parameter>num_buttons</parameter> 16720f8248bfSmrgspecify buttons outside of the valid range as determined by 16730f8248bfSmrg<parameter>device_info</parameter>-><structfield>num_btns</structfield>, 16740f8248bfSmrgthe function has no effect and returns 16750f8248bfSmrg<symbol>False</symbol>. 16760f8248bfSmrgOtherwise, 16770f8248bfSmrg<function>XkbSetDeviceButtonActions</function> 16780f8248bfSmrgsends a request to the server to change the actions for the specified buttons 16790f8248bfSmrgand returns 16800f8248bfSmrg<symbol>True</symbol>. 1681e9fcaa8aSmrg</para> 1682e9fcaa8aSmrg 1683e9fcaa8aSmrg 1684e9fcaa8aSmrg<para> 1685e9fcaa8aSmrgIf the actual request sent to the server involved illegal button numbers, a 16860f8248bfSmrg<errorname>BadValue</errorname> 16870f8248bfSmrgprotocol error is generated. If an invalid device identifier is specified in 16880f8248bfSmrgdevice_info-><structfield>device_spec</structfield>, 16890f8248bfSmrga <errorname>BadKeyboard</errorname> 16900f8248bfSmrgprotocol error results. If the actual device specified in 16910f8248bfSmrg<parameter>device_info</parameter>-><structfield>device_spec</structfield> 16920f8248bfSmrgdoes not contain buttons and a request affecting buttons is made, a 16930f8248bfSmrg<errorname>BadMatch</errorname> 16940f8248bfSmrgprotocol error is generated. 1695e9fcaa8aSmrg</para> 1696e9fcaa8aSmrg 1697e9fcaa8aSmrg 1698e9fcaa8aSmrg</sect1> 1699eb411b4bSmrg<sect1 id='XkbExtensionDeviceNotify_Event'> 1700e9fcaa8aSmrg<title>XkbExtensionDeviceNotify Event</title> 17010f8248bfSmrg<indexterm significance="preferred" zone="XkbExtensionDeviceNotify_Event"> 17020f8248bfSmrg<primary>events</primary><secondary><symbol>XkbExtensionDeviceNotify</symbol></secondary></indexterm> 17030f8248bfSmrg<indexterm significance="preferred" zone="XkbExtensionDeviceNotify_Event"> 17040f8248bfSmrg<primary><structname>XkbExtensionDeviceNotifyEvent</structname></primary></indexterm> 1705e9fcaa8aSmrg 1706e9fcaa8aSmrg<para> 17070f8248bfSmrgThe Xkb extension generates 17080f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 17090f8248bfSmrgevents when the status of an input extension device changes or when an attempt 1710e9fcaa8aSmrgis made to use an Xkb feature that is not supported by a particular device. 1711e9fcaa8aSmrg</para> 1712e9fcaa8aSmrg 1713e9fcaa8aSmrg<note><para>Events indicating an attempt to use an unsupported feature are 1714e9fcaa8aSmrgdelivered only to the client requesting the event.</para></note> 1715e9fcaa8aSmrg 1716e9fcaa8aSmrg<para> 1717e9fcaa8aSmrgTo track changes to the status of input extension devices or attempts to use 17180f8248bfSmrgunsupported features of a device, select to receive 17190f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 17200f8248bfSmrgevents by calling either 17210f8248bfSmrg<function>XkbSelectEvents</function> 17220f8248bfSmrgor 17230f8248bfSmrg<function>XkbSelectEventDetails</function> 17240f8248bfSmrg(see <link linkend="Selecting_Xkb_Events">section 4.3</link>). 1725e9fcaa8aSmrg</para> 1726e9fcaa8aSmrg 1727e9fcaa8aSmrg 1728e9fcaa8aSmrg<para> 17290f8248bfSmrgTo receive 17300f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 17310f8248bfSmrgevents under all possible conditions, call 17320f8248bfSmrg<function>XkbSelectEvents</function> 17330f8248bfSmrgand pass 17340f8248bfSmrg<symbol>XkbExtensionDeviceNotifyMask</symbol> 17350f8248bfSmrgin both 17360f8248bfSmrg<parameter>bits_to_change</parameter> 17370f8248bfSmrgand 17380f8248bfSmrg<parameter>values_for_bits</parameter>. 1739e9fcaa8aSmrg</para> 1740e9fcaa8aSmrg 1741e9fcaa8aSmrg 1742e9fcaa8aSmrg<para> 17430f8248bfSmrgThe 17440f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 17450f8248bfSmrgevent has no event details. However, you can call 17460f8248bfSmrg<function>XkbSelectEventDetails</function> 17470f8248bfSmrgusing 17480f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 17490f8248bfSmrgas the 17500f8248bfSmrg<structfield>event_type</structfield> 17510f8248bfSmrgand specifying 17520f8248bfSmrg<symbol>XkbAllExtensionDeviceEventsMask</symbol> 17530f8248bfSmrgin 17540f8248bfSmrg<parameter>bits_to_change</parameter> 17550f8248bfSmrgand 17560f8248bfSmrg<parameter>values_for_bits</parameter>. 17570f8248bfSmrgThis has the same effect as a call to 17580f8248bfSmrg<function>XkbSelectEvents</function>. 1759e9fcaa8aSmrg</para> 1760e9fcaa8aSmrg 1761e9fcaa8aSmrg 1762e9fcaa8aSmrg<para> 17630f8248bfSmrgThe structure for 17640f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 17650f8248bfSmrgevents is: 1766e9fcaa8aSmrg 17670f8248bfSmrg<programlisting> 1768e9fcaa8aSmrgtypedef struct { 17690f8248bfSmrg int type; /* Xkb extension base event code */ 17700f8248bfSmrg unsigned long serial; /* X server serial number for event */ 17710f8248bfSmrg Bool send_event; /* <symbol>True</symbol> ⇒ synthetically generated */ 17720f8248bfSmrg Display * display; /* server connection where event generated */ 17730f8248bfSmrg Time time; /* server time when event generated */ 17740f8248bfSmrg int xkb_type; /* <structname>XkbExtensionDeviceNotifyEvent</structname> */ 17750f8248bfSmrg int device; /* Xkb device ID, will not be <symbol>XkbUseCoreKbd</symbol> */ 17760f8248bfSmrg unsigned int reason; /* reason for the event */ 17770f8248bfSmrg unsigned int supported; /* mask of supported features */ 17780f8248bfSmrg unsigned int unsupported; /* unsupported features this client 1779e9fcaa8aSmrg attempted to use */ 17800f8248bfSmrg int first_btn; /* first button that changed */ 17810f8248bfSmrg int num_btns; /* number of buttons that changed */ 17820f8248bfSmrg unsigned int leds_defined; /* indicators with names or maps */ 17830f8248bfSmrg unsigned int led_state; /* current state of the indicators */ 17840f8248bfSmrg int led_class; /* feedback class for LED changes */ 17850f8248bfSmrg int led_id; /* feedback ID for LED changes */ 17860f8248bfSmrg} <structname>XkbExtensionDeviceNotifyEvent</structname>; 1787e9fcaa8aSmrg</programlisting></para> 1788e9fcaa8aSmrg 1789e9fcaa8aSmrg<para> 17900f8248bfSmrgThe 17910f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 17920f8248bfSmrgevent has fields enabling it to report changes in the state (on/off) of all of 1793e9fcaa8aSmrgthe buttons for a device, but only for one LED feedback associated with a 1794e9fcaa8aSmrgdevice. You will get multiple events when more than one LED feedback changes 1795e9fcaa8aSmrgstate or configuration. 1796e9fcaa8aSmrg</para> 1797e9fcaa8aSmrg 1798e9fcaa8aSmrg 1799e9fcaa8aSmrg</sect1> 1800eb411b4bSmrg<sect1 id='Tracking_Changes_to_Extension_Devices'> 1801e9fcaa8aSmrg<title>Tracking Changes to Extension Devices</title> 18020f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Changes_to_Extension_Devices"> 18030f8248bfSmrg<primary><structname>XkbDeviceChangesRec</structname></primary></indexterm> 18040f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Changes_to_Extension_Devices"> 18050f8248bfSmrg<primary><structname>XkbDeviceLedChangesRec</structname></primary></indexterm> 1806e9fcaa8aSmrg 1807e9fcaa8aSmrg<para> 18080f8248bfSmrgChanges to an Xkb extension device may be tracked by listening to 18090f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 18100f8248bfSmrgevents and accumulating the changes in an 18110f8248bfSmrg<structname>XkbDeviceChangesRec</structname> 18120f8248bfSmrgstructure. The changes noted in the structure may then be used in subsequent 1813e9fcaa8aSmrgoperations to update either a server configuration or a local copy of an Xkb 1814e9fcaa8aSmrgextension device configuration. The changes structure is defined as follows: 1815e9fcaa8aSmrg 18160f8248bfSmrg<programlisting> 1817e9fcaa8aSmrgtypedef struct _XkbDeviceChanges { 18180f8248bfSmrg unsigned int changed; /* bits indicating what has changed */ 18190f8248bfSmrg unsigned short first_btn; /* number of first button which changed, 18200f8248bfSmrg if any */ 18210f8248bfSmrg unsigned short num_btns; /* number of buttons that have changed */ 18220f8248bfSmrg XkbDeviceLedChangesRec leds; 18230f8248bfSmrg} <structname>XkbDeviceChangesRec</structname>, *XkbDeviceChangesPtr; 1824e9fcaa8aSmrg 1825e9fcaa8aSmrgtypedef struct _XkbDeviceLedChanges { 18260f8248bfSmrg unsigned short led_class; /* class of this indicator feedback bundle */ 18270f8248bfSmrg unsigned short led_id; /* ID of this indicator feedback bundle */ 18280f8248bfSmrg unsigned int names; /* bits indicating which names have changed */ 18290f8248bfSmrg unsigned int maps; /* bits indicating which maps have changed */ 18300f8248bfSmrg struct _XkbDeviceLedChanges *next; /* link to indicator change record 18310f8248bfSmrg for next set */ 18320f8248bfSmrg} <structname>XkbDeviceLedChangesRec</structname>, *XkbDeviceLedChangesPtr; 1833e9fcaa8aSmrg</programlisting></para> 1834e9fcaa8aSmrg 1835e9fcaa8aSmrg<para> 1836e9fcaa8aSmrgA local description of the configuration and state of a device may be kept in 18370f8248bfSmrgan 18380f8248bfSmrg<structname>XkbDeviceInfoRec</structname> 18390f8248bfSmrgstructure. The actual state or configuration of the device may change because 1840e9fcaa8aSmrgof XkbSetDeviceInfo and XkbSetButtonActions requests made by clients or by user 1841e9fcaa8aSmrginteraction with the device. The X server sends an XkbExtensionDeviceNotify 1842e9fcaa8aSmrgevent to all interested clients when the state of any buttons or indicators or 1843e9fcaa8aSmrgthe configuration of the buttons or indicators on the core keyboard or any 1844e9fcaa8aSmrginput extension device changes. The event reports the state of indicators for a 1845e9fcaa8aSmrgsingle indicator feedback, and the state of up to 128 buttons. If more than 128 1846e9fcaa8aSmrgbuttons or more than one indicator feedback are changed, the additional buttons 1847e9fcaa8aSmrgand indicator feedbacks are reported in subsequent events. Xkb provides 1848e9fcaa8aSmrgfunctions with which you can track changes to input extension devices by noting 1849e9fcaa8aSmrgthe changes that were made and then requesting the changed information from the 1850e9fcaa8aSmrgserver. 1851e9fcaa8aSmrg</para> 1852e9fcaa8aSmrg 1853e9fcaa8aSmrg 1854e9fcaa8aSmrg<para> 18550f8248bfSmrgTo note device changes reported in an 18560f8248bfSmrg<symbol>XkbExtensionDeviceNotify</symbol> 18570f8248bfSmrgevent, use XkbNoteDeviceChanges. 18580f8248bfSmrg</para> 18590f8248bfSmrg 18600f8248bfSmrg<indexterm significance="preferred" zone="XkbNoteDeviceChanges"><primary><function>XkbNoteDeviceChanges</function></primary></indexterm> 18610f8248bfSmrg<funcsynopsis id="XkbNoteDeviceChanges"> 18620f8248bfSmrg <funcprototype> 18630f8248bfSmrg <funcdef>void <function>XkbNoteDeviceChanges</function></funcdef> 18640f8248bfSmrg<!-- ( 18650f8248bfSmrg<parameter>old, new, wanted</parameter> 18660f8248bfSmrg) --> 18670f8248bfSmrg 18680f8248bfSmrg <paramdef>XkbDeviceChangesPtr <parameter>old</parameter></paramdef> 18690f8248bfSmrg <paramdef>XkbExtensionDeviceNotifyEvent *<parameter>new</parameter></paramdef> 18700f8248bfSmrg <paramdef>unsigned int <parameter>wanted</parameter></paramdef> 18710f8248bfSmrg </funcprototype> 18720f8248bfSmrg</funcsynopsis> 18730f8248bfSmrg<variablelist> 18740f8248bfSmrg <varlistentry> 18750f8248bfSmrg <term> 18760f8248bfSmrg <parameter>old</parameter> 18770f8248bfSmrg </term> 18780f8248bfSmrg <listitem> 18790f8248bfSmrg <para> 18800f8248bfSmrg structure tracking state changes 18810f8248bfSmrg </para> 18820f8248bfSmrg </listitem> 18830f8248bfSmrg </varlistentry> 18840f8248bfSmrg <varlistentry> 18850f8248bfSmrg <term> 18860f8248bfSmrg <parameter>new</parameter> 18870f8248bfSmrg </term> 18880f8248bfSmrg <listitem> 18890f8248bfSmrg <para> 18900f8248bfSmrg event indicating state changes 18910f8248bfSmrg </para> 18920f8248bfSmrg </listitem> 18930f8248bfSmrg </varlistentry> 18940f8248bfSmrg <varlistentry> 18950f8248bfSmrg <term> 18960f8248bfSmrg <parameter>wanted</parameter> 18970f8248bfSmrg </term> 18980f8248bfSmrg <listitem> 18990f8248bfSmrg <para> 19000f8248bfSmrg mask indicating changes to note 19010f8248bfSmrg </para> 19020f8248bfSmrg </listitem> 19030f8248bfSmrg </varlistentry> 19040f8248bfSmrg</variablelist> 19050f8248bfSmrg 19060f8248bfSmrg<para> 19070f8248bfSmrgThe wanted field specifies the changes that should be noted in 19080f8248bfSmrg<parameter>old</parameter>, 19090f8248bfSmrgand is composed of the bitwise inclusive OR of one or more of the masks from 19100f8248bfSmrg<link linkend="table21.1">Table 21.1</link>. 19110f8248bfSmrgThe 19120f8248bfSmrg<structfield>reason</structfield> 19130f8248bfSmrgfield of the event in 19140f8248bfSmrg<parameter>new</parameter> 19150f8248bfSmrgindicates the types of changes the event is reporting. 19160f8248bfSmrg<function>XkbNoteDeviceChanges</function> 19170f8248bfSmrgupdates the 19180f8248bfSmrg<structname>XkbDeviceChangesRec</structname> 19190f8248bfSmrgspecified by 19200f8248bfSmrg<parameter>old</parameter> 19210f8248bfSmrgwith the changes that are both specified in 19220f8248bfSmrg<parameter>wanted</parameter> 19230f8248bfSmrgand contained in 19240f8248bfSmrg<parameter>new</parameter>-><structfield>reason</structfield>. 1925e9fcaa8aSmrg</para> 1926e9fcaa8aSmrg 1927e9fcaa8aSmrg 1928e9fcaa8aSmrg<para> 1929e9fcaa8aSmrgTo update a local copy of the state and configuration of an X input extension 19300f8248bfSmrgdevice with the changes previously noted in an 19310f8248bfSmrg<structname>XkbDeviceChangesRec</structname> 19320f8248bfSmrgstructure, use XkbGetDeviceInfoChanges. 1933e9fcaa8aSmrg</para> 1934e9fcaa8aSmrg 1935e9fcaa8aSmrg 1936e9fcaa8aSmrg<para> 1937e9fcaa8aSmrgTo query the changes that have occurred in the button actions or indicator 1938e9fcaa8aSmrgnames and indicator maps associated with an input extension device, use 1939e9fcaa8aSmrgXkbGetDeviceInfoChanges. 1940e9fcaa8aSmrg</para> 1941e9fcaa8aSmrg 1942e9fcaa8aSmrg 19430f8248bfSmrg<indexterm significance="preferred" zone="XkbGetDeviceInfoChanges"><primary><function>XkbGetDeviceInfoChanges</function></primary></indexterm> 19440f8248bfSmrg<funcsynopsis id="XkbGetDeviceInfoChanges"> 19450f8248bfSmrg <funcprototype> 19460f8248bfSmrg <funcdef>Status <function>XkbGetDeviceInfoChanges</function></funcdef> 19470f8248bfSmrg<!-- ( 19480f8248bfSmrg<parameter>dpy</parameter>, 19490f8248bfSmrg<parameter>device_info</parameter>, 19500f8248bfSmrgchanges) --> 19510f8248bfSmrg 19520f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 19530f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 19540f8248bfSmrg <paramdef>XkbDeviceChangesPtr <parameter>changes</parameter></paramdef> 19550f8248bfSmrg </funcprototype> 19560f8248bfSmrg</funcsynopsis> 19570f8248bfSmrg<variablelist> 19580f8248bfSmrg <varlistentry> 19590f8248bfSmrg <term> 19600f8248bfSmrg <parameter>dpy</parameter> 19610f8248bfSmrg </term> 19620f8248bfSmrg <listitem> 19630f8248bfSmrg <para> 19640f8248bfSmrg connection to X server 19650f8248bfSmrg </para> 19660f8248bfSmrg </listitem> 19670f8248bfSmrg </varlistentry> 19680f8248bfSmrg <varlistentry> 19690f8248bfSmrg <term> 19700f8248bfSmrg <parameter>device_info</parameter> 19710f8248bfSmrg </term> 19720f8248bfSmrg <listitem> 19730f8248bfSmrg <para> 19740f8248bfSmrg structure to update with results 19750f8248bfSmrg </para> 19760f8248bfSmrg </listitem> 19770f8248bfSmrg </varlistentry> 19780f8248bfSmrg <varlistentry> 19790f8248bfSmrg <term> 19800f8248bfSmrg <parameter>changes</parameter> 19810f8248bfSmrg </term> 19820f8248bfSmrg <listitem> 19830f8248bfSmrg <para> 19840f8248bfSmrg contains notes of changes that have occurred 19850f8248bfSmrg </para> 19860f8248bfSmrg </listitem> 19870f8248bfSmrg </varlistentry> 19880f8248bfSmrg</variablelist> 1989e9fcaa8aSmrg 1990e9fcaa8aSmrg<para> 1991e9fcaa8aSmrgThe changes->changed field indicates which attributes of the device 19920f8248bfSmrgspecified in 19930f8248bfSmrg<parameter>changes</parameter>-><structfield>device</structfield> 19940f8248bfSmrghave changed. The parameters describing the changes are contained in the other 19950f8248bfSmrgfields of 19960f8248bfSmrg<parameter>changes</parameter>. 19970f8248bfSmrg<function>XkbGetDeviceInfoChanges</function> 19980f8248bfSmrguses that information to call XkbGetDeviceInfo to obtain the current status of 1999e9fcaa8aSmrgthose attributes that have changed. It then updates the local description of 20000f8248bfSmrgthe device in 20010f8248bfSmrg<parameter>device_info</parameter> 20020f8248bfSmrgwith the new information. 2003e9fcaa8aSmrg</para> 2004e9fcaa8aSmrg 2005e9fcaa8aSmrg 2006e9fcaa8aSmrg<para> 2007e9fcaa8aSmrgTo update the server’s description of a device with the changes noted in an 2008e9fcaa8aSmrgXkbDeviceChangesRec, use XkbChangeDeviceInfo. 2009e9fcaa8aSmrg</para> 2010e9fcaa8aSmrg 2011e9fcaa8aSmrg 20120f8248bfSmrg<indexterm significance="preferred" zone="XkbChangeDeviceInfo"><primary><function>XkbChangeDeviceInfo</function></primary></indexterm> 20130f8248bfSmrg<funcsynopsis id="XkbChangeDeviceInfo"> 20140f8248bfSmrg <funcprototype> 20150f8248bfSmrg <funcdef>Bool <function>XkbChangeDeviceInfo</function></funcdef> 20160f8248bfSmrg<!-- ( 20170f8248bfSmrg<parameter>dpy, device_info, changes</parameter> 20180f8248bfSmrg) --> 20190f8248bfSmrg 20200f8248bfSmrg <paramdef>Display *<parameter>dpy</parameter></paramdef> 20210f8248bfSmrg <paramdef>XkbDeviceInfoPtr <parameter>device_info</parameter></paramdef> 20220f8248bfSmrg <paramdef>XkbDeviceChangesPtr <parameter>changes</parameter></paramdef> 20230f8248bfSmrg </funcprototype> 20240f8248bfSmrg</funcsynopsis> 20250f8248bfSmrg<variablelist> 20260f8248bfSmrg <varlistentry> 20270f8248bfSmrg <term> 20280f8248bfSmrg <parameter>dpy</parameter> 20290f8248bfSmrg </term> 20300f8248bfSmrg <listitem> 20310f8248bfSmrg <para> 20320f8248bfSmrg connection to X server 20330f8248bfSmrg </para> 20340f8248bfSmrg </listitem> 20350f8248bfSmrg </varlistentry> 20360f8248bfSmrg <varlistentry> 20370f8248bfSmrg <term> 20380f8248bfSmrg <parameter>device_info</parameter> 20390f8248bfSmrg </term> 20400f8248bfSmrg <listitem> 20410f8248bfSmrg <para> 20420f8248bfSmrg local copy of device state and configuration 20430f8248bfSmrg </para> 20440f8248bfSmrg </listitem> 20450f8248bfSmrg </varlistentry> 20460f8248bfSmrg <varlistentry> 20470f8248bfSmrg <term> 20480f8248bfSmrg <parameter>changes</parameter> 20490f8248bfSmrg </term> 20500f8248bfSmrg <listitem> 20510f8248bfSmrg <para> 20520f8248bfSmrg note specifying changes in <parameter>device_info</parameter> 20530f8248bfSmrg </para> 20540f8248bfSmrg </listitem> 20550f8248bfSmrg </varlistentry> 20560f8248bfSmrg</variablelist> 20570f8248bfSmrg 20580f8248bfSmrg<para> 20590f8248bfSmrg<function>XkbChangeDeviceInfo</function> 20600f8248bfSmrgupdates the server’s description of the device specified in 20610f8248bfSmrg<parameter>device_info</parameter>-><structfield>device_spec</structfield> 20620f8248bfSmrgwith the changes specified in 20630f8248bfSmrg<parameter>changes</parameter> 20640f8248bfSmrgand contained in 20650f8248bfSmrg<parameter>device_info</parameter>. 20660f8248bfSmrgThe update is made by an XkbSetDeviceInfo request. 2067e9fcaa8aSmrg</para> 2068e9fcaa8aSmrg 2069e9fcaa8aSmrg</sect1> 2070e9fcaa8aSmrg</chapter> 2071