137eb1ca1Smrg<chapter><title>Input Extension</title>
2f1ee322dSmrg<sect1 id='Overview'>
337eb1ca1Smrg<title>Overview</title>
437eb1ca1Smrg<!-- .XS -->
537eb1ca1Smrg<!-- (SN Input Extension Overview -->
637eb1ca1Smrg<!-- .XE -->
737eb1ca1Smrg<para>
837eb1ca1Smrg<!-- .LP -->
937eb1ca1SmrgThis document describes an extension to
1037eb1ca1Smrgthe X11 server.  The purpose of this extension is to support the use
1137eb1ca1Smrgof additional input devices beyond the pointer and keyboard devices
1237eb1ca1Smrgdefined by the core X protocol.  This first section gives an overview
1337eb1ca1Smrgof the input extension.  The following sections correspond to 
1437eb1ca1Smrgchapters 9, 10, and 11, ``Window and Session Manager Functions'',
1537eb1ca1Smrg``Events'', and ``Event Handling Functions'' of the
1637eb1ca1Smrg``Xlib - C Language Interface'' manual
1737eb1ca1Smrgand describe how to use the input device extension.
1837eb1ca1Smrg</para>
1937eb1ca1Smrg<sect2 id="Design_Approach">
2037eb1ca1Smrg<title>Design Approach</title>
2137eb1ca1Smrg<!-- .XS -->
2237eb1ca1Smrg<!-- (SN Design Approach -->
2337eb1ca1Smrg<!-- .XE -->
2437eb1ca1Smrg<para>
2537eb1ca1Smrg<!-- .LP -->
2637eb1ca1SmrgThe design approach of the extension is to define functions
2737eb1ca1Smrgand events analogous to the core functions and events.
2837eb1ca1SmrgThis allows extension input devices and events to be individually
2937eb1ca1Smrgdistinguishable from each other and from the core input devices and events.
3037eb1ca1SmrgThese functions and events make use of a device identifier and support the
3137eb1ca1Smrgreporting of <emphasis remap='I'>n</emphasis>-dimensional motion data as well as other data that
3237eb1ca1Smrgis not currently reportable via the core input events.
3337eb1ca1Smrg</para>
3437eb1ca1Smrg</sect2>
3537eb1ca1Smrg<sect2 id="Core_Input_Devices">
3637eb1ca1Smrg<title>Core Input Devices</title>
3737eb1ca1Smrg<!-- .XS -->
3837eb1ca1Smrg<!-- (SN Core Input Devices -->
3937eb1ca1Smrg<!-- .XE -->
4037eb1ca1Smrg<para>
4137eb1ca1Smrg<!-- .LP -->
4237eb1ca1SmrgThe X server core protocol supports two input devices:  a pointer and a
4337eb1ca1Smrgkeyboard.  The pointer device has two major functions. 
4437eb1ca1SmrgFirst, it may be used to generate motion information
4537eb1ca1Smrgthat client programs can detect. Second, it may also be used to indicate the
4637eb1ca1Smrgcurrent location and focus of the X keyboard.  To accomplish this, the server 
4737eb1ca1Smrgechoes a cursor at the current position of the X pointer.  Unless the X
4837eb1ca1Smrgkeyboard has been explicitly focused, this cursor also shows the current
4937eb1ca1Smrglocation and focus of the X keyboard.
5037eb1ca1Smrg</para>
5137eb1ca1Smrg<para>
5237eb1ca1Smrg<!-- .LP -->
5337eb1ca1SmrgThe X keyboard is used to generate input that client programs can detect.
5437eb1ca1Smrg</para>
5537eb1ca1Smrg<para>
5637eb1ca1Smrg<!-- .LP -->
5737eb1ca1SmrgThe X keyboard and X pointer are referred to in this document as 
5837eb1ca1Smrgthe <emphasis remap='I'>core devices</emphasis>, and the input
5937eb1ca1Smrgevents they generate 
6037eb1ca1Smrg<function>( KeyPress ,</function>
6137eb1ca1Smrg<function>KeyRelease ,</function>
6237eb1ca1Smrg<function>ButtonPress ,</function>
6337eb1ca1Smrg<function>ButtonRelease ,</function>
6437eb1ca1Smrgand
6537eb1ca1Smrg<function>MotionNotify )</function>
6637eb1ca1Smrgare known as the <emphasis remap='I'>core input events</emphasis>.  All other
6737eb1ca1Smrginput devices are referred to as <emphasis remap='I'>extension input devices</emphasis>, and the 
6837eb1ca1Smrginput events they generate are referred to as <emphasis remap='I'>extension input events</emphasis>.
6937eb1ca1Smrg<!-- .NT -->
7037eb1ca1SmrgThis input extension does not change the behavior or functionality of the
7137eb1ca1Smrgcore input devices, core events, or core protocol requests, with the
7237eb1ca1Smrgexception of the core grab requests.  These requests may affect the
7337eb1ca1Smrgsynchronization of events from extension devices.  See the explanation
7437eb1ca1Smrgin the section titled ``Event Synchronization and Core Grabs.''
7537eb1ca1Smrg<!-- .NE -->
7637eb1ca1Smrg</para>
7737eb1ca1Smrg<para>
7837eb1ca1Smrg<!-- .LP -->
7937eb1ca1SmrgSelection of the physical devices to be initially used by the server as the 
8037eb1ca1Smrgcore devices is left implementation dependent.  Functions are defined that
8137eb1ca1Smrgallow client programs to change which physical devices are used as the
8237eb1ca1Smrgcore devices.
8337eb1ca1Smrg</para>
8437eb1ca1Smrg</sect2>
8537eb1ca1Smrg<sect2 id="Extension_Input_Devices">
8637eb1ca1Smrg<title>Extension Input Devices</title>
8737eb1ca1Smrg<!-- .XS -->
8837eb1ca1Smrg<!-- (SN Extension Input Devices -->
8937eb1ca1Smrg<!-- .XE -->
9037eb1ca1Smrg<para>
9137eb1ca1Smrg<!-- .LP -->
9237eb1ca1SmrgThe input extension controls access to input devices other than the X keyboard
9337eb1ca1Smrgand X pointer.  It allows client programs to select input from these devices 
9437eb1ca1Smrgindependently
9537eb1ca1Smrgfrom each other and independently from the core devices.  Input events from
9637eb1ca1Smrgthese devices are of extension types 
9737eb1ca1Smrg<function>( DeviceKeyPress ,</function>
9837eb1ca1Smrg<function>DeviceKeyRelease ,</function>
9937eb1ca1Smrg<function>DeviceButtonPress ,</function>
10037eb1ca1Smrg<function>DeviceButtonRelease ,</function>
10137eb1ca1Smrg<function>DeviceMotionNotify ,</function>
10237eb1ca1Smrgand so on) and contain
10337eb1ca1Smrga device identifier so that events of the same type coming from different
10437eb1ca1Smrginput devices can be distinguished.
10537eb1ca1Smrg</para>
10637eb1ca1Smrg<para>
10737eb1ca1Smrg<!-- .LP -->
10837eb1ca1SmrgExtension input events are not limited in size by the size of the server
10937eb1ca1Smrg32-byte wire events.  Extension input events
11037eb1ca1Smrgmay be constructed by the server sending as many
11137eb1ca1Smrgwire-sized events as necessary to return the information required for
11237eb1ca1Smrgthat event.
11337eb1ca1SmrgThe library event reformatting routines
11437eb1ca1Smrgare responsible for combining these into one or more client XEvents.
11537eb1ca1Smrg</para>
11637eb1ca1Smrg<para>
11737eb1ca1Smrg<!-- .LP -->
11837eb1ca1SmrgAny input device that generates key, button, or motion data may be used as
11937eb1ca1Smrgan extension input device.
12037eb1ca1SmrgExtension input devices may have zero or more keys, zero or more buttons,
12137eb1ca1Smrgand may report zero or more axes of motion.  Motion may be reported 
12237eb1ca1Smrgas relative movements from a previous position or as an absolute
12337eb1ca1Smrgposition.  All valuators reporting motion information for a given
12437eb1ca1Smrgextension input device must report the same kind of motion information
12537eb1ca1Smrg(absolute or relative).
12637eb1ca1Smrg</para>
12737eb1ca1Smrg<para>
12837eb1ca1Smrg<!-- .LP -->
12937eb1ca1SmrgThis extension is designed to accommodate new types of input devices that
13037eb1ca1Smrgmay be added in the future.  The protocol requests that refer to
13137eb1ca1Smrgspecific characteristics of input devices organize that information
13237eb1ca1Smrgby <emphasis remap='I'>input device classes</emphasis>.  Server implementors may add new
13337eb1ca1Smrgclasses of input devices without changing the protocol requests.
13437eb1ca1Smrg</para>
13537eb1ca1Smrg<para>
13637eb1ca1Smrg<!-- .LP -->
13737eb1ca1SmrgAll extension input
13837eb1ca1Smrgdevices are treated like the core X keyboard in determining their location
13937eb1ca1Smrgand focus.  The server does not track the location of these devices on an
14037eb1ca1Smrgindividual basis and, therefore,
14137eb1ca1Smrgdoes not echo a cursor to indicate their current location.
14237eb1ca1SmrgInstead, their location is determined by the location of the core X pointer.
14337eb1ca1SmrgLike the core X keyboard, some may be explicitly focused. If they are
14437eb1ca1Smrgnot explicitly focused,  their focus
14537eb1ca1Smrgis determined by the location of the core X pointer.
14637eb1ca1Smrg</para>
14737eb1ca1Smrg<sect3 id="Input_Device_Classes">
14837eb1ca1Smrg<title>Input Device Classes</title>
14937eb1ca1Smrg<!-- .XS -->
15037eb1ca1Smrg<!-- (SN Input Device Classes -->
15137eb1ca1Smrg<!-- .XE -->
15237eb1ca1Smrg<para>
15337eb1ca1Smrg<!-- .LP -->
15437eb1ca1SmrgSome of the input extension requests divide input devices into classes
15537eb1ca1Smrgbased on their functionality.  This is intended to allow new classes of input
15637eb1ca1Smrgdevices to be defined at a later time without changing the semantics of 
15737eb1ca1Smrgthese functions.  The following input device classes are currently
15837eb1ca1Smrgdefined:
15937eb1ca1Smrg<variablelist>
16037eb1ca1Smrg  <varlistentry>
16137eb1ca1Smrg    <term>KEY</term>
16237eb1ca1Smrg    <listitem>
16337eb1ca1Smrg      <para>
16437eb1ca1SmrgThe device reports key events.
16537eb1ca1Smrg      </para>
16637eb1ca1Smrg    </listitem>
16737eb1ca1Smrg  </varlistentry>
16837eb1ca1Smrg  <varlistentry>
16937eb1ca1Smrg    <term>BUTTON</term>
17037eb1ca1Smrg    <listitem>
17137eb1ca1Smrg      <para>
17237eb1ca1SmrgThe device reports button events.
17337eb1ca1Smrg      </para>
17437eb1ca1Smrg    </listitem>
17537eb1ca1Smrg  </varlistentry>
17637eb1ca1Smrg  <varlistentry>
17737eb1ca1Smrg    <term>VALUATOR</term>
17837eb1ca1Smrg    <listitem>
17937eb1ca1Smrg      <para>
18037eb1ca1SmrgThe device reports valuator data in motion events.
18137eb1ca1Smrg      </para>
18237eb1ca1Smrg    </listitem>
18337eb1ca1Smrg  </varlistentry>
18437eb1ca1Smrg  <varlistentry>
18537eb1ca1Smrg    <term>PROXIMITY</term>
18637eb1ca1Smrg    <listitem>
18737eb1ca1Smrg      <para>
18837eb1ca1SmrgThe device reports proximity events.
18937eb1ca1Smrg      </para>
19037eb1ca1Smrg    </listitem>
19137eb1ca1Smrg  </varlistentry>
19237eb1ca1Smrg  <varlistentry>
19337eb1ca1Smrg    <term>FOCUS</term>
19437eb1ca1Smrg    <listitem>
19537eb1ca1Smrg      <para>
19637eb1ca1SmrgThe device can be focused.
19737eb1ca1Smrg      </para>
19837eb1ca1Smrg    </listitem>
19937eb1ca1Smrg  </varlistentry>
20037eb1ca1Smrg  <varlistentry>
20137eb1ca1Smrg    <term>FEEDBACK</term>
20237eb1ca1Smrg    <listitem>
20337eb1ca1Smrg      <para>
20437eb1ca1SmrgThe device supports feedbacks.
20537eb1ca1Smrg    </para>
20637eb1ca1Smrg  </listitem>
20737eb1ca1Smrg  </varlistentry>
20837eb1ca1Smrg</variablelist>
20937eb1ca1Smrg</para>
21037eb1ca1Smrg<para>
21137eb1ca1Smrg<!-- .LP -->
21237eb1ca1SmrgAdditional classes may be added in the future.
21337eb1ca1SmrgFunctions that support multiple input classes, such as the 
214f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
21537eb1ca1Smrgfunction that lists all available input devices,
21637eb1ca1Smrgorganize the data they return by input class.  Client programs that
21737eb1ca1Smrguse these functions should not access data unless it matches a 
21837eb1ca1Smrgclass defined at the time those clients were compiled.  In this way,
21937eb1ca1Smrgnew classes can be added without forcing existing clients that use
22037eb1ca1Smrgthese functions to be recompiled.
22137eb1ca1Smrg</para>
22237eb1ca1Smrg</sect3>
22337eb1ca1Smrg</sect2>
22437eb1ca1Smrg<sect2 id="Using_Extension_Input_Devices">
22537eb1ca1Smrg<title>Using Extension Input Devices</title>
22637eb1ca1Smrg<!-- .XS -->
22737eb1ca1Smrg<!-- (SN Using Extension Input Devices -->
22837eb1ca1Smrg<!-- .XE -->
22937eb1ca1Smrg<para>
23037eb1ca1Smrg<!-- .LP -->
23137eb1ca1SmrgA client that wishes to access an input device does so through the library
23237eb1ca1Smrgfunctions defined in the following sections.  A typical sequence of requests
23337eb1ca1Smrgthat a client would make is as follows:
23437eb1ca1Smrg</para>
23537eb1ca1Smrg<itemizedlist>
23637eb1ca1Smrg  <listitem>
23737eb1ca1Smrg    <para>
238f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
23937eb1ca1Smrg- lists all of the available input devices.  From the 
24037eb1ca1Smrginformation returned by this request, determine whether the desired input
24137eb1ca1Smrgdevice is attached to the server.  For a description of the 
242f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
24337eb1ca1Smrgrequest, see the section entitled ``Listing Available Devices.''
24437eb1ca1Smrg    </para>
24537eb1ca1Smrg  </listitem>
24637eb1ca1Smrg  <listitem>
24737eb1ca1Smrg    <para>
248f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
24937eb1ca1Smrg- requests that the server open the device for access by this client.
25037eb1ca1SmrgThis request returns an 
25137eb1ca1Smrg<function>XDevice</function>
25237eb1ca1Smrgstructure that is used
25337eb1ca1Smrgby most other input extension requests to identify the specified device.
25437eb1ca1SmrgFor a description of the 
255f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
25637eb1ca1Smrgrequest, see the section entitled ``Enabling and Disabling Extension Devices.''
25737eb1ca1Smrg    </para>
25837eb1ca1Smrg  </listitem>
25937eb1ca1Smrg  <listitem>
26037eb1ca1Smrg    <para>
26137eb1ca1SmrgDetermine the event types and event classes needed to select the desired
26237eb1ca1Smrginput extension events, and identify them when they are received.
26337eb1ca1SmrgThis is done via macros whose name corresponds to the desired event, for
26437eb1ca1Smrgexample,
26537eb1ca1Smrg<function>DeviceKeyPress .</function>
26637eb1ca1SmrgFor a description of these macros,
26737eb1ca1Smrgsee the section entitled ``Selecting Extension Device Events.''
26837eb1ca1Smrg    </para>
26937eb1ca1Smrg  </listitem>
27037eb1ca1Smrg  <listitem>
27137eb1ca1Smrg    <para>
272f1ee322dSmrg<xref linkend='XSelectExtensionEvent' xrefstyle='select: title'/>
27337eb1ca1Smrg- selects the desired events from the server.
27437eb1ca1SmrgFor a description of the 
27537eb1ca1Smrg<function>XSelextExtensionEvent</function>
27637eb1ca1Smrgrequest, see the section entitled ``Selecting Extension Device Events.''
27737eb1ca1Smrg    </para>
27837eb1ca1Smrg  </listitem>
27937eb1ca1Smrg  <listitem>
28037eb1ca1Smrg    <para>
281f1ee322dSmrg<olink targetdoc='libX11' targetptr='XNextEvent'><function>XNextEvent</function></olink>
28237eb1ca1Smrg- receives the next available event.  This is the core
283f1ee322dSmrg<olink targetdoc='libX11' targetptr='XNextEvent'><function>XNextEvent</function></olink>
2844e8f48c7Smrgfunction provided by the standard X library.
28537eb1ca1Smrg    </para>
28637eb1ca1Smrg  </listitem>
28737eb1ca1Smrg</itemizedlist>
28837eb1ca1Smrg<para>
28937eb1ca1Smrg<!-- .LP -->
29037eb1ca1SmrgOther requests are defined to grab and focus extension devices, to
29137eb1ca1Smrgchange their key, button, or modifier mappings, to control the
29237eb1ca1Smrgpropagation of input extension events, to get motion history from an
29337eb1ca1Smrgextension device, and to send input extension events to another client.
29437eb1ca1SmrgThese functions are described in the following sections.
29537eb1ca1Smrg</para>
29637eb1ca1Smrg</sect2>
29737eb1ca1Smrg</sect1>
29837eb1ca1Smrg<sect1 id="Library_Extension_Requests">
29937eb1ca1Smrg<title>Library Extension Requests</title>
30037eb1ca1Smrg<!-- .XS -->
30137eb1ca1Smrg<!-- (SN Library Extension Requests -->
30237eb1ca1Smrg<!-- .XE -->
30337eb1ca1Smrg<para>
30437eb1ca1Smrg<!-- .LP -->
30537eb1ca1SmrgExtension input devices are accessed by client programs through the 
30637eb1ca1Smrguse of new protocol requests.
30737eb1ca1SmrgThe following requests are provided as extensions to Xlib.  Constants
30837eb1ca1Smrgand structures referenced by these functions may be found in the 
30937eb1ca1Smrgfiles <function>&lt;X11/extensions/XI.h&gt;</function> and <function>&lt;X11/extensions/XInput.h&gt;</function>,
31037eb1ca1Smrgwhich are attached to this document as 
31137eb1ca1SmrgAppendix A.<!-- xref -->
31237eb1ca1Smrg</para>
31337eb1ca1Smrg<para>
31437eb1ca1Smrg<!-- .LP -->
31537eb1ca1SmrgThe library will return <function>NoSuchExtension</function> if an extension request
31637eb1ca1Smrgis made to a server that does not support the input extension.
31737eb1ca1Smrg</para>
31837eb1ca1Smrg<para>
31937eb1ca1Smrg<!-- .LP -->
32037eb1ca1SmrgInput extension requests cannot be used to access the X keyboard and
32137eb1ca1SmrgX pointer devices.
32237eb1ca1Smrg</para>
32337eb1ca1Smrg<sect2 id="Window_Manager_Functions">
32437eb1ca1Smrg<title>Window Manager Functions</title>
32537eb1ca1Smrg<!-- .XS -->
32637eb1ca1Smrg<!-- (SN Window Manager Functions -->
32737eb1ca1Smrg<!-- .XE -->
32837eb1ca1Smrg<para>
32937eb1ca1Smrg<!-- .LP -->
33037eb1ca1SmrgThis section discusses the following X Input Extension Window Manager topics:
33137eb1ca1Smrg</para>
33237eb1ca1Smrg<itemizedlist>
33337eb1ca1Smrg  <listitem>
33437eb1ca1Smrg    <para>
33537eb1ca1SmrgChanging the core devices
33637eb1ca1Smrg    </para>
33737eb1ca1Smrg  </listitem>
33837eb1ca1Smrg  <listitem>
33937eb1ca1Smrg    <para>
34037eb1ca1SmrgEvent synchronization and core grabs
34137eb1ca1Smrg    </para>
34237eb1ca1Smrg  </listitem>
34337eb1ca1Smrg  <listitem>
34437eb1ca1Smrg    <para>
34537eb1ca1SmrgExtension active grabs
34637eb1ca1Smrg    </para>
34737eb1ca1Smrg  </listitem>
34837eb1ca1Smrg  <listitem>
34937eb1ca1Smrg    <para>
35037eb1ca1SmrgPassively grabbing a key
35137eb1ca1Smrg    </para>
35237eb1ca1Smrg  </listitem>
35337eb1ca1Smrg  <listitem>
35437eb1ca1Smrg    <para>
35537eb1ca1SmrgPassively grabbing a button
35637eb1ca1Smrg    </para>
35737eb1ca1Smrg  </listitem>
35837eb1ca1Smrg  <listitem>
35937eb1ca1Smrg    <para>
36037eb1ca1SmrgThawing a device
36137eb1ca1Smrg    </para>
36237eb1ca1Smrg  </listitem>
36337eb1ca1Smrg  <listitem>
36437eb1ca1Smrg    <para>
36537eb1ca1SmrgControlling device focus
36637eb1ca1Smrg    </para>
36737eb1ca1Smrg  </listitem>
36837eb1ca1Smrg  <listitem>
36937eb1ca1Smrg    <para>
37037eb1ca1SmrgControlling device feedback
37137eb1ca1Smrg    </para>
37237eb1ca1Smrg  </listitem>
37337eb1ca1Smrg  <listitem>
37437eb1ca1Smrg    <para>
37537eb1ca1SmrgRinging a bell on an input device
37637eb1ca1Smrg    </para>
37737eb1ca1Smrg  </listitem>
37837eb1ca1Smrg  <listitem>
37937eb1ca1Smrg    <para>
38037eb1ca1SmrgControlling device encoding
38137eb1ca1Smrg    </para>
38237eb1ca1Smrg  </listitem>
38337eb1ca1Smrg  <listitem>
38437eb1ca1Smrg    <para>
38537eb1ca1SmrgControlling button mapping
38637eb1ca1Smrg    </para>
38737eb1ca1Smrg  </listitem>
38837eb1ca1Smrg  <listitem>
38937eb1ca1Smrg    <para>
39037eb1ca1SmrgObtaining the state of a device
39137eb1ca1Smrg    </para>
39237eb1ca1Smrg  </listitem>
39337eb1ca1Smrg</itemizedlist>
39437eb1ca1Smrg<sect3 id="Changing_the_Core_Devices">
39537eb1ca1Smrg<title>Changing the Core Devices</title>
39637eb1ca1Smrg<!-- .XS -->
39737eb1ca1Smrg<!-- (SN Changing the Core Devices -->
39837eb1ca1Smrg<!-- .XE -->
39937eb1ca1Smrg
40037eb1ca1Smrg<para>
40137eb1ca1Smrg<!-- .LP -->
40237eb1ca1SmrgThese functions are provided to change which physical device is used
40337eb1ca1Smrgas the X pointer or X keyboard.
40437eb1ca1Smrg</para>
40537eb1ca1Smrg<!-- .NT -->
40637eb1ca1Smrg<note><para>
40737eb1ca1SmrgUsing these functions may change the characteristics of the core devices.
40837eb1ca1SmrgThe new pointer device may have a different number of buttons from the 
40937eb1ca1Smrgold one, or the new keyboard device may have a different number of
41037eb1ca1Smrgkeys or report a different range of keycodes.  Client programs may be
41137eb1ca1Smrgrunning that depend on those characteristics.  For example, a client
41237eb1ca1Smrgprogram could allocate an array based on the number of buttons on the
41337eb1ca1Smrgpointer device and then use the button numbers received in button events
41437eb1ca1Smrgas indices into that array.  Changing the core devices could cause
41537eb1ca1Smrgsuch client programs to behave improperly or to terminate abnormally
41637eb1ca1Smrgif they ignore the 
41737eb1ca1Smrg<function>ChangeDeviceNotify</function>
41837eb1ca1Smrgevent generated by these requests.
41937eb1ca1Smrg</para></note>
42037eb1ca1Smrg<!-- .NE -->
42137eb1ca1Smrg
42237eb1ca1Smrg<para>
42337eb1ca1Smrg<!-- .LP -->
42437eb1ca1SmrgThese functions change the X keyboard or X pointer device and generate an
42537eb1ca1Smrg<function>XChangeDeviceNotify</function>
42637eb1ca1Smrgevent and a
42737eb1ca1Smrg<function>MappingNotify</function>
42837eb1ca1Smrgevent.  
42937eb1ca1SmrgThe specified device becomes the
43037eb1ca1Smrgnew X keyboard or X pointer device.  The location of the core device
43137eb1ca1Smrgdoes not change as a result of this request.
43237eb1ca1Smrg</para>
43337eb1ca1Smrg<para>
43437eb1ca1Smrg<!-- .LP -->
43537eb1ca1SmrgThese requests fail and return 
43637eb1ca1Smrg<function>AlreadyGrabbed</function>
43737eb1ca1Smrgif either the specified
43837eb1ca1Smrgdevice or the core device it would replace are grabbed by some other client.
43937eb1ca1SmrgThey fail and return 
44037eb1ca1Smrg<function>GrabFrozen</function>
44137eb1ca1Smrgif either device is frozen by the active grab of another client.
44237eb1ca1Smrg</para>
44337eb1ca1Smrg<para>
44437eb1ca1Smrg<!-- .LP -->
44537eb1ca1SmrgThese requests fail with a
44637eb1ca1Smrg<function>BadDevice</function>
44737eb1ca1Smrgerror if the specified device is invalid, has not previously been opened via
44837eb1ca1Smrg<function>XOpenDevice ,</function>
44937eb1ca1Smrgor is
45037eb1ca1Smrgnot supported as a core device by the server implementation.
45137eb1ca1Smrg</para>
45237eb1ca1Smrg<para>
45337eb1ca1Smrg<!-- .LP -->
45437eb1ca1SmrgOnce the device has successfully replaced one of the core devices, it
45537eb1ca1Smrgis treated as a core device until it is in turn replaced by another
45637eb1ca1Smrg<function>ChangeDevice</function>
45737eb1ca1Smrgrequest or until the server terminates.  The termination
45837eb1ca1Smrgof the client that changed the device will not cause it to change back.
45937eb1ca1SmrgAttempts to use the
460f1ee322dSmrg<xref linkend='XCloseDevice' xrefstyle='select: title'/>
46137eb1ca1Smrgrequest to close the new core device will fail with a
46237eb1ca1Smrg<function>BadDevice</function>
46337eb1ca1Smrgerror.
46437eb1ca1Smrg<!-- .sp -->
46537eb1ca1Smrg</para>
46637eb1ca1Smrg<para>
46737eb1ca1Smrg<!-- .LP -->
46837eb1ca1SmrgTo change which physical device is used as the X keyboard, use the 
469f1ee322dSmrg<xref linkend='XChangeKeyboardDevice' xrefstyle='select: title'/>
47037eb1ca1Smrgfunction.
47137eb1ca1SmrgThe specified device must support input class 
47237eb1ca1Smrg<function>Keys</function>
47337eb1ca1Smrg(as reported in the
47437eb1ca1Smrg<function>ListInputDevices</function>
47537eb1ca1Smrgrequest) or the request will fail with a 
47637eb1ca1Smrg<function>BadMatch</function>
47737eb1ca1Smrgerror.
47837eb1ca1Smrg</para>
47937eb1ca1Smrg<para>
48037eb1ca1Smrg<!-- .LP -->
48137eb1ca1Smrg<!-- .sM -->
482f1ee322dSmrg<funcsynopsis id='XChangeKeyboardDevice'>
48337eb1ca1Smrg<funcprototype>
48437eb1ca1Smrg  <funcdef>int <function> XChangeKeyboardDevice</function></funcdef>
48537eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
48637eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
48737eb1ca1Smrg</funcprototype>
48837eb1ca1Smrg</funcsynopsis>
48937eb1ca1Smrg<!-- .FN -->
49037eb1ca1Smrg<variablelist>
49137eb1ca1Smrg  <varlistentry>
49237eb1ca1Smrg    <term>
49337eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
49437eb1ca1Smrg    </term>
49537eb1ca1Smrg    <listitem>
49637eb1ca1Smrg      <para>
49737eb1ca1SmrgSpecifies the connection to the X server.
49837eb1ca1Smrg      </para>
49937eb1ca1Smrg    </listitem>
50037eb1ca1Smrg  </varlistentry>
50137eb1ca1Smrg  <varlistentry>
50237eb1ca1Smrg    <term>
50337eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
50437eb1ca1Smrg    </term>
50537eb1ca1Smrg    <listitem>
50637eb1ca1Smrg      <para>
50737eb1ca1SmrgSpecifies the desired device.
50837eb1ca1Smrg    </para>
50937eb1ca1Smrg  </listitem>
51037eb1ca1Smrg  </varlistentry>
51137eb1ca1Smrg</variablelist>
51237eb1ca1Smrg</para>
51337eb1ca1Smrg<para>
51437eb1ca1Smrg<!-- .LP -->
51537eb1ca1Smrg<!-- .eM -->
51637eb1ca1SmrgIf no error occurs, 
517f1ee322dSmrg<xref linkend='XChangeKeyboardDevice' xrefstyle='select: title'/>
51837eb1ca1Smrgreturns 
51937eb1ca1Smrg<function>Success .</function>
52037eb1ca1SmrgA 
52137eb1ca1Smrg<function>ChangeDeviceNotify</function>
52237eb1ca1Smrgevent with the request field set to 
52337eb1ca1Smrg<function>NewKeyboard</function>
52437eb1ca1Smrgis sent to all clients selecting that event.
52537eb1ca1SmrgA 
52637eb1ca1Smrg<function>MappingNotify</function>
52737eb1ca1Smrgevent with the request field set to
52837eb1ca1Smrg<function>MappingKeyboard</function>
52937eb1ca1Smrgis sent to all clients.
53037eb1ca1SmrgThe requested device becomes the X keyboard, and the old keyboard becomes 
53137eb1ca1Smrgavailable as an extension input device.
53237eb1ca1SmrgThe focus state of the new keyboard is the same as
53337eb1ca1Smrgthe focus state of the old X keyboard.
53437eb1ca1Smrg</para>
53537eb1ca1Smrg<para>
53637eb1ca1Smrg<!-- .LP -->
537f1ee322dSmrg<xref linkend='XChangeKeyboardDevice' xrefstyle='select: title'/>
53837eb1ca1Smrgcan generate
53937eb1ca1Smrg<function>AlreadyGrabbed ,</function>
54037eb1ca1Smrg<function>BadDevice ,</function>
54137eb1ca1Smrg<function>BadMatch ,</function>
54237eb1ca1Smrgand 
54337eb1ca1Smrg<function>GrabFrozen</function>
54437eb1ca1Smrgerrors.
54537eb1ca1Smrg<!-- .sp -->
54637eb1ca1Smrg</para>
54737eb1ca1Smrg<para>
54837eb1ca1Smrg<!-- .LP -->
54937eb1ca1SmrgTo change which physical device is used as the X pointer,
55037eb1ca1Smrguse the
551f1ee322dSmrg<xref linkend='XChangePointerDevice' xrefstyle='select: title'/>
55237eb1ca1Smrgfunction.
55337eb1ca1SmrgThe specified device must support input class 
55437eb1ca1Smrg<function>Valuators</function>
55537eb1ca1Smrg(as reported in the
556f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
55737eb1ca1Smrgrequest) and report at least two axes of motion,
55837eb1ca1Smrgor the request will fail with a 
55937eb1ca1Smrg<function>BadMatch</function>
56037eb1ca1Smrgerror.
56137eb1ca1SmrgIf the specified device reports more than two axes, the two specified in
56237eb1ca1Smrgthe xaxis and yaxis arguments will be used.  Data from other
56337eb1ca1Smrgvaluators on the device will be ignored.
56437eb1ca1Smrg</para>
56537eb1ca1Smrg<para>
56637eb1ca1Smrg<!-- .LP -->
56737eb1ca1SmrgIf the specified device reports absolute positional information, and the 
56837eb1ca1Smrgserver implementation does not allow such a device to be used as the 
56937eb1ca1SmrgX pointer, the request will fail with a 
57037eb1ca1Smrg<function>BadDevice</function>
57137eb1ca1Smrgerror.
57237eb1ca1Smrg<!-- .sM -->
573f1ee322dSmrg<funcsynopsis id='XChangePointerDevice'>
57437eb1ca1Smrg<funcprototype>
57537eb1ca1Smrg  <funcdef>int <function> XChangePointerDevice</function></funcdef>
57637eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
57737eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
57837eb1ca1Smrg  <paramdef>int<parameter> xaxis</parameter></paramdef>
57937eb1ca1Smrg  <paramdef>int<parameter> yaxis</parameter></paramdef>
58037eb1ca1Smrg</funcprototype>
58137eb1ca1Smrg</funcsynopsis>
58237eb1ca1Smrg<!-- .FN -->
58337eb1ca1Smrg<variablelist>
58437eb1ca1Smrg  <varlistentry>
58537eb1ca1Smrg    <term>
58637eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
58737eb1ca1Smrg    </term>
58837eb1ca1Smrg    <listitem>
58937eb1ca1Smrg      <para>
59037eb1ca1SmrgSpecifies the connection to the X server.
59137eb1ca1Smrg      </para>
59237eb1ca1Smrg    </listitem>
59337eb1ca1Smrg  </varlistentry>
59437eb1ca1Smrg  <varlistentry>
59537eb1ca1Smrg    <term>
59637eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
59737eb1ca1Smrg    </term>
59837eb1ca1Smrg    <listitem>
59937eb1ca1Smrg      <para>
60037eb1ca1SmrgSpecifies the desired device.
60137eb1ca1Smrg      </para>
60237eb1ca1Smrg    </listitem>
60337eb1ca1Smrg  </varlistentry>
60437eb1ca1Smrg  <varlistentry>
60537eb1ca1Smrg    <term>
60637eb1ca1Smrg      <emphasis remap='I'>xaxis</emphasis>
60737eb1ca1Smrg    </term>
60837eb1ca1Smrg    <listitem>
60937eb1ca1Smrg      <para>
61037eb1ca1SmrgSpecifies the zero-based index of the axis to be used as the x-axis of the 
61137eb1ca1Smrgpointer device.
61237eb1ca1Smrg      </para>
61337eb1ca1Smrg    </listitem>
61437eb1ca1Smrg  </varlistentry>
61537eb1ca1Smrg  <varlistentry>
61637eb1ca1Smrg    <term>
61737eb1ca1Smrg      <emphasis remap='I'>yaxis</emphasis>
61837eb1ca1Smrg    </term>
61937eb1ca1Smrg    <listitem>
62037eb1ca1Smrg      <para>
62137eb1ca1SmrgSpecifies the zero-based index of the axis to be used as the y-axis of the 
62237eb1ca1Smrgpointer device.
62337eb1ca1Smrg    </para>
62437eb1ca1Smrg  </listitem>
62537eb1ca1Smrg  </varlistentry>
62637eb1ca1Smrg</variablelist>
62737eb1ca1Smrg</para>
62837eb1ca1Smrg<para>
62937eb1ca1Smrg<!-- .LP -->
63037eb1ca1Smrg<!-- .eM -->
63137eb1ca1SmrgIf no error occurs, 
632f1ee322dSmrg<xref linkend='XChangePointerDevice' xrefstyle='select: title'/>
63337eb1ca1Smrgreturns 
63437eb1ca1Smrg<function>Success .</function>
63537eb1ca1SmrgA 
63637eb1ca1Smrg<function>ChangeDeviceNotify</function>
63737eb1ca1Smrgevent with the request field set to 
63837eb1ca1Smrg<function>NewPointer</function>
63937eb1ca1Smrgis sent to all clients selecting that event.
64037eb1ca1SmrgA
64137eb1ca1Smrg<function>MappingNotify</function>
64237eb1ca1Smrgevent with the request field set to
64337eb1ca1Smrg<function>MappingPointer</function>
64437eb1ca1Smrgis sent to all clients.
64537eb1ca1SmrgThe requested device becomes the X pointer, and the old pointer becomes 
64637eb1ca1Smrgavailable as an extension input device.
64737eb1ca1Smrg</para>
64837eb1ca1Smrg<para>
64937eb1ca1Smrg<!-- .LP -->
650f1ee322dSmrg<xref linkend='XChangePointerDevice' xrefstyle='select: title'/>
65137eb1ca1Smrgcan generate
65237eb1ca1Smrg<function>AlreadyGrabbed ,</function>
65337eb1ca1Smrg<function>BadDevice ,</function>
65437eb1ca1Smrg<function>BadMatch ,</function>
65537eb1ca1Smrgand 
65637eb1ca1Smrg<function>GrabFrozen</function>
65737eb1ca1Smrgerrors.
65837eb1ca1Smrg</para>
65937eb1ca1Smrg</sect3>
66037eb1ca1Smrg<sect3 id="Event_Synchronization_and_Core_Grabs">
66137eb1ca1Smrg<title>Event Synchronization and Core Grabs</title>
66237eb1ca1Smrg<!-- .XS -->
66337eb1ca1Smrg<!-- (SN Event Synchronization and Core Grabs -->
66437eb1ca1Smrg<!-- .XE -->
66537eb1ca1Smrg<para>
66637eb1ca1Smrg<!-- .LP -->
66737eb1ca1SmrgImplementation of the input extension requires an extension of the
66837eb1ca1Smrgmeaning of event synchronization for the core grab requests.  This is
66937eb1ca1Smrgnecessary in order to allow window managers to freeze all input devices
67037eb1ca1Smrgwith a single request.
67137eb1ca1Smrg</para>
67237eb1ca1Smrg<para>
67337eb1ca1Smrg<!-- .LP -->
67437eb1ca1SmrgThe core grab requests require a pointer_mode and keyboard_mode
67537eb1ca1Smrgargument.  The meaning of these modes is changed by the input extension.
67637eb1ca1SmrgFor the
677f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGrabPointer'><function>XGrabPointer</function></olink>
67837eb1ca1Smrgand 
679f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGrabButton'><function>XGrabButton</function></olink>
68037eb1ca1Smrgrequests, pointer_mode controls synchronization of the pointer device, 
68137eb1ca1Smrgand keyboard_mode controls the synchronization of all other input devices.  
68237eb1ca1SmrgFor the 
683f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGrabKeyboard'><function>XGrabKeyboard</function></olink>
68437eb1ca1Smrgand
685f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGrabKey'><function>XGrabKey</function></olink>
68637eb1ca1Smrgrequests, pointer_mode controls the synchronization
68737eb1ca1Smrgof all input devices, except the X keyboard, while keyboard_mode controls
68837eb1ca1Smrgthe synchronization of the keyboard.  When using one of the core grab
68937eb1ca1Smrgrequests, the synchronization of extension devices
69037eb1ca1Smrgis controlled by the mode specified for the device not being grabbed.
69137eb1ca1Smrg</para>
69237eb1ca1Smrg</sect3>
69337eb1ca1Smrg<sect3 id="Extension_Active_Grabs">
69437eb1ca1Smrg<title>Extension Active Grabs</title>
69537eb1ca1Smrg<!-- .XS -->
69637eb1ca1Smrg<!-- (SN Extension Active Grabs -->
69737eb1ca1Smrg<!-- .XE -->
69837eb1ca1Smrg<para>
69937eb1ca1Smrg<!-- .LP -->
70037eb1ca1SmrgActive grabs of
70137eb1ca1Smrgextension devices are supported via the 
702f1ee322dSmrg<xref linkend='XGrabDevice' xrefstyle='select: title'/>
70337eb1ca1Smrgfunction in the same way that core devices are grabbed using the core 
704f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGrabKeyboard'><function>XGrabKeyboard</function></olink>
70537eb1ca1Smrgfunction, except that an extension input device
70637eb1ca1Smrgis passed as a function parameter.  
70737eb1ca1SmrgThe 
708f1ee322dSmrg<xref linkend='XUngrabDevice' xrefstyle='select: title'/>
70937eb1ca1Smrgfunction allows a previous active grab for an extension device to be released.
71037eb1ca1Smrg</para>
71137eb1ca1Smrg<para>
71237eb1ca1Smrg<!-- .LP -->
71337eb1ca1SmrgPassive grabs of buttons and keys on extension devices are supported
71437eb1ca1Smrgvia the 
715f1ee322dSmrg<xref linkend='XGrabDeviceButton' xrefstyle='select: title'/>
71637eb1ca1Smrgand 
717f1ee322dSmrg<xref linkend='XGrabDeviceKey' xrefstyle='select: title'/>
71837eb1ca1Smrgfunctions.
71937eb1ca1SmrgThese passive grabs are released via the
720f1ee322dSmrg<xref linkend='XUngrabDeviceKey' xrefstyle='select: title'/>
72137eb1ca1Smrgand
722f1ee322dSmrg<xref linkend='XUngrabDeviceButton' xrefstyle='select: title'/>
72337eb1ca1Smrgfunctions.
72437eb1ca1Smrg<!-- .sp -->
72537eb1ca1Smrg</para>
72637eb1ca1Smrg<para>
72737eb1ca1Smrg<!-- .LP -->
72837eb1ca1SmrgTo grab an extension device, use the
729f1ee322dSmrg<xref linkend='XGrabDevice' xrefstyle='select: title'/>
73037eb1ca1Smrgfunction.
73137eb1ca1SmrgThe device must have previously been opened using the
732f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
73337eb1ca1Smrgfunction.
73437eb1ca1Smrg<!-- .sM -->
735f1ee322dSmrg<funcsynopsis id='XGrabDevice'>
73637eb1ca1Smrg<funcprototype>
73737eb1ca1Smrg  <funcdef>int <function> XGrabDevice</function></funcdef>
73837eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
73937eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
74037eb1ca1Smrg  <paramdef>Window<parameter> grab_window</parameter></paramdef>
74137eb1ca1Smrg  <paramdef>Bool<parameter> owner_events</parameter></paramdef>
74237eb1ca1Smrg  <paramdef>int<parameter> event_count</parameter></paramdef>
74337eb1ca1Smrg  <paramdef>XEventClass<parameter> *event_list</parameter></paramdef>
74437eb1ca1Smrg  <paramdef>int<parameter> this_device_mode</parameter></paramdef>
74537eb1ca1Smrg  <paramdef>int<parameter> other_device_mode</parameter></paramdef>
74637eb1ca1Smrg  <paramdef>Time<parameter> time</parameter></paramdef>
74737eb1ca1Smrg</funcprototype>
74837eb1ca1Smrg</funcsynopsis>
74937eb1ca1Smrg<!-- .FN -->
75037eb1ca1Smrg<variablelist>
75137eb1ca1Smrg  <varlistentry>
75237eb1ca1Smrg    <term>
75337eb1ca1Smrg      "<emphasis remap='I'>display</emphasis>"
75437eb1ca1Smrg    </term>
75537eb1ca1Smrg    <listitem>
75637eb1ca1Smrg      <para>
75737eb1ca1SmrgSpecifies the connection to the X server.
75837eb1ca1Smrg      </para>
75937eb1ca1Smrg    </listitem>
76037eb1ca1Smrg  </varlistentry>
76137eb1ca1Smrg  <varlistentry>
76237eb1ca1Smrg    <term>
76337eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
76437eb1ca1Smrg    </term>
76537eb1ca1Smrg    <listitem>
76637eb1ca1Smrg      <para>
76737eb1ca1SmrgSpecifies the desired device.
76837eb1ca1Smrg      </para>
76937eb1ca1Smrg    </listitem>
77037eb1ca1Smrg  </varlistentry>
77137eb1ca1Smrg  <varlistentry>
77237eb1ca1Smrg    <term>
77337eb1ca1Smrg      <emphasis remap='I'>grab_window</emphasis>
77437eb1ca1Smrg    </term>
77537eb1ca1Smrg    <listitem>
77637eb1ca1Smrg      <para>
77737eb1ca1SmrgSpecifies the ID of a window associated with the device specified above.
77837eb1ca1Smrg      </para>
77937eb1ca1Smrg    </listitem>
78037eb1ca1Smrg  </varlistentry>
78137eb1ca1Smrg  <varlistentry>
78237eb1ca1Smrg    <term>
78337eb1ca1Smrg      <emphasis remap='I'>owner_events</emphasis>
78437eb1ca1Smrg    </term>
78537eb1ca1Smrg    <listitem>
78637eb1ca1Smrg      <para>
78737eb1ca1SmrgSpecifies a boolean value of either 
78837eb1ca1Smrg<function>True</function>
78937eb1ca1Smrgor 
79037eb1ca1Smrg<function>False .</function>
79137eb1ca1Smrg      </para>
79237eb1ca1Smrg    </listitem>
79337eb1ca1Smrg  </varlistentry>
79437eb1ca1Smrg  <varlistentry>
79537eb1ca1Smrg    <term>
79637eb1ca1Smrg      <emphasis remap='I'>event_count</emphasis>
79737eb1ca1Smrg    </term>
79837eb1ca1Smrg    <listitem>
79937eb1ca1Smrg      <para>
80037eb1ca1SmrgSpecifies the number of elements in the event_list array.
80137eb1ca1Smrg      </para>
80237eb1ca1Smrg    </listitem>
80337eb1ca1Smrg  </varlistentry>
80437eb1ca1Smrg  <varlistentry>
80537eb1ca1Smrg    <term>
80637eb1ca1Smrg      <emphasis remap='I'>event_list</emphasis>
80737eb1ca1Smrg    </term>
80837eb1ca1Smrg    <listitem>
80937eb1ca1Smrg      <para>
81037eb1ca1SmrgSpecifies a pointer to a list of event classes that indicate which events
81137eb1ca1Smrgthe client wishes to receive.  
81237eb1ca1SmrgThese event classes must have been obtained
81337eb1ca1Smrgusing the device being grabbed.
81437eb1ca1Smrg      </para>
81537eb1ca1Smrg    </listitem>
81637eb1ca1Smrg  </varlistentry>
81737eb1ca1Smrg  <varlistentry>
81837eb1ca1Smrg    <term>
81937eb1ca1Smrg      <emphasis remap='I'>this_device_mode</emphasis>
82037eb1ca1Smrg    </term>
82137eb1ca1Smrg    <listitem>
82237eb1ca1Smrg      <para>
82337eb1ca1SmrgControls further processing of events from this device.  You can pass one
82437eb1ca1Smrgof these constants: 
82537eb1ca1Smrg<function>GrabModeSync</function>
82637eb1ca1Smrgor 
82737eb1ca1Smrg<function>GrabModeAsync .</function>
82837eb1ca1Smrg      </para>
82937eb1ca1Smrg    </listitem>
83037eb1ca1Smrg  </varlistentry>
83137eb1ca1Smrg  <varlistentry>
83237eb1ca1Smrg    <term>
83337eb1ca1Smrg      <emphasis remap='I'>other_device_mode</emphasis>
83437eb1ca1Smrg    </term>
83537eb1ca1Smrg    <listitem>
83637eb1ca1Smrg      <para>
83737eb1ca1SmrgControls further processing of events from all other devices.  You can pass one
83837eb1ca1Smrgof these constants:
83937eb1ca1Smrg<function>GrabModeSync</function>
84037eb1ca1Smrgor 
84137eb1ca1Smrg<function>GrabModeAsync .</function>
84237eb1ca1Smrg      </para>
84337eb1ca1Smrg    </listitem>
84437eb1ca1Smrg  </varlistentry>
84537eb1ca1Smrg  <varlistentry>
84637eb1ca1Smrg    <term>
84737eb1ca1Smrg      <emphasis remap='I'>time</emphasis>
84837eb1ca1Smrg    </term>
84937eb1ca1Smrg    <listitem>
85037eb1ca1Smrg      <para>
85137eb1ca1SmrgSpecifies the time.  This may be either a timestamp expressed in
85237eb1ca1Smrgmilliseconds or
85337eb1ca1Smrg<function>CurrentTime .</function>
85437eb1ca1Smrg    </para>
85537eb1ca1Smrg  </listitem>
85637eb1ca1Smrg  </varlistentry>
85737eb1ca1Smrg</variablelist>
85837eb1ca1Smrg</para>
85937eb1ca1Smrg<para>
86037eb1ca1Smrg<!-- .LP -->
86137eb1ca1Smrg<!-- .eM -->
862f1ee322dSmrg<xref linkend='XGrabDevice' xrefstyle='select: title'/>
86337eb1ca1Smrgactively grabs an extension input device and generates 
86437eb1ca1Smrg<function>DeviceFocusIn</function>
86537eb1ca1Smrgand 
86637eb1ca1Smrg<function>DeviceFocusOut</function>
86737eb1ca1Smrgevents.
86837eb1ca1SmrgFurther input events from this device are reported only to the grabbing client.
86937eb1ca1SmrgThis function overrides any previous active grab by this client for this device.
87037eb1ca1Smrg</para>
87137eb1ca1Smrg<para>
87237eb1ca1Smrg<!-- .LP -->
87337eb1ca1SmrgThe event_list parameter is a pointer to a list of event classes.  This list
87437eb1ca1Smrgindicates which events the client wishes to receive while the grab is active.
87537eb1ca1SmrgIf owner_events is 
87637eb1ca1Smrg<function>False ,</function>
87737eb1ca1Smrginput events from this device are reported with respect to 
87837eb1ca1Smrggrab_window and are reported only if specified in event_list.
87937eb1ca1SmrgIf owner_events is
88037eb1ca1Smrg<function>True ,</function>
88137eb1ca1Smrgthen if a generated event would normally be reported to this client,
88237eb1ca1Smrgit is reported normally.
88337eb1ca1SmrgOtherwise, the event is reported with respect to the grab_window and is only
88437eb1ca1Smrgreported if specified in event_list.
88537eb1ca1Smrg</para>
88637eb1ca1Smrg<para>
88737eb1ca1Smrg<!-- .LP -->
88837eb1ca1SmrgThe this_device_mode argument controls the further processing 
88937eb1ca1Smrgof events from this device, and the other_device_mode argument controls
89037eb1ca1Smrgthe further processing of input events from all other devices.
89137eb1ca1Smrg</para>
89237eb1ca1Smrg<itemizedlist>
89337eb1ca1Smrg  <listitem>
89437eb1ca1Smrg    <para>
89537eb1ca1SmrgIf the this_device_mode argument is 
89637eb1ca1Smrg<function>GrabModeAsync ,</function>
89737eb1ca1Smrgdevice event processing continues
89837eb1ca1Smrgnormally; if the device is currently frozen by this client, then
89937eb1ca1Smrgprocessing of device events is resumed.
90037eb1ca1SmrgIf the this_device_mode  argument is
90137eb1ca1Smrg<function>GrabModeSync ,</function>
90237eb1ca1Smrgthe state of the grabbed device
90337eb1ca1Smrg(as seen by client applications) appears to freeze,
90437eb1ca1Smrgand no further device events are generated by the server until the
90537eb1ca1Smrggrabbing client issues a releasing 
906f1ee322dSmrg<xref linkend='XAllowDeviceEvents' xrefstyle='select: title'/>
90737eb1ca1Smrgcall or until the device grab is released.
90837eb1ca1SmrgActual device input events are not lost while the device is frozen; they are
90937eb1ca1Smrgsimply queued for later processing.
91037eb1ca1Smrg    </para>
91137eb1ca1Smrg  </listitem>
91237eb1ca1Smrg  <listitem>
91337eb1ca1Smrg    <para>
91437eb1ca1SmrgIf the other_device_mode is 
91537eb1ca1Smrg<function>GrabModeAsync ,</function>
91637eb1ca1Smrgevent processing from other input devices is unaffected
91737eb1ca1Smrgby activation of the grab.  
91837eb1ca1SmrgIf other_device_mode is 
91937eb1ca1Smrg<function>GrabModeSync ,</function>
92037eb1ca1Smrgthe state of all devices except the grabbed device
92137eb1ca1Smrg(as seen by client applications) appears to freeze, and no further
92237eb1ca1Smrgevents are generated by the server until the grabbing client issues a
92337eb1ca1Smrgreleasing 
924f1ee322dSmrg<olink targetdoc='libX11' targetptr='XAllowEvents'><function>XAllowEvents</function></olink>
92537eb1ca1Smrgor 
926f1ee322dSmrg<xref linkend='XAllowDeviceEvents' xrefstyle='select: title'/>
92737eb1ca1Smrgcall or until the device grab is released.
92837eb1ca1SmrgActual events are not lost
92937eb1ca1Smrgwhile the other devices are frozen; they are simply queued for later
93037eb1ca1Smrgprocessing.
93137eb1ca1Smrg    </para>
93237eb1ca1Smrg  </listitem>
93337eb1ca1Smrg</itemizedlist>
93437eb1ca1Smrg<para>
93537eb1ca1Smrg<!-- .LP -->
936f1ee322dSmrg<xref linkend='XGrabDevice' xrefstyle='select: title'/>
93737eb1ca1Smrgfails on the following conditions:
93837eb1ca1Smrg</para>
93937eb1ca1Smrg<itemizedlist>
94037eb1ca1Smrg  <listitem>
94137eb1ca1Smrg    <para>
94237eb1ca1SmrgIf the device is actively grabbed by some other client, it returns
94337eb1ca1Smrg<function>AlreadyGrabbed .</function>
94437eb1ca1Smrg    </para>
94537eb1ca1Smrg  </listitem>
94637eb1ca1Smrg  <listitem>
94737eb1ca1Smrg    <para>
94837eb1ca1SmrgIf grab_window is not viewable, it returns
94937eb1ca1Smrg<function>GrabNotViewable .</function>
95037eb1ca1Smrg    </para>
95137eb1ca1Smrg  </listitem>
95237eb1ca1Smrg  <listitem>
95337eb1ca1Smrg    <para>
95437eb1ca1SmrgIf the specified time is earlier
95537eb1ca1Smrgthan the last-grab-time for the specified device
95637eb1ca1Smrgor later than the current X server time, it returns
95737eb1ca1Smrg<function>GrabInvalidTime .</function>
95837eb1ca1SmrgOtherwise,
95937eb1ca1Smrgthe last-grab-time for the specified device is set
96037eb1ca1Smrgto the specified time and 
96137eb1ca1Smrg<function>CurrentTime</function>
96237eb1ca1Smrgis replaced by the current X server time.
96337eb1ca1Smrg    </para>
96437eb1ca1Smrg  </listitem>
96537eb1ca1Smrg  <listitem>
96637eb1ca1Smrg    <para>
96737eb1ca1SmrgIf the device is frozen by an active grab of another client, it returns
96837eb1ca1Smrg<function>GrabFrozen .</function>
96937eb1ca1Smrg    </para>
97037eb1ca1Smrg  </listitem>
97137eb1ca1Smrg</itemizedlist>
97237eb1ca1Smrg<para>
97337eb1ca1Smrg<!-- .LP -->
97437eb1ca1SmrgIf a grabbed device is closed by a client while an active grab by that 
97537eb1ca1Smrgclient is in effect, that active grab will be released. 
97637eb1ca1SmrgAny passive grabs established by that client will be released.
97737eb1ca1SmrgIf the device is frozen only by an active grab
97837eb1ca1Smrgof the requesting client, it is thawed.
97937eb1ca1Smrg</para>
98037eb1ca1Smrg<para>
98137eb1ca1Smrg<!-- .LP -->
982f1ee322dSmrg<xref linkend='XGrabDevice' xrefstyle='select: title'/>
98337eb1ca1Smrgcan generate
98437eb1ca1Smrg<function>BadClass ,</function>
98537eb1ca1Smrg<function>BadDevice ,</function>
98637eb1ca1Smrg<function>BadValue ,</function>
98737eb1ca1Smrgand
98837eb1ca1Smrg<function>BadWindow</function>
98937eb1ca1Smrgerrors.
99037eb1ca1Smrg<!-- .sp -->
99137eb1ca1Smrg</para>
99237eb1ca1Smrg<para>
99337eb1ca1Smrg<!-- .LP -->
99437eb1ca1SmrgTo release a grab of an extension device, use the
995f1ee322dSmrg<xref linkend='XUngrabDevice' xrefstyle='select: title'/>
99637eb1ca1Smrgfunction.
99737eb1ca1Smrg</para>
99837eb1ca1Smrg<para>
99937eb1ca1Smrg<!-- .LP -->
100037eb1ca1Smrg<!-- .sM -->
1001f1ee322dSmrg<funcsynopsis id='XUngrabDevice'>
100237eb1ca1Smrg<funcprototype>
100337eb1ca1Smrg  <funcdef>int <function> XUngrabDevice</function></funcdef>
100437eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
100537eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
100637eb1ca1Smrg  <paramdef>Time<parameter> time</parameter></paramdef>
100737eb1ca1Smrg</funcprototype>
100837eb1ca1Smrg</funcsynopsis>
100937eb1ca1Smrg<!-- .FN -->
101037eb1ca1Smrg<variablelist>
101137eb1ca1Smrg  <varlistentry>
101237eb1ca1Smrg    <term>
101337eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
101437eb1ca1Smrg    </term>
101537eb1ca1Smrg    <listitem>
101637eb1ca1Smrg      <para>
101737eb1ca1SmrgSpecifies the connection to the X server.
101837eb1ca1Smrg      </para>
101937eb1ca1Smrg    </listitem>
102037eb1ca1Smrg  </varlistentry>
102137eb1ca1Smrg  <varlistentry>
102237eb1ca1Smrg    <term>
102337eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
102437eb1ca1Smrg    </term>
102537eb1ca1Smrg    <listitem>
102637eb1ca1Smrg      <para>
102737eb1ca1SmrgSpecifies the desired device.
102837eb1ca1Smrg      </para>
102937eb1ca1Smrg    </listitem>
103037eb1ca1Smrg  </varlistentry>
103137eb1ca1Smrg  <varlistentry>
103237eb1ca1Smrg    <term>
103337eb1ca1Smrg      <emphasis remap='I'>time</emphasis>
103437eb1ca1Smrg    </term>
103537eb1ca1Smrg    <listitem>
103637eb1ca1Smrg      <para>
103737eb1ca1SmrgSpecifies the time.  This may be either a timestamp expressed in
103837eb1ca1Smrgmilliseconds, or 
103937eb1ca1Smrg<function>CurrentTime .</function>
104037eb1ca1Smrg    </para>
104137eb1ca1Smrg  </listitem>
104237eb1ca1Smrg  </varlistentry>
104337eb1ca1Smrg</variablelist>
104437eb1ca1Smrg</para>
104537eb1ca1Smrg<para>
104637eb1ca1Smrg<!-- .LP -->
104737eb1ca1Smrg<!-- .eM -->
1048f1ee322dSmrg<xref linkend='XUngrabDevice' xrefstyle='select: title'/>
104937eb1ca1Smrgallows a client to release an extension input device and any
105037eb1ca1Smrgqueued events if this client has it grabbed from either
1051f1ee322dSmrg<xref linkend='XGrabDevice' xrefstyle='select: title'/>
105237eb1ca1Smrgor
105337eb1ca1Smrg<function>XGrabDeviceKey .</function>
105437eb1ca1SmrgIf any other devices are frozen by the grab,
1055f1ee322dSmrg<xref linkend='XUngrabDevice' xrefstyle='select: title'/>
105637eb1ca1Smrgthaws them. 
105737eb1ca1SmrgThis function does not release the device and any
105837eb1ca1Smrgqueued events if the specified time is earlier than the last-device-grab
105937eb1ca1Smrgtime or is later than the current X server time.  It also generates 
106037eb1ca1Smrg<function>DeviceFocusIn</function>
106137eb1ca1Smrgand 
106237eb1ca1Smrg<function>DeviceFocusOut</function>
106337eb1ca1Smrgevents.  The X server automatically performs an
1064f1ee322dSmrg<xref linkend='XUngrabDevice' xrefstyle='select: title'/>
106537eb1ca1Smrgif the event window for an active device grab becomes not viewable
106637eb1ca1Smrgor if the client terminates without releasing the grab.
106737eb1ca1Smrg</para>
106837eb1ca1Smrg<para>
106937eb1ca1Smrg<!-- .LP -->
1070f1ee322dSmrg<xref linkend='XUngrabDevice' xrefstyle='select: title'/>
107137eb1ca1Smrgcan generate
107237eb1ca1Smrg<function>BadDevice</function>
107337eb1ca1Smrgerrors.
107437eb1ca1Smrg</para>
107537eb1ca1Smrg</sect3>
107637eb1ca1Smrg<sect3 id="Passively_Grabbing_a_Key">
107737eb1ca1Smrg<title>Passively Grabbing a Key</title>
107837eb1ca1Smrg<!-- .XS -->
107937eb1ca1Smrg<!-- (SN Passively Grabbing a Key -->
108037eb1ca1Smrg<!-- .XE -->
108137eb1ca1Smrg<para>
108237eb1ca1Smrg<!-- .LP -->
108337eb1ca1SmrgTo passively grab a single key on an extension device, use
108437eb1ca1Smrg<function>XGrabDeviceKey .</function>
108537eb1ca1SmrgThat device must have previously been opened using the
1086f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
108737eb1ca1Smrgfunction, or the request will fail with a
108837eb1ca1Smrg<function>BadDevice</function>
108937eb1ca1Smrgerror.  
109037eb1ca1SmrgIf the specified device does not support input class
109137eb1ca1Smrg<function>Keys ,</function>
109237eb1ca1Smrgthe request will fail with a
109337eb1ca1Smrg<function>BadMatch</function>
109437eb1ca1Smrgerror.
109537eb1ca1Smrg<!-- .sM -->
1096f1ee322dSmrg<funcsynopsis id='XGrabDeviceKey'>
109737eb1ca1Smrg<funcprototype>
109837eb1ca1Smrg  <funcdef>int <function> XGrabDeviceKey</function></funcdef>
109937eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
110037eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
110137eb1ca1Smrg  <paramdef>int<parameter> keycode</parameter></paramdef>
110237eb1ca1Smrg  <paramdef>unsignedint<parameter> modifiers</parameter></paramdef>
110337eb1ca1Smrg  <paramdef>XDevice<parameter> *modifier_device</parameter></paramdef>
110437eb1ca1Smrg  <paramdef>Window<parameter> grab_window</parameter></paramdef>
110537eb1ca1Smrg  <paramdef>Bool<parameter> owner_events</parameter></paramdef>
110637eb1ca1Smrg  <paramdef>int<parameter> event_count</parameter></paramdef>
110737eb1ca1Smrg  <paramdef>XEventClass<parameter> *event_list</parameter></paramdef>
110837eb1ca1Smrg  <paramdef>int<parameter> this_device_mode</parameter></paramdef>
110937eb1ca1Smrg  <paramdef>int<parameter> other_device_mode</parameter></paramdef>
111037eb1ca1Smrg</funcprototype>
111137eb1ca1Smrg</funcsynopsis>
111237eb1ca1Smrg<!-- .FN -->
111337eb1ca1Smrg<variablelist>
111437eb1ca1Smrg  <varlistentry>
111537eb1ca1Smrg    <term>
111637eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
111737eb1ca1Smrg    </term>
111837eb1ca1Smrg    <listitem>
111937eb1ca1Smrg      <para>
112037eb1ca1SmrgSpecifies the connection to the X server.
112137eb1ca1Smrg      </para>
112237eb1ca1Smrg    </listitem>
112337eb1ca1Smrg  </varlistentry>
112437eb1ca1Smrg  <varlistentry>
112537eb1ca1Smrg    <term>
112637eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
112737eb1ca1Smrg    </term>
112837eb1ca1Smrg    <listitem>
112937eb1ca1Smrg      <para>
113037eb1ca1SmrgSpecifies the desired device.
113137eb1ca1Smrg      </para>
113237eb1ca1Smrg    </listitem>
113337eb1ca1Smrg  </varlistentry>
113437eb1ca1Smrg  <varlistentry>
113537eb1ca1Smrg    <term>
113637eb1ca1Smrg      <emphasis remap='I'>keycode</emphasis>
113737eb1ca1Smrg    </term>
113837eb1ca1Smrg    <listitem>
113937eb1ca1Smrg      <para>
114037eb1ca1SmrgSpecifies the keycode of the key that is to be grabbed.  You can pass
114137eb1ca1Smrgeither the keycode or 
114237eb1ca1Smrg<function>AnyKey .</function>
114337eb1ca1Smrg      </para>
114437eb1ca1Smrg    </listitem>
114537eb1ca1Smrg  </varlistentry>
114637eb1ca1Smrg  <varlistentry>
114737eb1ca1Smrg    <term>
114837eb1ca1Smrg      <emphasis remap='I'>modifiers</emphasis>
114937eb1ca1Smrg    </term>
115037eb1ca1Smrg    <listitem>
115137eb1ca1Smrg      <para>
115237eb1ca1SmrgSpecifies the set of keymasks.  This mask is the bitwise inclusive OR
115337eb1ca1Smrgof these keymask bits:  
115437eb1ca1Smrg<function>ShiftMask ,</function>
115537eb1ca1Smrg<function>LockMask ,</function>
115637eb1ca1Smrg<function>ControlMask ,</function>
115737eb1ca1Smrg<function>Mod1Mask ,</function>
115837eb1ca1Smrg<function>Mod2Mask ,</function>
115937eb1ca1Smrg<function>Mod3Mask ,</function>
116037eb1ca1Smrg<function>Mod4Mask ,</function>
116137eb1ca1Smrgand
116237eb1ca1Smrg<function>Mod5Mask .</function>
116337eb1ca1Smrg      </para>
116437eb1ca1Smrg    </listitem>
116537eb1ca1Smrg  </varlistentry>
116637eb1ca1Smrg  <varlistentry>
116737eb1ca1Smrg    <term>
116837eb1ca1Smrg      
116937eb1ca1Smrg    </term>
117037eb1ca1Smrg    <listitem>
117137eb1ca1Smrg      <para>
117237eb1ca1SmrgYou can also pass 
117337eb1ca1Smrg<function>AnyModifier ,</function>
117437eb1ca1Smrgwhich is equivalent to issuing the grab key request 
117537eb1ca1Smrgfor all possible modifier combinations (including the combination
117637eb1ca1Smrgof no modifiers).
117737eb1ca1Smrg      </para>
117837eb1ca1Smrg    </listitem>
117937eb1ca1Smrg  </varlistentry>
118037eb1ca1Smrg  <varlistentry>
118137eb1ca1Smrg    <term>
118237eb1ca1Smrg      <emphasis remap='I'>modifier_device</emphasis>
118337eb1ca1Smrg    </term>
118437eb1ca1Smrg    <listitem>
118537eb1ca1Smrg      <para>
118637eb1ca1SmrgSpecifies the device whose modifiers are to be used.  If NULL is 
118737eb1ca1Smrgspecified, the core X keyboard is used as the modifier_device.
118837eb1ca1Smrg      </para>
118937eb1ca1Smrg    </listitem>
119037eb1ca1Smrg  </varlistentry>
119137eb1ca1Smrg  <varlistentry>
119237eb1ca1Smrg    <term>
119337eb1ca1Smrg      <emphasis remap='I'>grab_window</emphasis>
119437eb1ca1Smrg    </term>
119537eb1ca1Smrg    <listitem>
119637eb1ca1Smrg      <para>
119737eb1ca1SmrgSpecifies the ID of a window associated with the device specified above.
119837eb1ca1Smrg      </para>
119937eb1ca1Smrg    </listitem>
120037eb1ca1Smrg  </varlistentry>
120137eb1ca1Smrg  <varlistentry>
120237eb1ca1Smrg    <term>
120337eb1ca1Smrg      <emphasis remap='I'>owner_events</emphasis>
120437eb1ca1Smrg    </term>
120537eb1ca1Smrg    <listitem>
120637eb1ca1Smrg      <para>
120737eb1ca1SmrgSpecifies a boolean value of either
120837eb1ca1Smrg<function>True</function>
120937eb1ca1Smrgor
121037eb1ca1Smrg<function>False .</function>
121137eb1ca1Smrg      </para>
121237eb1ca1Smrg    </listitem>
121337eb1ca1Smrg  </varlistentry>
121437eb1ca1Smrg  <varlistentry>
121537eb1ca1Smrg    <term>
121637eb1ca1Smrg      <emphasis remap='I'>event_count</emphasis>
121737eb1ca1Smrg    </term>
121837eb1ca1Smrg    <listitem>
121937eb1ca1Smrg      <para>
122037eb1ca1SmrgSpecifies the number of elements in the event_list array.
122137eb1ca1Smrg      </para>
122237eb1ca1Smrg    </listitem>
122337eb1ca1Smrg  </varlistentry>
122437eb1ca1Smrg  <varlistentry>
122537eb1ca1Smrg    <term>
122637eb1ca1Smrg      <emphasis remap='I'>event_list</emphasis>
122737eb1ca1Smrg    </term>
122837eb1ca1Smrg    <listitem>
122937eb1ca1Smrg      <para>
123037eb1ca1SmrgSpecifies a pointer to a list of event classes that indicate which events
123137eb1ca1Smrgthe client wishes to receive.
123237eb1ca1Smrg      </para>
123337eb1ca1Smrg    </listitem>
123437eb1ca1Smrg  </varlistentry>
123537eb1ca1Smrg  <varlistentry>
123637eb1ca1Smrg    <term>
123737eb1ca1Smrg      <emphasis remap='I'>this_device_mode</emphasis>
123837eb1ca1Smrg    </term>
123937eb1ca1Smrg    <listitem>
124037eb1ca1Smrg      <para>
124137eb1ca1SmrgControls further processing of events from this device.
124237eb1ca1SmrgYou can pass one of these constants:
124337eb1ca1Smrg<function>GrabModeSync</function>
124437eb1ca1Smrgor
124537eb1ca1Smrg<function>GrabModeAsync .</function>
124637eb1ca1Smrg      </para>
124737eb1ca1Smrg    </listitem>
124837eb1ca1Smrg  </varlistentry>
124937eb1ca1Smrg  <varlistentry>
125037eb1ca1Smrg    <term>
125137eb1ca1Smrg      <emphasis remap='I'>other_device_mode</emphasis>
125237eb1ca1Smrg    </term>
125337eb1ca1Smrg    <listitem>
125437eb1ca1Smrg      <para>
125537eb1ca1SmrgControls further processing of events from all other devices.
125637eb1ca1SmrgYou can pass one of these constants: 
125737eb1ca1Smrg<function>GrabModeSync</function>
125837eb1ca1Smrgor
125937eb1ca1Smrg<function>GrabModeAsync .</function>
126037eb1ca1Smrg    </para>
126137eb1ca1Smrg  </listitem>
126237eb1ca1Smrg  </varlistentry>
126337eb1ca1Smrg</variablelist>
126437eb1ca1Smrg</para>
126537eb1ca1Smrg<para>
126637eb1ca1Smrg<!-- .LP -->
126737eb1ca1Smrg<!-- .eM -->
1268f1ee322dSmrg<xref linkend='XGrabDeviceKey' xrefstyle='select: title'/>
126937eb1ca1Smrgis analogous to the core 
1270f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGrabKey'><function>XGrabKey</function></olink>
127137eb1ca1Smrgfunction.  It creates an
127237eb1ca1Smrgexplicit passive grab for a key on an extension device.
127337eb1ca1SmrgThe 
1274f1ee322dSmrg<xref linkend='XGrabDeviceKey' xrefstyle='select: title'/>
127537eb1ca1Smrgfunction establishes a passive grab on a device.
127637eb1ca1SmrgConsequently, in the future, 
127737eb1ca1Smrg</para>
127837eb1ca1Smrg<itemizedlist>
127937eb1ca1Smrg  <listitem>
128037eb1ca1Smrg    <para>
128137eb1ca1SmrgIF the device is not grabbed and the specified key, 
128237eb1ca1Smrgwhich itself can be a modifier key, is logically pressed
128337eb1ca1Smrgwhen the specified modifier keys logically are down on the specified
128437eb1ca1Smrgmodifier device (and no other keys are down),
128537eb1ca1Smrg    </para>
128637eb1ca1Smrg  </listitem>
128737eb1ca1Smrg  <listitem>
128837eb1ca1Smrg    <para>
128937eb1ca1SmrgAND no other modifier keys logically are down,
129037eb1ca1Smrg    </para>
129137eb1ca1Smrg  </listitem>
129237eb1ca1Smrg  <listitem>
129337eb1ca1Smrg    <para>
129437eb1ca1SmrgAND EITHER the grab window is an ancestor of (or is) the focus window
129537eb1ca1Smrgor the grab window is a descendent of the focus window and contains the pointer,
129637eb1ca1Smrg    </para>
129737eb1ca1Smrg  </listitem>
129837eb1ca1Smrg  <listitem>
129937eb1ca1Smrg    <para>
130037eb1ca1SmrgAND a passive grab on the same device and key combination does not exist on any
130137eb1ca1Smrgancestor of the grab window,
130237eb1ca1Smrg    </para>
130337eb1ca1Smrg  </listitem>
130437eb1ca1Smrg  <listitem>
130537eb1ca1Smrg    <para>
130637eb1ca1SmrgTHEN the device is actively grabbed, as for
130737eb1ca1Smrg<function>XGrabDevice ,</function>
130837eb1ca1Smrgthe last-device-grab time is set to the time at which the key was pressed
130937eb1ca1Smrg(as transmitted in the 
131037eb1ca1Smrg<function>DeviceKeyPress</function>
131137eb1ca1Smrgevent), and the 
131237eb1ca1Smrg<function>DeviceKeyPress</function>
131337eb1ca1Smrgevent is reported.
131437eb1ca1Smrg    </para>
131537eb1ca1Smrg  </listitem>
131637eb1ca1Smrg</itemizedlist>
131737eb1ca1Smrg<para>
131837eb1ca1Smrg<!-- .LP -->
131937eb1ca1SmrgThe interpretation of the remaining arguments is as for
132037eb1ca1Smrg<function>XGrabDevice .</function>
132137eb1ca1SmrgThe active grab is terminated automatically when the logical state of the
132237eb1ca1Smrgdevice has the specified key released
132337eb1ca1Smrg(independent of the logical state of the modifier keys).
132437eb1ca1Smrg</para>
132537eb1ca1Smrg<para>
132637eb1ca1Smrg<!-- .LP -->
132737eb1ca1SmrgNote that the logical state of a device (as seen by means of the X protocol)
132837eb1ca1Smrgmay lag the physical state if device event processing is frozen.
132937eb1ca1Smrg</para>
133037eb1ca1Smrg<para>
133137eb1ca1Smrg<!-- .LP -->
133237eb1ca1SmrgA modifier of 
133337eb1ca1Smrg<function>AnyModifier</function>
133437eb1ca1Smrgis equivalent to issuing the request for all
133537eb1ca1Smrgpossible modifier combinations (including the combination of no modifiers).  
133637eb1ca1SmrgIt is not required that all modifiers specified have
133737eb1ca1Smrgcurrently assigned keycodes.
133837eb1ca1SmrgA key of 
133937eb1ca1Smrg<function>AnyKey</function>
134037eb1ca1Smrgis equivalent to issuing
134137eb1ca1Smrgthe request for all possible keycodes.  Otherwise, the key must be in
134237eb1ca1Smrgthe range specified by min_keycode and max_keycode in the 
134337eb1ca1Smrginformation returned by the
1344f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
134537eb1ca1Smrgfunction.
134637eb1ca1SmrgIf it is not within that range, 
1347f1ee322dSmrg<xref linkend='XGrabDeviceKey' xrefstyle='select: title'/>
134837eb1ca1Smrggenerates a
134937eb1ca1Smrg<function>BadValue</function>
135037eb1ca1Smrgerror.
135137eb1ca1Smrg</para>
135237eb1ca1Smrg<para>
135337eb1ca1Smrg<!-- .LP -->
1354f1ee322dSmrg<xref linkend='XGrabDeviceKey' xrefstyle='select: title'/>
135537eb1ca1Smrggenerates a
135637eb1ca1Smrg<function>BadAccess</function>
135737eb1ca1Smrgerror if some other client has issued a 
1358f1ee322dSmrg<xref linkend='XGrabDeviceKey' xrefstyle='select: title'/>
135937eb1ca1Smrgwith the same device and key combination on the same window.
136037eb1ca1SmrgWhen using
136137eb1ca1Smrg<function>AnyModifier</function>
136237eb1ca1Smrgor
136337eb1ca1Smrg<function>AnyKey ,</function>
136437eb1ca1Smrgthe request fails completely and the X server generates a
136537eb1ca1Smrg<function>BadAccess</function>
136637eb1ca1Smrgerror, and no grabs are established if there is a conflicting grab
136737eb1ca1Smrgfor any combination.
136837eb1ca1Smrg</para>
136937eb1ca1Smrg<para>
137037eb1ca1Smrg<!-- .LP -->
1371f1ee322dSmrg<xref linkend='XGrabDeviceKey' xrefstyle='select: title'/>
137237eb1ca1Smrgreturns
137337eb1ca1Smrg<function>Success</function>
137437eb1ca1Smrgupon successful completion of the request.
137537eb1ca1Smrg</para>
137637eb1ca1Smrg<para>
137737eb1ca1Smrg<!-- .LP -->
1378f1ee322dSmrg<xref linkend='XGrabDeviceKey' xrefstyle='select: title'/>
137937eb1ca1Smrgcan generate
138037eb1ca1Smrg<function>BadAccess ,</function>
138137eb1ca1Smrg<function>BadClass ,</function>
138237eb1ca1Smrg<function>BadDevice ,</function>
138337eb1ca1Smrg<function>BadMatch ,</function>
138437eb1ca1Smrg<function>BadValue ,</function>
138537eb1ca1Smrgand
138637eb1ca1Smrg<function>BadWindow</function>
138737eb1ca1Smrgerrors.
138837eb1ca1Smrg<!-- .sp -->
138937eb1ca1Smrg</para>
139037eb1ca1Smrg<para>
139137eb1ca1Smrg<!-- .LP -->
139237eb1ca1SmrgTo release a passive grab of a single key on an extension device, use
139337eb1ca1Smrg<function>XUngrabDeviceKey .</function>
139437eb1ca1Smrg<!-- .sM -->
1395f1ee322dSmrg<funcsynopsis id='XUngrabDeviceKey'>
139637eb1ca1Smrg<funcprototype>
139737eb1ca1Smrg  <funcdef>int <function> XUngrabDeviceKey</function></funcdef>
139837eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
139937eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
140037eb1ca1Smrg  <paramdef>int<parameter> keycode</parameter></paramdef>
140137eb1ca1Smrg  <paramdef>unsignedint<parameter> modifiers</parameter></paramdef>
140237eb1ca1Smrg  <paramdef>XDevice<parameter> *modifier_device</parameter></paramdef>
140337eb1ca1Smrg  <paramdef>Window<parameter> ungrab_window</parameter></paramdef>
140437eb1ca1Smrg</funcprototype>
140537eb1ca1Smrg</funcsynopsis>
140637eb1ca1Smrg<!-- .FN -->
140737eb1ca1Smrg<variablelist>
140837eb1ca1Smrg  <varlistentry>
140937eb1ca1Smrg    <term>
141037eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
141137eb1ca1Smrg    </term>
141237eb1ca1Smrg    <listitem>
141337eb1ca1Smrg      <para>
141437eb1ca1SmrgSpecifies the connection to the X server.
141537eb1ca1Smrg      </para>
141637eb1ca1Smrg    </listitem>
141737eb1ca1Smrg  </varlistentry>
141837eb1ca1Smrg  <varlistentry>
141937eb1ca1Smrg    <term>
142037eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
142137eb1ca1Smrg    </term>
142237eb1ca1Smrg    <listitem>
142337eb1ca1Smrg      <para>
142437eb1ca1SmrgSpecifies the desired device.
142537eb1ca1Smrg      </para>
142637eb1ca1Smrg    </listitem>
142737eb1ca1Smrg  </varlistentry>
142837eb1ca1Smrg  <varlistentry>
142937eb1ca1Smrg    <term>
143037eb1ca1Smrg      <emphasis remap='I'>keycode</emphasis>
143137eb1ca1Smrg    </term>
143237eb1ca1Smrg    <listitem>
143337eb1ca1Smrg      <para>
143437eb1ca1SmrgSpecifies the keycode of the key that is to be ungrabbed.  You can pass
143537eb1ca1Smrgeither the keycode or
143637eb1ca1Smrg<function>AnyKey .</function>
143737eb1ca1Smrg      </para>
143837eb1ca1Smrg    </listitem>
143937eb1ca1Smrg  </varlistentry>
144037eb1ca1Smrg  <varlistentry>
144137eb1ca1Smrg    <term>
144237eb1ca1Smrg      <emphasis remap='I'>modifiers</emphasis>
144337eb1ca1Smrg    </term>
144437eb1ca1Smrg    <listitem>
144537eb1ca1Smrg      <para>
144637eb1ca1SmrgSpecifies the set of keymasks.  This mask is the bitwise inclusive OR
144737eb1ca1Smrgof these keymask bits:
144837eb1ca1Smrg<function>ShiftMask ,</function>
144937eb1ca1Smrg<function>LockMask ,</function>
145037eb1ca1Smrg<function>ControlMask , </function>
145137eb1ca1Smrg<function>Mod1Mask ,</function>
145237eb1ca1Smrg<function>Mod2Mask ,</function>
145337eb1ca1Smrg<function>Mod3Mask ,</function>
145437eb1ca1Smrg<function>Mod4Mask ,</function>
145537eb1ca1Smrgand
145637eb1ca1Smrg<function>Mod5Mask .</function>
145737eb1ca1Smrg      </para>
145837eb1ca1Smrg    </listitem>
145937eb1ca1Smrg  </varlistentry>
146037eb1ca1Smrg  <varlistentry>
146137eb1ca1Smrg    <term>
146237eb1ca1Smrg      
146337eb1ca1Smrg    </term>
146437eb1ca1Smrg    <listitem>
146537eb1ca1Smrg      <para>
146637eb1ca1SmrgYou can also pass
146737eb1ca1Smrg<function>AnyModifier ,</function>
146837eb1ca1Smrgwhich is equivalent to issuing the ungrab key 
146937eb1ca1Smrgrequest for all possible modifier combinations (including the combination
147037eb1ca1Smrgof no modifiers).
147137eb1ca1Smrg      </para>
147237eb1ca1Smrg    </listitem>
147337eb1ca1Smrg  </varlistentry>
147437eb1ca1Smrg  <varlistentry>
147537eb1ca1Smrg    <term>
147637eb1ca1Smrg      <emphasis remap='I'>modifier_device</emphasis>
147737eb1ca1Smrg    </term>
147837eb1ca1Smrg    <listitem>
147937eb1ca1Smrg      <para>
148037eb1ca1SmrgSpecifies the device whose modifiers are to be used.  If NULL is 
148137eb1ca1Smrgspecified, the core X keyboard is used as the modifier_device.
148237eb1ca1Smrg      </para>
148337eb1ca1Smrg    </listitem>
148437eb1ca1Smrg  </varlistentry>
148537eb1ca1Smrg  <varlistentry>
148637eb1ca1Smrg    <term>
148737eb1ca1Smrg      <emphasis remap='I'>ungrab_window</emphasis>
148837eb1ca1Smrg    </term>
148937eb1ca1Smrg    <listitem>
149037eb1ca1Smrg      <para>
149137eb1ca1SmrgSpecifies the ID of a window associated with the device specified above.
149237eb1ca1Smrg    </para>
149337eb1ca1Smrg  </listitem>
149437eb1ca1Smrg  </varlistentry>
149537eb1ca1Smrg</variablelist>
149637eb1ca1Smrg</para>
149737eb1ca1Smrg<para>
149837eb1ca1Smrg<!-- .LP -->
149937eb1ca1Smrg<!-- .eM -->
1500f1ee322dSmrg<xref linkend='XUngrabDeviceKey' xrefstyle='select: title'/>
150137eb1ca1Smrgis analogous to the core
1502f1ee322dSmrg<olink targetdoc='libX11' targetptr='XUngrabKey'><function>XUngrabKey</function></olink>
150337eb1ca1Smrgfunction.  It releases an explicit passive grab for a key 
150437eb1ca1Smrgon an extension input device.
150537eb1ca1Smrg</para>
150637eb1ca1Smrg<para>
150737eb1ca1Smrg<!-- .LP -->
1508f1ee322dSmrg<xref linkend='XUngrabDeviceKey' xrefstyle='select: title'/>
150937eb1ca1Smrgcan generate
151037eb1ca1Smrg<function>BadAlloc ,</function>
151137eb1ca1Smrg<function>BadDevice ,</function>
151237eb1ca1Smrg<function>BadMatch ,</function>
151337eb1ca1Smrg<function>BadValue ,</function>
151437eb1ca1Smrgand 
151537eb1ca1Smrg<function>BadWindow</function>
151637eb1ca1Smrgerrors.
151737eb1ca1Smrg</para>
151837eb1ca1Smrg</sect3>
151937eb1ca1Smrg<sect3 id="Passively_Grabbing_a_Button">
152037eb1ca1Smrg<title>Passively Grabbing a Button</title>
152137eb1ca1Smrg<!-- .XS -->
152237eb1ca1Smrg<!-- (SN Passively Grabbing a Button -->
152337eb1ca1Smrg<!-- .XE -->
152437eb1ca1Smrg<para>
152537eb1ca1Smrg<!-- .LP -->
152637eb1ca1SmrgTo establish a passive grab for a single button on an extension device, use
152737eb1ca1Smrg<function>XGrabDeviceButton .</function>
152837eb1ca1SmrgThe specified device must have previously been opened using the
1529f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
153037eb1ca1Smrgfunction, or the request will fail with a 
153137eb1ca1Smrg<function>BadDevice</function>
153237eb1ca1Smrgerror.  If the specified device does not support input class
153337eb1ca1Smrg<function>Buttons ,</function>
153437eb1ca1Smrgthe request will fail with a 
153537eb1ca1Smrg<function>BadMatch</function>
153637eb1ca1Smrgerror.
153737eb1ca1Smrg<!-- .sM -->
1538f1ee322dSmrg<funcsynopsis id='XGrabDeviceButton'>
153937eb1ca1Smrg<funcprototype>
154037eb1ca1Smrg  <funcdef>int <function> XGrabDeviceButton</function></funcdef>
154137eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
154237eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
154337eb1ca1Smrg  <paramdef>unsignedint<parameter> button</parameter></paramdef>
154437eb1ca1Smrg  <paramdef>unsignedint<parameter> modifiers</parameter></paramdef>
154537eb1ca1Smrg  <paramdef>XDevice*modifier_device<parameter> </parameter></paramdef>
154637eb1ca1Smrg  <paramdef>Window<parameter> grab_window</parameter></paramdef>
154737eb1ca1Smrg  <paramdef>Bool<parameter> owner_events</parameter></paramdef>
154837eb1ca1Smrg  <paramdef>int<parameter> event_count</parameter></paramdef>
154937eb1ca1Smrg  <paramdef>XEventClass<parameter> *event_list</parameter></paramdef>
155037eb1ca1Smrg  <paramdef>int<parameter> this_device_mode</parameter></paramdef>
155137eb1ca1Smrg  <paramdef>int<parameter> other_device_mode</parameter></paramdef>
155237eb1ca1Smrg</funcprototype>
155337eb1ca1Smrg</funcsynopsis>
155437eb1ca1Smrg<!-- .FN -->
155537eb1ca1Smrg<variablelist>
155637eb1ca1Smrg  <varlistentry>
155737eb1ca1Smrg    <term>
155837eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
155937eb1ca1Smrg    </term>
156037eb1ca1Smrg    <listitem>
156137eb1ca1Smrg      <para>
156237eb1ca1SmrgSpecifies the connection to the X server.
156337eb1ca1Smrg      </para>
156437eb1ca1Smrg    </listitem>
156537eb1ca1Smrg  </varlistentry>
156637eb1ca1Smrg  <varlistentry>
156737eb1ca1Smrg    <term>
156837eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
156937eb1ca1Smrg    </term>
157037eb1ca1Smrg    <listitem>
157137eb1ca1Smrg      <para>
157237eb1ca1SmrgSpecifies the desired device.
157337eb1ca1Smrg      </para>
157437eb1ca1Smrg    </listitem>
157537eb1ca1Smrg  </varlistentry>
157637eb1ca1Smrg  <varlistentry>
157737eb1ca1Smrg    <term>
157837eb1ca1Smrg      <emphasis remap='I'>button</emphasis>
157937eb1ca1Smrg    </term>
158037eb1ca1Smrg    <listitem>
158137eb1ca1Smrg      <para>
158237eb1ca1SmrgSpecifies the code of the button that is to be grabbed.  You can pass
158337eb1ca1Smrgeither the button or
158437eb1ca1Smrg<function>AnyButton .</function>
158537eb1ca1Smrg      </para>
158637eb1ca1Smrg    </listitem>
158737eb1ca1Smrg  </varlistentry>
158837eb1ca1Smrg  <varlistentry>
158937eb1ca1Smrg    <term>
159037eb1ca1Smrg      <emphasis remap='I'>modifiers</emphasis>
159137eb1ca1Smrg    </term>
159237eb1ca1Smrg    <listitem>
159337eb1ca1Smrg      <para>
159437eb1ca1SmrgSpecifies the set of keymasks.  This mask is the bitwise inclusive OR
159537eb1ca1Smrgof these keymask bits:
159637eb1ca1Smrg<function>ShiftMask ,</function>
159737eb1ca1Smrg<function>LockMask ,</function>
159837eb1ca1Smrg<function>ControlMask , </function>
159937eb1ca1Smrg<function>Mod1Mask ,</function>
160037eb1ca1Smrg<function>Mod2Mask ,</function>
160137eb1ca1Smrg<function>Mod3Mask ,</function>
160237eb1ca1Smrg<function>Mod4Mask ,</function>
160337eb1ca1Smrgand
160437eb1ca1Smrg<function>Mod5Mask .</function>
160537eb1ca1Smrg      </para>
160637eb1ca1Smrg    </listitem>
160737eb1ca1Smrg  </varlistentry>
160837eb1ca1Smrg  <varlistentry>
160937eb1ca1Smrg    <term>
161037eb1ca1Smrg      
161137eb1ca1Smrg    </term>
161237eb1ca1Smrg    <listitem>
161337eb1ca1Smrg      <para>
161437eb1ca1SmrgYou can also pass 
161537eb1ca1Smrg<function>AnyModifier ,</function>
161637eb1ca1Smrgwhich is equivalent to issuing the grab request 
161737eb1ca1Smrgfor all possible modifier combinations (including the combination
161837eb1ca1Smrgof no modifiers).
161937eb1ca1Smrg      </para>
162037eb1ca1Smrg    </listitem>
162137eb1ca1Smrg  </varlistentry>
162237eb1ca1Smrg  <varlistentry>
162337eb1ca1Smrg    <term>
162437eb1ca1Smrg      <emphasis remap='I'>modifier_device</emphasis>
162537eb1ca1Smrg    </term>
162637eb1ca1Smrg    <listitem>
162737eb1ca1Smrg      <para>
162837eb1ca1SmrgSpecifies the device whose modifiers are to be used.  If NULL is 
162937eb1ca1Smrgspecified, the core X keyboard is used as the modifier_device.
163037eb1ca1Smrg      </para>
163137eb1ca1Smrg    </listitem>
163237eb1ca1Smrg  </varlistentry>
163337eb1ca1Smrg  <varlistentry>
163437eb1ca1Smrg    <term>
163537eb1ca1Smrg      <emphasis remap='I'>grab_window</emphasis>
163637eb1ca1Smrg    </term>
163737eb1ca1Smrg    <listitem>
163837eb1ca1Smrg      <para>
163937eb1ca1SmrgSpecifies the ID of a window associated with the device specified above.
164037eb1ca1Smrg      </para>
164137eb1ca1Smrg    </listitem>
164237eb1ca1Smrg  </varlistentry>
164337eb1ca1Smrg  <varlistentry>
164437eb1ca1Smrg    <term>
164537eb1ca1Smrg      <emphasis remap='I'>owner_events</emphasis>
164637eb1ca1Smrg    </term>
164737eb1ca1Smrg    <listitem>
164837eb1ca1Smrg      <para>
164937eb1ca1SmrgSpecifies a boolean value of either
165037eb1ca1Smrg<function>True</function>
165137eb1ca1Smrgor
165237eb1ca1Smrg<function>False .</function>
165337eb1ca1Smrg      </para>
165437eb1ca1Smrg    </listitem>
165537eb1ca1Smrg  </varlistentry>
165637eb1ca1Smrg  <varlistentry>
165737eb1ca1Smrg    <term>
165837eb1ca1Smrg      <emphasis remap='I'>event_count</emphasis>
165937eb1ca1Smrg    </term>
166037eb1ca1Smrg    <listitem>
166137eb1ca1Smrg      <para>
166237eb1ca1SmrgSpecifies the number of elements in the event_list array.
166337eb1ca1Smrg      </para>
166437eb1ca1Smrg    </listitem>
166537eb1ca1Smrg  </varlistentry>
166637eb1ca1Smrg  <varlistentry>
166737eb1ca1Smrg    <term>
166837eb1ca1Smrg      <emphasis remap='I'>event_list</emphasis>
166937eb1ca1Smrg    </term>
167037eb1ca1Smrg    <listitem>
167137eb1ca1Smrg      <para>
167237eb1ca1SmrgSpecifies a list of event classes that indicates which device events are to be 
167337eb1ca1Smrgreported to the client.
167437eb1ca1Smrg      </para>
167537eb1ca1Smrg    </listitem>
167637eb1ca1Smrg  </varlistentry>
167737eb1ca1Smrg  <varlistentry>
167837eb1ca1Smrg    <term>
167937eb1ca1Smrg      <emphasis remap='I'>this_device_mode</emphasis>
168037eb1ca1Smrg    </term>
168137eb1ca1Smrg    <listitem>
168237eb1ca1Smrg      <para>
168337eb1ca1SmrgControls further processing of events from this device.  You can pass one
168437eb1ca1Smrgof these constants:
168537eb1ca1Smrg<function>GrabModeSync</function>
168637eb1ca1Smrgor
168737eb1ca1Smrg<function>GrabModeAsync .</function>
168837eb1ca1Smrg      </para>
168937eb1ca1Smrg    </listitem>
169037eb1ca1Smrg  </varlistentry>
169137eb1ca1Smrg  <varlistentry>
169237eb1ca1Smrg    <term>
169337eb1ca1Smrg      <emphasis remap='I'>other_device_mode</emphasis>
169437eb1ca1Smrg    </term>
169537eb1ca1Smrg    <listitem>
169637eb1ca1Smrg      <para>
169737eb1ca1SmrgControls further processing of events from all other devices.  You can pass one
169837eb1ca1Smrgof these constants:
169937eb1ca1Smrg<function>GrabModeSync</function>
170037eb1ca1Smrgor
170137eb1ca1Smrg<function>GrabModeAsync .</function>
170237eb1ca1Smrg    </para>
170337eb1ca1Smrg  </listitem>
170437eb1ca1Smrg  </varlistentry>
170537eb1ca1Smrg</variablelist>
170637eb1ca1Smrg</para>
170737eb1ca1Smrg<para>
170837eb1ca1Smrg<!-- .LP -->
170937eb1ca1Smrg<!-- .eM -->
1710f1ee322dSmrg<xref linkend='XGrabDeviceButton' xrefstyle='select: title'/>
171137eb1ca1Smrgis analogous to the core
1712f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGrabButton'><function>XGrabButton</function></olink>
171337eb1ca1Smrgfunction.  
171437eb1ca1SmrgIt creates an explicit passive grab for a button on an extension input device.
171537eb1ca1SmrgBecause the server does not track extension devices,
171637eb1ca1Smrgno cursor is specified with this request.
171737eb1ca1SmrgFor the same reason, there is no confine_to parameter.
171837eb1ca1SmrgThe device must have previously been opened using the
1719f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
172037eb1ca1Smrgfunction.
172137eb1ca1Smrg</para>
172237eb1ca1Smrg<para>
172337eb1ca1Smrg<!-- .LP -->
172437eb1ca1SmrgThe
1725f1ee322dSmrg<xref linkend='XGrabDeviceButton' xrefstyle='select: title'/>
172637eb1ca1Smrgfunction establishes a passive grab on a device.
172737eb1ca1SmrgConsequently, in the future, 
172837eb1ca1Smrg</para>
172937eb1ca1Smrg<itemizedlist>
173037eb1ca1Smrg  <listitem>
173137eb1ca1Smrg    <para>
173237eb1ca1SmrgIF the device is not grabbed and the specified button is logically pressed
173337eb1ca1Smrgwhen the specified modifier keys logically are down 
173437eb1ca1Smrg(and no other buttons or modifier keys are down),
173537eb1ca1Smrg    </para>
173637eb1ca1Smrg  </listitem>
173737eb1ca1Smrg  <listitem>
173837eb1ca1Smrg    <para>
173937eb1ca1SmrgAND EITHER the grab window is an ancestor of (or is) the focus window
174037eb1ca1SmrgOR the grab window is a descendent of the focus window and contains the pointer,
174137eb1ca1Smrg    </para>
174237eb1ca1Smrg  </listitem>
174337eb1ca1Smrg  <listitem>
174437eb1ca1Smrg    <para>
174537eb1ca1SmrgAND a passive grab on the same device and button/key combination does not 
174637eb1ca1Smrgexist on any ancestor of the grab window,
174737eb1ca1Smrg    </para>
174837eb1ca1Smrg  </listitem>
174937eb1ca1Smrg  <listitem>
175037eb1ca1Smrg    <para>
175137eb1ca1SmrgTHEN the device is actively grabbed, as for
175237eb1ca1Smrg<function>XGrabDevice ,</function>
175337eb1ca1Smrgthe last-grab time is set to the time at which the button was pressed
175437eb1ca1Smrg(as transmitted in the
175537eb1ca1Smrg<function>DeviceButtonPress</function>
175637eb1ca1Smrgevent), and the 
175737eb1ca1Smrg<function>DeviceButtonPress</function>
175837eb1ca1Smrgevent is reported.
175937eb1ca1Smrg    </para>
176037eb1ca1Smrg  </listitem>
176137eb1ca1Smrg</itemizedlist>
176237eb1ca1Smrg<para>
176337eb1ca1Smrg<!-- .LP -->
176437eb1ca1SmrgThe interpretation of the remaining arguments is as for 
176537eb1ca1Smrg<function>XGrabDevice .</function>
176637eb1ca1SmrgThe active grab is terminated automatically when logical state of the
176737eb1ca1Smrgdevice has all buttons released (independent of the logical state of 
176837eb1ca1Smrgthe modifier keys).
176937eb1ca1Smrg</para>
177037eb1ca1Smrg<para>
177137eb1ca1Smrg<!-- .LP -->
177237eb1ca1SmrgNote that the logical state of a device (as seen by means of the X protocol)
177337eb1ca1Smrgmay lag the physical state if device event processing is frozen.
177437eb1ca1Smrg</para>
177537eb1ca1Smrg<para>
177637eb1ca1Smrg<!-- .LP -->
177737eb1ca1SmrgA modifier of
177837eb1ca1Smrg<function>AnyModifier</function>
177937eb1ca1Smrgis equivalent to issuing the request for all
178037eb1ca1Smrgpossible modifier combinations (including the combination of no
178137eb1ca1Smrgmodifiers).  
178237eb1ca1SmrgIt is not required that all modifiers specified have
178337eb1ca1Smrgcurrently assigned keycodes.
178437eb1ca1SmrgA button of
178537eb1ca1Smrg<function>AnyButton</function>
178637eb1ca1Smrgis equivalent to issuing
178737eb1ca1Smrgthe request for all possible buttons.
178837eb1ca1SmrgOtherwise, it is not required that the 
178937eb1ca1Smrgspecified button be assigned to a physical button.
179037eb1ca1Smrg</para>
179137eb1ca1Smrg<para>
179237eb1ca1Smrg<!-- .LP -->
1793f1ee322dSmrg<xref linkend='XGrabDeviceButton' xrefstyle='select: title'/>
179437eb1ca1Smrggenerates a
179537eb1ca1Smrg<function>BadAccess</function>
179637eb1ca1Smrgerror if some other client has issued a 
1797f1ee322dSmrg<xref linkend='XGrabDeviceButton' xrefstyle='select: title'/>
179837eb1ca1Smrgwith the same device and button combination on the same window.  
179937eb1ca1SmrgWhen using
180037eb1ca1Smrg<function>AnyModifier</function>
180137eb1ca1Smrgor
180237eb1ca1Smrg<function>AnyButton ,</function>
180337eb1ca1Smrgthe request fails completely and the X server generates a
180437eb1ca1Smrg<function>BadAccess</function>
180537eb1ca1Smrgerror and no grabs are
180637eb1ca1Smrgestablished if there is a conflicting grab for any combination.
180737eb1ca1Smrg</para>
180837eb1ca1Smrg<para>
180937eb1ca1Smrg<!-- .LP -->
1810f1ee322dSmrg<xref linkend='XGrabDeviceButton' xrefstyle='select: title'/>
181137eb1ca1Smrgcan generate
181237eb1ca1Smrg<function>BadAccess , </function>
181337eb1ca1Smrg<function>BadClass ,</function>
181437eb1ca1Smrg<function>BadDevice ,</function>
181537eb1ca1Smrg<function>BadMatch ,</function>
181637eb1ca1Smrg<function>BadValue ,</function>
181737eb1ca1Smrgand
181837eb1ca1Smrg<function>BadWindow</function>
181937eb1ca1Smrgerrors.
182037eb1ca1Smrg<!-- .sp -->
182137eb1ca1Smrg</para>
182237eb1ca1Smrg<para>
182337eb1ca1Smrg<!-- .LP -->
182437eb1ca1SmrgTo release a passive grab of a button on an extension device, use 
182537eb1ca1Smrg<function>XUngrabDeviceButton .</function>
182637eb1ca1Smrg<!-- .sM -->
1827f1ee322dSmrg<funcsynopsis id='XUngrabDeviceButton'>
182837eb1ca1Smrg<funcprototype>
182937eb1ca1Smrg  <funcdef>int <function> XUngrabDeviceButton</function></funcdef>
183037eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
183137eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
183237eb1ca1Smrg  <paramdef>unsignedint<parameter> button</parameter></paramdef>
183337eb1ca1Smrg  <paramdef>unsignedint<parameter> modifiers</parameter></paramdef>
183437eb1ca1Smrg  <paramdef>XDevice<parameter> *modifier_device</parameter></paramdef>
183537eb1ca1Smrg  <paramdef>Window<parameter> ungrab_window</parameter></paramdef>
183637eb1ca1Smrg</funcprototype>
183737eb1ca1Smrg</funcsynopsis>
183837eb1ca1Smrg<!-- .FN -->
183937eb1ca1Smrg<variablelist>
184037eb1ca1Smrg  <varlistentry>
184137eb1ca1Smrg    <term>
184237eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
184337eb1ca1Smrg    </term>
184437eb1ca1Smrg    <listitem>
184537eb1ca1Smrg      <para>
184637eb1ca1SmrgSpecifies the connection to the X server.
184737eb1ca1Smrg      </para>
184837eb1ca1Smrg    </listitem>
184937eb1ca1Smrg  </varlistentry>
185037eb1ca1Smrg  <varlistentry>
185137eb1ca1Smrg    <term>
185237eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
185337eb1ca1Smrg    </term>
185437eb1ca1Smrg    <listitem>
185537eb1ca1Smrg      <para>
185637eb1ca1SmrgSpecifies the desired device.
185737eb1ca1Smrg      </para>
185837eb1ca1Smrg    </listitem>
185937eb1ca1Smrg  </varlistentry>
186037eb1ca1Smrg  <varlistentry>
186137eb1ca1Smrg    <term>
186237eb1ca1Smrg      <emphasis remap='I'>button</emphasis>
186337eb1ca1Smrg    </term>
186437eb1ca1Smrg    <listitem>
186537eb1ca1Smrg      <para>
186637eb1ca1SmrgSpecifies the code of the button that is to be ungrabbed.  You can pass
186737eb1ca1Smrgeither a button or
186837eb1ca1Smrg<function>AnyButton .</function>
186937eb1ca1Smrg      </para>
187037eb1ca1Smrg    </listitem>
187137eb1ca1Smrg  </varlistentry>
187237eb1ca1Smrg  <varlistentry>
187337eb1ca1Smrg    <term>
187437eb1ca1Smrg      <emphasis remap='I'>modifiers</emphasis>
187537eb1ca1Smrg    </term>
187637eb1ca1Smrg    <listitem>
187737eb1ca1Smrg      <para>
187837eb1ca1SmrgSpecifies the set of keymasks.  This mask is the bitwise inclusive OR
187937eb1ca1Smrgof these keymask bits:
188037eb1ca1Smrg<function>ShiftMask ,</function>
188137eb1ca1Smrg<function>LockMask ,</function>
188237eb1ca1Smrg<function>ControlMask , </function>
188337eb1ca1Smrg<function>Mod1Mask ,</function>
188437eb1ca1Smrg<function>Mod2Mask ,</function>
188537eb1ca1Smrg<function>Mod3Mask ,</function>
188637eb1ca1Smrg<function>Mod4Mask ,</function>
188737eb1ca1Smrgand
188837eb1ca1Smrg<function>Mod5Mask .</function>
188937eb1ca1Smrg      </para>
189037eb1ca1Smrg    </listitem>
189137eb1ca1Smrg  </varlistentry>
189237eb1ca1Smrg  <varlistentry>
189337eb1ca1Smrg    <term>
189437eb1ca1Smrg      
189537eb1ca1Smrg    </term>
189637eb1ca1Smrg    <listitem>
189737eb1ca1Smrg      <para>
189837eb1ca1SmrgYou can also pass
189937eb1ca1Smrg<function>AnyModifier ,</function>
190037eb1ca1Smrgwhich is equivalent to issuing the ungrab key 
190137eb1ca1Smrgrequest for all possible modifier combinations (including the combination
190237eb1ca1Smrgof no modifiers).
190337eb1ca1Smrg      </para>
190437eb1ca1Smrg    </listitem>
190537eb1ca1Smrg  </varlistentry>
190637eb1ca1Smrg  <varlistentry>
190737eb1ca1Smrg    <term>
190837eb1ca1Smrg      <emphasis remap='I'>modifier_device</emphasis>
190937eb1ca1Smrg    </term>
191037eb1ca1Smrg    <listitem>
191137eb1ca1Smrg      <para>
191237eb1ca1SmrgSpecifies the device whose modifiers are to be used.  If NULL is 
191337eb1ca1Smrgspecified, the core X keyboard is used as the modifier_device.
191437eb1ca1Smrg      </para>
191537eb1ca1Smrg    </listitem>
191637eb1ca1Smrg  </varlistentry>
191737eb1ca1Smrg  <varlistentry>
191837eb1ca1Smrg    <term>
191937eb1ca1Smrg      <emphasis remap='I'>ungrab_window</emphasis>
192037eb1ca1Smrg    </term>
192137eb1ca1Smrg    <listitem>
192237eb1ca1Smrg      <para>
192337eb1ca1SmrgSpecifies the ID of a window associated with the device specified above.
192437eb1ca1Smrg    </para>
192537eb1ca1Smrg  </listitem>
192637eb1ca1Smrg  </varlistentry>
192737eb1ca1Smrg</variablelist>
192837eb1ca1Smrg</para>
192937eb1ca1Smrg<para>
193037eb1ca1Smrg<!-- .LP -->
193137eb1ca1Smrg<!-- .eM -->
1932f1ee322dSmrg<xref linkend='XUngrabDeviceButton' xrefstyle='select: title'/>
193337eb1ca1Smrgis analogous to the core
1934f1ee322dSmrg<olink targetdoc='libX11' targetptr='XUngrabButton'><function>XUngrabButton</function></olink>
193537eb1ca1Smrgfunction.  It releases an explicit passive grab for a button
193637eb1ca1Smrgon an extension device.
193737eb1ca1SmrgThat device must have previously been opened using the
1938f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
193937eb1ca1Smrgfunction, or a
194037eb1ca1Smrg<function>BadDevice</function>
194137eb1ca1Smrgerror will result.
194237eb1ca1Smrg</para>
194337eb1ca1Smrg<para>
194437eb1ca1Smrg<!-- .LP -->
194537eb1ca1SmrgA modifier of
194637eb1ca1Smrg<function>AnyModifier</function>
194737eb1ca1Smrgis equivalent to issuing the request for all
194837eb1ca1Smrgpossible modifier combinations (including the combination of no
194937eb1ca1Smrgmodifiers).  
195037eb1ca1Smrg</para>
195137eb1ca1Smrg<para>
195237eb1ca1Smrg<!-- .LP -->
1953f1ee322dSmrg<xref linkend='XUngrabDeviceButton' xrefstyle='select: title'/>
195437eb1ca1Smrgcan generate
195537eb1ca1Smrg<function>BadAlloc , </function>
195637eb1ca1Smrg<function>BadDevice ,</function>
195737eb1ca1Smrg<function>BadMatch ,</function>
195837eb1ca1Smrg<function>BadValue ,</function>
195937eb1ca1Smrgand
196037eb1ca1Smrg<function>BadWindow</function>
196137eb1ca1Smrgerrors.
196237eb1ca1Smrg</para>
196337eb1ca1Smrg</sect3>
196437eb1ca1Smrg<sect3 id="Thawing_a_Device">
196537eb1ca1Smrg<title>Thawing a Device</title>
196637eb1ca1Smrg<!-- .XS -->
196737eb1ca1Smrg<!-- (SN Thawing a Device -->
196837eb1ca1Smrg<!-- .XE -->
196937eb1ca1Smrg<para>
197037eb1ca1Smrg<!-- .LP -->
197137eb1ca1SmrgTo allow further events to be processed when a device has been frozen, use
197237eb1ca1Smrg<function>XAllowDeviceEvents .</function>
197337eb1ca1Smrg<!-- .sM -->
1974f1ee322dSmrg<funcsynopsis id='XAllowDeviceEvents'>
197537eb1ca1Smrg<funcprototype>
197637eb1ca1Smrg  <funcdef>int <function> XAllowDeviceEvents</function></funcdef>
197737eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
197837eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
197937eb1ca1Smrg  <paramdef>int<parameter> event_mode</parameter></paramdef>
198037eb1ca1Smrg  <paramdef>Time<parameter> time</parameter></paramdef>
198137eb1ca1Smrg</funcprototype>
198237eb1ca1Smrg</funcsynopsis>
198337eb1ca1Smrg<!-- .FN -->
198437eb1ca1Smrg<variablelist>
198537eb1ca1Smrg  <varlistentry>
198637eb1ca1Smrg    <term>
198737eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
198837eb1ca1Smrg    </term>
198937eb1ca1Smrg    <listitem>
199037eb1ca1Smrg      <para>
199137eb1ca1SmrgSpecifies the connection to the X server.
199237eb1ca1Smrg      </para>
199337eb1ca1Smrg    </listitem>
199437eb1ca1Smrg  </varlistentry>
199537eb1ca1Smrg  <varlistentry>
199637eb1ca1Smrg    <term>
199737eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
199837eb1ca1Smrg    </term>
199937eb1ca1Smrg    <listitem>
200037eb1ca1Smrg      <para>
200137eb1ca1SmrgSpecifies the desired device.
200237eb1ca1Smrg      </para>
200337eb1ca1Smrg    </listitem>
200437eb1ca1Smrg  </varlistentry>
200537eb1ca1Smrg  <varlistentry>
200637eb1ca1Smrg    <term>
200737eb1ca1Smrg      <emphasis remap='I'>event_mode</emphasis>
200837eb1ca1Smrg    </term>
200937eb1ca1Smrg    <listitem>
201037eb1ca1Smrg      <para>
201137eb1ca1SmrgSpecifies the event mode.  You can pass one of these constants:
201237eb1ca1Smrg<function>AsyncThisDevice ,</function>
201337eb1ca1Smrg<function>SyncThisDevice ,</function>
201437eb1ca1Smrg<function>AsyncOtherDevices ,</function>
201537eb1ca1Smrg<function>ReplayThisDevice ,</function>
201637eb1ca1Smrg<function>AsyncAll ,</function>
201737eb1ca1Smrgor
201837eb1ca1Smrg<function>SyncAll .</function>
201937eb1ca1Smrg      </para>
202037eb1ca1Smrg    </listitem>
202137eb1ca1Smrg  </varlistentry>
202237eb1ca1Smrg  <varlistentry>
202337eb1ca1Smrg    <term>
202437eb1ca1Smrg      <emphasis remap='I'>time</emphasis>
202537eb1ca1Smrg    </term>
202637eb1ca1Smrg    <listitem>
202737eb1ca1Smrg      <para>
202837eb1ca1SmrgSpecifies the time.  This may be either a timestamp expressed in
202937eb1ca1Smrgmilliseconds, or
203037eb1ca1Smrg<function>CurrentTime .</function>
203137eb1ca1Smrg    </para>
203237eb1ca1Smrg  </listitem>
203337eb1ca1Smrg  </varlistentry>
203437eb1ca1Smrg</variablelist>
203537eb1ca1Smrg</para>
203637eb1ca1Smrg<para>
203737eb1ca1Smrg<!-- .LP -->
203837eb1ca1Smrg<!-- .eM -->
2039f1ee322dSmrg<xref linkend='XAllowDeviceEvents' xrefstyle='select: title'/>
204037eb1ca1Smrgreleases some queued events if the client has caused a device to freeze.
204137eb1ca1SmrgIt has no effect if the specified time is earlier than the last-grab 
204237eb1ca1Smrgtime of the most recent active grab for the client and device, 
204337eb1ca1Smrgor if the specified time is later than the current X server time.
204437eb1ca1SmrgThe following describes the processing that occurs depending on what constant
204537eb1ca1Smrgyou pass to the event_mode argument:
204637eb1ca1Smrg</para>
204737eb1ca1Smrg<itemizedlist>
204837eb1ca1Smrg  <listitem>
204937eb1ca1Smrg    <para>
205037eb1ca1Smrg<function>AsyncThisDevice</function>
205137eb1ca1Smrg    </para>
205237eb1ca1Smrg  </listitem>
205337eb1ca1Smrg  <listitem>
205437eb1ca1Smrg    <para>
205537eb1ca1SmrgIf the specified device is frozen by the client, event processing for that 
205637eb1ca1Smrgcontinues as usual.  If the device is frozen multiple times by the client on 
205737eb1ca1Smrgbehalf of multiple separate grabs, 
205837eb1ca1Smrg<function>AsyncThisDevice</function>
205937eb1ca1Smrgthaws for all.
206037eb1ca1Smrg<function>AsyncThisDevice</function>
206137eb1ca1Smrghas no effect if the specified device is not frozen by the 
206237eb1ca1Smrgclient, but the device need not be grabbed by the client.
206337eb1ca1Smrg    </para>
206437eb1ca1Smrg  </listitem>
206537eb1ca1Smrg  <listitem>
206637eb1ca1Smrg    <para>
206737eb1ca1Smrg<function>SyncThisDevice</function>
206837eb1ca1Smrg    </para>
206937eb1ca1Smrg  </listitem>
207037eb1ca1Smrg  <listitem>
207137eb1ca1Smrg    <para>
207237eb1ca1SmrgIf the specified device is frozen and actively grabbed by the client,
207337eb1ca1Smrgevent processing for that device continues normally until the next 
207437eb1ca1Smrgkey or button event is reported to the client.
207537eb1ca1SmrgAt this time, 
207637eb1ca1Smrgthe specified device again appears to freeze.
207737eb1ca1SmrgHowever, if the reported event causes the grab to be released,
207837eb1ca1Smrgthe specified device does not freeze.
207937eb1ca1Smrg<function>SyncThisDevice</function>
208037eb1ca1Smrghas no effect if the specified device is not frozen by the client
208137eb1ca1Smrgor is not grabbed by the client.
208237eb1ca1Smrg    </para>
208337eb1ca1Smrg  </listitem>
208437eb1ca1Smrg  <listitem>
208537eb1ca1Smrg    <para>
208637eb1ca1Smrg<function>ReplayThisDevice</function>
208737eb1ca1Smrg    </para>
208837eb1ca1Smrg  </listitem>
208937eb1ca1Smrg  <listitem>
209037eb1ca1Smrg    <para>
209137eb1ca1SmrgIf the specified device is actively grabbed by the client
209237eb1ca1Smrgand is frozen as the result of an event having been sent to the client
209337eb1ca1Smrg(either from the activation of a 
209437eb1ca1Smrg<function>GrabDeviceButton</function>
209537eb1ca1Smrgor from a previous
209637eb1ca1Smrg<function>AllowDeviceEvents</function>
209737eb1ca1Smrgwith mode 
209837eb1ca1Smrg<function>SyncThisDevice , </function>
209937eb1ca1Smrgbut not from a
210037eb1ca1Smrg<function>Grab ),</function>
210137eb1ca1Smrgthe grab is released and that event is completely reprocessed.
210237eb1ca1SmrgThis time, however, the request ignores any passive grabs at or above 
210337eb1ca1Smrg(toward the root) the grab-window of the grab just released.
210437eb1ca1SmrgThe request has no effect if the specified device is not grabbed by the client
210537eb1ca1Smrgor if it is not frozen as the result of an event.
210637eb1ca1Smrg    </para>
210737eb1ca1Smrg  </listitem>
210837eb1ca1Smrg  <listitem>
210937eb1ca1Smrg    <para>
211037eb1ca1Smrg<function>AsyncOtherDevices</function>
211137eb1ca1Smrg    </para>
211237eb1ca1Smrg  </listitem>
211337eb1ca1Smrg  <listitem>
211437eb1ca1Smrg    <para>
211537eb1ca1SmrgIf the remaining devices are frozen by the client,
211637eb1ca1Smrgevent processing for them continues as usual.
211737eb1ca1SmrgIf the other devices are frozen multiple times  by the client on behalf of 
211837eb1ca1Smrgmultiple separate grabs,
211937eb1ca1Smrg<function>AsyncOtherDevices</function>
212037eb1ca1Smrg``thaws'' for all.
212137eb1ca1Smrg<function>AsyncOtherDevices</function>
212237eb1ca1Smrghas no effect if the devices are not frozen by the client,
212337eb1ca1Smrgbut those devices need not be grabbed by the client.
212437eb1ca1Smrg    </para>
212537eb1ca1Smrg  </listitem>
212637eb1ca1Smrg  <listitem>
212737eb1ca1Smrg    <para>
212837eb1ca1Smrg<function>SyncAll</function>
212937eb1ca1Smrg    </para>
213037eb1ca1Smrg  </listitem>
213137eb1ca1Smrg  <listitem>
213237eb1ca1Smrg    <para>
213337eb1ca1SmrgIf all devices are frozen by the client,
213437eb1ca1Smrgevent processing (for all devices) continues normally until the next
213537eb1ca1Smrgbutton or key event is reported
213637eb1ca1Smrgto the client for a grabbed device,
213737eb1ca1Smrgat which time the devices again appear to
213837eb1ca1Smrgfreeze.  However, if the reported event causes the grab to be released,
213937eb1ca1Smrgthen the devices do not freeze (but if any device is still
214037eb1ca1Smrggrabbed, then a subsequent event for it will still cause all devices
214137eb1ca1Smrgto freeze).  
214237eb1ca1Smrg<function>SyncAll</function>
214337eb1ca1Smrghas no effect unless all devices are frozen by the client.
214437eb1ca1SmrgIf any device is frozen twice
214537eb1ca1Smrgby the client on behalf of two separate grabs, 
214637eb1ca1Smrg<function>SyncAll</function>
214737eb1ca1Smrg"thaws" for both (but a subsequent freeze for 
214837eb1ca1Smrg<function>SyncAll</function>
214937eb1ca1Smrgwill freeze each device only once).
215037eb1ca1Smrg    </para>
215137eb1ca1Smrg  </listitem>
215237eb1ca1Smrg  <listitem>
215337eb1ca1Smrg    <para>
215437eb1ca1Smrg<function>AsyncAll</function>
215537eb1ca1Smrg    </para>
215637eb1ca1Smrg  </listitem>
215737eb1ca1Smrg  <listitem>
215837eb1ca1Smrg    <para>
215937eb1ca1SmrgIf all devices are frozen by the
216037eb1ca1Smrgclient, event processing (for all devices) continues normally.
216137eb1ca1SmrgIf any device is frozen multiple times by the client on behalf of multiple
216237eb1ca1Smrgseparate grabs, 
216337eb1ca1Smrg<function>AsyncAll</function>
216437eb1ca1Smrg``thaws ''for all.
216537eb1ca1SmrgIf any device is frozen twice by the client on behalf of two separate grabs,
216637eb1ca1Smrg<function>AsyncAll</function>
216737eb1ca1Smrg``thaws'' for both.
216837eb1ca1Smrg<function>AsyncAll</function>
216937eb1ca1Smrghas no effect unless all devices are frozen by the client.
217037eb1ca1Smrg    </para>
217137eb1ca1Smrg  </listitem>
217237eb1ca1Smrg</itemizedlist>
217337eb1ca1Smrg<para>
217437eb1ca1Smrg<!-- .LP -->
217537eb1ca1Smrg<function>AsyncThisDevice ,</function>
217637eb1ca1Smrg<function>SyncThisDevice ,</function>
217737eb1ca1Smrgand
217837eb1ca1Smrg<function>ReplayThisDevice </function>
217937eb1ca1Smrghave no effect on the processing of events from the remaining devices.
218037eb1ca1Smrg<function>AsyncOtherDevices</function>
218137eb1ca1Smrghas no effect on the processing of events from the specified device.
218237eb1ca1SmrgWhen the event_mode is
218337eb1ca1Smrg<function>SyncAll</function>
218437eb1ca1Smrgor
218537eb1ca1Smrg<function>AsyncAll ,</function>
218637eb1ca1Smrgthe device parameter is ignored.
218737eb1ca1Smrg</para>
218837eb1ca1Smrg<para>
218937eb1ca1Smrg<!-- .LP -->
219037eb1ca1SmrgIt is possible for several grabs of different devices (by the same 
219137eb1ca1Smrgor different clients) to be active simultaneously.
219237eb1ca1SmrgIf a device is frozen on behalf of any grab,
219337eb1ca1Smrgno event processing is performed for the device.
219437eb1ca1SmrgIt is possible for a single device to be frozen because of several grabs.
219537eb1ca1SmrgIn this case,
219637eb1ca1Smrgthe freeze must be released on behalf of each grab before events can 
219737eb1ca1Smrgagain be processed.
219837eb1ca1Smrg</para>
219937eb1ca1Smrg<para>
220037eb1ca1Smrg<!-- .LP -->
2201f1ee322dSmrg<xref linkend='XAllowDeviceEvents' xrefstyle='select: title'/>
220237eb1ca1Smrgcan generate
220337eb1ca1Smrg<function>BadDevice</function>
220437eb1ca1Smrgand 
220537eb1ca1Smrg<function>BadValue</function>
220637eb1ca1Smrgerrors.
220737eb1ca1Smrg</para>
220837eb1ca1Smrg</sect3>
220937eb1ca1Smrg<sect3 id="Controlling_Device_Focus">
221037eb1ca1Smrg<title>Controlling Device Focus</title>
221137eb1ca1Smrg<!-- .XS -->
221237eb1ca1Smrg<!-- (SN Controlling Device Focus -->
221337eb1ca1Smrg<!-- .XE -->
221437eb1ca1Smrg<para>
221537eb1ca1Smrg<!-- .LP -->
221637eb1ca1SmrgThe current focus window for an extension input device can be 
221737eb1ca1Smrgdetermined using the
2218f1ee322dSmrg<xref linkend='XGetDeviceFocus' xrefstyle='select: title'/>
221937eb1ca1Smrgfunction.
222037eb1ca1SmrgExtension devices are focused using the
2221f1ee322dSmrg<xref linkend='XSetDeviceFocus' xrefstyle='select: title'/>
222237eb1ca1Smrgfunction in the same way that the keyboard is focused using the core
2223f1ee322dSmrg<olink targetdoc='libX11' targetptr='XSetInputFocus'><function>XSetInputFocus</function></olink>
222437eb1ca1Smrgfunction, except that a device ID is passed as
222537eb1ca1Smrga function parameter.  One additional focus state,
222637eb1ca1Smrg<function>FollowKeyboard ,</function>
222737eb1ca1Smrgis provided for extension devices.
222837eb1ca1Smrg</para>
222937eb1ca1Smrg<para>
223037eb1ca1Smrg<!-- .LP -->
223137eb1ca1SmrgTo get the current focus state, revert state,
223237eb1ca1Smrgand focus time of an extension device, use
223337eb1ca1Smrg<function>XGetDeviceFocus .</function>
223437eb1ca1Smrg<!-- .sM -->
2235f1ee322dSmrg<funcsynopsis id='XGetDeviceFocus'>
223637eb1ca1Smrg<funcprototype>
223737eb1ca1Smrg  <funcdef>int <function> XGetDeviceFocus</function></funcdef>
223837eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
223937eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
224037eb1ca1Smrg  <paramdef>Window<parameter> *focus_return</parameter></paramdef>
224137eb1ca1Smrg  <paramdef>int<parameter> *revert_to_return</parameter></paramdef>
224237eb1ca1Smrg  <paramdef>Time<parameter> *focus_time_return</parameter></paramdef>
224337eb1ca1Smrg</funcprototype>
224437eb1ca1Smrg</funcsynopsis>
224537eb1ca1Smrg<!-- .FN -->
224637eb1ca1Smrg<variablelist>
224737eb1ca1Smrg  <varlistentry>
224837eb1ca1Smrg    <term>
224937eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
225037eb1ca1Smrg    </term>
225137eb1ca1Smrg    <listitem>
225237eb1ca1Smrg      <para>
225337eb1ca1SmrgSpecifies the connection to the X server.
225437eb1ca1Smrg      </para>
225537eb1ca1Smrg    </listitem>
225637eb1ca1Smrg  </varlistentry>
225737eb1ca1Smrg  <varlistentry>
225837eb1ca1Smrg    <term>
225937eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
226037eb1ca1Smrg    </term>
226137eb1ca1Smrg    <listitem>
226237eb1ca1Smrg      <para>
226337eb1ca1SmrgSpecifies the desired device.
226437eb1ca1Smrg      </para>
226537eb1ca1Smrg    </listitem>
226637eb1ca1Smrg  </varlistentry>
226737eb1ca1Smrg  <varlistentry>
226837eb1ca1Smrg    <term>
226937eb1ca1Smrg      <emphasis remap='I'>focus_return</emphasis>
227037eb1ca1Smrg    </term>
227137eb1ca1Smrg    <listitem>
227237eb1ca1Smrg      <para>
227337eb1ca1SmrgSpecifies the address of a variable into which the server can return the ID of
227437eb1ca1Smrgthe window that contains the device focus or one of the constants
227537eb1ca1Smrg<function>None ,</function>
227637eb1ca1Smrg<function>PointerRoot ,</function>
227737eb1ca1Smrgor
227837eb1ca1Smrg<function>FollowKeyboard .  </function>
227937eb1ca1Smrg      </para>
228037eb1ca1Smrg    </listitem>
228137eb1ca1Smrg  </varlistentry>
228237eb1ca1Smrg  <varlistentry>
228337eb1ca1Smrg    <term>
228437eb1ca1Smrg      <emphasis remap='I'>revert_to_return</emphasis>
228537eb1ca1Smrg    </term>
228637eb1ca1Smrg    <listitem>
228737eb1ca1Smrg      <para>
228837eb1ca1SmrgSpecifies the address of a variable into which the server can
228937eb1ca1Smrgreturn the current revert_to status for the device.
229037eb1ca1Smrg      </para>
229137eb1ca1Smrg    </listitem>
229237eb1ca1Smrg  </varlistentry>
229337eb1ca1Smrg  <varlistentry>
229437eb1ca1Smrg    <term>
229537eb1ca1Smrg      <emphasis remap='I'>focus_time_return</emphasis>
229637eb1ca1Smrg    </term>
229737eb1ca1Smrg    <listitem>
229837eb1ca1Smrg      <para>
229937eb1ca1SmrgSpecifies the address of a variable into which the server can
230037eb1ca1Smrgreturn the focus time last set for the device.
230137eb1ca1Smrg    </para>
230237eb1ca1Smrg  </listitem>
230337eb1ca1Smrg  </varlistentry>
230437eb1ca1Smrg</variablelist>
230537eb1ca1Smrg</para>
230637eb1ca1Smrg<para>
230737eb1ca1Smrg<!-- .LP -->
230837eb1ca1Smrg<!-- .eM -->
2309f1ee322dSmrg<xref linkend='XGetDeviceFocus' xrefstyle='select: title'/>
231037eb1ca1Smrgreturns the focus state, the revert-to state,
231137eb1ca1Smrgand the last-focus-time for an extension input device.
231237eb1ca1Smrg</para>
231337eb1ca1Smrg<para>
231437eb1ca1Smrg<!-- .LP -->
2315f1ee322dSmrg<xref linkend='XGetDeviceFocus' xrefstyle='select: title'/>
231637eb1ca1Smrgcan generate
231737eb1ca1Smrg<function>BadDevice</function>
231837eb1ca1Smrgand
231937eb1ca1Smrg<function>BadMatch</function>
232037eb1ca1Smrgerrors.
232137eb1ca1Smrg<!-- .sp  -->
232237eb1ca1Smrg</para>
232337eb1ca1Smrg<para>
232437eb1ca1Smrg<!-- .LP -->
232537eb1ca1SmrgTo set the focus of an extension device, use
232637eb1ca1Smrg<function>XSetDeviceFocus .</function>
232737eb1ca1Smrg<!-- .sM -->
2328f1ee322dSmrg<funcsynopsis id='XSetDeviceFocus'>
232937eb1ca1Smrg<funcprototype>
233037eb1ca1Smrg  <funcdef>int <function> XSetDeviceFocus</function></funcdef>
233137eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
233237eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
233337eb1ca1Smrg  <paramdef>Window<parameter> focus</parameter></paramdef>
233437eb1ca1Smrg  <paramdef>int<parameter> revert_to</parameter></paramdef>
233537eb1ca1Smrg  <paramdef>Time<parameter> time</parameter></paramdef>
233637eb1ca1Smrg</funcprototype>
233737eb1ca1Smrg</funcsynopsis>
233837eb1ca1Smrg<!-- .FN -->
233937eb1ca1Smrg<variablelist>
234037eb1ca1Smrg  <varlistentry>
234137eb1ca1Smrg    <term>
234237eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
234337eb1ca1Smrg    </term>
234437eb1ca1Smrg    <listitem>
234537eb1ca1Smrg      <para>
234637eb1ca1SmrgSpecifies the connection to the X server.
234737eb1ca1Smrg      </para>
234837eb1ca1Smrg    </listitem>
234937eb1ca1Smrg  </varlistentry>
235037eb1ca1Smrg  <varlistentry>
235137eb1ca1Smrg    <term>
235237eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
235337eb1ca1Smrg    </term>
235437eb1ca1Smrg    <listitem>
235537eb1ca1Smrg      <para>
235637eb1ca1SmrgSpecifies the desired device.
235737eb1ca1Smrg      </para>
235837eb1ca1Smrg    </listitem>
235937eb1ca1Smrg  </varlistentry>
236037eb1ca1Smrg  <varlistentry>
236137eb1ca1Smrg    <term>
236237eb1ca1Smrg      <emphasis remap='I'>focus</emphasis>
236337eb1ca1Smrg    </term>
236437eb1ca1Smrg    <listitem>
236537eb1ca1Smrg      <para>
236637eb1ca1SmrgSpecifies the ID of the window to which the device's focus should be set.
236737eb1ca1SmrgThis may be a window ID, or
236837eb1ca1Smrg<function>PointerRoot ,</function>
236937eb1ca1Smrg<function>FollowKeyboard ,</function>
237037eb1ca1Smrgor
237137eb1ca1Smrg<function>None .</function>
237237eb1ca1Smrg      </para>
237337eb1ca1Smrg    </listitem>
237437eb1ca1Smrg  </varlistentry>
237537eb1ca1Smrg  <varlistentry>
237637eb1ca1Smrg    <term>
237737eb1ca1Smrg      <emphasis remap='I'>revert_to</emphasis>
237837eb1ca1Smrg    </term>
237937eb1ca1Smrg    <listitem>
238037eb1ca1Smrg      <para>
238137eb1ca1SmrgSpecifies to which window the focus of the device should revert
238237eb1ca1Smrgif the focus window becomes not viewable.  One of the following
238337eb1ca1Smrgconstants may be passed:
238437eb1ca1Smrg<function>RevertToParent ,</function>
238537eb1ca1Smrg<function>RevertToPointerRoot ,</function>
238637eb1ca1Smrg<function>RevertToNone ,</function>
238737eb1ca1Smrgor
238837eb1ca1Smrg<function>RevertToFollowKeyboard .</function>
238937eb1ca1Smrg      </para>
239037eb1ca1Smrg    </listitem>
239137eb1ca1Smrg  </varlistentry>
239237eb1ca1Smrg  <varlistentry>
239337eb1ca1Smrg    <term>
239437eb1ca1Smrg      <emphasis remap='I'>time</emphasis>
239537eb1ca1Smrg    </term>
239637eb1ca1Smrg    <listitem>
239737eb1ca1Smrg      <para>
239837eb1ca1SmrgSpecifies the time.  You can pass either a timestamp, expressed in
239937eb1ca1Smrgmilliseconds, or
240037eb1ca1Smrg<function>CurrentTime .</function>
240137eb1ca1Smrg    </para>
240237eb1ca1Smrg  </listitem>
240337eb1ca1Smrg  </varlistentry>
240437eb1ca1Smrg</variablelist>
240537eb1ca1Smrg</para>
240637eb1ca1Smrg<para>
240737eb1ca1Smrg<!-- .LP -->
240837eb1ca1Smrg<!-- .eM -->
2409f1ee322dSmrg<xref linkend='XSetDeviceFocus' xrefstyle='select: title'/>
241037eb1ca1Smrgchanges the focus for an extension input device and the 
241137eb1ca1Smrglast-focus-change-time.  It has no effect if the specified 
241237eb1ca1Smrgtime is earlier than the last-focus-change-time or is later than the
241337eb1ca1Smrgcurrent X server time.  Otherwise, the last-focus-change-time is set to the
241437eb1ca1Smrgspecified time.
241537eb1ca1SmrgThis function causes the X server to generate
241637eb1ca1Smrg<function>DeviceFocusIn</function>
241737eb1ca1Smrgand 
241837eb1ca1Smrg<function>DeviceFocusOut</function>
241937eb1ca1Smrgevents.
242037eb1ca1Smrg</para>
242137eb1ca1Smrg<para>
242237eb1ca1Smrg<!-- .LP -->
242337eb1ca1SmrgThe action taken by the server when this function is requested depends
242437eb1ca1Smrgon the value of the focus argument:
242537eb1ca1Smrg</para>
242637eb1ca1Smrg<itemizedlist>
242737eb1ca1Smrg  <listitem>
242837eb1ca1Smrg    <para>
242937eb1ca1SmrgIf the focus argument is
243037eb1ca1Smrg<function>None ,</function>
243137eb1ca1Smrgall input events from this device will be discarded until a new focus window
243237eb1ca1Smrgis set.  In this case, the revert_to argument is ignored.
243337eb1ca1Smrg    </para>
243437eb1ca1Smrg  </listitem>
243537eb1ca1Smrg  <listitem>
243637eb1ca1Smrg    <para>
243737eb1ca1SmrgIf the focus argument is a window ID, it becomes the focus
243837eb1ca1Smrgwindow of the device.  If an input event from the device would normally
243937eb1ca1Smrgbe reported to this window or to one of its inferiors, the event is 
244037eb1ca1Smrgreported normally.  Otherwise, the event is reported relative to the focus 
244137eb1ca1Smrgwindow.
244237eb1ca1Smrg    </para>
244337eb1ca1Smrg  </listitem>
244437eb1ca1Smrg  <listitem>
244537eb1ca1Smrg    <para>
244637eb1ca1SmrgIf the focus argument is
244737eb1ca1Smrg<function>PointerRoot ,</function>
244837eb1ca1Smrgthe focus window is dynamically taken to be the root window 
244937eb1ca1Smrgof whatever screen the pointer is on at each input event.
245037eb1ca1SmrgIn this case, the revert_to argument is ignored.
245137eb1ca1Smrg    </para>
245237eb1ca1Smrg  </listitem>
245337eb1ca1Smrg  <listitem>
245437eb1ca1Smrg    <para>
245537eb1ca1SmrgIf the focus argument is
245637eb1ca1Smrg<function>FollowKeyboard ,   </function>
245737eb1ca1Smrgthe focus window is dynamically taken to be the same as the focus
245837eb1ca1Smrgof the X keyboard at each input event.
245937eb1ca1Smrg    </para>
246037eb1ca1Smrg  </listitem>
246137eb1ca1Smrg</itemizedlist>
246237eb1ca1Smrg<para>
246337eb1ca1Smrg<!-- .LP -->
246437eb1ca1SmrgThe specified focus window must be viewable at the time
2465f1ee322dSmrg<xref linkend='XSetDeviceFocus' xrefstyle='select: title'/>
246637eb1ca1Smrgis called.  Otherwise, it generates a
246737eb1ca1Smrg<function>BadMatch</function>
246837eb1ca1Smrgerror.
246937eb1ca1SmrgIf the focus window later becomes not viewable,
247037eb1ca1Smrgthe X server evaluates the revert_to argument
247137eb1ca1Smrgto determine the new focus window.
247237eb1ca1Smrg</para>
247337eb1ca1Smrg<itemizedlist>
247437eb1ca1Smrg  <listitem>
247537eb1ca1Smrg    <para>
247637eb1ca1SmrgIf the revert_to argument is
247737eb1ca1Smrg<function>RevertToParent ,</function>
247837eb1ca1Smrgthe focus reverts to the parent (or the closest viewable ancestor),
247937eb1ca1Smrgand the new revert_to value is taken to be
248037eb1ca1Smrg<function>RevertToNone .  </function>
248137eb1ca1Smrg    </para>
248237eb1ca1Smrg  </listitem>
248337eb1ca1Smrg  <listitem>
248437eb1ca1Smrg    <para>
248537eb1ca1SmrgIf the revert_to argument is
248637eb1ca1Smrg<function>RevertToPointerRoot ,</function>
248737eb1ca1Smrg<function>RevertToFollowKeyboard ,</function>
248837eb1ca1Smrgor
248937eb1ca1Smrg<function>RevertToNone ,</function>
249037eb1ca1Smrgthe focus reverts to that value.
249137eb1ca1Smrg    </para>
249237eb1ca1Smrg  </listitem>
249337eb1ca1Smrg</itemizedlist>
249437eb1ca1Smrg<para>
249537eb1ca1Smrg<!-- .LP -->
249637eb1ca1SmrgWhen the focus reverts,
249737eb1ca1Smrgthe X server generates
249837eb1ca1Smrg<function>DeviceFocusIn</function>
249937eb1ca1Smrgand
250037eb1ca1Smrg<function>DeviceFocusOut</function>
250137eb1ca1Smrgevents, but the last-focus-change time is not affected.
250237eb1ca1Smrg</para>
250337eb1ca1Smrg<para>
250437eb1ca1Smrg<!-- .LP -->
2505f1ee322dSmrg<xref linkend='XSetDeviceFocus' xrefstyle='select: title'/>
250637eb1ca1Smrgcan generate
250737eb1ca1Smrg<function>BadDevice ,</function>
250837eb1ca1Smrg<function>BadMatch , </function>
250937eb1ca1Smrg<function>BadValue ,</function>
251037eb1ca1Smrgand
251137eb1ca1Smrg<function>BadWindow</function>
251237eb1ca1Smrgerrors.
251337eb1ca1Smrg</para>
251437eb1ca1Smrg</sect3>
251537eb1ca1Smrg<sect3 id="Controlling_Device_Feedback">
251637eb1ca1Smrg<title>Controlling Device Feedback</title>
251737eb1ca1Smrg<!-- .XS -->
251837eb1ca1Smrg<!-- (SN Controlling Device Feedback -->
251937eb1ca1Smrg<!-- .XE -->
252037eb1ca1Smrg<para>
252137eb1ca1Smrg<!-- .LP -->
252237eb1ca1SmrgTo determine the current feedback settings of an extension input device, use
252337eb1ca1Smrg<function>XGetFeedbackControl .</function>
252437eb1ca1Smrg<!-- .sM -->
2525f1ee322dSmrg<funcsynopsis id='XGetFeedbackControl'>
252637eb1ca1Smrg<funcprototype>
252737eb1ca1Smrg  <funcdef>XFeedbackState * <function> XGetFeedbackControl</function></funcdef>
252837eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
252937eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
253037eb1ca1Smrg  <paramdef>int<parameter> *num_feedbacks_return</parameter></paramdef>
253137eb1ca1Smrg</funcprototype>
253237eb1ca1Smrg</funcsynopsis>
253337eb1ca1Smrg<!-- .FN -->
253437eb1ca1Smrg<variablelist>
253537eb1ca1Smrg  <varlistentry>
253637eb1ca1Smrg    <term>
253737eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
253837eb1ca1Smrg    </term>
253937eb1ca1Smrg    <listitem>
254037eb1ca1Smrg      <para>
254137eb1ca1SmrgSpecifies the connection to the X server.
254237eb1ca1Smrg      </para>
254337eb1ca1Smrg    </listitem>
254437eb1ca1Smrg  </varlistentry>
254537eb1ca1Smrg  <varlistentry>
254637eb1ca1Smrg    <term>
254737eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
254837eb1ca1Smrg    </term>
254937eb1ca1Smrg    <listitem>
255037eb1ca1Smrg      <para>
255137eb1ca1SmrgSpecifies the desired device.
255237eb1ca1Smrg      </para>
255337eb1ca1Smrg    </listitem>
255437eb1ca1Smrg  </varlistentry>
255537eb1ca1Smrg  <varlistentry>
255637eb1ca1Smrg    <term>
255737eb1ca1Smrg      <emphasis remap='I'>num_feedbacks_return</emphasis>
255837eb1ca1Smrg    </term>
255937eb1ca1Smrg    <listitem>
256037eb1ca1Smrg      <para>
256137eb1ca1SmrgReturns the number of feedbacks supported by the device.
256237eb1ca1Smrg    </para>
256337eb1ca1Smrg  </listitem>
256437eb1ca1Smrg  </varlistentry>
256537eb1ca1Smrg</variablelist>
256637eb1ca1Smrg</para>
256737eb1ca1Smrg<para>
256837eb1ca1Smrg<!-- .LP -->
256937eb1ca1Smrg<!-- .eM -->
2570f1ee322dSmrg<xref linkend='XGetFeedbackControl' xrefstyle='select: title'/>
257137eb1ca1Smrgreturns a list of
257237eb1ca1Smrg<function>FeedbackState</function>
257337eb1ca1Smrgstructures that describe the feedbacks supported by the specified device.
257437eb1ca1SmrgThere is an
257537eb1ca1Smrg<function>XFeedbackState</function>
257637eb1ca1Smrgstructure for each class of feedback.  These are of 
257737eb1ca1Smrgvariable length, but the first three members are common to all.
257837eb1ca1Smrg</para>
257937eb1ca1Smrg<para>
258037eb1ca1Smrg<!-- .LP -->
258137eb1ca1Smrg<!-- .sM -->
258237eb1ca1Smrg<literallayout class="monospaced">
258337eb1ca1Smrg<!-- .TA .5i -->
258437eb1ca1Smrg<!-- .ta .5i -->
258537eb1ca1Smrgtypedef struct {
258637eb1ca1Smrg     XID class;
258737eb1ca1Smrg     int length;
258837eb1ca1Smrg     XID id;
258937eb1ca1Smrg} XFeedbackState;
259037eb1ca1Smrg</literallayout>
259137eb1ca1Smrg</para>
259237eb1ca1Smrg<para>
259337eb1ca1Smrg<!-- .LP -->
259437eb1ca1Smrg<!-- .eM -->
259537eb1ca1SmrgThe common members are as follows:
259637eb1ca1Smrg</para>
259737eb1ca1Smrg<itemizedlist>
259837eb1ca1Smrg  <listitem>
259937eb1ca1Smrg    <para>
260037eb1ca1SmrgThe class member identifies the class of feedback.
260137eb1ca1SmrgIt may be compared to constants defined in the file
260237eb1ca1Smrg<function>&lt; X11/extensions/XI.h &gt;.</function>
260337eb1ca1SmrgCurrently defined feedback constants include:
260437eb1ca1Smrg<function>KbdFeedbackClass , </function>
260537eb1ca1Smrg<function>PtrFeedbackClass ,</function>
260637eb1ca1Smrg<function>StringFeedbackClass ,</function>
260737eb1ca1Smrg<function>IntegerFeedbackClass , </function>
260837eb1ca1Smrg<function>LedFeedbackClass ,</function>
260937eb1ca1Smrgand
261037eb1ca1Smrg<function>BellFeedbackClass .</function>
261137eb1ca1Smrg    </para>
261237eb1ca1Smrg  </listitem>
261337eb1ca1Smrg  <listitem>
261437eb1ca1Smrg    <para>
261537eb1ca1SmrgThe length member specifies the length of the
261637eb1ca1Smrg<function>FeedbackState</function>
261737eb1ca1Smrgstructure and can be used by clients to traverse the list.
261837eb1ca1Smrg    </para>
261937eb1ca1Smrg  </listitem>
262037eb1ca1Smrg  <listitem>
262137eb1ca1Smrg    <para>
262237eb1ca1SmrgThe id member uniquely identifies a feedback for a given device and class.
262337eb1ca1SmrgThis allows a device to support more than one feedback of the same class.
262437eb1ca1SmrgOther feedbacks of other classes or devices may have the same ID.
262537eb1ca1Smrg<!-- .sp -->
262637eb1ca1Smrg    </para>
262737eb1ca1Smrg  </listitem>
262837eb1ca1Smrg</itemizedlist>
262937eb1ca1Smrg<para>
263037eb1ca1Smrg<!-- .LP -->
263137eb1ca1SmrgThose feedbacks equivalent to those
263237eb1ca1Smrgsupported by the core keyboard are reported in class
263337eb1ca1Smrg<function>KbdFeedback</function>
263437eb1ca1Smrgusing the
263537eb1ca1Smrg<function>XKbdFeedbackState</function>
263637eb1ca1Smrgstructure, which is defined as follows:
263737eb1ca1Smrg</para>
263837eb1ca1Smrg<para>
263937eb1ca1Smrg<!-- .LP -->
264037eb1ca1Smrg<!-- .sM -->
264137eb1ca1Smrg<literallayout class="monospaced">
264237eb1ca1Smrg<!-- .TA .5i -->
264337eb1ca1Smrg<!-- .ta .5i -->
264437eb1ca1Smrgtypedef struct {
264537eb1ca1Smrg     XID class;
264637eb1ca1Smrg     int length;
264737eb1ca1Smrg     XID id;
264837eb1ca1Smrg     int click;
264937eb1ca1Smrg     int percent;
265037eb1ca1Smrg     int pitch;
265137eb1ca1Smrg     int duration;
265237eb1ca1Smrg     int led_mask;
265337eb1ca1Smrg     int global_auto_repeat;
265437eb1ca1Smrg     char auto_repeats[32];
265537eb1ca1Smrg} XKbdFeedbackState;
265637eb1ca1Smrg</literallayout>
265737eb1ca1Smrg</para>
265837eb1ca1Smrg<para>
265937eb1ca1Smrg<!-- .LP -->
266037eb1ca1Smrg<!-- .eM -->
266137eb1ca1SmrgThe additional members of the
266237eb1ca1Smrg<function>XKbdFeedbackState</function>
266337eb1ca1Smrgstructure report the current state of the feedback:
266437eb1ca1Smrg</para>
266537eb1ca1Smrg<itemizedlist>
266637eb1ca1Smrg  <listitem>
266737eb1ca1Smrg    <para>
266837eb1ca1SmrgThe click member specifies the key-click volume and has a value in the range
266937eb1ca1Smrg0 (off) to 100 (loud).
267037eb1ca1Smrg    </para>
267137eb1ca1Smrg  </listitem>
267237eb1ca1Smrg  <listitem>
267337eb1ca1Smrg    <para>
267437eb1ca1SmrgThe percent member specifies the bell volume and has a value in the range
267537eb1ca1Smrg0 (off) to 100 (loud).
267637eb1ca1Smrg    </para>
267737eb1ca1Smrg  </listitem>
267837eb1ca1Smrg  <listitem>
267937eb1ca1Smrg    <para>
268037eb1ca1SmrgThe pitch member specifies the bell pitch in Hz. The range of the value is 
268137eb1ca1Smrgimplementation-dependent.
268237eb1ca1Smrg    </para>
268337eb1ca1Smrg  </listitem>
268437eb1ca1Smrg  <listitem>
268537eb1ca1Smrg    <para>
268637eb1ca1SmrgThe duration member specifies the duration in milliseconds of the bell.
268737eb1ca1Smrg    </para>
268837eb1ca1Smrg  </listitem>
268937eb1ca1Smrg  <listitem>
269037eb1ca1Smrg    <para>
269137eb1ca1SmrgThe led_mask member is a bit mask that describes the current state of up to 
269237eb1ca1Smrg32 LEDs.  A value of 1 in a bit indicates that the corresponding LED is on.
269337eb1ca1Smrg    </para>
269437eb1ca1Smrg  </listitem>
269537eb1ca1Smrg  <listitem>
269637eb1ca1Smrg    <para>
269737eb1ca1SmrgThe global_auto_repeat member has a value of
269837eb1ca1Smrg<function>AutoRepeatModeOn</function>
269937eb1ca1Smrgor
270037eb1ca1Smrg<function>AutoRepeatModeOff .</function>
270137eb1ca1Smrg    </para>
270237eb1ca1Smrg  </listitem>
270337eb1ca1Smrg  <listitem>
270437eb1ca1Smrg    <para>
270537eb1ca1SmrgThe auto_repeats member is a bit vector.  Each bit set to 1 indicates
270637eb1ca1Smrgthat auto-repeat is enabled for the corresponding key.  The vector is
270737eb1ca1Smrgrepresented as 32 bytes.  Byte N (from 0) contains the bits for keys
270837eb1ca1Smrg8N to 8N + 7, with the least significant bit in the byte representing
270937eb1ca1Smrgkey 8N.
271037eb1ca1Smrg<!-- .sp -->
271137eb1ca1Smrg    </para>
271237eb1ca1Smrg  </listitem>
271337eb1ca1Smrg</itemizedlist>
271437eb1ca1Smrg<para>
271537eb1ca1Smrg<!-- .LP -->
271637eb1ca1SmrgThose feedbacks equivalent to those
271737eb1ca1Smrgsupported by the core pointer are reported in class
271837eb1ca1Smrg<function>PtrFeedback</function>
271937eb1ca1Smrgusing the
272037eb1ca1Smrg<function>XPtrFeedbackState</function>
272137eb1ca1Smrgstructure, which is defined as follows:
272237eb1ca1Smrg</para>
272337eb1ca1Smrg<para>
272437eb1ca1Smrg<!-- .LP -->
272537eb1ca1Smrg<!-- .sM -->
272637eb1ca1Smrg<literallayout class="monospaced">
272737eb1ca1Smrg<!-- .TA .5i -->
272837eb1ca1Smrg<!-- .ta .5i -->
272937eb1ca1Smrgtypedef struct {
273037eb1ca1Smrg     XID class;
273137eb1ca1Smrg     int length;
273237eb1ca1Smrg     XID id;
273337eb1ca1Smrg     int accelNum;
273437eb1ca1Smrg     int accelDenom;
273537eb1ca1Smrg     int threshold;
273637eb1ca1Smrg} XPtrFeedbackState;
273737eb1ca1Smrg</literallayout>
273837eb1ca1Smrg</para>
273937eb1ca1Smrg<para>
274037eb1ca1Smrg<!-- .LP -->
274137eb1ca1Smrg<!-- .eM -->
274237eb1ca1SmrgThe additional members of the
274337eb1ca1Smrg<function>XPtrFeedbackState</function>
274437eb1ca1Smrgstructure report the current state of the feedback:
274537eb1ca1Smrg</para>
274637eb1ca1Smrg<itemizedlist>
274737eb1ca1Smrg  <listitem>
274837eb1ca1Smrg    <para>
274937eb1ca1SmrgThe accelNum member returns the numerator for the acceleration multiplier.
275037eb1ca1Smrg    </para>
275137eb1ca1Smrg  </listitem>
275237eb1ca1Smrg  <listitem>
275337eb1ca1Smrg    <para>
275437eb1ca1SmrgThe accelDenom member returns the denominator for the acceleration multiplier.
275537eb1ca1Smrg    </para>
275637eb1ca1Smrg  </listitem>
275737eb1ca1Smrg  <listitem>
275837eb1ca1Smrg    <para>
275937eb1ca1SmrgThe accelDenom member returns the threshold for the acceleration.
276037eb1ca1Smrg<!-- .sp -->
276137eb1ca1Smrg    </para>
276237eb1ca1Smrg  </listitem>
276337eb1ca1Smrg</itemizedlist>
276437eb1ca1Smrg<para>
276537eb1ca1Smrg<!-- .LP -->
276637eb1ca1SmrgInteger feedbacks are those capable of displaying integer numbers
276737eb1ca1Smrgand reported via the
276837eb1ca1Smrg<function>XIntegerFeedbackState</function>
276937eb1ca1Smrgstructure.
277037eb1ca1SmrgThe minimum and maximum values that they can display are reported.
277137eb1ca1Smrg</para>
277237eb1ca1Smrg<para>
277337eb1ca1Smrg<!-- .LP -->
277437eb1ca1Smrg<!-- .sM -->
277537eb1ca1Smrg<literallayout class="monospaced">
277637eb1ca1Smrg<!-- .TA .5i -->
277737eb1ca1Smrg<!-- .ta .5i -->
277837eb1ca1Smrgtypedef struct {
277937eb1ca1Smrg     XID class;
278037eb1ca1Smrg     int length;
278137eb1ca1Smrg     XID id;
278237eb1ca1Smrg     int resolution;
278337eb1ca1Smrg     int minVal;
278437eb1ca1Smrg     int maxVal;
278537eb1ca1Smrg} XIntegerFeedbackState;
278637eb1ca1Smrg</literallayout>
278737eb1ca1Smrg</para>
278837eb1ca1Smrg<para>
278937eb1ca1Smrg<!-- .LP -->
279037eb1ca1Smrg<!-- .eM -->
279137eb1ca1SmrgThe additional members of the
279237eb1ca1Smrg<function>XIntegerFeedbackState</function>
279337eb1ca1Smrgstructure report the capabilities of the feedback:
279437eb1ca1Smrg</para>
279537eb1ca1Smrg<itemizedlist>
279637eb1ca1Smrg  <listitem>
279737eb1ca1Smrg    <para>
279837eb1ca1SmrgThe resolution member specifies the number of digits that the feedback
279937eb1ca1Smrgcan display.
280037eb1ca1Smrg    </para>
280137eb1ca1Smrg  </listitem>
280237eb1ca1Smrg  <listitem>
280337eb1ca1Smrg    <para>
280437eb1ca1SmrgThe minVal member specifies the minimum value that the feedback can display.
280537eb1ca1Smrg    </para>
280637eb1ca1Smrg  </listitem>
280737eb1ca1Smrg  <listitem>
280837eb1ca1Smrg    <para>
280937eb1ca1SmrgThe maxVal specifies the maximum value that the feedback can display.
281037eb1ca1Smrg<!-- .sp -->
281137eb1ca1Smrg    </para>
281237eb1ca1Smrg  </listitem>
281337eb1ca1Smrg</itemizedlist>
281437eb1ca1Smrg<para>
281537eb1ca1Smrg<!-- .LP -->
281637eb1ca1SmrgString feedbacks are those that can display character information
281737eb1ca1Smrgand are reported via the
281837eb1ca1Smrg<function>XStringFeedbackState</function>
281937eb1ca1Smrgstructure.
282037eb1ca1SmrgClients set these feedbacks by passing a list of 
282137eb1ca1Smrg<function>KeySyms</function>
282237eb1ca1Smrgto be displayed.
282337eb1ca1SmrgThe 
2824f1ee322dSmrg<xref linkend='XGetFeedbackControl' xrefstyle='select: title'/>
282537eb1ca1Smrgfunction returns the
282637eb1ca1Smrgset of key symbols that the feedback can display, as well as the 
282737eb1ca1Smrgmaximum number of symbols that can be displayed.
282837eb1ca1SmrgThe
282937eb1ca1Smrg<function>XStringFeedbackState</function>
283037eb1ca1Smrgstructure is defined as follows:
283137eb1ca1Smrg</para>
283237eb1ca1Smrg<para>
283337eb1ca1Smrg<!-- .LP -->
283437eb1ca1Smrg<!-- .sM -->
283537eb1ca1Smrg<literallayout class="monospaced">
283637eb1ca1Smrg<!-- .TA .5i -->
283737eb1ca1Smrg<!-- .ta .5i -->
283837eb1ca1Smrgtypedef struct {
283937eb1ca1Smrg     XID class;
284037eb1ca1Smrg     int length;
284137eb1ca1Smrg     XID id;
284237eb1ca1Smrg     int max_symbols;
284337eb1ca1Smrg     int  num_syms_supported;
284437eb1ca1Smrg     KeySym *syms_supported;
284537eb1ca1Smrg} XStringFeedbackState;
284637eb1ca1Smrg</literallayout>
284737eb1ca1Smrg</para>
284837eb1ca1Smrg<para>
284937eb1ca1Smrg<!-- .LP -->
285037eb1ca1Smrg<!-- .eM -->
285137eb1ca1SmrgThe additional members of the
285237eb1ca1Smrg<function>XStringFeedbackState</function>
285337eb1ca1Smrgstructure report the capabilities of the feedback:
285437eb1ca1Smrg</para>
285537eb1ca1Smrg<itemizedlist>
285637eb1ca1Smrg  <listitem>
285737eb1ca1Smrg    <para>
285837eb1ca1SmrgThe max_symbols member specifies the maximum number of symbols
285937eb1ca1Smrgthat can be displayed.
286037eb1ca1Smrg    </para>
286137eb1ca1Smrg  </listitem>
286237eb1ca1Smrg  <listitem>
286337eb1ca1Smrg    <para>
286437eb1ca1SmrgThe syms_supported member is a pointer to the list of supported symbols.
286537eb1ca1Smrg    </para>
286637eb1ca1Smrg  </listitem>
286737eb1ca1Smrg  <listitem>
286837eb1ca1Smrg    <para>
286937eb1ca1SmrgThe num_syms_supported member specifies the length of the list of supported symbols.
287037eb1ca1Smrg<!-- .sp -->
287137eb1ca1Smrg    </para>
287237eb1ca1Smrg  </listitem>
287337eb1ca1Smrg</itemizedlist>
287437eb1ca1Smrg<para>
287537eb1ca1Smrg<!-- .LP -->
287637eb1ca1SmrgBell feedbacks are those that can generate a sound
287737eb1ca1Smrgand are reported via the
287837eb1ca1Smrg<function>XBellFeedbackState</function>
287937eb1ca1Smrgstructure.
288037eb1ca1SmrgSome implementations may support a bell as part of a
288137eb1ca1Smrg<function>KbdFeedback</function>
288237eb1ca1Smrgfeedback.  Class
288337eb1ca1Smrg<function>BellFeedback</function>
288437eb1ca1Smrgis provided for implementations that do not choose to do
288537eb1ca1Smrgso and for devices that support multiple feedbacks that can produce sound.
288637eb1ca1SmrgThe meaning of the members is the same as that of the corresponding fields in
288737eb1ca1Smrgthe 
288837eb1ca1Smrg<function>XKbdFeedbackState</function>
288937eb1ca1Smrgstructure.
289037eb1ca1Smrg</para>
289137eb1ca1Smrg<para>
289237eb1ca1Smrg<!-- .LP -->
289337eb1ca1Smrg<!-- .sM -->
289437eb1ca1Smrg<literallayout class="monospaced">
289537eb1ca1Smrg<!-- .TA .5i -->
289637eb1ca1Smrg<!-- .ta .5i -->
289737eb1ca1Smrgtypedef struct {
289837eb1ca1Smrg     XID class;
289937eb1ca1Smrg     int length;
290037eb1ca1Smrg     XID id;
290137eb1ca1Smrg     int percent;
290237eb1ca1Smrg     int pitch;
290337eb1ca1Smrg     int duration;
290437eb1ca1Smrg} XBellFeedbackState;
290537eb1ca1Smrg</literallayout>
290637eb1ca1Smrg</para>
290737eb1ca1Smrg<para>
290837eb1ca1Smrg<!-- .LP -->
290937eb1ca1Smrg<!-- .eM -->
291037eb1ca1SmrgLed feedbacks are those that can generate a light and are reported via the
291137eb1ca1Smrg<function>XLedFeedbackState</function>
291237eb1ca1Smrgstructure.
291337eb1ca1SmrgUp to 32 lights per feedback are supported.  
291437eb1ca1SmrgEach bit in led_mask
291537eb1ca1Smrgcorresponds to one supported light, and the corresponding bit in led_values
291637eb1ca1Smrgindicates whether that light is currently on (1) or off (0).
291737eb1ca1SmrgSome implementations may support leds as part of a
291837eb1ca1Smrg<function>KbdFeedback</function>
291937eb1ca1Smrgfeedback.
292037eb1ca1SmrgClass 
292137eb1ca1Smrg<function>LedFeedback</function>
292237eb1ca1Smrgis provided for implementations that do not choose to do
292337eb1ca1Smrgso and for devices that support multiple led feedbacks.
292437eb1ca1Smrg</para>
292537eb1ca1Smrg<para>
292637eb1ca1Smrg<!-- .LP -->
292737eb1ca1Smrg<!-- .sM -->
292837eb1ca1Smrg<literallayout class="monospaced">
292937eb1ca1Smrg<!-- .TA .5i -->
293037eb1ca1Smrg<!-- .ta .5i -->
293137eb1ca1Smrgtypedef struct {
293237eb1ca1Smrg     XID class;
293337eb1ca1Smrg     int length;
293437eb1ca1Smrg     XID id;
293537eb1ca1Smrg     Mask led_values;
293637eb1ca1Smrg     Mask led_mask;
293737eb1ca1Smrg} XLedFeedbackState;
293837eb1ca1Smrg</literallayout>
293937eb1ca1Smrg</para>
294037eb1ca1Smrg<para>
294137eb1ca1Smrg<!-- .LP -->
294237eb1ca1Smrg<!-- .eM -->
2943f1ee322dSmrg<xref linkend='XGetFeedbackControl' xrefstyle='select: title'/>
294437eb1ca1Smrgcan generate
294537eb1ca1Smrg<function>BadDevice</function>
294637eb1ca1Smrgand
294737eb1ca1Smrg<function>BadMatch</function>
294837eb1ca1Smrgerrors.
294937eb1ca1Smrg<!-- .sp -->
295037eb1ca1Smrg</para>
295137eb1ca1Smrg<para>
295237eb1ca1Smrg<!-- .LP -->
295337eb1ca1SmrgTo free the information returned by the
2954f1ee322dSmrg<xref linkend='XGetFeedbackControl' xrefstyle='select: title'/>
295537eb1ca1Smrgfunction, use 
295637eb1ca1Smrg<function>XFreeFeedbackList .</function>
295737eb1ca1Smrg<!-- .sM -->
2958f1ee322dSmrg<funcsynopsis id='XFreeFeedbackList'>
295937eb1ca1Smrg<funcprototype>
296037eb1ca1Smrg  <funcdef>void <function> XFreeFeedbackList</function></funcdef>
296137eb1ca1Smrg  <paramdef>XFeedbackState<parameter> *list</parameter></paramdef>
296237eb1ca1Smrg</funcprototype>
296337eb1ca1Smrg</funcsynopsis>
296437eb1ca1Smrg<!-- .FN -->
296537eb1ca1Smrg<variablelist>
296637eb1ca1Smrg  <varlistentry>
296737eb1ca1Smrg    <term>
296837eb1ca1Smrg      <emphasis remap='I'>list</emphasis>
296937eb1ca1Smrg    </term>
297037eb1ca1Smrg    <listitem>
297137eb1ca1Smrg      <para>
297237eb1ca1SmrgSpecifies the pointer to the 
297337eb1ca1Smrg<function>XFeedbackState</function>
297437eb1ca1Smrgstructure returned by
297537eb1ca1Smrga previous call to
297637eb1ca1Smrg<function>XGetFeedbackControl .</function>
297737eb1ca1Smrg    </para>
297837eb1ca1Smrg  </listitem>
297937eb1ca1Smrg  </varlistentry>
298037eb1ca1Smrg</variablelist>
298137eb1ca1Smrg</para>
298237eb1ca1Smrg<para>
298337eb1ca1Smrg<!-- .LP -->
298437eb1ca1Smrg<!-- .eM -->
2985f1ee322dSmrg<xref linkend='XFreeFeedbackList' xrefstyle='select: title'/>
298637eb1ca1Smrgfrees the list of feedback control information.
298737eb1ca1Smrg<!-- .sp -->
298837eb1ca1Smrg</para>
298937eb1ca1Smrg<para>
299037eb1ca1Smrg<!-- .LP -->
299137eb1ca1SmrgTo change the settings of a feedback on an extension device, use
299237eb1ca1Smrg<function>XChangeFeedbackControl .</function>
299337eb1ca1SmrgThis function modifies the current control values of the specified feedback
299437eb1ca1Smrgusing information passed in the appropriate
299537eb1ca1Smrg<function>XFeedbackControl</function>
299637eb1ca1Smrgstructure for the feedback.
299737eb1ca1SmrgWhich values are modified depends on the valuemask passed.
299837eb1ca1Smrg<!-- .sM -->
2999f1ee322dSmrg<funcsynopsis id='XChangeFeedbackControl'>
300037eb1ca1Smrg<funcprototype>
300137eb1ca1Smrg  <funcdef>int <function> XChangeFeedbackControl</function></funcdef>
300237eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
300337eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
300437eb1ca1Smrg  <paramdef>unsignedlong<parameter> valuemask</parameter></paramdef>
300537eb1ca1Smrg  <paramdef>XFeedbackControl<parameter> *value</parameter></paramdef>
300637eb1ca1Smrg</funcprototype>
300737eb1ca1Smrg</funcsynopsis>
300837eb1ca1Smrg<!-- .FN -->
300937eb1ca1Smrg<variablelist>
301037eb1ca1Smrg  <varlistentry>
301137eb1ca1Smrg    <term>
301237eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
301337eb1ca1Smrg    </term>
301437eb1ca1Smrg    <listitem>
301537eb1ca1Smrg      <para>
301637eb1ca1SmrgSpecifies the connection to the X server.
301737eb1ca1Smrg      </para>
301837eb1ca1Smrg    </listitem>
301937eb1ca1Smrg  </varlistentry>
302037eb1ca1Smrg  <varlistentry>
302137eb1ca1Smrg    <term>
302237eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
302337eb1ca1Smrg    </term>
302437eb1ca1Smrg    <listitem>
302537eb1ca1Smrg      <para>
302637eb1ca1SmrgSpecifies the desired device.
302737eb1ca1Smrg      </para>
302837eb1ca1Smrg    </listitem>
302937eb1ca1Smrg  </varlistentry>
303037eb1ca1Smrg  <varlistentry>
303137eb1ca1Smrg    <term>
303237eb1ca1Smrg      <emphasis remap='I'>valuemask</emphasis>
303337eb1ca1Smrg    </term>
303437eb1ca1Smrg    <listitem>
303537eb1ca1Smrg      <para>
303637eb1ca1SmrgSpecifies one value for each bit in the mask (least to most significant
303737eb1ca1Smrgbit).  The values are associated with the feedbacks for the specified
303837eb1ca1Smrgdevice.
303937eb1ca1Smrg      </para>
304037eb1ca1Smrg    </listitem>
304137eb1ca1Smrg  </varlistentry>
304237eb1ca1Smrg  <varlistentry>
304337eb1ca1Smrg    <term>
304437eb1ca1Smrg      <emphasis remap='I'>value</emphasis>
304537eb1ca1Smrg    </term>
304637eb1ca1Smrg    <listitem>
304737eb1ca1Smrg      <para>
304837eb1ca1SmrgSpecifies a pointer to the
304937eb1ca1Smrg<function>XFeedbackControl</function>
305037eb1ca1Smrgstructure.
305137eb1ca1Smrg    </para>
305237eb1ca1Smrg  </listitem>
305337eb1ca1Smrg  </varlistentry>
305437eb1ca1Smrg</variablelist>
305537eb1ca1Smrg</para>
305637eb1ca1Smrg<para>
305737eb1ca1Smrg<!-- .LP -->
305837eb1ca1Smrg<!-- .eM -->
3059f1ee322dSmrg<xref linkend='XChangeFeedbackControl' xrefstyle='select: title'/>
306037eb1ca1Smrgcontrols the device characteristics described by the
306137eb1ca1Smrg<function>XFeedbackControl</function>
306237eb1ca1Smrgstructure. 
306337eb1ca1SmrgThere is an
306437eb1ca1Smrg<function>XFeedbackControl</function>
306537eb1ca1Smrgstructure for each class of feedback.  
306637eb1ca1SmrgThese are of variable length, but the first 
306737eb1ca1Smrgthree members are common to all and are as follows:
306837eb1ca1Smrg</para>
306937eb1ca1Smrg<para>
307037eb1ca1Smrg<!-- .LP -->
307137eb1ca1Smrg<!-- .sM -->
307237eb1ca1Smrg<literallayout class="monospaced">
307337eb1ca1Smrg<!-- .TA .5i -->
307437eb1ca1Smrg<!-- .ta .5i -->
307537eb1ca1Smrgtypedef struct {
307637eb1ca1Smrg     XID class;
307737eb1ca1Smrg     int length;
307837eb1ca1Smrg     XID id;
307937eb1ca1Smrg} XFeedbackControl;
308037eb1ca1Smrg</literallayout>
308137eb1ca1Smrg</para>
308237eb1ca1Smrg<para>
308337eb1ca1Smrg<!-- .LP -->
308437eb1ca1Smrg<!-- .eM -->
308537eb1ca1SmrgFeedback class 
308637eb1ca1Smrg<function>KbdFeedback</function>
308737eb1ca1Smrgcontrols feedbacks equivalent to those provided by the core keyboard using the
308837eb1ca1Smrg<function>KbdFeedbackControl</function>
308937eb1ca1Smrgstructure, which is defined as follows:.
309037eb1ca1Smrg</para>
309137eb1ca1Smrg<para>
309237eb1ca1Smrg<!-- .LP -->
309337eb1ca1Smrg<!-- .sM -->
309437eb1ca1Smrg<literallayout class="monospaced">
309537eb1ca1Smrg<!-- .TA .5i -->
309637eb1ca1Smrg<!-- .ta .5i -->
309737eb1ca1Smrgtypedef struct {
309837eb1ca1Smrg     XID class;
309937eb1ca1Smrg     int length;
310037eb1ca1Smrg     XID id;
310137eb1ca1Smrg     int click;
310237eb1ca1Smrg     int percent;
310337eb1ca1Smrg     int pitch;
310437eb1ca1Smrg     int duration;
310537eb1ca1Smrg     int led_mask;
310637eb1ca1Smrg     int led_value;
310737eb1ca1Smrg     int key;
310837eb1ca1Smrg     int auto_repeat_mode;
310937eb1ca1Smrg} XKbdFeedbackControl;
311037eb1ca1Smrg</literallayout>
311137eb1ca1Smrg</para>
311237eb1ca1Smrg<para>
311337eb1ca1Smrg<!-- .LP -->
311437eb1ca1Smrg<!-- .eM -->
311537eb1ca1SmrgThis class controls the device characteristics described by the
311637eb1ca1Smrg<function>XKbdFeedbackControl</function>
311737eb1ca1Smrgstructure.  These include the key_click_percent,
311837eb1ca1Smrgglobal_auto_repeat, and individual key auto-repeat.  Valid modes
311937eb1ca1Smrgare
312037eb1ca1Smrg<function>AutoRepeatModeOn ,</function>
312137eb1ca1Smrg<function>AutoRepeatModeOff ,</function>
312237eb1ca1Smrgand
312337eb1ca1Smrg<function>AutoRepeatModeDefault .</function>
312437eb1ca1Smrg</para>
312537eb1ca1Smrg<para>
312637eb1ca1Smrg<!-- .LP -->
312737eb1ca1SmrgValid masks are as follows:
312837eb1ca1Smrg<!-- .sM -->
312937eb1ca1Smrg</para>
313037eb1ca1Smrg
313137eb1ca1Smrg<literallayout class="monospaced">
313237eb1ca1Smrg
313337eb1ca1Smrg#define   DvKeyClickPercent           (1>&lt;&lt;0)
313437eb1ca1Smrg#define   DvPercent                   (1>&lt;&lt;0)
313537eb1ca1Smrg#define   DvPitch                     (1>&lt;&lt;0)
313637eb1ca1Smrg#define   DvDuration                  (1>&lt;&lt;0)
313737eb1ca1Smrg#define   DvLed                       (1>&lt;&lt;0)
313837eb1ca1Smrg#define   DvLedMode                   (1>&lt;&lt;0)
313937eb1ca1Smrg#define   DvKey                       (1>&lt;&lt;0)
314037eb1ca1Smrg#define   DvAutoRepeatMode            (1>&lt;&lt;0)
314137eb1ca1Smrg</literallayout>
314237eb1ca1Smrg
314337eb1ca1Smrg<para>
314437eb1ca1Smrg<!-- .LP -->
314537eb1ca1SmrgFeedback class
314637eb1ca1Smrg<function>PtrFeedback</function>
314737eb1ca1Smrgcontrols feedbacks equivalent to those provided by the core pointer using the
314837eb1ca1Smrg<function>PtrFeedbackControl</function>
314937eb1ca1Smrgstructure, which is defined as follows:
315037eb1ca1Smrg</para>
315137eb1ca1Smrg<para>
315237eb1ca1Smrg<!-- .LP -->
315337eb1ca1Smrg<!-- .sM -->
315437eb1ca1Smrg<literallayout class="monospaced">
315537eb1ca1Smrg<!-- .TA .5i -->
315637eb1ca1Smrg<!-- .ta .5i -->
315737eb1ca1Smrgtypedef struct {
315837eb1ca1Smrg     XID class;
315937eb1ca1Smrg     int length;
316037eb1ca1Smrg     XID id;
316137eb1ca1Smrg     int accelNum;
316237eb1ca1Smrg     int accelDenom;
316337eb1ca1Smrg     int threshold;
316437eb1ca1Smrg} XPtrFeedbackControl;
316537eb1ca1Smrg</literallayout>
316637eb1ca1Smrg</para>
316737eb1ca1Smrg<para>
316837eb1ca1Smrg<!-- .LP -->
316937eb1ca1Smrg<!-- .eM -->
317037eb1ca1SmrgWhich values are modified depends on the valuemask passed.
317137eb1ca1Smrg</para>
317237eb1ca1Smrg<para>
317337eb1ca1Smrg<!-- .LP -->
317437eb1ca1SmrgValid masks are as follows:
317537eb1ca1Smrg<!-- .sM -->
317637eb1ca1Smrg</para>
317737eb1ca1Smrg
317837eb1ca1Smrg<literallayout class="monospaced">
317937eb1ca1Smrg#define    DvAccelnum        (1L&lt;&lt;0)
318037eb1ca1Smrg#define    DvAccelDenom      (1L&lt;&lt;1)
318137eb1ca1Smrg#define    DvThreshold       (1L&lt;&lt;2)
318237eb1ca1Smrg</literallayout>
318337eb1ca1Smrg
318437eb1ca1Smrg
318537eb1ca1Smrg<para>
318637eb1ca1Smrg<!-- .LP -->
318737eb1ca1Smrg<!-- .eM -->
318837eb1ca1SmrgThe acceleration, expressed as a fraction, is a multiplier for movement. 
318937eb1ca1SmrgFor example,
319037eb1ca1Smrgspecifying 3/1 means that the device moves three times as fast as normal.
319137eb1ca1SmrgThe fraction may be rounded arbitrarily by the X server.  
319237eb1ca1SmrgAcceleration takes effect only if the device moves more than threshold pixels at
319337eb1ca1Smrgonce and applies only to the amount beyond the value in the threshold argument.
319437eb1ca1SmrgSetting a value to -1 restores the default.
319537eb1ca1SmrgThe values of the accelNumerator and threshold fields must be nonzero for
319637eb1ca1Smrgthe pointer values to be set.
319737eb1ca1SmrgOtherwise, the parameters will be unchanged.
319837eb1ca1SmrgNegative values generate a
319937eb1ca1Smrg<function>BadValue</function>
320037eb1ca1Smrgerror, as does a zero value
320137eb1ca1Smrgfor the accelDenominator field.
320237eb1ca1Smrg</para>
320337eb1ca1Smrg<para>
320437eb1ca1Smrg<!-- .LP -->
320537eb1ca1SmrgThis request fails with a
320637eb1ca1Smrg<function>BadMatch</function>
320737eb1ca1Smrgerror if the specified device is not currently reporting relative motion.
320837eb1ca1SmrgIf a device that is capable of reporting both relative and absolute motion
320937eb1ca1Smrghas its mode changed from
321037eb1ca1Smrg<function>Relative</function>
321137eb1ca1Smrgto
321237eb1ca1Smrg<function>Absolute</function>
321337eb1ca1Smrgby an
3214f1ee322dSmrg<xref linkend='XSetDeviceMode' xrefstyle='select: title'/>
321537eb1ca1Smrgrequest, valuator control values
321637eb1ca1Smrgwill be ignored by the server while the device is in that mode.
321737eb1ca1Smrg</para>
321837eb1ca1Smrg<para>
321937eb1ca1Smrg<!-- .LP -->
322037eb1ca1SmrgFeedback class
322137eb1ca1Smrg<function>IntegerFeedback</function>
322237eb1ca1Smrgcontrols integer feedbacks displayed on input devices and are
322337eb1ca1Smrgreported via the
322437eb1ca1Smrg<function>IntegerFeedbackControl</function>
322537eb1ca1Smrgstructure, which is defined as follows:
322637eb1ca1Smrg</para>
322737eb1ca1Smrg<para>
322837eb1ca1Smrg<!-- .LP -->
322937eb1ca1Smrg<!-- .sM -->
323037eb1ca1Smrg<literallayout class="monospaced">
323137eb1ca1Smrg<!-- .TA .5i -->
323237eb1ca1Smrg<!-- .ta .5i -->
323337eb1ca1Smrgtypedef struct {
323437eb1ca1Smrg     XID class;
323537eb1ca1Smrg     int length;
323637eb1ca1Smrg     XID id;
323737eb1ca1Smrg     int int_to_display;
323837eb1ca1Smrg} XIntegerFeedbackControl;
323937eb1ca1Smrg</literallayout>
324037eb1ca1Smrg</para>
324137eb1ca1Smrg<para>
324237eb1ca1Smrg<!-- .LP -->
324337eb1ca1Smrg<!-- .eM -->
324437eb1ca1SmrgValid masks are as follows:
324537eb1ca1Smrg<!-- .sM -->
324637eb1ca1Smrg</para>
324737eb1ca1Smrg
324837eb1ca1Smrg<literallayout class="monospaced">
324937eb1ca1Smrg
325037eb1ca1Smrg#define   DvInteger           (1L&lt;&lt;0)
325137eb1ca1Smrg</literallayout>
325237eb1ca1Smrg
325337eb1ca1Smrg<para>
325437eb1ca1Smrg<!-- .LP -->
325537eb1ca1Smrg<!-- .eM -->
325637eb1ca1SmrgFeedback class
325737eb1ca1Smrg<function>StringFeedback</function>
325837eb1ca1Smrgcontrols string feedbacks displayed on input devices
325937eb1ca1Smrgand reported via the
326037eb1ca1Smrg<function>StringFeedbackControl</function>
326137eb1ca1Smrgstructure, which is defined as follows:
326237eb1ca1Smrg</para>
326337eb1ca1Smrg<para>
326437eb1ca1Smrg<!-- .LP -->
326537eb1ca1Smrg<!-- .sM -->
326637eb1ca1Smrg<literallayout class="monospaced">
326737eb1ca1Smrg<!-- .TA .5i -->
326837eb1ca1Smrg<!-- .ta .5i -->
326937eb1ca1Smrgtypedef struct {
327037eb1ca1Smrg     XID class;
327137eb1ca1Smrg     int length;
327237eb1ca1Smrg     XID id;
327337eb1ca1Smrg     int num_keysyms;
327437eb1ca1Smrg     KeySym *syms_to_display;
327537eb1ca1Smrg} XStringFeedbackControl;
327637eb1ca1Smrg</literallayout>
327737eb1ca1Smrg</para>
327837eb1ca1Smrg<para>
327937eb1ca1Smrg<!-- .LP -->
328037eb1ca1Smrg<!-- .eM -->
328137eb1ca1SmrgValid masks are as follows:
328237eb1ca1Smrg<!-- .sM -->
328337eb1ca1Smrg</para>
328437eb1ca1Smrg<literallayout class="monospaced">
328537eb1ca1Smrg
328637eb1ca1Smrg#define   DvString           (1L&lt;&lt;0)
328737eb1ca1Smrg</literallayout>
328837eb1ca1Smrg
328937eb1ca1Smrg<para>
329037eb1ca1Smrg<!-- .LP -->
329137eb1ca1Smrg<!-- .eM -->
329237eb1ca1SmrgFeedback class
329337eb1ca1Smrg<function>BellFeedback</function>
329437eb1ca1Smrgcontrols a bell on an input device and is reported via the
329537eb1ca1Smrg<function>BellFeedbackControl</function>
329637eb1ca1Smrgstructure, which is defined as follows:
329737eb1ca1Smrg</para>
329837eb1ca1Smrg<para>
329937eb1ca1Smrg<!-- .LP -->
330037eb1ca1Smrg<!-- .sM -->
330137eb1ca1Smrg<literallayout class="monospaced">
330237eb1ca1Smrg<!-- .TA .5i -->
330337eb1ca1Smrg<!-- .ta .5i -->
330437eb1ca1Smrgtypedef struct {
330537eb1ca1Smrg     XID class;
330637eb1ca1Smrg     int length;
330737eb1ca1Smrg     XID id;
330837eb1ca1Smrg     int percent;
330937eb1ca1Smrg     int pitch;
331037eb1ca1Smrg     int duration;
331137eb1ca1Smrg} XBellFeedbackControl;
331237eb1ca1Smrg</literallayout>
331337eb1ca1Smrg</para>
331437eb1ca1Smrg<para>
331537eb1ca1Smrg<!-- .LP -->
331637eb1ca1Smrg<!-- .eM -->
331737eb1ca1SmrgValid masks are as follows:
331837eb1ca1Smrg<!-- .sM -->
331937eb1ca1Smrg</para>
332037eb1ca1Smrg
332137eb1ca1Smrg
332237eb1ca1Smrg<literallayout class="monospaced">
332337eb1ca1Smrg
332437eb1ca1Smrg#define   DvPercent                   (1L&lt;&lt;1)
332537eb1ca1Smrg#define   DvPitch                     (1L&lt;&lt;2)
332637eb1ca1Smrg#define   DvDuration                  (1L&lt;&lt;3)
332737eb1ca1Smrg</literallayout>
332837eb1ca1Smrg
332937eb1ca1Smrg<para>
333037eb1ca1Smrg<!-- .LP -->
333137eb1ca1Smrg<!-- .eM -->
333237eb1ca1SmrgFeedback class
333337eb1ca1Smrg<function>LedFeedback</function>
333437eb1ca1Smrgcontrols lights on an input device and are reported via the
333537eb1ca1Smrg<function>LedFeedbackControl</function>
333637eb1ca1Smrgstructure, which is defined as follows:
333737eb1ca1Smrg</para>
333837eb1ca1Smrg<para>
333937eb1ca1Smrg<!-- .LP -->
334037eb1ca1Smrg<!-- .sM -->
334137eb1ca1Smrg<literallayout class="monospaced">
334237eb1ca1Smrg<!-- .TA .5i -->
334337eb1ca1Smrg<!-- .ta .5i -->
334437eb1ca1Smrgtypedef struct {
334537eb1ca1Smrg     XID class;
334637eb1ca1Smrg     int length;
334737eb1ca1Smrg     XID id;
334837eb1ca1Smrg     int led_mask;
334937eb1ca1Smrg     int led_values;
335037eb1ca1Smrg} XLedFeedbackControl;
335137eb1ca1Smrg</literallayout>
335237eb1ca1Smrg</para>
335337eb1ca1Smrg<para>
335437eb1ca1Smrg<!-- .LP -->
335537eb1ca1Smrg<!-- .eM -->
335637eb1ca1SmrgValid masks are as follows:
335737eb1ca1Smrg<!-- .sM -->
335837eb1ca1Smrg</para>
335937eb1ca1Smrg
336037eb1ca1Smrg<literallayout class="monospaced">
336137eb1ca1Smrg
336237eb1ca1Smrg#define   DvLed                       (1L&lt;&lt;4)
336337eb1ca1Smrg#define   DvLedMode                   (1L&lt;&lt;5)
336437eb1ca1Smrg</literallayout>
336537eb1ca1Smrg
336637eb1ca1Smrg<para>
336737eb1ca1Smrg<!-- .LP -->
336837eb1ca1Smrg<!-- .eM -->
3369f1ee322dSmrg<xref linkend='XChangeFeedbackControl' xrefstyle='select: title'/>
337037eb1ca1Smrgcan generate
337137eb1ca1Smrg<function>BadDevice ,</function>
337237eb1ca1Smrg<function>BadFeedBack ,</function>
337337eb1ca1Smrg<function>BadMatch ,</function>
337437eb1ca1Smrgand
337537eb1ca1Smrg<function>BadValue</function>
337637eb1ca1Smrgerrors.
337737eb1ca1Smrg</para>
337837eb1ca1Smrg</sect3>
337937eb1ca1Smrg<sect3 id="Ringing_a_Bell_on_an_Input_Device">
338037eb1ca1Smrg<title>Ringing a Bell on an Input Device</title>
338137eb1ca1Smrg<!-- .XS -->
338237eb1ca1Smrg<!-- (SN Ringing a Bell on an Input Device -->
338337eb1ca1Smrg<!-- .XE -->
338437eb1ca1Smrg<para>
338537eb1ca1Smrg<!-- .LP -->
338637eb1ca1SmrgTo ring a bell on an extension input device, use
338737eb1ca1Smrg<function>XDeviceBell .</function>
338837eb1ca1Smrg<!-- .sM -->
3389f1ee322dSmrg<funcsynopsis id='XDeviceBell'>
339037eb1ca1Smrg<funcprototype>
339137eb1ca1Smrg  <funcdef>int <function> XDeviceBell</function></funcdef>
339237eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
339337eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
339437eb1ca1Smrg  <paramdef>XIDfeedbackclass,<parameter> feedbackid</parameter></paramdef>
339537eb1ca1Smrg  <paramdef>int<parameter> percent</parameter></paramdef>
339637eb1ca1Smrg</funcprototype>
339737eb1ca1Smrg</funcsynopsis>
339837eb1ca1Smrg<!-- .FN -->
339937eb1ca1Smrg<variablelist>
340037eb1ca1Smrg  <varlistentry>
340137eb1ca1Smrg    <term>
340237eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
340337eb1ca1Smrg    </term>
340437eb1ca1Smrg    <listitem>
340537eb1ca1Smrg      <para>
340637eb1ca1SmrgSpecifies the connection to the X server.
340737eb1ca1Smrg      </para>
340837eb1ca1Smrg    </listitem>
340937eb1ca1Smrg  </varlistentry>
341037eb1ca1Smrg  <varlistentry>
341137eb1ca1Smrg    <term>
341237eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
341337eb1ca1Smrg    </term>
341437eb1ca1Smrg    <listitem>
341537eb1ca1Smrg      <para>
341637eb1ca1SmrgSpecifies the desired device.
341737eb1ca1Smrg      </para>
341837eb1ca1Smrg    </listitem>
341937eb1ca1Smrg  </varlistentry>
342037eb1ca1Smrg  <varlistentry>
342137eb1ca1Smrg    <term>
342237eb1ca1Smrg      <emphasis remap='I'>feedbackclass</emphasis>
342337eb1ca1Smrg    </term>
342437eb1ca1Smrg    <listitem>
342537eb1ca1Smrg      <para>
342637eb1ca1SmrgSpecifies the feedbackclass.  Valid values are
342737eb1ca1Smrg<function>KbdFeedbackClass</function>
342837eb1ca1Smrgand
342937eb1ca1Smrg<function>BellFeedbackClass .</function>
343037eb1ca1Smrg      </para>
343137eb1ca1Smrg    </listitem>
343237eb1ca1Smrg  </varlistentry>
343337eb1ca1Smrg  <varlistentry>
343437eb1ca1Smrg    <term>
343537eb1ca1Smrg      <emphasis remap='I'>feedbackid</emphasis>
343637eb1ca1Smrg    </term>
343737eb1ca1Smrg    <listitem>
343837eb1ca1Smrg      <para>
343937eb1ca1SmrgSpecifies the ID of the feedback that has the bell.
344037eb1ca1Smrg      </para>
344137eb1ca1Smrg    </listitem>
344237eb1ca1Smrg  </varlistentry>
344337eb1ca1Smrg  <varlistentry>
344437eb1ca1Smrg    <term>
344537eb1ca1Smrg      <emphasis remap='I'>percent</emphasis>
344637eb1ca1Smrg    </term>
344737eb1ca1Smrg    <listitem>
344837eb1ca1Smrg      <para>
344937eb1ca1SmrgSpecifies the volume in the range -100 (quiet) to 100 percent (loud).
345037eb1ca1Smrg    </para>
345137eb1ca1Smrg  </listitem>
345237eb1ca1Smrg  </varlistentry>
345337eb1ca1Smrg</variablelist>
345437eb1ca1Smrg</para>
345537eb1ca1Smrg<para>
345637eb1ca1Smrg<!-- .LP -->
345737eb1ca1Smrg<!-- .eM -->
3458f1ee322dSmrg<xref linkend='XDeviceBell' xrefstyle='select: title'/>
345937eb1ca1Smrgis analogous to the core 
3460f1ee322dSmrg<olink targetdoc='libX11' targetptr='XBell'><function>XBell</function></olink>
346137eb1ca1Smrgfunction.  It rings the specified bell on the specified input device feedback,
346237eb1ca1Smrgusing the specified volume.
346337eb1ca1SmrgThe specified volume is relative to the base volume for the feedback.
346437eb1ca1SmrgIf the value for the percent argument is not in the range -100 to 100
346537eb1ca1Smrginclusive, a
346637eb1ca1Smrg<function>BadValue</function>
346737eb1ca1Smrgerror results.
346837eb1ca1SmrgThe volume at which the bell rings when the percent argument is nonnegative is:
346937eb1ca1Smrg</para>
347037eb1ca1Smrg<para>
347137eb1ca1Smrg<!-- .LP -->
347237eb1ca1Smrg<literallayout class="monospaced">
347337eb1ca1Smrg       base - [(base * percent) / 100] + percent
347437eb1ca1Smrg</literallayout>
347537eb1ca1Smrg</para>
347637eb1ca1Smrg<para>
347737eb1ca1Smrg<!-- .LP -->
347837eb1ca1SmrgThe volume at which the bell rings
347937eb1ca1Smrgwhen the percent argument is negative is:
348037eb1ca1Smrg</para>
348137eb1ca1Smrg<para>
348237eb1ca1Smrg<!-- .LP -->
348337eb1ca1Smrg<literallayout class="monospaced">
348437eb1ca1Smrg       base + [(base * percent) / 100]
348537eb1ca1Smrg</literallayout>
348637eb1ca1Smrg</para>
348737eb1ca1Smrg<para>
348837eb1ca1Smrg<!-- .LP -->
348937eb1ca1SmrgTo change the base volume of the bell, use
349037eb1ca1Smrg<function>XChangeFeedbackControl .</function>
349137eb1ca1Smrg</para>
349237eb1ca1Smrg<para>
349337eb1ca1Smrg<!-- .LP -->
3494f1ee322dSmrg<xref linkend='XDeviceBell' xrefstyle='select: title'/>
349537eb1ca1Smrgcan generate
349637eb1ca1Smrg<function>BadDevice</function>
349737eb1ca1Smrgand
349837eb1ca1Smrg<function>BadValue</function>
349937eb1ca1Smrgerrors.
350037eb1ca1Smrg</para>
350137eb1ca1Smrg</sect3>
350237eb1ca1Smrg<sect3 id="Controlling_Device_Encoding">
350337eb1ca1Smrg<title>Controlling Device Encoding</title>
350437eb1ca1Smrg<!-- .XS -->
350537eb1ca1Smrg<!-- (SN Controlling Device Encoding -->
350637eb1ca1Smrg<!-- .XE -->
350737eb1ca1Smrg<para>
350837eb1ca1Smrg<!-- .LP -->
350937eb1ca1SmrgTo get the key mapping of an extension device that supports input class 
351037eb1ca1Smrg<function>Keys ,</function>
351137eb1ca1Smrguse 
351237eb1ca1Smrg<function>XGetDeviceKeyMapping .</function>
351337eb1ca1Smrg<!-- .sM -->
3514f1ee322dSmrg<funcsynopsis id='XGetDeviceKeyMapping'>
351537eb1ca1Smrg<funcprototype>
351637eb1ca1Smrg  <funcdef>KeySym * <function> XGetDeviceKeyMapping</function></funcdef>
351737eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
351837eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
351937eb1ca1Smrg  <paramdef>KeyCode<parameter> first_keycode_wanted</parameter></paramdef>
352037eb1ca1Smrg  <paramdef>int<parameter> keycode_count</parameter></paramdef>
352137eb1ca1Smrg  <paramdef>int<parameter> *keysyms_per_keycode_return</parameter></paramdef>
352237eb1ca1Smrg</funcprototype>
352337eb1ca1Smrg</funcsynopsis>
352437eb1ca1Smrg<!-- .FN -->
352537eb1ca1Smrg<variablelist>
352637eb1ca1Smrg  <varlistentry>
352737eb1ca1Smrg    <term>
352837eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
352937eb1ca1Smrg    </term>
353037eb1ca1Smrg    <listitem>
353137eb1ca1Smrg      <para>
353237eb1ca1SmrgSpecifies the connection to the X server.
353337eb1ca1Smrg      </para>
353437eb1ca1Smrg    </listitem>
353537eb1ca1Smrg  </varlistentry>
353637eb1ca1Smrg  <varlistentry>
353737eb1ca1Smrg    <term>
353837eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
353937eb1ca1Smrg    </term>
354037eb1ca1Smrg    <listitem>
354137eb1ca1Smrg      <para>
354237eb1ca1SmrgSpecifies the desired device.
354337eb1ca1Smrg      </para>
354437eb1ca1Smrg    </listitem>
354537eb1ca1Smrg  </varlistentry>
354637eb1ca1Smrg  <varlistentry>
354737eb1ca1Smrg    <term>
354837eb1ca1Smrg      <emphasis remap='I'>first_keycode_wanted</emphasis>
354937eb1ca1Smrg    </term>
355037eb1ca1Smrg    <listitem>
355137eb1ca1Smrg      <para>
355237eb1ca1SmrgSpecifies the first keycode that is to be returned.
355337eb1ca1Smrg      </para>
355437eb1ca1Smrg    </listitem>
355537eb1ca1Smrg  </varlistentry>
355637eb1ca1Smrg  <varlistentry>
355737eb1ca1Smrg    <term>
355837eb1ca1Smrg      <emphasis remap='I'>keycode_count</emphasis>
355937eb1ca1Smrg    </term>
356037eb1ca1Smrg    <listitem>
356137eb1ca1Smrg      <para>
356237eb1ca1SmrgSpecifies the number of keycodes that are to be returned.
356337eb1ca1Smrg      </para>
356437eb1ca1Smrg    </listitem>
356537eb1ca1Smrg  </varlistentry>
356637eb1ca1Smrg  <varlistentry>
356737eb1ca1Smrg    <term>
356837eb1ca1Smrg      <emphasis remap='I'>keysyms_per_keycode_return</emphasis>
356937eb1ca1Smrg    </term>
357037eb1ca1Smrg    <listitem>
357137eb1ca1Smrg      <para>
357237eb1ca1SmrgReturns the number of keysyms per keycode.
357337eb1ca1Smrg    </para>
357437eb1ca1Smrg  </listitem>
357537eb1ca1Smrg  </varlistentry>
357637eb1ca1Smrg</variablelist>
357737eb1ca1Smrg</para>
357837eb1ca1Smrg<para>
357937eb1ca1Smrg<!-- .LP -->
358037eb1ca1Smrg<!-- .eM -->
3581f1ee322dSmrg<xref linkend='XGetDeviceKeyMapping' xrefstyle='select: title'/>
358237eb1ca1Smrgis analogous to the core
3583f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGetKeyboardMapping'><function>XGetKeyboardMapping</function></olink>
358437eb1ca1Smrgfunction.  
358537eb1ca1SmrgIt returns the symbols for the specified number of keycodes for the 
358637eb1ca1Smrgspecified extension device.
358737eb1ca1Smrg</para>
358837eb1ca1Smrg<para>
358937eb1ca1Smrg<!-- .LP -->
3590f1ee322dSmrg<xref linkend='XGetDeviceKeyMapping' xrefstyle='select: title'/>
359137eb1ca1Smrgreturns the symbols for the 
359237eb1ca1Smrgspecified number of keycodes for the 
359337eb1ca1Smrgspecified extension device, starting with the specified keycode.
359437eb1ca1SmrgThe first_keycode_wanted must be greater than or equal to
359537eb1ca1Smrgmin-keycode as returned 
359637eb1ca1Smrgby the
3597f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
359837eb1ca1Smrgrequest (else a 
359937eb1ca1Smrg<function>BadValue</function>
360037eb1ca1Smrgerror results). The following value:
360137eb1ca1Smrg<literallayout class="monospaced">
360237eb1ca1Smrgfirst_keycode_wanted + keycode_count - 1
360337eb1ca1Smrg</literallayout>
360437eb1ca1Smrg</para>
360537eb1ca1Smrg<para>
360637eb1ca1Smrg<!-- .LP -->
360737eb1ca1Smrgmust be less than or equal to max-keycode as returned 
360837eb1ca1Smrgby the 
3609f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
361037eb1ca1Smrgrequest (else a 
361137eb1ca1Smrg<function>BadValue</function>
361237eb1ca1Smrgerror results).
361337eb1ca1Smrg</para>
361437eb1ca1Smrg<para>
361537eb1ca1Smrg<!-- .LP -->
361637eb1ca1SmrgThe number of elements in the keysyms list is as follows:
361737eb1ca1Smrg<literallayout class="monospaced">
361837eb1ca1Smrgkeycode_count * keysyms_per_keycode_return
361937eb1ca1Smrg</literallayout>
362037eb1ca1SmrgAnd KEYSYM number N (counting from zero) for keycode K has an index
362137eb1ca1Smrg(counting from zero), in keysyms, of the following:
362237eb1ca1Smrg<literallayout class="monospaced">
362337eb1ca1Smrg(K - first_keycode_wanted) * keysyms_per_keycode_return + N
362437eb1ca1Smrg</literallayout>
362537eb1ca1Smrg</para>
362637eb1ca1Smrg<para>
362737eb1ca1Smrg<!-- .LP -->
362837eb1ca1SmrgThe keysyms_per_keycode_return value is chosen arbitrarily by the server
362937eb1ca1Smrgto be large enough to report all requested symbols.
363037eb1ca1SmrgA special KEYSYM value of
363137eb1ca1Smrg<function>NoSymbol</function>
363237eb1ca1Smrgis used to fill in unused elements for individual keycodes.
363337eb1ca1Smrg</para>
363437eb1ca1Smrg<para>
363537eb1ca1Smrg<!-- .LP -->
363637eb1ca1SmrgTo free the data returned by this function, use
3637f1ee322dSmrg<olink targetdoc='libX11' targetptr='XFree'><function>XFree</function></olink>.
363837eb1ca1Smrg</para>
363937eb1ca1Smrg<para>
364037eb1ca1Smrg<!-- .LP -->
364137eb1ca1SmrgIf the specified device has not first been opened by this client via
364237eb1ca1Smrg<function>XOpenDevice ,</function>
364337eb1ca1Smrgthis request will fail with a
364437eb1ca1Smrg<function>BadDevice</function>
364537eb1ca1Smrgerror.
364637eb1ca1SmrgIf that device does not support input class
364737eb1ca1Smrg<function>Keys ,</function>
364837eb1ca1Smrgthis request will fail with a 
364937eb1ca1Smrg<function>BadMatch</function>
365037eb1ca1Smrgerror.
365137eb1ca1Smrg</para>
365237eb1ca1Smrg<para>
365337eb1ca1Smrg<!-- .LP -->
3654f1ee322dSmrg<xref linkend='XGetDeviceKeyMapping' xrefstyle='select: title'/>
365537eb1ca1Smrgcan generate
365637eb1ca1Smrg<function>BadDevice ,</function>
365737eb1ca1Smrg<function>BadMatch ,</function>
365837eb1ca1Smrgand
365937eb1ca1Smrg<function>BadValue</function>
366037eb1ca1Smrgerrors.
366137eb1ca1Smrg<!-- .sp  -->
366237eb1ca1Smrg</para>
366337eb1ca1Smrg<para>
366437eb1ca1Smrg<!-- .LP -->
366537eb1ca1SmrgTo change the keyboard mapping of an extension device that supports input class 
366637eb1ca1Smrg<function>Keys ,</function>
366737eb1ca1Smrguse 
366837eb1ca1Smrg<function>XChangeDeviceKeyMapping .</function>
366937eb1ca1Smrg<!-- .sM -->
3670f1ee322dSmrg<funcsynopsis id='XChangeDeviceKeyMapping'>
367137eb1ca1Smrg<funcprototype>
367237eb1ca1Smrg  <funcdef>int <function> XChangeDeviceKeyMapping</function></funcdef>
367337eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
367437eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
367537eb1ca1Smrg  <paramdef>int<parameter> first_keycode</parameter></paramdef>
367637eb1ca1Smrg  <paramdef>int<parameter> keysyms_per_keycode</parameter></paramdef>
367737eb1ca1Smrg  <paramdef>KeySym<parameter> *keysyms</parameter></paramdef>
367837eb1ca1Smrg  <paramdef>int<parameter> num_codes</parameter></paramdef>
367937eb1ca1Smrg</funcprototype>
368037eb1ca1Smrg</funcsynopsis>
368137eb1ca1Smrg<!-- .FN -->
368237eb1ca1Smrg<variablelist>
368337eb1ca1Smrg  <varlistentry>
368437eb1ca1Smrg    <term>
368537eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
368637eb1ca1Smrg    </term>
368737eb1ca1Smrg    <listitem>
368837eb1ca1Smrg      <para>
368937eb1ca1SmrgSpecifies the connection to the X server.
369037eb1ca1Smrg      </para>
369137eb1ca1Smrg    </listitem>
369237eb1ca1Smrg  </varlistentry>
369337eb1ca1Smrg  <varlistentry>
369437eb1ca1Smrg    <term>
369537eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
369637eb1ca1Smrg    </term>
369737eb1ca1Smrg    <listitem>
369837eb1ca1Smrg      <para>
369937eb1ca1SmrgSpecifies the desired device.
370037eb1ca1Smrg      </para>
370137eb1ca1Smrg    </listitem>
370237eb1ca1Smrg  </varlistentry>
370337eb1ca1Smrg  <varlistentry>
370437eb1ca1Smrg    <term>
370537eb1ca1Smrg      <emphasis remap='I'>first_keycode</emphasis>
370637eb1ca1Smrg    </term>
370737eb1ca1Smrg    <listitem>
370837eb1ca1Smrg      <para>
370937eb1ca1SmrgSpecifies the first keycode that is to be changed.
371037eb1ca1Smrg      </para>
371137eb1ca1Smrg    </listitem>
371237eb1ca1Smrg  </varlistentry>
371337eb1ca1Smrg  <varlistentry>
371437eb1ca1Smrg    <term>
371537eb1ca1Smrg      <emphasis remap='I'>keysyms_per_keycode</emphasis>
371637eb1ca1Smrg    </term>
371737eb1ca1Smrg    <listitem>
371837eb1ca1Smrg      <para>
371937eb1ca1SmrgSpecifies the keysyms that are to be used.
372037eb1ca1Smrg      </para>
372137eb1ca1Smrg    </listitem>
372237eb1ca1Smrg  </varlistentry>
372337eb1ca1Smrg  <varlistentry>
372437eb1ca1Smrg    <term>
372537eb1ca1Smrg      <emphasis remap='I'>keysyms</emphasis>
372637eb1ca1Smrg    </term>
372737eb1ca1Smrg    <listitem>
372837eb1ca1Smrg      <para>
372937eb1ca1SmrgSpecifies a pointer to an array of keysyms.
373037eb1ca1Smrg      </para>
373137eb1ca1Smrg    </listitem>
373237eb1ca1Smrg  </varlistentry>
373337eb1ca1Smrg  <varlistentry>
373437eb1ca1Smrg    <term>
373537eb1ca1Smrg      <emphasis remap='I'>num_codes</emphasis>
373637eb1ca1Smrg    </term>
373737eb1ca1Smrg    <listitem>
373837eb1ca1Smrg      <para>
373937eb1ca1SmrgSpecifies the number of keycodes that are to be changed.
374037eb1ca1Smrg    </para>
374137eb1ca1Smrg  </listitem>
374237eb1ca1Smrg  </varlistentry>
374337eb1ca1Smrg</variablelist>
374437eb1ca1Smrg</para>
374537eb1ca1Smrg<para>
374637eb1ca1Smrg<!-- .LP -->
374737eb1ca1Smrg<!-- .eM -->
3748f1ee322dSmrg<xref linkend='XChangeDeviceKeyMapping' xrefstyle='select: title'/>
374937eb1ca1Smrgis analogous to the core
3750f1ee322dSmrg<olink targetdoc='libX11' targetptr='XChangeKeyboardMapping'><function>XChangeKeyboardMapping</function></olink>
375137eb1ca1Smrgfunction.  
375237eb1ca1SmrgIt defines the symbols for the specified number of keycodes for the 
375337eb1ca1Smrgspecified extension keyboard device.
375437eb1ca1Smrg</para>
375537eb1ca1Smrg<para>
375637eb1ca1Smrg<!-- .LP -->
375737eb1ca1SmrgIf the specified device has not first been opened by this client via
375837eb1ca1Smrg<function>XOpenDevice ,</function>
375937eb1ca1Smrgthis request will fail with a
376037eb1ca1Smrg<function>BadDevice</function>
376137eb1ca1Smrgerror.
376237eb1ca1SmrgIf the specified device does not support input class
376337eb1ca1Smrg<function>Keys ,</function>
376437eb1ca1Smrgthis request will fail with a
376537eb1ca1Smrg<function>BadMatch</function>
376637eb1ca1Smrgerror.
376737eb1ca1Smrg</para>
376837eb1ca1Smrg<para>
376937eb1ca1Smrg<!-- .LP -->
377037eb1ca1SmrgThe number of elements in the keysyms list must be a multiple of
377137eb1ca1Smrgkeysyms_per_keycode.  Otherwise,
3772f1ee322dSmrg<xref linkend='XChangeDeviceKeyMapping' xrefstyle='select: title'/>
377337eb1ca1Smrggenerates a
377437eb1ca1Smrg<function>BadLength</function>
377537eb1ca1Smrgerror.
377637eb1ca1SmrgThe specified first_keycode must be greater than or equal to
377737eb1ca1Smrgthe min_keycode value returned by the
377837eb1ca1Smrg<function>ListInputDevices</function>
377937eb1ca1Smrgrequest, or this request will fail with a
378037eb1ca1Smrg<function>BadValue</function>
378137eb1ca1Smrgerror.  In addition, if the following expression is not less than
378237eb1ca1Smrgthe max_keycode value returned by the
378337eb1ca1Smrg<function>ListInputDevices</function>
378437eb1ca1Smrgrequest, the request will fail with a
378537eb1ca1Smrg<function>BadValue</function>
378637eb1ca1Smrgerror:
378737eb1ca1Smrg<literallayout class="monospaced">
378837eb1ca1Smrg       first_keycode + (num_codes / keysyms_per_keycode) - 1
378937eb1ca1Smrg</literallayout>
379037eb1ca1Smrg</para>
379137eb1ca1Smrg<para>
379237eb1ca1Smrg<!-- .LP -->
3793f1ee322dSmrg<xref linkend='XChangeDeviceKeyMapping' xrefstyle='select: title'/>
379437eb1ca1Smrgcan generate
379537eb1ca1Smrg<function>BadAlloc ,</function>
379637eb1ca1Smrg<function>BadDevice ,</function>
379737eb1ca1Smrg<function>BadMatch ,</function>
379837eb1ca1Smrgand
379937eb1ca1Smrg<function>BadValue</function>
380037eb1ca1Smrgerrors.
380137eb1ca1Smrg<!-- .sp -->
380237eb1ca1Smrg</para>
380337eb1ca1Smrg<para>
380437eb1ca1Smrg<!-- .LP -->
380537eb1ca1SmrgTo obtain the keycodes that are used as modifiers on an 
380637eb1ca1Smrgextension device that supports input class
380737eb1ca1Smrg<function>Keys ,</function>
380837eb1ca1Smrguse
380937eb1ca1Smrg<function>XGetDeviceModifierMapping .</function>
381037eb1ca1Smrg<!-- .sM -->
3811f1ee322dSmrg<funcsynopsis id='XGetDeviceModifierMapping'>
381237eb1ca1Smrg<funcprototype>
381337eb1ca1Smrg  <funcdef>XModifierKeymap * <function> XGetDeviceModifierMapping</function></funcdef>
381437eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
381537eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
381637eb1ca1Smrg</funcprototype>
381737eb1ca1Smrg</funcsynopsis>
381837eb1ca1Smrg<!-- .FN -->
381937eb1ca1Smrg<variablelist>
382037eb1ca1Smrg  <varlistentry>
382137eb1ca1Smrg    <term>
382237eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
382337eb1ca1Smrg    </term>
382437eb1ca1Smrg    <listitem>
382537eb1ca1Smrg      <para>
382637eb1ca1SmrgSpecifies the connection to the X server.
382737eb1ca1Smrg      </para>
382837eb1ca1Smrg    </listitem>
382937eb1ca1Smrg  </varlistentry>
383037eb1ca1Smrg  <varlistentry>
383137eb1ca1Smrg    <term>
383237eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
383337eb1ca1Smrg    </term>
383437eb1ca1Smrg    <listitem>
383537eb1ca1Smrg      <para>
383637eb1ca1SmrgSpecifies the desired device.
383737eb1ca1Smrg    </para>
383837eb1ca1Smrg  </listitem>
383937eb1ca1Smrg  </varlistentry>
384037eb1ca1Smrg</variablelist>
384137eb1ca1Smrg</para>
384237eb1ca1Smrg<para>
384337eb1ca1Smrg<!-- .LP -->
384437eb1ca1Smrg<!-- .eM -->
3845f1ee322dSmrg<xref linkend='XGetDeviceModifierMapping' xrefstyle='select: title'/>
384637eb1ca1Smrgis analogous to the core
3847f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGetModifierMapping'><function>XGetModifierMapping</function></olink>
384837eb1ca1Smrgfunction.  
384937eb1ca1SmrgThe
3850f1ee322dSmrg<xref linkend='XGetDeviceModifierMapping' xrefstyle='select: title'/>
385137eb1ca1Smrgfunction returns a newly created
385237eb1ca1Smrg<function>XModifierKeymap</function>
385337eb1ca1Smrgstructure that contains the keys being used as
385437eb1ca1Smrgmodifiers for the specified device.
385537eb1ca1SmrgThe structure should be freed after use with
385637eb1ca1Smrg<function>XFreeModifierMapping .</function>
385737eb1ca1SmrgIf only zero values appear in the set for any modifier,
385837eb1ca1Smrgthat modifier is disabled.
385937eb1ca1Smrg</para>
386037eb1ca1Smrg<para>
386137eb1ca1Smrg<!-- .LP -->
3862f1ee322dSmrg<xref linkend='XGetDeviceModifierMapping' xrefstyle='select: title'/>
386337eb1ca1Smrgcan generate
386437eb1ca1Smrg<function>BadDevice</function>
386537eb1ca1Smrgand
386637eb1ca1Smrg<function>BadMatch</function>
386737eb1ca1Smrgerrors.
386837eb1ca1Smrg<!-- .sp -->
386937eb1ca1Smrg</para>
387037eb1ca1Smrg<para>
387137eb1ca1Smrg<!-- .LP -->
387237eb1ca1SmrgTo set which keycodes are to be used as modifiers for an extension device, use
387337eb1ca1Smrg<function>XSetDeviceModifierMapping .</function>
387437eb1ca1Smrg<!-- .sM -->
3875f1ee322dSmrg<funcsynopsis id='XSetDeviceModifierMapping'>
387637eb1ca1Smrg<funcprototype>
387737eb1ca1Smrg  <funcdef>int <function> XSetDeviceModifierMapping</function></funcdef>
387837eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
387937eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
388037eb1ca1Smrg  <paramdef>XModifierKeymap<parameter> *modmap</parameter></paramdef>
388137eb1ca1Smrg</funcprototype>
388237eb1ca1Smrg</funcsynopsis>
388337eb1ca1Smrg<!-- .FN -->
388437eb1ca1Smrg<variablelist>
388537eb1ca1Smrg  <varlistentry>
388637eb1ca1Smrg    <term>
388737eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
388837eb1ca1Smrg    </term>
388937eb1ca1Smrg    <listitem>
389037eb1ca1Smrg      <para>
389137eb1ca1SmrgSpecifies the connection to the X server.
389237eb1ca1Smrg      </para>
389337eb1ca1Smrg    </listitem>
389437eb1ca1Smrg  </varlistentry>
389537eb1ca1Smrg  <varlistentry>
389637eb1ca1Smrg    <term>
389737eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
389837eb1ca1Smrg    </term>
389937eb1ca1Smrg    <listitem>
390037eb1ca1Smrg      <para>
390137eb1ca1SmrgSpecifies the desired device.
390237eb1ca1Smrg      </para>
390337eb1ca1Smrg    </listitem>
390437eb1ca1Smrg  </varlistentry>
390537eb1ca1Smrg  <varlistentry>
390637eb1ca1Smrg    <term>
390737eb1ca1Smrg      <emphasis remap='I'>modmap</emphasis>
390837eb1ca1Smrg    </term>
390937eb1ca1Smrg    <listitem>
391037eb1ca1Smrg      <para>
391137eb1ca1SmrgSpecifies a pointer to the
391237eb1ca1Smrg<function>XModifierKeymap</function>
391337eb1ca1Smrgstructure.
391437eb1ca1Smrg    </para>
391537eb1ca1Smrg  </listitem>
391637eb1ca1Smrg  </varlistentry>
391737eb1ca1Smrg</variablelist>
391837eb1ca1Smrg</para>
391937eb1ca1Smrg<para>
392037eb1ca1Smrg<!-- .LP -->
392137eb1ca1Smrg<!-- .eM -->
3922f1ee322dSmrg<xref linkend='XSetDeviceModifierMapping' xrefstyle='select: title'/>
392337eb1ca1Smrgis analogous to the core
3924f1ee322dSmrg<olink targetdoc='libX11' targetptr='XSetModifierMapping'><function>XSetModifierMapping</function></olink>
392537eb1ca1Smrgfunction.  
392637eb1ca1SmrgThe 
3927f1ee322dSmrg<xref linkend='XSetDeviceModifierMapping' xrefstyle='select: title'/>
392837eb1ca1Smrgfunction specifies the keycodes of the keys, if any, 
392937eb1ca1Smrgthat are to be used as modifiers.  A zero value means
393037eb1ca1Smrgthat no key should be used.  No two arguments can have the same nonzero
393137eb1ca1Smrgkeycode value.  Otherwise,
3932f1ee322dSmrg<xref linkend='XSetDeviceModifierMapping' xrefstyle='select: title'/>
393337eb1ca1Smrggenerates a
393437eb1ca1Smrg<function>BadValue</function>
393537eb1ca1Smrgerror.
393637eb1ca1SmrgThere are eight modifiers, and the modifiermap member of the 
393737eb1ca1Smrg<function>XModifierKeymap</function>
393837eb1ca1Smrgstructure contains eight sets of max_keypermod 
393937eb1ca1Smrgkeycodes, one for each modifier in the order 
394037eb1ca1Smrg<function>Shift ,</function>
394137eb1ca1Smrg<function>Lock ,</function>
394237eb1ca1Smrg<function>Control ,</function>
394337eb1ca1Smrg<function>Mod1 ,</function>
394437eb1ca1Smrg<function>Mod2 ,</function>
394537eb1ca1Smrg<function>Mod3 ,</function>
394637eb1ca1Smrg<function>Mod4 ,</function>
394737eb1ca1Smrgand
394837eb1ca1Smrg<function>Mod5 .</function>
394937eb1ca1SmrgOnly nonzero keycodes have meaning in each set, and zero keycodes
395037eb1ca1Smrgare ignored.
395137eb1ca1SmrgIn addition, all of the nonzero keycodes must be in the range specified by 
395237eb1ca1Smrgmin_keycode and max_keycode reported by the
3953f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
395437eb1ca1Smrgfunction.
395537eb1ca1SmrgOtherwise,
3956f1ee322dSmrg<olink targetdoc='libX11' targetptr='XSetModifierMapping'><function>XSetModifierMapping</function></olink>
395737eb1ca1Smrggenerates a
395837eb1ca1Smrg<function>BadValue</function>
395937eb1ca1Smrgerror.
396037eb1ca1SmrgNo keycode may appear twice in the entire map. 
396137eb1ca1SmrgOtherwise, it generates a
396237eb1ca1Smrg<function>BadValue</function>
396337eb1ca1Smrgerror.
396437eb1ca1Smrg</para>
396537eb1ca1Smrg<para>
396637eb1ca1Smrg<!-- .LP -->
396737eb1ca1SmrgA X server can impose restrictions on how modifiers can be changed, 
396837eb1ca1Smrgfor example,
396937eb1ca1Smrgif certain keys do not generate up transitions in hardware or if multiple
397037eb1ca1Smrgmodifier keys are not supported.  
397137eb1ca1SmrgIf some such restriction is violated, 
397237eb1ca1Smrgthe status reply is
397337eb1ca1Smrg<function>MappingFailed ,</function>
397437eb1ca1Smrgand none of the modifiers are changed.
397537eb1ca1SmrgIf the new keycodes specified for a modifier differ from those
397637eb1ca1Smrgcurrently defined and any (current or new) keys for that modifier are
397737eb1ca1Smrgin the logically down state, 
397837eb1ca1Smrgthe status reply is
397937eb1ca1Smrg<function>MappingBusy , </function>
398037eb1ca1Smrgand none of the modifiers are changed.
3981f1ee322dSmrg<olink targetdoc='libX11' targetptr='XSetModifierMapping'><function>XSetModifierMapping</function></olink>
398237eb1ca1Smrggenerates a
398337eb1ca1Smrg<function>DeviceMappingNotify</function>
398437eb1ca1Smrgevent on a
398537eb1ca1Smrg<function>MappingSuccess</function>
398637eb1ca1Smrgstatus.
398737eb1ca1Smrg</para>
398837eb1ca1Smrg<para>
398937eb1ca1Smrg<!-- .LP -->
3990f1ee322dSmrg<xref linkend='XSetDeviceModifierMapping' xrefstyle='select: title'/>
399137eb1ca1Smrgcan generate
399237eb1ca1Smrg<function>BadAlloc ,</function>
399337eb1ca1Smrg<function>BadDevice ,</function>
399437eb1ca1Smrg<function>BadMatch ,</function>
399537eb1ca1Smrgand
399637eb1ca1Smrg<function>BadValue</function>
399737eb1ca1Smrgerrors.
399837eb1ca1Smrg</para>
399937eb1ca1Smrg</sect3>
400037eb1ca1Smrg<sect3 id="Controlling_Button_Mapping">
400137eb1ca1Smrg<title>Controlling Button Mapping</title>
400237eb1ca1Smrg<!-- .XS -->
400337eb1ca1Smrg<!-- (SN Controlling Button Mapping -->
400437eb1ca1Smrg<!-- .XE -->
400537eb1ca1Smrg<para>
400637eb1ca1Smrg<!-- .LP -->
400737eb1ca1SmrgTo set the mapping of the buttons on an extension device, use
400837eb1ca1Smrg<function>XSetDeviceButtonMapping .</function>
400937eb1ca1Smrg<!-- .sM -->
4010f1ee322dSmrg<funcsynopsis id='XSetDeviceButtonMapping'>
401137eb1ca1Smrg<funcprototype>
401237eb1ca1Smrg  <funcdef>int <function> XSetDeviceButtonMapping</function></funcdef>
401337eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
401437eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
401537eb1ca1Smrg  <paramdef>unsignedchar<parameter> map[]</parameter></paramdef>
401637eb1ca1Smrg  <paramdef>int<parameter> nmap</parameter></paramdef>
401737eb1ca1Smrg</funcprototype>
401837eb1ca1Smrg</funcsynopsis>
401937eb1ca1Smrg<!-- .FN -->
402037eb1ca1Smrg<variablelist>
402137eb1ca1Smrg  <varlistentry>
402237eb1ca1Smrg    <term>
402337eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
402437eb1ca1Smrg    </term>
402537eb1ca1Smrg    <listitem>
402637eb1ca1Smrg      <para>
402737eb1ca1SmrgSpecifies the connection to the X server.
402837eb1ca1Smrg      </para>
402937eb1ca1Smrg    </listitem>
403037eb1ca1Smrg  </varlistentry>
403137eb1ca1Smrg  <varlistentry>
403237eb1ca1Smrg    <term>
403337eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
403437eb1ca1Smrg    </term>
403537eb1ca1Smrg    <listitem>
403637eb1ca1Smrg      <para>
403737eb1ca1SmrgSpecifies the desired device.
403837eb1ca1Smrg      </para>
403937eb1ca1Smrg    </listitem>
404037eb1ca1Smrg  </varlistentry>
404137eb1ca1Smrg  <varlistentry>
404237eb1ca1Smrg    <term>
404337eb1ca1Smrg      <emphasis remap='I'>map</emphasis>
404437eb1ca1Smrg    </term>
404537eb1ca1Smrg    <listitem>
404637eb1ca1Smrg      <para>
404737eb1ca1SmrgSpecifies the mapping list.
404837eb1ca1Smrg      </para>
404937eb1ca1Smrg    </listitem>
405037eb1ca1Smrg  </varlistentry>
405137eb1ca1Smrg  <varlistentry>
405237eb1ca1Smrg    <term>
405337eb1ca1Smrg      <emphasis remap='I'>nmap</emphasis>
405437eb1ca1Smrg    </term>
405537eb1ca1Smrg    <listitem>
405637eb1ca1Smrg      <para>
405737eb1ca1SmrgSpecifies the number of items in the mapping list.
405837eb1ca1Smrg    </para>
405937eb1ca1Smrg  </listitem>
406037eb1ca1Smrg  </varlistentry>
406137eb1ca1Smrg</variablelist>
406237eb1ca1Smrg</para>
406337eb1ca1Smrg<para>
406437eb1ca1Smrg<!-- .LP -->
406537eb1ca1Smrg<!-- .eM -->
4066f1ee322dSmrg<xref linkend='XSetDeviceButtonMapping' xrefstyle='select: title'/>
406737eb1ca1Smrgsets the mapping of the buttons on an extension device.
406837eb1ca1SmrgIf it succeeds, the X server generates a
406937eb1ca1Smrg<function>DeviceMappingNotify</function>
407037eb1ca1Smrgevent, and
4071f1ee322dSmrg<xref linkend='XSetDeviceButtonMapping' xrefstyle='select: title'/>
407237eb1ca1Smrgreturns
407337eb1ca1Smrg<function>MappingSuccess .</function>
407437eb1ca1SmrgElements of the list are indexed starting from one.
407537eb1ca1SmrgThe length of the list must be the same as
4076f1ee322dSmrg<xref linkend='XGetDeviceButtonMapping' xrefstyle='select: title'/>
407737eb1ca1Smrgwould return, or a 
407837eb1ca1Smrg<function>BadValue</function>
407937eb1ca1Smrgerror results.
408037eb1ca1SmrgThe index is a button number, and the element of the list
408137eb1ca1Smrgdefines the effective number.
408237eb1ca1SmrgA zero element disables a button, and elements are not restricted in
408337eb1ca1Smrgvalue by the number of physical buttons.
408437eb1ca1SmrgHowever, no two elements can have the same nonzero value, or a
408537eb1ca1Smrg<function>BadValue</function>
408637eb1ca1Smrgerror results.
408737eb1ca1SmrgIf any of the buttons to be altered are logically in the down state,
4088f1ee322dSmrg<xref linkend='XSetDeviceButtonMapping' xrefstyle='select: title'/>
408937eb1ca1Smrgreturns
409037eb1ca1Smrg<function>MappingBusy ,</function>
409137eb1ca1Smrgand the mapping is not changed.
409237eb1ca1Smrg</para>
409337eb1ca1Smrg<para>
409437eb1ca1Smrg<!-- .LP -->
4095f1ee322dSmrg<xref linkend='XSetDeviceButtonMapping' xrefstyle='select: title'/>
409637eb1ca1Smrgcan generate
409737eb1ca1Smrg<function>BadDevice ,</function>
409837eb1ca1Smrg<function>BadMatch ,</function>
409937eb1ca1Smrgand
410037eb1ca1Smrg<function>BadValue</function>
410137eb1ca1Smrgerrors.
410237eb1ca1Smrg<!-- .sp -->
410337eb1ca1Smrg</para>
410437eb1ca1Smrg<para>
410537eb1ca1Smrg<!-- .LP -->
410637eb1ca1SmrgTo get the button mapping, use
410737eb1ca1Smrg<function>XGetDeviceButtonMapping .</function>
410837eb1ca1Smrg<!-- .sM -->
4109f1ee322dSmrg<funcsynopsis id='XGetDeviceButtonMapping'>
411037eb1ca1Smrg<funcprototype>
411137eb1ca1Smrg  <funcdef>int <function> XGetDeviceButtonMapping</function></funcdef>
411237eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
411337eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
411437eb1ca1Smrg  <paramdef>unsignedchar<parameter> map_return[]</parameter></paramdef>
411537eb1ca1Smrg  <paramdef>int<parameter> nmap</parameter></paramdef>
411637eb1ca1Smrg</funcprototype>
411737eb1ca1Smrg</funcsynopsis>
411837eb1ca1Smrg<!-- .FN -->
411937eb1ca1Smrg<variablelist>
412037eb1ca1Smrg  <varlistentry>
412137eb1ca1Smrg    <term>
412237eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
412337eb1ca1Smrg    </term>
412437eb1ca1Smrg    <listitem>
412537eb1ca1Smrg      <para>
412637eb1ca1SmrgSpecifies the connection to the X server.
412737eb1ca1Smrg      </para>
412837eb1ca1Smrg    </listitem>
412937eb1ca1Smrg  </varlistentry>
413037eb1ca1Smrg  <varlistentry>
413137eb1ca1Smrg    <term>
413237eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
413337eb1ca1Smrg    </term>
413437eb1ca1Smrg    <listitem>
413537eb1ca1Smrg      <para>
413637eb1ca1SmrgSpecifies the desired device.
413737eb1ca1Smrg      </para>
413837eb1ca1Smrg    </listitem>
413937eb1ca1Smrg  </varlistentry>
414037eb1ca1Smrg  <varlistentry>
414137eb1ca1Smrg    <term>
414237eb1ca1Smrg      <emphasis remap='I'>map_return</emphasis>
414337eb1ca1Smrg    </term>
414437eb1ca1Smrg    <listitem>
414537eb1ca1Smrg      <para>
414637eb1ca1SmrgSpecifies the mapping list.
414737eb1ca1Smrg      </para>
414837eb1ca1Smrg    </listitem>
414937eb1ca1Smrg  </varlistentry>
415037eb1ca1Smrg  <varlistentry>
415137eb1ca1Smrg    <term>
415237eb1ca1Smrg      <emphasis remap='I'>nmap</emphasis>
415337eb1ca1Smrg    </term>
415437eb1ca1Smrg    <listitem>
415537eb1ca1Smrg      <para>
415637eb1ca1SmrgSpecifies the number of items in the mapping list.
415737eb1ca1Smrg    </para>
415837eb1ca1Smrg  </listitem>
415937eb1ca1Smrg  </varlistentry>
416037eb1ca1Smrg</variablelist>
416137eb1ca1Smrg</para>
416237eb1ca1Smrg<para>
416337eb1ca1Smrg<!-- .LP -->
416437eb1ca1Smrg<!-- .eM -->
4165f1ee322dSmrg<xref linkend='XGetDeviceButtonMapping' xrefstyle='select: title'/>
416637eb1ca1Smrgreturns the current mapping of the specified extension device.
416737eb1ca1SmrgElements of the list are indexed starting from one.
4168f1ee322dSmrg<xref linkend='XGetDeviceButtonMapping' xrefstyle='select: title'/>
416937eb1ca1Smrgreturns the number of physical buttons actually on the pointer.
417037eb1ca1SmrgThe nominal mapping for the buttons is the identity mapping: map[i]=i.
417137eb1ca1SmrgThe nmap argument specifies the length of the array where the button
417237eb1ca1Smrgmapping is returned, and only the first nmap elements are returned 
417337eb1ca1Smrgin map_return.
417437eb1ca1Smrg</para>
417537eb1ca1Smrg<para>
417637eb1ca1Smrg<!-- .LP -->
4177f1ee322dSmrg<xref linkend='XGetDeviceButtonMapping' xrefstyle='select: title'/>
417837eb1ca1Smrgcan generate
417937eb1ca1Smrg<function>BadDevice</function>
418037eb1ca1Smrgand
418137eb1ca1Smrg<function>BadMatch</function>
418237eb1ca1Smrgerrors.
418337eb1ca1Smrg</para>
418437eb1ca1Smrg</sect3>
418537eb1ca1Smrg<sect3 id="Obtaining_the_State_of_a_Device">
418637eb1ca1Smrg<title>Obtaining the State of a Device</title>
418737eb1ca1Smrg<!-- .XS -->
418837eb1ca1Smrg<!-- (SN Obtaining the State of a Device -->
418937eb1ca1Smrg<!-- .XE -->
419037eb1ca1Smrg<para>
419137eb1ca1Smrg<!-- .LP -->
419237eb1ca1SmrgTo obtain information that describes the state of the keys, buttons, and 
419337eb1ca1Smrgvaluators of an extension device, use
419437eb1ca1Smrg<function>XQueryDeviceState .</function>
419537eb1ca1Smrg<!-- .sM -->
4196f1ee322dSmrg<funcsynopsis id='XQueryDeviceState'>
419737eb1ca1Smrg<funcprototype>
419837eb1ca1Smrg  <funcdef>XDeviceState * <function> XQueryDeviceState</function></funcdef>
419937eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
420037eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
420137eb1ca1Smrg</funcprototype>
420237eb1ca1Smrg</funcsynopsis>
420337eb1ca1Smrg<!-- .FN -->
420437eb1ca1Smrg<variablelist>
420537eb1ca1Smrg  <varlistentry>
420637eb1ca1Smrg    <term>
420737eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
420837eb1ca1Smrg    </term>
420937eb1ca1Smrg    <listitem>
421037eb1ca1Smrg      <para>
421137eb1ca1SmrgSpecifies the connection to the X server.
421237eb1ca1Smrg      </para>
421337eb1ca1Smrg    </listitem>
421437eb1ca1Smrg  </varlistentry>
421537eb1ca1Smrg  <varlistentry>
421637eb1ca1Smrg    <term>
421737eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
421837eb1ca1Smrg    </term>
421937eb1ca1Smrg    <listitem>
422037eb1ca1Smrg      <para>
422137eb1ca1SmrgSpecifies the desired device.
422237eb1ca1Smrg    </para>
422337eb1ca1Smrg  </listitem>
422437eb1ca1Smrg  </varlistentry>
422537eb1ca1Smrg</variablelist>
422637eb1ca1Smrg</para>
422737eb1ca1Smrg<para>
422837eb1ca1Smrg<!-- .LP -->
422937eb1ca1Smrg<!-- .eM -->
4230f1ee322dSmrg<xref linkend='XQueryDeviceState' xrefstyle='select: title'/>
423137eb1ca1Smrgreturns a pointer to an
423237eb1ca1Smrg<function>XDeviceState</function>
423337eb1ca1Smrgstructure, which points to a list of
423437eb1ca1Smrgstructures that describe the state of the keys, buttons, and valuators 
423537eb1ca1Smrgon the device:
423637eb1ca1Smrg</para>
423737eb1ca1Smrg<para>
423837eb1ca1Smrg<!-- .LP -->
423937eb1ca1Smrg<!-- .sM -->
424037eb1ca1Smrg<literallayout class="monospaced">
424137eb1ca1Smrg<!-- .TA .5i -->
424237eb1ca1Smrg<!-- .ta .5i -->
424337eb1ca1Smrgtypedef struct {
424437eb1ca1Smrg     XID device_id;
424537eb1ca1Smrg     int num_classes;
424637eb1ca1Smrg     XInputClass *data;
424737eb1ca1Smrg} XDeviceState;
424837eb1ca1Smrg</literallayout>
424937eb1ca1Smrg</para>
425037eb1ca1Smrg<para>
425137eb1ca1Smrg<!-- .LP -->
425237eb1ca1Smrg<!-- .eM -->
425337eb1ca1SmrgThe structures are of variable length, but the first 
425437eb1ca1Smrgtwo members are common to all and are as follows:
425537eb1ca1Smrg</para>
425637eb1ca1Smrg<para>
425737eb1ca1Smrg<!-- .LP -->
425837eb1ca1Smrg<!-- .sM -->
425937eb1ca1Smrg<literallayout class="monospaced">
426037eb1ca1Smrg<!-- .TA .5i -->
426137eb1ca1Smrg<!-- .ta .5i -->
426237eb1ca1Smrgtypedef struct {
426337eb1ca1Smrg     unsigned char class;
426437eb1ca1Smrg     unsigned char length;
426537eb1ca1Smrg} XInputClass;
426637eb1ca1Smrg</literallayout>
426737eb1ca1Smrg</para>
426837eb1ca1Smrg<para>
426937eb1ca1Smrg<!-- .LP -->
427037eb1ca1Smrg<!-- .eM -->
427137eb1ca1SmrgThe class member contains a class identifier.  This identifier can be
427237eb1ca1Smrgcompared with constants defined in the file 
427337eb1ca1Smrg<function>&lt; X11/extensions/XI.h &gt;.</function>
427437eb1ca1SmrgCurrently defined constants are:
427537eb1ca1Smrg<function>KeyClass ,</function>
427637eb1ca1Smrg<function>ButtonClass ,</function>
427737eb1ca1Smrgand
427837eb1ca1Smrg<function>ValuatorClass .</function>
427937eb1ca1Smrg</para>
428037eb1ca1Smrg<para>
428137eb1ca1Smrg<!-- .LP -->
428237eb1ca1SmrgThe length member contains the length of the structure and can be used
428337eb1ca1Smrgby clients to traverse the list.
428437eb1ca1Smrg</para>
428537eb1ca1Smrg<para>
428637eb1ca1Smrg<!-- .LP -->
428737eb1ca1SmrgThe 
428837eb1ca1Smrg<function>XValuatorState</function>
428937eb1ca1Smrgstructure describes the current state of the valuators
429037eb1ca1Smrgon the device.
429137eb1ca1SmrgThe num_valuators member contains the number of valuators
429237eb1ca1Smrgon the device.
429337eb1ca1SmrgThe mode member is a mask whose bits report the data mode
429437eb1ca1Smrgand other state information for the device.
429537eb1ca1SmrgThe following bits are currently defined:
429637eb1ca1Smrg<literallayout class="monospaced">
429737eb1ca1Smrg<!-- .TA .5i 1.5i 2.5i -->
429837eb1ca1Smrg<!-- .ta .5i 1.5i 2.5i -->
429937eb1ca1Smrg     DeviceMode     1 &lt;&lt; 0     Relative = 0, Absolute = 1
430037eb1ca1Smrg     ProximityState     1 &lt;&lt; 1     InProximity = 0, OutOfProximity = 1
430137eb1ca1Smrg</literallayout>
430237eb1ca1SmrgThe valuators member contains a pointer to an array of integers that
430337eb1ca1Smrgdescribe the current value of the valuators.
430437eb1ca1SmrgIf the mode is 
430537eb1ca1Smrg<function>Relative ,</function>
430637eb1ca1Smrgthese values are undefined.
430737eb1ca1Smrg</para>
430837eb1ca1Smrg<para>
430937eb1ca1Smrg<!-- .LP -->
431037eb1ca1Smrg<!-- .sM -->
431137eb1ca1Smrg<literallayout class="monospaced">
431237eb1ca1Smrg<!-- .TA .5i -->
431337eb1ca1Smrg<!-- .ta .5i -->
431437eb1ca1Smrgtypedef struct {
431537eb1ca1Smrg     unsigned char class;
431637eb1ca1Smrg     unsigned char length;
431737eb1ca1Smrg     unsigned char num_valuators;
431837eb1ca1Smrg     unsigned char mode;
431937eb1ca1Smrg     int *valuators;
432037eb1ca1Smrg} XValuatorState;
432137eb1ca1Smrg</literallayout>
432237eb1ca1Smrg</para>
432337eb1ca1Smrg<para>
432437eb1ca1Smrg<!-- .LP -->
432537eb1ca1Smrg<!-- .eM -->
432637eb1ca1SmrgThe
432737eb1ca1Smrg<function>XKeyState</function>
432837eb1ca1Smrgstructure describes the current state of the keys
432937eb1ca1Smrgon the device.  Byte N (from 0) contains the
433037eb1ca1Smrgbits for key 8N to 8N + 7 with the least significant bit in the
433137eb1ca1Smrgbyte representing key 8N.
433237eb1ca1Smrg</para>
433337eb1ca1Smrg<para>
433437eb1ca1Smrg<!-- .LP -->
433537eb1ca1Smrg<!-- .sM -->
433637eb1ca1Smrg<literallayout class="monospaced">
433737eb1ca1Smrg<!-- .TA .5i -->
433837eb1ca1Smrg<!-- .ta .5i -->
433937eb1ca1Smrgtypedef struct {
434037eb1ca1Smrg     unsigned char class;
434137eb1ca1Smrg     unsigned char length;
434237eb1ca1Smrg     short num_keys;
434337eb1ca1Smrg     char keys[32];
434437eb1ca1Smrg} XKeyState;
434537eb1ca1Smrg</literallayout>
434637eb1ca1Smrg</para>
434737eb1ca1Smrg<para>
434837eb1ca1Smrg<!-- .LP -->
434937eb1ca1Smrg<!-- .eM -->
435037eb1ca1SmrgThe
435137eb1ca1Smrg<function>XButtonState</function>
435237eb1ca1Smrgstructure describes the current state of the buttons
435337eb1ca1Smrgon the device.  Byte N (from 0) contains the bits for button 8N to 8N + 7
435437eb1ca1Smrgwith the least significant bit in the
435537eb1ca1Smrgbyte representing button 8N.
435637eb1ca1Smrg</para>
435737eb1ca1Smrg<para>
435837eb1ca1Smrg<!-- .LP -->
435937eb1ca1Smrg<!-- .sM -->
436037eb1ca1Smrg<literallayout class="monospaced">
436137eb1ca1Smrg<!-- .TA .5i -->
436237eb1ca1Smrg<!-- .ta .5i -->
436337eb1ca1Smrgtypedef struct {
436437eb1ca1Smrg     unsigned char class;
436537eb1ca1Smrg     unsigned char length;
436637eb1ca1Smrg     short num_buttons;
436737eb1ca1Smrg     char buttons[32];
436837eb1ca1Smrg} XButtonState;
436937eb1ca1Smrg</literallayout>
437037eb1ca1Smrg</para>
437137eb1ca1Smrg<para>
437237eb1ca1Smrg<!-- .LP -->
437337eb1ca1Smrg<!-- .eM -->
4374f1ee322dSmrg<xref linkend='XQueryDeviceState' xrefstyle='select: title'/>
437537eb1ca1Smrgcan generate
437637eb1ca1Smrg<function>BadDevice</function>
437737eb1ca1Smrgerrors.
437837eb1ca1Smrg<!-- .sp -->
437937eb1ca1Smrg</para>
438037eb1ca1Smrg<para>
438137eb1ca1Smrg<!-- .LP -->
438237eb1ca1SmrgTo free the data returned by this function, use
438337eb1ca1Smrg<function>XFreeDeviceState .</function>
438437eb1ca1Smrg<!-- .sM -->
4385f1ee322dSmrg<funcsynopsis id='XFreeDeviceState'>
438637eb1ca1Smrg<funcprototype>
438737eb1ca1Smrg  <funcdef>void <function> XFreeDeviceState</function></funcdef>
438837eb1ca1Smrg  <paramdef>XDeviceState<parameter> *state</parameter></paramdef>
438937eb1ca1Smrg</funcprototype>
439037eb1ca1Smrg</funcsynopsis>
439137eb1ca1Smrg<!-- .FN -->
439237eb1ca1Smrg<variablelist>
439337eb1ca1Smrg  <varlistentry>
439437eb1ca1Smrg    <term>
439537eb1ca1Smrg      <emphasis remap='I'>state</emphasis>
439637eb1ca1Smrg    </term>
439737eb1ca1Smrg    <listitem>
439837eb1ca1Smrg      <para>
439937eb1ca1SmrgSpecifies the pointer to the
440037eb1ca1Smrg<function>XDeviceState</function>
440137eb1ca1Smrgdata returned by a previous call to
440237eb1ca1Smrg<function>XQueryDeviceState .</function>
440337eb1ca1Smrg    </para>
440437eb1ca1Smrg  </listitem>
440537eb1ca1Smrg  </varlistentry>
440637eb1ca1Smrg</variablelist>
440737eb1ca1Smrg</para>
440837eb1ca1Smrg<para>
440937eb1ca1Smrg<!-- .LP -->
441037eb1ca1Smrg<!-- .eM -->
4411f1ee322dSmrg<xref linkend='XFreeDeviceState' xrefstyle='select: title'/>
441237eb1ca1Smrgfrees the device state data.
441337eb1ca1Smrg</para>
441437eb1ca1Smrg</sect3>
441537eb1ca1Smrg</sect2>
441637eb1ca1Smrg<sect2 id="Events">
441737eb1ca1Smrg<title>Events</title>
441837eb1ca1Smrg<!-- .XS -->
441937eb1ca1Smrg<!-- (SN Events -->
442037eb1ca1Smrg<!-- .XE -->
442137eb1ca1Smrg<para>
442237eb1ca1Smrg<!-- .LP -->
442337eb1ca1SmrgThe input extension creates input events analogous to the core input events.
442437eb1ca1SmrgThese extension input events are generated by manipulating one of the
442537eb1ca1Smrgextension input devices.
442637eb1ca1SmrgThe remainder of this section discusses the following X Input Extension
442737eb1ca1Smrgevent topics:
442837eb1ca1Smrg</para>
442937eb1ca1Smrg<itemizedlist>
443037eb1ca1Smrg  <listitem>
443137eb1ca1Smrg    <para>
443237eb1ca1SmrgEvent types
443337eb1ca1Smrg    </para>
443437eb1ca1Smrg  </listitem>
443537eb1ca1Smrg  <listitem>
443637eb1ca1Smrg    <para>
443737eb1ca1SmrgEvent classes
443837eb1ca1Smrg    </para>
443937eb1ca1Smrg  </listitem>
444037eb1ca1Smrg  <listitem>
444137eb1ca1Smrg    <para>
444237eb1ca1SmrgEvent structures
444337eb1ca1Smrg    </para>
444437eb1ca1Smrg  </listitem>
444537eb1ca1Smrg</itemizedlist>
444637eb1ca1Smrg<sect3 id="Event_Types">
444737eb1ca1Smrg<title>Event Types</title>
444837eb1ca1Smrg<!-- .XS -->
444937eb1ca1Smrg<!-- (SN Event Types -->
445037eb1ca1Smrg<!-- .XE -->
445137eb1ca1Smrg<para>
445237eb1ca1Smrg<!-- .LP -->
445337eb1ca1SmrgEvent types are integer numbers that a client can use to determine what
445437eb1ca1Smrgkind of event it has received.  The client compares the type field of 
445537eb1ca1Smrgthe event structure with known event types to make this determination.
445637eb1ca1Smrg</para>
445737eb1ca1Smrg<para>
445837eb1ca1Smrg<!-- .LP -->
445937eb1ca1SmrgThe core input event types are constants and are defined in the header file
446037eb1ca1Smrg<function>&lt; X11/X.h &gt;.</function>
446137eb1ca1SmrgExtension event types are not constants.  Instead, they
446237eb1ca1Smrgare dynamically allocated by the extension's request to the X server
446337eb1ca1Smrgwhen the extension is initialized.  Because of this, extension event
446437eb1ca1Smrgtypes must be obtained by the client from the server.
446537eb1ca1Smrg</para>
446637eb1ca1Smrg<para>
446737eb1ca1Smrg<!-- .LP -->
446837eb1ca1SmrgThe client program determines the event type for an extension event by using
446937eb1ca1Smrgthe information returned by the
4470f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
447137eb1ca1Smrgrequest.
447237eb1ca1SmrgThis type can then be used for comparison with the type field
447337eb1ca1Smrgof events received by the client.
447437eb1ca1Smrg</para>
447537eb1ca1Smrg<para>
447637eb1ca1Smrg<!-- .LP -->
447737eb1ca1SmrgExtension events propagate up the window hierarchy in the same manner
447837eb1ca1Smrgas core events.  If a window is not interested in an extension event, 
447937eb1ca1Smrgit usually propagates to the closest ancestor that is interested,
448037eb1ca1Smrgunless the dont_propagate list prohibits it.
448137eb1ca1SmrgGrabs of extension devices may alter the set of windows that receive a particular
448237eb1ca1Smrgextension event.
448337eb1ca1Smrg</para>
448437eb1ca1Smrg<para>
448537eb1ca1Smrg<!-- .LP -->
448637eb1ca1SmrgThe following table lists the event category and its associated event
448737eb1ca1Smrgtype or types.
448837eb1ca1Smrg</para>
448937eb1ca1Smrg
449037eb1ca1Smrg<informaltable>
449137eb1ca1Smrg  <tgroup cols='2' align='center'>
449237eb1ca1Smrg  <colspec colname='c1'/>
449337eb1ca1Smrg  <colspec colname='c2'/>
449437eb1ca1Smrg  <thead>
449537eb1ca1Smrg    <row>
449637eb1ca1Smrg      <entry>Event Category</entry>
449737eb1ca1Smrg      <entry>Event Type</entry>
449837eb1ca1Smrg    </row>
449937eb1ca1Smrg  </thead>
450037eb1ca1Smrg  <tbody>
450137eb1ca1Smrg    <row>
450237eb1ca1Smrg      <entry>Device key</entry>
450337eb1ca1Smrg      <entry><function>DeviceKeyPress</function></entry>
450437eb1ca1Smrg    </row>
450537eb1ca1Smrg    <row>
450637eb1ca1Smrg      <entry></entry>
450737eb1ca1Smrg      <entry><function>DeviceKeyRelease</function></entry>
450837eb1ca1Smrg    </row>
450937eb1ca1Smrg    <row>
451037eb1ca1Smrg      <entry>Device motion</entry>
451137eb1ca1Smrg      <entry><function>DeviceButtonPress</function></entry>
451237eb1ca1Smrg    </row>
451337eb1ca1Smrg    <row>
451437eb1ca1Smrg      <entry></entry>
451537eb1ca1Smrg      <entry><function>DeviceButtonRelease</function></entry>
451637eb1ca1Smrg    </row>
451737eb1ca1Smrg    <row>
451837eb1ca1Smrg      <entry></entry>
451937eb1ca1Smrg      <entry><function>DeviceMotionNotify</function></entry>
452037eb1ca1Smrg    </row>
452137eb1ca1Smrg    <row>
452237eb1ca1Smrg      <entry>Device input focus</entry>
452337eb1ca1Smrg      <entry><function>DeviceFocusIn</function></entry>
452437eb1ca1Smrg    </row>
452537eb1ca1Smrg    <row>
452637eb1ca1Smrg      <entry></entry>
452737eb1ca1Smrg      <entry><function>DeviceFocusOut</function></entry>
452837eb1ca1Smrg    </row>
452937eb1ca1Smrg    <row>
453037eb1ca1Smrg      <entry>Device state notification</entry>
453137eb1ca1Smrg      <entry><function>DeviceStateNotify</function></entry>
453237eb1ca1Smrg    </row>
453337eb1ca1Smrg    <row>
453437eb1ca1Smrg      <entry>Device proximity</entry>
453537eb1ca1Smrg      <entry><function>ProximityIn</function></entry>
453637eb1ca1Smrg    </row>
453737eb1ca1Smrg    <row>
453837eb1ca1Smrg      <entry></entry>
453937eb1ca1Smrg      <entry><function>ProximityOut</function></entry>
454037eb1ca1Smrg    </row>
454137eb1ca1Smrg    <row>
454237eb1ca1Smrg      <entry>Device mapping</entry>
454337eb1ca1Smrg      <entry><function>DeviceMappingNotify</function></entry>
454437eb1ca1Smrg    </row>
454537eb1ca1Smrg    <row>
454637eb1ca1Smrg      <entry>Device change</entry>
454737eb1ca1Smrg      <entry><function>ChangeDeviceNotify</function></entry>
454837eb1ca1Smrg    </row>
454937eb1ca1Smrg  </tbody>
455037eb1ca1Smrg  </tgroup>
455137eb1ca1Smrg</informaltable>
455237eb1ca1Smrg
455337eb1ca1Smrg</sect3>
455437eb1ca1Smrg<sect3 id="Event_Classes">
455537eb1ca1Smrg<title>Event Classes</title>
455637eb1ca1Smrg<!-- .XS -->
455737eb1ca1Smrg<!-- (SN Event Classes -->
455837eb1ca1Smrg<!-- .XE -->
455937eb1ca1Smrg<para>
456037eb1ca1Smrg<!-- .LP -->
456137eb1ca1SmrgEvent classes are integer numbers that are used in the same way as the
456237eb1ca1Smrgcore event masks.  They are used by a client program to indicate to the
456337eb1ca1Smrgserver which events that client program wishes to receive.
456437eb1ca1Smrg</para>
456537eb1ca1Smrg<para>
456637eb1ca1Smrg<!-- .LP -->
456737eb1ca1SmrgThe core input event masks are constants and are defined in the header file
456837eb1ca1Smrg<function>&lt; X11/X.h &gt;.</function>
456937eb1ca1SmrgExtension event classes are not constants.  Instead, they are dynamically
457037eb1ca1Smrgallocated by the extension's request to the X server
457137eb1ca1Smrgwhen the extension is initialized.  Because of this, extension event
457237eb1ca1Smrgclasses must be obtained by the client from the server.
457337eb1ca1Smrg</para>
457437eb1ca1Smrg<para>
457537eb1ca1Smrg<!-- .LP -->
457637eb1ca1SmrgThe event class for an extension event and device is obtained from
457737eb1ca1Smrginformation returned by the 
4578f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
457937eb1ca1Smrgfunction. 
458037eb1ca1SmrgThis class can then be used in an
4581f1ee322dSmrg<xref linkend='XSelectExtensionEvent' xrefstyle='select: title'/>
458237eb1ca1Smrgrequest to ask that events of that type from that device be sent to
458337eb1ca1Smrgthe client program.
458437eb1ca1Smrg</para>
458537eb1ca1Smrg<para>
458637eb1ca1Smrg<!-- .LP -->
458737eb1ca1SmrgFor
458837eb1ca1Smrg<function>DeviceButtonPress</function>
458937eb1ca1Smrgevents, the client may specify whether
459037eb1ca1Smrgor not an implicit passive grab should be done when the button is
459137eb1ca1Smrgpressed.  If the client wants to guarantee that it will receive a
459237eb1ca1Smrg<function>DeviceButtonRelease</function>
459337eb1ca1Smrgevent for each
459437eb1ca1Smrg<function>DeviceButtonPress</function>
459537eb1ca1Smrgevent it receives, it should specify the
459637eb1ca1Smrg<function>DeviceButtonPressGrab</function>
459737eb1ca1Smrgclass in addition to the
459837eb1ca1Smrg<function>DeviceButtonPress</function>
459937eb1ca1Smrgclass.
460037eb1ca1SmrgThis restricts the client in that only one client at a time
460137eb1ca1Smrgmay request
460237eb1ca1Smrg<function>DeviceButtonPress</function>
460337eb1ca1Smrgevents from the same device and
460437eb1ca1Smrgwindow if any client specifies this class.
460537eb1ca1Smrg</para>
460637eb1ca1Smrg<para>
460737eb1ca1Smrg<!-- .LP -->
460837eb1ca1SmrgIf any client has specified the
460937eb1ca1Smrg<function>DeviceButtonPressGrab</function>
461037eb1ca1Smrgclass, any requests by any other client that specify the same device
461137eb1ca1Smrgand window and specify either
461237eb1ca1Smrg<function>DeviceButtonPress</function>
461337eb1ca1Smrgor
461437eb1ca1Smrg<function>DeviceButtonPressGrab</function>
461537eb1ca1Smrgwill cause an
461637eb1ca1Smrg<function>Access</function>
461737eb1ca1Smrgerror to be generated.
461837eb1ca1Smrg</para>
461937eb1ca1Smrg<para>
462037eb1ca1Smrg<!-- .LP -->
462137eb1ca1SmrgIf only the
462237eb1ca1Smrg<function>DeviceButtonPress</function>
462337eb1ca1Smrgclass is specified, no implicit passive grab will be done when a button
462437eb1ca1Smrgis pressed on the device.
462537eb1ca1SmrgMultiple clients may use this class to specify the same device and
462637eb1ca1Smrgwindow combination.
462737eb1ca1Smrg</para>
462837eb1ca1Smrg<para>
462937eb1ca1Smrg<!-- .LP -->
463037eb1ca1SmrgThe client may also select
463137eb1ca1Smrg<function>DeviceMotion</function>
463237eb1ca1Smrgevents only when a button is down.
463337eb1ca1SmrgIt does this by specifying the event classes 
463437eb1ca1Smrg<function>DeviceButton1Motion</function>
463537eb1ca1Smrgthrough
463637eb1ca1Smrg<function>DeviceButton5Motion .  </function>
463737eb1ca1SmrgAn input device will support only
463837eb1ca1Smrgas many button motion classes as it has buttons.
463937eb1ca1Smrg</para>
464037eb1ca1Smrg</sect3>
464137eb1ca1Smrg<sect3 id="Event_Structures">
464237eb1ca1Smrg<title>Event Structures</title>
464337eb1ca1Smrg<!-- .XS -->
464437eb1ca1Smrg<!-- (SN Event Structures -->
464537eb1ca1Smrg<!-- .XE -->
464637eb1ca1Smrg<para>
464737eb1ca1Smrg<!-- .LP -->
464837eb1ca1SmrgEach extension event type has a corresponding structure declared in
464937eb1ca1Smrg<function>&lt; X11/extensions/XInput.h &gt;.</function>
465037eb1ca1SmrgAll event structures have the following common members:
465137eb1ca1Smrg<variablelist>
465237eb1ca1Smrg  <varlistentry>
465337eb1ca1Smrg    <term>
465437eb1ca1Smrg      type
465537eb1ca1Smrg    </term>
465637eb1ca1Smrg    <listitem>
465737eb1ca1Smrg      <para>
465837eb1ca1SmrgSet to the event type number that uniquely identifies it.  For example,
465937eb1ca1Smrgwhen the X server reports a
466037eb1ca1Smrg<function>DeviceKeyPress</function>
466137eb1ca1Smrgevent to a client application, it sends an
466237eb1ca1Smrg<function>XDeviceKeyPressEvent</function>
466337eb1ca1Smrgstructure.
466437eb1ca1Smrg      </para>
466537eb1ca1Smrg    </listitem>
466637eb1ca1Smrg  </varlistentry>
466737eb1ca1Smrg  <varlistentry>
466837eb1ca1Smrg    <term>
466937eb1ca1Smrg      serial
467037eb1ca1Smrg    </term>
467137eb1ca1Smrg    <listitem>
467237eb1ca1Smrg      <para>
467337eb1ca1SmrgSet from the serial number reported in the protocol but expanded from the
467437eb1ca1Smrg16-bit least significant bits to a full 32-bit value.
467537eb1ca1Smrg      </para>
467637eb1ca1Smrg    </listitem>
467737eb1ca1Smrg  </varlistentry>
467837eb1ca1Smrg  <varlistentry>
467937eb1ca1Smrg    <term>
468037eb1ca1Smrg      send_event
468137eb1ca1Smrg    </term>
468237eb1ca1Smrg    <listitem>
468337eb1ca1Smrg      <para>
468437eb1ca1SmrgSet to 
468537eb1ca1Smrg<function>True</function>
468637eb1ca1Smrgif the event came from an
4687f1ee322dSmrg<olink targetdoc='libX11' targetptr='XSendEvent'><function>XSendEvent</function></olink>
468837eb1ca1Smrgrequest.
468937eb1ca1Smrg      </para>
469037eb1ca1Smrg    </listitem>
469137eb1ca1Smrg  </varlistentry>
469237eb1ca1Smrg  <varlistentry>
469337eb1ca1Smrg    <term>
469437eb1ca1Smrg      display
469537eb1ca1Smrg    </term>
469637eb1ca1Smrg    <listitem>
469737eb1ca1Smrg      <para>
469837eb1ca1SmrgSet to a pointer to a structure that defines the display 
469937eb1ca1Smrgon which the event was read.
470037eb1ca1Smrg    </para>
470137eb1ca1Smrg  </listitem>
470237eb1ca1Smrg  </varlistentry>
470337eb1ca1Smrg</variablelist>
470437eb1ca1Smrg</para>
470537eb1ca1Smrg<para>
470637eb1ca1Smrg<!-- .LP -->
470737eb1ca1SmrgExtension event structures report the current position of the X pointer.
470837eb1ca1SmrgIn addition, if the device reports motion data and is reporting absolute data,
470937eb1ca1Smrgthe current value of any valuators the device contains is also reported.
471037eb1ca1Smrg</para>
471137eb1ca1Smrg<sect4 id="Device_Key_Events">
471237eb1ca1Smrg<title>Device Key Events</title>
471337eb1ca1Smrg<!-- .XS -->
471437eb1ca1Smrg<!-- (SN Device Key Events -->
471537eb1ca1Smrg<!-- .XE -->
471637eb1ca1Smrg<para>
471737eb1ca1Smrg<!-- .LP -->
471837eb1ca1SmrgKey events from extension devices contain all the information that is
471937eb1ca1Smrgcontained in a key event from the X keyboard.  In addition, they contain
472037eb1ca1Smrga device ID and report the current value of any valuators on the device,
472137eb1ca1Smrgif that device is reporting absolute data.
472237eb1ca1SmrgIf data for more than six valuators is being reported, more than one
472337eb1ca1Smrgkey event will be sent.
472437eb1ca1SmrgThe axes_count member contains the number of axes that are being
472537eb1ca1Smrgreported.  The server sends as many of these events as are
472637eb1ca1Smrgneeded to report the device data.  Each event contains the total number
472737eb1ca1Smrgof axes reported in the axes_count member and the first axis reported
472837eb1ca1Smrgin the current event in the first_axis member.
472937eb1ca1SmrgIf the device supports input class
473037eb1ca1Smrg<function>Valuators , </function>
473137eb1ca1Smrgbut is not reporting absolute mode data,
473237eb1ca1Smrgthe axes_count member  contains zero (0).
473337eb1ca1Smrg</para>
473437eb1ca1Smrg<para>
473537eb1ca1Smrg<!-- .LP -->
473637eb1ca1SmrgThe location reported in 
473737eb1ca1Smrgthe x, y and x_root, y_root members is the location of the core X pointer.
473837eb1ca1Smrg</para>
473937eb1ca1Smrg<para>
474037eb1ca1Smrg<!-- .LP -->
474137eb1ca1SmrgThe
474237eb1ca1Smrg<function>XDeviceKeyEvent</function>
474337eb1ca1Smrgstructure is defined as follows:
474437eb1ca1Smrg</para>
474537eb1ca1Smrg<para>
474637eb1ca1Smrg<!-- .LP -->
474737eb1ca1Smrg<!-- .sM -->
474837eb1ca1Smrg<literallayout class="monospaced">
474937eb1ca1Smrg<!-- .TA .5i 3i -->
475037eb1ca1Smrg<!-- .ta .5i 3i -->
475137eb1ca1Smrgtypedef struct {
475237eb1ca1Smrg     int type;                      /* of event */
475337eb1ca1Smrg     unsigned long serial;          /* # of last request processed */
475437eb1ca1Smrg     Bool send_event;               /* true if from SendEvent request */
475537eb1ca1Smrg     Display *display;              /* Display the event was read from */
475637eb1ca1Smrg     Window window;                 /* "event" window reported relative to */
475737eb1ca1Smrg     XID deviceid;
475837eb1ca1Smrg     Window root;                   /* root window event occurred on */
475937eb1ca1Smrg     Window subwindow;              /* child window */
476037eb1ca1Smrg     Time time;                     /* milliseconds */
476137eb1ca1Smrg     int x, y;                      /* x, y coordinates in event window */
476237eb1ca1Smrg     int x_root;                    /* coordinates relative to root */
476337eb1ca1Smrg     int y_root;                    /* coordinates relative to root */
476437eb1ca1Smrg     unsigned int state;            /* key or button mask */
476537eb1ca1Smrg     unsigned int keycode;          /* detail */
476637eb1ca1Smrg     Bool same_screen;              /* same screen flag */
476737eb1ca1Smrg     unsigned int device_state;     /* device key or button mask */
476837eb1ca1Smrg     unsigned char axes_count;
476937eb1ca1Smrg     unsigned char first_axis;
477037eb1ca1Smrg     int axis_data[6];
477137eb1ca1Smrg} XDeviceKeyEvent;
477237eb1ca1Smrg
477337eb1ca1Smrgtypedef XDeviceKeyEvent XDeviceKeyPressedEvent;
477437eb1ca1Smrgtypedef XDeviceKeyEvent XDeviceKeyReleasedEvent;
477537eb1ca1Smrg</literallayout>
477637eb1ca1Smrg<!-- .eM -->
477737eb1ca1Smrg</para>
477837eb1ca1Smrg</sect4>
477937eb1ca1Smrg<sect4 id="Device_Button_Events">
478037eb1ca1Smrg<title>Device Button Events</title>
478137eb1ca1Smrg<!-- .XS -->
478237eb1ca1Smrg<!-- (SN Device Button Events -->
478337eb1ca1Smrg<!-- .XE -->
478437eb1ca1Smrg<para>
478537eb1ca1Smrg<!-- .LP -->
478637eb1ca1SmrgButton events from extension devices contain all the information that is
478737eb1ca1Smrgcontained in a button event from the X pointer.  In addition, they contain
478837eb1ca1Smrga device ID and report the current value of any valuators on the device
478937eb1ca1Smrgif that device is reporting absolute data.
479037eb1ca1SmrgIf data for more than six valuators is being reported, more than one
479137eb1ca1Smrgbutton event may be sent.
479237eb1ca1SmrgThe axes_count member contains the number of axes that are being
479337eb1ca1Smrgreported.  The server sends as many of these events as are
479437eb1ca1Smrgneeded to report the device data.  Each event contains the total number
479537eb1ca1Smrgof axes reported in the axes_count member and the first axis reported
479637eb1ca1Smrgin the current event in the first_axis member.
479737eb1ca1SmrgIf the device supports input class
479837eb1ca1Smrg<function>Valuators , </function>
479937eb1ca1Smrgbut is not reporting absolute mode data,
480037eb1ca1Smrgthe axes_count member contains zero (0).
480137eb1ca1Smrg</para>
480237eb1ca1Smrg<para>
480337eb1ca1Smrg<!-- .LP -->
480437eb1ca1SmrgThe location reported in 
480537eb1ca1Smrgthe x, y and x_root, y_root members is the location of the core X pointer.
480637eb1ca1Smrg</para>
480737eb1ca1Smrg<para>
480837eb1ca1Smrg<!-- .LP -->
480937eb1ca1Smrg<!-- .sM -->
481037eb1ca1Smrg<literallayout class="monospaced">
481137eb1ca1Smrg<!-- .TA .5i 3i -->
481237eb1ca1Smrg<!-- .ta .5i 3i -->
481337eb1ca1Smrgtypedef struct {
481437eb1ca1Smrg     int type;                      /* of event */
481537eb1ca1Smrg     unsigned long serial;          /* # of last request processed by server */
481637eb1ca1Smrg     Bool send_event;               /* true if from a SendEvent request */
481737eb1ca1Smrg     Display *display;              /* Display the event was read from */
481837eb1ca1Smrg     Window window;                 /* "event" window reported relative to */
481937eb1ca1Smrg     XID deviceid;
482037eb1ca1Smrg     Window root;                   /* root window that the event occurred on */
482137eb1ca1Smrg     Window subwindow;              /* child window */
482237eb1ca1Smrg     Time time;                     /* milliseconds */
482337eb1ca1Smrg     int x, y;                      /* x, y coordinates in event window */
482437eb1ca1Smrg     int x_root;                    /* coordinates relative to root */
482537eb1ca1Smrg     int y_root;                    /* coordinates relative to root */
482637eb1ca1Smrg     unsigned int state;            /* key or button mask */
482737eb1ca1Smrg     unsigned int button;           /* detail */
482837eb1ca1Smrg     Bool same_screen;              /* same screen flag */
482937eb1ca1Smrg     unsigned int device_state;     /* device key or button mask */
483037eb1ca1Smrg     unsigned char axes_count;
483137eb1ca1Smrg     unsigned char first_axis;
483237eb1ca1Smrg     int axis_data[6];
483337eb1ca1Smrg} XDeviceButtonEvent;
483437eb1ca1Smrg
483537eb1ca1Smrgtypedef XDeviceButtonEvent XDeviceButtonPressedEvent;
483637eb1ca1Smrgtypedef XDeviceButtonEvent XDeviceButtonReleasedEvent;
483737eb1ca1Smrg</literallayout>
483837eb1ca1Smrg<!-- .eM -->
483937eb1ca1Smrg</para>
484037eb1ca1Smrg</sect4>
484137eb1ca1Smrg<sect4 id="Device_Motion_Events">
484237eb1ca1Smrg<title>Device Motion Events</title>
484337eb1ca1Smrg<!-- .XS -->
484437eb1ca1Smrg<!-- (SN Device Motion Events -->
484537eb1ca1Smrg<!-- .XE -->
484637eb1ca1Smrg<para>
484737eb1ca1Smrg<!-- .LP -->
484837eb1ca1SmrgMotion events from extension devices contain all the information that is
484937eb1ca1Smrgcontained in a motion event from the X pointer.  In addition, they contain
485037eb1ca1Smrga device ID and report the current value of any valuators on the device.
485137eb1ca1Smrg</para>
485237eb1ca1Smrg<para>
485337eb1ca1Smrg<!-- .LP -->
485437eb1ca1SmrgThe location reported in 
485537eb1ca1Smrgthe x, y and x_root, y_root members is the location of the core X pointer, 
485637eb1ca1Smrgand so is 2-dimensional.
485737eb1ca1Smrg</para>
485837eb1ca1Smrg<para>
485937eb1ca1Smrg<!-- .LP -->
486037eb1ca1SmrgExtension motion devices may report motion data for a variable number of 
486137eb1ca1Smrgaxes.  
486237eb1ca1SmrgThe axes_count member contains the number of axes that are being
486337eb1ca1Smrgreported.  The server sends as many of these events as are
486437eb1ca1Smrgneeded to report the device data.  Each event contains the total number
486537eb1ca1Smrgof axes reported in the axes_count member and the first axis reported
486637eb1ca1Smrgin the current event in the first_axis member.
486737eb1ca1Smrg</para>
486837eb1ca1Smrg<para>
486937eb1ca1Smrg<!-- .LP -->
487037eb1ca1Smrg<!-- .sM -->
487137eb1ca1Smrg<literallayout class="monospaced">
487237eb1ca1Smrg<!-- .TA .5i 3i -->
487337eb1ca1Smrg<!-- .ta .5i 3i -->
487437eb1ca1Smrgtypedef struct {
487537eb1ca1Smrg     int type;                          /* of event */
487637eb1ca1Smrg     unsigned long serial;              /* # of last request processed by server */
487737eb1ca1Smrg     Bool send_event;                   /* true if from a SendEvent request */
487837eb1ca1Smrg     Display *display;                  /* Display the event was read from */
487937eb1ca1Smrg     Window window;                     /* "event" window reported relative to */
488037eb1ca1Smrg     XID deviceid;
488137eb1ca1Smrg     Window root;                       /* root window that the event occurred on */
488237eb1ca1Smrg     Window subwindow;                  /* child window */
488337eb1ca1Smrg     Time time;                         /* milliseconds */
488437eb1ca1Smrg     int x, y;                          /* x, y coordinates in event window */
488537eb1ca1Smrg     int x_root;                        /* coordinates relative to root */
488637eb1ca1Smrg     int y_root;                        /* coordinates relative to root */
488737eb1ca1Smrg     unsigned int state;                /* key or button mask */
488837eb1ca1Smrg     char is_hint;                      /* detail */
488937eb1ca1Smrg     Bool same_screen;                  /* same screen flag */
489037eb1ca1Smrg     unsigned int device_state;         /* device key or button mask */
489137eb1ca1Smrg     unsigned char axes_count;
489237eb1ca1Smrg     unsigned char first_axis;
489337eb1ca1Smrg     int axis_data[6];
489437eb1ca1Smrg} XDeviceMotionEvent;
489537eb1ca1Smrg</literallayout>
489637eb1ca1Smrg<!-- .eM -->
489737eb1ca1Smrg</para>
489837eb1ca1Smrg</sect4>
489937eb1ca1Smrg<sect4 id="Device_Focus_Events">
490037eb1ca1Smrg<title>Device Focus Events</title>
490137eb1ca1Smrg<!-- .XS -->
490237eb1ca1Smrg<!-- (SN Device Focus Events -->
490337eb1ca1Smrg<!-- .XE -->
490437eb1ca1Smrg<para>
490537eb1ca1Smrg<!-- .LP -->
490637eb1ca1SmrgThese events are equivalent to the core focus events.
490737eb1ca1SmrgThey contain the same information, with the addition
490837eb1ca1Smrgof a device ID to identify which device has had a focus change,
490937eb1ca1Smrgand a timestamp.
491037eb1ca1Smrg</para>
491137eb1ca1Smrg<para>
491237eb1ca1Smrg<!-- .LP -->
491337eb1ca1Smrg<function>DeviceFocusIn</function>
491437eb1ca1Smrgand
491537eb1ca1Smrg<function>DeviceFocusOut</function>
491637eb1ca1Smrgevents are generated for
491737eb1ca1Smrgfocus changes of extension devices in the same manner as core focus
491837eb1ca1Smrgevents are generated.
491937eb1ca1Smrg</para>
492037eb1ca1Smrg<para>
492137eb1ca1Smrg<!-- .LP -->
492237eb1ca1Smrg<!-- .sM -->
492337eb1ca1Smrg<literallayout class="monospaced">
492437eb1ca1Smrg<!-- .TA .5i 2.5i -->
492537eb1ca1Smrg<!-- .ta .5i 2.5i -->
492637eb1ca1Smrgtypedef struct {
492737eb1ca1Smrg     int type;                      /* of event */
492837eb1ca1Smrg     unsigned long serial;          /* # of last request processed by server */
492937eb1ca1Smrg     Bool send_event;               /* true if this came from a SendEvent request */
493037eb1ca1Smrg     Display *display;              /* Display the event was read from */
493137eb1ca1Smrg     Window window;                 /* "event" window it is reported relative to */
493237eb1ca1Smrg     XID deviceid;
493337eb1ca1Smrg     int mode;                      /* NotifyNormal, NotifyGrab, NotifyUngrab */
493437eb1ca1Smrg     int detail;
493537eb1ca1Smrg                                    /*
493637eb1ca1Smrg                                     * NotifyAncestor, NotifyVirtual, NotifyInferior, 
493737eb1ca1Smrg                                     * NotifyNonLinear,NotifyNonLinearVirtual, NotifyPointer,
493837eb1ca1Smrg                                     * NotifyPointerRoot, NotifyDetailNone 
493937eb1ca1Smrg                                     */
494037eb1ca1Smrg     Time time;
494137eb1ca1Smrg} XDeviceFocusChangeEvent;
494237eb1ca1Smrg
494337eb1ca1Smrgtypedef XDeviceFocusChangeEvent XDeviceFocusInEvent;
494437eb1ca1Smrgtypedef XDeviceFocusChangeEvent XDeviceFocusOutEvent;
494537eb1ca1Smrg</literallayout>
494637eb1ca1Smrg<!-- .eM -->
494737eb1ca1Smrg</para>
494837eb1ca1Smrg</sect4>
494937eb1ca1Smrg<sect4 id="Device_StateNotify_Event">
495037eb1ca1Smrg<title>Device StateNotify Event</title>
495137eb1ca1Smrg<!-- .XS -->
495237eb1ca1Smrg<!-- (SN Device StateNotify Event -->
495337eb1ca1Smrg<!-- .XE -->
495437eb1ca1Smrg<para>
495537eb1ca1Smrg<!-- .LP -->
495637eb1ca1SmrgThis event is analogous to the core keymap event but
495737eb1ca1Smrgreports the current state of the device for each
495837eb1ca1Smrginput class that it supports.
495937eb1ca1SmrgIt is generated after every
496037eb1ca1Smrg<function>DeviceFocusIn</function>
496137eb1ca1Smrgevent and
496237eb1ca1Smrg<function>EnterNotify</function>
496337eb1ca1Smrgevent and is delivered to clients who have selected
496437eb1ca1Smrg<function>XDeviceStateNotify</function>
496537eb1ca1Smrgevents.
496637eb1ca1Smrg</para>
496737eb1ca1Smrg<para>
496837eb1ca1Smrg<!-- .LP -->
496937eb1ca1SmrgIf the device supports input class
497037eb1ca1Smrg<function>Valuators ,</function>
497137eb1ca1Smrgthe mode member in the
497237eb1ca1Smrg<function>XValuatorStatus</function>
497337eb1ca1Smrgstructure is a bitmask that reports the device mode,
497437eb1ca1Smrgproximity state, and other state information.
497537eb1ca1SmrgThe following bits are currently defined:
497637eb1ca1Smrg<literallayout class="monospaced">
497737eb1ca1Smrg<!-- .TA .5i 1.5i -->
497837eb1ca1Smrg<!-- .ta .5i 1.5i -->
497937eb1ca1Smrg     0x01     Relative = 0, Absolute = 1
498037eb1ca1Smrg     0x02     InProximity = 0, OutOfProximity = 1
498137eb1ca1Smrg</literallayout>
498237eb1ca1Smrg</para>
498337eb1ca1Smrg<para>
498437eb1ca1Smrg<!-- .LP -->
498537eb1ca1SmrgIf the device supports more valuators than can be reported in a single
498637eb1ca1Smrg<function>XEvent ,</function>
498737eb1ca1Smrgmultiple
498837eb1ca1Smrg<function>XDeviceStateNotify</function>
498937eb1ca1Smrgevents will be generated.
499037eb1ca1Smrg</para>
499137eb1ca1Smrg<para>
499237eb1ca1Smrg<!-- .LP -->
499337eb1ca1Smrg<!-- .sM -->
499437eb1ca1Smrg<literallayout class="monospaced">
499537eb1ca1Smrg<!-- .TA .5i 3i -->
499637eb1ca1Smrg<!-- .ta .5i 3i -->
499737eb1ca1Smrgtypedef struct {
499837eb1ca1Smrg     unsigned char class;
499937eb1ca1Smrg     unsigned char length;
500037eb1ca1Smrg} XInputClass;
500137eb1ca1Smrg
500237eb1ca1Smrgtypedef struct {
500337eb1ca1Smrg     int type;
500437eb1ca1Smrg     unsigned long serial;     /* # of last request processed by server */
500537eb1ca1Smrg     Bool send_event;          /* true if this came from a SendEvent request */
500637eb1ca1Smrg     Display *display;         /* Display the event was read from */
500737eb1ca1Smrg     Window window;
500837eb1ca1Smrg     XID deviceid;
500937eb1ca1Smrg     Time time;
501037eb1ca1Smrg     int num_classes;
501137eb1ca1Smrg     char data[64];
501237eb1ca1Smrg} XDeviceStateNotifyEvent;     
501337eb1ca1Smrg
501437eb1ca1Smrgtypedef struct {
501537eb1ca1Smrg     unsigned char class;
501637eb1ca1Smrg     unsigned char length;
501737eb1ca1Smrg     unsigned char num_valuators;
501837eb1ca1Smrg     unsigned char mode;
501937eb1ca1Smrg     int valuators[6];
502037eb1ca1Smrg} XValuatorStatus;
502137eb1ca1Smrg
502237eb1ca1Smrgtypedef struct {
502337eb1ca1Smrg     unsigned char class;
502437eb1ca1Smrg     unsigned char length;
502537eb1ca1Smrg     short num_keys;
502637eb1ca1Smrg     char keys[32];
502737eb1ca1Smrg} XKeyStatus;
502837eb1ca1Smrg
502937eb1ca1Smrgtypedef struct {
503037eb1ca1Smrg     unsigned char class;
503137eb1ca1Smrg     unsigned char length;
503237eb1ca1Smrg     short num_buttons;
503337eb1ca1Smrg     char buttons[32];
503437eb1ca1Smrg} XButtonStatus;
503537eb1ca1Smrg</literallayout>
503637eb1ca1Smrg<!-- .eM -->
503737eb1ca1Smrg</para>
503837eb1ca1Smrg</sect4>
503937eb1ca1Smrg<sect4 id="Device_Mapping_Event">
504037eb1ca1Smrg<title>Device Mapping Event</title>
504137eb1ca1Smrg<!-- .XS -->
504237eb1ca1Smrg<!-- (SN Device Mapping Event -->
504337eb1ca1Smrg<!-- .XE -->
504437eb1ca1Smrg<para>
504537eb1ca1Smrg<!-- .LP -->
504637eb1ca1SmrgThis event is equivalent to the core
504737eb1ca1Smrg<function>MappingNotify</function>
504837eb1ca1Smrgevent.
504937eb1ca1SmrgIt notifies client programs when the mapping of keys,
505037eb1ca1Smrgmodifiers, or buttons on an extension device has changed.
505137eb1ca1Smrg</para>
505237eb1ca1Smrg<para>
505337eb1ca1Smrg<!-- .LP -->
505437eb1ca1Smrg<!-- .sM -->
505537eb1ca1Smrg<literallayout class="monospaced">
505637eb1ca1Smrg<!-- .TA .5i 3i -->
505737eb1ca1Smrg<!-- .ta .5i 3i -->
505837eb1ca1Smrgtypedef struct {
505937eb1ca1Smrg     int type;
506037eb1ca1Smrg     unsigned long serial;     
506137eb1ca1Smrg     Bool send_event;
506237eb1ca1Smrg     Display *display;
506337eb1ca1Smrg     Window window;
506437eb1ca1Smrg     XID deviceid;
506537eb1ca1Smrg     Time time;
506637eb1ca1Smrg     int request;
506737eb1ca1Smrg     int first_keycode;
506837eb1ca1Smrg     int count;
506937eb1ca1Smrg} XDeviceMappingEvent;
507037eb1ca1Smrg</literallayout>
507137eb1ca1Smrg<!-- .eM -->
507237eb1ca1Smrg</para>
507337eb1ca1Smrg</sect4>
507437eb1ca1Smrg<sect4 id="ChangeDeviceNotify_Event">
507537eb1ca1Smrg<title>ChangeDeviceNotify Event</title>
507637eb1ca1Smrg<!-- .XS -->
507737eb1ca1Smrg<!-- (SN ChangeDeviceNotify Event -->
507837eb1ca1Smrg<!-- .XE -->
507937eb1ca1Smrg<para>
508037eb1ca1Smrg<!-- .LP -->
508137eb1ca1SmrgThis event has no equivalent in the core protocol.  It notifies client
508237eb1ca1Smrgprograms when one of the core devices has been changed.
508337eb1ca1Smrg</para>
508437eb1ca1Smrg<para>
508537eb1ca1Smrg<!-- .LP -->
508637eb1ca1Smrg<!-- .sM -->
508737eb1ca1Smrg<literallayout class="monospaced">
508837eb1ca1Smrg<!-- .TA .5i 3i -->
508937eb1ca1Smrg<!-- .ta .5i 3i -->
509037eb1ca1Smrgtypedef struct {
509137eb1ca1Smrg     int type;
509237eb1ca1Smrg     unsigned long serial;
509337eb1ca1Smrg     Bool send_event;
509437eb1ca1Smrg     Display *display;
509537eb1ca1Smrg     Window window;
509637eb1ca1Smrg     XID deviceid;
509737eb1ca1Smrg     Time time;
509837eb1ca1Smrg     int request;
509937eb1ca1Smrg} XChangeDeviceNotifyEvent;
510037eb1ca1Smrg</literallayout>
510137eb1ca1Smrg<!-- .eM -->
510237eb1ca1Smrg</para>
510337eb1ca1Smrg</sect4>
510437eb1ca1Smrg<sect4 id="Proximity_Events">
510537eb1ca1Smrg<title>Proximity Events</title>
510637eb1ca1Smrg<!-- .XS -->
510737eb1ca1Smrg<!-- (SN Proximity Events -->
510837eb1ca1Smrg<!-- .XE -->
510937eb1ca1Smrg<para>
511037eb1ca1Smrg<!-- .LP -->
511137eb1ca1SmrgThese events have no equivalent in the core protocol.  Some input
511237eb1ca1Smrgdevices such as graphics tablets or touchscreens may send these
511337eb1ca1Smrgevents to indicate that a stylus has moved into or out of contact
511437eb1ca1Smrgwith a positional sensing surface.
511537eb1ca1Smrg</para>
511637eb1ca1Smrg<para>
511737eb1ca1Smrg<!-- .LP -->
511837eb1ca1SmrgThe event contains the current value of any valuators on the device
511937eb1ca1Smrgif that device is reporting absolute data.
512037eb1ca1SmrgIf data for more than six valuators is being reported, more than one
512137eb1ca1Smrgproximity event may be sent.
512237eb1ca1SmrgThe axes_count member contains the number of axes that are being
512337eb1ca1Smrgreported.  The server sends as many of these events as are
512437eb1ca1Smrgneeded to report the device data.  Each event contains the total number
512537eb1ca1Smrgof axes reported in the axes_count member and the first axis reported
512637eb1ca1Smrgin the current event in the first_axis member.
512737eb1ca1SmrgIf the device supports input class
512837eb1ca1Smrg<function>Valuators , </function>
512937eb1ca1Smrgbut is not reporting absolute mode data,
513037eb1ca1Smrgthe axes_count member contains zero (0).
513137eb1ca1Smrg</para>
513237eb1ca1Smrg<para>
513337eb1ca1Smrg<!-- .LP -->
513437eb1ca1Smrg<!-- .sM -->
513537eb1ca1Smrg<literallayout class="monospaced">
513637eb1ca1Smrg<!-- .TA .5i 3i -->
513737eb1ca1Smrg<!-- .ta .5i 3i -->
513837eb1ca1Smrgtypedef struct {
513937eb1ca1Smrg     int type;                 /* ProximityIn or ProximityOut */        
514037eb1ca1Smrg     unsigned long serial;     /* # of last request processed by server */
514137eb1ca1Smrg     Bool send_event;          /* true if this came from a SendEvent request */
514237eb1ca1Smrg     Display *display;         /* Display the event was read from */
514337eb1ca1Smrg     Window window;      
514437eb1ca1Smrg     XID deviceid;
514537eb1ca1Smrg     Window root;            
514637eb1ca1Smrg     Window subwindow;      
514737eb1ca1Smrg     Time time;            
514837eb1ca1Smrg     int x, y;            
514937eb1ca1Smrg     int x_root, y_root;  
515037eb1ca1Smrg     unsigned int state;           
515137eb1ca1Smrg     Bool same_screen;     
515237eb1ca1Smrg     unsigned int device_state;   /* device key or button mask */
515337eb1ca1Smrg     unsigned char axes_count;
515437eb1ca1Smrg     unsigned char first_axis;
515537eb1ca1Smrg     int axis_data[6];
515637eb1ca1Smrg} XProximityNotifyEvent;
515737eb1ca1Smrg
515837eb1ca1Smrgtypedef XProximityNotifyEvent XProximityInEvent;
515937eb1ca1Smrgtypedef XProximityNotifyEvent XProximityOutEvent;
516037eb1ca1Smrg</literallayout>
516137eb1ca1Smrg<!-- .eM -->
516237eb1ca1Smrg</para>
516337eb1ca1Smrg</sect4>
516437eb1ca1Smrg</sect3>
516537eb1ca1Smrg</sect2>
516637eb1ca1Smrg<sect2 id="Event_Handling_Functions">
516737eb1ca1Smrg<title>Event Handling Functions</title>
516837eb1ca1Smrg<!-- .XS -->
516937eb1ca1Smrg<!-- (SN Event Handling Functions -->
517037eb1ca1Smrg<!-- .XE -->
517137eb1ca1Smrg<para>
517237eb1ca1Smrg<!-- .LP -->
517337eb1ca1SmrgThis section discusses the X Input Extension
517437eb1ca1Smrgevent handling functions that allow you to:
517537eb1ca1Smrg</para>
517637eb1ca1Smrg<itemizedlist>
517737eb1ca1Smrg  <listitem>
517837eb1ca1Smrg    <para>
517937eb1ca1SmrgDetermine the extension version
518037eb1ca1Smrg    </para>
518137eb1ca1Smrg  </listitem>
518237eb1ca1Smrg  <listitem>
518337eb1ca1Smrg    <para>
518437eb1ca1SmrgList the available devices
518537eb1ca1Smrg    </para>
518637eb1ca1Smrg  </listitem>
518737eb1ca1Smrg  <listitem>
518837eb1ca1Smrg    <para>
518937eb1ca1SmrgEnable and disable extension devices
519037eb1ca1Smrg    </para>
519137eb1ca1Smrg  </listitem>
519237eb1ca1Smrg  <listitem>
519337eb1ca1Smrg    <para>
519437eb1ca1SmrgChange the mode of a device
519537eb1ca1Smrg    </para>
519637eb1ca1Smrg  </listitem>
519737eb1ca1Smrg  <listitem>
519837eb1ca1Smrg    <para>
519937eb1ca1SmrgInitialize valuators on an input device
520037eb1ca1Smrg    </para>
520137eb1ca1Smrg  </listitem>
520237eb1ca1Smrg  <listitem>
520337eb1ca1Smrg    <para>
520437eb1ca1SmrgGet input device controls
520537eb1ca1Smrg    </para>
520637eb1ca1Smrg  </listitem>
520737eb1ca1Smrg  <listitem>
520837eb1ca1Smrg    <para>
520937eb1ca1SmrgChange input device controls
521037eb1ca1Smrg    </para>
521137eb1ca1Smrg  </listitem>
521237eb1ca1Smrg  <listitem>
521337eb1ca1Smrg    <para>
521437eb1ca1SmrgSelect extension device events
521537eb1ca1Smrg    </para>
521637eb1ca1Smrg  </listitem>
521737eb1ca1Smrg  <listitem>
521837eb1ca1Smrg    <para>
521937eb1ca1SmrgDetermine selected device events
522037eb1ca1Smrg    </para>
522137eb1ca1Smrg  </listitem>
522237eb1ca1Smrg  <listitem>
522337eb1ca1Smrg    <para>
52244e8f48c7SmrgControl event propagation
522537eb1ca1Smrg    </para>
522637eb1ca1Smrg  </listitem>
522737eb1ca1Smrg  <listitem>
522837eb1ca1Smrg    <para>
522937eb1ca1SmrgSend an event
523037eb1ca1Smrg    </para>
523137eb1ca1Smrg  </listitem>
523237eb1ca1Smrg  <listitem>
523337eb1ca1Smrg    <para>
523437eb1ca1SmrgGet motion history
523537eb1ca1Smrg    </para>
523637eb1ca1Smrg  </listitem>
523737eb1ca1Smrg</itemizedlist>
523837eb1ca1Smrg<sect3 id="Determining_the_Extension_Version">
523937eb1ca1Smrg<title>Determining the Extension Version</title>
524037eb1ca1Smrg<!-- .XS -->
524137eb1ca1Smrg<!-- (SN Determining the Extension Version -->
524237eb1ca1Smrg<!-- .XE -->
524337eb1ca1Smrg<para>
524437eb1ca1Smrg<!-- .LP -->
524537eb1ca1Smrg<!-- .sM -->
5246f1ee322dSmrg<funcsynopsis id='XGetExtensionVersion'>
524737eb1ca1Smrg<funcprototype>
524837eb1ca1Smrg  <funcdef>XExtensionVersion * <function> XGetExtensionVersion</function></funcdef>
524937eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
525037eb1ca1Smrg  <paramdef>char<parameter> *name</parameter></paramdef>
525137eb1ca1Smrg</funcprototype>
525237eb1ca1Smrg</funcsynopsis>
525337eb1ca1Smrg<!-- .FN -->
525437eb1ca1Smrg<variablelist>
525537eb1ca1Smrg  <varlistentry>
525637eb1ca1Smrg    <term>
525737eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
525837eb1ca1Smrg    </term>
525937eb1ca1Smrg    <listitem>
526037eb1ca1Smrg      <para>
526137eb1ca1SmrgSpecifies the connection to the X server.
526237eb1ca1Smrg      </para>
526337eb1ca1Smrg    </listitem>
526437eb1ca1Smrg  </varlistentry>
526537eb1ca1Smrg  <varlistentry>
526637eb1ca1Smrg    <term>
526737eb1ca1Smrg      <emphasis remap='I'>name</emphasis>
526837eb1ca1Smrg    </term>
526937eb1ca1Smrg    <listitem>
527037eb1ca1Smrg      <para>
527137eb1ca1SmrgSpecifies the name of the desired extension.
527237eb1ca1Smrg    </para>
527337eb1ca1Smrg  </listitem>
527437eb1ca1Smrg  </varlistentry>
527537eb1ca1Smrg</variablelist>
527637eb1ca1Smrg</para>
527737eb1ca1Smrg<para>
527837eb1ca1Smrg<!-- .LP -->
527937eb1ca1Smrg<!-- .eM -->
5280f1ee322dSmrg<xref linkend='XGetExtensionVersion' xrefstyle='select: title'/>
528137eb1ca1Smrgallows a client to determine whether a server supports
528237eb1ca1Smrgthe desired version of the input extension.
528337eb1ca1Smrg</para>
528437eb1ca1Smrg<para>
528537eb1ca1Smrg<!-- .LP -->
528637eb1ca1SmrgThe 
528737eb1ca1Smrg<function>XExtensionVersion</function>
528837eb1ca1Smrgstructure returns information about the version of the extension
528937eb1ca1Smrgsupported by the server and is defined as follows:
529037eb1ca1Smrg</para>
529137eb1ca1Smrg<para>
529237eb1ca1Smrg<!-- .LP -->
529337eb1ca1Smrg<!-- .sM -->
529437eb1ca1Smrg<literallayout class="monospaced">
529537eb1ca1Smrg<!-- .TA .5i -->
529637eb1ca1Smrg<!-- .ta .5i -->
529737eb1ca1Smrgtypedef struct {
529837eb1ca1Smrg     Bool present;   
529937eb1ca1Smrg     short major_version;
530037eb1ca1Smrg     short minor_version;
530137eb1ca1Smrg} XExtensionVersion;
530237eb1ca1Smrg</literallayout>
530337eb1ca1Smrg</para>
530437eb1ca1Smrg<para>
530537eb1ca1Smrg<!-- .LP -->
530637eb1ca1Smrg<!-- .eM -->
530737eb1ca1SmrgThe major and minor versions can be compared with constants defined in
530837eb1ca1Smrgthe header file 
530937eb1ca1Smrg<function>&lt; X11/extensions/XI.h &gt;.</function>
531037eb1ca1SmrgEach version is a superset of the previous versions.
531137eb1ca1Smrg</para>
531237eb1ca1Smrg<para>
531337eb1ca1Smrg<!-- .LP -->
531437eb1ca1SmrgYou should use 
5315f1ee322dSmrg<olink targetdoc='libX11' targetptr='XFree'><function>XFree</function></olink>.
531637eb1ca1Smrgto free the data returned by this function.
531737eb1ca1Smrg</para>
531837eb1ca1Smrg</sect3>
531937eb1ca1Smrg<sect3 id="Listing_Available_Devices">
532037eb1ca1Smrg<title>Listing Available Devices</title>
532137eb1ca1Smrg<!-- .XS -->
532237eb1ca1Smrg<!-- (SN Listing Available Devices -->
532337eb1ca1Smrg<!-- .XE -->
532437eb1ca1Smrg<para>
532537eb1ca1Smrg<!-- .LP -->
532637eb1ca1SmrgA client program that wishes to access a specific device
532737eb1ca1Smrgmust first determine whether that device is connected to the X server.  This
532837eb1ca1Smrgis done through the
5329f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
533037eb1ca1Smrgfunction, which will return a list of all devices that can be opened
533137eb1ca1Smrgby the X server.  The client program can use one
533237eb1ca1Smrgof the names defined in the
533337eb1ca1Smrg<function>&lt; X11/extensions/XI.h &gt;</function>
533437eb1ca1Smrgheader file in an
5335f1ee322dSmrg<olink targetdoc='libX11' targetptr='XInternAtom'><function>XInternAtom</function></olink>
533637eb1ca1Smrgrequest to determine the device type of the desired device.  This type 
533737eb1ca1Smrgcan then be compared with the device types returned by the 
5338f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
533937eb1ca1Smrgrequest.
534037eb1ca1Smrg</para>
534137eb1ca1Smrg<para>
534237eb1ca1Smrg<!-- .LP -->
534337eb1ca1Smrg<!-- .sM -->
5344f1ee322dSmrg<funcsynopsis id='XListInputDevices'>
534537eb1ca1Smrg<funcprototype>
534637eb1ca1Smrg  <funcdef>XDeviceInfo * <function> XListInputDevices</function></funcdef>
534737eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
534837eb1ca1Smrg  <paramdef>int<parameter> *ndevices</parameter></paramdef>
534937eb1ca1Smrg</funcprototype>
535037eb1ca1Smrg</funcsynopsis>
535137eb1ca1Smrg<!-- .FN -->
535237eb1ca1Smrg<variablelist>
535337eb1ca1Smrg  <varlistentry>
535437eb1ca1Smrg    <term>
535537eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
535637eb1ca1Smrg    </term>
535737eb1ca1Smrg    <listitem>
535837eb1ca1Smrg      <para>
535937eb1ca1SmrgSpecifies the connection to the X server.
536037eb1ca1Smrg      </para>
536137eb1ca1Smrg    </listitem>
536237eb1ca1Smrg  </varlistentry>
536337eb1ca1Smrg  <varlistentry>
536437eb1ca1Smrg    <term>
536537eb1ca1Smrg      <emphasis remap='I'>ndevices</emphasis>
536637eb1ca1Smrg    </term>
536737eb1ca1Smrg    <listitem>
536837eb1ca1Smrg      <para>
536937eb1ca1SmrgSpecifies the address of a variable into which the server
537037eb1ca1Smrgcan return the number of input devices available to the X server.
537137eb1ca1Smrg    </para>
537237eb1ca1Smrg  </listitem>
537337eb1ca1Smrg  </varlistentry>
537437eb1ca1Smrg</variablelist>
537537eb1ca1Smrg</para>
537637eb1ca1Smrg<para>
537737eb1ca1Smrg<!-- .LP -->
537837eb1ca1Smrg<!-- .eM -->
5379f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
538037eb1ca1Smrgallows a client to determine which devices 
538137eb1ca1Smrgare available for X input and information about those devices.
538237eb1ca1SmrgAn array of
538337eb1ca1Smrg<function>XDeviceInfo</function>
538437eb1ca1Smrgstructures is returned, with one element in the array for each device.
538537eb1ca1SmrgThe number of devices is returned in the ndevices argument.
538637eb1ca1Smrg</para>
538737eb1ca1Smrg<para>
538837eb1ca1Smrg<!-- .LP -->
538937eb1ca1SmrgThe X pointer device and X keyboard device are reported, as well as
539037eb1ca1Smrgall available extension input devices.  The use member of the 
539137eb1ca1Smrg<function>XDeviceInfo</function>
539237eb1ca1Smrgstructure specifies the current use of the device.
539337eb1ca1SmrgIf the value of this member is 
539437eb1ca1Smrg<function>IsXPointer ,</function>
539537eb1ca1Smrgthe device is the X pointer device.  If the value is
539637eb1ca1Smrg<function>IsXKeyboard ,</function>
539737eb1ca1Smrgthe device is the X keyboard device.  If the value is
539837eb1ca1Smrg<function>IsXExtensionDevice ,</function>
539937eb1ca1Smrgthe device is available for use as an extension input device.
540037eb1ca1Smrg</para>
540137eb1ca1Smrg<para>
540237eb1ca1Smrg<!-- .LP -->
540337eb1ca1SmrgEach
540437eb1ca1Smrg<function>XDeviceInfo</function>
540537eb1ca1Smrgentry contains a pointer to a list of structures 
540637eb1ca1Smrgthat describe the characteristics of each class
540737eb1ca1Smrgof input supported by that device.  The num_classes member
540837eb1ca1Smrgcontains the number of entries in that list.
540937eb1ca1Smrg</para>
541037eb1ca1Smrg<para>
541137eb1ca1Smrg<!-- .LP -->
541237eb1ca1SmrgIf the device supports input class
541337eb1ca1Smrg<function>Valuators ,</function>
541437eb1ca1Smrgone of the structures pointed to by the
541537eb1ca1Smrg<function>XDeviceInfo</function>
541637eb1ca1Smrgstructure will be an
541737eb1ca1Smrg<function>XValuatorInfo</function>
541837eb1ca1Smrgstructure.  The axes member of that structure
541937eb1ca1Smrgcontains the address of an array of
542037eb1ca1Smrg<function>XAxisInfo</function>
542137eb1ca1Smrgstructures.
542237eb1ca1SmrgThere is one element in this array for each axis of motion
542337eb1ca1Smrgreported by the device.  The number of elements in this 
542437eb1ca1Smrgarray is contained in the num_axes element of the 
542537eb1ca1Smrg<function>XValuatorInfo</function>
542637eb1ca1Smrgstructure.
542737eb1ca1SmrgThe size of the motion buffer for the device is
542837eb1ca1Smrgreported in the motion_buffer member of the
542937eb1ca1Smrg<function>XValuatorInfo</function>
543037eb1ca1Smrgstructure.
543137eb1ca1Smrg</para>
543237eb1ca1Smrg<para>
543337eb1ca1Smrg<!-- .LP -->
543437eb1ca1SmrgThe
543537eb1ca1Smrg<function>XDeviceInfo</function>
543637eb1ca1Smrgstructure is defined as follows:
543737eb1ca1Smrg</para>
543837eb1ca1Smrg<para>
543937eb1ca1Smrg<!-- .LP -->
544037eb1ca1Smrg<!-- .sM -->
544137eb1ca1Smrg<literallayout class="monospaced">
544237eb1ca1Smrg<!-- .TA .5i -->
544337eb1ca1Smrg<!-- .ta .5i -->
544437eb1ca1Smrgtypedef struct _XDeviceInfo {
544537eb1ca1Smrg     XID id;        
544637eb1ca1Smrg     Atom type;
544737eb1ca1Smrg     char *name;
544837eb1ca1Smrg     int num_classes;
544937eb1ca1Smrg     int use;
545037eb1ca1Smrg     XAnyClassPtr inputclassinfo;
545137eb1ca1Smrg} XDeviceInfo;
545237eb1ca1Smrg</literallayout>
545337eb1ca1Smrg</para>
545437eb1ca1Smrg<para>
545537eb1ca1Smrg<!-- .LP -->
545637eb1ca1Smrg<!-- .eM -->
545737eb1ca1SmrgThe structures pointed to by the
545837eb1ca1Smrg<function>XDeviceInfo</function>
545937eb1ca1Smrgstructure are defined as follows:
546037eb1ca1Smrg</para>
546137eb1ca1Smrg<para>
546237eb1ca1Smrg<!-- .LP -->
546337eb1ca1Smrg<!-- .sM -->
546437eb1ca1Smrg<literallayout class="monospaced">
546537eb1ca1Smrg<!-- .TA .5i -->
546637eb1ca1Smrg<!-- .ta .5i -->
546737eb1ca1Smrgtypedef struct _XKeyInfo {
546837eb1ca1Smrg     XID class;
546937eb1ca1Smrg     int length;
547037eb1ca1Smrg     unsigned short min_keycode;
547137eb1ca1Smrg     unsigned short max_keycode;
547237eb1ca1Smrg     unsigned short num_keys;
547337eb1ca1Smrg} XKeyInfo;
547437eb1ca1Smrg
547537eb1ca1Smrgtypedef struct _XButtonInfo {
547637eb1ca1Smrg     XID class;
547737eb1ca1Smrg     int length;
547837eb1ca1Smrg     short num_buttons;
547937eb1ca1Smrg} XButtonInfo;
548037eb1ca1Smrg
548137eb1ca1Smrgtypedef struct _XValuatorInfo {
548237eb1ca1Smrg     XID class;
548337eb1ca1Smrg     int length;
548437eb1ca1Smrg     unsigned char num_axes;
548537eb1ca1Smrg     unsigned char mode;
548637eb1ca1Smrg     unsigned long motion_buffer;
548737eb1ca1Smrg     XAxisInfoPtr axes;
548837eb1ca1Smrg} XValuatorInfo;
548937eb1ca1Smrg</literallayout>
549037eb1ca1Smrg</para>
549137eb1ca1Smrg<para>
549237eb1ca1Smrg<!-- .LP -->
549337eb1ca1Smrg<!-- .eM -->
549437eb1ca1SmrgThe
549537eb1ca1Smrg<function>XAxisInfo</function>
549637eb1ca1Smrgstructure pointed to by the
549737eb1ca1Smrg<function>XValuatorInfo</function>
549837eb1ca1Smrgstructure is defined as follows:
549937eb1ca1Smrg</para>
550037eb1ca1Smrg<para>
550137eb1ca1Smrg<!-- .LP -->
550237eb1ca1Smrg<!-- .sM -->
550337eb1ca1Smrg<literallayout class="monospaced">
550437eb1ca1Smrg<!-- .TA .5i -->
550537eb1ca1Smrg<!-- .ta .5i -->
550637eb1ca1Smrgtypedef struct _XAxisInfo {
550737eb1ca1Smrg     int resolution;
550837eb1ca1Smrg     int min_value;
550937eb1ca1Smrg     int max_value;
551037eb1ca1Smrg} XAxisInfo;
551137eb1ca1Smrg</literallayout>
551237eb1ca1Smrg</para>
551337eb1ca1Smrg<para>
551437eb1ca1Smrg<!-- .LP -->
551537eb1ca1Smrg<!-- .eM -->
551637eb1ca1SmrgThe following atom names are defined in the 
551737eb1ca1Smrg<function>&lt; X11/extensions/XI.h &gt;</function>
551837eb1ca1Smrgheader file.
551937eb1ca1Smrg<literallayout class="monospaced">
552037eb1ca1Smrg<!-- .TA 2i -->
552137eb1ca1Smrg<!-- .ta 2i -->
552237eb1ca1SmrgMOUSE     QUADRATURE
552337eb1ca1SmrgTABLET     SPACEBALL
552437eb1ca1SmrgKEYBOARD     DATAGLOVE
552537eb1ca1SmrgTOUCHSCREEN     EYETRACKER
552637eb1ca1SmrgTOUCHPAD     CURSORKEYS
552737eb1ca1SmrgBUTTONBOX     FOOTMOUSE
552837eb1ca1SmrgBARCODE     ID_MODULE
552937eb1ca1SmrgKNOB_BOX     ONE_KNOB
553037eb1ca1SmrgTRACKBALL     NINE_KNOB\s+1
553137eb1ca1Smrg</literallayout>
553237eb1ca1Smrg</para>
553337eb1ca1Smrg<para>
553437eb1ca1Smrg<!-- .LP -->
553537eb1ca1SmrgThese names can be used in an
5536f1ee322dSmrg<olink targetdoc='libX11' targetptr='XInternAtom'><function>XInternAtom</function></olink>
553737eb1ca1Smrgrequest to return an atom that can be used for comparison
553837eb1ca1Smrgwith the type member of the 
553937eb1ca1Smrg<function>XDeviceInfo</function>
554037eb1ca1Smrgstructure.
554137eb1ca1Smrg</para>
554237eb1ca1Smrg<para>
554337eb1ca1Smrg<!-- .LP -->
5544f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
554537eb1ca1Smrgreturns NULL if there are no input devices to list.
554637eb1ca1Smrg<!-- .sp -->
554737eb1ca1Smrg</para>
554837eb1ca1Smrg<para>
554937eb1ca1Smrg<!-- .LP -->
555037eb1ca1SmrgTo free the data returned by 
555137eb1ca1Smrg<function>XListInputDevices ,</function>
555237eb1ca1Smrguse
555337eb1ca1Smrg<function>XFreeDeviceList .</function>
555437eb1ca1Smrg<!-- .sp -->
555537eb1ca1Smrg</para>
555637eb1ca1Smrg<para>
555737eb1ca1Smrg<!-- .LP -->
555837eb1ca1Smrg<!-- .sM -->
5559f1ee322dSmrg<funcsynopsis id='XFreeDeviceList'>
556037eb1ca1Smrg<funcprototype>
556137eb1ca1Smrg  <funcdef>void <function> XFreeDeviceList</function></funcdef>
556237eb1ca1Smrg  <paramdef>XDeviceInfo<parameter> *list</parameter></paramdef>
556337eb1ca1Smrg</funcprototype>
556437eb1ca1Smrg</funcsynopsis>
556537eb1ca1Smrg<!-- .FN -->
556637eb1ca1Smrg<variablelist>
556737eb1ca1Smrg  <varlistentry>
556837eb1ca1Smrg    <term>
556937eb1ca1Smrg      <emphasis remap='I'>list</emphasis>
557037eb1ca1Smrg    </term>
557137eb1ca1Smrg    <listitem>
557237eb1ca1Smrg      <para>
557337eb1ca1SmrgSpecifies the pointer to the
557437eb1ca1Smrg<function>XDeviceInfo</function>
557537eb1ca1Smrgarray returned by a previous call to
557637eb1ca1Smrg<function>XListInputDevices .</function>
557737eb1ca1Smrg    </para>
557837eb1ca1Smrg  </listitem>
557937eb1ca1Smrg  </varlistentry>
558037eb1ca1Smrg</variablelist>
558137eb1ca1Smrg</para>
558237eb1ca1Smrg<para>
558337eb1ca1Smrg<!-- .LP -->
558437eb1ca1Smrg<!-- .eM -->
5585f1ee322dSmrg<xref linkend='XFreeDeviceList' xrefstyle='select: title'/>
558637eb1ca1Smrgfrees the list of input device information.
558737eb1ca1Smrg</para>
558837eb1ca1Smrg</sect3>
558937eb1ca1Smrg<sect3 id="Enabling_and_Disabling_Extension_Devices">
559037eb1ca1Smrg<title>Enabling and Disabling Extension Devices</title>
559137eb1ca1Smrg<!-- .XS -->
559237eb1ca1Smrg<!-- (SN Enabling and Disabling Extension Devices -->
559337eb1ca1Smrg<!-- .XE -->
559437eb1ca1Smrg<para>
559537eb1ca1Smrg<!-- .LP -->
559637eb1ca1SmrgEach client program that wishes to access an extension device must request
559737eb1ca1Smrgthat the server open that device by calling the
5598f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
559937eb1ca1Smrgfunction.
560037eb1ca1Smrg<!-- .sM -->
5601f1ee322dSmrg<funcsynopsis id='XOpenDevice'>
560237eb1ca1Smrg<funcprototype>
560337eb1ca1Smrg  <funcdef>XDevice * <function> XOpenDevice</function></funcdef>
560437eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
560537eb1ca1Smrg  <paramdef>XID<parameter> device_id</parameter></paramdef>
560637eb1ca1Smrg</funcprototype>
560737eb1ca1Smrg</funcsynopsis>
560837eb1ca1Smrg<!-- .FN -->
560937eb1ca1Smrg<variablelist>
561037eb1ca1Smrg  <varlistentry>
561137eb1ca1Smrg    <term>
561237eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
561337eb1ca1Smrg    </term>
561437eb1ca1Smrg    <listitem>
561537eb1ca1Smrg      <para>
561637eb1ca1SmrgSpecifies the connection to the X server.
561737eb1ca1Smrg      </para>
561837eb1ca1Smrg    </listitem>
561937eb1ca1Smrg  </varlistentry>
562037eb1ca1Smrg  <varlistentry>
562137eb1ca1Smrg    <term>
562237eb1ca1Smrg      <emphasis remap='I'>device_id</emphasis>
562337eb1ca1Smrg    </term>
562437eb1ca1Smrg    <listitem>
562537eb1ca1Smrg      <para>
562637eb1ca1SmrgSpecifies the ID that uniquely identifies the device to be opened.
562737eb1ca1SmrgThis ID is obtained from the
5628f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
562937eb1ca1Smrgrequest.
563037eb1ca1Smrg    </para>
563137eb1ca1Smrg  </listitem>
563237eb1ca1Smrg  </varlistentry>
563337eb1ca1Smrg</variablelist>
563437eb1ca1Smrg</para>
563537eb1ca1Smrg<para>
563637eb1ca1Smrg<!-- .LP -->
563737eb1ca1Smrg<!-- .eM -->
5638f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
563937eb1ca1Smrgopens the device for the requesting client and, on success, returns an
564037eb1ca1Smrg<function>XDevice</function>
564137eb1ca1Smrgstructure, which is defined as follows:
564237eb1ca1Smrg</para>
564337eb1ca1Smrg<para>
564437eb1ca1Smrg<!-- .LP -->
564537eb1ca1Smrg<!-- .sM -->
564637eb1ca1Smrg<literallayout class="monospaced">
564737eb1ca1Smrg<!-- .TA .5i -->
564837eb1ca1Smrg<!-- .ta .5i -->
564937eb1ca1Smrgtypedef struct {
565037eb1ca1Smrg     XID device_id;
565137eb1ca1Smrg     int num_classes;
565237eb1ca1Smrg     XInputClassInfo *classes;
565337eb1ca1Smrg} XDevice;
565437eb1ca1Smrg</literallayout>
565537eb1ca1Smrg</para>
565637eb1ca1Smrg<para>
565737eb1ca1Smrg<!-- .LP -->
565837eb1ca1Smrg<!-- .eM -->
565937eb1ca1SmrgThe
566037eb1ca1Smrg<function>XDevice</function>
566137eb1ca1Smrgstructure contains a pointer to an array of
566237eb1ca1Smrg<function>XInputClassInfo</function>
566337eb1ca1Smrgstructures.  Each element in that array
566437eb1ca1Smrgcontains information about events of a particular input class supported
566537eb1ca1Smrgby the input device.
566637eb1ca1Smrg</para>
566737eb1ca1Smrg<para>
566837eb1ca1Smrg<!-- .LP -->
566937eb1ca1SmrgThe
567037eb1ca1Smrg<function>XInputClassInfo</function>
567137eb1ca1Smrgstructure is defined as follows:
567237eb1ca1Smrg</para>
567337eb1ca1Smrg<para>
567437eb1ca1Smrg<!-- .LP -->
567537eb1ca1Smrg<!-- .sM -->
567637eb1ca1Smrg<literallayout class="monospaced">
567737eb1ca1Smrg<!-- .TA .5i -->
567837eb1ca1Smrg<!-- .ta .5i -->
567937eb1ca1Smrgtypedef struct {
568037eb1ca1Smrg     unsigned char input_class;
568137eb1ca1Smrg     unsigned char event_type_base;
568237eb1ca1Smrg} XInputClassInfo;
568337eb1ca1Smrg</literallayout>
568437eb1ca1Smrg</para>
568537eb1ca1Smrg<para>
568637eb1ca1Smrg<!-- .LP -->
568737eb1ca1Smrg<!-- .eM -->
568837eb1ca1SmrgA client program can determine the event
568937eb1ca1Smrgtype and event class for a given event by using macros defined by the 
569037eb1ca1Smrginput extension.  The name of the macro corresponds to the desired event,
569137eb1ca1Smrgand the macro is passed the structure that describes the device from which
569237eb1ca1Smrginput is desired, for example:
569337eb1ca1Smrg</para>
569437eb1ca1Smrg<para>
569537eb1ca1Smrg<!-- .LP -->
569637eb1ca1Smrg<literallayout class="monospaced">
569737eb1ca1Smrg<!-- .TA .5i -->
569837eb1ca1Smrg<!-- .ta .5i -->
569937eb1ca1Smrg     DeviceKeyPress(XDevice *device, event_type, event_class)
570037eb1ca1Smrg</literallayout>
570137eb1ca1Smrg</para>
570237eb1ca1Smrg<para>
570337eb1ca1Smrg<!-- .LP -->
570437eb1ca1SmrgThe macro will fill in the values of the event class to be used in an
5705f1ee322dSmrg<xref linkend='XSelectExtensionEvent' xrefstyle='select: title'/>
570637eb1ca1Smrgrequest to select the event and the event type to be used in comparing
570737eb1ca1Smrgwith the event types of events received via
5708f1ee322dSmrg<olink targetdoc='libX11' targetptr='XNextEvent'><function>XNextEvent</function></olink>.
570937eb1ca1Smrg</para>
571037eb1ca1Smrg<para>
571137eb1ca1Smrg<!-- .LP -->
5712f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
571337eb1ca1Smrgcan generate
571437eb1ca1Smrg<function>BadDevice</function>
571537eb1ca1Smrgerrors.
571637eb1ca1Smrg<!-- .sp -->
571737eb1ca1Smrg</para>
571837eb1ca1Smrg<para>
571937eb1ca1Smrg<!-- .LP -->
572037eb1ca1SmrgBefore terminating, the client program should request that the server close
572137eb1ca1Smrgthe device by calling the
5722f1ee322dSmrg<xref linkend='XCloseDevice' xrefstyle='select: title'/>
572337eb1ca1Smrgfunction.
572437eb1ca1Smrg<!-- .sM -->
5725f1ee322dSmrg<funcsynopsis id='XCloseDevice'>
572637eb1ca1Smrg<funcprototype>
572737eb1ca1Smrg  <funcdef>int <function> XCloseDevice</function></funcdef>
572837eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
572937eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
573037eb1ca1Smrg</funcprototype>
573137eb1ca1Smrg</funcsynopsis>
573237eb1ca1Smrg<!-- .FN -->
573337eb1ca1Smrg<variablelist>
573437eb1ca1Smrg  <varlistentry>
573537eb1ca1Smrg    <term>
573637eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
573737eb1ca1Smrg    </term>
573837eb1ca1Smrg    <listitem>
573937eb1ca1Smrg      <para>
574037eb1ca1SmrgSpecifies the connection to the X server.
574137eb1ca1Smrg      </para>
574237eb1ca1Smrg    </listitem>
574337eb1ca1Smrg  </varlistentry>
574437eb1ca1Smrg  <varlistentry>
574537eb1ca1Smrg    <term>
574637eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
574737eb1ca1Smrg    </term>
574837eb1ca1Smrg    <listitem>
574937eb1ca1Smrg      <para>
575037eb1ca1SmrgSpecifies the device to be closed.
575137eb1ca1Smrg    </para>
575237eb1ca1Smrg  </listitem>
575337eb1ca1Smrg  </varlistentry>
575437eb1ca1Smrg</variablelist>
575537eb1ca1Smrg</para>
575637eb1ca1Smrg<para>
575737eb1ca1Smrg<!-- .LP -->
575837eb1ca1Smrg<!-- .eM -->
5759f1ee322dSmrg<xref linkend='XCloseDevice' xrefstyle='select: title'/>
576037eb1ca1Smrgcloses the device for the requesting client and frees the associated
576137eb1ca1Smrg<function>XDevice</function>
576237eb1ca1Smrgstructure.
576337eb1ca1Smrg</para>
576437eb1ca1Smrg<para>
576537eb1ca1Smrg<!-- .LP -->
576637eb1ca1SmrgA client may open the same extension device more than once.  Requests
576737eb1ca1Smrgafter the first successful one return an additional
576837eb1ca1Smrg<function>XDevice</function>
576937eb1ca1Smrgstructure
577037eb1ca1Smrgwith the same information as the first, but otherwise have no effect.
577137eb1ca1SmrgA single
5772f1ee322dSmrg<xref linkend='XCloseDevice' xrefstyle='select: title'/>
577337eb1ca1Smrgrequest will terminate that client's access to the device.
577437eb1ca1Smrg</para>
577537eb1ca1Smrg<para>
577637eb1ca1Smrg<!-- .LP -->
577737eb1ca1SmrgClosing a device releases any active or passive grabs the requesting client
577837eb1ca1Smrghas established.  If the device is frozen only by an active grab of the
577937eb1ca1Smrgrequesting client, any queued events are released.
578037eb1ca1Smrg</para>
578137eb1ca1Smrg<para>
578237eb1ca1Smrg<!-- .LP -->
578337eb1ca1SmrgIf a client program terminates without closing a device, the server will
578437eb1ca1Smrgautomatically close that device on behalf of the client.  This does not
578537eb1ca1Smrgaffect any other clients that may be accessing that device.
578637eb1ca1Smrg</para>
578737eb1ca1Smrg<para>
578837eb1ca1Smrg<!-- .LP -->
5789f1ee322dSmrg<xref linkend='XCloseDevice' xrefstyle='select: title'/>
579037eb1ca1Smrgcan generate
579137eb1ca1Smrg<function>BadDevice</function>
579237eb1ca1Smrgerrors.
579337eb1ca1Smrg</para>
579437eb1ca1Smrg</sect3>
579537eb1ca1Smrg<sect3 id="Changing_the_Mode_of_a_Device">
579637eb1ca1Smrg<title>Changing the Mode of a Device</title>
579737eb1ca1Smrg<!-- .XS -->
579837eb1ca1Smrg<!-- (SN Changing the Mode of a Device -->
579937eb1ca1Smrg<!-- .XE -->
580037eb1ca1Smrg<para>
580137eb1ca1Smrg<!-- .LP -->
580237eb1ca1SmrgSome devices are capable of reporting either relative or absolute motion
580337eb1ca1Smrgdata. 
580437eb1ca1SmrgTo change the mode of a device from relative to absolute, use
580537eb1ca1Smrg<function>XSetDeviceMode .</function>
580637eb1ca1Smrg<!-- .sM -->
5807f1ee322dSmrg<funcsynopsis id='XSetDeviceMode'>
580837eb1ca1Smrg<funcprototype>
580937eb1ca1Smrg  <funcdef>int <function> XSetDeviceMode</function></funcdef>
581037eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
581137eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
581237eb1ca1Smrg  <paramdef>int<parameter> mode</parameter></paramdef>
581337eb1ca1Smrg</funcprototype>
581437eb1ca1Smrg</funcsynopsis>
581537eb1ca1Smrg<!-- .FN -->
581637eb1ca1Smrg<variablelist>
581737eb1ca1Smrg  <varlistentry>
581837eb1ca1Smrg    <term>
581937eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
582037eb1ca1Smrg    </term>
582137eb1ca1Smrg    <listitem>
582237eb1ca1Smrg      <para>
582337eb1ca1SmrgSpecifies the connection to the X server.
582437eb1ca1Smrg      </para>
582537eb1ca1Smrg    </listitem>
582637eb1ca1Smrg  </varlistentry>
582737eb1ca1Smrg  <varlistentry>
582837eb1ca1Smrg    <term>
582937eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
583037eb1ca1Smrg    </term>
583137eb1ca1Smrg    <listitem>
583237eb1ca1Smrg      <para>
583337eb1ca1SmrgSpecifies the device whose mode should be changed.
583437eb1ca1Smrg      </para>
583537eb1ca1Smrg    </listitem>
583637eb1ca1Smrg  </varlistentry>
583737eb1ca1Smrg  <varlistentry>
583837eb1ca1Smrg    <term>
583937eb1ca1Smrg      <emphasis remap='I'>mode</emphasis>
584037eb1ca1Smrg    </term>
584137eb1ca1Smrg    <listitem>
584237eb1ca1Smrg      <para>
584337eb1ca1SmrgSpecifies the mode.  You can pass
584437eb1ca1Smrg<function>Absolute</function>
584537eb1ca1Smrgor
584637eb1ca1Smrg<function>Relative .</function>
584737eb1ca1Smrg    </para>
584837eb1ca1Smrg  </listitem>
584937eb1ca1Smrg  </varlistentry>
585037eb1ca1Smrg</variablelist>
585137eb1ca1Smrg</para>
585237eb1ca1Smrg<para>
585337eb1ca1Smrg<!-- .LP -->
585437eb1ca1Smrg<!-- .eM -->
5855f1ee322dSmrg<xref linkend='XSetDeviceMode' xrefstyle='select: title'/>
585637eb1ca1Smrgallows a client to request the server to change the mode of a 
585737eb1ca1Smrgdevice that is capable of reporting either absolute positional data or relative
585837eb1ca1Smrgmotion data.  If the device is invalid or if the client has not previously 
585937eb1ca1Smrgrequested that the server open the device via an
5860f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
586137eb1ca1Smrgrequest, this request will fail with a
586237eb1ca1Smrg<function>BadDevice</function>
586337eb1ca1Smrgerror.
586437eb1ca1SmrgIf the device does not support input class
586537eb1ca1Smrg<function>Valuators</function>
586637eb1ca1Smrgor if it is not capable of reporting the specified mode,
586737eb1ca1Smrgthe request will fail with a 
586837eb1ca1Smrg<function>BadMatch</function>
586937eb1ca1Smrgerror.
587037eb1ca1Smrg</para>
587137eb1ca1Smrg<para>
587237eb1ca1Smrg<!-- .LP -->
587337eb1ca1SmrgThis request will fail and return
587437eb1ca1Smrg<function>DeviceBusy</function>
587537eb1ca1Smrgif another client has already opened the device and requested a different mode.
587637eb1ca1Smrg</para>
587737eb1ca1Smrg<para>
587837eb1ca1Smrg<!-- .LP -->
5879f1ee322dSmrg<xref linkend='XSetDeviceMode' xrefstyle='select: title'/>
588037eb1ca1Smrgcan generate
588137eb1ca1Smrg<function>BadDevice ,</function>
588237eb1ca1Smrg<function>BadMatch ,</function>
588337eb1ca1Smrg<function>BadMode ,</function>
588437eb1ca1Smrgand
588537eb1ca1Smrg<function>DeviceBusy</function>
588637eb1ca1Smrgerrors.
588737eb1ca1Smrg</para>
588837eb1ca1Smrg</sect3>
588937eb1ca1Smrg<sect3 id="Initializing_Valuators_on_an_Input_Device">
589037eb1ca1Smrg<title>Initializing Valuators on an Input Device</title>
589137eb1ca1Smrg<!-- .XS -->
589237eb1ca1Smrg<!-- (SN Initializing Valuators on an Input Device -->
589337eb1ca1Smrg<!-- .XE -->
589437eb1ca1Smrg<para>
589537eb1ca1Smrg<!-- .LP -->
589637eb1ca1SmrgSome devices that report absolute positional data can be initialized to a 
589737eb1ca1Smrgstarting value.  Devices that are capable of reporting relative motion or
589837eb1ca1Smrgabsolute positional data may require that their valuators be initialized 
589937eb1ca1Smrgto a starting value after the mode of the device is changed to
590037eb1ca1Smrg<function>Absolute .</function>
590137eb1ca1Smrg<!-- .sp -->
590237eb1ca1Smrg</para>
590337eb1ca1Smrg<para>
590437eb1ca1Smrg<!-- .LP -->
590537eb1ca1SmrgTo initialize the valuators on such a device, use 
590637eb1ca1Smrg<function>XSetDeviceValuators .</function>
590737eb1ca1Smrg<!-- .sM -->
5908f1ee322dSmrg<funcsynopsis id='XSetDeviceValuators'>
590937eb1ca1Smrg<funcprototype>
591037eb1ca1Smrg  <funcdef>Status <function> XSetDeviceValuators</function></funcdef>
591137eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
591237eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
591337eb1ca1Smrg  <paramdef>int*valuators,first_valuator,<parameter> num_valuators</parameter></paramdef>
591437eb1ca1Smrg</funcprototype>
591537eb1ca1Smrg</funcsynopsis>
591637eb1ca1Smrg<!-- .FN -->
591737eb1ca1Smrg<variablelist>
591837eb1ca1Smrg  <varlistentry>
591937eb1ca1Smrg    <term>
592037eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
592137eb1ca1Smrg    </term>
592237eb1ca1Smrg    <listitem>
592337eb1ca1Smrg      <para>
592437eb1ca1SmrgSpecifies the connection to the X server.
592537eb1ca1Smrg      </para>
592637eb1ca1Smrg    </listitem>
592737eb1ca1Smrg  </varlistentry>
592837eb1ca1Smrg  <varlistentry>
592937eb1ca1Smrg    <term>
593037eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
593137eb1ca1Smrg    </term>
593237eb1ca1Smrg    <listitem>
593337eb1ca1Smrg      <para>
593437eb1ca1SmrgSpecifies the device whose valuators should be initialized.
593537eb1ca1Smrg      </para>
593637eb1ca1Smrg    </listitem>
593737eb1ca1Smrg  </varlistentry>
593837eb1ca1Smrg  <varlistentry>
593937eb1ca1Smrg    <term>
594037eb1ca1Smrg      <emphasis remap='I'>valuators</emphasis>
594137eb1ca1Smrg    </term>
594237eb1ca1Smrg    <listitem>
594337eb1ca1Smrg      <para>
594437eb1ca1SmrgSpecifies the values to which each valuator should be set.
594537eb1ca1Smrg      </para>
594637eb1ca1Smrg    </listitem>
594737eb1ca1Smrg  </varlistentry>
594837eb1ca1Smrg  <varlistentry>
594937eb1ca1Smrg    <term>
595037eb1ca1Smrg      <emphasis remap='I'>first_valuator</emphasis>
595137eb1ca1Smrg    </term>
595237eb1ca1Smrg    <listitem>
595337eb1ca1Smrg      <para>
595437eb1ca1SmrgSpecifies the first valuator to be set.
595537eb1ca1Smrg      </para>
595637eb1ca1Smrg    </listitem>
595737eb1ca1Smrg  </varlistentry>
595837eb1ca1Smrg  <varlistentry>
595937eb1ca1Smrg    <term>
596037eb1ca1Smrg      <emphasis remap='I'>num_valuators</emphasis>
596137eb1ca1Smrg    </term>
596237eb1ca1Smrg    <listitem>
596337eb1ca1Smrg      <para>
596437eb1ca1SmrgSpecifies the number of valuators to be set.
596537eb1ca1Smrg    </para>
596637eb1ca1Smrg  </listitem>
596737eb1ca1Smrg  </varlistentry>
596837eb1ca1Smrg</variablelist>
596937eb1ca1Smrg</para>
597037eb1ca1Smrg<para>
597137eb1ca1Smrg<!-- .LP -->
597237eb1ca1Smrg<!-- .eM -->
5973f1ee322dSmrg<xref linkend='XSetDeviceValuators' xrefstyle='select: title'/>
597437eb1ca1Smrginitializes the specified valuators on the specified extension
597537eb1ca1Smrginput device.  Valuators are numbered beginning with zero.  Only the valuators
597637eb1ca1Smrgin the range specified by first_valuator and num_valuators are set.  
597737eb1ca1SmrgA
597837eb1ca1Smrg<function>BadValue</function>
597937eb1ca1Smrgerror results if the number of valuators supported by the device 
598037eb1ca1Smrgis less than the following expression:
598137eb1ca1Smrg<literallayout class="monospaced">
598237eb1ca1Smrg<!-- .TA .5i -->
598337eb1ca1Smrg<!-- .ta .5i -->
598437eb1ca1Smrg     first_valuator + num_valuators
598537eb1ca1Smrg</literallayout>
598637eb1ca1Smrg</para>
598737eb1ca1Smrg<para>
598837eb1ca1Smrg<!-- .LP -->
598937eb1ca1SmrgIf the request succeeds,
599037eb1ca1Smrg<function>Success</function>
599137eb1ca1Smrgis returned.  If the specified device is grabbed by some other client,
599237eb1ca1Smrgthe request will fail and a status of
599337eb1ca1Smrg<function>AlreadyGrabbed</function>
599437eb1ca1Smrgwill be returned.
599537eb1ca1Smrg</para>
599637eb1ca1Smrg<para>
599737eb1ca1Smrg<!-- .LP -->
5998f1ee322dSmrg<xref linkend='XSetDeviceValuators' xrefstyle='select: title'/>
599937eb1ca1Smrgcan generate
600037eb1ca1Smrg<function>BadDevice ,</function>
600137eb1ca1Smrg<function>BadLength ,</function>
600237eb1ca1Smrg<function>BadMatch ,</function>
600337eb1ca1Smrgand 
600437eb1ca1Smrg<function>BadValue</function>
600537eb1ca1Smrgerrors.
600637eb1ca1Smrg</para>
600737eb1ca1Smrg</sect3>
600837eb1ca1Smrg<sect3 id="Getting_Input_Device_Controls">
600937eb1ca1Smrg<title>Getting Input Device Controls</title>
601037eb1ca1Smrg<!-- .XS -->
601137eb1ca1Smrg<!-- (SN Getting Input Device Controls -->
601237eb1ca1Smrg<!-- .XE -->
601337eb1ca1Smrg<para>
601437eb1ca1Smrg<!-- .LP -->
601537eb1ca1SmrgSome input devices support various configuration controls
601637eb1ca1Smrgthat can be queried or changed by clients.  The set of supported
601737eb1ca1Smrgcontrols will vary from one input device to another.  Requests
601837eb1ca1Smrgto manipulate these controls will fail if either the target
601937eb1ca1SmrgX server or the target input device does not support the 
602037eb1ca1Smrgrequested device control.
602137eb1ca1Smrg</para>
602237eb1ca1Smrg<para>
602337eb1ca1Smrg<!-- .LP -->
602437eb1ca1SmrgEach device control has a unique identifier.  Information
602537eb1ca1Smrgpassed with each device control varies in length and is mapped
602637eb1ca1Smrgby data structures unique to that device control.
602737eb1ca1Smrg<!-- .sp -->
602837eb1ca1Smrg</para>
602937eb1ca1Smrg<para>
603037eb1ca1Smrg<!-- .LP -->
603137eb1ca1SmrgTo query a device control, use
603237eb1ca1Smrg<function>XGetDeviceControl .</function>
603337eb1ca1Smrg<!-- .sM -->
6034f1ee322dSmrg<funcsynopsis id='XGetDeviceControl'>
603537eb1ca1Smrg<funcprototype>
603637eb1ca1Smrg  <funcdef>XDeviceControl * <function> XGetDeviceControl</function></funcdef>
603737eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
603837eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
603937eb1ca1Smrg  <paramdef>int<parameter> control</parameter></paramdef>
604037eb1ca1Smrg</funcprototype>
604137eb1ca1Smrg</funcsynopsis>
604237eb1ca1Smrg<!-- .FN -->
604337eb1ca1Smrg<variablelist>
604437eb1ca1Smrg  <varlistentry>
604537eb1ca1Smrg    <term>
604637eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
604737eb1ca1Smrg    </term>
604837eb1ca1Smrg    <listitem>
604937eb1ca1Smrg      <para>
605037eb1ca1SmrgSpecifies the connection to the X server.
605137eb1ca1Smrg      </para>
605237eb1ca1Smrg    </listitem>
605337eb1ca1Smrg  </varlistentry>
605437eb1ca1Smrg  <varlistentry>
605537eb1ca1Smrg    <term>
605637eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
605737eb1ca1Smrg    </term>
605837eb1ca1Smrg    <listitem>
605937eb1ca1Smrg      <para>
606037eb1ca1SmrgSpecifies the device whose configuration control status is to be returned.
606137eb1ca1Smrg      </para>
606237eb1ca1Smrg    </listitem>
606337eb1ca1Smrg  </varlistentry>
606437eb1ca1Smrg  <varlistentry>
606537eb1ca1Smrg    <term>
606637eb1ca1Smrg      <emphasis remap='I'>control</emphasis>
606737eb1ca1Smrg    </term>
606837eb1ca1Smrg    <listitem>
606937eb1ca1Smrg      <para>
607037eb1ca1SmrgIdentifies the specific device control to be queried.
607137eb1ca1Smrg    </para>
607237eb1ca1Smrg  </listitem>
607337eb1ca1Smrg  </varlistentry>
607437eb1ca1Smrg</variablelist>
607537eb1ca1Smrg</para>
607637eb1ca1Smrg<para>
607737eb1ca1Smrg<!-- .LP -->
607837eb1ca1Smrg<!-- .eM -->
6079f1ee322dSmrg<xref linkend='XGetDeviceControl' xrefstyle='select: title'/>
608037eb1ca1Smrgreturns the current state of the specified device control.
608137eb1ca1SmrgIf the target X server does not support that device control, a
608237eb1ca1Smrg<function>BadValue</function>
608337eb1ca1Smrgerror is returned.
608437eb1ca1SmrgIf the specified device does not support that device control, a
608537eb1ca1Smrg<function>BadMatch</function>
608637eb1ca1Smrgerror
608737eb1ca1Smrgis returned.
608837eb1ca1Smrg</para>
608937eb1ca1Smrg<para>
609037eb1ca1Smrg<!-- .LP -->
609137eb1ca1SmrgIf the request is successful, a pointer to a generic 
609237eb1ca1Smrg<function>XDeviceState</function>
609337eb1ca1Smrgstructure is returned.  The information returned varies according
609437eb1ca1Smrgto the specified control and is mapped by a structure appropriate
609537eb1ca1Smrgfor that control.
609637eb1ca1SmrgThe first two members are common to all device controls
609737eb1ca1Smrgand are defined as follows:
609837eb1ca1Smrg</para>
609937eb1ca1Smrg<para>
610037eb1ca1Smrg<!-- .LP -->
610137eb1ca1Smrg<!-- .sM -->
610237eb1ca1Smrg<literallayout class="monospaced">
610337eb1ca1Smrg<!-- .TA .5i -->
610437eb1ca1Smrg<!-- .ta .5i -->
610537eb1ca1Smrgtypedef struct {
610637eb1ca1Smrg     XID control;
610737eb1ca1Smrg     int length;
610837eb1ca1Smrg} XDeviceState;
610937eb1ca1Smrg\fP
611037eb1ca1Smrg</literallayout>
611137eb1ca1Smrg</para>
611237eb1ca1Smrg<para>
611337eb1ca1Smrg<!-- .LP -->
611437eb1ca1Smrg<!-- .eM -->
611537eb1ca1SmrgThe control may be compared to constants defined in the file
611637eb1ca1Smrg<function>&lt; X11/extensions/XI.h &gt;.</function>
611737eb1ca1SmrgCurrently defined device controls include DEVICE_RESOLUTION.
611837eb1ca1Smrg</para>
611937eb1ca1Smrg<para>
612037eb1ca1Smrg<!-- .LP -->
612137eb1ca1SmrgThe information returned for the DEVICE_RESOLUTION control is
612237eb1ca1Smrgdefined in the 
612337eb1ca1Smrg<function>XDeviceResolutionState</function>
612437eb1ca1Smrgstructure, which is defined as follows:
612537eb1ca1Smrg</para>
612637eb1ca1Smrg<para>
612737eb1ca1Smrg<!-- .LP -->
612837eb1ca1Smrg<!-- .sM -->
612937eb1ca1Smrg<literallayout class="monospaced">
613037eb1ca1Smrg<!-- .TA .5i -->
613137eb1ca1Smrg<!-- .ta .5i -->
613237eb1ca1Smrgtypedef struct {
613337eb1ca1Smrg     XID control;
613437eb1ca1Smrg     int length;
613537eb1ca1Smrg     int num_valuators;
613637eb1ca1Smrg     int *resolutions;
613737eb1ca1Smrg     int *min_resolutions;
613837eb1ca1Smrg     int *max_resolutions;
613937eb1ca1Smrg} XDeviceResolutionState;
614037eb1ca1Smrg</literallayout>
614137eb1ca1Smrg</para>
614237eb1ca1Smrg<para>
614337eb1ca1Smrg<!-- .LP -->
614437eb1ca1Smrg<!-- .eM -->
614537eb1ca1SmrgThis device control returns a list of valuators and the range of 
614637eb1ca1Smrgvalid resolutions allowed for each.  Valuators are numbered 
614737eb1ca1Smrgbeginning with zero (0).  Resolutions for all valuators on the device are 
614837eb1ca1Smrgreturned.  For each valuator i on the device, resolutions[i] returns 
614937eb1ca1Smrgthe current setting of the resolution, min_resolutions[i] returns 
615037eb1ca1Smrgthe minimum valid setting, and max_resolutions[i] returns the 
615137eb1ca1Smrgmaximum valid setting.
615237eb1ca1Smrg</para>
615337eb1ca1Smrg<para>
615437eb1ca1Smrg<!-- .LP -->
615537eb1ca1SmrgWhen this control is specified,
6156f1ee322dSmrg<xref linkend='XGetDeviceControl' xrefstyle='select: title'/>
615737eb1ca1Smrgfails with a
615837eb1ca1Smrg<function>BadMatch</function>
615937eb1ca1Smrgerror if the specified device has no valuators.
616037eb1ca1Smrg</para>
616137eb1ca1Smrg<para>
616237eb1ca1Smrg<!-- .LP -->
6163f1ee322dSmrg<xref linkend='XGetDeviceControl' xrefstyle='select: title'/>
616437eb1ca1Smrgcan generate
616537eb1ca1Smrg<function>BadMatch</function>
616637eb1ca1Smrgand
616737eb1ca1Smrg<function>BadValue</function>
616837eb1ca1Smrgerrors.
616937eb1ca1Smrg</para>
617037eb1ca1Smrg</sect3>
617137eb1ca1Smrg<sect3 id="Changing_Input_Device_Controls">
617237eb1ca1Smrg<title>Changing Input Device Controls</title>
617337eb1ca1Smrg<!-- .XS -->
617437eb1ca1Smrg<!-- (SN Changing Input Device Controls -->
617537eb1ca1Smrg<!-- .XE -->
617637eb1ca1Smrg<para>
617737eb1ca1Smrg<!-- .LP -->
617837eb1ca1SmrgSome input devices support various configuration controls
617937eb1ca1Smrgthat can be changed by clients.  Typically, this would be
618037eb1ca1Smrgdone to initialize the device to a known state or configuration.
618137eb1ca1SmrgThe set of supported controls will vary from one input device 
618237eb1ca1Smrgto another.  Requests to manipulate these controls will fail if 
618337eb1ca1Smrgeither the target X server or the target input device does not 
618437eb1ca1Smrgsupport the requested device control.  Setting the device control 
618537eb1ca1Smrgwill also fail if the target input device is grabbed by another 
618637eb1ca1Smrgclient or is open by another client and has been set to a conflicting
618737eb1ca1Smrgstate.
618837eb1ca1Smrg</para>
618937eb1ca1Smrg<para>
619037eb1ca1Smrg<!-- .LP -->
619137eb1ca1SmrgEach device control has a unique identifier.  Information
619237eb1ca1Smrgpassed with each device control varies in length and is mapped
619337eb1ca1Smrgby data structures unique to that device control.
619437eb1ca1Smrg<!-- .sp -->
619537eb1ca1Smrg</para>
619637eb1ca1Smrg<para>
619737eb1ca1Smrg<!-- .LP -->
619837eb1ca1SmrgTo change a device control, use
619937eb1ca1Smrg<function>XChangeDeviceControl .</function>
620037eb1ca1Smrg<!-- .sM -->
6201f1ee322dSmrg<funcsynopsis id='XChangeDeviceControl'>
620237eb1ca1Smrg<funcprototype>
620337eb1ca1Smrg  <funcdef>Status <function> XChangeDeviceControl</function></funcdef>
620437eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
620537eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
620637eb1ca1Smrg  <paramdef>int<parameter> control</parameter></paramdef>
620737eb1ca1Smrg  <paramdef>XDeviceControl<parameter> *value</parameter></paramdef>
620837eb1ca1Smrg</funcprototype>
620937eb1ca1Smrg</funcsynopsis>
621037eb1ca1Smrg<!-- .FN -->
621137eb1ca1Smrg<variablelist>
621237eb1ca1Smrg  <varlistentry>
621337eb1ca1Smrg    <term>
621437eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
621537eb1ca1Smrg    </term>
621637eb1ca1Smrg    <listitem>
621737eb1ca1Smrg      <para>
621837eb1ca1SmrgSpecifies the connection to the X server.
621937eb1ca1Smrg      </para>
622037eb1ca1Smrg    </listitem>
622137eb1ca1Smrg  </varlistentry>
622237eb1ca1Smrg  <varlistentry>
622337eb1ca1Smrg    <term>
622437eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
622537eb1ca1Smrg    </term>
622637eb1ca1Smrg    <listitem>
622737eb1ca1Smrg      <para>
622837eb1ca1SmrgSpecifies the device whose configuration control status is to be modified.
622937eb1ca1Smrg      </para>
623037eb1ca1Smrg    </listitem>
623137eb1ca1Smrg  </varlistentry>
623237eb1ca1Smrg  <varlistentry>
623337eb1ca1Smrg    <term>
623437eb1ca1Smrg      <emphasis remap='I'>control</emphasis>
623537eb1ca1Smrg    </term>
623637eb1ca1Smrg    <listitem>
623737eb1ca1Smrg      <para>
623837eb1ca1SmrgIdentifies the specific device control to be changed.
623937eb1ca1Smrg      </para>
624037eb1ca1Smrg    </listitem>
624137eb1ca1Smrg  </varlistentry>
624237eb1ca1Smrg  <varlistentry>
624337eb1ca1Smrg    <term>
624437eb1ca1Smrg      <emphasis remap='I'>value</emphasis>
624537eb1ca1Smrg    </term>
624637eb1ca1Smrg    <listitem>
624737eb1ca1Smrg      <para>
624837eb1ca1SmrgSpecifies a pointer to an
624937eb1ca1Smrg<function>XDeviceControl</function>
625037eb1ca1Smrgstructure that describes which control is to be changed
625137eb1ca1Smrgand how it is to be changed.
625237eb1ca1Smrg    </para>
625337eb1ca1Smrg  </listitem>
625437eb1ca1Smrg  </varlistentry>
625537eb1ca1Smrg</variablelist>
625637eb1ca1Smrg</para>
625737eb1ca1Smrg<para>
625837eb1ca1Smrg<!-- .LP -->
625937eb1ca1Smrg<!-- .eM -->
6260f1ee322dSmrg<xref linkend='XChangeDeviceControl' xrefstyle='select: title'/>
626137eb1ca1Smrgchanges the current state of the specified device control.
626237eb1ca1SmrgIf the target X server does not support that device control, a
626337eb1ca1Smrg<function>BadValue</function>
626437eb1ca1Smrgerror is returned.
626537eb1ca1SmrgIf the specified device does not support that device control, a
626637eb1ca1Smrg<function>BadMatch</function>
626737eb1ca1Smrgerror is returned.
626837eb1ca1SmrgIf another client has the target device grabbed, a status of
626937eb1ca1Smrg<function>AlreadyGrabbed</function>
627037eb1ca1Smrgis returned.
627137eb1ca1SmrgIf another client has the device open and has set it to a 
627237eb1ca1Smrgconflicting state, a status of
627337eb1ca1Smrg<function>DeviceBusy</function>
627437eb1ca1Smrgis returned.
627537eb1ca1SmrgIf the request fails for any reason, the device control will not
627637eb1ca1Smrgbe changed.
627737eb1ca1Smrg</para>
627837eb1ca1Smrg<para>
627937eb1ca1Smrg<!-- .LP -->
628037eb1ca1SmrgIf the request is successful, the device control will be changed
628137eb1ca1Smrgand a status of
628237eb1ca1Smrg<function>Success</function>
628337eb1ca1Smrgis returned.
628437eb1ca1SmrgThe information passed varies according to the specified control
628537eb1ca1Smrgand is mapped by a structure appropriate for that control.
628637eb1ca1SmrgThe first two members are common to all device controls:
628737eb1ca1Smrg</para>
628837eb1ca1Smrg<para>
628937eb1ca1Smrg<!-- .LP -->
629037eb1ca1Smrg<!-- .sM -->
629137eb1ca1Smrg<literallayout class="monospaced">
629237eb1ca1Smrg<!-- .TA .5i -->
629337eb1ca1Smrg<!-- .ta .5i -->
629437eb1ca1Smrgtypedef struct {
629537eb1ca1Smrg     XID control;
629637eb1ca1Smrg     int length;
629737eb1ca1Smrg} XDeviceControl;
629837eb1ca1Smrg</literallayout>
629937eb1ca1Smrg</para>
630037eb1ca1Smrg<para>
630137eb1ca1Smrg<!-- .LP -->
630237eb1ca1Smrg<!-- .eM -->
630337eb1ca1SmrgThe control may be set using constants defined in the 
630437eb1ca1Smrg<function>&lt; X11/extensions/XI.h &gt;</function>
630537eb1ca1Smrgheader file.
630637eb1ca1SmrgCurrently defined device controls include DEVICE_RESOLUTION.
630737eb1ca1Smrg</para>
630837eb1ca1Smrg<para>
630937eb1ca1Smrg<!-- .LP -->
631037eb1ca1SmrgThe information that can be changed by the DEVICE_RESOLUTION 
631137eb1ca1Smrgcontrol is defined in the 
631237eb1ca1Smrg<function>XDeviceResolutionControl</function>
631337eb1ca1Smrgstructure, which is defined as follows:
631437eb1ca1Smrg</para>
631537eb1ca1Smrg<para>
631637eb1ca1Smrg<!-- .LP -->
631737eb1ca1Smrg<!-- .sM -->
631837eb1ca1Smrg<literallayout class="monospaced">
631937eb1ca1Smrg<!-- .TA .5i -->
632037eb1ca1Smrg<!-- .ta .5i -->
632137eb1ca1Smrgtypedef struct {
632237eb1ca1Smrg     XID control;
632337eb1ca1Smrg     int length;
632437eb1ca1Smrg     int first_valuator;
632537eb1ca1Smrg     int num_valuators;
632637eb1ca1Smrg     int *resolutions;
632737eb1ca1Smrg} XDeviceResolutionControl;
632837eb1ca1Smrg</literallayout>
632937eb1ca1Smrg</para>
633037eb1ca1Smrg<para>
633137eb1ca1Smrg<!-- .LP -->
633237eb1ca1Smrg<!-- .eM -->
633337eb1ca1SmrgThis device control changes the resolution of the specified 
633437eb1ca1Smrgvaluators on the specified extension input device.  Valuators 
633537eb1ca1Smrgare numbered beginning with zero.  Only the valuators in the range 
633637eb1ca1Smrgspecified by first_valuator and num_valuators are set.  A value 
633737eb1ca1Smrgof -1 in the resolutions list indicates that the resolution for 
633837eb1ca1Smrgthis valuator is not to be changed.  The num_valuators member
633937eb1ca1Smrgspecifies the number of valuators in the resolutions list.
634037eb1ca1Smrg</para>
634137eb1ca1Smrg<para>
634237eb1ca1Smrg<!-- .LP -->
634337eb1ca1SmrgWhen this control is specified,
6344f1ee322dSmrg<xref linkend='XChangeDeviceControl' xrefstyle='select: title'/>
634537eb1ca1Smrgfails with a
634637eb1ca1Smrg<function>BadMatch</function>
634737eb1ca1Smrgerror if the specified device has no valuators.
634837eb1ca1SmrgIf a resolution is specified that is not within the range of valid values 
634937eb1ca1Smrg(as returned by
635037eb1ca1Smrg<function>XGetDeviceControl ),</function>
6351f1ee322dSmrg<xref linkend='XChangeDeviceControl' xrefstyle='select: title'/>
635237eb1ca1Smrgfails with a
635337eb1ca1Smrg<function>BadValue</function>
635437eb1ca1Smrgerror.
635537eb1ca1SmrgA
635637eb1ca1Smrg<function>BadValue</function>
635737eb1ca1Smrgerror results if the number of valuators supported by the device 
635837eb1ca1Smrgis less than the following expression:
635937eb1ca1Smrg</para>
636037eb1ca1Smrg<para>
636137eb1ca1Smrg<!-- .LP    -->
636237eb1ca1Smrg<literallayout class="monospaced">
636337eb1ca1Smrg<!-- .TA .5i -->
636437eb1ca1Smrg<!-- .ta .5i -->
636537eb1ca1Smrg     first_valuator + num_valuators, 
636637eb1ca1Smrg</literallayout>
636737eb1ca1Smrg</para>
636837eb1ca1Smrg<para>
636937eb1ca1Smrg<!-- .LP   -->
6370f1ee322dSmrg<xref linkend='XChangeDeviceControl' xrefstyle='select: title'/>
637137eb1ca1Smrgcan generate
637237eb1ca1Smrg<function>BadMatch</function>
637337eb1ca1Smrgand
637437eb1ca1Smrg<function>BadValue</function>
637537eb1ca1Smrgerrors.
637637eb1ca1Smrg</para>
637737eb1ca1Smrg</sect3>
637837eb1ca1Smrg<sect3 id="Selecting_Extension_Device_Events">
637937eb1ca1Smrg<title>Selecting Extension Device Events</title>
638037eb1ca1Smrg<!-- .XS -->
638137eb1ca1Smrg<!-- (SN Selecting Extension Device Events -->
638237eb1ca1Smrg<!-- .XE -->
638337eb1ca1Smrg<para>
638437eb1ca1Smrg<!-- .LP -->
638537eb1ca1SmrgTo select device input events, use
638637eb1ca1Smrg<function>XSelectExtensionEvent .</function>
638737eb1ca1SmrgThe parameters passed are a pointer to 
638837eb1ca1Smrga list of classes that define the desired event types and devices, a count
638937eb1ca1Smrgof the number of elements in the list, and the ID of the window from which 
639037eb1ca1Smrgevents are desired.
639137eb1ca1Smrg<!-- .sM -->
6392f1ee322dSmrg<funcsynopsis id='XSelectExtensionEvent'>
639337eb1ca1Smrg<funcprototype>
639437eb1ca1Smrg  <funcdef>int <function> XSelectExtensionEvent</function></funcdef>
639537eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
639637eb1ca1Smrg  <paramdef>Window<parameter> window</parameter></paramdef>
639737eb1ca1Smrg  <paramdef>XEventClass<parameter> *event_list</parameter></paramdef>
639837eb1ca1Smrg  <paramdef>int<parameter> event_count</parameter></paramdef>
639937eb1ca1Smrg</funcprototype>
640037eb1ca1Smrg</funcsynopsis>
640137eb1ca1Smrg<!-- .FN -->
640237eb1ca1Smrg<variablelist>
640337eb1ca1Smrg  <varlistentry>
640437eb1ca1Smrg    <term>
640537eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
640637eb1ca1Smrg    </term>
640737eb1ca1Smrg    <listitem>
640837eb1ca1Smrg      <para>
640937eb1ca1SmrgSpecifies the connection to the X server.
641037eb1ca1Smrg      </para>
641137eb1ca1Smrg    </listitem>
641237eb1ca1Smrg  </varlistentry>
641337eb1ca1Smrg  <varlistentry>
641437eb1ca1Smrg    <term>
641537eb1ca1Smrg      <emphasis remap='I'>window</emphasis>
641637eb1ca1Smrg    </term>
641737eb1ca1Smrg    <listitem>
641837eb1ca1Smrg      <para>
641937eb1ca1SmrgSpecifies the ID of the window from which the client wishes to receive events.
642037eb1ca1Smrg      </para>
642137eb1ca1Smrg    </listitem>
642237eb1ca1Smrg  </varlistentry>
642337eb1ca1Smrg  <varlistentry>
642437eb1ca1Smrg    <term>
642537eb1ca1Smrg      <emphasis remap='I'>event_list</emphasis>
642637eb1ca1Smrg    </term>
642737eb1ca1Smrg    <listitem>
642837eb1ca1Smrg      <para>
642937eb1ca1SmrgSpecifies a pointer to an array of event classes
643037eb1ca1Smrgthat specify which events are desired.
643137eb1ca1Smrg      </para>
643237eb1ca1Smrg    </listitem>
643337eb1ca1Smrg  </varlistentry>
643437eb1ca1Smrg  <varlistentry>
643537eb1ca1Smrg    <term>
643637eb1ca1Smrg      <emphasis remap='I'>event_count</emphasis>
643737eb1ca1Smrg    </term>
643837eb1ca1Smrg    <listitem>
643937eb1ca1Smrg      <para>
644037eb1ca1SmrgSpecifies the number of elements in the event_list.
644137eb1ca1Smrg    </para>
644237eb1ca1Smrg  </listitem>
644337eb1ca1Smrg  </varlistentry>
644437eb1ca1Smrg</variablelist>
644537eb1ca1Smrg</para>
644637eb1ca1Smrg<para>
644737eb1ca1Smrg<!-- .LP -->
644837eb1ca1Smrg<!-- .eM -->
6449f1ee322dSmrg<xref linkend='XSelectExtensionEvent' xrefstyle='select: title'/>
645037eb1ca1Smrgrequests the server to send events that match the events and
645137eb1ca1Smrgdevices described by the event list and that come from the requested 
645237eb1ca1Smrgwindow.  
645337eb1ca1SmrgThe elements of the
645437eb1ca1Smrg<function>XEventClass</function>
645537eb1ca1Smrgarray are the event_class values
645637eb1ca1Smrgobtained by invoking a macro with the pointer to an
645737eb1ca1Smrg<function>XDevice</function>
645837eb1ca1Smrgstructure returned by the
6459f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
646037eb1ca1Smrgrequest.
646137eb1ca1SmrgFor example, the
646237eb1ca1Smrg<function>DeviceKeyPress</function>
646337eb1ca1Smrgmacro would return the
646437eb1ca1Smrg<function>XEventClass</function>
646537eb1ca1Smrgfor
646637eb1ca1Smrg<function>DeviceKeyPress</function>
646737eb1ca1Smrgevents from the specified device if it were invoked in the following form:
646837eb1ca1Smrg<literallayout class="monospaced">
646937eb1ca1Smrg<!-- .TA .5i -->
647037eb1ca1Smrg<!-- .ta .5i -->
647137eb1ca1Smrg     DeviceKeyPress (XDevice *device, event_type, event_class)
647237eb1ca1Smrg</literallayout>
647337eb1ca1Smrg</para>
647437eb1ca1Smrg<para>
647537eb1ca1Smrg<!-- .LP -->
647637eb1ca1SmrgMacros are defined for the following event classes: 
647737eb1ca1Smrg<literallayout class="monospaced">
647837eb1ca1Smrg<function>DeviceKeyPress</function>
647937eb1ca1Smrg<function>DeviceKeyRelease</function>
648037eb1ca1Smrg<function>DeviceButtonPress</function>
648137eb1ca1Smrg<function>DeviceButtonRelease</function>
648237eb1ca1Smrg<function>DeviceMotionNotify</function>
648337eb1ca1Smrg<function>DeviceFocusIn</function>
648437eb1ca1Smrg<function>DeviceFocusOut</function>
648537eb1ca1Smrg<function>ProximityIn</function>
648637eb1ca1Smrg<function>ProximityOut</function>
648737eb1ca1Smrg<function>DeviceStateNotify</function>
648837eb1ca1Smrg<function>DeviceMappingNotify</function>
648937eb1ca1Smrg<function>ChangeDeviceNotify</function>
649037eb1ca1Smrg<function>DevicePointerMotionHint</function>
649137eb1ca1Smrg<function>DeviceButton1Motion </function>
649237eb1ca1Smrg<function>DeviceButton2Motion</function>
649337eb1ca1Smrg<function>DeviceButton3Motion, </function>
649437eb1ca1Smrg<function>DeviceButton4Motion</function>
649537eb1ca1Smrg<function>DeviceButton5Motion</function>
649637eb1ca1Smrg<function>DeviceButtonMotion,</function>
649737eb1ca1Smrg<function>DeviceOwnerGrabButton</function>
649837eb1ca1Smrg<function>DeviceButtonPressGrab</function>
649937eb1ca1Smrg</literallayout>
650037eb1ca1Smrg</para>
650137eb1ca1Smrg<para>
650237eb1ca1Smrg<!-- .LP -->
650337eb1ca1SmrgTo get the next available event from within a client program, use the core
6504f1ee322dSmrg<olink targetdoc='libX11' targetptr='XNextEvent'><function>XNextEvent</function></olink>
650537eb1ca1Smrgfunction.  This returns the next event whether it
650637eb1ca1Smrgcame from a core device or an extension device.
650737eb1ca1Smrg</para>
650837eb1ca1Smrg<para>
650937eb1ca1Smrg<!-- .LP -->
651037eb1ca1SmrgSucceeding
6511f1ee322dSmrg<xref linkend='XSelectExtensionEvent' xrefstyle='select: title'/>
651237eb1ca1Smrgrequests using event classes
651337eb1ca1Smrgfor the same device as was specified on a previous request will replace
651437eb1ca1Smrgthe previous set of selected events from that device with the new set.
651537eb1ca1Smrg</para>
651637eb1ca1Smrg<para>
651737eb1ca1Smrg<!-- .LP -->
6518f1ee322dSmrg<xref linkend='XSelectExtensionEvent' xrefstyle='select: title'/>
651937eb1ca1Smrgcan generate
652037eb1ca1Smrg<function>BadAccess , </function>
652137eb1ca1Smrg<function>BadClass ,</function>
652237eb1ca1Smrg<function>BadLength ,</function>
652337eb1ca1Smrgand
652437eb1ca1Smrg<function>BadWindow</function>
652537eb1ca1Smrgerrors.
652637eb1ca1Smrg</para>
652737eb1ca1Smrg</sect3>
652837eb1ca1Smrg<sect3 id="Determining_Selected_Device_Events">
652937eb1ca1Smrg<title>Determining Selected Device Events</title>
653037eb1ca1Smrg<!-- .XS -->
653137eb1ca1Smrg<!-- (SN Determining Selected Device Events -->
653237eb1ca1Smrg<!-- .XE -->
653337eb1ca1Smrg<para>
653437eb1ca1Smrg<!-- .LP -->
653537eb1ca1SmrgTo determine which extension events are currently selected from a given
653637eb1ca1Smrgwindow, use
653737eb1ca1Smrg<function>XGetSelectedExtensionEvents .</function>
653837eb1ca1Smrg<!-- .sM -->
6539f1ee322dSmrg<funcsynopsis id='XGetSelectedExtensionEvents'>
654037eb1ca1Smrg<funcprototype>
654137eb1ca1Smrg  <funcdef>int <function> XGetSelectedExtensionEvents</function></funcdef>
654237eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
654337eb1ca1Smrg  <paramdef>Window<parameter> window</parameter></paramdef>
654437eb1ca1Smrg  <paramdef>int<parameter> *this_client_count</parameter></paramdef>
654537eb1ca1Smrg  <paramdef>XEventClass<parameter> **this_client</parameter></paramdef>
654637eb1ca1Smrg  <paramdef>int<parameter> *all_clients_count</parameter></paramdef>
654737eb1ca1Smrg  <paramdef>XEventClass<parameter> **all_clients</parameter></paramdef>
654837eb1ca1Smrg</funcprototype>
654937eb1ca1Smrg</funcsynopsis>
655037eb1ca1Smrg<!-- .FN -->
655137eb1ca1Smrg<variablelist>
655237eb1ca1Smrg  <varlistentry>
655337eb1ca1Smrg    <term>
655437eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
655537eb1ca1Smrg    </term>
655637eb1ca1Smrg    <listitem>
655737eb1ca1Smrg      <para>
655837eb1ca1SmrgSpecifies the connection to the X server.
655937eb1ca1Smrg      </para>
656037eb1ca1Smrg    </listitem>
656137eb1ca1Smrg  </varlistentry>
656237eb1ca1Smrg  <varlistentry>
656337eb1ca1Smrg    <term>
656437eb1ca1Smrg      <emphasis remap='I'>window</emphasis>
656537eb1ca1Smrg    </term>
656637eb1ca1Smrg    <listitem>
656737eb1ca1Smrg      <para>
656837eb1ca1SmrgSpecifies the ID of the window from which the client wishes to receive events.
656937eb1ca1Smrg      </para>
657037eb1ca1Smrg    </listitem>
657137eb1ca1Smrg  </varlistentry>
657237eb1ca1Smrg  <varlistentry>
657337eb1ca1Smrg    <term>
657437eb1ca1Smrg      <emphasis remap='I'>this_client_count</emphasis>
657537eb1ca1Smrg    </term>
657637eb1ca1Smrg    <listitem>
657737eb1ca1Smrg      <para>
657837eb1ca1SmrgReturns the number of elements in the this_client list.
657937eb1ca1Smrg      </para>
658037eb1ca1Smrg    </listitem>
658137eb1ca1Smrg  </varlistentry>
658237eb1ca1Smrg  <varlistentry>
658337eb1ca1Smrg    <term>
658437eb1ca1Smrg      <emphasis remap='I'>this_client</emphasis>
658537eb1ca1Smrg    </term>
658637eb1ca1Smrg    <listitem>
658737eb1ca1Smrg      <para>
658837eb1ca1SmrgReturns a list of
658937eb1ca1Smrg<function>XEventClasses</function>
659037eb1ca1Smrgthat specify which events are
659137eb1ca1Smrgselected by this client.
659237eb1ca1Smrg      </para>
659337eb1ca1Smrg    </listitem>
659437eb1ca1Smrg  </varlistentry>
659537eb1ca1Smrg  <varlistentry>
659637eb1ca1Smrg    <term>
659737eb1ca1Smrg      <emphasis remap='I'>all_clients_count</emphasis>
659837eb1ca1Smrg    </term>
659937eb1ca1Smrg    <listitem>
660037eb1ca1Smrg      <para>
660137eb1ca1SmrgReturns the number of elements in the all_clients list.
660237eb1ca1Smrg      </para>
660337eb1ca1Smrg    </listitem>
660437eb1ca1Smrg  </varlistentry>
660537eb1ca1Smrg  <varlistentry>
660637eb1ca1Smrg    <term>
660737eb1ca1Smrg      <emphasis remap='I'>all_clients</emphasis>
660837eb1ca1Smrg    </term>
660937eb1ca1Smrg    <listitem>
661037eb1ca1Smrg      <para>
661137eb1ca1SmrgReturns a list of
661237eb1ca1Smrg<function>XEventClasses</function>
661337eb1ca1Smrgthat specify which events are
661437eb1ca1Smrgselected by all clients.
661537eb1ca1Smrg    </para>
661637eb1ca1Smrg  </listitem>
661737eb1ca1Smrg  </varlistentry>
661837eb1ca1Smrg</variablelist>
661937eb1ca1Smrg</para>
662037eb1ca1Smrg<para>
662137eb1ca1Smrg<!-- .LP -->
662237eb1ca1Smrg<!-- .eM -->
6623f1ee322dSmrg<xref linkend='XGetSelectedExtensionEvents' xrefstyle='select: title'/>
662437eb1ca1Smrgreturns pointers to two event class arrays.  
662537eb1ca1SmrgOne lists the extension events selected by this client from
662637eb1ca1Smrgthe specified window.  The other lists the extension events selected by
662737eb1ca1Smrgall clients from the specified window.  This information is analogous
662837eb1ca1Smrgto that returned in your_event_mask and all_event_masks of the
662937eb1ca1Smrg<function>XWindowAttributes</function>
663037eb1ca1Smrgstructure when an 
6631f1ee322dSmrg<olink targetdoc='libX11' targetptr='XGetWindowAttributes'><function>XGetWindowAttributes</function></olink>
663237eb1ca1Smrgrequest is made.
663337eb1ca1SmrgTo free the two arrays returned by this function, use
6634f1ee322dSmrg<olink targetdoc='libX11' targetptr='XFree'><function>XFree</function></olink>.
663537eb1ca1Smrg</para>
663637eb1ca1Smrg<para>
663737eb1ca1Smrg<!-- .LP -->
6638f1ee322dSmrg<xref linkend='XGetSelectedExtensionEvents' xrefstyle='select: title'/>
663937eb1ca1Smrgcan generate
664037eb1ca1Smrg<function>BadWindow</function>
664137eb1ca1Smrgerrors.
664237eb1ca1Smrg</para>
664337eb1ca1Smrg</sect3>
664437eb1ca1Smrg<sect3 id="Controlling_Event_Propagation">
664537eb1ca1Smrg<title>Controlling Event Propagation</title>
664637eb1ca1Smrg<!-- .XS -->
664737eb1ca1Smrg<!-- (SN Controlling Event Propagation -->
664837eb1ca1Smrg<!-- .XE -->
664937eb1ca1Smrg<para>
665037eb1ca1Smrg<!-- .LP -->
665137eb1ca1SmrgExtension events propagate up the window hierarchy in the same manner
665237eb1ca1Smrgas core events.  If a window is not interested in an extension event, 
665337eb1ca1Smrgit usually propagates to the closest ancestor that is interested,
665437eb1ca1Smrgunless the dont_propagate list prohibits it.
665537eb1ca1SmrgGrabs of extension devices may alter the set of windows that receive a 
665637eb1ca1Smrgparticular extension event.
665737eb1ca1Smrg</para>
665837eb1ca1Smrg<para>
665937eb1ca1Smrg<!-- .LP -->
666037eb1ca1SmrgClient programs may control event propagation through the use
666137eb1ca1Smrgof the following two functions:
6662f1ee322dSmrg<xref linkend='XChangeDeviceDontPropagateList' xrefstyle='select: title'/>
666337eb1ca1Smrgand
666437eb1ca1Smrg<function>XGetDeviceDontPropagateList .  </function>
666537eb1ca1Smrg</para>
666637eb1ca1Smrg<para>
666737eb1ca1Smrg<!-- .LP -->
666837eb1ca1Smrg<!-- .sM -->
6669f1ee322dSmrg<funcsynopsis id='XChangeDeviceDontPropagateList'>
667037eb1ca1Smrg<funcprototype>
667137eb1ca1Smrg  <funcdef>int <function> XChangeDeviceDontPropagateList</function></funcdef>
667237eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
667337eb1ca1Smrg  <paramdef>Window<parameter> window</parameter></paramdef>
667437eb1ca1Smrg  <paramdef>int<parameter> event_count</parameter></paramdef>
667537eb1ca1Smrg  <paramdef>XEventClass<parameter> *events</parameter></paramdef>
667637eb1ca1Smrg  <paramdef>int<parameter> mode</parameter></paramdef>
667737eb1ca1Smrg</funcprototype>
667837eb1ca1Smrg</funcsynopsis>
667937eb1ca1Smrg<!-- .FN -->
668037eb1ca1Smrg<variablelist>
668137eb1ca1Smrg  <varlistentry>
668237eb1ca1Smrg    <term>
668337eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
668437eb1ca1Smrg    </term>
668537eb1ca1Smrg    <listitem>
668637eb1ca1Smrg      <para>
668737eb1ca1SmrgSpecifies the connection to the X server.
668837eb1ca1Smrg      </para>
668937eb1ca1Smrg    </listitem>
669037eb1ca1Smrg  </varlistentry>
669137eb1ca1Smrg  <varlistentry>
669237eb1ca1Smrg    <term>
669337eb1ca1Smrg      <emphasis remap='I'>window</emphasis>
669437eb1ca1Smrg    </term>
669537eb1ca1Smrg    <listitem>
669637eb1ca1Smrg      <para>
669737eb1ca1SmrgSpecifies the desired window.
669837eb1ca1Smrg      </para>
669937eb1ca1Smrg    </listitem>
670037eb1ca1Smrg  </varlistentry>
670137eb1ca1Smrg  <varlistentry>
670237eb1ca1Smrg    <term>
670337eb1ca1Smrg      <emphasis remap='I'>event_count</emphasis>
670437eb1ca1Smrg    </term>
670537eb1ca1Smrg    <listitem>
670637eb1ca1Smrg      <para>
670737eb1ca1SmrgSpecifies the number of elements in the events list.
670837eb1ca1Smrg      </para>
670937eb1ca1Smrg    </listitem>
671037eb1ca1Smrg  </varlistentry>
671137eb1ca1Smrg  <varlistentry>
671237eb1ca1Smrg    <term>
671337eb1ca1Smrg      <emphasis remap='I'>events</emphasis>
671437eb1ca1Smrg    </term>
671537eb1ca1Smrg    <listitem>
671637eb1ca1Smrg      <para>
671737eb1ca1SmrgSpecifies a pointer to the list of XEventClasses.
671837eb1ca1Smrg      </para>
671937eb1ca1Smrg    </listitem>
672037eb1ca1Smrg  </varlistentry>
672137eb1ca1Smrg  <varlistentry>
672237eb1ca1Smrg    <term>
672337eb1ca1Smrg      <emphasis remap='I'>mode</emphasis>
672437eb1ca1Smrg    </term>
672537eb1ca1Smrg    <listitem>
672637eb1ca1Smrg      <para>
672737eb1ca1SmrgSpecifies the mode.  You can pass
672837eb1ca1Smrg<function>AddToList</function>
672937eb1ca1Smrgor
673037eb1ca1Smrg<function>DeleteFromList .</function>
673137eb1ca1Smrg    </para>
673237eb1ca1Smrg  </listitem>
673337eb1ca1Smrg  </varlistentry>
673437eb1ca1Smrg</variablelist>
673537eb1ca1Smrg</para>
673637eb1ca1Smrg<para>
673737eb1ca1Smrg<!-- .LP -->
673837eb1ca1Smrg<!-- .eM -->
6739f1ee322dSmrg<xref linkend='XChangeDeviceDontPropagateList' xrefstyle='select: title'/>
674037eb1ca1Smrgadds an event to or deletes an event from the do_not_propagate list 
674137eb1ca1Smrgof extension events for the specified window.
674237eb1ca1SmrgThere is one list per window, and the list remains for the life of the window.
674337eb1ca1SmrgThe list is not altered if a client that changed the list terminates.
674437eb1ca1Smrg</para>
674537eb1ca1Smrg<para>
674637eb1ca1Smrg<!-- .LP -->
674737eb1ca1SmrgSuppression of event propagation is not allowed for all events.  If a
674837eb1ca1Smrgspecified
674937eb1ca1Smrg<function>XEventClass</function>
675037eb1ca1Smrgis invalid because suppression of that event is not allowed, a
675137eb1ca1Smrg<function>BadClass</function>
675237eb1ca1Smrgerror results.
675337eb1ca1Smrg</para>
675437eb1ca1Smrg<para>
675537eb1ca1Smrg<!-- .LP -->
6756f1ee322dSmrg<xref linkend='XChangeDeviceDontPropagateList' xrefstyle='select: title'/>
675737eb1ca1Smrgcan generate
675837eb1ca1Smrg<function>BadClass ,</function>
675937eb1ca1Smrg<function>BadMode ,</function>
676037eb1ca1Smrgand
676137eb1ca1Smrg<function>BadWindow</function>
676237eb1ca1Smrgerrors.
676337eb1ca1Smrg<!-- .sp -->
676437eb1ca1Smrg</para>
676537eb1ca1Smrg<para>
676637eb1ca1Smrg<!-- .LP -->
676737eb1ca1Smrg<!-- .sM -->
6768f1ee322dSmrg<funcsynopsis id='XGetDeviceDontPropagateList'>
676937eb1ca1Smrg<funcprototype>
677037eb1ca1Smrg  <funcdef>XEventClass * <function> XGetDeviceDontPropagateList</function></funcdef>
677137eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
677237eb1ca1Smrg  <paramdef>Window<parameter> window</parameter></paramdef>
677337eb1ca1Smrg  <paramdef>int<parameter> *event_count</parameter></paramdef>
677437eb1ca1Smrg</funcprototype>
677537eb1ca1Smrg</funcsynopsis>
677637eb1ca1Smrg<!-- .FN -->
677737eb1ca1Smrg<variablelist>
677837eb1ca1Smrg  <varlistentry>
677937eb1ca1Smrg    <term>
678037eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
678137eb1ca1Smrg    </term>
678237eb1ca1Smrg    <listitem>
678337eb1ca1Smrg      <para>
678437eb1ca1SmrgSpecifies the connection to the X server.
678537eb1ca1Smrg      </para>
678637eb1ca1Smrg    </listitem>
678737eb1ca1Smrg  </varlistentry>
678837eb1ca1Smrg  <varlistentry>
678937eb1ca1Smrg    <term>
679037eb1ca1Smrg      <emphasis remap='I'>window</emphasis>
679137eb1ca1Smrg    </term>
679237eb1ca1Smrg    <listitem>
679337eb1ca1Smrg      <para>
679437eb1ca1SmrgSpecifies the desired window.
679537eb1ca1Smrg      </para>
679637eb1ca1Smrg    </listitem>
679737eb1ca1Smrg  </varlistentry>
679837eb1ca1Smrg  <varlistentry>
679937eb1ca1Smrg    <term>
680037eb1ca1Smrg      <emphasis remap='I'>event_count</emphasis>
680137eb1ca1Smrg    </term>
680237eb1ca1Smrg    <listitem>
680337eb1ca1Smrg      <para>
680437eb1ca1SmrgReturns the number of elements in the array returned by this function.
680537eb1ca1Smrg    </para>
680637eb1ca1Smrg  </listitem>
680737eb1ca1Smrg  </varlistentry>
680837eb1ca1Smrg</variablelist>
680937eb1ca1Smrg</para>
681037eb1ca1Smrg<para>
681137eb1ca1Smrg<!-- .LP -->
681237eb1ca1Smrg<!-- .eM -->
6813f1ee322dSmrg<xref linkend='XGetDeviceDontPropagateList' xrefstyle='select: title'/>
681437eb1ca1Smrgallows a client to determine the do_not_propagate list of extension events
681537eb1ca1Smrgfor the specified window.
681637eb1ca1SmrgIt returns an array of
681737eb1ca1Smrg<function>XEventClass ,</function>
681837eb1ca1Smrgeach
681937eb1ca1Smrg<function>XEventClass</function>
682037eb1ca1Smrgrepresenting a device/event type pair.
682137eb1ca1SmrgTo free the data returned by this function, use
6822f1ee322dSmrg<olink targetdoc='libX11' targetptr='XFree'><function>XFree</function></olink>.
682337eb1ca1Smrg</para>
682437eb1ca1Smrg<para>
682537eb1ca1Smrg<!-- .LP -->
6826f1ee322dSmrg<xref linkend='XGetDeviceDontPropagateList' xrefstyle='select: title'/>
682737eb1ca1Smrgcan generate
682837eb1ca1Smrg<function>BadWindow</function>
682937eb1ca1Smrgerrors.
683037eb1ca1Smrg</para>
683137eb1ca1Smrg</sect3>
683237eb1ca1Smrg<sect3 id="Sending_an_Event">
683337eb1ca1Smrg<title>Sending an Event</title>
683437eb1ca1Smrg<!-- .XS -->
683537eb1ca1Smrg<!-- (SN Sending an Event -->
683637eb1ca1Smrg<!-- .XE -->
683737eb1ca1Smrg<para>
683837eb1ca1Smrg<!-- .LP -->
683937eb1ca1SmrgTo send an extension event to another client, use
684037eb1ca1Smrg<function>XSendExtensionEvent .</function>
684137eb1ca1Smrg<!-- .sM -->
6842f1ee322dSmrg<funcsynopsis id='XSendExtensionEvent'>
684337eb1ca1Smrg<funcprototype>
684437eb1ca1Smrg  <funcdef>int <function> XSendExtensionEvent</function></funcdef>
684537eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
684637eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
684737eb1ca1Smrg  <paramdef>Window<parameter> window</parameter></paramdef>
684837eb1ca1Smrg  <paramdef>Bool<parameter> propagate</parameter></paramdef>
684937eb1ca1Smrg  <paramdef>int<parameter> event_count</parameter></paramdef>
685037eb1ca1Smrg  <paramdef>XEventClass<parameter> *event_list</parameter></paramdef>
685137eb1ca1Smrg  <paramdef>XEvent<parameter> *event</parameter></paramdef>
685237eb1ca1Smrg</funcprototype>
685337eb1ca1Smrg</funcsynopsis>
685437eb1ca1Smrg<!-- .FN -->
685537eb1ca1Smrg<variablelist>
685637eb1ca1Smrg  <varlistentry>
685737eb1ca1Smrg    <term>
685837eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
685937eb1ca1Smrg    </term>
686037eb1ca1Smrg    <listitem>
686137eb1ca1Smrg      <para>
686237eb1ca1SmrgSpecifies the connection to the X server.
686337eb1ca1Smrg      </para>
686437eb1ca1Smrg    </listitem>
686537eb1ca1Smrg  </varlistentry>
686637eb1ca1Smrg  <varlistentry>
686737eb1ca1Smrg    <term>
686837eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
686937eb1ca1Smrg    </term>
687037eb1ca1Smrg    <listitem>
687137eb1ca1Smrg      <para>
687237eb1ca1SmrgSpecifies the device whose ID is recorded in the event.
687337eb1ca1Smrg      </para>
687437eb1ca1Smrg    </listitem>
687537eb1ca1Smrg  </varlistentry>
687637eb1ca1Smrg  <varlistentry>
687737eb1ca1Smrg    <term>
687837eb1ca1Smrg      <emphasis remap='I'>window</emphasis>
687937eb1ca1Smrg    </term>
688037eb1ca1Smrg    <listitem>
688137eb1ca1Smrg      <para>
688237eb1ca1SmrgSpecifies the destination window ID.  You can pass a window ID,
688337eb1ca1Smrg<function>PointerWindow</function>
688437eb1ca1Smrgor
688537eb1ca1Smrg<function>InputFocus .</function>
688637eb1ca1Smrg      </para>
688737eb1ca1Smrg    </listitem>
688837eb1ca1Smrg  </varlistentry>
688937eb1ca1Smrg  <varlistentry>
689037eb1ca1Smrg    <term>
689137eb1ca1Smrg      <emphasis remap='I'>propagate</emphasis>
689237eb1ca1Smrg    </term>
689337eb1ca1Smrg    <listitem>
689437eb1ca1Smrg      <para>
689537eb1ca1SmrgSpecifies a boolean value that is either
689637eb1ca1Smrg<function>True</function>
689737eb1ca1Smrgor 
689837eb1ca1Smrg<function>False .</function>
689937eb1ca1Smrg      </para>
690037eb1ca1Smrg    </listitem>
690137eb1ca1Smrg  </varlistentry>
690237eb1ca1Smrg  <varlistentry>
690337eb1ca1Smrg    <term>
690437eb1ca1Smrg      <emphasis remap='I'>event_count</emphasis>
690537eb1ca1Smrg    </term>
690637eb1ca1Smrg    <listitem>
690737eb1ca1Smrg      <para>
690837eb1ca1SmrgSpecifies the number of elements in the event_list array.
690937eb1ca1Smrg      </para>
691037eb1ca1Smrg    </listitem>
691137eb1ca1Smrg  </varlistentry>
691237eb1ca1Smrg  <varlistentry>
691337eb1ca1Smrg    <term>
691437eb1ca1Smrg      <emphasis remap='I'>event_list</emphasis>
691537eb1ca1Smrg    </term>
691637eb1ca1Smrg    <listitem>
691737eb1ca1Smrg      <para>
691837eb1ca1SmrgSpecifies a pointer to an array of
691937eb1ca1Smrg<function>XEventClass .</function>
692037eb1ca1Smrg      </para>
692137eb1ca1Smrg    </listitem>
692237eb1ca1Smrg  </varlistentry>
692337eb1ca1Smrg  <varlistentry>
692437eb1ca1Smrg    <term>
692537eb1ca1Smrg      <emphasis remap='I'>event</emphasis>
692637eb1ca1Smrg    </term>
692737eb1ca1Smrg    <listitem>
692837eb1ca1Smrg      <para>
692937eb1ca1SmrgSpecifies a pointer to the event that is to be sent.
693037eb1ca1Smrg    </para>
693137eb1ca1Smrg  </listitem>
693237eb1ca1Smrg  </varlistentry>
693337eb1ca1Smrg</variablelist>
693437eb1ca1Smrg</para>
693537eb1ca1Smrg<para>
693637eb1ca1Smrg<!-- .LP -->
693737eb1ca1Smrg<!-- .eM -->
6938f1ee322dSmrg<xref linkend='XSendExtensionEvent' xrefstyle='select: title'/>
693937eb1ca1Smrgidentifies the destination window, determines which clients should receive
694037eb1ca1Smrgthe specified event, and ignores any active grabs.
694137eb1ca1SmrgIt requires a list of
694237eb1ca1Smrg<function>XEventClass</function>
694337eb1ca1Smrgto be specified.
694437eb1ca1SmrgThese are obtained by opening an input device with the
6945f1ee322dSmrg<xref linkend='XOpenDevice' xrefstyle='select: title'/>
694637eb1ca1Smrgrequest.
694737eb1ca1Smrg</para>
694837eb1ca1Smrg<para>
694937eb1ca1Smrg<!-- .LP -->
6950f1ee322dSmrg<xref linkend='XSendExtensionEvent' xrefstyle='select: title'/>
695137eb1ca1Smrguses the window argument to identify the destination window as follows:
695237eb1ca1Smrg</para>
695337eb1ca1Smrg<itemizedlist>
695437eb1ca1Smrg  <listitem>
695537eb1ca1Smrg    <para>
695637eb1ca1SmrgIf you pass
695737eb1ca1Smrg<function>PointerWindow ,</function>
695837eb1ca1Smrgthe destination window is the window that contains the pointer.
695937eb1ca1Smrg    </para>
696037eb1ca1Smrg  </listitem>
696137eb1ca1Smrg  <listitem>
696237eb1ca1Smrg    <para>
696337eb1ca1SmrgIf you pass
696437eb1ca1Smrg<function>InputFocus</function>
696537eb1ca1Smrgand if the focus window contains the pointer,
696637eb1ca1Smrgthe destination window is the window that contains the pointer.
696737eb1ca1SmrgIf the focus window does not contain the pointer,
696837eb1ca1Smrgthe destination window is the focus window.
696937eb1ca1Smrg    </para>
697037eb1ca1Smrg  </listitem>
697137eb1ca1Smrg</itemizedlist>
697237eb1ca1Smrg<para>
697337eb1ca1Smrg<!-- .LP -->
697437eb1ca1SmrgTo determine which clients should receive the specified events, 
6975f1ee322dSmrg<xref linkend='XSendExtensionEvent' xrefstyle='select: title'/>
697637eb1ca1Smrguses the propagate argument as follows:
697737eb1ca1Smrg</para>
697837eb1ca1Smrg<itemizedlist>
697937eb1ca1Smrg  <listitem>
698037eb1ca1Smrg    <para>
698137eb1ca1SmrgIf propagate is
698237eb1ca1Smrg<function>False ,</function>
698337eb1ca1Smrgthe event is sent to every client selecting
698437eb1ca1Smrgfrom the destination window
698537eb1ca1Smrgany of the events specified in the event_list array.
698637eb1ca1Smrg    </para>
698737eb1ca1Smrg  </listitem>
698837eb1ca1Smrg  <listitem>
698937eb1ca1Smrg    <para>
699037eb1ca1SmrgIf propagate is
699137eb1ca1Smrg<function>True </function>
699237eb1ca1Smrgand no clients have selected from the destination window
699337eb1ca1Smrgany of the events specified in the event_list array, the destination is 
699437eb1ca1Smrgreplaced with the closest ancestor of destination for which some client
699537eb1ca1Smrghas selected one of the specified events and for which no intervening
699637eb1ca1Smrgwindow has that event in its do_not_propagate mask.
699737eb1ca1SmrgIf no such window exists,
699837eb1ca1Smrgor if the window is an ancestor of the focus window, and 
699937eb1ca1Smrg<function>InputFocus</function>
700037eb1ca1Smrgwas originally specified as the destination,
700137eb1ca1Smrgthe event is not sent to any clients.  Otherwise, the event is reported to every
700237eb1ca1Smrgclient selecting on the final destination any of the events specified
700337eb1ca1Smrgin event_list.
700437eb1ca1Smrg    </para>
700537eb1ca1Smrg  </listitem>
700637eb1ca1Smrg</itemizedlist>
700737eb1ca1Smrg<para>
700837eb1ca1Smrg<!-- .LP -->
700937eb1ca1SmrgThe event in the
701037eb1ca1Smrg<function>XEvent</function>
701137eb1ca1Smrgstructure must be one of the events defined
701237eb1ca1Smrgby the input extension, so that the X server can correctly byte swap the
701337eb1ca1Smrgcontents as necessary.  The contents of the event are otherwise unaltered
701437eb1ca1Smrgand unchecked by the X server except to force send_event to
701537eb1ca1Smrg<function>True</function>
701637eb1ca1Smrgin the forwarded event and to set the sequence number in the event correctly.
701737eb1ca1Smrg</para>
701837eb1ca1Smrg<para>
701937eb1ca1Smrg<!-- .LP -->
7020f1ee322dSmrg<xref linkend='XSendExtensionEvent' xrefstyle='select: title'/>
702137eb1ca1Smrgreturns zero if the conversion-to-wire protocol failed;
702237eb1ca1Smrgotherwise, it returns nonzero.
702337eb1ca1Smrg</para>
702437eb1ca1Smrg<para>
702537eb1ca1Smrg<!-- .LP -->
7026f1ee322dSmrg<xref linkend='XSendExtensionEvent' xrefstyle='select: title'/>
702737eb1ca1Smrgcan generate
702837eb1ca1Smrg<function>BadClass ,</function>
702937eb1ca1Smrg<function>BadDevice ,</function>
703037eb1ca1Smrg<function>BadValue ,</function>
703137eb1ca1Smrgand
703237eb1ca1Smrg<function>BadWindow</function>
703337eb1ca1Smrgerrors.
703437eb1ca1Smrg</para>
703537eb1ca1Smrg</sect3>
703637eb1ca1Smrg<sect3 id="Getting_Motion_History">
703737eb1ca1Smrg<title>Getting Motion History</title>
703837eb1ca1Smrg<!-- .XS -->
703937eb1ca1Smrg<!-- (SN Getting Motion History -->
704037eb1ca1Smrg<!-- .XE -->
704137eb1ca1Smrg<para>
704237eb1ca1Smrg<!-- .LP -->
704337eb1ca1Smrg<!-- .sM -->
7044f1ee322dSmrg<funcsynopsis id='XGetDeviceMotionEvents'>
704537eb1ca1Smrg<funcprototype>
704637eb1ca1Smrg  <funcdef>XDeviceTimeCoord * <function> XGetDeviceMotionEvents</function></funcdef>
704737eb1ca1Smrg  <paramdef><parameter> axis_count_return)</parameter></paramdef>
704837eb1ca1Smrg  <paramdef>Display<parameter> *display</parameter></paramdef>
704937eb1ca1Smrg  <paramdef>XDevice<parameter> *device</parameter></paramdef>
705037eb1ca1Smrg  <paramdef>Timestart,<parameter> stop</parameter></paramdef>
705137eb1ca1Smrg  <paramdef>int<parameter> *nevents_return</parameter></paramdef>
705237eb1ca1Smrg  <paramdef>int<parameter> *mode_return</parameter></paramdef>
705337eb1ca1Smrg  <paramdef>int<parameter> *axis_count_return</parameter></paramdef>
705437eb1ca1Smrg</funcprototype>
705537eb1ca1Smrg</funcsynopsis>
705637eb1ca1Smrg<!-- .FN -->
705737eb1ca1Smrg<variablelist>
705837eb1ca1Smrg  <varlistentry>
705937eb1ca1Smrg    <term>
706037eb1ca1Smrg      <emphasis remap='I'>display</emphasis>
706137eb1ca1Smrg    </term>
706237eb1ca1Smrg    <listitem>
706337eb1ca1Smrg      <para>
706437eb1ca1SmrgSpecifies the connection to the X server.
706537eb1ca1Smrg      </para>
706637eb1ca1Smrg    </listitem>
706737eb1ca1Smrg  </varlistentry>
706837eb1ca1Smrg  <varlistentry>
706937eb1ca1Smrg    <term>
707037eb1ca1Smrg      <emphasis remap='I'>device</emphasis>
707137eb1ca1Smrg    </term>
707237eb1ca1Smrg    <listitem>
707337eb1ca1Smrg      <para>
707437eb1ca1SmrgSpecifies the desired device.
707537eb1ca1Smrg      </para>
707637eb1ca1Smrg    </listitem>
707737eb1ca1Smrg  </varlistentry>
707837eb1ca1Smrg  <varlistentry>
707937eb1ca1Smrg    <term>
708037eb1ca1Smrg      <emphasis remap='I'>start</emphasis>
708137eb1ca1Smrg    </term>
708237eb1ca1Smrg    <listitem>
708337eb1ca1Smrg      <para>
708437eb1ca1SmrgSpecifies the start time.
708537eb1ca1Smrg      </para>
708637eb1ca1Smrg    </listitem>
708737eb1ca1Smrg  </varlistentry>
708837eb1ca1Smrg  <varlistentry>
708937eb1ca1Smrg    <term>
709037eb1ca1Smrg      <emphasis remap='I'>stop</emphasis>
709137eb1ca1Smrg    </term>
709237eb1ca1Smrg    <listitem>
709337eb1ca1Smrg      <para>
709437eb1ca1SmrgSpecifies the stop time.
709537eb1ca1Smrg      </para>
709637eb1ca1Smrg    </listitem>
709737eb1ca1Smrg  </varlistentry>
709837eb1ca1Smrg  <varlistentry>
709937eb1ca1Smrg    <term>
710037eb1ca1Smrg      <emphasis remap='I'>nevents_return</emphasis>
710137eb1ca1Smrg    </term>
710237eb1ca1Smrg    <listitem>
710337eb1ca1Smrg      <para>
710437eb1ca1SmrgReturns the number of positions in the motion buffer returned
710537eb1ca1Smrgfor this request.
710637eb1ca1Smrg      </para>
710737eb1ca1Smrg    </listitem>
710837eb1ca1Smrg  </varlistentry>
710937eb1ca1Smrg  <varlistentry>
711037eb1ca1Smrg    <term>
711137eb1ca1Smrg      <emphasis remap='I'>mode_return</emphasis>
711237eb1ca1Smrg    </term>
711337eb1ca1Smrg    <listitem>
711437eb1ca1Smrg      <para>
711537eb1ca1SmrgReturns the mode of the nevents information.
711637eb1ca1SmrgThe mode will be one of the following:
711737eb1ca1Smrg<function>Absolute</function>
711837eb1ca1Smrgor
711937eb1ca1Smrg<function>Relative .</function>
712037eb1ca1Smrg      </para>
712137eb1ca1Smrg    </listitem>
712237eb1ca1Smrg  </varlistentry>
712337eb1ca1Smrg  <varlistentry>
712437eb1ca1Smrg    <term>
712537eb1ca1Smrg      <emphasis remap='I'>axis_count_return</emphasis>
712637eb1ca1Smrg    </term>
712737eb1ca1Smrg    <listitem>
712837eb1ca1Smrg      <para>
712937eb1ca1SmrgReturns the number of axes reported in each of the positions returned.
713037eb1ca1Smrg    </para>
713137eb1ca1Smrg  </listitem>
713237eb1ca1Smrg  </varlistentry>
713337eb1ca1Smrg</variablelist>
713437eb1ca1Smrg</para>
713537eb1ca1Smrg<para>
713637eb1ca1Smrg<!-- .LP -->
713737eb1ca1Smrg<!-- .eM -->
7138f1ee322dSmrg<xref linkend='XGetDeviceMotionEvents' xrefstyle='select: title'/>
713937eb1ca1Smrgreturns all positions in the device's motion history buffer
714037eb1ca1Smrgthat fall between the specified start and stop times inclusive.
714137eb1ca1SmrgIf the start time is in the future or is later than the stop time,
714237eb1ca1Smrgno positions are returned.
714337eb1ca1Smrg</para>
714437eb1ca1Smrg<para>
714537eb1ca1Smrg<!-- .LP -->
714637eb1ca1SmrgThe return type for this function is an
714737eb1ca1Smrg<function>XDeviceTimeCoord</function>
714837eb1ca1Smrgstructure, which is defined as follows:
714937eb1ca1Smrg</para>
715037eb1ca1Smrg<para>
715137eb1ca1Smrg<!-- .LP -->
715237eb1ca1Smrg<!-- .sM -->
715337eb1ca1Smrg<literallayout class="monospaced">
715437eb1ca1Smrg<!-- .TA .5i -->
715537eb1ca1Smrg<!-- .ta .5i -->
715637eb1ca1Smrgtypedef struct {
715737eb1ca1Smrg     Time time;
715837eb1ca1Smrg     unsigned int *data;
715937eb1ca1Smrg} XDeviceTimeCoord;
716037eb1ca1Smrg</literallayout>
716137eb1ca1Smrg</para>
716237eb1ca1Smrg<para>
716337eb1ca1Smrg<!-- .LP -->
716437eb1ca1Smrg<!-- .eM -->
716537eb1ca1SmrgThe data member is a pointer to an array of data items.
716637eb1ca1SmrgEach item is of type int, and there is one data item
716737eb1ca1Smrgper axis of motion reported by the device.
716837eb1ca1SmrgThe number of axes reported by the device is returned in the axis_count variable.
716937eb1ca1Smrg</para>
717037eb1ca1Smrg<para>
717137eb1ca1Smrg<!-- .LP -->
717237eb1ca1SmrgThe value of the data items depends on the mode of the device. 
717337eb1ca1SmrgThe mode is returned in the mode variable.  If the 
717437eb1ca1Smrgmode is
717537eb1ca1Smrg<function>Absolute ,</function>
717637eb1ca1Smrgthe data items are the raw values generated by the device.
717737eb1ca1SmrgThese may be scaled by the client program using the
717837eb1ca1Smrgmaximum values that the device can generate for each axis of motion
717937eb1ca1Smrgthat it reports.  The maximum value for each axis is reported in
718037eb1ca1Smrgthe max_val member of the
718137eb1ca1Smrg<function>XAxisInfo</function>
718237eb1ca1Smrgstructure, which is part of the information returned by the
7183f1ee322dSmrg<xref linkend='XListInputDevices' xrefstyle='select: title'/>
718437eb1ca1Smrgrequest.
718537eb1ca1Smrg</para>
718637eb1ca1Smrg<para>
718737eb1ca1Smrg<!-- .LP -->
718837eb1ca1SmrgIf the mode is
718937eb1ca1Smrg<function>Relative ,</function>
719037eb1ca1Smrgthe data items are the relative values generated by the device.
719137eb1ca1SmrgThe client program must choose an initial
719237eb1ca1Smrgposition for the device and maintain a current position by 
719337eb1ca1Smrgaccumulating these relative values.
719437eb1ca1Smrg</para>
719537eb1ca1Smrg<para>
719637eb1ca1Smrg<!-- .LP -->
719737eb1ca1SmrgConsecutive calls to
7198f1ee322dSmrg<xref linkend='XGetDeviceMotionEvents' xrefstyle='select: title'/>
719937eb1ca1Smrgcan return data of different modes, that is, if
720037eb1ca1Smrgsome client program has changed the mode of the device via an
7201f1ee322dSmrg<xref linkend='XSetDeviceMode' xrefstyle='select: title'/>
720237eb1ca1Smrgrequest.
720337eb1ca1Smrg</para>
720437eb1ca1Smrg<para>
720537eb1ca1Smrg<!-- .LP -->
7206f1ee322dSmrg<xref linkend='XGetDeviceMotionEvents' xrefstyle='select: title'/>
720737eb1ca1Smrgcan generate
720837eb1ca1Smrg<function>BadDevice</function>
720937eb1ca1Smrgand
721037eb1ca1Smrg<function>BadMatch</function>
721137eb1ca1Smrgerrors.
721237eb1ca1Smrg<!-- .sp -->
721337eb1ca1Smrg</para>
721437eb1ca1Smrg<para>
721537eb1ca1Smrg<!-- .LP -->
721637eb1ca1SmrgTo free the data returned by
721737eb1ca1Smrg<function>XGetDeviceMotionEvents ,</function>
721837eb1ca1Smrguse
721937eb1ca1Smrg<function>XFreeDeviceMotionEvents .</function>
722037eb1ca1Smrg</para>
722137eb1ca1Smrg<para>
722237eb1ca1Smrg<!-- .LP -->
722337eb1ca1Smrg<!-- .sM -->
7224f1ee322dSmrg<funcsynopsis id='XFreeDeviceMotionEvents'>
722537eb1ca1Smrg<funcprototype>
722637eb1ca1Smrg  <funcdef>void <function> XFreeDeviceMotionEvents</function></funcdef>
722737eb1ca1Smrg  <paramdef>XDeviceTimeCoord<parameter> *events</parameter></paramdef>
722837eb1ca1Smrg</funcprototype>
722937eb1ca1Smrg</funcsynopsis>
723037eb1ca1Smrg<!-- .FN -->
723137eb1ca1Smrg<variablelist>
723237eb1ca1Smrg  <varlistentry>
723337eb1ca1Smrg    <term>
723437eb1ca1Smrg      <emphasis remap='I'>events</emphasis>
723537eb1ca1Smrg    </term>
723637eb1ca1Smrg    <listitem>
723737eb1ca1Smrg      <para>
723837eb1ca1SmrgSpecifies the pointer to the
723937eb1ca1Smrg<function>XDeviceTimeCoord</function>
724037eb1ca1Smrgarray returned by a previous call to
724137eb1ca1Smrg<function>XGetDeviceMotionEvents .</function>
724237eb1ca1Smrg    </para>
724337eb1ca1Smrg  </listitem>
724437eb1ca1Smrg  </varlistentry>
724537eb1ca1Smrg</variablelist>
724637eb1ca1Smrg</para>
724737eb1ca1Smrg<para>
724837eb1ca1Smrg<!-- .LP -->
724937eb1ca1Smrg<!-- .eM -->
7250f1ee322dSmrg<xref linkend='XFreeDeviceMotionEvents' xrefstyle='select: title'/>
725137eb1ca1Smrgfrees the specified array of motion information.
725237eb1ca1Smrg<!-- .\" -->
725337eb1ca1Smrg<!-- .\" -->
725437eb1ca1Smrg<!-- .\"  Appendicies -->
725537eb1ca1Smrg<!-- .\" -->
725637eb1ca1Smrg<!-- .\" -->
725737eb1ca1Smrg<!-- .bp -->
725837eb1ca1Smrg<!-- .ds Ch ~ -->
725937eb1ca1Smrg<!-- .sp 1 -->
726037eb1ca1Smrg<!-- .ce 3 -->
726137eb1ca1Smrg<function>Appendix A</function>
726237eb1ca1Smrg<!-- .XS -->
726337eb1ca1Smrg<!-- (SN Appendix A -->
726437eb1ca1Smrg<!-- .XE -->
726537eb1ca1Smrg</para>
726637eb1ca1Smrg<para>
726737eb1ca1Smrg<!-- .LP -->
726837eb1ca1SmrgThe following information is contained in the <function>&lt;X11/extensions/XInput.h&gt;</function>
726937eb1ca1Smrgand <function>&lt;X11/extensions/XI.h&gt;</function> header files:
727037eb1ca1Smrg<literallayout class="monospaced">
727137eb1ca1Smrg<!-- .cs CW 20 -->
727237eb1ca1Smrg
727337eb1ca1Smrg<!-- .ps 8 -->
727437eb1ca1Smrg/* Definitions used by the library and client */
727537eb1ca1Smrg
727637eb1ca1Smrg#ifndef _XINPUT_H_
727737eb1ca1Smrg#define _XINPUT_H_
727837eb1ca1Smrg
727937eb1ca1Smrg#ifndef _XLIB_H_
728037eb1ca1Smrg#include &lt;X11/Xlib.h&gt;
728137eb1ca1Smrg#endif
728237eb1ca1Smrg
728337eb1ca1Smrg#ifndef _XI_H_
728437eb1ca1Smrg#include "XI.h"
728537eb1ca1Smrg#endif
728637eb1ca1Smrg
728737eb1ca1Smrg#define _deviceKeyPress          0
728837eb1ca1Smrg#define _deviceKeyRelease     1
728937eb1ca1Smrg
729037eb1ca1Smrg#define _deviceButtonPress     0
729137eb1ca1Smrg#define _deviceButtonRelease     1
729237eb1ca1Smrg
729337eb1ca1Smrg#define _deviceMotionNotify     0
729437eb1ca1Smrg
729537eb1ca1Smrg#define _deviceFocusIn          0
729637eb1ca1Smrg#define _deviceFocusOut          1
729737eb1ca1Smrg
729837eb1ca1Smrg#define _proximityIn          0
729937eb1ca1Smrg#define _proximityOut          1
730037eb1ca1Smrg
730137eb1ca1Smrg#define _deviceStateNotify     0
730237eb1ca1Smrg#define _deviceMappingNotify     1
730337eb1ca1Smrg#define _changeDeviceNotify     2
730437eb1ca1Smrg
730537eb1ca1Smrg#define FindTypeAndClass(d, type, class, classid, offset) \
730637eb1ca1Smrg    { int i; XInputClassInfo *ip; \
730737eb1ca1Smrg    type = 0; class = 0; \
730837eb1ca1Smrg    for (i=0, ip= ((XDevice *) d)-&gt;classes; \
730937eb1ca1Smrg      i&lt; ((XDevice *) d)-&gt;num_classes; \
731037eb1ca1Smrg      i++, ip++) \
731137eb1ca1Smrg     if (ip-&gt;input_class == classid) \
731237eb1ca1Smrg         {type =  ip-&gt;event_type_base + offset; \
731337eb1ca1Smrg          class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | type;}}
731437eb1ca1Smrg
731537eb1ca1Smrg#define DeviceKeyPress(d, type, class) \
731637eb1ca1Smrg    FindTypeAndClass(d, type, class, KeyClass, _deviceKeyPress)
731737eb1ca1Smrg
731837eb1ca1Smrg#define DeviceKeyRelease(d, type, class) \
731937eb1ca1Smrg    FindTypeAndClass(d, type, class, KeyClass, _deviceKeyRelease)
732037eb1ca1Smrg
732137eb1ca1Smrg#define DeviceButtonPress(d, type, class) \
732237eb1ca1Smrg    FindTypeAndClass(d, type, class, ButtonClass, _deviceButtonPress)
732337eb1ca1Smrg
732437eb1ca1Smrg#define DeviceButtonRelease(d, type, class) \
732537eb1ca1Smrg    FindTypeAndClass(d, type, class, ButtonClass, _deviceButtonRelease)
732637eb1ca1Smrg
732737eb1ca1Smrg#define DeviceMotionNotify(d, type, class) \
732837eb1ca1Smrg    FindTypeAndClass(d, type, class, ValuatorClass, _deviceMotionNotify)
732937eb1ca1Smrg
733037eb1ca1Smrg#define DeviceFocusIn(d, type, class) \
733137eb1ca1Smrg    FindTypeAndClass(d, type, class, FocusClass, _deviceFocusIn)
733237eb1ca1Smrg
733337eb1ca1Smrg#define DeviceFocusOut(d, type, class) \
733437eb1ca1Smrg    FindTypeAndClass(d, type, class, FocusClass, _deviceFocusOut)
733537eb1ca1Smrg
733637eb1ca1Smrg#define ProximityIn(d, type, class) \
733737eb1ca1Smrg    FindTypeAndClass(d, type, class, ProximityClass, _proximityIn)
733837eb1ca1Smrg
733937eb1ca1Smrg#define ProximityOut(d, type, class) \
734037eb1ca1Smrg    FindTypeAndClass(d, type, class, ProximityClass, _proximityOut)
734137eb1ca1Smrg
734237eb1ca1Smrg#define DeviceStateNotify(d, type, class) \
734337eb1ca1Smrg    FindTypeAndClass(d, type, class, OtherClass, _deviceStateNotify)
734437eb1ca1Smrg
734537eb1ca1Smrg#define DeviceMappingNotify(d, type, class) \
734637eb1ca1Smrg    FindTypeAndClass(d, type, class, OtherClass, _deviceMappingNotify)
734737eb1ca1Smrg
734837eb1ca1Smrg#define ChangeDeviceNotify(d, type, class) \
734937eb1ca1Smrg    FindTypeAndClass(d, type, class, OtherClass, _changeDeviceNotify)
735037eb1ca1Smrg
735137eb1ca1Smrg#define DevicePointerMotionHint(d, type, class) \
735237eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _devicePointerMotionHint;}
735337eb1ca1Smrg
735437eb1ca1Smrg#define DeviceButton1Motion(d, type, class) \
735537eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _deviceButton1Motion;}
735637eb1ca1Smrg
735737eb1ca1Smrg#define DeviceButton2Motion(d, type, class) \
735837eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _deviceButton2Motion;}
735937eb1ca1Smrg
736037eb1ca1Smrg#define DeviceButton3Motion(d, type, class) \
736137eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _deviceButton3Motion;}
736237eb1ca1Smrg
736337eb1ca1Smrg#define DeviceButton4Motion(d, type, class) \
736437eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _deviceButton4Motion;}
736537eb1ca1Smrg
736637eb1ca1Smrg#define DeviceButton5Motion(d, type, class) \
736737eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _deviceButton5Motion;}
736837eb1ca1Smrg
736937eb1ca1Smrg#define DeviceButtonMotion(d, type, class) \
737037eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _deviceButtonMotion;}
737137eb1ca1Smrg
737237eb1ca1Smrg#define DeviceOwnerGrabButton(d, type, class) \
737337eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _deviceOwnerGrabButton;}
737437eb1ca1Smrg
737537eb1ca1Smrg#define DeviceButtonPressGrab(d, type, class) \
737637eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _deviceButtonGrab;}
737737eb1ca1Smrg
737837eb1ca1Smrg#define NoExtensionEvent(d, type, class) \
737937eb1ca1Smrg    { class =  ((XDevice *) d)-&gt;device_id &lt;&lt; 8 | _noExtensionEvent;}
738037eb1ca1Smrg
738137eb1ca1Smrg#define BadDevice(dpy, error) _xibaddevice(dpy, &amp;error)
738237eb1ca1Smrg
738337eb1ca1Smrg#define BadClass(dpy, error) _xibadclass(dpy, &amp;error)
738437eb1ca1Smrg
738537eb1ca1Smrg#define BadEvent(dpy, error) _xibadevent(dpy, &amp;error)
738637eb1ca1Smrg
738737eb1ca1Smrg#define BadMode(dpy, error) _xibadmode(dpy, &amp;error)
738837eb1ca1Smrg
738937eb1ca1Smrg#define DeviceBusy(dpy, error) _xidevicebusy(dpy, &amp;error)
739037eb1ca1Smrg
739137eb1ca1Smrg/***************************************************************
739237eb1ca1Smrg *
739337eb1ca1Smrg * DeviceKey events.  These events are sent by input devices that
739437eb1ca1Smrg * support input class Keys.
739537eb1ca1Smrg * The location of the X pointer is reported in the coordinate
739637eb1ca1Smrg * fields of the x,y and x_root,y_root fields.
739737eb1ca1Smrg *
739837eb1ca1Smrg */
739937eb1ca1Smrg
740037eb1ca1Smrgtypedef struct 
740137eb1ca1Smrg    {
740237eb1ca1Smrg    int            type;         /* of event */
740337eb1ca1Smrg    unsigned long  serial;       /* # of last request processed */
740437eb1ca1Smrg    Bool           send_event;   /* true if from SendEvent request */
740537eb1ca1Smrg    Display        *display;     /* Display the event was read from */
740637eb1ca1Smrg    Window         window;       /* "event" window reported relative to */
740737eb1ca1Smrg    XID            deviceid;
74084e8f48c7Smrg    Window         root;         /* root window event occurred on */
740937eb1ca1Smrg    Window         subwindow;    /* child window */
741037eb1ca1Smrg    Time           time;         /* milliseconds */
741137eb1ca1Smrg    int            x, y;         /* x, y coordinates in event window */
741237eb1ca1Smrg    int            x_root;       /* coordinates relative to root */
741337eb1ca1Smrg    int            y_root;       /* coordinates relative to root */
741437eb1ca1Smrg    unsigned int   state;        /* key or button mask */
741537eb1ca1Smrg    unsigned int   keycode;      /* detail */
741637eb1ca1Smrg    Bool           same_screen;  /* same screen flag */
741737eb1ca1Smrg    unsigned int   device_state; /* device key or button mask */
741837eb1ca1Smrg    unsigned char  axes_count;
741937eb1ca1Smrg    unsigned char  first_axis;
742037eb1ca1Smrg    int            axis_data[6];
742137eb1ca1Smrg    } XDeviceKeyEvent;
742237eb1ca1Smrg
742337eb1ca1Smrgtypedef XDeviceKeyEvent XDeviceKeyPressedEvent;
742437eb1ca1Smrgtypedef XDeviceKeyEvent XDeviceKeyReleasedEvent;
742537eb1ca1Smrg
742637eb1ca1Smrg/*******************************************************************
742737eb1ca1Smrg *
742837eb1ca1Smrg * DeviceButton events.  These events are sent by extension devices
742937eb1ca1Smrg * that support input class Buttons.
743037eb1ca1Smrg *
743137eb1ca1Smrg */
743237eb1ca1Smrg
743337eb1ca1Smrgtypedef struct {
743437eb1ca1Smrg    int           type;         /* of event */
743537eb1ca1Smrg    unsigned long serial;       /* # of last request processed by server */
743637eb1ca1Smrg    Bool          send_event;   /* true if from a SendEvent request */
743737eb1ca1Smrg    Display       *display;     /* Display the event was read from */
743837eb1ca1Smrg    Window        window;       /* "event" window reported relative to */
743937eb1ca1Smrg    XID           deviceid;
74404e8f48c7Smrg    Window        root;         /* root window that the event occurred on */
744137eb1ca1Smrg    Window        subwindow;    /* child window */
744237eb1ca1Smrg    Time          time;         /* milliseconds */
744337eb1ca1Smrg    int           x, y;         /* x, y coordinates in event window */
744437eb1ca1Smrg    int           x_root;       /* coordinates relative to root */
744537eb1ca1Smrg    int           y_root;       /* coordinates relative to root */
744637eb1ca1Smrg    unsigned int  state;        /* key or button mask */
744737eb1ca1Smrg    unsigned int  button;       /* detail */
744837eb1ca1Smrg    Bool          same_screen;  /* same screen flag */
744937eb1ca1Smrg    unsigned int  device_state; /* device key or button mask */
745037eb1ca1Smrg    unsigned char axes_count;
745137eb1ca1Smrg    unsigned char first_axis;
745237eb1ca1Smrg    int           axis_data[6];
745337eb1ca1Smrg    } XDeviceButtonEvent;
745437eb1ca1Smrg
745537eb1ca1Smrgtypedef XDeviceButtonEvent XDeviceButtonPressedEvent;
745637eb1ca1Smrgtypedef XDeviceButtonEvent XDeviceButtonReleasedEvent;
745737eb1ca1Smrg
745837eb1ca1Smrg/*******************************************************************
745937eb1ca1Smrg *
746037eb1ca1Smrg * DeviceMotionNotify event.  These events are sent by extension devices
746137eb1ca1Smrg * that support input class Valuators.
746237eb1ca1Smrg *
746337eb1ca1Smrg */
746437eb1ca1Smrg
746537eb1ca1Smrgtypedef struct 
746637eb1ca1Smrg    {
746737eb1ca1Smrg    int           type;        /* of event */
746837eb1ca1Smrg    unsigned long serial;      /* # of last request processed by server */
746937eb1ca1Smrg    Bool          send_event;  /* true if from a SendEvent request */
747037eb1ca1Smrg    Display       *display;    /* Display the event was read from */
747137eb1ca1Smrg    Window        window;      /* "event" window reported relative to */
747237eb1ca1Smrg    XID           deviceid;
74734e8f48c7Smrg    Window        root;        /* root window that the event occurred on */
747437eb1ca1Smrg    Window        subwindow;   /* child window */
747537eb1ca1Smrg    Time          time;        /* milliseconds */
747637eb1ca1Smrg    int           x, y;        /* x, y coordinates in event window */
747737eb1ca1Smrg    int           x_root;      /* coordinates relative to root */
747837eb1ca1Smrg    int           y_root;      /* coordinates relative to root */
747937eb1ca1Smrg    unsigned int  state;       /* key or button mask */
748037eb1ca1Smrg    char          is_hint;     /* detail */
748137eb1ca1Smrg    Bool          same_screen; /* same screen flag */
748237eb1ca1Smrg    unsigned int  device_state; /* device key or button mask */
748337eb1ca1Smrg    unsigned char axes_count;
748437eb1ca1Smrg    unsigned char first_axis;
748537eb1ca1Smrg    int           axis_data[6];
748637eb1ca1Smrg    } XDeviceMotionEvent;
748737eb1ca1Smrg
748837eb1ca1Smrg/*******************************************************************
748937eb1ca1Smrg *
749037eb1ca1Smrg * DeviceFocusChange events.  These events are sent when the focus
749137eb1ca1Smrg * of an extension device that can be focused is changed.
749237eb1ca1Smrg *
749337eb1ca1Smrg */
749437eb1ca1Smrg
749537eb1ca1Smrgtypedef struct 
749637eb1ca1Smrg    {
749737eb1ca1Smrg    int           type;       /* of event */
749837eb1ca1Smrg    unsigned long serial;     /* # of last request processed by server */
749937eb1ca1Smrg    Bool          send_event; /* true if from a SendEvent request */
750037eb1ca1Smrg    Display       *display;   /* Display the event was read from */
750137eb1ca1Smrg    Window        window;     /* "event" window reported relative to */
750237eb1ca1Smrg    XID           deviceid;
750337eb1ca1Smrg    int           mode;       /* NotifyNormal, NotifyGrab, NotifyUngrab */
750437eb1ca1Smrg    int           detail;
750537eb1ca1Smrg     /*
750637eb1ca1Smrg      * NotifyAncestor, NotifyVirtual, NotifyInferior, 
750737eb1ca1Smrg      * NotifyNonLinear,NotifyNonLinearVirtual, NotifyPointer,
750837eb1ca1Smrg      * NotifyPointerRoot, NotifyDetailNone 
750937eb1ca1Smrg      */
751037eb1ca1Smrg    Time                time;
751137eb1ca1Smrg    } XDeviceFocusChangeEvent;
751237eb1ca1Smrg
751337eb1ca1Smrgtypedef XDeviceFocusChangeEvent XDeviceFocusInEvent;
751437eb1ca1Smrgtypedef XDeviceFocusChangeEvent XDeviceFocusOutEvent;
751537eb1ca1Smrg
751637eb1ca1Smrg/*******************************************************************
751737eb1ca1Smrg *
751837eb1ca1Smrg * ProximityNotify events.  These events are sent by those absolute
751937eb1ca1Smrg * positioning devices that are capable of generating proximity information.
752037eb1ca1Smrg *
752137eb1ca1Smrg */
752237eb1ca1Smrg
752337eb1ca1Smrgtypedef struct 
752437eb1ca1Smrg    {
752537eb1ca1Smrg    int             type;      /* ProximityIn or ProximityOut */        
752637eb1ca1Smrg    unsigned long   serial;    /* # of last request processed by server */
752737eb1ca1Smrg    Bool            send_event; /* true if this came from a SendEvent request */
752837eb1ca1Smrg    Display         *display;  /* Display the event was read from */
752937eb1ca1Smrg    Window          window;      
753037eb1ca1Smrg    XID                 deviceid;
753137eb1ca1Smrg    Window          root;            
753237eb1ca1Smrg    Window          subwindow;      
753337eb1ca1Smrg    Time            time;            
753437eb1ca1Smrg    int             x, y;            
753537eb1ca1Smrg    int             x_root, y_root;  
753637eb1ca1Smrg    unsigned int    state;           
753737eb1ca1Smrg    Bool            same_screen;     
753837eb1ca1Smrg    unsigned int    device_state; /* device key or button mask */
753937eb1ca1Smrg    unsigned char   axes_count;
754037eb1ca1Smrg    unsigned char   first_axis;
754137eb1ca1Smrg    int             axis_data[6];
754237eb1ca1Smrg    } XProximityNotifyEvent;
754337eb1ca1Smrgtypedef XProximityNotifyEvent XProximityInEvent;
754437eb1ca1Smrgtypedef XProximityNotifyEvent XProximityOutEvent;
754537eb1ca1Smrg
754637eb1ca1Smrg/*******************************************************************
754737eb1ca1Smrg *
754837eb1ca1Smrg * DeviceStateNotify events are generated on EnterWindow and FocusIn 
754937eb1ca1Smrg * for those clients who have selected DeviceState.
755037eb1ca1Smrg *
755137eb1ca1Smrg */
755237eb1ca1Smrg
755337eb1ca1Smrgtypedef struct
755437eb1ca1Smrg    {
755537eb1ca1Smrg    unsigned char     class;
755637eb1ca1Smrg    unsigned char     length;
755737eb1ca1Smrg    } XInputClass;
755837eb1ca1Smrg
755937eb1ca1Smrgtypedef struct {
756037eb1ca1Smrg    int           type;
756137eb1ca1Smrg    unsigned long serial;       /* # of last request processed by server */
756237eb1ca1Smrg    Bool          send_event;   /* true if this came from a SendEvent request */
756337eb1ca1Smrg    Display       *display;     /* Display the event was read from */
756437eb1ca1Smrg    Window        window;
756537eb1ca1Smrg    XID           deviceid;
756637eb1ca1Smrg    Time          time;
756737eb1ca1Smrg    int           num_classes;
756837eb1ca1Smrg    char       data[64];
756937eb1ca1Smrg} XDeviceStateNotifyEvent;     
757037eb1ca1Smrg
757137eb1ca1Smrgtypedef struct {
757237eb1ca1Smrg    unsigned char     class;
757337eb1ca1Smrg    unsigned char     length;
757437eb1ca1Smrg    unsigned char     num_valuators;
757537eb1ca1Smrg    unsigned char     mode;
757637eb1ca1Smrg    int                  valuators[6];
757737eb1ca1Smrg} XValuatorStatus;
757837eb1ca1Smrg
757937eb1ca1Smrgtypedef struct {
758037eb1ca1Smrg    unsigned char     class;
758137eb1ca1Smrg    unsigned char     length;
758237eb1ca1Smrg    short          num_keys;
758337eb1ca1Smrg    char             keys[32];
758437eb1ca1Smrg} XKeyStatus;
758537eb1ca1Smrg
758637eb1ca1Smrgtypedef struct {
758737eb1ca1Smrg    unsigned char     class;
758837eb1ca1Smrg    unsigned char     length;
758937eb1ca1Smrg    short          num_buttons;
759037eb1ca1Smrg    char             buttons[32];
759137eb1ca1Smrg} XButtonStatus;
759237eb1ca1Smrg
759337eb1ca1Smrg/*******************************************************************
759437eb1ca1Smrg *
759537eb1ca1Smrg * DeviceMappingNotify event.  This event is sent when the key mapping,
759637eb1ca1Smrg * modifier mapping, or button mapping of an extension device is changed.
759737eb1ca1Smrg *
759837eb1ca1Smrg */
759937eb1ca1Smrg
760037eb1ca1Smrgtypedef struct {
760137eb1ca1Smrg    int           type;
760237eb1ca1Smrg    unsigned long serial;       /* # of last request processed by server */
760337eb1ca1Smrg    Bool          send_event;   /* true if this came from a SendEvent request */
760437eb1ca1Smrg    Display       *display;     /* Display the event was read from */
760537eb1ca1Smrg    Window        window;       /* unused */
760637eb1ca1Smrg    XID           deviceid;
760737eb1ca1Smrg    Time          time;
760837eb1ca1Smrg    int           request;      /* one of MappingModifier, MappingKeyboard,
760937eb1ca1Smrg                                    MappingPointer */
761037eb1ca1Smrg    int           first_keycode;/* first keycode */
761137eb1ca1Smrg    int           count;        /* defines range of change w. first_keycode*/
761237eb1ca1Smrg} XDeviceMappingEvent;
761337eb1ca1Smrg
761437eb1ca1Smrg/*******************************************************************
761537eb1ca1Smrg *
761637eb1ca1Smrg * ChangeDeviceNotify event.  This event is sent when an 
761737eb1ca1Smrg * XChangeKeyboard or XChangePointer request is made.
761837eb1ca1Smrg *
761937eb1ca1Smrg */
762037eb1ca1Smrg
762137eb1ca1Smrgtypedef struct {
762237eb1ca1Smrg    int           type;
762337eb1ca1Smrg    unsigned long serial;       /* # of last request processed by server */
762437eb1ca1Smrg    Bool          send_event;   /* true if this came from a SendEvent request */
762537eb1ca1Smrg    Display       *display;     /* Display the event was read from */
762637eb1ca1Smrg    Window        window;       /* unused */
762737eb1ca1Smrg    XID           deviceid;
762837eb1ca1Smrg    Time          time;
762937eb1ca1Smrg    int           request;      /* NewPointer or NewKeyboard */
763037eb1ca1Smrg} XChangeDeviceNotifyEvent;
763137eb1ca1Smrg
763237eb1ca1Smrg/*******************************************************************
763337eb1ca1Smrg *
763437eb1ca1Smrg * Control structures for input devices that support input class
763537eb1ca1Smrg * Feedback.  These are used by the XGetFeedbackControl and 
763637eb1ca1Smrg * XChangeFeedbackControl functions.
763737eb1ca1Smrg *
763837eb1ca1Smrg */
763937eb1ca1Smrg
764037eb1ca1Smrgtypedef struct {
764137eb1ca1Smrg     XID            class;
764237eb1ca1Smrg     int            length;
764337eb1ca1Smrg     XID            id;
764437eb1ca1Smrg} XFeedbackState;
764537eb1ca1Smrg
764637eb1ca1Smrgtypedef struct {
764737eb1ca1Smrg    XID     class;
764837eb1ca1Smrg    int     length;
764937eb1ca1Smrg    XID     id;
765037eb1ca1Smrg    int     click;
765137eb1ca1Smrg    int     percent;
765237eb1ca1Smrg    int     pitch;
765337eb1ca1Smrg    int     duration;
765437eb1ca1Smrg    int     led_mask;
765537eb1ca1Smrg    int     global_auto_repeat;
765637eb1ca1Smrg    char    auto_repeats[32];
765737eb1ca1Smrg} XKbdFeedbackState;
765837eb1ca1Smrg
765937eb1ca1Smrgtypedef struct {
766037eb1ca1Smrg    XID     class;
766137eb1ca1Smrg    int     length;
766237eb1ca1Smrg    XID     id;
766337eb1ca1Smrg    int     accelNum;
766437eb1ca1Smrg    int     accelDenom;
766537eb1ca1Smrg    int     threshold;
766637eb1ca1Smrg} XPtrFeedbackState;
766737eb1ca1Smrg
766837eb1ca1Smrgtypedef struct {
766937eb1ca1Smrg    XID     class;
767037eb1ca1Smrg    int     length;
767137eb1ca1Smrg    XID     id;
767237eb1ca1Smrg    int     resolution;
767337eb1ca1Smrg    int     minVal;
767437eb1ca1Smrg    int     maxVal;
767537eb1ca1Smrg} XIntegerFeedbackState;
767637eb1ca1Smrg
767737eb1ca1Smrgtypedef struct {
767837eb1ca1Smrg    XID     class;
767937eb1ca1Smrg    int     length;
768037eb1ca1Smrg    XID     id;
768137eb1ca1Smrg    int     max_symbols;
768237eb1ca1Smrg    int     num_syms_supported;
768337eb1ca1Smrg    KeySym  *syms_supported;
768437eb1ca1Smrg} XStringFeedbackState;
768537eb1ca1Smrg
768637eb1ca1Smrgtypedef struct {
768737eb1ca1Smrg    XID     class;
768837eb1ca1Smrg    int     length;
768937eb1ca1Smrg    XID     id;
769037eb1ca1Smrg    int     percent;
769137eb1ca1Smrg    int     pitch;
769237eb1ca1Smrg    int     duration;
769337eb1ca1Smrg} XBellFeedbackState;
769437eb1ca1Smrg
769537eb1ca1Smrgtypedef struct {
769637eb1ca1Smrg    XID     class;
769737eb1ca1Smrg    int     length;
769837eb1ca1Smrg    XID     id;
769937eb1ca1Smrg    int     led_values;
770037eb1ca1Smrg    int     led_mask;
770137eb1ca1Smrg} XLedFeedbackState;
770237eb1ca1Smrg
770337eb1ca1Smrgtypedef struct {
770437eb1ca1Smrg     XID            class;
770537eb1ca1Smrg     int            length;
770637eb1ca1Smrg     XID         id;
770737eb1ca1Smrg} XFeedbackControl;
770837eb1ca1Smrg
770937eb1ca1Smrgtypedef struct {
771037eb1ca1Smrg    XID     class;
771137eb1ca1Smrg    int     length;
771237eb1ca1Smrg    XID     id;
771337eb1ca1Smrg    int     accelNum;
771437eb1ca1Smrg    int     accelDenom;
771537eb1ca1Smrg    int     threshold;
771637eb1ca1Smrg} XPtrFeedbackControl;
771737eb1ca1Smrg
771837eb1ca1Smrgtypedef struct {
771937eb1ca1Smrg    XID     class;
772037eb1ca1Smrg    int     length;
772137eb1ca1Smrg    XID     id;
772237eb1ca1Smrg    int     click;
772337eb1ca1Smrg    int     percent;
772437eb1ca1Smrg    int     pitch;
772537eb1ca1Smrg    int     duration;
772637eb1ca1Smrg    int     led_mask;
772737eb1ca1Smrg    int     led_value;
772837eb1ca1Smrg    int     key;
772937eb1ca1Smrg    int     auto_repeat_mode;
773037eb1ca1Smrg} XKbdFeedbackControl;
773137eb1ca1Smrg
773237eb1ca1Smrgtypedef struct {
773337eb1ca1Smrg    XID     class;
773437eb1ca1Smrg    int     length;
773537eb1ca1Smrg    XID     id;
773637eb1ca1Smrg    int     num_keysyms;
773737eb1ca1Smrg    KeySym  *syms_to_display;
773837eb1ca1Smrg} XStringFeedbackControl;
773937eb1ca1Smrg
774037eb1ca1Smrgtypedef struct {
774137eb1ca1Smrg    XID     class;
774237eb1ca1Smrg    int     length;
774337eb1ca1Smrg    XID     id;
774437eb1ca1Smrg    int     int_to_display;
774537eb1ca1Smrg} XIntegerFeedbackControl;
774637eb1ca1Smrg
774737eb1ca1Smrgtypedef struct {
774837eb1ca1Smrg    XID     class;
774937eb1ca1Smrg    int     length;
775037eb1ca1Smrg    XID     id;
775137eb1ca1Smrg    int     percent;
775237eb1ca1Smrg    int     pitch;
775337eb1ca1Smrg    int     duration;
775437eb1ca1Smrg} XBellFeedbackControl;
775537eb1ca1Smrg
775637eb1ca1Smrgtypedef struct {
775737eb1ca1Smrg    XID     class;
775837eb1ca1Smrg    int     length;
775937eb1ca1Smrg    XID     id;
776037eb1ca1Smrg    int     led_mask;
776137eb1ca1Smrg    int     led_values;
776237eb1ca1Smrg} XLedFeedbackControl;
776337eb1ca1Smrg
776437eb1ca1Smrg/*******************************************************************
776537eb1ca1Smrg *
776637eb1ca1Smrg * Device control structures.
776737eb1ca1Smrg *
776837eb1ca1Smrg */
776937eb1ca1Smrg
777037eb1ca1Smrgtypedef struct {
777137eb1ca1Smrg     XID            control;
777237eb1ca1Smrg     int            length;
777337eb1ca1Smrg} XDeviceControl;
777437eb1ca1Smrg
777537eb1ca1Smrgtypedef struct {
777637eb1ca1Smrg     XID            control;
777737eb1ca1Smrg     int            length;
777837eb1ca1Smrg     int            first_valuator;
777937eb1ca1Smrg     int            num_valuators;
778037eb1ca1Smrg     int            *resolutions;
778137eb1ca1Smrg} XDeviceResolutionControl;
778237eb1ca1Smrg
778337eb1ca1Smrgtypedef struct {
778437eb1ca1Smrg     XID            control;
778537eb1ca1Smrg     int            length;
778637eb1ca1Smrg     int            num_valuators;
778737eb1ca1Smrg     int            *resolutions;
778837eb1ca1Smrg     int            *min_resolutions;
778937eb1ca1Smrg     int            *max_resolutions;
779037eb1ca1Smrg} XDeviceResolutionState;
779137eb1ca1Smrg
779237eb1ca1Smrg/*******************************************************************
779337eb1ca1Smrg *
779437eb1ca1Smrg * An array of XDeviceList structures is returned by the 
779537eb1ca1Smrg * XListInputDevices function.  Each entry contains information
779637eb1ca1Smrg * about one input device.  Among that information is an array of 
779737eb1ca1Smrg * pointers to structures that describe the characteristics of 
779837eb1ca1Smrg * the input device.
779937eb1ca1Smrg *
780037eb1ca1Smrg */
780137eb1ca1Smrg
780237eb1ca1Smrgtypedef struct _XAnyClassinfo *XAnyClassPtr;
780337eb1ca1Smrg
780437eb1ca1Smrgtypedef struct _XAnyClassinfo {
780537eb1ca1Smrg    XID      class;
780637eb1ca1Smrg    int      length;
780737eb1ca1Smrg    } XAnyClassInfo;
780837eb1ca1Smrg
780937eb1ca1Smrgtypedef struct _XDeviceInfo *XDeviceInfoPtr;
781037eb1ca1Smrg
781137eb1ca1Smrgtypedef struct _XDeviceInfo
781237eb1ca1Smrg    {
781337eb1ca1Smrg    XID                 id;        
781437eb1ca1Smrg    Atom                type;
781537eb1ca1Smrg    char                *name;
781637eb1ca1Smrg    int                 num_classes;
781737eb1ca1Smrg    int                 use;
781837eb1ca1Smrg    XAnyClassPtr      inputclassinfo;
781937eb1ca1Smrg    } XDeviceInfo;
782037eb1ca1Smrg
782137eb1ca1Smrgtypedef struct _XKeyInfo *XKeyInfoPtr;
782237eb1ca1Smrg
782337eb1ca1Smrgtypedef struct _XKeyInfo
782437eb1ca1Smrg    {
782537eb1ca1Smrg    XID               class;
782637eb1ca1Smrg    int               length;
782737eb1ca1Smrg    unsigned short      min_keycode;
782837eb1ca1Smrg    unsigned short      max_keycode;
782937eb1ca1Smrg    unsigned short      num_keys;
783037eb1ca1Smrg    } XKeyInfo;
783137eb1ca1Smrg
783237eb1ca1Smrgtypedef struct _XButtonInfo *XButtonInfoPtr;
783337eb1ca1Smrg
783437eb1ca1Smrgtypedef struct _XButtonInfo {
783537eb1ca1Smrg    XID          class;
783637eb1ca1Smrg    int          length;
783737eb1ca1Smrg    short      num_buttons;
783837eb1ca1Smrg    } XButtonInfo;
783937eb1ca1Smrg
784037eb1ca1Smrgtypedef struct _XAxisInfo *XAxisInfoPtr;
784137eb1ca1Smrg
784237eb1ca1Smrgtypedef struct _XAxisInfo {
784337eb1ca1Smrg    int      resolution;
784437eb1ca1Smrg    int      min_value;
784537eb1ca1Smrg    int      max_value;
784637eb1ca1Smrg    } XAxisInfo;
784737eb1ca1Smrg
784837eb1ca1Smrgtypedef struct _XValuatorInfo *XValuatorInfoPtr;
784937eb1ca1Smrg
785037eb1ca1Smrgtypedef struct     _XValuatorInfo
785137eb1ca1Smrg    {
785237eb1ca1Smrg    XID               class;
785337eb1ca1Smrg    int               length;
785437eb1ca1Smrg    unsigned char       num_axes;
785537eb1ca1Smrg    unsigned char       mode;
785637eb1ca1Smrg    unsigned long       motion_buffer;
785737eb1ca1Smrg    XAxisInfoPtr        axes;
785837eb1ca1Smrg    } XValuatorInfo;
785937eb1ca1Smrg
786037eb1ca1Smrg
786137eb1ca1Smrg/*******************************************************************
786237eb1ca1Smrg *
786337eb1ca1Smrg * An XDevice structure is returned by the XOpenDevice function.  
786437eb1ca1Smrg * It contains an array of pointers to XInputClassInfo structures.
786537eb1ca1Smrg * Each contains information about a class of input supported by the
786637eb1ca1Smrg * device, including a pointer to an array of data for each type of event
786737eb1ca1Smrg * the device reports.
786837eb1ca1Smrg *
786937eb1ca1Smrg */
787037eb1ca1Smrg
787137eb1ca1Smrg
787237eb1ca1Smrgtypedef struct {
787337eb1ca1Smrg        unsigned char   input_class;
787437eb1ca1Smrg        unsigned char   event_type_base;
787537eb1ca1Smrg} XInputClassInfo;
787637eb1ca1Smrg
787737eb1ca1Smrgtypedef struct {
787837eb1ca1Smrg        XID                    device_id;
787937eb1ca1Smrg        int                    num_classes;
788037eb1ca1Smrg        XInputClassInfo        *classes;
788137eb1ca1Smrg} XDevice;
788237eb1ca1Smrg
788337eb1ca1Smrg
788437eb1ca1Smrg/*******************************************************************
788537eb1ca1Smrg *
788637eb1ca1Smrg * The following structure is used to return information for the 
788737eb1ca1Smrg * XGetSelectedExtensionEvents function.
788837eb1ca1Smrg *
788937eb1ca1Smrg */
789037eb1ca1Smrg
789137eb1ca1Smrgtypedef struct {
789237eb1ca1Smrg        XEventClass     event_type;
789337eb1ca1Smrg        XID             device;
789437eb1ca1Smrg} XEventList;
789537eb1ca1Smrg
789637eb1ca1Smrg/*******************************************************************
789737eb1ca1Smrg *
789837eb1ca1Smrg * The following structure is used to return motion history data from 
789937eb1ca1Smrg * an input device that supports the input class Valuators.
790037eb1ca1Smrg * This information is returned by the XGetDeviceMotionEvents function.
790137eb1ca1Smrg *
790237eb1ca1Smrg */
790337eb1ca1Smrg
790437eb1ca1Smrgtypedef struct {
790537eb1ca1Smrg        Time   time;
790637eb1ca1Smrg        int    *data;
790737eb1ca1Smrg} XDeviceTimeCoord;
790837eb1ca1Smrg
790937eb1ca1Smrg
791037eb1ca1Smrg/*******************************************************************
791137eb1ca1Smrg *
791237eb1ca1Smrg * Device state structure.
791337eb1ca1Smrg * This is returned by the XQueryDeviceState request.
791437eb1ca1Smrg *
791537eb1ca1Smrg */
791637eb1ca1Smrg
791737eb1ca1Smrgtypedef struct {
791837eb1ca1Smrg        XID          device_id;
791937eb1ca1Smrg        int          num_classes;
792037eb1ca1Smrg        XInputClass     *data;
792137eb1ca1Smrg} XDeviceState;
792237eb1ca1Smrg
792337eb1ca1Smrg/*******************************************************************
792437eb1ca1Smrg *
792537eb1ca1Smrg * Note that the mode field is a bitfield that reports the Proximity
792637eb1ca1Smrg * status of the device as well as the mode.  The mode field should
792737eb1ca1Smrg * be OR'd with the mask DeviceMode and compared with the values
792837eb1ca1Smrg * Absolute and Relative to determine the mode, and should be OR'd
792937eb1ca1Smrg * with the mask ProximityState and compared with the values InProximity
793037eb1ca1Smrg * and OutOfProximity to determine the proximity state.
793137eb1ca1Smrg *
793237eb1ca1Smrg */
793337eb1ca1Smrg
793437eb1ca1Smrgtypedef struct {
793537eb1ca1Smrg    unsigned char     class;
793637eb1ca1Smrg    unsigned char     length;
793737eb1ca1Smrg    unsigned char     num_valuators;
793837eb1ca1Smrg    unsigned char     mode;
793937eb1ca1Smrg    int                  *valuators;
794037eb1ca1Smrg} XValuatorState;
794137eb1ca1Smrg
794237eb1ca1Smrgtypedef struct {
794337eb1ca1Smrg    unsigned char     class;
794437eb1ca1Smrg    unsigned char     length;
794537eb1ca1Smrg    short          num_keys;
794637eb1ca1Smrg    char             keys[32];
794737eb1ca1Smrg} XKeyState;
794837eb1ca1Smrg
794937eb1ca1Smrgtypedef struct {
795037eb1ca1Smrg    unsigned char     class;
795137eb1ca1Smrg    unsigned char     length;
795237eb1ca1Smrg    short          num_buttons;
795337eb1ca1Smrg    char             buttons[32];
795437eb1ca1Smrg} XButtonState;
795537eb1ca1Smrg
795637eb1ca1Smrg/*******************************************************************
795737eb1ca1Smrg *
795837eb1ca1Smrg * Function definitions.
795937eb1ca1Smrg *
796037eb1ca1Smrg */
796137eb1ca1Smrg
796237eb1ca1Smrg_XFUNCPROTOBEGIN
796337eb1ca1Smrg
796437eb1ca1Smrgextern int     XChangeKeyboardDevice(
796537eb1ca1Smrg#if NeedFunctionPrototypes
796637eb1ca1Smrg    Display*          /* display */,
796737eb1ca1Smrg    XDevice*          /* device */
796837eb1ca1Smrg#endif
796937eb1ca1Smrg);
797037eb1ca1Smrg
797137eb1ca1Smrgextern int     XChangePointerDevice(
797237eb1ca1Smrg#if NeedFunctionPrototypes
797337eb1ca1Smrg    Display*          /* display */,
797437eb1ca1Smrg    XDevice*          /* device */,
797537eb1ca1Smrg    int               /* xaxis */,
797637eb1ca1Smrg    int               /* yaxis */
797737eb1ca1Smrg#endif
797837eb1ca1Smrg);
797937eb1ca1Smrg
798037eb1ca1Smrgextern int     XGrabDevice(
798137eb1ca1Smrg#if NeedFunctionPrototypes
798237eb1ca1Smrg    Display*          /* display */,
798337eb1ca1Smrg    XDevice*          /* device */,
798437eb1ca1Smrg    Window          /* grab_window */,
798537eb1ca1Smrg    Bool          /* ownerEvents */,
798637eb1ca1Smrg    int               /* event count */,
798737eb1ca1Smrg    XEventClass*     /* event_list */,
798837eb1ca1Smrg    int               /* this_device_mode */,
798937eb1ca1Smrg    int               /* other_devices_mode */,
799037eb1ca1Smrg    Time          /* time */
799137eb1ca1Smrg#endif
799237eb1ca1Smrg);
799337eb1ca1Smrg
799437eb1ca1Smrgextern int     XUngrabDevice(
799537eb1ca1Smrg#if NeedFunctionPrototypes
799637eb1ca1Smrg    Display*          /* display */,
799737eb1ca1Smrg    XDevice*          /* device */,
799837eb1ca1Smrg    Time           /* time */
799937eb1ca1Smrg#endif
800037eb1ca1Smrg);
800137eb1ca1Smrg
800237eb1ca1Smrgextern int     XGrabDeviceKey(
800337eb1ca1Smrg#if NeedFunctionPrototypes
800437eb1ca1Smrg    Display*          /* display */,
800537eb1ca1Smrg    XDevice*          /* device */,
800637eb1ca1Smrg    unsigned int     /* key */,
800737eb1ca1Smrg    unsigned int     /* modifiers */,
800837eb1ca1Smrg    XDevice*          /* modifier_device */,
800937eb1ca1Smrg    Window          /* grab_window */,
801037eb1ca1Smrg    Bool          /* owner_events */,
801137eb1ca1Smrg    unsigned int     /* event_count */,
801237eb1ca1Smrg    XEventClass*     /* event_list */,
801337eb1ca1Smrg    int               /* this_device_mode */,
801437eb1ca1Smrg    int               /* other_devices_mode */
801537eb1ca1Smrg#endif
801637eb1ca1Smrg);
801737eb1ca1Smrg
801837eb1ca1Smrgextern int     XUngrabDeviceKey(
801937eb1ca1Smrg#if NeedFunctionPrototypes
802037eb1ca1Smrg    Display*          /* display */,
802137eb1ca1Smrg    XDevice*          /* device */,
802237eb1ca1Smrg    unsigned int     /* key */,
802337eb1ca1Smrg    unsigned int     /* modifiers */,
802437eb1ca1Smrg    XDevice*          /* modifier_dev */,
802537eb1ca1Smrg    Window          /* grab_window */
802637eb1ca1Smrg#endif
802737eb1ca1Smrg);
802837eb1ca1Smrg
802937eb1ca1Smrgextern int     XGrabDeviceButton(
803037eb1ca1Smrg#if NeedFunctionPrototypes
803137eb1ca1Smrg    Display*          /* display */,
803237eb1ca1Smrg    XDevice*          /* device */,
803337eb1ca1Smrg    unsigned int     /* button */,
803437eb1ca1Smrg    unsigned int     /* modifiers */,
803537eb1ca1Smrg    XDevice*          /* modifier_device */,
803637eb1ca1Smrg    Window          /* grab_window */,
803737eb1ca1Smrg    Bool          /* owner_events */,
803837eb1ca1Smrg    unsigned int     /* event_count */,
803937eb1ca1Smrg    XEventClass*     /* event_list */,
804037eb1ca1Smrg    int               /* this_device_mode */,
804137eb1ca1Smrg    int               /* other_devices_mode */
804237eb1ca1Smrg#endif
804337eb1ca1Smrg);
804437eb1ca1Smrg
804537eb1ca1Smrgextern int     XUngrabDeviceButton(
804637eb1ca1Smrg#if NeedFunctionPrototypes
804737eb1ca1Smrg    Display*          /* display */,
804837eb1ca1Smrg    XDevice*          /* device */,
804937eb1ca1Smrg    unsigned int     /* button */,
805037eb1ca1Smrg    unsigned int     /* modifiers */,
805137eb1ca1Smrg    XDevice*          /* modifier_dev */,
805237eb1ca1Smrg    Window          /* grab_window */
805337eb1ca1Smrg#endif
805437eb1ca1Smrg);
805537eb1ca1Smrg
805637eb1ca1Smrgextern int     XAllowDeviceEvents(
805737eb1ca1Smrg#if NeedFunctionPrototypes
805837eb1ca1Smrg    Display*          /* display */,
805937eb1ca1Smrg    XDevice*          /* device */,
806037eb1ca1Smrg    int               /* event_mode */,
806137eb1ca1Smrg    Time          /* time */
806237eb1ca1Smrg#endif
806337eb1ca1Smrg);
806437eb1ca1Smrg
806537eb1ca1Smrgextern int     XGetDeviceFocus(
806637eb1ca1Smrg#if NeedFunctionPrototypes
806737eb1ca1Smrg    Display*          /* display */,
806837eb1ca1Smrg    XDevice*          /* device */,
806937eb1ca1Smrg    Window*          /* focus */,
807037eb1ca1Smrg    int*          /* revert_to */,
807137eb1ca1Smrg    Time*          /* time */
807237eb1ca1Smrg#endif
807337eb1ca1Smrg);
807437eb1ca1Smrg
807537eb1ca1Smrgextern int     XSetDeviceFocus(
807637eb1ca1Smrg#if NeedFunctionPrototypes
807737eb1ca1Smrg    Display*          /* display */,
807837eb1ca1Smrg    XDevice*          /* device */,
807937eb1ca1Smrg    Window          /* focus */,
808037eb1ca1Smrg    int               /* revert_to */,
808137eb1ca1Smrg    Time          /* time */
808237eb1ca1Smrg#endif
808337eb1ca1Smrg);
808437eb1ca1Smrg
808537eb1ca1Smrgextern XFeedbackState     *XGetFeedbackControl(
808637eb1ca1Smrg#if NeedFunctionPrototypes
808737eb1ca1Smrg    Display*          /* display */,
808837eb1ca1Smrg    XDevice*          /* device */,
808937eb1ca1Smrg    int*          /* num_feedbacks */
809037eb1ca1Smrg#endif
809137eb1ca1Smrg);
809237eb1ca1Smrg
809337eb1ca1Smrgextern int     XFreeFeedbackList(
809437eb1ca1Smrg#if NeedFunctionPrototypes
809537eb1ca1Smrg    XFeedbackState*     /* list */
809637eb1ca1Smrg#endif
809737eb1ca1Smrg);
809837eb1ca1Smrg
809937eb1ca1Smrgextern int     XChangeFeedbackControl(
810037eb1ca1Smrg#if NeedFunctionPrototypes
810137eb1ca1Smrg    Display*          /* display */,
810237eb1ca1Smrg    XDevice*          /* device */,
810337eb1ca1Smrg    unsigned long     /* mask */,
810437eb1ca1Smrg    XFeedbackControl*     /* f */
810537eb1ca1Smrg#endif
810637eb1ca1Smrg);
810737eb1ca1Smrg
810837eb1ca1Smrgextern int     XDeviceBell(
810937eb1ca1Smrg#if NeedFunctionPrototypes
811037eb1ca1Smrg    Display*          /* display */,
811137eb1ca1Smrg    XDevice*          /* device */,
811237eb1ca1Smrg    XID               /* feedbackclass */,
811337eb1ca1Smrg    XID               /* feedbackid */,
811437eb1ca1Smrg    int               /* percent */
811537eb1ca1Smrg#endif
811637eb1ca1Smrg);
811737eb1ca1Smrg
811837eb1ca1Smrgextern KeySym     *XGetDeviceKeyMapping(
811937eb1ca1Smrg#if NeedFunctionPrototypes
812037eb1ca1Smrg    Display*          /* display */,
812137eb1ca1Smrg    XDevice*          /* device */,
812237eb1ca1Smrg#if NeedWidePrototypes
812337eb1ca1Smrg    unsigned int     /* first */,
812437eb1ca1Smrg#else
812537eb1ca1Smrg    KeyCode          /* first */,
812637eb1ca1Smrg#endif
812737eb1ca1Smrg    int               /* keycount */,
812837eb1ca1Smrg    int*          /* syms_per_code */
812937eb1ca1Smrg#endif
813037eb1ca1Smrg);
813137eb1ca1Smrg
813237eb1ca1Smrgextern int     XChangeDeviceKeyMapping(
813337eb1ca1Smrg#if NeedFunctionPrototypes
813437eb1ca1Smrg    Display*          /* display */,
813537eb1ca1Smrg    XDevice*          /* device */,
813637eb1ca1Smrg    int               /* first */,
813737eb1ca1Smrg    int               /* syms_per_code */,
813837eb1ca1Smrg    KeySym*          /* keysyms */,
813937eb1ca1Smrg    int               /* count */
814037eb1ca1Smrg#endif
814137eb1ca1Smrg);
814237eb1ca1Smrg
814337eb1ca1Smrgextern XModifierKeymap     *XGetDeviceModifierMapping(
814437eb1ca1Smrg#if NeedFunctionPrototypes
814537eb1ca1Smrg    Display*          /* display */,
814637eb1ca1Smrg    XDevice*          /* device */
814737eb1ca1Smrg#endif
814837eb1ca1Smrg);
814937eb1ca1Smrg
815037eb1ca1Smrgextern int     XSetDeviceModifierMapping(
815137eb1ca1Smrg#if NeedFunctionPrototypes
815237eb1ca1Smrg    Display*          /* display */,
815337eb1ca1Smrg    XDevice*          /* device */,
815437eb1ca1Smrg    XModifierKeymap*     /* modmap */
815537eb1ca1Smrg#endif
815637eb1ca1Smrg);
815737eb1ca1Smrg
815837eb1ca1Smrgextern int     XSetDeviceButtonMapping(
815937eb1ca1Smrg#if NeedFunctionPrototypes
816037eb1ca1Smrg    Display*          /* display */,
816137eb1ca1Smrg    XDevice*          /* device */,
816237eb1ca1Smrg    unsigned char*     /* map[] */,
816337eb1ca1Smrg    int               /* nmap */
816437eb1ca1Smrg#endif
816537eb1ca1Smrg);
816637eb1ca1Smrg
816737eb1ca1Smrgextern int     XGetDeviceButtonMapping(
816837eb1ca1Smrg#if NeedFunctionPrototypes
816937eb1ca1Smrg    Display*          /* display */,
817037eb1ca1Smrg    XDevice*          /* device */,
817137eb1ca1Smrg    unsigned char*     /* map[] */,
817237eb1ca1Smrg    unsigned int     /* nmap */
817337eb1ca1Smrg#endif
817437eb1ca1Smrg);
817537eb1ca1Smrg
817637eb1ca1Smrgextern XDeviceState     *XQueryDeviceState(
817737eb1ca1Smrg#if NeedFunctionPrototypes
817837eb1ca1Smrg    Display*          /* display */,
817937eb1ca1Smrg    XDevice*          /* device */
818037eb1ca1Smrg#endif
818137eb1ca1Smrg);
818237eb1ca1Smrg
818337eb1ca1Smrgextern int     XFreeDeviceState(
818437eb1ca1Smrg#if NeedFunctionPrototypes
818537eb1ca1Smrg    XDeviceState*     /* list */
818637eb1ca1Smrg#endif
818737eb1ca1Smrg);
818837eb1ca1Smrg
818937eb1ca1Smrgextern XExtensionVersion *XGetExtensionVersion(
819037eb1ca1Smrg#if NeedFunctionPrototypes
819137eb1ca1Smrg    Display*          /* display */,
819237eb1ca1Smrg    _Xconst char*     /* name */
819337eb1ca1Smrg#endif
819437eb1ca1Smrg);
819537eb1ca1Smrg
819637eb1ca1Smrgextern XDeviceInfo     *XListInputDevices(
819737eb1ca1Smrg#if NeedFunctionPrototypes
819837eb1ca1Smrg    Display*          /* display */,
819937eb1ca1Smrg    int*          /* ndevices */
820037eb1ca1Smrg#endif
820137eb1ca1Smrg);
820237eb1ca1Smrg
820337eb1ca1Smrgextern int     XFreeDeviceList(
820437eb1ca1Smrg#if NeedFunctionPrototypes
820537eb1ca1Smrg    XDeviceInfo*     /* list */
820637eb1ca1Smrg#endif
820737eb1ca1Smrg);
820837eb1ca1Smrg
820937eb1ca1Smrgextern XDevice     *XOpenDevice(
821037eb1ca1Smrg#if NeedFunctionPrototypes
821137eb1ca1Smrg    Display*          /* display */,
821237eb1ca1Smrg    XID               /* id */
821337eb1ca1Smrg#endif
821437eb1ca1Smrg);
821537eb1ca1Smrg
821637eb1ca1Smrgextern int     XCloseDevice(
821737eb1ca1Smrg#if NeedFunctionPrototypes
821837eb1ca1Smrg    Display*          /* display */,
821937eb1ca1Smrg    XDevice*          /* device */
822037eb1ca1Smrg#endif
822137eb1ca1Smrg);
822237eb1ca1Smrg
822337eb1ca1Smrgextern int     XSetDeviceMode(
822437eb1ca1Smrg#if NeedFunctionPrototypes
822537eb1ca1Smrg    Display*          /* display */,
822637eb1ca1Smrg    XDevice*          /* device */,
822737eb1ca1Smrg    int               /* mode */
822837eb1ca1Smrg#endif
822937eb1ca1Smrg);
823037eb1ca1Smrg
823137eb1ca1Smrgextern int     XSetDeviceValuators(
823237eb1ca1Smrg#if NeedFunctionPrototypes
823337eb1ca1Smrg    Display*          /* display */,
823437eb1ca1Smrg    XDevice*          /* device */,
823537eb1ca1Smrg    int*          /* valuators */,
823637eb1ca1Smrg    int               /* first_valuator */,
823737eb1ca1Smrg    int               /* num_valuators */
823837eb1ca1Smrg#endif
823937eb1ca1Smrg);
824037eb1ca1Smrg
824137eb1ca1Smrgextern XDeviceControl     *XGetDeviceControl(
824237eb1ca1Smrg#if NeedFunctionPrototypes
824337eb1ca1Smrg    Display*          /* display */,
824437eb1ca1Smrg    XDevice*          /* device */,
824537eb1ca1Smrg    int               /* control */
824637eb1ca1Smrg#endif
824737eb1ca1Smrg);
824837eb1ca1Smrg
824937eb1ca1Smrgextern int     XChangeDeviceControl(
825037eb1ca1Smrg#if NeedFunctionPrototypes
825137eb1ca1Smrg    Display*          /* display */,
825237eb1ca1Smrg    XDevice*          /* device */,
825337eb1ca1Smrg    int               /* control */,
825437eb1ca1Smrg    XDeviceControl*     /* d */
825537eb1ca1Smrg#endif
825637eb1ca1Smrg);
825737eb1ca1Smrg
825837eb1ca1Smrgextern int     XSelectExtensionEvent(
825937eb1ca1Smrg#if NeedFunctionPrototypes
826037eb1ca1Smrg    Display*          /* display */,
826137eb1ca1Smrg    Window          /* w */,
826237eb1ca1Smrg    XEventClass*     /* event_list */,
826337eb1ca1Smrg    int               /* count */
826437eb1ca1Smrg#endif
826537eb1ca1Smrg);
826637eb1ca1Smrg
826737eb1ca1Smrgextern int     XGetSelectedExtensionEvents(
826837eb1ca1Smrg#if NeedFunctionPrototypes
826937eb1ca1Smrg    Display*          /* display */,
827037eb1ca1Smrg    Window          /* w */,
827137eb1ca1Smrg    int*          /* this_client_count */,
827237eb1ca1Smrg    XEventClass**     /* this_client_list */,
827337eb1ca1Smrg    int*          /* all_clients_count */,
827437eb1ca1Smrg    XEventClass**     /* all_clients_list */
827537eb1ca1Smrg#endif
827637eb1ca1Smrg);
827737eb1ca1Smrg
827837eb1ca1Smrgextern int     XChangeDeviceDontPropagateList(
827937eb1ca1Smrg#if NeedFunctionPrototypes
828037eb1ca1Smrg    Display*          /* display */,
828137eb1ca1Smrg    Window          /* window */,
828237eb1ca1Smrg    int               /* count */,
828337eb1ca1Smrg    XEventClass*     /* events */,
828437eb1ca1Smrg    int               /* mode */
828537eb1ca1Smrg#endif
828637eb1ca1Smrg);
828737eb1ca1Smrg
828837eb1ca1Smrgextern XEventClass     *XGetDeviceDontPropagateList(
828937eb1ca1Smrg#if NeedFunctionPrototypes
829037eb1ca1Smrg    Display*          /* display */,
829137eb1ca1Smrg    Window          /* window */,
829237eb1ca1Smrg    int*          /* count */
829337eb1ca1Smrg#endif
829437eb1ca1Smrg);
829537eb1ca1Smrg
829637eb1ca1Smrgextern Status     XSendExtensionEvent(
829737eb1ca1Smrg#if NeedFunctionPrototypes
829837eb1ca1Smrg    Display*          /* display */,
829937eb1ca1Smrg    XDevice*          /* device */,
830037eb1ca1Smrg    Window          /* dest */,
830137eb1ca1Smrg    Bool          /* prop */,
830237eb1ca1Smrg    int               /* count */,
830337eb1ca1Smrg    XEventClass*     /* list */,
830437eb1ca1Smrg    XEvent*          /* event */
830537eb1ca1Smrg#endif
830637eb1ca1Smrg);
830737eb1ca1Smrg
830837eb1ca1Smrgextern XDeviceTimeCoord     *XGetDeviceMotionEvents(
830937eb1ca1Smrg#if NeedFunctionPrototypes
831037eb1ca1Smrg    Display*          /* display */,
831137eb1ca1Smrg    XDevice*          /* device */,
831237eb1ca1Smrg    Time          /* start */,
831337eb1ca1Smrg    Time          /* stop */,
831437eb1ca1Smrg    int*          /* nEvents */,
831537eb1ca1Smrg    int*          /* mode */,
831637eb1ca1Smrg    int*          /* axis_count */
831737eb1ca1Smrg#endif
831837eb1ca1Smrg);
831937eb1ca1Smrg
832037eb1ca1Smrgextern int     XFreeDeviceMotionEvents(
832137eb1ca1Smrg#if NeedFunctionPrototypes
832237eb1ca1Smrg    XDeviceTimeCoord*     /* events */
832337eb1ca1Smrg#endif
832437eb1ca1Smrg);
832537eb1ca1Smrg
832637eb1ca1Smrgextern int     XFreeDeviceControl(
832737eb1ca1Smrg#if NeedFunctionPrototypes
832837eb1ca1Smrg    XDeviceControl*     /* control */
832937eb1ca1Smrg#endif
833037eb1ca1Smrg);
833137eb1ca1Smrg
833237eb1ca1Smrg_XFUNCPROTOEND
833337eb1ca1Smrg
833437eb1ca1Smrg#endif /* _XINPUT_H_ */
833537eb1ca1Smrg
833637eb1ca1Smrg/* Definitions used by the server, library and client */
833737eb1ca1Smrg
833837eb1ca1Smrg#ifndef _XI_H_
833937eb1ca1Smrg
834037eb1ca1Smrg#define _XI_H_
834137eb1ca1Smrg
834237eb1ca1Smrg#define sz_xGetExtensionVersionReq          8
834337eb1ca1Smrg#define sz_xGetExtensionVersionReply          32
834437eb1ca1Smrg#define sz_xListInputDevicesReq               4
834537eb1ca1Smrg#define sz_xListInputDevicesReply          32
834637eb1ca1Smrg#define sz_xOpenDeviceReq               8
834737eb1ca1Smrg#define sz_xOpenDeviceReply               32
834837eb1ca1Smrg#define sz_xCloseDeviceReq               8
834937eb1ca1Smrg#define sz_xSetDeviceModeReq               8
835037eb1ca1Smrg#define sz_xSetDeviceModeReply               32
835137eb1ca1Smrg#define sz_xSelectExtensionEventReq          12
835237eb1ca1Smrg#define sz_xGetSelectedExtensionEventsReq     8
835337eb1ca1Smrg#define sz_xGetSelectedExtensionEventsReply     32
835437eb1ca1Smrg#define sz_xChangeDeviceDontPropagateListReq     12
835537eb1ca1Smrg#define sz_xGetDeviceDontPropagateListReq     8
835637eb1ca1Smrg#define sz_xGetDeviceDontPropagateListReply     32
835737eb1ca1Smrg#define sz_xGetDeviceMotionEventsReq          16
835837eb1ca1Smrg#define sz_xGetDeviceMotionEventsReply          32
835937eb1ca1Smrg#define sz_xChangeKeyboardDeviceReq          8
836037eb1ca1Smrg#define sz_xChangeKeyboardDeviceReply          32
836137eb1ca1Smrg#define sz_xChangePointerDeviceReq          8
836237eb1ca1Smrg#define sz_xChangePointerDeviceReply          32
836337eb1ca1Smrg#define sz_xGrabDeviceReq               20
836437eb1ca1Smrg#define sz_xGrabDeviceReply               32
836537eb1ca1Smrg#define sz_xUngrabDeviceReq               12
836637eb1ca1Smrg#define sz_xGrabDeviceKeyReq               20
836737eb1ca1Smrg#define sz_xGrabDeviceKeyReply               32
836837eb1ca1Smrg#define sz_xUngrabDeviceKeyReq               16
836937eb1ca1Smrg#define sz_xGrabDeviceButtonReq               20
837037eb1ca1Smrg#define sz_xGrabDeviceButtonReply          32
837137eb1ca1Smrg#define sz_xUngrabDeviceButtonReq          16
837237eb1ca1Smrg#define sz_xAllowDeviceEventsReq          12
837337eb1ca1Smrg#define sz_xGetDeviceFocusReq               8
837437eb1ca1Smrg#define sz_xGetDeviceFocusReply               32
837537eb1ca1Smrg#define sz_xSetDeviceFocusReq               16
837637eb1ca1Smrg#define sz_xGetFeedbackControlReq          8
837737eb1ca1Smrg#define sz_xGetFeedbackControlReply          32
837837eb1ca1Smrg#define sz_xChangeFeedbackControlReq          12
837937eb1ca1Smrg#define sz_xGetDeviceKeyMappingReq          8
838037eb1ca1Smrg#define sz_xGetDeviceKeyMappingReply          32
838137eb1ca1Smrg#define sz_xChangeDeviceKeyMappingReq          8
838237eb1ca1Smrg#define sz_xGetDeviceModifierMappingReq          8
838337eb1ca1Smrg#define sz_xSetDeviceModifierMappingReq          8
838437eb1ca1Smrg#define sz_xSetDeviceModifierMappingReply     32
838537eb1ca1Smrg#define sz_xGetDeviceButtonMappingReq          8
838637eb1ca1Smrg#define sz_xGetDeviceButtonMappingReply          32
838737eb1ca1Smrg#define sz_xSetDeviceButtonMappingReq          8
838837eb1ca1Smrg#define sz_xSetDeviceButtonMappingReply          32
838937eb1ca1Smrg#define sz_xQueryDeviceStateReq               8
839037eb1ca1Smrg#define sz_xQueryDeviceStateReply          32
839137eb1ca1Smrg#define sz_xSendExtensionEventReq          16
839237eb1ca1Smrg#define sz_xDeviceBellReq               8
839337eb1ca1Smrg#define sz_xSetDeviceValuatorsReq          8
839437eb1ca1Smrg#define sz_xSetDeviceValuatorsReply          32
839537eb1ca1Smrg#define sz_xGetDeviceControlReq               8
839637eb1ca1Smrg#define sz_xGetDeviceControlReply          32
839737eb1ca1Smrg#define sz_xChangeDeviceControlReq          8
839837eb1ca1Smrg#define sz_xChangeDeviceControlReply          32
839937eb1ca1Smrg
840037eb1ca1Smrg#define INAME                "XInputExtension"
840137eb1ca1Smrg
840237eb1ca1Smrg#define XI_KEYBOARD     "KEYBOARD"
840337eb1ca1Smrg#define XI_MOUSE     "MOUSE"
840437eb1ca1Smrg#define XI_TABLET     "TABLET"
840537eb1ca1Smrg#define XI_TOUCHSCREEN     "TOUCHSCREEN"
840637eb1ca1Smrg#define XI_TOUCHPAD     "TOUCHPAD"
840737eb1ca1Smrg#define XI_BARCODE     "BARCODE"
840837eb1ca1Smrg#define XI_BUTTONBOX     "BUTTONBOX"
840937eb1ca1Smrg#define XI_KNOB_BOX     "KNOB_BOX"
841037eb1ca1Smrg#define XI_ONE_KNOB     "ONE_KNOB"
841137eb1ca1Smrg#define XI_NINE_KNOB     "NINE_KNOB"
841237eb1ca1Smrg#define XI_TRACKBALL     "TRACKBALL"
841337eb1ca1Smrg#define XI_QUADRATURE     "QUADRATURE"
841437eb1ca1Smrg#define XI_ID_MODULE     "ID_MODULE"
841537eb1ca1Smrg#define XI_SPACEBALL     "SPACEBALL"
841637eb1ca1Smrg#define XI_DATAGLOVE     "DATAGLOVE"
841737eb1ca1Smrg#define XI_EYETRACKER     "EYETRACKER"
841837eb1ca1Smrg#define XI_CURSORKEYS     "CURSORKEYS"
841937eb1ca1Smrg#define XI_FOOTMOUSE     "FOOTMOUSE"
842037eb1ca1Smrg
842137eb1ca1Smrg#define Dont_Check               0
842237eb1ca1Smrg#define XInput_Initial_Release          1
842337eb1ca1Smrg#define XInput_Add_XDeviceBell          2
842437eb1ca1Smrg#define XInput_Add_XSetDeviceValuators     3
842537eb1ca1Smrg#define XInput_Add_XChangeDeviceControl     4
842637eb1ca1Smrg
842737eb1ca1Smrg#define XI_Absent          0
842837eb1ca1Smrg#define XI_Present          1
842937eb1ca1Smrg
843037eb1ca1Smrg#define XI_Initial_Release_Major          1
843137eb1ca1Smrg#define XI_Initial_Release_Minor          0
843237eb1ca1Smrg
843337eb1ca1Smrg#define XI_Add_XDeviceBell_Major          1
843437eb1ca1Smrg#define XI_Add_XDeviceBell_Minor          1
843537eb1ca1Smrg
843637eb1ca1Smrg#define XI_Add_XSetDeviceValuators_Major     1
843737eb1ca1Smrg#define XI_Add_XSetDeviceValuators_Minor     2
843837eb1ca1Smrg
843937eb1ca1Smrg#define XI_Add_XChangeDeviceControl_Major     1
844037eb1ca1Smrg#define XI_Add_XChangeDeviceControl_Minor     3
844137eb1ca1Smrg
844237eb1ca1Smrg#define DEVICE_RESOLUTION     1
844337eb1ca1Smrg
844437eb1ca1Smrg#define NoSuchExtension          1
844537eb1ca1Smrg
844637eb1ca1Smrg#define COUNT               0
844737eb1ca1Smrg#define CREATE               1
844837eb1ca1Smrg
844937eb1ca1Smrg#define NewPointer          0
845037eb1ca1Smrg#define NewKeyboard          1
845137eb1ca1Smrg
845237eb1ca1Smrg#define XPOINTER          0
845337eb1ca1Smrg#define XKEYBOARD          1
845437eb1ca1Smrg
845537eb1ca1Smrg#define UseXKeyboard          0xFF
845637eb1ca1Smrg
845737eb1ca1Smrg#define IsXPointer          0
845837eb1ca1Smrg#define IsXKeyboard          1
845937eb1ca1Smrg#define IsXExtensionDevice     2
846037eb1ca1Smrg
846137eb1ca1Smrg#define AsyncThisDevice          0
846237eb1ca1Smrg#define SyncThisDevice          1
846337eb1ca1Smrg#define ReplayThisDevice     2
846437eb1ca1Smrg#define AsyncOtherDevices     3
846537eb1ca1Smrg#define AsyncAll          4
846637eb1ca1Smrg#define SyncAll               5
846737eb1ca1Smrg
846837eb1ca1Smrg#define FollowKeyboard           3
846937eb1ca1Smrg#define RevertToFollowKeyboard      3
847037eb1ca1Smrg
847137eb1ca1Smrg#define DvAccelNum              (1L &lt;&lt; 0)
847237eb1ca1Smrg#define DvAccelDenom            (1L &lt;&lt; 1)
847337eb1ca1Smrg#define DvThreshold             (1L &lt;&lt; 2)
847437eb1ca1Smrg
847537eb1ca1Smrg#define DvKeyClickPercent     (1L&lt;&lt;0)
847637eb1ca1Smrg#define DvPercent          (1L&lt;&lt;1)
847737eb1ca1Smrg#define DvPitch               (1L&lt;&lt;2)
847837eb1ca1Smrg#define DvDuration          (1L&lt;&lt;3)
847937eb1ca1Smrg#define DvLed               (1L&lt;&lt;4)
848037eb1ca1Smrg#define DvLedMode          (1L&lt;&lt;5)
848137eb1ca1Smrg#define DvKey               (1L&lt;&lt;6)
848237eb1ca1Smrg#define DvAutoRepeatMode     (1L&lt;&lt;7)
848337eb1ca1Smrg
848437eb1ca1Smrg#define DvString                (1L &lt;&lt; 0)
848537eb1ca1Smrg
848637eb1ca1Smrg#define DvInteger               (1L &lt;&lt; 0)
848737eb1ca1Smrg
848837eb1ca1Smrg#define DeviceMode              (1L &lt;&lt; 0)
848937eb1ca1Smrg#define Relative                0
849037eb1ca1Smrg#define Absolute                1
849137eb1ca1Smrg
849237eb1ca1Smrg#define ProximityState          (1L &lt;&lt; 1)
849337eb1ca1Smrg#define InProximity             (0L &lt;&lt; 1)
849437eb1ca1Smrg#define OutOfProximity          (1L &lt;&lt; 1)
849537eb1ca1Smrg
849637eb1ca1Smrg#define AddToList               0
849737eb1ca1Smrg#define DeleteFromList          1
849837eb1ca1Smrg
849937eb1ca1Smrg#define KeyClass            0
850037eb1ca1Smrg#define ButtonClass            1
850137eb1ca1Smrg#define ValuatorClass            2
850237eb1ca1Smrg#define FeedbackClass            3
850337eb1ca1Smrg#define ProximityClass       4
850437eb1ca1Smrg#define FocusClass            5
850537eb1ca1Smrg#define OtherClass            6
850637eb1ca1Smrg
850737eb1ca1Smrg#define KbdFeedbackClass       0
850837eb1ca1Smrg#define PtrFeedbackClass       1
850937eb1ca1Smrg#define StringFeedbackClass       2
851037eb1ca1Smrg#define IntegerFeedbackClass       3
851137eb1ca1Smrg#define LedFeedbackClass       4
851237eb1ca1Smrg#define BellFeedbackClass       5
851337eb1ca1Smrg
851437eb1ca1Smrg#define _devicePointerMotionHint 0
851537eb1ca1Smrg#define _deviceButton1Motion      1
851637eb1ca1Smrg#define _deviceButton2Motion      2
851737eb1ca1Smrg#define _deviceButton3Motion      3
851837eb1ca1Smrg#define _deviceButton4Motion      4
851937eb1ca1Smrg#define _deviceButton5Motion      5
852037eb1ca1Smrg#define _deviceButtonMotion      6
852137eb1ca1Smrg#define _deviceButtonGrab      7
852237eb1ca1Smrg#define _deviceOwnerGrabButton      8
852337eb1ca1Smrg#define _noExtensionEvent      9
852437eb1ca1Smrg
852537eb1ca1Smrg#define XI_BadDevice     0
852637eb1ca1Smrg#define XI_BadEvent     1
852737eb1ca1Smrg#define XI_BadMode     2
852837eb1ca1Smrg#define XI_DeviceBusy     3
852937eb1ca1Smrg#define XI_BadClass     4
853037eb1ca1Smrg
853137eb1ca1Smrgtypedef     unsigned long     XEventClass;
853237eb1ca1Smrg
853337eb1ca1Smrg/*******************************************************************
853437eb1ca1Smrg *
853537eb1ca1Smrg * Extension version structure.
853637eb1ca1Smrg *
853737eb1ca1Smrg */
853837eb1ca1Smrg
853937eb1ca1Smrgtypedef struct {
854037eb1ca1Smrg        int        present;
854137eb1ca1Smrg        short     major_version;
854237eb1ca1Smrg        short     minor_version;
854337eb1ca1Smrg} XExtensionVersion;
854437eb1ca1Smrg
854537eb1ca1Smrg#endif /* _XI_H_ */
854637eb1ca1Smrg
854737eb1ca1Smrg</literallayout>
854837eb1ca1Smrg<!-- .\" print Table of Contents -->
854937eb1ca1Smrg<!-- .if o .bp \" blank page to make count even -->
855037eb1ca1Smrg<!-- .bp 1 -->
855137eb1ca1Smrg<!-- .af PN i -->
855237eb1ca1Smrg<!-- .PX -->
855337eb1ca1Smrg
855437eb1ca1Smrg
855537eb1ca1Smrg</para>
855637eb1ca1Smrg</sect3>
855737eb1ca1Smrg</sect2>
855837eb1ca1Smrg</sect1>
855937eb1ca1Smrg</chapter>
8560