.\" $Xorg: encoding.ms,v 1.3 2000/08/17 19:42:37 cpqbld Exp $
\&
.sp 1
.XS
Appendix A \- Input Extension Protocol Encoding
.XE
.ce 2
.ps 11
.nr PS 11
.ps +2
\fBAppendix A\fP

\fBInput Extension Protocol Encoding\fP
.ps
.sp 2
.LP
.ps 9
.nr PS 9
.vs 10
.nr VS 10
.\"The sections in this appendix correspond to their number counterparts
.\"in the protocol document.
.ps +2
\fBSyntactic Conventions\fP
.ps -3
.LP
All numbers are in decimal, 
unless prefixed with #x, in which case they are in hexadecimal (base 16).
.LP
The general syntax used to describe requests, replies, errors, events, and
compound types is:
.LP
.DS I
\fBNameofThing\fP
  encode-form
  ...
  encode-form
.DE
Each encode-form describes a single component.
.LP
For components described in the protocol as:
.LP
.DS I
name: TYPE
.DE
the encode-form is:
.LP
.DS I
.TA 1i 1.5i 2.5i
.ta 1i 1.5i 2.5i
N	TYPE	name
.DE
N is the number of bytes occupied in the data stream, 
and TYPE is the interpretation of those bytes.
For example,
.LP
.DS I
.TA 1i 1.5i
.ta 1i 1.5i
depth: CARD8
.DE
becomes:
.LP
.DS I
.TA 1i 1.5i 2.5i 
.ta 1i 1.5i 2.5i
1	CARD8	depth
.DE
For components with a static numeric value the encode-form is:
.LP
.DS I
.TA 1i 1.5i 2.5i
.ta 1i 1.5i 2.5i
N	value	name
.DE
The value is always interpreted as an N-byte unsigned integer.
For example, 
the first two bytes of a Window error are always zero (indicating an
error in general) and three (indicating the Window error in particular):
.LP
.DS I
.TA 1i 1.5i 2.5i
.ta 1i 1.5i 2.5i
1	0	Error
1	3	code
.DE
For components described in the protocol as:
.LP
.DS I
name: \fB{Name1, ..., NameI}\fP
.DE
.LP
the encode-form is:
.LP
.DS I
.TA 1i 1.5i 2.5i
.ta 1i 1.5i 2.5i
N		name
	value1 Name1
	...
	valueI NameI
.DE
The value is always interpreted as an N-byte unsigned integer.
Note that the size of N is sometimes larger than that strictly required 
to encode the values.
For example:
.LP
.DS I
class: \fB{InputOutput, InputOnly, CopyFromParent}\fP
.DE
.LP
becomes:
.LP
.DS I
.TA 1i 1.5i 2.5i 3i
.ta 1i 1.5i 2.5i 3i
2			class
	0	CopyFromParent
	1	InputOutput
	2	InputOnly
.DE
For components described in the protocol as:
.LP
.DS I
NAME: TYPE or \fBAlternative1 ... or AlternativeI\fP
.DE
.LP
the encode-form is:
.LP
.DS I
.TA 1i 1.5i 2i 2.5i 3i
.ta 1i 1.5i 2i 2.5i 3i
N	TYPE			NAME
	value1	Alternative1
	...
	valueI	AlternativeI
.DE
The alternative values are guaranteed not to conflict with the encoding
of TYPE.  
For example:
.LP
.DS
destination: WINDOW or \fBPointerWindow\fP or \fBInputFocus\fP
.DE
.LP
becomes:
.LP
.DS I
.TA 1i 1.5i 2.5i
.ta 1i 1.5i 2.5i
4	WINDOW		destination
	0	PointerWindow
	1	InputFocus
.DE
For components described in the protocol as:
.LP
.DS I
.TA 1i 1.5i
.ta 1i 1.5i
value-mask: BITMASK
.DE
the encode-form is:
.LP
.DS I
.TA 1i 1.5i 2i 2.5i 
.ta 1i 1.5i 2i 2.5i
N	BITMASK			value-mask
	mask1	mask-name1
	...
	maskI	mask-nameI
.DE
The individual bits in the mask are specified and named, 
and N is 2 or 4.
The most-significant bit in a BITMASK is reserved for use in defining
chained (multiword) bitmasks, as extensions augment existing core requests.
The precise interpretation of this bit is not yet defined here, 
although a probable mechanism is that a 1-bit indicates that another N bytes 
of bitmask follows, with bits within the overall mask still interpreted 
from least-significant to most-significant with an N-byte unit, with N-byte units 
interpreted in stream order, and with the overall mask being byte-swapped 
in individual N-byte units.
.LP
For LISTofVALUE encodings, the request is followed by a section of the form:
.LP
.DS I
.TA 1i 1.5i
.ta 1i 1.5i
VALUEs
 encode-form
 ...
 encode-form
