# Input Extension Protocol Encoding

`Syntactic Conventions`

All numbers are in decimal, unless prefixed with #x, in which case they are in hexadecimal (base 16).

The general syntax used to describe requests, replies, errors, events, and compound types is:

    NameofThing
      encode-form
      ...
      encode-form

Each encode-form describes a single component.

For components described in the protocol as:

    name: TYPE

the encode-form is:

    N	TYPE	name

N is the number of bytes occupied in the data stream, and TYPE is the interpretation of those bytes. For example,

    depth: CARD8

becomes:

    1	CARD8	depth

For components with a static numeric value the encode-form is:

    N	value	name

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):

    1	0	Error
    1	3	code

For components described in the protocol as:

    name: {Name1, ..., NameI}

the encode-form is:

    N		name
    	value1 Name1
    	...
    	valueI NameI

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:

    class: {InputOutput, InputOnly, CopyFromParent}

becomes:

    2			class
    	0	CopyFromParent
    	1	InputOutput
    	2	InputOnly

For components described in the protocol as:

    NAME: TYPE or Alternative1 ... or AlternativeI

the encode-form is:

    N	TYPE			NAME
    	value1	Alternative1
    	...
    	valueI	AlternativeI

The alternative values are guaranteed not to conflict with the encoding of TYPE. For example:

    destination: WINDOW or PointerWindow or InputFocus

becomes:

    4	WINDOW		destination
    	0	PointerWindow
    	1	InputFocus

For components described in the protocol as:

    value-mask: BITMASK

the encode-form is:

    N	BITMASK			value-mask
    	mask1	mask-name1
    	...
    	maskI	mask-nameI

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.

For LISTofVALUE encodings, the request is followed by a section of the form:

    VALUEs
     encode-form
     ...
     encode-form

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.

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:

    2	3+n			request length
    4n	LISTofPOINT		points

For unused bytes (the values of the bytes are undefined and do not matter), the encode-form is:

    N			unused

If the number of unused bytes is variable, the encode-form typically is:

    p			unused, p=pad(E)

where E is some expression, and pad(E) is the number of bytes needed to round E up to a multiple of four.

    pad(E) = (4 - (E mod 4)) mod 4

`Common Types`

LISTofFOO

- 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.

SETofFOO

- A set is always represented by a bitmask, with a 1-bit indicating presence in the set.

BITMASK: CARD32

WINDOW: CARD32

BYTE: 8-bit value

INT8: 8-bit signed integer

INT16: 16-bit signed integer

INT32: 32-bit signed integer

CARD8: 8-bit unsigned integer

CARD16: 16-bit unsigned integer

CARD32: 32-bit unsigned integer

TIMESTAMP: CARD32

EVENTCLASS: CARD32

    INPUTCLASS
    	0	KeyClass
    	1	ButtonClass
    	2	ValuatorClass
    	3	FeedbackClass
    	4	ProximityClass
    	5	FocusClass
    	6	OtherClass

    INPUTCLASS
    	0	KbdFeedbackClass
    	1	PtrFeedbackClass
    	2	StringFeedbackClass
    	3	IntegerFeedbackClass
    	4	LedFeedbackClass
    	5	BellFeedbackClass

    INPUTINFO
    	0	KEYINFO
    	1	BUTTONINFO
    	2	VALUATORINFO

    DEVICEMODE
    	0	Relative
    	1	Absolute

    PROXIMITYSTATE
    	0	InProximity
    	1	OutOfProximity

    BOOL
    	0	False
    	1	True

KEYSYM: CARD32

KEYCODE: CARD8

BUTTON: CARD8

    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

    SETofKEYMASK
    	encodings are the same as for SETofKEYBUTMASK, except with
    	#xff00		unused but must be zero

STRING8: LISTofCARD8

    STR
    	1	n		length of name in bytes
    	n	STRING8		name

`Errors`

    Request
    	1	0		Error
    	1	1		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

    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

    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

    Match
    	1	0		Error
    	1	8		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

    Access
    	1	0		Error
    	1	10		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

    Alloc
    	1	0		Error
    	1	11		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

    Name
    	1	0		Error
    	1	15		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

    Device
    	1	0		Error
    	1	CARD8		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

    Event
    	1	0		Error
    	1	CARD8		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

    Mode
    	1	0		Error
    	1	CARD8		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

    Class
    	1	0		Error
    	1	CARD8		code
    	2	CARD16		sequence number
    	4			unused
    	2	CARD16		minor opcode
    	1	CARD8		major opcode
    	21			unused

Keyboards

KEYCODE values are always greater than 7 (and less than 256).

KEYSYM values with the bit #x10000000 set are reserved as vendor-specific.

The names and encodings of the standard KEYSYM values are contained in appendix F.

Pointers

BUTTON values are numbered starting with one.

