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> &rArr; 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 &rArr; 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 &lt;&lt; 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 &lt;&lt;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-&gt;names</entry>
272e9fcaa8aSmrg    <entry>(1L &lt;&lt;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-&gt;maps</entry>
282e9fcaa8aSmrg    <entry>(1L &lt;&lt;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-&gt;state</entry>
292e9fcaa8aSmrg    <entry>(1L &lt;&lt;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-&gt;*</para>
305e9fcaa8aSmrg    </entry>
306e9fcaa8aSmrg    <entry>(0x1c)</entry>
307e9fcaa8aSmrg    <entry>
3080f8248bfSmrg<para><symbol>XkbXI_IndicatorNames&#xAD;Mask</symbol> |</para>
3090f8248bfSmrg<para><symbol>XkbXI_IndicatorMaps&#xAD;Mask</symbol> |</para>
3100f8248bfSmrg<para><symbol>XkbXI_IndicatorState&#xAD;Mask</symbol></para>
311e9fcaa8aSmrg    </entry>
312e9fcaa8aSmrg  </row>
313eb411b4bSmrg  <row>
3140f8248bfSmrg    <entry><symbol>XkbXI_UnsupportedFeaturesMask</symbol></entry>
315e9fcaa8aSmrg    <entry>unsupported</entry>
316e9fcaa8aSmrg    <entry>(1L &lt;&lt;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&#xAD;Mask</symbol> | </para>
3250f8248bfSmrg<para><symbol>XkbXI_ButtonActions&#xAD;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&#xAD;FeaturesMask</symbol> | </para>
3340f8248bfSmrg<para><symbol>XkbXI_Keyboards&#xAD;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&#xAD;Mask</symbol> | </para>
3430f8248bfSmrg<para><symbol>XkbXI_Unsupported&#xAD;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> &rArr; 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>-&gt;<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>-&gt;<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-&gt;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>-&gt;<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>-&gt;<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-&gt;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>-&gt;<structfield>leds</structfield>
11510f8248bfSmrgand extends it if there is not enough room. It then increments
11520f8248bfSmrg<parameter>device_info</parameter>-&gt;<structfield>num_leds</structfield>
11530f8248bfSmrgand fills in the next available entry in
11540f8248bfSmrg<parameter>device_info</parameter>-&gt;<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>-&gt;<structfield>num_btns</structfield>
12330f8248bfSmrgis set to zero, and
12340f8248bfSmrg<parameter>device_info</parameter>-&gt;<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> &rArr; 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>-&gt;<structfield>btn_acts</structfield>
13180f8248bfSmrgis set to
13190f8248bfSmrg<symbol>NULL</symbol>,
13200f8248bfSmrgand
13210f8248bfSmrg<parameter>device_info</parameter>-&gt;<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>-&gt;<structfield>leds</structfield>
13290f8248bfSmrgis set to
13300f8248bfSmrg<symbol>NULL</symbol>,
13310f8248bfSmrgand
13320f8248bfSmrg<parameter>device_info</parameter>-&gt;<structfield>sz_leds</structfield>
13330f8248bfSmrgand
13340f8248bfSmrg<parameter>device_info</parameter>-&gt;<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>-&gt;<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>-&gt;<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>-&gt;<structfield>num_leds</structfield>
15500f8248bfSmrgindicator devices specified in
15510f8248bfSmrg<parameter>device_info</parameter>-&gt;<structfield>leds</structfield>
15520f8248bfSmrgare set to the maps and / or names specified in
15530f8248bfSmrg<parameter>device_info</parameter>-&gt;<structfield>leds</structfield>.
15540f8248bfSmrg<parameter>device_info</parameter>-&gt;<structfield>leds</structfield>-&gt;<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>-&gt;<structfield>leds-&gt;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-&gt;<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>-&gt;<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>-&gt;<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-&gt;<structfield>device_spec</structfield>,
16890f8248bfSmrga <errorname>BadKeyboard</errorname>
16900f8248bfSmrgprotocol error results. If the actual device specified in
16910f8248bfSmrg<parameter>device_info</parameter>-&gt;<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> &rArr; 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>-&gt;<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-&gt;changed field indicates which attributes of the device
19920f8248bfSmrgspecified in
19930f8248bfSmrg<parameter>changes</parameter>-&gt;<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>-&gt;<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