.DE
listing an encode-form for each VALUE.
The NAME in each encode-form keys to the corresponding BITMASK bit.
The encoding of a VALUE always occupies four bytes, 
but the number of bytes specified in the encoding-form indicates how
many of the least-significant bytes are actually used; 
the remaining bytes are unused and their values do not matter.
.LP
In various cases, the number of bytes occupied by a component will be specified
by a lowercase single-letter variable name instead of a specific numeric
value, and often some other component will have its value specified as a
simple numeric expression involving these variables.
Components specified with such expressions are always interpreted 
as unsigned integers.
The scope of such variables is always just the enclosing request, reply, 
error, event, or compound type structure.
For example:
.LP
.DS I
.TA 1i 1.5i 2i 2.5i
.ta 1i 1.5i 2i 2.5i
2	3+n			request length
4n	LISTofPOINT		points
.DE
For unused bytes (the values of the bytes are undefined and do not matter),
the encode-form is:
.LP
.DS I
.TA 1i 1.5i 2i 2.5i
.ta 1i 1.5i 2i 2.5i
N			unused
.DE
If the number of unused bytes is variable, the encode-form typically is:
.LP
.DS I
.TA 1i 1.5i 2i 2.5i
.ta 1i 1.5i 2i 2.5i
p			unused, p=pad(E)
.DE
where E is some expression,
and pad(E) is the number of bytes needed to round E up to a multiple of four.
.LP
.DS I
.TA 1i 1.5i 2i 2.5i
.ta 1i 1.5i 2i 2.5i
pad(E) = (4 - (E mod 4)) mod 4
.DE
.ps +2
\fBCommon Types\fP
.ps
.LP
LISTofFOO
.IP
In this document the LISTof notation strictly means some number of repetitions
of the FOO encoding; 
the actual length of the list is encoded elsewhere.
.LP
SETofFOO
.IP
A set is always represented by a bitmask, with a 1-bit indicating presence in
the set.
.LP
BITMASK: CARD32
.LP
WINDOW: CARD32
.LP
BYTE: 8-bit value
.LP
INT8: 8-bit signed integer
.LP
INT16: 16-bit signed integer
.LP
INT32: 32-bit signed integer
.LP
CARD8: 8-bit unsigned integer
.LP
CARD16: 16-bit unsigned integer
.LP
CARD32: 32-bit unsigned integer
.LP
TIMESTAMP: CARD32
.LP
EVENTCLASS: CARD32
.LP
.DS 0
.TA .75i 1.75i
.ta .75i 1.75i
INPUTCLASS
	0	KeyClass
	1	ButtonClass
	2	ValuatorClass
	3	FeedbackClass
	4	ProximityClass
	5	FocusClass
	6	OtherClass
.DE
.LP
.DS 0
.TA .75i 1.75i
.ta .75i 1.75i
INPUTCLASS
	0	KbdFeedbackClass
	1	PtrFeedbackClass
	2	StringFeedbackClass
	3	IntegerFeedbackClass
	4	LedFeedbackClass
	5	BellFeedbackClass
.DE
.LP
.DS 0
.TA .75i 1.75i
.ta .75i 1.75i
INPUTINFO
	0	KEYINFO
	1	BUTTONINFO
	2	VALUATORINFO
.DE
.LP
.DS 0
.TA .75i 1.75i
.ta .75i 1.75i
DEVICEMODE
	0	Relative
	1	Absolute
.DE
.LP
.DS 0
.TA .75i 1.75i
.ta .75i 1.75i
PROXIMITYSTATE
	0	InProximity
	1	OutOfProximity
.DE
.LP
.DS 0
.TA .75i 1.75i
.ta .75i 1.75i
BOOL
	0	False
	1	True
.DE
.LP
KEYSYM: CARD32
.LP
KEYCODE: CARD8
.LP
BUTTON: CARD8
.LP
.DS 0
.TA .75i 1.75i
.ta .75i 1.75i
SETofKEYBUTMASK
	#x0001	Shift
	#x0002	Lock
	#x0004	Control
	#x0008	Mod1
	#x0010	Mod2
	#x0020	Mod3
	#x0040	Mod4
	#x0080	Mod5
	#x0100	Button1
	#x0200	Button2
	#x0400	Button3
	#x0800	Button4
	#x1000	Button5
	#xe000	unused but must be zero
.DE
.LP
.DS 0
.TA .75i 1.75i
.ta .75i 1.75i
SETofKEYMASK
	encodings are the same as for SETofKEYBUTMASK, except with
	#xff00		unused but must be zero
.DE
.LP
STRING8: LISTofCARD8
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
STR
	1	n		length of name in bytes
	n	STRING8		name
.DE
.ps +2
\fBErrors\fP
.ps
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Request
	1	0		Error
	1	1		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Value
	1	0		Error
	1	2		code
	2	CARD16		sequence number
	4	<32-bits>		bad value
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Window
	1	0		Error
	1	3		code
	2	CARD16		sequence number
	4	CARD32		bad resource id
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Match
	1	0		Error
	1	8		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Access
	1	0		Error
	1	10		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Alloc
	1	0		Error
	1	11		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Name
	1	0		Error
	1	15		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Device
	1	0		Error
	1	CARD8		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Event
	1	0		Error
	1	CARD8		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Mode
	1	0		Error
	1	CARD8		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
Class
	1	0		Error
	1	CARD8		code
	2	CARD16		sequence number
	4			unused
	2	CARD16		minor opcode
	1	CARD8		major opcode
	21			unused