Requests

    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)

     =>
    	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

    ListInputDevices
    	1	CARD8		input extension opcode
    	1	2		ListInputDevices opcode
    	2	1		request length

     =>
    	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)

      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)

      INPUTINFO	KEYINFO or BUTTONINFO or VALUATORINFO

      KEYINFO
    	1	0		class id
    	1	8		length
    	1	KEYCODE		minimum keycode
    	1	KEYCODE		maximum keycode
    	2	CARD16		number of keys
    	2			unused

    BUTTONINFO
    	1	1		class id
    	1	4		length
    	2	CARD16		number of buttons

    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

    AXISINFO
    	4	CARD32		resolution
    	4	CARD32		minimum value
    	4	CARD32		maximum value

    OpenDevice
    	1	CARD8		input extension opcode
    	1	3		OpenDevice opcode
    	2	2		request length
    	1	CARD8		device id
    	3			unused

     =>
    	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)

      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

    CloseDevice
    	1	CARD8		input extension opcode
    	1	4		CloseDevice opcode
    	2	2		request length
    	1	CARD8		device id
    	3			unused

    SetDeviceMode
    	1	CARD8		input extension opcode
    	1	5		SetDeviceMode opcode
    	2	2		request length
    	1	CARD8		device id
    	1	CARD8		mode
    	2			unused

     =>
    	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

    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

    GetSelectedExtensionEvents
    	1	CARD8		input extension opcode
    	1	7		GetSelectedExtensionEvents opcode
    	2	2		request length
    	4	Window		event window

     =>
    	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

    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

    GetDeviceDontPropagateList
    	1	CARD8		input extension opcode
    	1	9		GetDeviceDontPropagateList opcode
    	2	2		request length
    	4	Window		event window

     =>
    	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

    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

     =>
    	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

      DEVICETIMECOORD
    	4	TIMESTAMP		time
    	4m	LISTofINT32		valuators

    ChangeKeyboardDevice
    	1	CARD8		input extension opcode
    	1	11		ChangeKeyboardDevice opcode
    	2	2		request length
    	1	CARD8		device id
    	3			unused

     =>
    	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

    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

     =>
    	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

    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

     =>
    	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

    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

    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

    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

    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

    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

    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

    GetDeviceFocus
    	1	CARD8		input extension opcode
    	1	20		GetDeviceFocus opcode
    	2	2		request length
    	1	CARD8		device
    	3			unused

     =>
    	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

    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

    GetFeedbackControl
    	1	CARD8		input extension opcode
    	1	22		GetFeedbackControl opcode
    	2	2		request length
    	1	CARD8		device id
    	3			unused

     =>
    	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

      FEEDBACKSTATE	KBDFEEDBACKSTATE, PTRFEEDBACKSTATE, INTEGERFEEDBACKSTATE,
      STRINGFEEDBACKSTATE, BELLFEEDBACKSTATE, or LEDFEEDBACKSTATE

      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

      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

      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

      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

      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

      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

    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

      FEEDBACKCLASS	KBDFEEDBACKCTL, PTRFEEDBACKCTL, INTEGERFEEDBACKCTL,
      STRINGFEEDBACKCTL, BELLFEEDBACKCTL, or LEDFEEDBACKCTL

      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

      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

      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

      INTEGERCTL
    	1	3		feedback class id
    	1	CARD8		id of this feedback
    	2	8		length
    	4	INT32		integer to display

      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

      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

    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

     =>
    	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

    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

    GetDeviceModifierMapping
    	1	CARD8		input extension opcode
    	1	26		GetDeviceModifierMapping opcode
    	2	2		request length
    	1	CARD8		device
    	3			unused

     =>
    	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

    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

     =>
    	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

    GetDeviceButtonMapping
    	1	CARD8		input extension opcode
    	1	28		GetDeviceButtonMapping opcode
    	2	2		request length
    	1	CARD8		device
    	3			unused

     =>
    	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)

    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)

     =>
    	1	1		Reply
    	1	29		SetDeviceButtonMapping opcode
    	2	CARD16		sequence number
    	4	0		reply length
    	1			status
    		0	Success
    		1	Busy
    	23			unused

    QueryDeviceState
    	1	CARD8		input extension opcode
    	1	30		QueryDeviceState opcode
    	2	2		request length
    	1	CARD8		device
    	3			unused

     =>
    	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

      INPUTSTATE	KEYSTATE or BUTTONSTATE or VALUATORSTATE

      KEYSTATE
    	1	CARD8		key input class id
    	1	36		length
    	1	CARD8		num_keys
    	1			unused
    	32	LISTofCARD8		status of keys

      BUTTONSTATE
    	1	CARD8		button input class id
    	1	36		length
    	1	CARD8		num_buttons
    	1			unused
    	32	LISTofCARD8			status of buttons

      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

    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

    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

    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

     =>
    	1	1			Reply
    	1	33			SetDeviceValuators opcode
    	2	CARD16			sequence number
    	4	0			reply length
    	1	CARD8			status
    		0	Success
    		1	AlreadyGrabbed
    	23				unused

    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

     =>
    	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

    DEVICESTATE			DEVICERESOLUTIONSTATE

    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

    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

    DEVICECONTROL		DEVICERESOLUTIONCTL

    DEVICERESOLUTIONCTL
     	2	1		control type
     	2	8 + 4n		length
     	1	CARD8		first_valuator
     	1	n    		num_valuators
     	2			unused
     	4n	LISTOfCARD32	resolution values

     =>
     	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

Events

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.

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

DeviceStateNotify events may be immediately followed by zero or one DeviceKeyStateNotify and/ or zero or more DeviceValuator events.

    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)

    DeviceKeyStateNotify
    	1	CARD8		code
    	1	CARD8		device id
    		#x80		MORE_EVENTS follow
    	2	CARD16		sequence number
    	28	LISTofCARD8		state of keys 33-255

    DeviceButtonStateNotify
    	1	CARD8		code
    	1	CARD8		device id
    		#x80		MORE_EVENTS follow
    	2	CARD16		sequence number
    	28	LISTofCARD8		state of buttons 33-255

    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

    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

    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