-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathXIproto.txt
2542 lines (2066 loc) · 106 KB
/
XIproto.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
X11 Input Extension Protocol Specification
Version 1.0
X Consortium Standard
X Version 11, Release 6.8
Mark Patrick, Ardent Computer
George Sachs, Hewlett-Packard
Version 1.5
Peter Hutterer
Copyright © 1989, 1990, 1991 by Hewlett-Packard Company and
Ardent Computer
Permission to use, copy, modify, and distribute this
documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice and this
permission notice appear in all copies. Ardent and
Hewlett-Packard make no representations about the suitability
for any purpose of the information in this document. It is
provided "as is" without express or implied warranty. Copyright
© 1989, 1990, 1991, 1992 X Consortium
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the “Software”), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Except as contained in this notice, the name of the X
Consortium shall not be used in advertising or otherwise to
promote the sale, use or other dealings in this Software
without prior written authorization from the X Consortium. X
Window System is a trademark of The Open Group.
Copyright © 2008 by Peter Hutterer
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice
(including the next paragraph) shall be included in all copies
or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
1. Input Extension Overview
This document defines an extension to the X11 protocol to
support input devices other than the core X keyboard and
pointer. An accompanying document defines a corresponding
extension to Xlib (similar extensions for languages other than
C are anticipated). This first section gives an overview of the
input extension. The next section defines the new protocol
requests defined by the extension. We conclude with a
description of the new input events generated by the additional
input devices.
This document only describes the behaviour of servers supporting
up to the X Input Extension 1.5. For servers supporting the X
Input Extensions 2.0, see XI2proto.txt. New clients are discouraged
from using this protocol specification. Instead, the use of XI 2.x
is recommended.
1.1 Design Approach
The design approach of the extension is to define requests and
events analogous to the core requests and events. This allows
extension input devices to be individually distinguishable from
each other and from the core input devices. These requests and
events make use of a device identifier and support the
reporting of n-dimensional motion data as well as other data
that is not reportable via the core input events.
1.2 Core Input Devices
The X server core protocol supports two input devices: a
pointer and a keyboard. The pointer device has two major
functions. First, it may be used to generate motion information
that client programs can detect. Second, it may also be used to
indicate the current location and focus of the X keyboard. To
accomplish this, the server echoes a cursor at the current
position of the X pointer. Unless the X keyboard has been
explicitly focused, this cursor also shows the current location
and focus of the X keyboard. The X keyboard is used to generate
input that client programs can detect.
In servers supporting XI 1.4 and above, the core pointer and
the core keyboard are virtual devices that do not represent a
physical device connected to the host computer.
In servers supporting XI 2.0 and above, there may be multiple
core pointers and keyboards. Refer to XI2proto.txt for more
information.
The X keyboard and X pointer are referred to in this document
as the core devices, and the input events they generate
(KeyPress, KeyRelease, ButtonPress, ButtonRelease, and
MotionNotify) are known as the core input events. All other
input devices are referred to as extension input devices and
the input events they generate are referred to as extension
input events.
In servers supporting only XI 1.x, this input extension does
not change the behavior or functionality of the core input
devices, core events, or core protocol requests, with the
exception of the core grab requests. These requests may affect
the synchronization of events from extension devices. See the
explanation in the section titled "Event Synchronization and
Core Grabs".
Selection of the physical devices to be initially used by the
server as the core devices is left implementation-dependent.
Requests are defined that allow client programs to change which
physical devices are used as the core devices.
1.3 Extension Input Devices
The input extension v1.x controls access to input devices other
than the X keyboard and X pointer. It allows client programs to
select input from these devices independently from each other
and independently from the core devices.
A client that wishes to access a specific device must first
determine whether that device is connected to the X server.
This is done through the ListInputDevices request, which will
return a list of all devices that can be opened by the X
server. A client can then open one or more of these devices
using the OpenDevice request, specify what events they are
interested in receiving, and receive and process input events
from extension devices in the same way as events from the X
keyboard and X pointer. Input events from these devices are of
extension types ( DeviceKeyPress, DeviceKeyRelease,
DeviceButtonPress, DeviceButtonRelease, DeviceMotionNotify,
etc.) and contain a device identifier so that events of the
same type coming from different input devices can be
distinguished.
Any kind of input device may be used as an extension input
device. Extension input devices may have 0 or more keys, 0 or
more buttons, and may report 0 or more axes of motion. Motion
may be reported as relative movements from a previous position
or as an absolute position. All valuators reporting motion
information for a given extension input device must report the
same kind of motion information (absolute or relative).
This extension is designed to accommodate new types of input
devices that may be added in the future. The protocol requests
that refer to specific characteristics of input devices
organize that information by input classes. Server implementors
may add new classes of input devices without changing the
protocol requests. Input classes are unique numbers registered
with the X Consortium. Each extension input device may support
multiple input classes.
In XI 1.x, all extension input devices are treated like the
core X keyboard in determining their location and focus. The
server does not track the location of these devices on an
individual basis, and therefore does not echo a cursor to
indicate their current location. Instead, their location is
determined by the location of the core X pointer. Like the core
X keyboard, some may be explicitly focused. If they are not
explicitly focused, their focus is determined by the location
of the core X pointer.
Most input events reported by the server to a client are of
fixed size (32 bytes). In order to represent the change in
state of an input device the extension may need to generate a
sequence of input events. A client side library (such as Xlib)
will typically take these raw input events and format them into
a form more convenient to the client.
1.4 Event Classes
In the core protocol a client registers interest in receiving
certain input events directed to a window by modifying that
window's event-mask. Most of the bits in the event mask are
already used to specify interest in core X events. The input
extension specifies a different mechanism by which a client can
express interest in events generated by this extension.
When a client opens a extension input device via the OpenDevice
request, an XDevice structure is returned. Macros are provided
that extract 32-bit numbers called event classes from that
structure, that a client can use to register interest in
extension events via the SelectExtensionEvent request. The
event class combines the desired event type and device id, and
may be thought of as the equivalent of core event masks.
1.5 Input Classes
Some of the input extension requests divide input devices into
classes based on their functionality. This is intended to allow
new classes of input devices to be defined at a later time
without changing the semantics of these requests. The following
input device classes are currently defined:
KEY
The device reports key events.
BUTTON
The device reports button events.
VALUATOR
The device reports valuator data in motion events.
PROXIMITY
The device reports proximity events.
FOCUS
The device can be focused and reports focus events.
FEEDBACK
The device supports feedbacks.
OTHER
The ChangeDeviceNotify, DeviceMappingNotify, and
DeviceStateNotify macros may be invoked passing the
XDevice structure returned for this device.
Each extension input device may support multiple input classes.
Additional classes may be added in the future. Requests that
support multiple input classes, such as the ListInputDevices
function that lists all available input devices, organize the
data they return by input class. Client programs that use these
requests should not access data unless it matches a class
defined at the time those clients were compiled. In this way,
new classes can be added without forcing existing clients that
use these requests to be recompiled.
2. Requests
Extension input devices are accessed by client programs through
the use of new protocol requests. This section summarizes the
new requests defined by this extension. The syntax and type
definitions used below follow the notation used for the X11
core protocol.
2.1 Getting the Extension Version
The GetExtensionVersion request returns version information
about the input extension.
GetExtensionVersion
name: STRING
=>
present: BOOL
protocol-major-version: CARD16
protocol-minor-version: CARD16
The protocol version numbers returned indicate the version of
the input extension supported by the target X server. The
version numbers can be compared to constants defined in the
header file XI.h. Each version is a superset of the previous
versions.
The name must be the name of the Input Extension as defined
in the header file XI.h.
2.2 Listing Available Devices
A client that wishes to access a specific device must first
determine whether that device is connected to the X server.
This is done through the ListInputDevices request, which will
return a list of all devices that can be opened by the X
server.
ListInputDevices
=>
input-devices: ListOfDeviceInfo
where
DEVICEINFO:
[type: ATOM
id: CARD8
num_classes: CARD8
use: {IsXKeyboard, IsXPointer, IsXExtensionPointer,
IsXExtensionKeyboard, IsExtensionDevice}
info: LISTofINPUTINFO
name: STRING8]
INPUTINFO: {KEYINFO, BUTTONINFO, VALUATORINFO}
KEYINFO:
[class: CARD8
length: CARD8
min-keycode: KEYCODE
max-keycode: KEYCODE
num-keys: CARD16]
BUTTONINFO:
[class: CARD8
length: CARD8
num-buttons: CARD16]
VALUATORINFO:
[class: CARD8
length: CARD8
num_axes: CARD8
mode: SETofDEVICEMODE
motion_buffer_size: CARD32
axes: LISTofAXISINFO]
AXISINFO:
[resolution: CARD32
min-val: CARD32
max-val: CARD32]
DEVICEMODE: {Absolute, Relative}
Errors: None
This request returns a list of all devices that can be opened
by the X server, including the core X keyboard and X pointer.
Some implementations may open all input devices as part of X
initialization, while others may not open an input device until
requested to do so by a client program.
The information returned for each device is as follows:
type
The type field is of type Atom and indicates the nature
of the device. Clients may determine device types by
invoking the XInternAtom request passing one of the
names defined in the header file XI.h. The following
names have been defined to date:
MOUSE
TABLET
KEYBOARD
TOUCHSCREEN
TOUCHPAD
BUTTONBOX
BARCODE
KNOB_BOX
TRACKBALL
QUADRATURE
SPACEBALL
DATAGLOVE
EYETRACKER
CURSORKEYS
FOOTMOUSE
ID_MODULE
ONE_KNOB
NINE_KNOB
JOYSTICK
id
The id is a small cardinal value in the range 0-128 that
uniquely identifies the device. It is assigned to the
device when it is initialized by the server. Some
implementations may not open an input device until
requested by a client program, and may close the device
when the last client accessing it requests that it be
closed. If a device is opened by a client program via
XOpenDevice, then closed via XCloseDevice, then opened
again, it is not guaranteed to have the same id after
the second open request.
num_classes
The num_classes field is a small cardinal value in the
range 0-255 that specifies the number of input classes
supported by the device for which information is
returned by ListInputDevices. Some input classes, such
as class Focus and class Proximity do not have any
information to be returned by ListInputDevices.
use
The use field specifies how the device is currently
being used. If the value is IsXKeyboard, the device is
currently being used as the X keyboard. If the value is
IsXPointer, the device is currently being used as the X
pointer. If the value is IsXExtensionPointer, the device
is available for use as an extension pointer. If the value
is IsXExtensionKeyboard, the device is available for use as
and extension keyboard.
Older versions of XI report all extension devices as
IsXExtensionDevice.
name
The name field contains a pointer to a null-terminated
string that corresponds to one of the defined device
types.
InputInfo
InputInfo is one of: KeyInfo, ButtonInfo or
ValuatorInfo. The first two fields are common to all
three:
class
The class field is a cardinal value in the range
0-255. It uniquely identifies the class of input
for which information is returned.
length
The length field is a cardinal value in the range
0-255. It specifies the number of bytes of data
that are contained in this input class. The length
includes the class and length fields.
The remaining information returned for input class
KEYCLASS is as follows:
min_keycode
min_keycode is of type KEYCODE. It specifies the
minimum keycode that the device will report. The
minimum keycode will not be smaller than 8.
max_keycode
max_keycode is of type KEYCODE. It specifies the
maximum keycode that the device will report. The
maximum keycode will not be larger than 255.
num_keys
num_keys is a cardinal value that specifies the
number of keys that the device has.
The remaining information returned for input class
BUTTONCLASS is as follows:
num_buttons
num_buttons is a cardinal value that specifies the
number of buttons that the device has.
The remaining information returned for input class
VALUATORCLASS is as follows:
mode
mode is a constant that has one of the following
values: Absolute or Relative. Some devices allow
the mode to be changed dynamically via the
SetDeviceMode request.
motion_buffer_size
motion_buffer_size is a cardinal number that
specifies the number of elements that can be
contained in the motion history buffer for the
device.
axes
The axes field contains a pointer to an AXISINFO
struture.
The information returned for each axis reported by the
device is:
resolution
The resolution is a cardinal value in
counts/meter.
min_val
The min_val field is a cardinal value in that
contains the minimum value the device reports for
this axis. For devices whose mode is Relative, the
min_val field will contain 0.
max_val
The max_val field is a cardinal value in that
contains the maximum value the device reports for
this axis. For devices whose mode is Relative, the
max_val field will contain 0.
2.3 Enabling Devices
Client programs that wish to access an extension device must
request that the server open that device. This is done via the
OpenDevice request.
OpenDevice
id: CARD8
=>
DEVICE:
[device_id: XID
num_classes: INT32
classes: LISTofINPUTCLASSINFO]
INPUTCLASSINFO:
[input_class: CARD8
event_type_base: CARD8]
Errors: Device
This request returns the event classes to be used by the client
to indicate which events the client program wishes to receive.
Each input class may report several event classes. For example,
input class Keys reports DeviceKeyPress and DeviceKeyRelease
event classes. Input classes are unique numbers registered with
the X Consortium. Input class Other exists to report event
classes that are not specific to any one input class, such as
DeviceMappingNotify, ChangeDeviceNotify, and DeviceStateNotify.
The information returned for each device is as follows:
device_id
The device_id is a number that uniquely identifies the
device.
num_classes
The num_classes field contains the number of input
classes supported by this device.
For each class of input supported by the device, the
InputClassInfo structure contains the following information:
input_class
The input_class is a small cardinal number that
identifies the class of input.
event_type_base
The event_type_base is a small cardinal number that
specifies the event type of one of the events reported
by this input class. This information is not directly
used by client programs. Instead, the Device is used by
macros that return extension event types and event
classes. This is described in the section of this
document entitled "Selecting Extension Device Events".
The information in the InputClassInfo reflects the state of
this device at the time the request was processed.
Before it exits, the client program should explicitly request
that the server close the device. This is done via the
CloseDevice request.
A client may open the same extension device more than once.
Requests after the first successful one return an additional
XDevice structure with the same information as the first, but
otherwise have no effect. A single CloseDevice request will
terminate that client's access to the device.
Closing a device releases any active or passive grabs the
requesting client has established. If the device is frozen only
by an active grab of the requesting client, the queued events
are released when the client terminates.
If a client program terminates without closing a device, the
server will automatically close that device on behalf of the
client. This does not affect any other clients that may be
accessing that device.
CloseDevice:
device: DEVICE
Errors: Device
2.4 Changing The Mode Of A Device
Some devices are capable of reporting either relative or
absolute motion data. To change the mode of a device from
relative to absolute, use the SetDeviceMode request. The valid
values are Absolute or Relative.
This request will fail and return DeviceBusy if another client
already has the device open with a different mode. It will fail
and return AlreadyGrabbed if another client has the device
grabbed. The request will fail with a BadMatch error if the
requested mode is not supported by the device.
SetDeviceMode
device:DEVICE
mode: {Absolute, Relative}
=>
status: {Success, DeviceBusy, AlreadyGrabbed}
Errors: Device, Match, Mode
2.5 Initializing Valuators on an Input Device
Some devices that report absolute positional data can be
initialized to a starting value. Devices that are capable of
reporting relative motion or absolute positional data may
require that their valuators be initialized to a starting value
after the mode of the device is changed to Absolute. To
initialize the valuators on such a device, use the
SetDeviceValuators request.
SetDeviceValuators
device: DEVICE
first_valuator: CARD8
num_valuators: CARD8
valuators: LISTOFINT32
=>
status: {Success, AlreadyGrabbed}
Errors: Length, Device, Match, Value
This request initializes the specified valuators on the
specified extension input device. Valuators are numbered
beginning with zero. Only the valuators in the range specified
by first_valuator and num_valuators are set. If the number of
valuators supported by the device is less than the expression
first_valuator + num_valuators, a Value error will result.
If the request succeeds, Success is returned. If the specifed
device is grabbed by some other client, the request will fail
and a status of AlreadyGrabbed will be returned.
2.6 Getting Input Device Controls
GetDeviceControl
device: DEVICE
control: XID
=>
controlState: {DeviceState}
where
DeviceState: DeviceResolutionState
Errors: Length, Device, Match, Value
This request returns the current state of the specified device
control. The device control must be supported by the target
server and device or an error will result.
If the request is successful, a pointer to a generic
DeviceState structure will be returned. The information
returned varies according to the specified control and is
mapped by a structure appropriate for that control.
GetDeviceControl will fail with a BadValue error if the server
does not support the specified control. It will fail with a
BadMatch error if the device does not support the specified
control.
Supported device controls and the information returned for them
include:
DEVICE_RESOLUTION:
[control: CARD16
length: CARD16
num_valuators: CARD8
resolutions: LISTofCARD32
min_resolutions: LISTofCARD32
max_resolutions: LISTofCARD32]
This device control returns a list of valuators and the range
of valid resolutions allowed for each. Valuators are numbered
beginning with 0. Resolutions for all valuators on the device
are returned. For each valuator i on the device, resolutions[i]
returns the current setting of the resolution,
min_resolutions[i] returns the minimum valid setting, and
max_resolutions[i] returns the maximum valid setting.
When this control is specified, XGetDeviceControl will fail
with a BadMatch error if the specified device has no valuators.
ChangeDeviceControl:
device: DEVICE
XID: controlId
control: DeviceControl
where
DeviceControl: DeviceResolutionControl
=>
status: {Success, DeviceBusy, AlreadyGrabbed}
Errors: Length, Device, Match, Value
ChangeDeviceControl changes the specifed device control
according to the values specified in the DeviceControl
structure. The device control must be supported by the target
server and device or an error will result.
The information passed with this request varies according to
the specified control and is mapped by a structure appropriate
for that control.
ChangeDeviceControl will fail with a BadValue error if the
server does not support the specified control. It will fail
with a BadMatch error if the server supports the specified
control, but the requested device does not. The request will
fail and return a status of DeviceBusy if another client
already has the device open with a device control state that
conflicts with the one specified in the request. It will fail
with a status of AlreadyGrabbed if some other client has
grabbed the specified device. If the request succeeds, Success
is returned. If it fails, the device control is left unchanged.
Supported device controls and the information specified for
them include:
DEVICE_RESOLUTION:
[control: CARD16
length: CARD16
first_valuator: CARD8
num_valuators: CARD8
resolutions: LISTofCARD32]
This device control changes the resolution of the specified
valuators on the specified extension input device. Valuators
are numbered beginning with zero. Only the valuators in the
range specified by first_valuator and num_valuators are set. A
value of -1 in the resolutions list indicates that the
resolution for this valuator is not to be changed.
num_valuators specifies the number of valuators in the
resolutions list.
When this control is specified, XChangeDeviceControl will fail
with a BadMatch error if the specified device has no valuators.
If a resolution is specified that is not within the range of
valid values (as returned by XGetDeviceControl) the request
will fail with a BadValue error. If the number of valuators
supported by the device is less than the expression
first_valuator + num_valuators, a BadValue error will result.
If the request fails for any reason, none of the valuator
resolutions will be changed.
ChangeDeviceControl causes the server to send a DevicePresence
event to interested clients.
2.7 Selecting Extension Device Events
Extension input events are selected using the
SelectExtensionEvent request.
SelectExtensionEvent
interest: LISTofEVENTCLASS
window: WINDOW
Errors: Window, Class, Access
This request specifies to the server the events within the
specified window which are of interest to the client. As with
the core XSelectInput function, multiple clients can select
input on the same window.
XSelectExtensionEvent requires a list of event classes. An
event class is a 32-bit number that combines an event type and
device id, and is used to indicate which event a client wishes
to receive and from which device it wishes to receive it.
Macros are provided to obtain event classes from the data
returned by the XOpenDevice request. The names of these macros
correspond to the desired events, i.e. the DeviceKeyPress is
used to obtain the event class for DeviceKeyPress events. The
syntax of the macro invocation is:
DeviceKeyPress (device, event_type, event_class);
device: DEVICE
event_type: INT
event_class: INT
The value returned in event_type is the value that will be
contained in the event type field of the XDeviceKeyPressEvent
when it is received by the client. The value returned in
event_class is the value that should be passed in making an
XSelectExtensionEvent request to receive DeviceKeyPress events.
For DeviceButtonPress events, the client may specify whether or
not an implicit passive grab should be done when the button is
pressed. If the client wants to guarantee that it will receive
a DeviceButtonRelease event for each DeviceButtonPress event it
receives, it should specify the DeviceButtonPressGrab event
class as well as the DeviceButtonPress event class. This
restricts the client in that only one client at a time may
request DeviceButtonPress events from the same device and
window if any client specifies this class.
If any client has specified the DeviceButtonPressGrab class,
any requests by any other client that specify the same device
and window and specify DeviceButtonPress or
DeviceButtonPressGrab will cause an Access error to be
generated.
If only the DeviceButtonPress class is specified, no implicit
passive grab will be done when a button is pressed on the
device. Multiple clients may use this class to specify the same
device and window combination.
A client may also specify the DeviceOwnerGrabButton class. If
it has specified both the DeviceButtonPressGrab and the
DeviceOwnerGrabButton classes, implicit passive grabs will
activate with owner_events set to True. If only the
DeviceButtonPressGrab class is specified, implicit passive
grabs will activate with owner_events set to False.
The client may select DeviceMotion events only when a button is
down. It does this by specifying the event classes
Button1Motion through Button5Motion, or ButtonMotion. An input
device will only support as many button motion classes as it
has buttons.
2.8 Determining Selected Events
To determine which extension events are currently selected from
a given window, use GetSelectedExtensionEvents.
GetSelectedExtensionEvents
window: WINDOW
=>
this-client: LISTofEVENTCLASS
all-clients: LISTofEVENTCLASS
Errors: Window
This request returns two lists specifying the events selected
on the specified window. One list gives the extension events
selected by this client from the specified window. The other
list gives the extension events selected by all clients from
the specified window. This information is equivalent to that
returned by your-event-mask and all-event-masks in a
GetWindowAttributes request.
2.9 Controlling Event Propagation
Extension events propagate up the window hierarchy in the same
manner as core events. If a window is not interested in an
extension event, it usually propagates to the closest ancestor
that is interested, unless the dont_propagate list prohibits
it. Grabs of extension devices may alter the set of windows
that receive a particular extension event.
Client programs may control extension event propagation through
the use of the following two requests.
XChangeDeviceDontPropagateList adds an event to or deletes an
event from the do_not_propagate list of extension events for
the specified window. This list is maintained for the life of
the window, and is not altered if the client terminates.
ChangeDeviceDontPropagateList
window: WINDOW
eventclass: LISTofEVENTCLASS
mode: {AddToList, DeleteFromList}
Errors: Window, Class, Mode
This function modifies the list specifying the events that are
not propagated to the ancestors of the specified window. You
may use the modes AddToList or DeleteFromList.
GetDeviceDontPropagateList
window: WINDOW
Errors: Window
=>
dont-propagate-list: LISTofEVENTCLASS
This function returns a list specifying the events that are not
propagated to the ancestors of the specified window.
2.10 Sending Extension Events
One client program may send an event to another via the
XSendExtensionEvent function.
The event in the XEvent structure must be one of the events
defined by the input extension, so that the X server can
correctly byte swap the contents as necessary. The contents of
the event are otherwise unaltered and unchecked by the X server
except to force send_event to True in the forwarded event and
to set the sequence number in the event correctly.
XSendExtensionEvent returns zero if the conversion-to-wire
protocol failed, otherwise it returns nonzero.
SendExtensionEvent
device: DEVICE
destination: WINDOW
propagate: BOOL
eventclass: LISTofEVENTCLASS
event: XEVENT
Errors: Device, Value, Class, Window
2.11 Getting Motion History
GetDeviceMotionEvents
device: DEVICE
start, stop: TIMESTAMP or CurrentTime
=>
nevents_return: CARD32
mode_return: {Absolute, Relative}
axis_count_return: CARD8
events: LISTofDEVICETIMECOORD
where
DEVICETIMECOORD:
[data: LISTofINT32
time: TIMESTAMP]
Errors: Device, Match
This request returns all positions in the device's motion
history buffer that fall between the specified start and stop
times inclusive. If the start time is in the future, or is
later than the stop time, no positions are returned.
The data field of the DEVICETIMECOORD structure is a sequence
of data items. Each item is of type INT32, and there is one
data item per axis of motion reported by the device. The number
of axes reported by the device is returned in the axis_count
variable.
The value of the data items depends on the mode of the device,
which is returned in the mode variable. If the mode is
Absolute, the data items are the raw values generated by the
device. These may be scaled by the client program using the
maximum values that the device can generate for each axis of
motion that it reports. The maximum and minimum values for each
axis are reported by the ListInputDevices request.
If the mode is Relative, the data items are the relative values
generated by the device. The client program must choose an
initial position for the device and maintain a current position
by accumulating these relative values.
2.12 Changing The Core Devices
These requests are provided to change which physical device is
used as the X pointer or X keyboard. These requests are
deprecated in servers supporting XI 1.4 and above, and will
always return a a BadDevice error.
Using these requests may change the characteristics of the core
devices. The new pointer device may have a different number of
buttons than the old one did, or the new keyboard device may
have a different number of keys or report a different range of
keycodes. Client programs may be running that depend on those
characteristics. For example, a client program could allocate
an array based on the number of buttons on the pointer device,
and then use the button numbers received in button events as
indicies into that array. Changing the core devices could cause
such client programs to behave improperly or abnormally
terminate.
These requests change the X keyboard or X pointer device and
generate an ChangeDeviceNotify event and a MappingNotify event.
The ChangeDeviceNotify event is sent only to those clients that
have expressed an interest in receiving that event via the
XSelectExtensionEvent request. The specified device becomes the
new X keyboard or X pointer device. The location of the core
device does not change as a result of this request.
These requests fail and return AlreadyGrabbed if either the
specified device or the core device it would replace are
grabbed by some other client. They fail and return GrabFrozen
if either device is frozen by the active grab of another
client.
These requests fail with a BadDevice error if the specified
device is invalid, or has not previously been opened via
OpenDevice. To change the X keyboard device, use the
ChangeKeyboardDevice request. The specified device must support
input class Keys (as reported in the ListInputDevices request)
or the request will fail with a BadMatch error. Once the device
has successfully replaced one of the core devices, it is
treated as a core device until it is in turn replaced by
another ChangeDevice request, or until the server terminates.
The termination of the client that changed the device will not
cause it to change back. Attempts to use the CloseDevice
request to close the new core device will fail with a BadDevice
error.
The focus state of the new keyboard is the same as the focus
state of the old X keyboard. If the new keyboard was not
initialized with a FocusRec, one is added by the
ChangeKeyboardDevice request. The X keyboard is assumed to have
a KbdFeedbackClassRec. If the device was initialized without a
KbdFeedbackClassRec, one will be added by this request. The
KbdFeedbackClassRec will specify a null routine as the control
procedure and the bell procedure.
ChangeKeyboardDevice
device: DEVICE
Errors: Device, Match
=>
status: Success, AlreadyGrabbed, Frozen
To change the X pointer device, use the ChangePointerDevice
request. The specified device must support input class
Valuators (as reported in the ListInputDevices request) or the
request will fail with a BadMatch error. The valuators to be
used as the x- and y-axes of the pointer device must be
specified. Data from other valuators on the device will be
ignored.