.DE
.ps +2
Keyboards
.ps
.LP
KEYCODE values are always greater than 7 (and less than 256).
.LP
KEYSYM values with the bit #x10000000 set are reserved as vendor-specific.
.LP
The names and encodings of the standard KEYSYM values are contained in 
.\"Appendix B, Keysym Encoding.
appendix F.
.LP
.ps +2
Pointers
.ps
.LP
BUTTON values are numbered starting with one.
.LP
.ps +2
Requests
.ps
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetExtensionVersion
	1	CARD8		input extension opcode
	1	1		GetExtensionVersion opcode
	2	2+(n+p)/4		request length
	2	n		length of name
	2			unused
	n	STRING8		name
	p			unused, p=pad(n)
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	1		GetExtensionVersion opcode
	2	CARD16		sequence number
	4	0		reply length
	2	CARD16		major version
	2	CARD16		minor version
	1	BOOL		present
	19			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ListInputDevices
	1	CARD8		input extension opcode
	1	2		ListInputDevices opcode
	2	1		request length
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1			Reply
	1	2			ListInputDevices opcode
	2	CARD16			sequence number
	4	(n+p)/4			reply length
	1	CARD8			number of input devices
	23				unused
	n	LISTofDEVICEINFO	info for each input device
	p				unused, p=pad(n)
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  DEVICEINFO
	4	CARD32		device type
	1	CARD8		device id
	1	CARD8		number of input classes this device reports
	1	CARD8		device use
			0	IsXPointer
			1	IsXKeyboard
			2	IsXExtensionDevice
	1			unused
	n	LISTofINPUTINFO 		input info for each input class
	m	STR			name
	p				unused, p=pad(m)
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  INPUTINFO	KEYINFO or BUTTONINFO or VALUATORINFO
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  KEYINFO
	1	0		class id
	1	8		length
	1	KEYCODE		minimum keycode
	1	KEYCODE		maximum keycode
	2	CARD16		number of keys
	2			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
BUTTONINFO
	1	1		class id
	1	4		length
	2	CARD16		number of buttons
.DE
.LP
.DS 0
.TA .2i .75i 2.0i 3.0i
.ta .2i .75i 2.0i 3.0i
VALUATORINFO
	1	2		class id
	1	8+12n		length
	1	n		number of axes
	1	SETofDEVICEMODE			mode
	4	CARD32		size of motion buffer
	12n	LISTofAXISINFO		valuator limits
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
AXISINFO
	4	CARD32		resolution
	4	CARD32		minimum value
	4	CARD32		maximum value
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
OpenDevice
	1	CARD8		input extension opcode
	1	3		OpenDevice opcode
	2	2		request length
	1	CARD8		device id
	3			unused
.DE
.DS 0
.TA .2i .5i 1.5i 3.5i
.ta .2i .5i 1.5i 3.5i
 =>
	1	1			Reply
	1	3			OpenDevice opcode
	2	CARD16			sequence number
	4	(n+p)/4			reply length
	1	CARD8			number of input classes
	23				unused
	n	LISTofINPUTCLASSINFO	input class information
	p				unused, p=pad(n)
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  INPUTCLASSINFO
	1	CARD8		input class id
		0	KEY
		1	BUTTON
		2	VALUATOR
		3	FEEDBACK
		4	PROXIMITY
		5	FOCUS
		6	OTHER
	1	CARD8		event type base code for this class
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
CloseDevice
	1	CARD8		input extension opcode
	1	4		CloseDevice opcode
	2	2		request length
	1	CARD8		device id
	3			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
SetDeviceMode
	1	CARD8		input extension opcode
	1	5		SetDeviceMode opcode
	2	2		request length
	1	CARD8		device id
	1	CARD8		mode
	2			unused
.DE
.DS 0
.TA .2i .5i 1.5i 3.5i
.ta .2i .5i 1.5i 3.5i
 =>
	1	1			Reply
	1	5			SetDeviceMode opcode
	2	CARD16			sequence number
	4	0			reply length
	1	CARD8			status
		0		Success
			1	AlreadyGrabbed
		3 + first_error	DeviceBusy
	23				unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
SelectExtensionEvent
	1	CARD8			input extension opcode
	1	6			SelectExtensionEvent opcode
	2	3+n				request length
	4	Window			event window
	2	CARD16			count
	2				unused
	4n	LISTofEVENTCLASS	desired events
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetSelectedExtensionEvents
	1	CARD8		input extension opcode
	1	7		GetSelectedExtensionEvents opcode
	2	2		request length
	4	Window		event window
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	7		GetSelecteExtensionEvents opcode
	2	CARD16		sequence number
	4	n + m  		reply length
	2	n     		this client count
	2	m     		all clients count
	20			unused
	4n	LISTofEVENTCLASS	this client list
	4m	LISTofEVENTCLASS	all clients list
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ChangeDeviceDontPropagateList
	1	CARD8			input extension opcode
	1	8			ChangeDeviceDontPropagateList opcode
	2	3+n				request length
	4	Window			event window
	2	n			count of events
	1	mode
		0	AddToList
		1	DeleteFromList
	1				unused
	4n	LISTofEVENTCLASS	desired events
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetDeviceDontPropagateList
	1	CARD8		input extension opcode
	1	9		GetDeviceDontPropagateList opcode
	2	2		request length
	4	Window		event window
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1			Reply
	1	9			GetDeviceDontPropagateList opcode
	2	CARD16			sequence number
	4	n  			reply length
	2	n			count of events
	22				unused
	4n	LISTofEVENTCLASS	don't propagate list
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetDeviceMotionEvents
	1	CARD8		input extension opcode
	1	10		GetDeviceMotionEvents opcode
	2	4		request length
	4	TIMESTAMP		start
		0	CurrentTime
	4	TIMESTAMP		stop
		0	CurrentTime
	1	CARD8		device id
	3			unused
