ch21.xml revision eb411b4b
1eb411b4bSmrg<chapter id='Attaching_Xkb_Actions_to_X_Input_Extension_Devices'> 2e9fcaa8aSmrg<title>Attaching Xkb Actions to X Input Extension Devices</title> 3e9fcaa8aSmrg 4e9fcaa8aSmrg<para> 5e9fcaa8aSmrgThe X input extension allows an X server to support multiple keyboards, as well 6e9fcaa8aSmrgas other input devices, in addition to the core X keyboard and pointer. The 7e9fcaa8aSmrginput extension categorizes devices by grouping them into classes. Keyboards 8e9fcaa8aSmrgand other input devices with keys are classified as KeyClass devices by the 9e9fcaa8aSmrginput extension. Other types of devices supported by the input extension 10e9fcaa8aSmrginclude, but are not limited to: mice, tablets, touchscreens, barcode readers, 11e9fcaa8aSmrgbutton boxes, trackballs, identifier devices, data gloves, and eye trackers. 12e9fcaa8aSmrgXkb provides additional control over all X input extension devices, whether 13e9fcaa8aSmrgthey are <emphasis>KeyClass</emphasis> 14e9fcaa8aSmrg devices or not, as well as the core keyboard and pointer. 15e9fcaa8aSmrg</para> 16e9fcaa8aSmrg 17e9fcaa8aSmrg 18e9fcaa8aSmrg<para> 19e9fcaa8aSmrgIf an X server implements support for both the input extension and Xkb, the 20e9fcaa8aSmrgserver implementor determines whether interaction between Xkb and the input 21e9fcaa8aSmrgextension is allowed. Implementors are free to restrict the effects of Xkb to 22e9fcaa8aSmrgonly the core X keyboard device or allow interaction between Xkb and the input 23e9fcaa8aSmrgextension. 24e9fcaa8aSmrg</para> 25e9fcaa8aSmrg 26e9fcaa8aSmrg 27e9fcaa8aSmrg<para> 28e9fcaa8aSmrgSeveral types of interaction between Xkb and the input extension are defined by 29e9fcaa8aSmrgXkb. Some or all may be allowed by the X server implementation. 30e9fcaa8aSmrg</para> 31e9fcaa8aSmrg 32e9fcaa8aSmrg 33e9fcaa8aSmrg<para> 34e9fcaa8aSmrgRegardless of whether the server allows interaction between Xkb and the input 35e9fcaa8aSmrgextension, the following access is provided: 36e9fcaa8aSmrg</para> 37e9fcaa8aSmrg 38e9fcaa8aSmrg<itemizedlist> 39e9fcaa8aSmrg<listitem> 40e9fcaa8aSmrg <para> 41e9fcaa8aSmrgXkb functionality for the core X keyboard device and its mapping is accessed 42e9fcaa8aSmrgvia the functions described in the other chapters of this specification. 43e9fcaa8aSmrg </para> 44e9fcaa8aSmrg</listitem> 45e9fcaa8aSmrg<listitem> 46e9fcaa8aSmrg <para> 47e9fcaa8aSmrgXkb functionality for the core X pointer device is accessed via the 48e9fcaa8aSmrgXkbGetDeviceInfo and XkbSetDeviceInfo functions described in this chapter. 49e9fcaa8aSmrg </para> 50e9fcaa8aSmrg</listitem> 51e9fcaa8aSmrg</itemizedlist> 52e9fcaa8aSmrg 53e9fcaa8aSmrg<para> 54e9fcaa8aSmrgIf all types of interaction are allowed between Xkb and the input extension, 55e9fcaa8aSmrgthe following additional access is provided: 56e9fcaa8aSmrg</para> 57e9fcaa8aSmrg 58e9fcaa8aSmrg<itemizedlist> 59e9fcaa8aSmrg<listitem> 60e9fcaa8aSmrg <para> 61e9fcaa8aSmrgIf allowed, Xkb functionality for additional <emphasis> 62e9fcaa8aSmrgKeyClass</emphasis> 63e9fcaa8aSmrg devices supported by the input extension is accessed via those same functions. 64e9fcaa8aSmrg </para> 65e9fcaa8aSmrg</listitem> 66e9fcaa8aSmrg<listitem> 67e9fcaa8aSmrg <para> 68e9fcaa8aSmrgIf allowed, Xkb functionality for non-<emphasis> 69e9fcaa8aSmrgKeyClass</emphasis> 70e9fcaa8aSmrg devices supported by the input extension is also accessed via the 71e9fcaa8aSmrgXkbGetDeviceInfo and XkbSetDeviceInfo functions described in this chapter. 72e9fcaa8aSmrg </para> 73e9fcaa8aSmrg</listitem> 74e9fcaa8aSmrg</itemizedlist> 75e9fcaa8aSmrg 76e9fcaa8aSmrg<para> 77e9fcaa8aSmrgEach device has an X Input Extension device ID. Each device may have several 78e9fcaa8aSmrgclasses of feedback. For example, there are two types of feedbacks that can 79e9fcaa8aSmrggenerate bells: bell feedback and keyboard feedback (<emphasis> 80e9fcaa8aSmrgBellFeedbackClass</emphasis> 81e9fcaa8aSmrg and <emphasis> 82e9fcaa8aSmrgKbdFeedbackClass</emphasis> 83e9fcaa8aSmrg). A device can have more than one feedback of each type; the feedback ID 84e9fcaa8aSmrgidentifies the particular feedback within its class. 85e9fcaa8aSmrg</para> 86e9fcaa8aSmrg 87e9fcaa8aSmrg 88e9fcaa8aSmrg<para> 89e9fcaa8aSmrgA keyboard feedback has: 90e9fcaa8aSmrg</para> 91e9fcaa8aSmrg 92e9fcaa8aSmrg<itemizedlist> 93e9fcaa8aSmrg<listitem> 94e9fcaa8aSmrg <para> 95e9fcaa8aSmrgAuto-repeat status (global and per key) 96e9fcaa8aSmrg </para> 97e9fcaa8aSmrg</listitem> 98e9fcaa8aSmrg<listitem> 99e9fcaa8aSmrg <para> 100e9fcaa8aSmrg32 LEDs 101e9fcaa8aSmrg </para> 102e9fcaa8aSmrg</listitem> 103e9fcaa8aSmrg<listitem> 104e9fcaa8aSmrg <para> 105e9fcaa8aSmrgA bell 106e9fcaa8aSmrg </para> 107e9fcaa8aSmrg</listitem> 108e9fcaa8aSmrg</itemizedlist> 109e9fcaa8aSmrg 110e9fcaa8aSmrg<para> 111e9fcaa8aSmrgAn indicator feedback has: 112e9fcaa8aSmrg</para> 113e9fcaa8aSmrg 114e9fcaa8aSmrg<itemizedlist> 115e9fcaa8aSmrg<listitem> 116e9fcaa8aSmrg <para> 117e9fcaa8aSmrgUp to 32 LEDs 118e9fcaa8aSmrg </para> 119e9fcaa8aSmrg</listitem> 120e9fcaa8aSmrg</itemizedlist> 121e9fcaa8aSmrg 122e9fcaa8aSmrg<para> 123e9fcaa8aSmrgIf the input extension is present and the server allows interaction between the 124e9fcaa8aSmrginput extension and Xkb, then the core keyboard, the core keyboard indicators, 125e9fcaa8aSmrgand the core keyboard bells may each be addressed using an appropriate device 126e9fcaa8aSmrgspec, class, and ID. The constant <emphasis> 127e9fcaa8aSmrgXkbXIDfltID</emphasis> 128e9fcaa8aSmrg may be used as the device ID to specify the core keyboard indicators for the 129e9fcaa8aSmrgcore indicator feedback. The particular device ID corresponding to the core 130e9fcaa8aSmrgkeyboard feedback and the core indicator feedback may be obtained by calling 131e9fcaa8aSmrg<emphasis> 132e9fcaa8aSmrgXkbGetDeviceInfo</emphasis> 133e9fcaa8aSmrg and specifying <emphasis> 134e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 135e9fcaa8aSmrg as the <emphasis> 136e9fcaa8aSmrgdevice_spec</emphasis> 137e9fcaa8aSmrg; the values will be returned in <emphasis> 138e9fcaa8aSmrgdflt_kbd_id</emphasis> 139e9fcaa8aSmrg and <emphasis> 140e9fcaa8aSmrgdflt_led_id</emphasis> 141e9fcaa8aSmrg. 142e9fcaa8aSmrg</para> 143e9fcaa8aSmrg 144e9fcaa8aSmrg 145e9fcaa8aSmrg<para> 146e9fcaa8aSmrgIf the server does not allow Xkb access to input extension <emphasis> 147e9fcaa8aSmrgKeyClass</emphasis> 148e9fcaa8aSmrg devices, attempts to use Xkb requests with those devices fail with a 149e9fcaa8aSmrgBad<emphasis> 150e9fcaa8aSmrgKeyboard</emphasis> 151e9fcaa8aSmrg error. Attempts to access non-<emphasis> 152e9fcaa8aSmrgKeyClass</emphasis> 153e9fcaa8aSmrg input 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> 159e9fcaa8aSmrg 160e9fcaa8aSmrg<para> 161e9fcaa8aSmrgInformation about X Input Extension devices is transferred between a client 162e9fcaa8aSmrgprogram and the Xkb extension in an <emphasis> 163e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 164e9fcaa8aSmrg structure: 165e9fcaa8aSmrg</para> 166e9fcaa8aSmrg 167e9fcaa8aSmrg<para><programlisting> 168e9fcaa8aSmrgtypedef struct { 169e9fcaa8aSmrg char * name; /* name for device */ 170e9fcaa8aSmrg Atom type; /* name for class of devices */ 171e9fcaa8aSmrg unsigned short device_spec; /* device of interest */ 172e9fcaa8aSmrg Bool has_own_state; /* <emphasis> True</emphasis> =>this 173e9fcaa8aSmrg device has its own state */ 174e9fcaa8aSmrg unsigned short supported; /* bits indicating supported capabilities */ 175e9fcaa8aSmrg unsigned short unsupported; /* bits indicating unsupported capabilities */ 176e9fcaa8aSmrg unsigned short num_btns; /* number of entries in <emphasis> btn_acts</emphasis> */ 177e9fcaa8aSmrg XkbAction * btn_acts; /* button actions */ 178e9fcaa8aSmrg unsigned short sz_leds; /* total number of entries in LEDs vector */ 179e9fcaa8aSmrg unsigned short num_leds; /* number of valid entries in LEDs vector */ 180e9fcaa8aSmrg unsigned short dflt_kbd_fb; /* input extension ID of default (core kbd) indicator */ 181e9fcaa8aSmrg unsigned short dflt_led_fb; /* input extension ID of default indicator feedback */ 182e9fcaa8aSmrg XkbDeviceLedInfoPtr leds; /* LED descriptions */ 183e9fcaa8aSmrg} <emphasis>XkbDeviceInfoRec</emphasis>, *XkbDeviceInfoPtr; 184e9fcaa8aSmrg</programlisting></para> 185e9fcaa8aSmrg 186e9fcaa8aSmrg<para><programlisting> 187e9fcaa8aSmrgtypedef struct { 188e9fcaa8aSmrg unsigned short led_class; /* class for this LED device*/ 189e9fcaa8aSmrg unsigned short led_id; /* ID for this LED device */ 190e9fcaa8aSmrg unsigned int phys_indicators; /* bits for which LEDs physically 191e9fcaa8aSmrg present */ 192e9fcaa8aSmrg unsigned int maps_present; /* bits for which LEDs have maps in 193e9fcaa8aSmrg <emphasis>maps</emphasis> */ 194e9fcaa8aSmrg unsigned int names_present; /* bits for which LEDs are in 195e9fcaa8aSmrg <emphasis> names</emphasis> */ 196e9fcaa8aSmrg unsigned int state; /* 1 bit => corresponding LED is on */ 197e9fcaa8aSmrg Atom names[XkbNumIndicators]; /* names for LEDs */ 198e9fcaa8aSmrg XkbIndicatorMapRec maps; /* indicator maps for each LED */ 199e9fcaa8aSmrg} <emphasis>XkbDeviceLedInfoRec</emphasis>, *XkbDeviceLedInfoPtr; 200e9fcaa8aSmrg</programlisting></para> 201e9fcaa8aSmrg 202e9fcaa8aSmrg<para> 203e9fcaa8aSmrgThe <emphasis> 204e9fcaa8aSmrgtype</emphasis> 205e9fcaa8aSmrg field is a registered symbolic name for a class of devices (for example, 206e9fcaa8aSmrg"TABLET"). If a device is a keyboard (that is, is a member of <emphasis> 207e9fcaa8aSmrgKeyClass</emphasis> 208e9fcaa8aSmrg), it has its own state, and <emphasis> 209e9fcaa8aSmrghas_own_state</emphasis> 210e9fcaa8aSmrg is <emphasis> 211e9fcaa8aSmrgTrue</emphasis> 212e9fcaa8aSmrg. If <emphasis> 213e9fcaa8aSmrghas_own_state</emphasis> 214e9fcaa8aSmrg is <emphasis> 215e9fcaa8aSmrgFalse</emphasis> 216e9fcaa8aSmrg, the state of the core keyboard is used. The <emphasis> 217e9fcaa8aSmrgsupported</emphasis> 218e9fcaa8aSmrg and <emphasis> 219e9fcaa8aSmrgunsupported</emphasis> 220e9fcaa8aSmrg fields are masks where each bit indicates a capability. The meaning of the 221e9fcaa8aSmrgmask bits is listed in Table 21.1, together with the fields in the <emphasis> 222e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 223e9fcaa8aSmrg structure that are associated with the capability represented by each bit. The 224e9fcaa8aSmrgsame bits are used to indicate the specific information desired in many of the 225e9fcaa8aSmrgfunctions described subsequently in this section. 226e9fcaa8aSmrg</para> 227e9fcaa8aSmrg 228eb411b4bSmrg<table frame='topbot'> 229e9fcaa8aSmrg<title>XkbDeviceInfoRec Mask Bits</title> 230eb411b4bSmrg<?dbfo keep-together="always" ?> 231eb411b4bSmrg<tgroup cols='4' align='left' colsep='0' rowsep='0'> 232eb411b4bSmrg<colspec colname='c1' colwidth='2.9*'/> 233eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/> 234eb411b4bSmrg<colspec colname='c3' colwidth='0.9*'/> 235eb411b4bSmrg<colspec colname='c4' colwidth='2.0*'/> 236e9fcaa8aSmrg<thead> 237eb411b4bSmrg <row rowsep='1'> 238e9fcaa8aSmrg <entry>Name</entry> 239e9fcaa8aSmrg <entry>XkbDeviceInfoRec Fields Effected</entry> 240e9fcaa8aSmrg <entry>Value</entry> 241e9fcaa8aSmrg <entry>Capability If Set</entry> 242e9fcaa8aSmrg </row> 243e9fcaa8aSmrg</thead> 244e9fcaa8aSmrg<tbody> 245eb411b4bSmrg <row> 246e9fcaa8aSmrg <entry>XkbXI_KeyboardsMask</entry> 247e9fcaa8aSmrg <entry></entry> 248e9fcaa8aSmrg <entry>(1L << 0)</entry> 249e9fcaa8aSmrg <entry> 250e9fcaa8aSmrgClients can use all Xkb requests and events with 251e9fcaa8aSmrg<emphasis>KeyClass</emphasis> 252e9fcaa8aSmrgdevices supported by the input device extension. 253e9fcaa8aSmrg </entry> 254e9fcaa8aSmrg </row> 255eb411b4bSmrg <row> 256e9fcaa8aSmrg <entry>XkbXI_ButtonActionsMask</entry> 257e9fcaa8aSmrg <entry> 258e9fcaa8aSmrg<para>num_btns</para> 259e9fcaa8aSmrg<para>btn_acts</para> 260e9fcaa8aSmrg </entry> 261e9fcaa8aSmrg <entry>(1L <<1)</entry> 262e9fcaa8aSmrg <entry> 263e9fcaa8aSmrgClients can assign key actions to buttons on non-<emphasis> 264e9fcaa8aSmrgKeyClass</emphasis> 265e9fcaa8aSmrginput extension devices. 266e9fcaa8aSmrg </entry> 267e9fcaa8aSmrg </row> 268eb411b4bSmrg <row> 269e9fcaa8aSmrg <entry>XkbXI_IndicatorNamesMask</entry> 270e9fcaa8aSmrg <entry>leds->names</entry> 271e9fcaa8aSmrg <entry>(1L <<2)</entry> 272e9fcaa8aSmrg <entry> 273e9fcaa8aSmrgClients can assign names to indicators on non-<emphasis> 274e9fcaa8aSmrgKeyClass</emphasis> 275e9fcaa8aSmrg input extension devices. 276e9fcaa8aSmrg </entry> 277e9fcaa8aSmrg </row> 278eb411b4bSmrg <row> 279e9fcaa8aSmrg <entry>XkbXI_IndicatorMapsMask</entry> 280e9fcaa8aSmrg <entry>leds->maps</entry> 281e9fcaa8aSmrg <entry>(1L <<3)</entry> 282e9fcaa8aSmrg <entry> 283e9fcaa8aSmrgClients can assign indicator maps to indicators on non-<emphasis> 284e9fcaa8aSmrgKeyClass</emphasis> 285e9fcaa8aSmrg input extension devices. 286e9fcaa8aSmrg </entry> 287e9fcaa8aSmrg </row> 288eb411b4bSmrg <row> 289e9fcaa8aSmrg <entry>XkbXI_IndicatorStateMask</entry> 290e9fcaa8aSmrg <entry>leds->state</entry> 291e9fcaa8aSmrg <entry>(1L <<4)</entry> 292e9fcaa8aSmrg <entry> 293e9fcaa8aSmrgClients can request the status of indicators on non-<emphasis> 294e9fcaa8aSmrgKeyClass</emphasis> 295e9fcaa8aSmrg input extension devices. 296e9fcaa8aSmrg </entry> 297e9fcaa8aSmrg </row> 298eb411b4bSmrg <row> 299e9fcaa8aSmrg <entry>XkbXI_IndicatorsMask</entry> 300e9fcaa8aSmrg <entry> 301e9fcaa8aSmrg<para>sz_leds</para> 302e9fcaa8aSmrg<para>num_leds</para> 303e9fcaa8aSmrg<para>leds->*</para> 304e9fcaa8aSmrg </entry> 305e9fcaa8aSmrg <entry>(0x1c)</entry> 306e9fcaa8aSmrg <entry> 307eb411b4bSmrg<para>XkbXI_IndicatorNames­Mask |</para> 308eb411b4bSmrg<para>XkbXI_IndicatorMaps­Mask |</para> 309eb411b4bSmrg<para>XkbXI_IndicatorState­Mask</para> 310e9fcaa8aSmrg </entry> 311e9fcaa8aSmrg </row> 312eb411b4bSmrg <row> 313e9fcaa8aSmrg <entry>XkbXI_UnsupportedFeaturesMask</entry> 314e9fcaa8aSmrg <entry>unsupported</entry> 315e9fcaa8aSmrg <entry>(1L <<15)</entry> 316e9fcaa8aSmrg <entry></entry> 317e9fcaa8aSmrg </row> 318eb411b4bSmrg <row> 319e9fcaa8aSmrg <entry>XkbXI_AllDeviceFeaturesMask</entry> 320e9fcaa8aSmrg <entry>Those selected by Value column masks</entry> 321e9fcaa8aSmrg <entry>(0x1e)</entry> 322e9fcaa8aSmrg <entry> 323eb411b4bSmrg<para>XkbXI_Indicators­Mask | </para> 324eb411b4bSmrg<para>XkbSI_ButtonActions­Mask</para> 325e9fcaa8aSmrg </entry> 326e9fcaa8aSmrg </row> 327eb411b4bSmrg <row> 328e9fcaa8aSmrg <entry>XkbXI_AllFeaturesMask</entry> 329e9fcaa8aSmrg <entry>Those selected by Value column masks</entry> 330e9fcaa8aSmrg <entry>(0x1f)</entry> 331e9fcaa8aSmrg <entry> 332eb411b4bSmrg<para>XkbSI_AllDevice­FeaturesMask |</para> 333eb411b4bSmrg<para>XkbSI_Keyboards­Mask</para> 334e9fcaa8aSmrg </entry> 335e9fcaa8aSmrg </row> 336eb411b4bSmrg <row> 337e9fcaa8aSmrg <entry>XkbXI_AllDetailsMask</entry> 338e9fcaa8aSmrg <entry>Those selected by Value column masks</entry> 339e9fcaa8aSmrg <entry>(0x801f)</entry> 340e9fcaa8aSmrg <entry> 341eb411b4bSmrg<para>XkbXI_AllFeatures­Mask | </para> 342eb411b4bSmrg<para>XkbXI_Unsupported­FeaturesMask</para> 343e9fcaa8aSmrg </entry> 344e9fcaa8aSmrg </row> 345e9fcaa8aSmrg</tbody> 346e9fcaa8aSmrg</tgroup> 347e9fcaa8aSmrg</table> 348e9fcaa8aSmrg 349e9fcaa8aSmrg<para> 350e9fcaa8aSmrgThe <emphasis> 351e9fcaa8aSmrgname</emphasis> 352e9fcaa8aSmrg, <emphasis> 353e9fcaa8aSmrgtype</emphasis> 354e9fcaa8aSmrg, <emphasis> 355e9fcaa8aSmrghas_own_state</emphasis> 356e9fcaa8aSmrg, <emphasis> 357e9fcaa8aSmrgsupported</emphasis> 358e9fcaa8aSmrg, and <emphasis> 359e9fcaa8aSmrgunsupported</emphasis> 360e9fcaa8aSmrg fields are always filled in when a valid reply is returned from the server 361e9fcaa8aSmrginvolving an <emphasis> 362e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 363e9fcaa8aSmrg. All of the other fields are modified only if the particular function asks for 364e9fcaa8aSmrgthem. 365e9fcaa8aSmrg</para> 366e9fcaa8aSmrg 367e9fcaa8aSmrg</sect1> 368eb411b4bSmrg<sect1 id='Querying_Xkb_Features_for_Non_KeyClass_Input_Extension_Devices'> 369e9fcaa8aSmrg<title>Querying Xkb Features for Non-KeyClass Input Extension Devices</title> 370e9fcaa8aSmrg 371e9fcaa8aSmrg<para> 372e9fcaa8aSmrgTo determine whether the X server allows Xkb access to particular capabilities 373e9fcaa8aSmrgof input devices other than the core X keyboard, or to determine the status of 374e9fcaa8aSmrgindicator maps, indicator names or button actions on a non-<emphasis> 375e9fcaa8aSmrgKeyClass</emphasis> 376e9fcaa8aSmrg extension device, use XkbGetDeviceInfo. 377e9fcaa8aSmrg</para> 378e9fcaa8aSmrg 379e9fcaa8aSmrg<informaltable frame='none'> 380eb411b4bSmrg<?dbfo keep-together="always" ?> 381eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 382eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 383e9fcaa8aSmrg<tbody> 384eb411b4bSmrg <row> 385e9fcaa8aSmrg <entry role='functiondecl'> 386e9fcaa8aSmrgXkbDeviceInfoPtr <emphasis> 387e9fcaa8aSmrgXkbGetDeviceInfo</emphasis> 388e9fcaa8aSmrg(<emphasis> 389e9fcaa8aSmrgdpy</emphasis> 390e9fcaa8aSmrg, which, device_spec, ind_class, ind_id) 391e9fcaa8aSmrg </entry> 392e9fcaa8aSmrg </row> 393eb411b4bSmrg <row> 394e9fcaa8aSmrg <entry role='functionargdecl'> 395e9fcaa8aSmrgDisplay * <emphasis> 396e9fcaa8aSmrgdpy</emphasis> 397e9fcaa8aSmrg; /* connection to X server */ 398e9fcaa8aSmrg </entry> 399e9fcaa8aSmrg </row> 400eb411b4bSmrg <row> 401e9fcaa8aSmrg <entry role='functionargdecl'> 402e9fcaa8aSmrgunsigned int which; /* mask indicating information to 403e9fcaa8aSmrgreturn */ 404e9fcaa8aSmrg </entry> 405e9fcaa8aSmrg </row> 406eb411b4bSmrg <row> 407e9fcaa8aSmrg <entry role='functionargdecl'> 408e9fcaa8aSmrgunsigned int <emphasis> 409e9fcaa8aSmrgdevice_spec</emphasis> 410e9fcaa8aSmrg; /* device ID, or <emphasis> 411e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 412e9fcaa8aSmrg */ 413e9fcaa8aSmrg </entry> 414e9fcaa8aSmrg </row> 415eb411b4bSmrg <row> 416e9fcaa8aSmrg <entry role='functionargdecl'> 417e9fcaa8aSmrgunsigned int <emphasis> 418e9fcaa8aSmrgind_class</emphasis> 419e9fcaa8aSmrg; /* feedback class for indicator requests */ 420e9fcaa8aSmrg </entry> 421e9fcaa8aSmrg </row> 422eb411b4bSmrg <row> 423e9fcaa8aSmrg <entry role='functionargdecl'> 424e9fcaa8aSmrgunsigned int <emphasis> 425e9fcaa8aSmrgind_id</emphasis> 426e9fcaa8aSmrg; /* feedback ID for indicator requests */ 427e9fcaa8aSmrg </entry> 428e9fcaa8aSmrg</row> 429e9fcaa8aSmrg</tbody> 430e9fcaa8aSmrg</tgroup> 431e9fcaa8aSmrg</informaltable> 432e9fcaa8aSmrg 433e9fcaa8aSmrg<para> 434e9fcaa8aSmrg<emphasis> 435e9fcaa8aSmrgXkbGetDeviceInfo</emphasis> 436e9fcaa8aSmrg returns information about the input device specified by <emphasis> 437e9fcaa8aSmrgdevice_spec</emphasis> 438e9fcaa8aSmrg. Unlike the <emphasis> 439e9fcaa8aSmrgdevice_spec</emphasis> 440e9fcaa8aSmrg parameter of most Xkb functions, <emphasis> 441e9fcaa8aSmrgdevice_spec</emphasis> 442e9fcaa8aSmrg does not need to be a keyboard device. It must, however, indicate either the 443e9fcaa8aSmrgcore keyboard or a valid X Input Extension device. 444e9fcaa8aSmrg</para> 445e9fcaa8aSmrg 446e9fcaa8aSmrg 447e9fcaa8aSmrg<para> 448e9fcaa8aSmrgThe <emphasis> 449e9fcaa8aSmrgwhich </emphasis> 450e9fcaa8aSmrgparameter<emphasis> 451e9fcaa8aSmrg </emphasis> 452e9fcaa8aSmrgis a mask specifying optional information to be returned. It is an inclusive OR 453e9fcaa8aSmrgof one or more of the values from Table 21.1 and causes the returned <emphasis> 454e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 455e9fcaa8aSmrg to contain values for the corresponding fields specified in the table. 456e9fcaa8aSmrg</para> 457e9fcaa8aSmrg 458e9fcaa8aSmrg 459e9fcaa8aSmrg<para> 460e9fcaa8aSmrgThe <emphasis> 461e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 462e9fcaa8aSmrg returned by <emphasis> 463e9fcaa8aSmrgXkbGetDeviceInfo</emphasis> 464e9fcaa8aSmrg always has values for <emphasis> 465e9fcaa8aSmrgname</emphasis> 466e9fcaa8aSmrg (may be a null string, ""), <emphasis> 467e9fcaa8aSmrgtype</emphasis> 468e9fcaa8aSmrg, <emphasis> 469e9fcaa8aSmrgsupported</emphasis> 470e9fcaa8aSmrg, <emphasis> 471e9fcaa8aSmrgunsupported</emphasis> 472e9fcaa8aSmrg, <emphasis> 473e9fcaa8aSmrghas_own_state</emphasis> 474e9fcaa8aSmrg, <emphasis> 475e9fcaa8aSmrgdflt_kbd_fd</emphasis> 476e9fcaa8aSmrg, and <emphasis> 477e9fcaa8aSmrgdflt_kbd_fb</emphasis> 478e9fcaa8aSmrg. Other fields are filled in as specified by <emphasis> 479e9fcaa8aSmrgwhich</emphasis> 480e9fcaa8aSmrg. 481e9fcaa8aSmrg</para> 482e9fcaa8aSmrg 483e9fcaa8aSmrg 484e9fcaa8aSmrg<para> 485e9fcaa8aSmrgUpon return, the <emphasis> 486e9fcaa8aSmrgsupported</emphasis> 487e9fcaa8aSmrg field will be set to the inclusive OR of zero or more bits from Table 21.1; 488e9fcaa8aSmrgeach bit set indicates an optional Xkb extension device feature supported by 489e9fcaa8aSmrgthe server implementation, and a client may modify the associated behavior. 490e9fcaa8aSmrg</para> 491e9fcaa8aSmrg 492e9fcaa8aSmrg 493e9fcaa8aSmrg<para> 494e9fcaa8aSmrgIf the <emphasis> 495e9fcaa8aSmrgXkbButtonActionsMask</emphasis> 496e9fcaa8aSmrg bit is set in <emphasis> 497e9fcaa8aSmrgwhich</emphasis> 498e9fcaa8aSmrg, the <emphasis> 499e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 500e9fcaa8aSmrg returned will have the button actions (<emphasis> 501e9fcaa8aSmrgbtn_acts</emphasis> 502e9fcaa8aSmrg field) filled in for all buttons. 503e9fcaa8aSmrg</para> 504e9fcaa8aSmrg 505e9fcaa8aSmrg 506e9fcaa8aSmrg<para> 507e9fcaa8aSmrgIf <emphasis> 508e9fcaa8aSmrgwhich</emphasis> 509e9fcaa8aSmrg includes one of the bits in XkbXI_IndicatorsMask, the feedback class of the 510e9fcaa8aSmrgindicators must be specified in ind_class, and the feedback ID of the 511e9fcaa8aSmrgindicators must be specified in ind_id. If the request does not include any of 512e9fcaa8aSmrgthe bits in XkbXI_IndicatorsMask, the ind_class and ind_id parameters are 513e9fcaa8aSmrgignored. The class and ID can be obtained via the input device extension 514e9fcaa8aSmrgXListInputDevices request. 515e9fcaa8aSmrg</para> 516e9fcaa8aSmrg 517e9fcaa8aSmrg 518e9fcaa8aSmrg<para> 519e9fcaa8aSmrgIf any of the <emphasis> 520e9fcaa8aSmrgXkbXI_IndicatorsMask</emphasis> 521e9fcaa8aSmrg bits are set in <emphasis> 522e9fcaa8aSmrgwhich</emphasis> 523e9fcaa8aSmrg, the <emphasis> 524e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 525e9fcaa8aSmrg returned will have filled in the portions of the <emphasis> 526e9fcaa8aSmrgleds</emphasis> 527e9fcaa8aSmrg structure corresponding to the indicator feedback identified by <emphasis> 528e9fcaa8aSmrgind_class</emphasis> 529e9fcaa8aSmrg and <emphasis> 530e9fcaa8aSmrgind_id</emphasis> 531e9fcaa8aSmrg. The <emphasis> 532e9fcaa8aSmrgleds</emphasis> 533e9fcaa8aSmrg vector of the <emphasis> 534e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 535e9fcaa8aSmrg is allocated if necessary and <emphasis> 536e9fcaa8aSmrgsz_leds</emphasis> 537e9fcaa8aSmrg and <emphasis> 538e9fcaa8aSmrgnum_leds</emphasis> 539e9fcaa8aSmrg filled in. The <emphasis> 540e9fcaa8aSmrgled_class</emphasis> 541e9fcaa8aSmrg, <emphasis> 542e9fcaa8aSmrgled_id</emphasis> 543e9fcaa8aSmrg and <emphasis> 544e9fcaa8aSmrgphys_indicators</emphasis> 545e9fcaa8aSmrg fields of the <emphasis> 546e9fcaa8aSmrgleds</emphasis> 547e9fcaa8aSmrg entry corresponding to <emphasis> 548e9fcaa8aSmrgind_class</emphasis> 549e9fcaa8aSmrg and <emphasis> 550e9fcaa8aSmrgind_id</emphasis> 551e9fcaa8aSmrg are always filled in. If <emphasis> 552e9fcaa8aSmrgwhich</emphasis> 553e9fcaa8aSmrg contains <emphasis> 554e9fcaa8aSmrgXkbXI_IndicatorNamesMask</emphasis> 555e9fcaa8aSmrg, the <emphasis> 556e9fcaa8aSmrgnames_present</emphasis> 557e9fcaa8aSmrg and <emphasis> 558e9fcaa8aSmrgnames</emphasis> 559e9fcaa8aSmrg fields of the <emphasis> 560e9fcaa8aSmrgleds</emphasis> 561e9fcaa8aSmrg structure corresponding to <emphasis> 562e9fcaa8aSmrgind_class</emphasis> 563e9fcaa8aSmrg and <emphasis> 564e9fcaa8aSmrgind_id</emphasis> 565e9fcaa8aSmrg are returned.<emphasis> 566e9fcaa8aSmrg </emphasis> 567e9fcaa8aSmrgIf <emphasis> 568e9fcaa8aSmrgwhich</emphasis> 569e9fcaa8aSmrg contains <emphasis> 570e9fcaa8aSmrgXkbXI_IndicatorStateMask</emphasis> 571e9fcaa8aSmrg<emphasis> 572e9fcaa8aSmrg,</emphasis> 573e9fcaa8aSmrg the corresponding <emphasis> 574e9fcaa8aSmrgstate</emphasis> 575e9fcaa8aSmrg field is updated. If <emphasis> 576e9fcaa8aSmrgwhich</emphasis> 577e9fcaa8aSmrg contains <emphasis> 578e9fcaa8aSmrgXkbXI_IndicatorMapsMask</emphasis> 579e9fcaa8aSmrg, the <emphasis> 580e9fcaa8aSmrgmaps_present</emphasis> 581e9fcaa8aSmrg and <emphasis> 582e9fcaa8aSmrgmaps</emphasis> 583e9fcaa8aSmrg fields are updated. 584e9fcaa8aSmrg</para> 585e9fcaa8aSmrg 586e9fcaa8aSmrg 587e9fcaa8aSmrg<para> 588e9fcaa8aSmrgXkb provides convenience functions to request subsets of the information 589e9fcaa8aSmrgavailable via <emphasis> 590e9fcaa8aSmrgXkbGetDeviceInfo</emphasis> 591e9fcaa8aSmrg. These convenience functions mirror some of the mask bits. The functions all 592e9fcaa8aSmrgtake an <emphasis> 593e9fcaa8aSmrgXkbDeviceInfoPtr</emphasis> 594e9fcaa8aSmrg as an input argument and operate on the X Input Extension device specified by 595e9fcaa8aSmrgthe <emphasis> 596e9fcaa8aSmrgdevice_spec</emphasis> 597e9fcaa8aSmrg field of the structure. Only the parts of the structure indicated in the 598e9fcaa8aSmrgfunction description are updated. The <emphasis> 599e9fcaa8aSmrgXkbDeviceInfo</emphasis> 600e9fcaa8aSmrgRec structure used in the function call can be obtained by calling 601e9fcaa8aSmrgXkbGetDeviceInfo or can be allocated by calling XkbAllocDeviceInfo (see section 602e9fcaa8aSmrg21.3). 603e9fcaa8aSmrg</para> 604e9fcaa8aSmrg 605e9fcaa8aSmrg 606e9fcaa8aSmrg<para> 607e9fcaa8aSmrgThese convenience functions are described as follows. 608e9fcaa8aSmrg</para> 609e9fcaa8aSmrg 610e9fcaa8aSmrg 611e9fcaa8aSmrg<para> 612e9fcaa8aSmrgTo query the button actions associated with an X Input Extension device, use 613e9fcaa8aSmrgXkbGetDeviceButtonActions. 614e9fcaa8aSmrg</para> 615e9fcaa8aSmrg 616e9fcaa8aSmrg 617e9fcaa8aSmrg<informaltable frame='none'> 618eb411b4bSmrg<?dbfo keep-together="always" ?> 619eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 620eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 621e9fcaa8aSmrg<tbody> 622eb411b4bSmrg <row> 623e9fcaa8aSmrg <entry role='functiondecl'> 624e9fcaa8aSmrgStatus <emphasis> 625e9fcaa8aSmrgXkbGetDeviceButtonActions</emphasis> 626e9fcaa8aSmrg(<emphasis> 627e9fcaa8aSmrgdpy, device_info, all_buttons, first_button, num_buttons</emphasis> 628e9fcaa8aSmrg) 629e9fcaa8aSmrg </entry> 630e9fcaa8aSmrg </row> 631eb411b4bSmrg <row> 632e9fcaa8aSmrg <entry role='functionargdecl'> 633e9fcaa8aSmrgDisplay * <emphasis> 634e9fcaa8aSmrgdpy</emphasis> 635e9fcaa8aSmrg; /* connection to X server */ 636e9fcaa8aSmrg </entry> 637e9fcaa8aSmrg </row> 638eb411b4bSmrg <row> 639e9fcaa8aSmrg <entry role='functionargdecl'> 640e9fcaa8aSmrgXkbDeviceInfoPtr device_info; /* structure to update with 641e9fcaa8aSmrgresults */ 642e9fcaa8aSmrg </entry> 643e9fcaa8aSmrg </row> 644eb411b4bSmrg <row> 645e9fcaa8aSmrg <entry role='functionargdecl'> 646e9fcaa8aSmrgBool <emphasis> 647e9fcaa8aSmrgall_buttons</emphasis> 648e9fcaa8aSmrg; /* <emphasis> 649e9fcaa8aSmrgTrue</emphasis> 650e9fcaa8aSmrg => get information for all buttons */ 651e9fcaa8aSmrg </entry> 652e9fcaa8aSmrg </row> 653eb411b4bSmrg <row> 654e9fcaa8aSmrg <entry role='functionargdecl'> 655e9fcaa8aSmrgunsigned int first_button; /* number of first button for 656e9fcaa8aSmrgwhich info is desired */ 657e9fcaa8aSmrg </entry> 658e9fcaa8aSmrg </row> 659eb411b4bSmrg <row> 660e9fcaa8aSmrg <entry role='functionargdecl'> 661e9fcaa8aSmrgunsigned int num_buttons; /* number of buttons for which 662e9fcaa8aSmrginfo is desired */ 663e9fcaa8aSmrg </entry> 664e9fcaa8aSmrg</row> 665e9fcaa8aSmrg</tbody> 666e9fcaa8aSmrg</tgroup> 667e9fcaa8aSmrg</informaltable> 668e9fcaa8aSmrg 669e9fcaa8aSmrg<para> 670e9fcaa8aSmrg<emphasis> 671e9fcaa8aSmrgXkbGetDeviceButtonActions</emphasis> 672e9fcaa8aSmrg queries the server for the desired button information for the device indicated 673e9fcaa8aSmrgby the <emphasis> 674e9fcaa8aSmrgdevice_spec</emphasis> 675e9fcaa8aSmrg field of <emphasis> 676e9fcaa8aSmrgdevice_info</emphasis> 677e9fcaa8aSmrg and waits for a reply. If successful,<emphasis> 678e9fcaa8aSmrg XkbGetDeviceButtonActions</emphasis> 679e9fcaa8aSmrg backfills the button actions (<emphasis> 680e9fcaa8aSmrgbtn_acts</emphasis> 681e9fcaa8aSmrg field of <emphasis> 682e9fcaa8aSmrgdevice_info</emphasis> 683e9fcaa8aSmrg) for only the requested buttons, updates the <emphasis> 684e9fcaa8aSmrgname</emphasis> 685e9fcaa8aSmrg, <emphasis> 686e9fcaa8aSmrgtype</emphasis> 687e9fcaa8aSmrg, <emphasis> 688e9fcaa8aSmrgsupported</emphasis> 689e9fcaa8aSmrg, and <emphasis> 690e9fcaa8aSmrgunsupported</emphasis> 691e9fcaa8aSmrg fields, and returns <emphasis> 692e9fcaa8aSmrgSuccess</emphasis> 693e9fcaa8aSmrg. 694e9fcaa8aSmrg</para> 695e9fcaa8aSmrg 696e9fcaa8aSmrg 697e9fcaa8aSmrg<para> 698e9fcaa8aSmrg<emphasis> 699e9fcaa8aSmrgall_buttons</emphasis> 700e9fcaa8aSmrg, <emphasis> 701e9fcaa8aSmrgfirst_button</emphasis> 702e9fcaa8aSmrg and <emphasis> 703e9fcaa8aSmrgnum_buttons</emphasis> 704e9fcaa8aSmrg specify the device buttons for which actions should be returned. Setting 705e9fcaa8aSmrg<emphasis> 706e9fcaa8aSmrgall_buttons</emphasis> 707e9fcaa8aSmrg to <emphasis> 708e9fcaa8aSmrgTrue</emphasis> 709e9fcaa8aSmrg requests actions for all device buttons; if <emphasis> 710e9fcaa8aSmrgall_buttons</emphasis> 711e9fcaa8aSmrg is <emphasis> 712e9fcaa8aSmrgFalse</emphasis> 713e9fcaa8aSmrg, <emphasis> 714e9fcaa8aSmrgfirst_button</emphasis> 715e9fcaa8aSmrg and <emphasis> 716e9fcaa8aSmrgnum_buttons</emphasis> 717e9fcaa8aSmrg specify a range of buttons for which actions are requested. 718e9fcaa8aSmrg</para> 719e9fcaa8aSmrg 720e9fcaa8aSmrg 721e9fcaa8aSmrg<para> 722e9fcaa8aSmrgIf a compatible version of Xkb is not available in the server or the Xkb 723e9fcaa8aSmrgextension has not been properly initialized, XkbGetDeviceButtonActions returns 724e9fcaa8aSmrg<emphasis> 725e9fcaa8aSmrgBadAccess</emphasis> 726e9fcaa8aSmrg. If allocation errors occur, a <emphasis> 727e9fcaa8aSmrgBadAlloc</emphasis> 728e9fcaa8aSmrg status is returned. If the specified device (<emphasis> 729e9fcaa8aSmrgdevice_info</emphasis> 730e9fcaa8aSmrg-><emphasis> 731e9fcaa8aSmrgdevice_spec</emphasis> 732e9fcaa8aSmrg) is invalid, a BadKeyboard status is returned. If the device has no buttons, a 733e9fcaa8aSmrgBad<emphasis> 734e9fcaa8aSmrgMatch</emphasis> 735e9fcaa8aSmrg status is returned. If <emphasis> 736e9fcaa8aSmrgfirst_button</emphasis> 737e9fcaa8aSmrg and <emphasis> 738e9fcaa8aSmrgnum_buttons</emphasis> 739e9fcaa8aSmrg specify illegal buttons, a Bad<emphasis> 740e9fcaa8aSmrgValue</emphasis> 741e9fcaa8aSmrg status is returned. 742e9fcaa8aSmrg</para> 743e9fcaa8aSmrg 744e9fcaa8aSmrg 745e9fcaa8aSmrg<para> 746e9fcaa8aSmrgTo query the indicator names, maps, and state associated with an LED feedback 747e9fcaa8aSmrgof an input extension device, use XkbGetDeviceLedInfo. 748e9fcaa8aSmrg</para> 749e9fcaa8aSmrg 750e9fcaa8aSmrg 751e9fcaa8aSmrg<informaltable frame='none'> 752eb411b4bSmrg<?dbfo keep-together="always" ?> 753eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 754eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 755e9fcaa8aSmrg<tbody> 756eb411b4bSmrg <row> 757e9fcaa8aSmrg <entry role='functiondecl'> 758e9fcaa8aSmrgStatus <emphasis> 759e9fcaa8aSmrgXkbGetDeviceLedInfo</emphasis> 760e9fcaa8aSmrg(<emphasis> 761e9fcaa8aSmrgdpy, device_i</emphasis> 762e9fcaa8aSmrgnfo, led_class, led_id, which) 763e9fcaa8aSmrg </entry> 764e9fcaa8aSmrg </row> 765eb411b4bSmrg <row> 766e9fcaa8aSmrg <entry role='functionargdecl'> 767e9fcaa8aSmrgDisplay * <emphasis> 768e9fcaa8aSmrgdpy</emphasis> 769e9fcaa8aSmrg; /* connection to X server */ 770e9fcaa8aSmrg </entry> 771e9fcaa8aSmrg </row> 772eb411b4bSmrg <row> 773e9fcaa8aSmrg <entry role='functionargdecl'> 774e9fcaa8aSmrgXkbDeviceInfoPtr device_info; /* structure to update with 775e9fcaa8aSmrgresults */ 776e9fcaa8aSmrg </entry> 777e9fcaa8aSmrg </row> 778eb411b4bSmrg <row> 779e9fcaa8aSmrg <entry role='functionargdecl'> 780e9fcaa8aSmrgunsigned int <emphasis> 781e9fcaa8aSmrgled_class</emphasis> 782e9fcaa8aSmrg; /* LED feedback class assigned by input extension */ 783e9fcaa8aSmrg </entry> 784e9fcaa8aSmrg </row> 785eb411b4bSmrg <row> 786e9fcaa8aSmrg <entry role='functionargdecl'> 787e9fcaa8aSmrgunsigned int led_id; /* LED feedback ID assigned by input 788e9fcaa8aSmrgextension */ 789e9fcaa8aSmrg </entry> 790e9fcaa8aSmrg </row> 791eb411b4bSmrg <row> 792e9fcaa8aSmrg <entry role='functionargdecl'> 793e9fcaa8aSmrgunsigned int which; /* mask indicating desired 794e9fcaa8aSmrginformation */ 795e9fcaa8aSmrg </entry> 796e9fcaa8aSmrg</row> 797e9fcaa8aSmrg</tbody> 798e9fcaa8aSmrg</tgroup> 799e9fcaa8aSmrg</informaltable> 800e9fcaa8aSmrg 801e9fcaa8aSmrg<para> 802e9fcaa8aSmrg<emphasis> 803e9fcaa8aSmrgXkbGetDeviceLedInfo</emphasis> 804e9fcaa8aSmrg queries the server for the desired LED information for the feedback specified 805e9fcaa8aSmrgby <emphasis> 806e9fcaa8aSmrgled_class</emphasis> 807e9fcaa8aSmrg and <emphasis> 808e9fcaa8aSmrgled_id</emphasis> 809e9fcaa8aSmrg for the X input extension device indicated by <emphasis> 810e9fcaa8aSmrgdevice_spec</emphasis> 811e9fcaa8aSmrg-><emphasis> 812e9fcaa8aSmrgdevice_info</emphasis> 813e9fcaa8aSmrg and waits for a reply. If successful, <emphasis> 814e9fcaa8aSmrgXkbGetDeviceLedInfo</emphasis> 815e9fcaa8aSmrg backfills the relevant fields of <emphasis> 816e9fcaa8aSmrgdevice_info</emphasis> 817e9fcaa8aSmrg as determined by <emphasis> 818e9fcaa8aSmrgwhich</emphasis> 819e9fcaa8aSmrg with the results and returns <emphasis> 820e9fcaa8aSmrgSuccess</emphasis> 821e9fcaa8aSmrg. Valid values for <emphasis> 822e9fcaa8aSmrgwhich</emphasis> 823e9fcaa8aSmrg are the inclusive OR of any of <emphasis> 824e9fcaa8aSmrgXkbXI_IndicatorNamesMask</emphasis> 825e9fcaa8aSmrg, <emphasis> 826e9fcaa8aSmrgXkbXI_IndicatorMapsMask</emphasis> 827e9fcaa8aSmrg, and <emphasis> 828e9fcaa8aSmrgXkbXI_IndicatorStateMask</emphasis> 829e9fcaa8aSmrg. 830e9fcaa8aSmrg</para> 831e9fcaa8aSmrg 832e9fcaa8aSmrg 833e9fcaa8aSmrg<para> 834e9fcaa8aSmrgThe fields of <emphasis> 835e9fcaa8aSmrgdevice_info</emphasis> 836e9fcaa8aSmrg that are filled in when this request succeeds are <emphasis> 837e9fcaa8aSmrgname, type, supported</emphasis> 838e9fcaa8aSmrg, and <emphasis> 839e9fcaa8aSmrgunsupported</emphasis> 840e9fcaa8aSmrg, and portions of the <emphasis> 841e9fcaa8aSmrgleds</emphasis> 842e9fcaa8aSmrg structure corresponding to <emphasis> 843e9fcaa8aSmrgled_class</emphasis> 844e9fcaa8aSmrg and <emphasis> 845e9fcaa8aSmrgled_id</emphasis> 846e9fcaa8aSmrg as indicated by the bits set in <emphasis> 847e9fcaa8aSmrgwhich</emphasis> 848e9fcaa8aSmrg. The <emphasis> 849e9fcaa8aSmrgdevice_info->leds</emphasis> 850e9fcaa8aSmrg vector is allocated if necessary and <emphasis> 851e9fcaa8aSmrgsz_leds</emphasis> 852e9fcaa8aSmrg and <emphasis> 853e9fcaa8aSmrgnum_leds</emphasis> 854e9fcaa8aSmrg filled in. The <emphasis> 855e9fcaa8aSmrgled_class</emphasis> 856e9fcaa8aSmrg, <emphasis> 857e9fcaa8aSmrgled_id</emphasis> 858e9fcaa8aSmrg and <emphasis> 859e9fcaa8aSmrgphys_indicators</emphasis> 860e9fcaa8aSmrg fields of the <emphasis> 861e9fcaa8aSmrgdevice_info</emphasis> 862e9fcaa8aSmrg-><emphasis> 863e9fcaa8aSmrgleds</emphasis> 864e9fcaa8aSmrg entry corresponding to <emphasis> 865e9fcaa8aSmrgled_class</emphasis> 866e9fcaa8aSmrg and <emphasis> 867e9fcaa8aSmrgled_id</emphasis> 868e9fcaa8aSmrg are always filled in. 869e9fcaa8aSmrg</para> 870e9fcaa8aSmrg 871e9fcaa8aSmrg 872e9fcaa8aSmrg<para> 873e9fcaa8aSmrgIf <emphasis> 874e9fcaa8aSmrgwhich</emphasis> 875e9fcaa8aSmrg contains <emphasis> 876e9fcaa8aSmrgXkbXI_IndicatorNamesMask</emphasis> 877e9fcaa8aSmrg, the <emphasis> 878e9fcaa8aSmrgnames_present</emphasis> 879e9fcaa8aSmrg and <emphasis> 880e9fcaa8aSmrgnames</emphasis> 881e9fcaa8aSmrg fields of the <emphasis> 882e9fcaa8aSmrgdevice_info</emphasis> 883e9fcaa8aSmrg-><emphasis> 884e9fcaa8aSmrgleds</emphasis> 885e9fcaa8aSmrg structure corresponding to <emphasis> 886e9fcaa8aSmrgled_class</emphasis> 887e9fcaa8aSmrg and <emphasis> 888e9fcaa8aSmrgled_id</emphasis> 889e9fcaa8aSmrg are updated, if <emphasis> 890e9fcaa8aSmrgwhich</emphasis> 891e9fcaa8aSmrg contains <emphasis> 892e9fcaa8aSmrgXkbXI_IndicatorStateMask</emphasis> 893e9fcaa8aSmrg<emphasis> 894e9fcaa8aSmrg,</emphasis> 895e9fcaa8aSmrg the corresponding <emphasis> 896e9fcaa8aSmrgstate</emphasis> 897e9fcaa8aSmrg field is updated, and if <emphasis> 898e9fcaa8aSmrgwhich</emphasis> 899e9fcaa8aSmrg contains <emphasis> 900e9fcaa8aSmrgXkbXI_IndicatorMapsMask</emphasis> 901e9fcaa8aSmrg, the <emphasis> 902e9fcaa8aSmrgmaps_present</emphasis> 903e9fcaa8aSmrg and <emphasis> 904e9fcaa8aSmrgmaps</emphasis> 905e9fcaa8aSmrg fields are updated. 906e9fcaa8aSmrg</para> 907e9fcaa8aSmrg 908e9fcaa8aSmrg 909e9fcaa8aSmrg<para> 910e9fcaa8aSmrgIf a compatible version of Xkb is not available in the server or the Xkb 911e9fcaa8aSmrgextension has not been properly initialized, <emphasis> 912e9fcaa8aSmrgXkbGetDeviceLedInfo</emphasis> 913e9fcaa8aSmrg returns <emphasis> 914e9fcaa8aSmrgBadAccess</emphasis> 915e9fcaa8aSmrg. If allocation errors occur, a BadAlloc status is returned. If the device has 916e9fcaa8aSmrgno indicators, a BadMatch error is returned. If <emphasis> 917e9fcaa8aSmrgledClass</emphasis> 918e9fcaa8aSmrg or <emphasis> 919e9fcaa8aSmrgledID</emphasis> 920e9fcaa8aSmrg have illegal values, a Bad<emphasis> 921e9fcaa8aSmrgValue</emphasis> 922e9fcaa8aSmrg error is returned. If they have legal values but do not specify a feedback 923e9fcaa8aSmrgthat contains LEDs and is associated with the specified device, a Bad<emphasis> 924e9fcaa8aSmrgMatch</emphasis> 925e9fcaa8aSmrg error is returned. 926e9fcaa8aSmrg</para> 927e9fcaa8aSmrg 928e9fcaa8aSmrg 929e9fcaa8aSmrg</sect1> 930eb411b4bSmrg<sect1 id='Allocating_Initializing_and_Freeing_the_XkbDeviceInfoRecStructure'> 931e9fcaa8aSmrg<title>Allocating, Initializing, and Freeing the XkbDeviceInfoRec 932e9fcaa8aSmrgStructure</title> 933e9fcaa8aSmrg 934e9fcaa8aSmrg<para> 935e9fcaa8aSmrgTo obtain an <emphasis> 936e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 937e9fcaa8aSmrg structure, use XkbGetDeviceInfo or XkbAllocDeviceInfo. 938e9fcaa8aSmrg</para> 939e9fcaa8aSmrg 940e9fcaa8aSmrg<informaltable frame='none'> 941eb411b4bSmrg<?dbfo keep-together="always" ?> 942eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 943eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 944e9fcaa8aSmrg<tbody> 945eb411b4bSmrg <row> 946e9fcaa8aSmrg <entry role='functiondecl'> 947e9fcaa8aSmrgXkbDeviceInfoPtr <emphasis> 948e9fcaa8aSmrgXkbAllocDeviceInfo</emphasis> 949e9fcaa8aSmrg(device_spec, n_buttons, sz_leds) 950e9fcaa8aSmrg </entry> 951e9fcaa8aSmrg </row> 952eb411b4bSmrg <row> 953e9fcaa8aSmrg <entry role='functionargdecl'> 954e9fcaa8aSmrgunsigned int device_spec; /* device ID with which 955e9fcaa8aSmrgstructure will be used */ 956e9fcaa8aSmrg </entry> 957e9fcaa8aSmrg </row> 958eb411b4bSmrg <row> 959e9fcaa8aSmrg <entry role='functionargdecl'> 960e9fcaa8aSmrgunsigned int <emphasis> 961e9fcaa8aSmrgn_buttons</emphasis> 962e9fcaa8aSmrg; /* number of button actions to allocate space for*/ 963e9fcaa8aSmrg </entry> 964e9fcaa8aSmrg </row> 965eb411b4bSmrg <row> 966e9fcaa8aSmrg <entry role='functionargdecl'> 967e9fcaa8aSmrgunsigned int <emphasis> 968e9fcaa8aSmrgsz_leds</emphasis> 969e9fcaa8aSmrg; /* number of LED feedbacks to allocate space for */ 970e9fcaa8aSmrg </entry> 971e9fcaa8aSmrg</row> 972e9fcaa8aSmrg</tbody> 973e9fcaa8aSmrg</tgroup> 974e9fcaa8aSmrg</informaltable> 975e9fcaa8aSmrg 976e9fcaa8aSmrg<para> 977e9fcaa8aSmrg<emphasis> 978e9fcaa8aSmrgXkbAllocDeviceInfo</emphasis> 979e9fcaa8aSmrg allocates space for an <emphasis> 980e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 981e9fcaa8aSmrg structure and initializes that structure’s <emphasis> 982e9fcaa8aSmrgdevice_spec</emphasis> 983e9fcaa8aSmrg field with the device ID specified by device_spec. If <emphasis> 984e9fcaa8aSmrgn_buttons</emphasis> 985e9fcaa8aSmrg is nonzero, <emphasis> 986e9fcaa8aSmrgn_buttons</emphasis> 987e9fcaa8aSmrg <emphasis> 988e9fcaa8aSmrgXkbActions</emphasis> 989e9fcaa8aSmrg are linked into the <emphasis> 990e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 991e9fcaa8aSmrg structure and initialized to zero. If sz_leds is nonzero, <emphasis> 992e9fcaa8aSmrgsz_leds</emphasis> 993e9fcaa8aSmrg <emphasis> 994e9fcaa8aSmrgXkbDeviceLedInfoRec</emphasis> 995e9fcaa8aSmrg structures are also allocated and linked into the <emphasis> 996e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 997e9fcaa8aSmrg structure. If you request <emphasis> 998e9fcaa8aSmrgXkbDeviceLedInfoRec</emphasis> 999e9fcaa8aSmrg structures be allocated using this request, you must initialize them 1000e9fcaa8aSmrgexplicitly. 1001e9fcaa8aSmrg</para> 1002e9fcaa8aSmrg 1003e9fcaa8aSmrg 1004e9fcaa8aSmrg<para> 1005e9fcaa8aSmrgTo obtain an <emphasis> 1006e9fcaa8aSmrgXkbDeviceLedInfoRec</emphasis> 1007e9fcaa8aSmrg structure, use XkbAllocDeviceLedInfo. 1008e9fcaa8aSmrg</para> 1009e9fcaa8aSmrg 1010e9fcaa8aSmrg 1011e9fcaa8aSmrg<informaltable frame='none'> 1012eb411b4bSmrg<?dbfo keep-together="always" ?> 1013eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1014eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1015e9fcaa8aSmrg<tbody> 1016eb411b4bSmrg <row> 1017e9fcaa8aSmrg <entry role='functiondecl'> 1018e9fcaa8aSmrgStatus <emphasis> 1019e9fcaa8aSmrgXkbAllocDeviceLedInfo</emphasis> 1020e9fcaa8aSmrg(devi, num_needed) 1021e9fcaa8aSmrg </entry> 1022e9fcaa8aSmrg </row> 1023eb411b4bSmrg <row> 1024e9fcaa8aSmrg <entry role='functionargdecl'> 1025e9fcaa8aSmrgXkbDeviceInfoPtr <emphasis> 1026e9fcaa8aSmrgdevice_info</emphasis> 1027e9fcaa8aSmrg; /* structure in which to allocate LED space */ 1028e9fcaa8aSmrg </entry> 1029e9fcaa8aSmrg </row> 1030eb411b4bSmrg <row> 1031e9fcaa8aSmrg <entry role='functionargdecl'> 1032e9fcaa8aSmrgint <emphasis> 1033e9fcaa8aSmrgnum_needed</emphasis> 1034e9fcaa8aSmrg; /* number of indicators to allocate space for */ 1035e9fcaa8aSmrg </entry> 1036e9fcaa8aSmrg</row> 1037e9fcaa8aSmrg</tbody> 1038e9fcaa8aSmrg</tgroup> 1039e9fcaa8aSmrg</informaltable> 1040e9fcaa8aSmrg 1041e9fcaa8aSmrg<para> 1042e9fcaa8aSmrg<emphasis> 1043e9fcaa8aSmrgXkbAllocDeviceLedInfo</emphasis> 1044e9fcaa8aSmrg allocates space for an <emphasis> 1045e9fcaa8aSmrgXkbDeviceLedInfoRec</emphasis> 1046e9fcaa8aSmrg and places it in <emphasis> 1047e9fcaa8aSmrgdevice_info</emphasis> 1048e9fcaa8aSmrg. If num_needed is nonzero, <emphasis> 1049e9fcaa8aSmrgnum_needed</emphasis> 1050e9fcaa8aSmrg <emphasis> 1051e9fcaa8aSmrgXkbIndicatorMapRec</emphasis> 1052e9fcaa8aSmrg structures are also allocated and linked into the <emphasis> 1053e9fcaa8aSmrgXkbDeviceLedInfoRec</emphasis> 1054e9fcaa8aSmrg structure. If you request <emphasis> 1055e9fcaa8aSmrgXkbIndicatorMapRec</emphasis> 1056e9fcaa8aSmrg structures be allocated using this request, you must initialize them 1057e9fcaa8aSmrgexplicitly. All other fields are initialized to zero. 1058e9fcaa8aSmrg</para> 1059e9fcaa8aSmrg 1060e9fcaa8aSmrg 1061e9fcaa8aSmrg<para> 1062e9fcaa8aSmrgTo initialize an <emphasis> 1063e9fcaa8aSmrgXkbDeviceLedInfoRec</emphasis> 1064e9fcaa8aSmrg structure, use XkbAddDeviceLedInfo. 1065e9fcaa8aSmrg</para> 1066e9fcaa8aSmrg 1067e9fcaa8aSmrg 1068e9fcaa8aSmrg<informaltable frame='none'> 1069eb411b4bSmrg<?dbfo keep-together="always" ?> 1070eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1071eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1072e9fcaa8aSmrg<tbody> 1073eb411b4bSmrg <row> 1074e9fcaa8aSmrg <entry role='functiondecl'> 1075e9fcaa8aSmrgXkbDeviceLedInfoPtr <emphasis> 1076e9fcaa8aSmrgXkbAddDeviceLedInfo</emphasis> 1077e9fcaa8aSmrg(device_info, led_class, led_id) 1078e9fcaa8aSmrg </entry> 1079e9fcaa8aSmrg </row> 1080eb411b4bSmrg <row> 1081e9fcaa8aSmrg <entry role='functionargdecl'> 1082e9fcaa8aSmrgXkbDeviceInfoPtr device_info; /* structure in which to 1083e9fcaa8aSmrgadd LED info */ 1084e9fcaa8aSmrg </entry> 1085e9fcaa8aSmrg </row> 1086eb411b4bSmrg <row> 1087e9fcaa8aSmrg <entry role='functionargdecl'> 1088e9fcaa8aSmrgunsigned int <emphasis> 1089e9fcaa8aSmrgled_class</emphasis> 1090e9fcaa8aSmrg; /* input extension class for LED device of interest */ 1091e9fcaa8aSmrg </entry> 1092e9fcaa8aSmrg </row> 1093eb411b4bSmrg <row> 1094e9fcaa8aSmrg <entry role='functionargdecl'> 1095e9fcaa8aSmrgunsigned int <emphasis> 1096e9fcaa8aSmrgled_id</emphasis> 1097e9fcaa8aSmrg; /* input extension ID for LED device of interest */ 1098e9fcaa8aSmrg </entry> 1099e9fcaa8aSmrg</row> 1100e9fcaa8aSmrg</tbody> 1101e9fcaa8aSmrg</tgroup> 1102e9fcaa8aSmrg</informaltable> 1103e9fcaa8aSmrg 1104e9fcaa8aSmrg<para> 1105e9fcaa8aSmrg<emphasis> 1106e9fcaa8aSmrgXkbAddDeviceLedInfo</emphasis> 1107e9fcaa8aSmrg first checks to see whether an entry matching <emphasis> 1108e9fcaa8aSmrgled_class</emphasis> 1109e9fcaa8aSmrg and <emphasis> 1110e9fcaa8aSmrgled_id</emphasis> 1111e9fcaa8aSmrg already exists in the <emphasis> 1112e9fcaa8aSmrgdevice_info->leds</emphasis> 1113e9fcaa8aSmrg array. If it finds a matching entry, it returns a pointer to that entry. 1114e9fcaa8aSmrgOtherwise, it checks to be sure there is at least one empty entry in <emphasis> 1115e9fcaa8aSmrgdevice_info</emphasis> 1116e9fcaa8aSmrg-><emphasis> 1117e9fcaa8aSmrgleds</emphasis> 1118e9fcaa8aSmrg and extends it if there is not enough room. It then increments <emphasis> 1119e9fcaa8aSmrgdevice_info</emphasis> 1120e9fcaa8aSmrg-><emphasis> 1121e9fcaa8aSmrgnum_leds</emphasis> 1122e9fcaa8aSmrg and fills in the next available entry in <emphasis> 1123e9fcaa8aSmrgdevice_info</emphasis> 1124e9fcaa8aSmrg-><emphasis> 1125e9fcaa8aSmrgleds</emphasis> 1126e9fcaa8aSmrg with <emphasis> 1127e9fcaa8aSmrgled_class</emphasis> 1128e9fcaa8aSmrg and <emphasis> 1129e9fcaa8aSmrgled_id</emphasis> 1130e9fcaa8aSmrg. 1131e9fcaa8aSmrg</para> 1132e9fcaa8aSmrg 1133e9fcaa8aSmrg 1134e9fcaa8aSmrg<para> 1135e9fcaa8aSmrgIf successful, <emphasis> 1136e9fcaa8aSmrgXkbAddDeviceLedInfo</emphasis> 1137e9fcaa8aSmrg returns a pointer to the <emphasis> 1138e9fcaa8aSmrgXkbDeviceLedInfoRec</emphasis> 1139e9fcaa8aSmrg structure that was initialized. If unable to allocate sufficient storage, or 1140e9fcaa8aSmrgif <emphasis> 1141e9fcaa8aSmrgdevice_info</emphasis> 1142e9fcaa8aSmrg points to an invalid <emphasis> 1143e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 1144e9fcaa8aSmrg structure, or if <emphasis> 1145e9fcaa8aSmrgled_class</emphasis> 1146e9fcaa8aSmrg or <emphasis> 1147e9fcaa8aSmrgled_id</emphasis> 1148e9fcaa8aSmrg are inappropriate, <emphasis> 1149e9fcaa8aSmrgXkbAddDeviceLedInfo</emphasis> 1150e9fcaa8aSmrg returns <emphasis> 1151e9fcaa8aSmrgNULL</emphasis> 1152e9fcaa8aSmrg. 1153e9fcaa8aSmrg</para> 1154e9fcaa8aSmrg 1155e9fcaa8aSmrg 1156e9fcaa8aSmrg<para> 1157e9fcaa8aSmrgTo allocate additional space for button actions in an <emphasis> 1158e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 1159e9fcaa8aSmrg structure, use XkbResizeDeviceButtonActions. 1160e9fcaa8aSmrg</para> 1161e9fcaa8aSmrg 1162e9fcaa8aSmrg 1163e9fcaa8aSmrg<informaltable frame='none'> 1164eb411b4bSmrg<?dbfo keep-together="always" ?> 1165eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1166eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1167e9fcaa8aSmrg<tbody> 1168eb411b4bSmrg <row> 1169e9fcaa8aSmrg <entry role='functiondecl'> 1170e9fcaa8aSmrgStatus <emphasis> 1171e9fcaa8aSmrgXkbResizeDeviceButtonActions</emphasis> 1172e9fcaa8aSmrg(device_info, new_total) 1173e9fcaa8aSmrg </entry> 1174e9fcaa8aSmrg </row> 1175eb411b4bSmrg <row> 1176e9fcaa8aSmrg <entry role='functionargdecl'> 1177e9fcaa8aSmrgXkbDeviceInfoPtr device_info; /* structure in which to 1178e9fcaa8aSmrgallocate button actions */ 1179e9fcaa8aSmrg </entry> 1180e9fcaa8aSmrg </row> 1181eb411b4bSmrg <row> 1182e9fcaa8aSmrg <entry role='functionargdecl'> 1183e9fcaa8aSmrgunsigned int <emphasis> 1184e9fcaa8aSmrgnew_total</emphasis> 1185e9fcaa8aSmrg; /* new total number of button actions needed */ 1186e9fcaa8aSmrg </entry> 1187e9fcaa8aSmrg</row> 1188e9fcaa8aSmrg</tbody> 1189e9fcaa8aSmrg</tgroup> 1190e9fcaa8aSmrg</informaltable> 1191e9fcaa8aSmrg 1192e9fcaa8aSmrg<para> 1193e9fcaa8aSmrg<emphasis> 1194e9fcaa8aSmrgXkbResizeDeviceButton</emphasis> 1195e9fcaa8aSmrg reallocates space, if necessary, to make sure there is room for a total of 1196e9fcaa8aSmrg<emphasis> 1197e9fcaa8aSmrgnew_total</emphasis> 1198e9fcaa8aSmrg button actions in the <emphasis> 1199e9fcaa8aSmrgdevice_info</emphasis> 1200e9fcaa8aSmrg structure. Any new entries allocated are zeroed. If successful, <emphasis> 1201e9fcaa8aSmrgXkbResizeDeviceButton</emphasis> 1202e9fcaa8aSmrg returns Success. If new_total is zero, all button actions are deleted, 1203e9fcaa8aSmrg<emphasis> 1204e9fcaa8aSmrgdevice_info</emphasis> 1205e9fcaa8aSmrg-><emphasis> 1206e9fcaa8aSmrgnum_btns</emphasis> 1207e9fcaa8aSmrg is set to zero, and <emphasis> 1208e9fcaa8aSmrgdevice_info</emphasis> 1209e9fcaa8aSmrg-><emphasis> 1210e9fcaa8aSmrgbtn_acts</emphasis> 1211e9fcaa8aSmrg is set to <emphasis> 1212e9fcaa8aSmrgNULL</emphasis> 1213e9fcaa8aSmrg. If device_info is invalid or new_total is greater than 255, BadValue is 1214e9fcaa8aSmrgreturned. If a memory allocation failure occurs, a <emphasis> 1215e9fcaa8aSmrgBadAlloc</emphasis> 1216e9fcaa8aSmrg is returned. 1217e9fcaa8aSmrg</para> 1218e9fcaa8aSmrg 1219e9fcaa8aSmrg 1220e9fcaa8aSmrg<para> 1221e9fcaa8aSmrgTo free an <emphasis> 1222e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 1223e9fcaa8aSmrg structure, use XkbFreeDeviceInfo. 1224e9fcaa8aSmrg</para> 1225e9fcaa8aSmrg 1226e9fcaa8aSmrg 1227e9fcaa8aSmrg<informaltable frame='none'> 1228eb411b4bSmrg<?dbfo keep-together="always" ?> 1229eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1230eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1231e9fcaa8aSmrg<tbody> 1232eb411b4bSmrg <row> 1233e9fcaa8aSmrg <entry role='functiondecl'> 1234e9fcaa8aSmrgvoid <emphasis> 1235e9fcaa8aSmrgXkbFreeDeviceInfo</emphasis> 1236e9fcaa8aSmrg(device_info, which, free_all) 1237e9fcaa8aSmrg </entry> 1238e9fcaa8aSmrg </row> 1239eb411b4bSmrg <row> 1240e9fcaa8aSmrg <entry role='functionargdecl'> 1241e9fcaa8aSmrgXkbDeviceInfoPtr device_info; /* pointer to <emphasis> 1242e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 1243e9fcaa8aSmrg in which to free items */ 1244e9fcaa8aSmrg </entry> 1245e9fcaa8aSmrg </row> 1246eb411b4bSmrg <row> 1247e9fcaa8aSmrg <entry role='functionargdecl'> 1248e9fcaa8aSmrgunsigned int <emphasis> 1249e9fcaa8aSmrgwhich</emphasis> 1250e9fcaa8aSmrg; /* mask of components of <emphasis> 1251e9fcaa8aSmrgdevice_info</emphasis> 1252e9fcaa8aSmrg to free */ 1253e9fcaa8aSmrg </entry> 1254e9fcaa8aSmrg </row> 1255eb411b4bSmrg <row> 1256e9fcaa8aSmrg <entry role='functionargdecl'> 1257e9fcaa8aSmrgBool <emphasis> 1258e9fcaa8aSmrgfree_all</emphasis> 1259e9fcaa8aSmrg; /* <emphasis> 1260e9fcaa8aSmrgTrue</emphasis> 1261e9fcaa8aSmrg => free everything, including device_info */ 1262e9fcaa8aSmrg </entry> 1263e9fcaa8aSmrg</row> 1264e9fcaa8aSmrg</tbody> 1265e9fcaa8aSmrg</tgroup> 1266e9fcaa8aSmrg</informaltable> 1267e9fcaa8aSmrg 1268e9fcaa8aSmrg<para> 1269e9fcaa8aSmrgIf free_all is <emphasis> 1270e9fcaa8aSmrgTrue</emphasis> 1271e9fcaa8aSmrg, the <emphasis> 1272e9fcaa8aSmrgXkbFreeDeviceInfo</emphasis> 1273e9fcaa8aSmrg frees all components of <emphasis> 1274e9fcaa8aSmrgdevice_info</emphasis> 1275e9fcaa8aSmrg and the <emphasis> 1276e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 1277e9fcaa8aSmrg structure pointed to by <emphasis> 1278e9fcaa8aSmrgdevice_info</emphasis> 1279e9fcaa8aSmrg itself. If free_all is <emphasis> 1280e9fcaa8aSmrgFalse</emphasis> 1281e9fcaa8aSmrg, the value of which determines which subcomponents are freed. <emphasis> 1282e9fcaa8aSmrgwhich </emphasis> 1283e9fcaa8aSmrgis an inclusive OR of one or more of the values from Table 21.1. If which 1284e9fcaa8aSmrgcontains XkbXI_ButtonActionsMask, all button actions associated with <emphasis> 1285e9fcaa8aSmrgdevice_info</emphasis> 1286e9fcaa8aSmrg are freed, <emphasis> 1287e9fcaa8aSmrgdevice_info</emphasis> 1288e9fcaa8aSmrg-><emphasis> 1289e9fcaa8aSmrgbtn_acts</emphasis> 1290e9fcaa8aSmrg is set to <emphasis> 1291e9fcaa8aSmrgNULL</emphasis> 1292e9fcaa8aSmrg, and <emphasis> 1293e9fcaa8aSmrgdevice_info</emphasis> 1294e9fcaa8aSmrg-><emphasis> 1295e9fcaa8aSmrgnum_btns</emphasis> 1296e9fcaa8aSmrg is set to zero. If which contains all bits in XkbXI_IndicatorsMask, all 1297e9fcaa8aSmrg<emphasis> 1298e9fcaa8aSmrgXkbDeviceLedInfoRec</emphasis> 1299e9fcaa8aSmrg structures associated with <emphasis> 1300e9fcaa8aSmrgdevice_info</emphasis> 1301e9fcaa8aSmrg are freed, <emphasis> 1302e9fcaa8aSmrgdevice_info</emphasis> 1303e9fcaa8aSmrg-><emphasis> 1304e9fcaa8aSmrgleds</emphasis> 1305e9fcaa8aSmrg is set to <emphasis> 1306e9fcaa8aSmrgNULL</emphasis> 1307e9fcaa8aSmrg, and <emphasis> 1308e9fcaa8aSmrgdevice_info</emphasis> 1309e9fcaa8aSmrg-><emphasis> 1310e9fcaa8aSmrgsz_leds</emphasis> 1311e9fcaa8aSmrg and <emphasis> 1312e9fcaa8aSmrgdevice_info</emphasis> 1313e9fcaa8aSmrg-><emphasis> 1314e9fcaa8aSmrgnum_leds</emphasis> 1315e9fcaa8aSmrg are set to zero. If which contains XkbXI_IndicatorMapsMask, all indicator maps 1316e9fcaa8aSmrgassociated with <emphasis> 1317e9fcaa8aSmrgdevice_info</emphasis> 1318e9fcaa8aSmrg are cleared, but the number of LEDs and the leds structures themselves are 1319e9fcaa8aSmrgpreserved. If which contains XkbXI_IndicatorNamesMask, all indicator names 1320e9fcaa8aSmrgassociated with device_info are cleared, but the number of LEDs and the leds 1321e9fcaa8aSmrgstructures themselves are preserved. If which contains 1322e9fcaa8aSmrgXkbXI_IndicatorStateMask, the indicator state associated with the <emphasis> 1323e9fcaa8aSmrgdevice_info</emphasis> 1324e9fcaa8aSmrg leds are set to zeros but the number of LEDs and the leds structures 1325e9fcaa8aSmrgthemselves are preserved. 1326e9fcaa8aSmrg</para> 1327e9fcaa8aSmrg 1328e9fcaa8aSmrg 1329e9fcaa8aSmrg</sect1> 1330eb411b4bSmrg<sect1 id='Setting_Xkb_Features_for_Non_KeyClass_Input_Extension_Devices'> 1331eb411b4bSmrg<title>Setting Xkb Features for Non-KeyClass Input Extension Devices</title> 1332e9fcaa8aSmrg 1333e9fcaa8aSmrg<para> 1334e9fcaa8aSmrgThe Xkb extension allows clients to assign any key action to either core 1335e9fcaa8aSmrgpointer or input extension device buttons. This makes it possible to control 1336e9fcaa8aSmrgthe keyboard or generate keyboard key events from extension devices or from the 1337e9fcaa8aSmrgcore pointer. 1338e9fcaa8aSmrg</para> 1339e9fcaa8aSmrg 1340e9fcaa8aSmrg 1341e9fcaa8aSmrg<para> 1342e9fcaa8aSmrgKey actions assigned to core X pointer buttons or input extension device 1343e9fcaa8aSmrgbuttons cause key events to be generated as if they had originated from the 1344e9fcaa8aSmrgcore X keyboard. 1345e9fcaa8aSmrg</para> 1346e9fcaa8aSmrg 1347e9fcaa8aSmrg 1348e9fcaa8aSmrg<para> 1349e9fcaa8aSmrgXkb implementations are required to support key actions for the buttons of the 1350e9fcaa8aSmrgcore pointer device, but support for actions on extension devices is optional. 1351e9fcaa8aSmrgImplementations that do not support button actions for extension devices must 1352e9fcaa8aSmrgnot set the <emphasis> 1353e9fcaa8aSmrgXkbXI_ButtonActionsMask</emphasis> 1354e9fcaa8aSmrg bit in the <emphasis> 1355e9fcaa8aSmrgsupported</emphasis> 1356e9fcaa8aSmrg field of an <emphasis> 1357e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 1358e9fcaa8aSmrg structure. 1359e9fcaa8aSmrg</para> 1360e9fcaa8aSmrg 1361e9fcaa8aSmrg 1362e9fcaa8aSmrg<para> 1363e9fcaa8aSmrgIf a client attempts to modify valid characteristics of a device using an 1364e9fcaa8aSmrgimplementation that does not support modification of those characteristics, no 1365e9fcaa8aSmrgprotocol error is generated. Instead, the server reports a failure for the 1366e9fcaa8aSmrgrequest; it also sends an <emphasis> 1367e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1368e9fcaa8aSmrg event to the client that issued the request if the client has selected to 1369e9fcaa8aSmrgreceive these events. 1370e9fcaa8aSmrg</para> 1371e9fcaa8aSmrg 1372e9fcaa8aSmrg 1373e9fcaa8aSmrg<para> 1374e9fcaa8aSmrgTo change characteristics of an X Input Extension device in the server, first 1375e9fcaa8aSmrgmodify a local copy of the device structure and then use either <emphasis> 1376e9fcaa8aSmrgXkbSetDeviceInfo,</emphasis> 1377e9fcaa8aSmrg or, to save network traffic, use an <emphasis> 1378e9fcaa8aSmrgXkbDeviceChangesRec</emphasis> 1379e9fcaa8aSmrg structure (see section 21.6) and call <emphasis> 1380e9fcaa8aSmrgXkbChangeDeviceInfo</emphasis> 1381e9fcaa8aSmrg to download the changes to the server. 1382e9fcaa8aSmrg</para> 1383e9fcaa8aSmrg 1384e9fcaa8aSmrg 1385e9fcaa8aSmrg<para> 1386e9fcaa8aSmrgTo modify some or all of the characteristics of an X Input Extension device, 1387e9fcaa8aSmrguse XkbSetDeviceInfo. 1388e9fcaa8aSmrg</para> 1389e9fcaa8aSmrg 1390e9fcaa8aSmrg<informaltable frame='none'> 1391eb411b4bSmrg<?dbfo keep-together="always" ?> 1392eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1393eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1394e9fcaa8aSmrg<tbody> 1395eb411b4bSmrg <row> 1396e9fcaa8aSmrg <entry role='functiondecl'> 1397e9fcaa8aSmrgBool <emphasis> 1398e9fcaa8aSmrgXkbSetDeviceInfo</emphasis> 1399e9fcaa8aSmrg(<emphasis> 1400e9fcaa8aSmrgdpy</emphasis> 1401e9fcaa8aSmrg, which, device_info) 1402e9fcaa8aSmrg </entry> 1403e9fcaa8aSmrg </row> 1404eb411b4bSmrg <row> 1405e9fcaa8aSmrg <entry role='functionargdecl'> 1406e9fcaa8aSmrgDisplay * <emphasis> 1407e9fcaa8aSmrgdpy</emphasis> 1408e9fcaa8aSmrg; /* connection to X server */ 1409e9fcaa8aSmrg </entry> 1410e9fcaa8aSmrg </row> 1411eb411b4bSmrg <row> 1412e9fcaa8aSmrg <entry role='functionargdecl'> 1413e9fcaa8aSmrgunsigned int <emphasis> 1414e9fcaa8aSmrgwhich</emphasis> 1415e9fcaa8aSmrg; /* mask indicating characteristics to modify */ 1416e9fcaa8aSmrg </entry> 1417e9fcaa8aSmrg </row> 1418eb411b4bSmrg <row> 1419e9fcaa8aSmrg <entry role='functionargdecl'> 1420e9fcaa8aSmrgXkbDeviceInfoPtr device_info; /* structure defining the 1421e9fcaa8aSmrgdevice and modifications */ 1422e9fcaa8aSmrg </entry> 1423e9fcaa8aSmrg</row> 1424e9fcaa8aSmrg</tbody> 1425e9fcaa8aSmrg</tgroup> 1426e9fcaa8aSmrg</informaltable> 1427e9fcaa8aSmrg 1428e9fcaa8aSmrg<para> 1429e9fcaa8aSmrg<emphasis> 1430e9fcaa8aSmrgXkbSetDeviceInfo</emphasis> 1431e9fcaa8aSmrg sends a request to the server to modify the characteristics of the device 1432e9fcaa8aSmrgspecified in the <emphasis> 1433e9fcaa8aSmrgdevice_info</emphasis> 1434e9fcaa8aSmrg structure. The particular characteristics modified are identified by the bits 1435e9fcaa8aSmrgset in <emphasis> 1436e9fcaa8aSmrgwhich</emphasis> 1437e9fcaa8aSmrg and take their values from the relevant fields in <emphasis> 1438e9fcaa8aSmrgdevice_info</emphasis> 1439e9fcaa8aSmrg (see Table 21.1). <emphasis> 1440e9fcaa8aSmrgXkbSetDeviceInfo</emphasis> 1441e9fcaa8aSmrg returns <emphasis> 1442e9fcaa8aSmrgTrue</emphasis> 1443e9fcaa8aSmrg if the request was successfully sent to the server. If the X server 1444e9fcaa8aSmrgimplementation does not allow interaction between the X input extension and the 1445e9fcaa8aSmrgXkb Extension, the function does nothing and returns <emphasis> 1446e9fcaa8aSmrgFalse</emphasis> 1447e9fcaa8aSmrg. 1448e9fcaa8aSmrg</para> 1449e9fcaa8aSmrg 1450e9fcaa8aSmrg 1451e9fcaa8aSmrg<para> 1452e9fcaa8aSmrgThe <emphasis> 1453e9fcaa8aSmrgwhich</emphasis> 1454e9fcaa8aSmrg parameter specifies which aspects of the device should be changed and is a 1455e9fcaa8aSmrgbitmask composed of an inclusive OR or one or more of the following bits: 1456e9fcaa8aSmrg<emphasis> 1457e9fcaa8aSmrgXkbXI_ButtonActionsMask</emphasis> 1458e9fcaa8aSmrg, <emphasis> 1459e9fcaa8aSmrgXkbXI_IndicatorNamesMask</emphasis> 1460e9fcaa8aSmrg, <emphasis> 1461e9fcaa8aSmrgXkbXI_IndicatorMapsMask</emphasis> 1462e9fcaa8aSmrg. If the features requested to be manipulated in <emphasis> 1463e9fcaa8aSmrgwhich</emphasis> 1464e9fcaa8aSmrg are valid for the device, but the server does not support assignment of one or 1465e9fcaa8aSmrgmore of them, that particular portion of the request is ignored. 1466e9fcaa8aSmrg</para> 1467e9fcaa8aSmrg 1468e9fcaa8aSmrg 1469e9fcaa8aSmrg<para> 1470e9fcaa8aSmrgIf the device specified in <emphasis> 1471e9fcaa8aSmrgdevice_info</emphasis> 1472e9fcaa8aSmrg-><emphasis> 1473e9fcaa8aSmrgdevice_spec</emphasis> 1474e9fcaa8aSmrg does not contain buttons and a request affecting buttons is made, or the 1475e9fcaa8aSmrgdevice does not contain indicators and a request affecting indicators is made, 1476e9fcaa8aSmrga <emphasis> 1477e9fcaa8aSmrgBadMatch</emphasis> 1478e9fcaa8aSmrg protocol error results. 1479e9fcaa8aSmrg</para> 1480e9fcaa8aSmrg 1481e9fcaa8aSmrg 1482e9fcaa8aSmrg<para> 1483e9fcaa8aSmrgIf the <emphasis> 1484e9fcaa8aSmrgXkbXI_ButtonActionsMask</emphasis> 1485e9fcaa8aSmrg bit is set in the supported mask returned by XkbGetDeviceInfo, the Xkb 1486e9fcaa8aSmrgextension allows applications to assign key actions to buttons on input 1487e9fcaa8aSmrgextension devices other than the core keyboard device. If the <emphasis> 1488e9fcaa8aSmrgXkbXI_ButtonActionsMask</emphasis> 1489e9fcaa8aSmrg is set in <emphasis> 1490e9fcaa8aSmrgwhich</emphasis> 1491e9fcaa8aSmrg, the actions for all buttons specified in device_info are set to the <emphasis> 1492e9fcaa8aSmrgXkbAction</emphasis> 1493e9fcaa8aSmrgs specified in <emphasis> 1494e9fcaa8aSmrgdevice_info</emphasis> 1495e9fcaa8aSmrg-><emphasis> 1496e9fcaa8aSmrgbtn_acts</emphasis> 1497e9fcaa8aSmrg. If the number of buttons requested to be updated is not valid for the device, 1498e9fcaa8aSmrg<emphasis> 1499e9fcaa8aSmrgXkbSetDeviceInfo</emphasis> 1500e9fcaa8aSmrg returns <emphasis> 1501e9fcaa8aSmrgFalse</emphasis> 1502e9fcaa8aSmrg and a <emphasis> 1503e9fcaa8aSmrgBadValue</emphasis> 1504e9fcaa8aSmrg protocol error results. 1505e9fcaa8aSmrg</para> 1506e9fcaa8aSmrg 1507e9fcaa8aSmrg 1508e9fcaa8aSmrg<para> 1509e9fcaa8aSmrgIf the <emphasis> 1510e9fcaa8aSmrgXkbXI_IndicatorMaps</emphasis> 1511e9fcaa8aSmrg and / or <emphasis> 1512e9fcaa8aSmrgXkbXI_IndicatorNamesMask</emphasis> 1513e9fcaa8aSmrg bit is set in the supported mask returned by XkbGetDeviceInfo, the Xkb 1514e9fcaa8aSmrgextension allows applications to assign maps and / or names to the indicators 1515e9fcaa8aSmrgof nonkeyboard extension devices. If supported, maps and / or names can be 1516e9fcaa8aSmrgassigned to all extension device indicators, whether they are part of a 1517e9fcaa8aSmrgkeyboard feedback or part of an indicator feedback. 1518e9fcaa8aSmrg</para> 1519e9fcaa8aSmrg 1520e9fcaa8aSmrg 1521e9fcaa8aSmrg<para> 1522e9fcaa8aSmrgIf the <emphasis> 1523e9fcaa8aSmrgXkbXI_IndicatorMapsMask</emphasis> 1524e9fcaa8aSmrg and / or <emphasis> 1525e9fcaa8aSmrgXkbXI_IndicatorNamesMask</emphasis> 1526e9fcaa8aSmrg flag is set in <emphasis> 1527e9fcaa8aSmrgwhich</emphasis> 1528e9fcaa8aSmrg, the indicator maps and / or names for all <emphasis> 1529e9fcaa8aSmrgdevice_info</emphasis> 1530e9fcaa8aSmrg-><emphasis> 1531e9fcaa8aSmrgnum_leds</emphasis> 1532e9fcaa8aSmrg indicator devices specified in <emphasis> 1533e9fcaa8aSmrgdevice_info</emphasis> 1534e9fcaa8aSmrg-><emphasis> 1535e9fcaa8aSmrgleds</emphasis> 1536e9fcaa8aSmrg are set to the maps and / or names specified in <emphasis> 1537e9fcaa8aSmrgdevice_info</emphasis> 1538e9fcaa8aSmrg-><emphasis> 1539e9fcaa8aSmrgleds</emphasis> 1540e9fcaa8aSmrg. <emphasis> 1541e9fcaa8aSmrgdevice_info</emphasis> 1542e9fcaa8aSmrg-><emphasis> 1543e9fcaa8aSmrgleds</emphasis> 1544e9fcaa8aSmrg-><emphasis> 1545e9fcaa8aSmrgled_class</emphasis> 1546e9fcaa8aSmrg and <emphasis> 1547e9fcaa8aSmrgled_id</emphasis> 1548e9fcaa8aSmrg specify the input extension class and device ID for each indicator device to 1549e9fcaa8aSmrgmodify; if they have invalid values, a <emphasis> 1550e9fcaa8aSmrgBadValue</emphasis> 1551e9fcaa8aSmrg protocol error results and <emphasis> 1552e9fcaa8aSmrgXkbSetDeviceInfo</emphasis> 1553e9fcaa8aSmrg returns <emphasis> 1554e9fcaa8aSmrgFalse</emphasis> 1555e9fcaa8aSmrg. If they have legal values but do not specify a keyboard or indicator class 1556e9fcaa8aSmrgfeedback for the device in question, a <emphasis> 1557e9fcaa8aSmrgBadMatch</emphasis> 1558e9fcaa8aSmrg error results. If any of the values in <emphasis> 1559e9fcaa8aSmrgdevice_info</emphasis> 1560e9fcaa8aSmrg-><emphasis> 1561e9fcaa8aSmrgleds</emphasis> 1562e9fcaa8aSmrg<emphasis> 1563e9fcaa8aSmrg-></emphasis> 1564e9fcaa8aSmrg<emphasis> 1565e9fcaa8aSmrgnames</emphasis> 1566e9fcaa8aSmrg are not a valid Atom or <emphasis> 1567e9fcaa8aSmrgNone</emphasis> 1568e9fcaa8aSmrg, a <emphasis> 1569e9fcaa8aSmrgBadAtom</emphasis> 1570e9fcaa8aSmrg protocol error results. 1571e9fcaa8aSmrg</para> 1572e9fcaa8aSmrg 1573e9fcaa8aSmrg 1574e9fcaa8aSmrg<para> 1575e9fcaa8aSmrgXkb provides convenience functions to modify subsets of the information 1576e9fcaa8aSmrgaccessible via <emphasis> 1577e9fcaa8aSmrgXkbSetDeviceInfo</emphasis> 1578e9fcaa8aSmrg. Only the parts of the structure indicated in the function description are 1579e9fcaa8aSmrgmodified. These convenience functions are described as follows. 1580e9fcaa8aSmrg</para> 1581e9fcaa8aSmrg 1582e9fcaa8aSmrg 1583e9fcaa8aSmrg<para> 1584e9fcaa8aSmrgTo change only the button actions for an input extension device, use 1585e9fcaa8aSmrgXkbSetDeviceButtonActions. 1586e9fcaa8aSmrg</para> 1587e9fcaa8aSmrg 1588e9fcaa8aSmrg 1589e9fcaa8aSmrg<informaltable frame='none'> 1590eb411b4bSmrg<?dbfo keep-together="always" ?> 1591eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1592eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1593e9fcaa8aSmrg<tbody> 1594eb411b4bSmrg <row> 1595e9fcaa8aSmrg <entry role='functiondecl'> 1596e9fcaa8aSmrgBool <emphasis> 1597e9fcaa8aSmrgXkbSetDeviceButtonActions</emphasis> 1598e9fcaa8aSmrg(<emphasis> 1599e9fcaa8aSmrgdpy</emphasis> 1600e9fcaa8aSmrg, device, first_button, num_buttons, actions) 1601e9fcaa8aSmrg </entry> 1602e9fcaa8aSmrg </row> 1603eb411b4bSmrg <row> 1604e9fcaa8aSmrg <entry role='functionargdecl'> 1605e9fcaa8aSmrgDisplay * <emphasis> 1606e9fcaa8aSmrgdpy</emphasis> 1607e9fcaa8aSmrg; /* connection to X server */ 1608e9fcaa8aSmrg </entry> 1609e9fcaa8aSmrg </row> 1610eb411b4bSmrg <row> 1611e9fcaa8aSmrg <entry role='functionargdecl'> 1612e9fcaa8aSmrgXkbDeviceInfoPtr device_info; /* structure defining the 1613e9fcaa8aSmrgdevice and modifications */ 1614e9fcaa8aSmrg </entry> 1615e9fcaa8aSmrg </row> 1616eb411b4bSmrg <row> 1617e9fcaa8aSmrg <entry role='functionargdecl'> 1618e9fcaa8aSmrgunsigned int first_button; /* number of first button to 1619e9fcaa8aSmrgupdate, 0 relative */ 1620e9fcaa8aSmrg </entry> 1621e9fcaa8aSmrg </row> 1622eb411b4bSmrg <row> 1623e9fcaa8aSmrg <entry role='functionargdecl'> 1624e9fcaa8aSmrgunsigned int num_buttons; /* number of buttons to update 1625e9fcaa8aSmrg*/ 1626e9fcaa8aSmrg </entry> 1627e9fcaa8aSmrg</row> 1628e9fcaa8aSmrg</tbody> 1629e9fcaa8aSmrg</tgroup> 1630e9fcaa8aSmrg</informaltable> 1631e9fcaa8aSmrg 1632e9fcaa8aSmrg<para> 1633e9fcaa8aSmrg<emphasis> 1634e9fcaa8aSmrgXkbSetDeviceButtonActions</emphasis> 1635e9fcaa8aSmrg assigns actions to the buttons of the device specified in 1636e9fcaa8aSmrgdevice_info-><emphasis> 1637e9fcaa8aSmrgdevice_spec</emphasis> 1638e9fcaa8aSmrg. Actions are assigned to <emphasis> 1639e9fcaa8aSmrgnum_buttons</emphasis> 1640e9fcaa8aSmrg buttons beginning with <emphasis> 1641e9fcaa8aSmrgfirst_button</emphasis> 1642e9fcaa8aSmrg and are taken from the actions specified in <emphasis> 1643e9fcaa8aSmrgdevice_info</emphasis> 1644e9fcaa8aSmrg-><emphasis> 1645e9fcaa8aSmrgbtn_acts</emphasis> 1646e9fcaa8aSmrg. 1647e9fcaa8aSmrg</para> 1648e9fcaa8aSmrg 1649e9fcaa8aSmrg 1650e9fcaa8aSmrg<para> 1651e9fcaa8aSmrgIf the server does not support assignment of Xkb actions to extension device 1652e9fcaa8aSmrgbuttons, <emphasis> 1653e9fcaa8aSmrgXkbSetDeviceButtonActions</emphasis> 1654e9fcaa8aSmrg has no effect and returns <emphasis> 1655e9fcaa8aSmrgFalse</emphasis> 1656e9fcaa8aSmrg. If the device has no buttons or if <emphasis> 1657e9fcaa8aSmrgfirst_button</emphasis> 1658e9fcaa8aSmrg or <emphasis> 1659e9fcaa8aSmrgnum_buttons</emphasis> 1660e9fcaa8aSmrg specify buttons outside of the valid range as determined by <emphasis> 1661e9fcaa8aSmrgdevice_info</emphasis> 1662e9fcaa8aSmrg-><emphasis> 1663e9fcaa8aSmrgnum_btns</emphasis> 1664e9fcaa8aSmrg, the function has no effect and returns <emphasis> 1665e9fcaa8aSmrgFalse</emphasis> 1666e9fcaa8aSmrg. Otherwise, <emphasis> 1667e9fcaa8aSmrgXkbSetDeviceButtonActions</emphasis> 1668e9fcaa8aSmrg sends a request to the server to change the actions for the specified buttons 1669e9fcaa8aSmrgand returns <emphasis> 1670e9fcaa8aSmrgTrue</emphasis> 1671e9fcaa8aSmrg. 1672e9fcaa8aSmrg</para> 1673e9fcaa8aSmrg 1674e9fcaa8aSmrg 1675e9fcaa8aSmrg<para> 1676e9fcaa8aSmrgIf the actual request sent to the server involved illegal button numbers, a 1677e9fcaa8aSmrg<emphasis> 1678e9fcaa8aSmrgBadValue</emphasis> 1679e9fcaa8aSmrg protocol error is generated. If an invalid device identifier is specified in 1680e9fcaa8aSmrgdevice_info-><emphasis> 1681e9fcaa8aSmrgdevice_spec</emphasis> 1682e9fcaa8aSmrg, a BadKeyboard protocol error results. If the actual device specified in 1683e9fcaa8aSmrg<emphasis> 1684e9fcaa8aSmrgdevice_info</emphasis> 1685e9fcaa8aSmrg-><emphasis> 1686e9fcaa8aSmrgdevice_spec</emphasis> 1687e9fcaa8aSmrg does not contain buttons and a request affecting buttons is made, a <emphasis> 1688e9fcaa8aSmrgBadMatch</emphasis> 1689e9fcaa8aSmrg protocol error is generated. 1690e9fcaa8aSmrg</para> 1691e9fcaa8aSmrg 1692e9fcaa8aSmrg 1693e9fcaa8aSmrg</sect1> 1694eb411b4bSmrg<sect1 id='XkbExtensionDeviceNotify_Event'> 1695e9fcaa8aSmrg<title>XkbExtensionDeviceNotify Event</title> 1696e9fcaa8aSmrg 1697e9fcaa8aSmrg<para> 1698e9fcaa8aSmrgThe Xkb extension generates <emphasis> 1699e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1700e9fcaa8aSmrg events when the status of an input extension device changes or when an attempt 1701e9fcaa8aSmrgis made to use an Xkb feature that is not supported by a particular device. 1702e9fcaa8aSmrg</para> 1703e9fcaa8aSmrg 1704e9fcaa8aSmrg<note><para>Events indicating an attempt to use an unsupported feature are 1705e9fcaa8aSmrgdelivered only to the client requesting the event.</para></note> 1706e9fcaa8aSmrg 1707e9fcaa8aSmrg<para> 1708e9fcaa8aSmrgTo track changes to the status of input extension devices or attempts to use 1709e9fcaa8aSmrgunsupported features of a device, select to receive <emphasis> 1710e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1711e9fcaa8aSmrg events by calling either <emphasis> 1712e9fcaa8aSmrgXkbSelectEvents</emphasis> 1713e9fcaa8aSmrg or <emphasis> 1714e9fcaa8aSmrgXkbSelectEventDetails</emphasis> 1715e9fcaa8aSmrg (see section 4.3). 1716e9fcaa8aSmrg</para> 1717e9fcaa8aSmrg 1718e9fcaa8aSmrg 1719e9fcaa8aSmrg<para> 1720e9fcaa8aSmrgTo receive <emphasis> 1721e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1722e9fcaa8aSmrg events under all possible conditions, call <emphasis> 1723e9fcaa8aSmrgXkbSelectEvents</emphasis> 1724e9fcaa8aSmrg and pass <emphasis> 1725e9fcaa8aSmrgXkbExtensionDeviceNotifyMask</emphasis> 1726e9fcaa8aSmrg in both <emphasis> 1727e9fcaa8aSmrgbits_to_change</emphasis> 1728e9fcaa8aSmrg and <emphasis> 1729e9fcaa8aSmrgvalues_for_bits</emphasis> 1730e9fcaa8aSmrg. 1731e9fcaa8aSmrg</para> 1732e9fcaa8aSmrg 1733e9fcaa8aSmrg 1734e9fcaa8aSmrg<para> 1735e9fcaa8aSmrgThe <emphasis> 1736e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1737e9fcaa8aSmrg event has no event details. However, you can call <emphasis> 1738e9fcaa8aSmrgXkbSelectEventDetails</emphasis> 1739e9fcaa8aSmrg using <emphasis> 1740e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1741e9fcaa8aSmrg as the <emphasis> 1742e9fcaa8aSmrgevent_type</emphasis> 1743e9fcaa8aSmrg and specifying <emphasis> 1744e9fcaa8aSmrgXkbAllExtensionDeviceMask</emphasis> 1745e9fcaa8aSmrg in <emphasis> 1746e9fcaa8aSmrgbits_to_change</emphasis> 1747e9fcaa8aSmrg and <emphasis> 1748e9fcaa8aSmrgvalues_for_bits.</emphasis> 1749e9fcaa8aSmrg This has the same effect as a call to <emphasis> 1750e9fcaa8aSmrgXkbSelectEvents</emphasis> 1751e9fcaa8aSmrg. 1752e9fcaa8aSmrg</para> 1753e9fcaa8aSmrg 1754e9fcaa8aSmrg 1755e9fcaa8aSmrg<para> 1756e9fcaa8aSmrgThe structure for <emphasis> 1757e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1758e9fcaa8aSmrg events is: 1759e9fcaa8aSmrg</para> 1760e9fcaa8aSmrg 1761e9fcaa8aSmrg<para><programlisting> 1762e9fcaa8aSmrgtypedef struct { 1763e9fcaa8aSmrg int type; /* Xkb extension base event code */ 1764e9fcaa8aSmrg unsigned long serial; /* X server serial number for event */ 1765e9fcaa8aSmrg Bool send_event; /* <emphasis>True</emphasis> 1766e9fcaa8aSmrg => synthetically generated*/ 1767e9fcaa8aSmrg Display * display; /* server connection where event generated */ 1768e9fcaa8aSmrg Time time; /* server time when event generated */ 1769e9fcaa8aSmrg int xkb_type; /* <emphasis>XkbExtensionDeviceNotifyEvent</emphasis> */ 1770e9fcaa8aSmrg int device; /* Xkb device ID, will not be 1771e9fcaa8aSmrg <emphasis>XkbUseCoreKbd</emphasis> */ 1772e9fcaa8aSmrg unsigned int reason; /* reason for the event */ 1773e9fcaa8aSmrg unsigned int supported; /* mask of supported features */ 1774e9fcaa8aSmrg unsigned int unsupported; /* unsupported features this client 1775e9fcaa8aSmrg attempted to use */ 1776e9fcaa8aSmrg int first_btn; /* first button that changed */ 1777e9fcaa8aSmrg int num_btns; /* number of buttons that changed */ 1778e9fcaa8aSmrg unsigned int leds_defined; /* indicators with names or maps */ 1779e9fcaa8aSmrg unsigned int led_state; /* current state of the indicators */ 1780e9fcaa8aSmrg int led_class; /* feedback class for LED changes */ 1781e9fcaa8aSmrg int led_id; /* feedback ID for LED changes */ 1782e9fcaa8aSmrg} <emphasis>XkbExtensionDeviceNotifyEvent</emphasis>; 1783e9fcaa8aSmrg</programlisting></para> 1784e9fcaa8aSmrg 1785e9fcaa8aSmrg<para> 1786e9fcaa8aSmrgThe <emphasis> 1787e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1788e9fcaa8aSmrg event has fields enabling it to report changes in the state (on/off) of all of 1789e9fcaa8aSmrgthe buttons for a device, but only for one LED feedback associated with a 1790e9fcaa8aSmrgdevice. You will get multiple events when more than one LED feedback changes 1791e9fcaa8aSmrgstate or configuration. 1792e9fcaa8aSmrg</para> 1793e9fcaa8aSmrg 1794e9fcaa8aSmrg 1795e9fcaa8aSmrg</sect1> 1796eb411b4bSmrg<sect1 id='Tracking_Changes_to_Extension_Devices'> 1797e9fcaa8aSmrg<title>Tracking Changes to Extension Devices</title> 1798e9fcaa8aSmrg 1799e9fcaa8aSmrg<para> 1800e9fcaa8aSmrgChanges to an Xkb extension device may be tracked by listening to <emphasis> 1801e9fcaa8aSmrgXkbDeviceExtensionNotify</emphasis> 1802e9fcaa8aSmrg events and accumulating the changes in an <emphasis> 1803e9fcaa8aSmrgXkbDeviceChangesRec</emphasis> 1804e9fcaa8aSmrg structure. The changes noted in the structure may then be used in subsequent 1805e9fcaa8aSmrgoperations to update either a server configuration or a local copy of an Xkb 1806e9fcaa8aSmrgextension device configuration. The changes structure is defined as follows: 1807e9fcaa8aSmrg</para> 1808e9fcaa8aSmrg 1809e9fcaa8aSmrg<para><programlisting> 1810e9fcaa8aSmrgtypedef struct _XkbDeviceChanges { 1811e9fcaa8aSmrg unsigned int changed; /* bits indicating what has changed */ 1812e9fcaa8aSmrg unsigned short first_btn; /* number of first button which changed, 1813e9fcaa8aSmrg if any */ 1814e9fcaa8aSmrg unsigned short num_btns; /* number of buttons that have changed */ 1815e9fcaa8aSmrg XkbDeviceLedChangesRec leds; 1816e9fcaa8aSmrg} <emphasis>XkbDeviceChangesRec</emphasis>,*XkbDeviceChangesPtr; 1817e9fcaa8aSmrg</programlisting></para> 1818e9fcaa8aSmrg 1819e9fcaa8aSmrg<para><programlisting> 1820e9fcaa8aSmrgtypedef struct _XkbDeviceLedChanges { 1821e9fcaa8aSmrg unsigned short led_class; /* class of this indicator feedback bundle */ 1822e9fcaa8aSmrg unsigned short led_id; /* ID of this indicator feedback bundle */ 1823e9fcaa8aSmrg unsigned int names; /* bits indicating which names have changed */ 1824e9fcaa8aSmrg unsigned int maps; /* bits indicating which maps have changed */ 1825e9fcaa8aSmrg struct _XkbDeviceLedChanges *next; /* link to indicator change record 1826e9fcaa8aSmrg for next set */ 1827e9fcaa8aSmrg} <emphasis>XkbDeviceLedChangesRec</emphasis>,*XkbDeviceLedChangesPtr; 1828e9fcaa8aSmrg</programlisting></para> 1829e9fcaa8aSmrg 1830e9fcaa8aSmrg<para> 1831e9fcaa8aSmrgA local description of the configuration and state of a device may be kept in 1832e9fcaa8aSmrgan <emphasis> 1833e9fcaa8aSmrgXkbDeviceInfoRec</emphasis> 1834e9fcaa8aSmrg structure. The actual state or configuration of the device may change because 1835e9fcaa8aSmrgof XkbSetDeviceInfo and XkbSetButtonActions requests made by clients or by user 1836e9fcaa8aSmrginteraction with the device. The X server sends an XkbExtensionDeviceNotify 1837e9fcaa8aSmrgevent to all interested clients when the state of any buttons or indicators or 1838e9fcaa8aSmrgthe configuration of the buttons or indicators on the core keyboard or any 1839e9fcaa8aSmrginput extension device changes. The event reports the state of indicators for a 1840e9fcaa8aSmrgsingle indicator feedback, and the state of up to 128 buttons. If more than 128 1841e9fcaa8aSmrgbuttons or more than one indicator feedback are changed, the additional buttons 1842e9fcaa8aSmrgand indicator feedbacks are reported in subsequent events. Xkb provides 1843e9fcaa8aSmrgfunctions with which you can track changes to input extension devices by noting 1844e9fcaa8aSmrgthe changes that were made and then requesting the changed information from the 1845e9fcaa8aSmrgserver. 1846e9fcaa8aSmrg</para> 1847e9fcaa8aSmrg 1848e9fcaa8aSmrg 1849e9fcaa8aSmrg<para> 1850e9fcaa8aSmrgTo note device changes reported in an <emphasis> 1851e9fcaa8aSmrgXkbExtensionDeviceNotify</emphasis> 1852e9fcaa8aSmrg event, use XkbNoteDeviceChanges. 1853e9fcaa8aSmrg</para> 1854e9fcaa8aSmrg 1855e9fcaa8aSmrg<informaltable frame='none'> 1856eb411b4bSmrg<?dbfo keep-together="always" ?> 1857eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1858eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1859e9fcaa8aSmrg<tbody> 1860eb411b4bSmrg <row> 1861e9fcaa8aSmrg <entry role='functiondecl'> 1862e9fcaa8aSmrgvoid <emphasis> 1863e9fcaa8aSmrgXkbNoteDeviceChanges</emphasis> 1864e9fcaa8aSmrg (<emphasis> 1865e9fcaa8aSmrgold, new, wanted</emphasis> 1866e9fcaa8aSmrg) 1867e9fcaa8aSmrg </entry> 1868e9fcaa8aSmrg </row> 1869eb411b4bSmrg <row> 1870e9fcaa8aSmrg <entry role='functionargdecl'> 1871e9fcaa8aSmrgXkbDeviceChangesPtr <emphasis> 1872e9fcaa8aSmrgold</emphasis> 1873e9fcaa8aSmrg; /* structure tracking state changes */ 1874e9fcaa8aSmrg </entry> 1875e9fcaa8aSmrg </row> 1876eb411b4bSmrg <row> 1877e9fcaa8aSmrg <entry role='functionargdecl'> 1878e9fcaa8aSmrgXkbExtensionDeviceNotifyEvent * <emphasis> 1879e9fcaa8aSmrgnew</emphasis> 1880e9fcaa8aSmrg; /* event indicating state changes */ 1881e9fcaa8aSmrg </entry> 1882e9fcaa8aSmrg </row> 1883eb411b4bSmrg <row> 1884e9fcaa8aSmrg <entry role='functionargdecl'> 1885e9fcaa8aSmrgunsigned int <emphasis> 1886e9fcaa8aSmrgwanted</emphasis> 1887e9fcaa8aSmrg; /* mask indicating changes to note */ 1888e9fcaa8aSmrg </entry> 1889e9fcaa8aSmrg</row> 1890e9fcaa8aSmrg</tbody> 1891e9fcaa8aSmrg</tgroup> 1892e9fcaa8aSmrg</informaltable> 1893e9fcaa8aSmrg 1894e9fcaa8aSmrg<para> 1895e9fcaa8aSmrgThe wanted field specifies the changes that should be noted in <emphasis> 1896e9fcaa8aSmrgold</emphasis> 1897e9fcaa8aSmrg, and is composed of the bitwise inclusive OR of one or more of the masks from 1898e9fcaa8aSmrgTable 21.1<emphasis> 1899e9fcaa8aSmrg.</emphasis> 1900e9fcaa8aSmrg The <emphasis> 1901e9fcaa8aSmrgreason</emphasis> 1902e9fcaa8aSmrg field of the event in <emphasis> 1903e9fcaa8aSmrgnew</emphasis> 1904e9fcaa8aSmrg indicates the types of changes the event is reporting. <emphasis> 1905e9fcaa8aSmrgXkbNoteDeviceChanges</emphasis> 1906e9fcaa8aSmrg updates the <emphasis> 1907e9fcaa8aSmrgXkbDeviceChangesRec</emphasis> 1908e9fcaa8aSmrg specified by <emphasis> 1909e9fcaa8aSmrgold</emphasis> 1910e9fcaa8aSmrg with the changes that are both specified in <emphasis> 1911e9fcaa8aSmrgwanted</emphasis> 1912e9fcaa8aSmrg and contained in <emphasis> 1913e9fcaa8aSmrgnew</emphasis> 1914e9fcaa8aSmrg-><emphasis> 1915e9fcaa8aSmrgreason</emphasis> 1916e9fcaa8aSmrg. 1917e9fcaa8aSmrg</para> 1918e9fcaa8aSmrg 1919e9fcaa8aSmrg 1920e9fcaa8aSmrg<para> 1921e9fcaa8aSmrgTo update a local copy of the state and configuration of an X input extension 1922e9fcaa8aSmrgdevice with the changes previously noted in an <emphasis> 1923e9fcaa8aSmrgXkbDeviceChangesRec</emphasis> 1924e9fcaa8aSmrg structure, use XkbGetDeviceInfoChanges. 1925e9fcaa8aSmrg</para> 1926e9fcaa8aSmrg 1927e9fcaa8aSmrg 1928e9fcaa8aSmrg<para> 1929e9fcaa8aSmrgTo query the changes that have occurred in the button actions or indicator 1930e9fcaa8aSmrgnames and indicator maps associated with an input extension device, use 1931e9fcaa8aSmrgXkbGetDeviceInfoChanges. 1932e9fcaa8aSmrg</para> 1933e9fcaa8aSmrg 1934e9fcaa8aSmrg 1935e9fcaa8aSmrg<informaltable frame='none'> 1936eb411b4bSmrg<?dbfo keep-together="always" ?> 1937eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1938eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1939e9fcaa8aSmrg<tbody> 1940eb411b4bSmrg <row> 1941e9fcaa8aSmrg <entry role='functiondecl'> 1942e9fcaa8aSmrgStatus <emphasis> 1943e9fcaa8aSmrgXkbGetDeviceInfoChanges</emphasis> 1944e9fcaa8aSmrg(<emphasis> 1945e9fcaa8aSmrgdpy</emphasis> 1946e9fcaa8aSmrg, <emphasis> 1947e9fcaa8aSmrgdevice_info</emphasis> 1948e9fcaa8aSmrg, changes) 1949e9fcaa8aSmrg </entry> 1950e9fcaa8aSmrg </row> 1951eb411b4bSmrg <row> 1952e9fcaa8aSmrg <entry role='functionargdecl'> 1953e9fcaa8aSmrgDisplay * <emphasis> 1954e9fcaa8aSmrgdpy</emphasis> 1955e9fcaa8aSmrg; /* connection to X server */ 1956e9fcaa8aSmrg </entry> 1957e9fcaa8aSmrg </row> 1958eb411b4bSmrg <row> 1959e9fcaa8aSmrg <entry role='functionargdecl'> 1960e9fcaa8aSmrgXkbDeviceInfoPtr device_info; /* structure to update with 1961e9fcaa8aSmrgresults */ 1962e9fcaa8aSmrg </entry> 1963e9fcaa8aSmrg </row> 1964eb411b4bSmrg <row> 1965e9fcaa8aSmrg <entry role='functionargdecl'> 1966e9fcaa8aSmrgXkbDeviceChangesPtr <emphasis> 1967e9fcaa8aSmrgchanges</emphasis> 1968e9fcaa8aSmrg; /* contains notes of changes that have occurred */ 1969e9fcaa8aSmrg </entry> 1970e9fcaa8aSmrg</row> 1971e9fcaa8aSmrg</tbody> 1972e9fcaa8aSmrg</tgroup> 1973e9fcaa8aSmrg</informaltable> 1974e9fcaa8aSmrg 1975e9fcaa8aSmrg<para> 1976e9fcaa8aSmrgThe changes->changed field indicates which attributes of the device 1977e9fcaa8aSmrgspecified in <emphasis> 1978e9fcaa8aSmrgchanges</emphasis> 1979e9fcaa8aSmrg-><emphasis> 1980e9fcaa8aSmrgdevice</emphasis> 1981e9fcaa8aSmrg have changed. The parameters describing the changes are contained in the other 1982e9fcaa8aSmrgfields of <emphasis> 1983e9fcaa8aSmrgchanges</emphasis> 1984e9fcaa8aSmrg. <emphasis> 1985e9fcaa8aSmrgXkbGetDeviceInfoChanges</emphasis> 1986e9fcaa8aSmrg uses that information to call XkbGetDeviceInfo to obtain the current status of 1987e9fcaa8aSmrgthose attributes that have changed. It then updates the local description of 1988e9fcaa8aSmrgthe device in <emphasis> 1989e9fcaa8aSmrgdevice_info</emphasis> 1990e9fcaa8aSmrg with the new information. 1991e9fcaa8aSmrg</para> 1992e9fcaa8aSmrg 1993e9fcaa8aSmrg 1994e9fcaa8aSmrg<para> 1995e9fcaa8aSmrgTo update the server’s description of a device with the changes noted in an 1996e9fcaa8aSmrgXkbDeviceChangesRec, use XkbChangeDeviceInfo. 1997e9fcaa8aSmrg</para> 1998e9fcaa8aSmrg 1999e9fcaa8aSmrg 2000e9fcaa8aSmrg<informaltable frame='none'> 2001eb411b4bSmrg<?dbfo keep-together="always" ?> 2002eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 2003eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 2004e9fcaa8aSmrg<tbody> 2005eb411b4bSmrg <row> 2006e9fcaa8aSmrg <entry role='functiondecl'> 2007e9fcaa8aSmrgBool <emphasis> 2008e9fcaa8aSmrgXkbChangeDeviceInfo</emphasis> 2009e9fcaa8aSmrg (<emphasis> 2010e9fcaa8aSmrgdpy, device_info, changes</emphasis> 2011e9fcaa8aSmrg) 2012e9fcaa8aSmrg </entry> 2013e9fcaa8aSmrg </row> 2014eb411b4bSmrg <row> 2015e9fcaa8aSmrg <entry role='functionargdecl'> 2016e9fcaa8aSmrgDisplay * <emphasis> 2017e9fcaa8aSmrgdpy</emphasis> 2018e9fcaa8aSmrg; /* connection to X server */ 2019e9fcaa8aSmrg </entry> 2020e9fcaa8aSmrg </row> 2021eb411b4bSmrg <row> 2022e9fcaa8aSmrg <entry role='functionargdecl'> 2023e9fcaa8aSmrgXkbDeviceInfoPtr <emphasis> 2024e9fcaa8aSmrgdevice_info</emphasis> 2025e9fcaa8aSmrg; /* local copy of device state and configuration */ 2026e9fcaa8aSmrg </entry> 2027e9fcaa8aSmrg </row> 2028eb411b4bSmrg <row> 2029e9fcaa8aSmrg <entry role='functionargdecl'> 2030e9fcaa8aSmrgXkbDeviceChangesPtr <emphasis> 2031e9fcaa8aSmrgchanges</emphasis> 2032e9fcaa8aSmrg; /* note specifying changes in <emphasis> 2033e9fcaa8aSmrgdevice_info</emphasis> 2034e9fcaa8aSmrg */ 2035e9fcaa8aSmrg </entry> 2036e9fcaa8aSmrg</row> 2037e9fcaa8aSmrg</tbody> 2038e9fcaa8aSmrg</tgroup> 2039e9fcaa8aSmrg</informaltable> 2040e9fcaa8aSmrg 2041e9fcaa8aSmrg<para> 2042e9fcaa8aSmrg<emphasis> 2043e9fcaa8aSmrgXkbChangeDeviceInfo</emphasis> 2044e9fcaa8aSmrg updates the server’s description of the device specified in <emphasis> 2045e9fcaa8aSmrgdevice_info</emphasis> 2046e9fcaa8aSmrg-><emphasis> 2047e9fcaa8aSmrgdevice_spec</emphasis> 2048e9fcaa8aSmrg with the changes specified in <emphasis> 2049e9fcaa8aSmrgchanges</emphasis> 2050e9fcaa8aSmrg and contained in <emphasis> 2051e9fcaa8aSmrgdevice_info</emphasis> 2052e9fcaa8aSmrg. The update is made by an XkbSetDeviceInfo request. 2053e9fcaa8aSmrg</para> 2054e9fcaa8aSmrg 2055e9fcaa8aSmrg</sect1> 2056e9fcaa8aSmrg</chapter> 2057