.DE
.DS 0
.TA .2i .5i 1.5i 3.5i
.ta .2i .5i 1.5i 3.5i
 =>
	1		1		Reply
	1		10	GetDeviceMotionEvents opcode
	2		CARD16	sequence number
	4		(m+1)n	reply length
	4		n		number of DEVICETIMECOORDs in events
	1		m		number of valuators per event
	1		CARD8		mode of the device
			0	Absolute
			1	Relative
	18				unused
	(4m+4)n	LISTofDEVICETIMECOORD	events
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  DEVICETIMECOORD
	4	TIMESTAMP		time
	4m	LISTofINT32		valuators
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ChangeKeyboardDevice
	1	CARD8		input extension opcode
	1	11		ChangeKeyboardDevice opcode
	2	2		request length
	1	CARD8		device id
	3			unused
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	11		ChangeKeyboardDevice opcode
	2	CARD16		sequence number
	4	0		reply length
	1			status
		0	Success
		1	AlreadyGrabbed
		2	DeviceFrozen
	23			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ChangePointerDevice
	1	CARD8		input extension opcode
	1	12		ChangePointerDevice opcode
	2	2		request length
	1	CARD8		x-axis
	1	CARD8		y-axis
	1	CARD8		device id
	1			unused
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	12		ChangePointerDevice opcode
	2	CARD16		sequence number
	4	0		reply length
	1			status
		0	Success
		1	AlreadyGrabbed
		2	DeviceFrozen
	23			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GrabDevice
	1	CARD8		input extension opcode
	1	13		GrabDevice opcode
	2	5+n			request length
	4	WINDOW		grab-window
	4	TIMESTAMP		time
		0	CurrentTime
	2	n		count of events
	1			this-device-mode
		0	Synchronous
		1	Asynchronous
	1			other-devices-mode
		0	Synchronous
		1	Asynchronous
	1	BOOL		owner-events
	1	CARD8		device id
	2			unused
	4n	LISTofEVENTCLASS	event list
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	13		GrabDevice opcode
	2	CARD16		sequence number
	4	0		reply length
	1			status
		0	Success
		1	AlreadyGrabbed
		2	InvalidTime
		3	NotViewable
		4	Frozen
	23			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
UngrabDevice
	1	CARD8		input extension opcode
	1	14		UngrabDevice opcode
	2	3		request length
	4	TIMESTAMP		time
		0	CurrentTime
	1	CARD8		device id
	3			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GrabDeviceKey
	1	CARD8		input extension opcode
	1	15		GrabDeviceKey opcode
	2	5+n		request length
	4	WINDOW		grab-window
	2	n		count of events
	2	SETofKEYMASK		modifiers
		#x8000	AnyModifier
	1	CARD8		modifier device
		#x0FF	UseXKeyboard
	1	CARD8		grabbed device
	1	KEYCODE			key
		0	AnyKey
	1			this-device-mode
		0	Synchronous
		1	Asynchronous
	1			other-devices-mode
		0	Synchronous
		1	Asynchronous
	1	BOOL		owner-events
	2			unused
	4n	LISTofEVENTCLASS	event list
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
UngrabDeviceKey
	1	CARD8		input extension opcode
	1	16		UngrabDeviceKey opcode
	2	4		request length
	4	WINDOW		grab-window
	2	SETofKEYMASK		modifiers
		#x8000	AnyModifier
	1	CARD8		modifier device
		#x0FF	UseXKeyboard
	1	KEYCODE			key
		0	AnyKey
	1	CARD8		grabbed device
	3			unused

.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GrabDeviceButton
	1	CARD8		input extension opcode
	1	17		GrabDeviceButton opcode
	2	5+n		request length
	4	WINDOW		grab-window
	1	CARD8		grabbed device
	1	CARD8		modifier device
		#x0FF	UseXKeyboard
	2	n		count of desired events
	2	SETofKEYMASK		modifiers
	1			this-device-mode
		0	Synchronous
		1	Asynchronous
	1			other-device-mode
		0	Synchronous
		1	Asynchronous
	1	BUTTON		button
		0	AnyButton
	1	BOOL		owner-events
		#x8000	AnyModifier
	2			unused
	4n	LISTofEVENTCLASS	event list
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
UngrabDeviceButton
	1	CARD8		input extension opcode
	1	18		UngrabDeviceButton opcode
	2	4		request length
	4	WINDOW		grab-window
	2	SETofKEYMASK		modifiers
		#x8000	AnyModifier
	1	CARD8		modifier device
		#x0FF	UseXKeyboard
	1	BUTTON		button
		0	AnyButton
	1	CARD8		grabbed device
	3			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
AllowDeviceEvents
	1	CARD8		input extension opcode
	1	19		AllowDeviceEvents opcode
	2	3		request length
	4	TIMESTAMP		time
		0	CurrentTime
	1			mode
		0	AsyncThisDevice
		1	SyncThisDevice
		2	ReplayThisDevice
		3	AsyncOtherDevices
		4	AsyncAll
		5	SyncAll
	1	CARD8		device id
	2			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetDeviceFocus
	1	CARD8		input extension opcode
	1	20		GetDeviceFocus opcode
	2	2		request length
	1	CARD8		device
	3			unused
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	20		GetDeviceFocus opcode
	2	CARD16		sequence number
	4	0		reply length
	4	WINDOW		focus
		0	None
		1	PointerRoot
		3	FollowKeyboard
	4	TIMESTAMP	focus time
	1			revert-to
		0	None
		1	PointerRoot
		2	Parent
		3	FollowKeyboard
	15			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
SetDeviceFocus
	1	CARD8		input extension opcode
	1	21		SetDeviceFocus opcode
	2	4		request length
	4	WINDOW		focus
		0	None
		1	PointerRoot
		3	FollowKeyboard
	4	TIMESTAMP		time
		0	CurrentTime
	1			revert-to
		0	None
		1	PointerRoot
		2	Parent
		3	FollowKeyboard
	1	CARD8		device
	2			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetFeedbackControl
	1	CARD8		input extension opcode
	1	22		GetFeedbackControl opcode
	2	2		request length
	1	CARD8		device id
	3			unused
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	22		GetFeedbackControl opcode
	2	CARD16		sequence number
	4	m/4			reply length
	2	n		number of feedbacks supported
	22			unused
	m	LISTofFEEDBACKSTATE	feedbacks
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  FEEDBACKSTATE	KBDFEEDBACKSTATE, PTRFEEDBACKSTATE, INTEGERFEEDBACKSTATE, 
  STRINGFEEDBACKSTATE, BELLFEEDBACKSTATE, or LEDFEEDBACKSTATE
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  KBDFEEDBACKSTATE
	1	0		feedback class id
	1	CARD8		id of this feedback
	2	20		length
	2	CARD16		pitch
	2	CARD16		duration
	4	CARD32		led_mask
	4	CARD32		led_values
	1	    		global_auto_repeat
		0	Off
		1	On
	1	CARD8		click
	1	CARD8		percent
	1	    		unused
	32	LISTofCARD8	auto_repeats
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  PTRFEEDBACKSTATE
	1	0		feedback class id
	1	CARD8		id of this feedback
	2	12		length
	2			unused
	2	CARD16		acceleration-numerator
	2	CARD16		acceleration-denominator
	2	CARD16		threshold
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  INTEGERFEEDBACKSTATE
	1	0		feedback class id
	1	CARD8		id of this feedback
	2	16		length
	4	CARD32		resolution
	4	INT32		minimum value
	4	INT32		maximum value
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  STRINGFEEDBACKSTATE
	1	1		feedback class id
	1	CARD8		id of this feedback
	2	4n+8		length
	2	CARD16		max_symbols
	2	n      		number of keysyms supported
	4n	LISTofKEYSYM		key symbols supported
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  BELLFEEDBACKSTATE
	1	1		feedback class id
	1	CARD8		id of this feedback
	2	12		length
	1	CARD8		percent
	3			unused
	2	CARD16		pitch
	2	CARD16		duration
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  LEDFEEDBACKSTATE
	1	1		feedback class id
	1	CARD8		id of this feedback
	2	12		length
	4	CARD32		led_mask
	4	BITMASK		led_values
		#x0001	On
		#x0002	Off
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ChangeFeedbackControl
	1	CARD8		input extension opcode
	1	23		ChangeFeedbackControl opcode
	2	3+n/4		request length
	4	BITMASK		value-mask (has n bits set to 1)
		#x0001	keyclick-percent
		#x0002	bell-percent
		#x0004	bell-pitch
		#x0008	bell-duration
		#x0010	led
		#x0020	led-mode
		#x0040	key
		#x0080	auto-repeat-mode
		#x0001	string
		#x0001	integer
		#x0001	acceleration-numerator
		#x0002	acceleration-denominator
		#x0004	acceleration-threshold
	1	CARD8		device id
	1	CARD8		feedback class id
	2			unused
	n	FEEDBACKCLASS
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  FEEDBACKCLASS	KBDFEEDBACKCTL, PTRFEEDBACKCTL, INTEGERFEEDBACKCTL, 
  STRINGFEEDBACKCTL, BELLFEEDBACKCTL, or LEDFEEDBACKCTL 
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  KBDFEEDBACKCTL
	1	0		feedback class id
	1	CARD8		id of this feedback
	2	20		length
	1	KEYCODE		key
	1			auto-repeat-mode
		0	Off
		1	On
		2	Default
	1	INT8		key-click-percent
	1	INT8		bell-percent
	2	INT16		bell-pitch
	2	INT16		bell-duration
	4	CARD32		led_mask
	4	CARD32		led_values
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  PTRFEEDBACKCTL
	1	1		feedback class id
	1	CARD8		id of this feedback
	2	12		length
	2			unused
	2	INT16		numerator
	2	INT16		denominator
	2	INT16		threshold
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  STRINGCTL
	1	2		feedback class id
	1	CARD8		id of this feedback
	2	4n+8		length
	2			unused
	2	n		number of keysyms to display
	4n	LISTofKEYSYM		list of key symbols to display
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  INTEGERCTL
	1	3		feedback class id
	1	CARD8		id of this feedback
	2	8		length
	4	INT32		integer to display
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  LEDCTL
	1	4		feedback class id
	1	CARD8		id of this feedback
	2	12		length
	4	CARD32		led_mask
	4	BITMASK		led_values
		#x0001	On
		#x0002	Off
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  BELLCTL
	1	5		feedback class id
	1	CARD8		id of this feedback
	2	8		length
	1	INT8		percent
	3			unused
	2	INT16		pitch
	2	INT16		duration
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetDeviceKeyMapping
	1	CARD8		input extension opcode
	1	24		GetDeviceKeyMapping opcode
	2	2		request length
	1	CARD8		device
	1	KEYCODE		first-keycode
	1	CARD8		count
	1			unused
.DE
.DS 0
.TA .2i .75i 2.0i 3.0i
.ta .2i .75i 2.0i 3.0i
 =>
	1	1		Reply
	1	24		GetDeviceKeyMapping opcode
	2	CARD16		sequence number
	4	nm		reply length (m = count field from the request)
	1	n		keysyms-per-keycode
	23			unused
	4nm	LISTofKEYSYM		keysyms
.DE
.LP
.DS 0
.TA .2i .75i 2.0i 3.0i
.ta .2i .75i 2.0i 3.0i
ChangeDeviceKeyMapping
	1	CARD8		input extension opcode
	1	25		ChangeDeviceKeyMapping opcode
	2	2+nm		request length
	1	CARD8		device
	1	KEYCODE		first-keycode
	1	m		keysyms-per-keycode
	1	n		keycode-count
	4nm	LISTofKEYSYM		keysyms
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetDeviceModifierMapping
	1	CARD8		input extension opcode
	1	26		GetDeviceModifierMapping opcode
	2	2		request length
	1	CARD8		device
	3			unused
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	26		GetDeviceModifierMapping opcode
	2	CARD16		sequence number
	4	2n		reply length
	1	n		keycodes-per-modifier
	23			unused
	8n	LISTofKEYCODE		keycodes
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
SetDeviceModifierMapping
	1	CARD8		input extension opcode
	1	27		SetDeviceModifier opcode
	2	2+2n		request length
	1	CARD8		device
	1	n		keycodes-per-modifier
	2			unused
	8n	LISTofKEYCODE		keycodes
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	27		SetDeviceModifierMapping opcode
	2	CARD16		sequence number
	4	0		reply length
	1			status
		0	Success
		1	Busy
		2	Failed
	23			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetDeviceButtonMapping
	1	CARD8		input extension opcode
	1	28		GetDeviceButtonMapping opcode
	2	2		request length
	1	CARD8		device
	3			unused
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	28		GetDeviceButtonMapping opcode
	2	CARD16		sequence number
	4	(n+p)/4		reply length
	1	n		number of elements in map list
	23			unused
	n	LISTofCARD8			map
	p			unused, p=pad(n)
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
SetDeviceButtonMapping
	1	CARD8		input extension opcode
	1	29		SetDeviceButtonMapping opcode
	2	2+(n+p)/4		request length
	1	CARD8		device
	1	n		length of map
	2			unused
	n	LISTofCARD8			map
	p			unused, p=pad(n)
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1		Reply
	1	29		SetDeviceButtonMapping opcode
	2	CARD16		sequence number
	4	0		reply length
	1			status
		0	Success
		1	Busy
	23			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
QueryDeviceState
	1	CARD8		input extension opcode
	1	30		QueryDeviceState opcode
	2	2		request length
	1	CARD8		device
	3			unused
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
 =>
	1	1			Reply
	1	30			QueryDeviceState opcode
	2	CARD16			sequence number
	4	m/4			reply length
	1	n     	 		number of input classes
	23				unused
	m	LISTofINPUTSTATE
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  INPUTSTATE	KEYSTATE or BUTTONSTATE or VALUATORSTATE
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  KEYSTATE
	1	CARD8		key input class id
	1	36		length
	1	CARD8		num_keys
	1			unused
	32	LISTofCARD8		status of keys
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  BUTTONSTATE
	1	CARD8		button input class id
	1	36		length
	1	CARD8		num_buttons
	1			unused
	32	LISTofCARD8			status of buttons
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
  VALUATORSTATE
	1	CARD8		valuator input class id
	1	4n + 4		length
	1	n		number of valuators
	1			mode
		#x01	DeviceMode (0 = Relative, 1 = Absolute)
		#x02	ProximityState (0 = InProximity, 1 = OutOfProximity)
	4n	LISTofCARD32		status of valuators
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
SendExtensionEvent
	1	CARD8			input extension opcode
	1	31			SendExtensionEvent opcode
	2	4 + 8n + m		request length
	4	WINDOW			destination
	1	CARD8			device
	1	BOOL			propagate
	2	CARD16			eventclass count
	1	CARD8			num_events
	3				unused
	32n	LISTofEVENTS		events to send
	4m	LISTofEVENTCLASS	desired events
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceBell
	1	CARD8		input extension opcode
	1	32		DeviceBell opcode
	2	2		request length
	1	CARD8		device id
	1	CARD8		feedback id
	1	CARD8		feedback class
	1	INT8		percent
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
SetDeviceValuators
	1	CARD8		input extension opcode
	1	33		SetDeviceValuators opcode
	2	2 + n		request length
	1	CARD8		device id
	1	CARD8		first valuator
	1	n    		number of valuators
	1			unused
	4n	LISTofINT32	valuator values to set
.DE
.DS 0
.TA .2i .5i 1.5i 3.5i
.ta .2i .5i 1.5i 3.5i
 =>
	1	1			Reply
	1	33			SetDeviceValuators opcode
	2	CARD16			sequence number
	4	0			reply length
	1	CARD8			status
		0	Success
		1	AlreadyGrabbed
	23				unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
GetDeviceControl
	1	CARD8		input extension opcode
	1	34		GetDeviceControl opcode
	2	2		request length
	2	CARD16		device control type
	1	CARD8		device id
	1			unused
.DE
.DS 0
.TA .2i .5i 1.5i 3.5i
.ta .2i .5i 1.5i 3.5i
 =>
	1	1			Reply
	1	34			GetDeviceControl opcode
	2	CARD16			sequence number
	4	n/4			reply length
	1	CARD8			status
		0			Success
		1			AlreadyGrabbed
		3 + first_error		DeviceBusy
	23				unused
	n				DEVICESTATE
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DEVICESTATE			DEVICERESOLUTIONSTATE
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DEVICERESOLUTIONSTATE
 	2	0		control type
 	2	8 + 12n		length
 	4	n    		num_valuators
 	4n	LISTOfCARD32	resolution values
 	4n	LISTOfCARD32	resolution min_values
 	4n	LISTOfCARD32	resolution max_values
.DE
.LP
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ChangeDeviceControl
 	1	CARD8		input extension opcode
 	1	35		ChangeDeviceControl opcode
 	2	2+n/4		request length
 	2	CARD16		control type
 	1	CARD8		device id
 	1			unused
 	n			DEVICECONTROL
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DEVICECONTROL		DEVICERESOLUTIONCTL
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DEVICERESOLUTIONCTL
 	2	1		control type
 	2	8 + 4n		length
 	1	CARD8		first_valuator
 	1	n    		num_valuators
 	2			unused
 	4n	LISTOfCARD32	resolution values
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 3.5i
.ta .2i .5i 1.5i 3.5i
 =>
 	1	1			Reply
 	1	35			ChangeDeviceControl opcode
 	2	CARD16			sequence number
 	4	0			reply length
 	1	CARD8			status
 		0			Success
 		1			AlreadyGrabbed
 		3 + first_error		DeviceBusy
 	23				unused
.DE
.ps +2
Events
.ps
.LP
DeviceKeyPress, DeviceKeyRelease, DeviceButtonPress, DeviceButtonRelease,
ProximityIn, ProximityOut, and DeviceStateNotify  events may be followed by 
zero or more DeviceValuator events.  DeviceMotionNotify events will be 
followed by one or more DeviceValuator events.
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceValuator
	1	CARD8		code
	1	CARD8		device id
	2	CARD16		sequence number
	2	SETofKEYBUTMASK		state
	1	n		number of valuators this device reports
	1	m		number of first valuator in this event
	24	LISTofINT32	valuators
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceKeyPress
	1	CARD8		code
	1	KEYCODE		detail
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		root
	4	WINDOW		event
	4	WINDOW		child
		0	None
	2	INT16		root-x
	2	INT16		root-y
	2	INT16		event-x
	2	INT16		event-y
	2	SETofKEYBUTMASK		state
	1	BOOL		same-screen
	1	CARD8		device id
		#x80		MORE_EVENTS follow
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceKeyRelease
	1	CARD8		code
	1	KEYCODE		detail
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		root
	4	WINDOW		event
	4	WINDOW		child
		0	None
	2	INT16		root-x
	2	INT16		root-y
	2	INT16		event-x
	2	INT16		event-y
	2	SETofKEYBUTMASK			state
	1	BOOL		same-screen
	1	CARD8		device id
		#x80		MORE_EVENTS follow
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceButtonPress
	1	CARD8		code
	1	BUTTON		detail
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		root
	4	WINDOW		event
	4	WINDOW		child
		0	None
	2	INT16		root-x
	2	INT16		root-y
	2	INT16		event-x
	2	INT16		event-y
	2	SETofKEYBUTMASK		state
	1	BOOL		same-screen
	1	CARD8		device id
		#x80		MORE_EVENTS follow
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceButtonRelease
	1	CARD8		code
	1	BUTTON		detail
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		root
	4	WINDOW		event
	4	WINDOW		child
		0	None
	2	INT16		root-x
	2	INT16		root-y
	2	INT16		event-x
	2	INT16		event-y
	2	SETofKEYBUTMASK		state
	1	BOOL		same-screen
	1	CARD8		device id
		#x80		MORE_EVENTS follow
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceMotionNotify
	1	CARD8		code
	1			detail
		0	Normal
		1	Hint
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		root
	4	WINDOW		event
	4	WINDOW		child
	 	0	None
	2	INT16		root-x
	2	INT16		root-y
	2	INT16		event-x
	2	INT16		event-y
	2	SETofKEYBUTMASK		state
	1	BOOL		same-screen
	1	CARD8		device id
		#x80		MORE_EVENTS follow
.DE
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceFocusIn
	1	CARD8		code
	1			detail
		0	Ancestor
		1	Virtual
		2	Inferior
		3	Nonlinear
		4	NonlinearVirtual
		5	Pointer
		6	PointerRoot
		7	None
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		event
	1			mode
		0	Normal
		1	Grab
		2	Ungrab
		3	WhileGrabbed
	1	CARD8		device id
	18			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceFocusOut
	1	CARD8		code
	1			detail
		0	Ancestor
		1	Virtual
		2	Inferior
		3	Nonlinear
		4	NonlinearVirtual
		5	Pointer
		6	PointerRoot
		7	None
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		event
	1			mode
		0	Normal
		1	Grab
		2	Ungrab
		3	WhileGrabbed
	1	CARD8		device id
	18			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ProximityIn
	1	CARD8		code
	1			unused
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		root
	4	WINDOW		event
	4	WINDOW		child
		0	None
	2	INT16		root-x
	2	INT16		root-y
	2	INT16		event-x
	2	INT16		event-y
	2	SETofKEYBUTMASK			state
	1	BOOL		same-screen
	1	CARD8		device id
		#x80		MORE_EVENTS follow
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ProximityOut
	1	CARD8		code
	1			unused
	2	CARD16		sequence number
	4	TIMESTAMP		time
	4	WINDOW		root
	4	WINDOW		event
	4	WINDOW		child
		0	None
	2	INT16		root-x
	2	INT16		root-y
	2	INT16		event-x
	2	INT16		event-y
	2	SETofKEYBUTMASK			state
	1	BOOL		same-screen
	1	CARD8		device id
		#x80		MORE_EVENTS follow
.DE
.LP
DeviceStateNotify events may be immediately followed by zero or one
DeviceKeyStateNotify and/ or zero or more DeviceValuator events.
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceStateNotify
	1	CARD8		code
	1	CARD8		device id
		#x80		MORE_EVENTS follow
	2	CARD16		sequence number
	4	TIMESTAMP		time
	1	CARD8		num_keys
	1	CARD8		num_buttons
	1	CARD8		num_valuators
 	1	CARD8		valuator mode and input classes reported
 		#x01	reporting keys
 		#x02	reporting buttons
 		#x04	reporting valuators
 		#x40	device mode (0 = Relative, 1 = Absolute)
 		#x80	proximity state (0 = InProximity, 1 = OutOfProximity)
	4	LISTofCARD8		first 32 keys (if reported)
	4	LISTofCARD8		first 32 buttons (if reported)
	12	LISTofCARD32		first 3 valuators (if reported)
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceKeyStateNotify
	1	CARD8		code
	1	CARD8		device id
		#x80		MORE_EVENTS follow
	2	CARD16		sequence number
	28	LISTofCARD8		state of keys 33-255
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceButtonStateNotify
	1	CARD8		code
	1	CARD8		device id
		#x80		MORE_EVENTS follow
	2	CARD16		sequence number
	28	LISTofCARD8		state of buttons 33-255
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceValuator
	1	CARD8		code
	1	CARD8		device id
	2	CARD16		sequence number
	2	SETofKEYBUTMASK		state
	1	n		number of valuators this device reports
	1	n		number of first valuator in this event
	24	LISTofINT32	valuators
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
DeviceMappingNotify
	1	CARD8		code
	1	CARD8		device id
	2	CARD16		sequence number
	1			request
		0	MappingModifier
		1	MappingKeyboard
		2	MappingPointer
	1	KEYCODE		first-keycode
	1	CARD8		count
	1			unused
	4	TIMESTAMP		time
	20			unused
.DE
.LP
.DS 0
.TA .2i .5i 1.5i 2.5i
.ta .2i .5i 1.5i 2.5i
ChangeDeviceNotify
	1	CARD8		code
	1	CARD8		id of device specified on change request
	2	CARD16		sequence number
	4	TIMESTAMP		time
	1			request
		0	NewPointer
		1	NewKeyboard
	23			unused
.DE
.\" print Table of Contents
.if o .bp \" blank page to make count even
.bp 1
.af PN i
.PX
