From a7971771a8ab6f6f76a2a8e482dbb3a30901af1c Mon Sep 17 00:00:00 2001
From: marha <marha@users.sourceforge.net>
Date: Fri, 25 Feb 2011 07:31:13 +0000
Subject: xserver randrproto mesa xkeyboard-config git update 25 Feb 2011

---
 X11/extensions/randr.h        |  358 +--
 X11/extensions/randrproto.h   | 1846 +++++++--------
 X11/extensions/randrproto.txt | 5200 +++++++++++++++++++++--------------------
 3 files changed, 3732 insertions(+), 3672 deletions(-)

(limited to 'X11/extensions')

diff --git a/X11/extensions/randr.h b/X11/extensions/randr.h
index fec7f4f4e..41aedd5de 100644
--- a/X11/extensions/randr.h
+++ b/X11/extensions/randr.h
@@ -1,173 +1,185 @@
-/*
- * Copyright © 2000 Compaq Computer Corporation
- * Copyright © 2002 Hewlett Packard Company
- * Copyright © 2006 Intel Corporation
- * Copyright © 2008 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- * Author:  Jim Gettys, HP Labs, Hewlett-Packard, Inc.
- *	    Keith Packard, Intel Corporation
- */
-
-#ifndef _RANDR_H_
-#define _RANDR_H_
-
-typedef unsigned short	Rotation;
-typedef unsigned short	SizeID;
-typedef unsigned short	SubpixelOrder;
-typedef unsigned short	Connection;
-typedef unsigned short	XRandrRotation;
-typedef unsigned short	XRandrSizeID;
-typedef unsigned short	XRandrSubpixelOrder;
-typedef unsigned long	XRandrModeFlags;
-
-#define RANDR_NAME		"RANDR"
-#define RANDR_MAJOR		1
-#define RANDR_MINOR		4
-
-#define RRNumberErrors		3
-#define RRNumberEvents		2
-#define RRNumberRequests	37
-
-#define X_RRQueryVersion	0
-/* we skip 1 to make old clients fail pretty immediately */
-#define X_RROldGetScreenInfo	1
-#define X_RR1_0SetScreenConfig	2
-/* V1.0 apps share the same set screen config request id */
-#define X_RRSetScreenConfig	2
-#define X_RROldScreenChangeSelectInput	3
-/* 3 used to be ScreenChangeSelectInput; deprecated */
-#define X_RRSelectInput		4
-#define X_RRGetScreenInfo	5
-
-/* V1.2 additions */
-#define X_RRGetScreenSizeRange	    6
-#define X_RRSetScreenSize	    7
-#define X_RRGetScreenResources	    8
-#define X_RRGetOutputInfo	    9
-#define X_RRListOutputProperties    10
-#define X_RRQueryOutputProperty	    11
-#define X_RRConfigureOutputProperty 12
-#define X_RRChangeOutputProperty    13
-#define X_RRDeleteOutputProperty    14
-#define X_RRGetOutputProperty	    15
-#define X_RRCreateMode		    16
-#define X_RRDestroyMode		    17
-#define X_RRAddOutputMode	    18
-#define X_RRDeleteOutputMode	    19
-#define X_RRGetCrtcInfo		    20
-#define X_RRSetCrtcConfig	    21
-#define X_RRGetCrtcGammaSize	    22
-#define X_RRGetCrtcGamma	    23
-#define X_RRSetCrtcGamma	    24
-
-/* V1.3 additions */
-#define X_RRGetScreenResourcesCurrent	25
-#define X_RRSetCrtcTransform	    26
-#define X_RRGetCrtcTransform	    27
-#define X_RRGetPanning		    28
-#define X_RRSetPanning		    29
-#define X_RRSetOutputPrimary	    30
-#define X_RRGetOutputPrimary	    31
-
-#define RRTransformUnit		    (1L << 0)
-#define RRTransformScaleUp	    (1L << 1)
-#define RRTransformScaleDown	    (1L << 2)
-#define RRTransformProjective	    (1L << 3)
-
-/* V1.4 additions */
-#define X_RRQueryScanoutPixmaps	    32
-#define X_RRCreateScanoutPixmap	    33
-#define X_RRSetCrtcSpriteTransform  34
-#define X_RRGetCrtcSpriteTransform  35
-#define X_RRSetCrtcConfigs	    36
-
-/* Event selection bits */
-#define RRScreenChangeNotifyMask  (1L << 0)
-/* V1.2 additions */
-#define RRCrtcChangeNotifyMask	    (1L << 1)
-#define RROutputChangeNotifyMask    (1L << 2)
-#define RROutputPropertyNotifyMask  (1L << 3)
-
-/* Event codes */
-#define RRScreenChangeNotify	0
-/* V1.2 additions */
-#define RRNotify		    1
-/* RRNotify Subcodes */
-#define  RRNotify_CrtcChange	    0
-#define  RRNotify_OutputChange	    1
-#define  RRNotify_OutputProperty    2
-
-/* used in the rotation field; rotation and reflection in 0.1 proto. */
-#define RR_Rotate_0		1
-#define RR_Rotate_90		2
-#define RR_Rotate_180		4
-#define RR_Rotate_270		8
-
-/* new in 1.0 protocol, to allow reflection of screen */
-
-#define RR_Reflect_X		16
-#define RR_Reflect_Y		32
-
-#define RRSetConfigSuccess		0
-#define RRSetConfigInvalidConfigTime	1
-#define RRSetConfigInvalidTime		2
-#define RRSetConfigFailed		3
-
-/* new in 1.2 protocol */
-
-#define RR_HSyncPositive	0x00000001
-#define RR_HSyncNegative	0x00000002
-#define RR_VSyncPositive	0x00000004
-#define RR_VSyncNegative	0x00000008
-#define RR_Interlace		0x00000010
-#define RR_DoubleScan		0x00000020
-#define RR_CSync		0x00000040
-#define RR_CSyncPositive	0x00000080
-#define RR_CSyncNegative	0x00000100
-#define RR_HSkewPresent		0x00000200
-#define RR_BCast		0x00000400
-#define RR_PixelMultiplex	0x00000800
-#define RR_DoubleClock		0x00001000
-#define RR_ClockDivideBy2	0x00002000
-
-#define RR_Connected		0
-#define RR_Disconnected		1
-#define RR_UnknownConnection	2
-
-#define BadRROutput		0
-#define BadRRCrtc		1
-#define BadRRMode		2
-
-/* new in 1.4 protocol */
-#define RR_CurrentScanoutPixmap	1	/* current scanout pixmap in RRSetCrtcConfigs */
-
-/* Conventional RandR output properties */
-
-#define RR_PROPERTY_BACKLIGHT		"Backlight"
-#define RR_PROPERTY_RANDR_EDID		"EDID"
-#define RR_PROPERTY_SIGNAL_FORMAT	"SignalFormat"
-#define RR_PROPERTY_SIGNAL_PROPERTIES	"SignalProperties"
-#define RR_PROPERTY_CONNECTOR_TYPE	"ConnectorType"
-#define RR_PROPERTY_CONNECTOR_NUMBER	"ConnectorNumber"
-#define RR_PROPERTY_COMPATIBILITY_LIST	"CompatibilityList"
-#define RR_PROPERTY_CLONE_LIST		"CloneList"
-
-#endif	/* _RANDR_H_ */
+/*
+ * Copyright © 2000 Compaq Computer Corporation
+ * Copyright © 2002 Hewlett Packard Company
+ * Copyright © 2006 Intel Corporation
+ * Copyright © 2008 Red Hat, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * Author:  Jim Gettys, HP Labs, Hewlett-Packard, Inc.
+ *	    Keith Packard, Intel Corporation
+ */
+
+#ifndef _RANDR_H_
+#define _RANDR_H_
+
+typedef unsigned short	Rotation;
+typedef unsigned short	SizeID;
+typedef unsigned short	SubpixelOrder;
+typedef unsigned short	Connection;
+typedef unsigned short	XRandrRotation;
+typedef unsigned short	XRandrSizeID;
+typedef unsigned short	XRandrSubpixelOrder;
+typedef unsigned long	XRandrModeFlags;
+
+#define RANDR_NAME		"RANDR"
+#define RANDR_MAJOR		1
+#define RANDR_MINOR		4
+
+#define RRNumberErrors		3
+#define RRNumberEvents		2
+#define RRNumberRequests	37
+
+#define X_RRQueryVersion	0
+/* we skip 1 to make old clients fail pretty immediately */
+#define X_RROldGetScreenInfo	1
+#define X_RR1_0SetScreenConfig	2
+/* V1.0 apps share the same set screen config request id */
+#define X_RRSetScreenConfig	2
+#define X_RROldScreenChangeSelectInput	3
+/* 3 used to be ScreenChangeSelectInput; deprecated */
+#define X_RRSelectInput		4
+#define X_RRGetScreenInfo	5
+
+/* V1.2 additions */
+#define X_RRGetScreenSizeRange	    6
+#define X_RRSetScreenSize	    7
+#define X_RRGetScreenResources	    8
+#define X_RRGetOutputInfo	    9
+#define X_RRListOutputProperties    10
+#define X_RRQueryOutputProperty	    11
+#define X_RRConfigureOutputProperty 12
+#define X_RRChangeOutputProperty    13
+#define X_RRDeleteOutputProperty    14
+#define X_RRGetOutputProperty	    15
+#define X_RRCreateMode		    16
+#define X_RRDestroyMode		    17
+#define X_RRAddOutputMode	    18
+#define X_RRDeleteOutputMode	    19
+#define X_RRGetCrtcInfo		    20
+#define X_RRSetCrtcConfig	    21
+#define X_RRGetCrtcGammaSize	    22
+#define X_RRGetCrtcGamma	    23
+#define X_RRSetCrtcGamma	    24
+
+/* V1.3 additions */
+#define X_RRGetScreenResourcesCurrent	25
+#define X_RRSetCrtcTransform	    26
+#define X_RRGetCrtcTransform	    27
+#define X_RRGetPanning		    28
+#define X_RRSetPanning		    29
+#define X_RRSetOutputPrimary	    30
+#define X_RRGetOutputPrimary	    31
+
+#define RRTransformUnit		    (1L << 0)
+#define RRTransformScaleUp	    (1L << 1)
+#define RRTransformScaleDown	    (1L << 2)
+#define RRTransformProjective	    (1L << 3)
+
+/* V1.4 additions */
+
+#define RR_SetScreenPixmapSize			(1 << 0)
+#define RR_SetScreenSize			(1 << 1)
+#define RR_SetScreenSizeInMillimeters		(1 << 2)
+#define RR_SetScreenCrtcs			(1 << 3)
+
+#define RR_SetCrtcPosition	    		(1 << 4)
+#define RR_SetCrtcMode		    		(1 << 5)
+#define RR_SetCrtcRotation	    		(1 << 6)
+#define RR_SetCrtcOutputs	    		(1 << 7)
+#define RR_SetCrtcSpritePositionTransform	(1 << 8)
+#define RR_SetCrtcSpriteImageTransform		(1 << 9)
+#define RR_SetCrtcPixmap			(1 << 10)
+#define RR_SetCrtcPixmapPosition		(1 << 11)
+
+#define X_RRQueryScanoutPixmaps	    32
+#define X_RRCreateScanoutPixmap	    33
+#define X_RRSetCrtcSpriteTransform  34
+#define X_RRGetCrtcSpriteTransform  35
+#define X_RRSetCrtcConfigs	    36
+
+/* Event selection bits */
+#define RRScreenChangeNotifyMask  (1L << 0)
+/* V1.2 additions */
+#define RRCrtcChangeNotifyMask	    (1L << 1)
+#define RROutputChangeNotifyMask    (1L << 2)
+#define RROutputPropertyNotifyMask  (1L << 3)
+
+/* Event codes */
+#define RRScreenChangeNotify	0
+/* V1.2 additions */
+#define RRNotify		    1
+/* RRNotify Subcodes */
+#define  RRNotify_CrtcChange	    0
+#define  RRNotify_OutputChange	    1
+#define  RRNotify_OutputProperty    2
+
+/* used in the rotation field; rotation and reflection in 0.1 proto. */
+#define RR_Rotate_0		1
+#define RR_Rotate_90		2
+#define RR_Rotate_180		4
+#define RR_Rotate_270		8
+
+/* new in 1.0 protocol, to allow reflection of screen */
+
+#define RR_Reflect_X		16
+#define RR_Reflect_Y		32
+
+#define RRSetConfigSuccess		0
+#define RRSetConfigInvalidConfigTime	1
+#define RRSetConfigInvalidTime		2
+#define RRSetConfigFailed		3
+
+/* new in 1.2 protocol */
+
+#define RR_HSyncPositive	0x00000001
+#define RR_HSyncNegative	0x00000002
+#define RR_VSyncPositive	0x00000004
+#define RR_VSyncNegative	0x00000008
+#define RR_Interlace		0x00000010
+#define RR_DoubleScan		0x00000020
+#define RR_CSync		0x00000040
+#define RR_CSyncPositive	0x00000080
+#define RR_CSyncNegative	0x00000100
+#define RR_HSkewPresent		0x00000200
+#define RR_BCast		0x00000400
+#define RR_PixelMultiplex	0x00000800
+#define RR_DoubleClock		0x00001000
+#define RR_ClockDivideBy2	0x00002000
+
+#define RR_Connected		0
+#define RR_Disconnected		1
+#define RR_UnknownConnection	2
+
+#define BadRROutput		0
+#define BadRRCrtc		1
+#define BadRRMode		2
+
+/* Conventional RandR output properties */
+
+#define RR_PROPERTY_BACKLIGHT		"Backlight"
+#define RR_PROPERTY_RANDR_EDID		"EDID"
+#define RR_PROPERTY_SIGNAL_FORMAT	"SignalFormat"
+#define RR_PROPERTY_SIGNAL_PROPERTIES	"SignalProperties"
+#define RR_PROPERTY_CONNECTOR_TYPE	"ConnectorType"
+#define RR_PROPERTY_CONNECTOR_NUMBER	"ConnectorNumber"
+#define RR_PROPERTY_COMPATIBILITY_LIST	"CompatibilityList"
+#define RR_PROPERTY_CLONE_LIST		"CloneList"
+
+#endif	/* _RANDR_H_ */
diff --git a/X11/extensions/randrproto.h b/X11/extensions/randrproto.h
index 298d4cfad..00bae2d4a 100644
--- a/X11/extensions/randrproto.h
+++ b/X11/extensions/randrproto.h
@@ -1,922 +1,924 @@
-/*
- * Copyright © 2000 Compaq Computer Corporation
- * Copyright © 2002 Hewlett-Packard Company
- * Copyright © 2006 Intel Corporation
- * Copyright © 2008 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- *
- * Author:  Jim Gettys, Hewlett-Packard Company, Inc.
- *	    Keith Packard, Intel Corporation
- */
-
-/* note that RANDR 1.0 is incompatible with version 0.0, or 0.1 */
-/* V1.0 removes depth switching from the protocol */
-#ifndef _XRANDRP_H_
-#define _XRANDRP_H_
-
-#include <X11/extensions/randr.h>
-#include <X11/extensions/renderproto.h>
-
-#define Window CARD32
-#define Drawable CARD32
-#define Font CARD32
-#define Pixmap CARD32
-#define Cursor CARD32
-#define Colormap CARD32
-#define GContext CARD32
-#define Atom CARD32
-#define Time CARD32
-#define KeyCode CARD8
-#define KeySym CARD32
-#define RROutput CARD32
-#define RRMode CARD32
-#define RRCrtc CARD32
-#define RRModeFlags CARD32
-#define PictFormat CARD32
-
-#define Rotation CARD16
-#define SizeID CARD16
-#define SubpixelOrder CARD16
-
-/*
- * data structures
- */
-
-typedef struct {
-    CARD16 widthInPixels B16;
-    CARD16 heightInPixels B16;
-    CARD16 widthInMillimeters B16;
-    CARD16 heightInMillimeters B16;
-} xScreenSizes;
-#define sz_xScreenSizes 8
-
-/* 
- * requests and replies
- */
-
-typedef struct {
-    CARD8   reqType;
-    CARD8   randrReqType;
-    CARD16  length B16;
-    CARD32  majorVersion B32;
-    CARD32  minorVersion B32;
-} xRRQueryVersionReq;
-#define sz_xRRQueryVersionReq   12
-
-typedef struct {
-    BYTE    type;   /* X_Reply */
-    BYTE    pad1;
-    CARD16  sequenceNumber B16;
-    CARD32  length B32;
-    CARD32  majorVersion B32;
-    CARD32  minorVersion B32;
-    CARD32  pad2 B32;
-    CARD32  pad3 B32;
-    CARD32  pad4 B32;
-    CARD32  pad5 B32;
-} xRRQueryVersionReply;
-#define sz_xRRQueryVersionReply	32
-
-typedef struct {
-    CARD8   reqType;
-    CARD8   randrReqType;
-    CARD16  length B16;
-    Window  window B32;
-} xRRGetScreenInfoReq;
-#define sz_xRRGetScreenInfoReq   8
-
-/* 
- * the xRRScreenInfoReply structure is followed by:
- *
- * the size information
- */
-
-
-typedef struct {
-    BYTE    type;   /* X_Reply */
-    BYTE    setOfRotations;
-    CARD16  sequenceNumber B16;
-    CARD32  length B32;
-    Window  root B32;
-    Time    timestamp B32;
-    Time    configTimestamp B32;
-    CARD16  nSizes B16;
-    SizeID  sizeID B16;
-    Rotation  rotation B16;
-    CARD16  rate B16;
-    CARD16  nrateEnts B16;
-    CARD16  pad B16;
-} xRRGetScreenInfoReply;
-#define sz_xRRGetScreenInfoReply	32
-
-typedef struct {
-    CARD8    reqType;
-    CARD8    randrReqType;
-    CARD16   length B16;
-    Drawable drawable B32;
-    Time     timestamp B32;
-    Time     configTimestamp B32;
-    SizeID   sizeID B16;
-    Rotation rotation B16;
-} xRR1_0SetScreenConfigReq;
-#define sz_xRR1_0SetScreenConfigReq   20
-
-typedef struct {
-    CARD8    reqType;
-    CARD8    randrReqType;
-    CARD16   length B16;
-    Drawable drawable B32;
-    Time     timestamp B32;
-    Time     configTimestamp B32;
-    SizeID   sizeID B16;
-    Rotation rotation B16;
-    CARD16   rate B16;
-    CARD16   pad B16;
-} xRRSetScreenConfigReq;
-#define sz_xRRSetScreenConfigReq   24
-
-typedef struct {
-    BYTE    type;   /* X_Reply */
-    CARD8   status;
-    CARD16  sequenceNumber B16;
-    CARD32  length B32;
-    Time    newTimestamp B32;  
-    Time    newConfigTimestamp B32;
-    Window  root;
-    CARD16  subpixelOrder B16;
-    CARD16  pad4 B16;
-    CARD32  pad5 B32;
-    CARD32  pad6 B32;
-} xRRSetScreenConfigReply;
-#define sz_xRRSetScreenConfigReply 32
-
-typedef struct {
-    CARD8   reqType;
-    CARD8   randrReqType;
-    CARD16  length B16;
-    Window  window B32;
-    CARD16  enable B16;
-    CARD16  pad2 B16;
-} xRRSelectInputReq;
-#define sz_xRRSelectInputReq   12
-
-/*
- * Additions for version 1.2
- */
-
-typedef struct _xRRModeInfo {
-    RRMode		id B32;
-    CARD16		width B16;
-    CARD16		height B16;
-    CARD32		dotClock B32;
-    CARD16		hSyncStart B16;
-    CARD16		hSyncEnd B16;
-    CARD16		hTotal B16;
-    CARD16		hSkew B16;
-    CARD16		vSyncStart B16;
-    CARD16		vSyncEnd B16;
-    CARD16		vTotal B16;
-    CARD16		nameLength B16;
-    RRModeFlags		modeFlags B32;
-} xRRModeInfo;
-#define sz_xRRModeInfo		    32
-
-typedef struct {
-    CARD8   reqType;
-    CARD8   randrReqType;
-    CARD16  length B16;
-    Window  window B32;
-} xRRGetScreenSizeRangeReq;
-#define sz_xRRGetScreenSizeRangeReq 8
-
-typedef struct {
-    BYTE    type;   /* X_Reply */
-    CARD8   pad;
-    CARD16  sequenceNumber B16;
-    CARD32  length B32;
-    CARD16  minWidth B16;
-    CARD16  minHeight B16;
-    CARD16  maxWidth B16;
-    CARD16  maxHeight B16;
-    CARD32  pad0 B32;
-    CARD32  pad1 B32;
-    CARD32  pad2 B32;
-    CARD32  pad3 B32;
-} xRRGetScreenSizeRangeReply;
-#define sz_xRRGetScreenSizeRangeReply 32
-
-typedef struct {
-    CARD8   reqType;
-    CARD8   randrReqType;
-    CARD16  length B16;
-    Window  window B32;
-    CARD16  width B16;
-    CARD16  height B16;
-    CARD32  widthInMillimeters B32;
-    CARD32  heightInMillimeters B32;
-} xRRSetScreenSizeReq;
-#define sz_xRRSetScreenSizeReq	    20
-
-typedef struct {
-    CARD8   reqType;
-    CARD8   randrReqType;
-    CARD16  length B16;
-    Window  window B32;
-} xRRGetScreenResourcesReq;
-#define sz_xRRGetScreenResourcesReq 8
-
-typedef struct {
-    BYTE	type;
-    CARD8	pad;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    Time	timestamp B32;
-    Time	configTimestamp B32;
-    CARD16	nCrtcs B16;
-    CARD16	nOutputs B16;
-    CARD16	nModes B16;
-    CARD16	nbytesNames B16;
-    CARD32	pad1 B32;
-    CARD32	pad2 B32;
-} xRRGetScreenResourcesReply;
-#define sz_xRRGetScreenResourcesReply	32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-    Time	configTimestamp B32;
-} xRRGetOutputInfoReq;
-#define sz_xRRGetOutputInfoReq		12
-
-typedef struct {
-    BYTE	type;
-    CARD8	status;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    Time	timestamp B32;
-    RRCrtc	crtc B32;
-    CARD32	mmWidth B32;
-    CARD32	mmHeight B32;
-    CARD8	connection;
-    CARD8	subpixelOrder;
-    CARD16	nCrtcs B16;
-    CARD16	nModes B16;
-    CARD16	nPreferred B16;
-    CARD16	nClones B16;
-    CARD16	nameLength B16;
-} xRRGetOutputInfoReply;
-#define sz_xRRGetOutputInfoReply	36
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-} xRRListOutputPropertiesReq; 
-#define sz_xRRListOutputPropertiesReq	8
-
-typedef struct {
-    BYTE	type;
-    CARD8	pad0;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    CARD16	nAtoms B16;
-    CARD16	pad1 B16;
-    CARD32	pad2 B32;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-    CARD32	pad6 B32;
-} xRRListOutputPropertiesReply;
-#define sz_xRRListOutputPropertiesReply	32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-    Atom	property B32;
-} xRRQueryOutputPropertyReq; 
-#define sz_xRRQueryOutputPropertyReq	12
-
-typedef struct {
-    BYTE	type;
-    BYTE	pad0;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    BOOL	pending;
-    BOOL	range;
-    BOOL	immutable;
-    BYTE	pad1;
-    CARD32	pad2 B32;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-    CARD32	pad6 B32;
-} xRRQueryOutputPropertyReply;
-#define sz_xRRQueryOutputPropertyReply	32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-    Atom	property B32;
-    BOOL	pending;
-    BOOL	range;
-    CARD16	pad B16;
-} xRRConfigureOutputPropertyReq; 
-#define sz_xRRConfigureOutputPropertyReq	16
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-    Atom	property B32;
-    Atom	type B32;
-    CARD8	format;
-    CARD8	mode;
-    CARD16	pad;
-    CARD32	nUnits B32;
-} xRRChangeOutputPropertyReq;
-#define sz_xRRChangeOutputPropertyReq	24
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-    Atom	property B32;
-} xRRDeleteOutputPropertyReq;
-#define sz_xRRDeleteOutputPropertyReq	12
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-    Atom	property B32;
-    Atom	type B32;
-    CARD32	longOffset B32;
-    CARD32	longLength B32;
-#ifdef __cplusplus
-    BOOL	_delete;
-#else
-    BOOL	delete;
-#endif
-    BOOL	pending;
-    CARD16	pad1 B16;
-} xRRGetOutputPropertyReq;
-#define sz_xRRGetOutputPropertyReq	28
-
-typedef struct {
-    BYTE	type;
-    CARD8	format;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    Atom	propertyType B32;
-    CARD32	bytesAfter B32;
-    CARD32	nItems B32;
-    CARD32	pad1 B32;
-    CARD32	pad2 B32;
-    CARD32	pad3 B32;
-} xRRGetOutputPropertyReply;
-#define sz_xRRGetOutputPropertyReply	32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    Window	window B32;
-    xRRModeInfo	modeInfo;
-} xRRCreateModeReq; 
-#define sz_xRRCreateModeReq		40
-
-typedef struct {
-    BYTE	type;
-    CARD8	pad0;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    RRMode	mode B32;
-    CARD32	pad1 B32;
-    CARD32	pad2 B32;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-} xRRCreateModeReply;
-#define sz_xRRCreateModeReply		32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RRMode	mode B32;
-} xRRDestroyModeReq;
-#define sz_xRRDestroyModeReq		8
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-    RRMode	mode B32;
-} xRRAddOutputModeReq;
-#define sz_xRRAddOutputModeReq		12
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RROutput	output B32;
-    RRMode	mode B32;
-} xRRDeleteOutputModeReq;
-#define sz_xRRDeleteOutputModeReq	12
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RRCrtc	crtc B32;
-    Time	configTimestamp B32;
-} xRRGetCrtcInfoReq; 
-#define sz_xRRGetCrtcInfoReq		12
-
-typedef struct {
-    BYTE	type;
-    CARD8	status;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    Time	timestamp B32;
-    INT16	x B16;
-    INT16	y B16;
-    CARD16	width B16;
-    CARD16	height B16;
-    RRMode	mode B32;
-    Rotation	rotation B16;
-    Rotation	rotations B16;
-    CARD16	nOutput B16;
-    CARD16	nPossibleOutput B16;
-} xRRGetCrtcInfoReply;
-#define sz_xRRGetCrtcInfoReply		32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RRCrtc	crtc B32;
-    Time	timestamp B32;
-    Time    	configTimestamp B32;
-    INT16	x B16;
-    INT16	y B16;
-    RRMode	mode B32;
-    Rotation	rotation B16;
-    CARD16	pad B16;
-} xRRSetCrtcConfigReq; 
-#define sz_xRRSetCrtcConfigReq		28
-
-typedef struct {
-    BYTE	type;
-    CARD8	status;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    Time	newTimestamp B32;
-    CARD32	pad1 B32;
-    CARD32	pad2 B16;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-} xRRSetCrtcConfigReply;
-#define sz_xRRSetCrtcConfigReply	32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RRCrtc	crtc B32;
-} xRRGetCrtcGammaSizeReq; 
-#define sz_xRRGetCrtcGammaSizeReq	8
-
-typedef struct {
-    BYTE	type;
-    CARD8	status;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    CARD16	size B16;
-    CARD16	pad1 B16;
-    CARD32	pad2 B32;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-    CARD32	pad6 B32;
-} xRRGetCrtcGammaSizeReply;
-#define sz_xRRGetCrtcGammaSizeReply	32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RRCrtc	crtc B32;
-} xRRGetCrtcGammaReq; 
-#define sz_xRRGetCrtcGammaReq		8
-
-typedef struct {
-    BYTE	type;
-    CARD8	status;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    CARD16	size B16;
-    CARD16	pad1 B16;
-    CARD32	pad2 B32;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-    CARD32	pad6 B32;
-} xRRGetCrtcGammaReply;
-#define sz_xRRGetCrtcGammaReply		32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RRCrtc	crtc B32;
-    CARD16	size B16;
-    CARD16	pad1 B16;
-} xRRSetCrtcGammaReq;
-#define sz_xRRSetCrtcGammaReq		12
-
-/*
- * Additions for V1.3
- */
-
-typedef xRRGetScreenResourcesReq xRRGetScreenResourcesCurrentReq;
-
-#define sz_xRRGetScreenResourcesCurrentReq sz_xRRGetScreenResourcesReq
-
-typedef xRRGetScreenResourcesReply xRRGetScreenResourcesCurrentReply;
-#define sz_xRRGetScreenResourcesCurrentReply	sz_xRRGetScreenResourcesReply
-
-typedef struct {
-    CARD8		reqType;
-    CARD8		randrReqType;
-    CARD16		length B16;
-    RRCrtc		crtc B32;
-    xRenderTransform	transform;
-    CARD16		nbytesFilter;	/* number of bytes in filter name */
-    CARD16		pad B16;
-} xRRSetCrtcTransformReq;
-
-#define sz_xRRSetCrtcTransformReq	48
-
-typedef struct {
-    CARD8		reqType;
-    CARD8		randrReqType;
-    CARD16		length B16;
-    RRCrtc		crtc B32;
-} xRRGetCrtcTransformReq;
-
-#define sz_xRRGetCrtcTransformReq	8
-
-typedef struct {
-    BYTE		type;
-    CARD8		status;
-    CARD16		sequenceNumber B16;
-    CARD32		length B32;
-    xRenderTransform	pendingTransform;
-    BYTE		hasTransforms;
-    CARD8		pad0;
-    CARD16		pad1 B16;
-    xRenderTransform	currentTransform;
-    CARD32		pad2 B32;
-    CARD16		pendingNbytesFilter B16;    /* number of bytes in filter name */
-    CARD16		pendingNparamsFilter B16;   /* number of filter params */
-    CARD16		currentNbytesFilter B16;    /* number of bytes in filter name */
-    CARD16		currentNparamsFilter B16;   /* number of filter params */
-} xRRGetCrtcTransformReply;
-
-#define sz_xRRGetCrtcTransformReply	96
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    Window	window B32;
-    RROutput	output B32;
-} xRRSetOutputPrimaryReq;
-#define sz_xRRSetOutputPrimaryReq	12
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    Window	window B32;
-} xRRGetOutputPrimaryReq;
-#define sz_xRRGetOutputPrimaryReq	8
-
-typedef struct {
-    BYTE	type;
-    CARD8	pad;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    RROutput	output B32;
-    CARD32	pad1 B32;
-    CARD32	pad2 B32;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-} xRRGetOutputPrimaryReply;
-#define sz_xRRGetOutputPrimaryReply	32
-
-/*
- * Additions for 1.4
- */
-
-typedef struct {
-    PictFormat format B32;
-    CARD16 maxWidth B16, maxHeight B16;
-    Rotation rotations B16;
-    CARD16 pad0 B16;
-    CARD32 pad1 B32;
-} xRRScanoutPixmapInfo;
-#define sz_xRRScanoutPixmapInfo	16
-
-typedef struct {
-    RRCrtc crtc B32;
-    INT16 x B16, y B16;
-    RRMode mode B32;
-    Rotation rotation B16;
-    CARD16 nOutput B16;
-    xRenderTransform spritePositionTransform;
-    xRenderTransform spriteImageTransform;
-    Pixmap pixmap B32;
-    INT16 xPixmap B16, yPixmap B16;
-} xRRCrtcConfig;
-#define sz_xRRCrtcConfig (2*sz_xRenderTransform + 24)
-
-typedef struct {
-    CARD8 reqType;
-    CARD8 randrReqType;
-    CARD16 length B16;
-    Drawable drawable B32;
-} xRRQueryScanoutPixmapsReq;
-#define sz_xRRQueryScanoutPixmapsReq	8
-
-typedef struct {
-    BYTE	type;
-    CARD8	pad;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    CARD32	pad0 B32;
-    CARD32	pad1 B32;
-    CARD32	pad2 B32;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-} xRRQueryScanoutPixmapsReply;
-#define sz_xRRQueryScanoutPixmapsReply	32
-
-typedef struct {
-    CARD8 reqType;
-    CARD8 randrReqType;
-    CARD16 length B16;
-    Pixmap pid B32;
-    Drawable drawable B32;
-    CARD16 width B16, height B16;
-    PictFormat format B32;
-    Rotation rotations B16;
-    CARD16 pad B16;
-} xRRCreateScanoutPixmapReq;
-#define sz_xRRCreateScanoutPixmapReq	24
-
-typedef struct {
-    CARD8 reqType;
-    CARD8 randrReqType;
-    CARD16 length B16;
-    RRCrtc crtc B32;
-    xRenderTransform positionTransform;
-    xRenderTransform imageTransform;
-} xRRSetCrtcSpriteTransformReq;
-#define sz_xRRSetCrtcSpriteTransformReq	(2*sz_xRenderTransform + 8)
-
-typedef struct {
-    CARD8 reqType;
-    CARD8 randrReqType;
-    CARD16 length B16;
-    RRCrtc crtc B32;
-} xRRGetCrtcSpriteTransformReq;
-#define sz_xRRGetCrtcSpriteTransformReq	8
-
-typedef struct {
-    BYTE type;
-    CARD8 pad;
-    CARD16 sequenceNumber B16;
-    CARD32 length B32;
-    xRenderTransform positionTransform;
-    xRenderTransform imageTransform;
-} xRRGetCrtcSpriteTransformReply;
-#define sz_xRRGetCrtcSpriteTransformReply	(2*sz_xRenderTransform + 8)
-
-typedef struct {
-    CARD8 reqType;
-    CARD8 randrReqType;
-    CARD16 length B16;
-    Drawable drawable B32;
-    CARD16 screenPixmapWidth B16, screenPixmapHeight B16;
-    CARD16 screenWidth B16, screenHeight B16;
-    CARD32 widthInMillimeters B32;
-    CARD32 heightInMillimeters B32;
-    CARD16 nConfigs B16;
-    CARD16 pad0 B16;
-    CARD32 pad1 B32;
-} xRRSetCrtcConfigsReq;
-#define sz_xRRSetCrtcConfigsReq 32
-
-typedef struct {
-    BYTE	type;
-    CARD8	status;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    CARD32	pad0 B32;
-    CARD32	pad1 B32;
-    CARD32	pad2 B16;
-    CARD32	pad3 B32;
-    CARD32	pad4 B32;
-    CARD32	pad5 B32;
-} xRRSetCrtcConfigsReply;
-#define sz_xRRSetCrtcConfigsReply	32
-
-/*
- * event
- */
-typedef struct {
-    CARD8 type;				/* always evBase + ScreenChangeNotify */
-    CARD8 rotation;			/* new rotation */
-    CARD16 sequenceNumber B16;
-    Time timestamp B32;			/* time screen was changed */
-    Time configTimestamp B32;		/* time config data was changed */
-    Window root B32;			/* root window */
-    Window window B32;			/* window requesting notification */
-    SizeID sizeID B16;			/* new size ID */
-    CARD16 subpixelOrder B16;		/* subpixel order */
-    CARD16 widthInPixels B16;		/* new size */
-    CARD16 heightInPixels B16;
-    CARD16 widthInMillimeters B16;
-    CARD16 heightInMillimeters B16;
-} xRRScreenChangeNotifyEvent;
-#define sz_xRRScreenChangeNotifyEvent	32
-
-typedef struct {
-    CARD8 type;				/* always evBase + RRNotify */
-    CARD8 subCode;			/* RRNotify_CrtcChange */
-    CARD16 sequenceNumber B16;
-    Time timestamp B32;			/* time crtc was changed */
-    Window window B32;			/* window requesting notification */
-    RRCrtc crtc B32;			/* affected CRTC */
-    RRMode mode B32;			/* current mode */
-    CARD16 rotation B16;		/* rotation and reflection */
-    CARD16 pad1 B16;			/* unused */
-    INT16 x B16;			/* new location */
-    INT16 y B16;
-    CARD16 width B16;			/* new size */
-    CARD16 height B16;
-} xRRCrtcChangeNotifyEvent;
-#define sz_xRRCrtcChangeNotifyEvent	32
-
-typedef struct {
-    CARD8 type;				/* always evBase + RRNotify */
-    CARD8 subCode;			/* RRNotify_OutputChange */
-    CARD16 sequenceNumber B16;
-    Time timestamp B32;			/* time output was changed */
-    Time configTimestamp B32;		/* time config was changed */
-    Window window B32;			/* window requesting notification */
-    RROutput output B32;		/* affected output */
-    RRCrtc crtc B32;			/* current crtc */
-    RRMode mode B32;			/* current mode */
-    CARD16 rotation B16;		/* rotation and reflection */
-    CARD8 connection;			/* connection status */
-    CARD8 subpixelOrder;		/* subpixel order */
-} xRROutputChangeNotifyEvent;
-#define sz_xRROutputChangeNotifyEvent	32
-
-typedef struct {
-    CARD8 type;				/* always evBase + RRNotify */
-    CARD8 subCode;			/* RRNotify_OutputProperty */
-    CARD16 sequenceNumber B16;
-    Window window B32;			/* window requesting notification */
-    RROutput output B32;		/* affected output */
-    Atom atom B32;			/* property name */
-    Time timestamp B32;			/* time crtc was changed */
-    CARD8 state;			/* NewValue or Deleted */
-    CARD8 pad1;
-    CARD16 pad2 B16;
-    CARD32 pad3 B32;
-    CARD32 pad4 B32;
-} xRROutputPropertyNotifyEvent;
-#define sz_xRROutputPropertyNotifyEvent	32
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RRCrtc	crtc B32;
-} xRRGetPanningReq; 
-#define sz_xRRGetPanningReq		8
-
-typedef struct {
-    BYTE	type;
-    CARD8	status;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    Time	timestamp B32;
-    CARD16	left B16;
-    CARD16	top B16;
-    CARD16	width B16;
-    CARD16	height B16;
-    CARD16	track_left B16;
-    CARD16	track_top B16;
-    CARD16	track_width B16;
-    CARD16	track_height B16;
-    INT16	border_left B16;
-    INT16	border_top B16;
-    INT16	border_right B16;
-    INT16	border_bottom B16;
-} xRRGetPanningReply;
-#define sz_xRRGetPanningReply		36
-
-typedef struct {
-    CARD8	reqType;
-    CARD8	randrReqType;
-    CARD16	length B16;
-    RRCrtc	crtc B32;
-    Time	timestamp B32;
-    CARD16	left B16;
-    CARD16	top B16;
-    CARD16	width B16;
-    CARD16	height B16;
-    CARD16	track_left B16;
-    CARD16	track_top B16;
-    CARD16	track_width B16;
-    CARD16	track_height B16;
-    INT16	border_left B16;
-    INT16	border_top B16;
-    INT16	border_right B16;
-    INT16	border_bottom B16;
-} xRRSetPanningReq; 
-#define sz_xRRSetPanningReq		36
-
-typedef struct {
-    BYTE	type;
-    CARD8	status;
-    CARD16	sequenceNumber B16;
-    CARD32	length B32;
-    Time	newTimestamp B32;
-    CARD32      pad1 B32;
-    CARD32      pad2 B32;
-    CARD32      pad3 B32;
-    CARD32      pad4 B32;
-    CARD32      pad5 B32;
-} xRRSetPanningReply;
-#define sz_xRRSetPanningReply	32
-
-#undef PictFormat
-#undef RRModeFlags
-#undef RRCrtc
-#undef RRMode
-#undef RROutput
-#undef RRMode
-#undef RRCrtc
-#undef Drawable
-#undef Window
-#undef Font
-#undef Pixmap
-#undef Cursor
-#undef Colormap
-#undef GContext
-#undef Atom
-#undef Time
-#undef KeyCode
-#undef KeySym
-#undef Rotation
-#undef SizeID
-#undef SubpixelOrder
-
-#endif /* _XRANDRP_H_ */
+/*
+ * Copyright © 2000 Compaq Computer Corporation
+ * Copyright © 2002 Hewlett-Packard Company
+ * Copyright © 2006 Intel Corporation
+ * Copyright © 2008 Red Hat, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * Author:  Jim Gettys, Hewlett-Packard Company, Inc.
+ *	    Keith Packard, Intel Corporation
+ */
+
+/* note that RANDR 1.0 is incompatible with version 0.0, or 0.1 */
+/* V1.0 removes depth switching from the protocol */
+#ifndef _XRANDRP_H_
+#define _XRANDRP_H_
+
+#include <X11/extensions/randr.h>
+#include <X11/extensions/renderproto.h>
+
+#define Window CARD32
+#define Drawable CARD32
+#define Font CARD32
+#define Pixmap CARD32
+#define Cursor CARD32
+#define Colormap CARD32
+#define GContext CARD32
+#define Atom CARD32
+#define Time CARD32
+#define KeyCode CARD8
+#define KeySym CARD32
+#define RROutput CARD32
+#define RRMode CARD32
+#define RRCrtc CARD32
+#define RRModeFlags CARD32
+#define PictFormat CARD32
+
+#define Rotation CARD16
+#define SizeID CARD16
+#define SubpixelOrder CARD16
+
+/*
+ * data structures
+ */
+
+typedef struct {
+    CARD16 widthInPixels B16;
+    CARD16 heightInPixels B16;
+    CARD16 widthInMillimeters B16;
+    CARD16 heightInMillimeters B16;
+} xScreenSizes;
+#define sz_xScreenSizes 8
+
+/* 
+ * requests and replies
+ */
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   randrReqType;
+    CARD16  length B16;
+    CARD32  majorVersion B32;
+    CARD32  minorVersion B32;
+} xRRQueryVersionReq;
+#define sz_xRRQueryVersionReq   12
+
+typedef struct {
+    BYTE    type;   /* X_Reply */
+    BYTE    pad1;
+    CARD16  sequenceNumber B16;
+    CARD32  length B32;
+    CARD32  majorVersion B32;
+    CARD32  minorVersion B32;
+    CARD32  pad2 B32;
+    CARD32  pad3 B32;
+    CARD32  pad4 B32;
+    CARD32  pad5 B32;
+} xRRQueryVersionReply;
+#define sz_xRRQueryVersionReply	32
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   randrReqType;
+    CARD16  length B16;
+    Window  window B32;
+} xRRGetScreenInfoReq;
+#define sz_xRRGetScreenInfoReq   8
+
+/* 
+ * the xRRScreenInfoReply structure is followed by:
+ *
+ * the size information
+ */
+
+
+typedef struct {
+    BYTE    type;   /* X_Reply */
+    BYTE    setOfRotations;
+    CARD16  sequenceNumber B16;
+    CARD32  length B32;
+    Window  root B32;
+    Time    timestamp B32;
+    Time    configTimestamp B32;
+    CARD16  nSizes B16;
+    SizeID  sizeID B16;
+    Rotation  rotation B16;
+    CARD16  rate B16;
+    CARD16  nrateEnts B16;
+    CARD16  pad B16;
+} xRRGetScreenInfoReply;
+#define sz_xRRGetScreenInfoReply	32
+
+typedef struct {
+    CARD8    reqType;
+    CARD8    randrReqType;
+    CARD16   length B16;
+    Drawable drawable B32;
+    Time     timestamp B32;
+    Time     configTimestamp B32;
+    SizeID   sizeID B16;
+    Rotation rotation B16;
+} xRR1_0SetScreenConfigReq;
+#define sz_xRR1_0SetScreenConfigReq   20
+
+typedef struct {
+    CARD8    reqType;
+    CARD8    randrReqType;
+    CARD16   length B16;
+    Drawable drawable B32;
+    Time     timestamp B32;
+    Time     configTimestamp B32;
+    SizeID   sizeID B16;
+    Rotation rotation B16;
+    CARD16   rate B16;
+    CARD16   pad B16;
+} xRRSetScreenConfigReq;
+#define sz_xRRSetScreenConfigReq   24
+
+typedef struct {
+    BYTE    type;   /* X_Reply */
+    CARD8   status;
+    CARD16  sequenceNumber B16;
+    CARD32  length B32;
+    Time    newTimestamp B32;  
+    Time    newConfigTimestamp B32;
+    Window  root;
+    CARD16  subpixelOrder B16;
+    CARD16  pad4 B16;
+    CARD32  pad5 B32;
+    CARD32  pad6 B32;
+} xRRSetScreenConfigReply;
+#define sz_xRRSetScreenConfigReply 32
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   randrReqType;
+    CARD16  length B16;
+    Window  window B32;
+    CARD16  enable B16;
+    CARD16  pad2 B16;
+} xRRSelectInputReq;
+#define sz_xRRSelectInputReq   12
+
+/*
+ * Additions for version 1.2
+ */
+
+typedef struct _xRRModeInfo {
+    RRMode		id B32;
+    CARD16		width B16;
+    CARD16		height B16;
+    CARD32		dotClock B32;
+    CARD16		hSyncStart B16;
+    CARD16		hSyncEnd B16;
+    CARD16		hTotal B16;
+    CARD16		hSkew B16;
+    CARD16		vSyncStart B16;
+    CARD16		vSyncEnd B16;
+    CARD16		vTotal B16;
+    CARD16		nameLength B16;
+    RRModeFlags		modeFlags B32;
+} xRRModeInfo;
+#define sz_xRRModeInfo		    32
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   randrReqType;
+    CARD16  length B16;
+    Window  window B32;
+} xRRGetScreenSizeRangeReq;
+#define sz_xRRGetScreenSizeRangeReq 8
+
+typedef struct {
+    BYTE    type;   /* X_Reply */
+    CARD8   pad;
+    CARD16  sequenceNumber B16;
+    CARD32  length B32;
+    CARD16  minWidth B16;
+    CARD16  minHeight B16;
+    CARD16  maxWidth B16;
+    CARD16  maxHeight B16;
+    CARD32  pad0 B32;
+    CARD32  pad1 B32;
+    CARD32  pad2 B32;
+    CARD32  pad3 B32;
+} xRRGetScreenSizeRangeReply;
+#define sz_xRRGetScreenSizeRangeReply 32
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   randrReqType;
+    CARD16  length B16;
+    Window  window B32;
+    CARD16  width B16;
+    CARD16  height B16;
+    CARD32  widthInMillimeters B32;
+    CARD32  heightInMillimeters B32;
+} xRRSetScreenSizeReq;
+#define sz_xRRSetScreenSizeReq	    20
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   randrReqType;
+    CARD16  length B16;
+    Window  window B32;
+} xRRGetScreenResourcesReq;
+#define sz_xRRGetScreenResourcesReq 8
+
+typedef struct {
+    BYTE	type;
+    CARD8	pad;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    Time	timestamp B32;
+    Time	configTimestamp B32;
+    CARD16	nCrtcs B16;
+    CARD16	nOutputs B16;
+    CARD16	nModes B16;
+    CARD16	nbytesNames B16;
+    CARD32	pad1 B32;
+    CARD32	pad2 B32;
+} xRRGetScreenResourcesReply;
+#define sz_xRRGetScreenResourcesReply	32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+    Time	configTimestamp B32;
+} xRRGetOutputInfoReq;
+#define sz_xRRGetOutputInfoReq		12
+
+typedef struct {
+    BYTE	type;
+    CARD8	status;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    Time	timestamp B32;
+    RRCrtc	crtc B32;
+    CARD32	mmWidth B32;
+    CARD32	mmHeight B32;
+    CARD8	connection;
+    CARD8	subpixelOrder;
+    CARD16	nCrtcs B16;
+    CARD16	nModes B16;
+    CARD16	nPreferred B16;
+    CARD16	nClones B16;
+    CARD16	nameLength B16;
+} xRRGetOutputInfoReply;
+#define sz_xRRGetOutputInfoReply	36
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+} xRRListOutputPropertiesReq; 
+#define sz_xRRListOutputPropertiesReq	8
+
+typedef struct {
+    BYTE	type;
+    CARD8	pad0;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    CARD16	nAtoms B16;
+    CARD16	pad1 B16;
+    CARD32	pad2 B32;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+    CARD32	pad6 B32;
+} xRRListOutputPropertiesReply;
+#define sz_xRRListOutputPropertiesReply	32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+    Atom	property B32;
+} xRRQueryOutputPropertyReq; 
+#define sz_xRRQueryOutputPropertyReq	12
+
+typedef struct {
+    BYTE	type;
+    BYTE	pad0;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    BOOL	pending;
+    BOOL	range;
+    BOOL	immutable;
+    BYTE	pad1;
+    CARD32	pad2 B32;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+    CARD32	pad6 B32;
+} xRRQueryOutputPropertyReply;
+#define sz_xRRQueryOutputPropertyReply	32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+    Atom	property B32;
+    BOOL	pending;
+    BOOL	range;
+    CARD16	pad B16;
+} xRRConfigureOutputPropertyReq; 
+#define sz_xRRConfigureOutputPropertyReq	16
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+    Atom	property B32;
+    Atom	type B32;
+    CARD8	format;
+    CARD8	mode;
+    CARD16	pad;
+    CARD32	nUnits B32;
+} xRRChangeOutputPropertyReq;
+#define sz_xRRChangeOutputPropertyReq	24
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+    Atom	property B32;
+} xRRDeleteOutputPropertyReq;
+#define sz_xRRDeleteOutputPropertyReq	12
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+    Atom	property B32;
+    Atom	type B32;
+    CARD32	longOffset B32;
+    CARD32	longLength B32;
+#ifdef __cplusplus
+    BOOL	_delete;
+#else
+    BOOL	delete;
+#endif
+    BOOL	pending;
+    CARD16	pad1 B16;
+} xRRGetOutputPropertyReq;
+#define sz_xRRGetOutputPropertyReq	28
+
+typedef struct {
+    BYTE	type;
+    CARD8	format;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    Atom	propertyType B32;
+    CARD32	bytesAfter B32;
+    CARD32	nItems B32;
+    CARD32	pad1 B32;
+    CARD32	pad2 B32;
+    CARD32	pad3 B32;
+} xRRGetOutputPropertyReply;
+#define sz_xRRGetOutputPropertyReply	32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    Window	window B32;
+    xRRModeInfo	modeInfo;
+} xRRCreateModeReq; 
+#define sz_xRRCreateModeReq		40
+
+typedef struct {
+    BYTE	type;
+    CARD8	pad0;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    RRMode	mode B32;
+    CARD32	pad1 B32;
+    CARD32	pad2 B32;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+} xRRCreateModeReply;
+#define sz_xRRCreateModeReply		32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RRMode	mode B32;
+} xRRDestroyModeReq;
+#define sz_xRRDestroyModeReq		8
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+    RRMode	mode B32;
+} xRRAddOutputModeReq;
+#define sz_xRRAddOutputModeReq		12
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RROutput	output B32;
+    RRMode	mode B32;
+} xRRDeleteOutputModeReq;
+#define sz_xRRDeleteOutputModeReq	12
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RRCrtc	crtc B32;
+    Time	configTimestamp B32;
+} xRRGetCrtcInfoReq; 
+#define sz_xRRGetCrtcInfoReq		12
+
+typedef struct {
+    BYTE	type;
+    CARD8	status;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    Time	timestamp B32;
+    INT16	x B16;
+    INT16	y B16;
+    CARD16	width B16;
+    CARD16	height B16;
+    RRMode	mode B32;
+    Rotation	rotation B16;
+    Rotation	rotations B16;
+    CARD16	nOutput B16;
+    CARD16	nPossibleOutput B16;
+} xRRGetCrtcInfoReply;
+#define sz_xRRGetCrtcInfoReply		32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RRCrtc	crtc B32;
+    Time	timestamp B32;
+    Time    	configTimestamp B32;
+    INT16	x B16;
+    INT16	y B16;
+    RRMode	mode B32;
+    Rotation	rotation B16;
+    CARD16	pad B16;
+} xRRSetCrtcConfigReq; 
+#define sz_xRRSetCrtcConfigReq		28
+
+typedef struct {
+    BYTE	type;
+    CARD8	status;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    Time	newTimestamp B32;
+    CARD32	pad1 B32;
+    CARD32	pad2 B16;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+} xRRSetCrtcConfigReply;
+#define sz_xRRSetCrtcConfigReply	32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RRCrtc	crtc B32;
+} xRRGetCrtcGammaSizeReq; 
+#define sz_xRRGetCrtcGammaSizeReq	8
+
+typedef struct {
+    BYTE	type;
+    CARD8	status;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    CARD16	size B16;
+    CARD16	pad1 B16;
+    CARD32	pad2 B32;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+    CARD32	pad6 B32;
+} xRRGetCrtcGammaSizeReply;
+#define sz_xRRGetCrtcGammaSizeReply	32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RRCrtc	crtc B32;
+} xRRGetCrtcGammaReq; 
+#define sz_xRRGetCrtcGammaReq		8
+
+typedef struct {
+    BYTE	type;
+    CARD8	status;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    CARD16	size B16;
+    CARD16	pad1 B16;
+    CARD32	pad2 B32;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+    CARD32	pad6 B32;
+} xRRGetCrtcGammaReply;
+#define sz_xRRGetCrtcGammaReply		32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RRCrtc	crtc B32;
+    CARD16	size B16;
+    CARD16	pad1 B16;
+} xRRSetCrtcGammaReq;
+#define sz_xRRSetCrtcGammaReq		12
+
+/*
+ * Additions for V1.3
+ */
+
+typedef xRRGetScreenResourcesReq xRRGetScreenResourcesCurrentReq;
+
+#define sz_xRRGetScreenResourcesCurrentReq sz_xRRGetScreenResourcesReq
+
+typedef xRRGetScreenResourcesReply xRRGetScreenResourcesCurrentReply;
+#define sz_xRRGetScreenResourcesCurrentReply	sz_xRRGetScreenResourcesReply
+
+typedef struct {
+    CARD8		reqType;
+    CARD8		randrReqType;
+    CARD16		length B16;
+    RRCrtc		crtc B32;
+    xRenderTransform	transform;
+    CARD16		nbytesFilter;	/* number of bytes in filter name */
+    CARD16		pad B16;
+} xRRSetCrtcTransformReq;
+
+#define sz_xRRSetCrtcTransformReq	48
+
+typedef struct {
+    CARD8		reqType;
+    CARD8		randrReqType;
+    CARD16		length B16;
+    RRCrtc		crtc B32;
+} xRRGetCrtcTransformReq;
+
+#define sz_xRRGetCrtcTransformReq	8
+
+typedef struct {
+    BYTE		type;
+    CARD8		status;
+    CARD16		sequenceNumber B16;
+    CARD32		length B32;
+    xRenderTransform	pendingTransform;
+    BYTE		hasTransforms;
+    CARD8		pad0;
+    CARD16		pad1 B16;
+    xRenderTransform	currentTransform;
+    CARD32		pad2 B32;
+    CARD16		pendingNbytesFilter B16;    /* number of bytes in filter name */
+    CARD16		pendingNparamsFilter B16;   /* number of filter params */
+    CARD16		currentNbytesFilter B16;    /* number of bytes in filter name */
+    CARD16		currentNparamsFilter B16;   /* number of filter params */
+} xRRGetCrtcTransformReply;
+
+#define sz_xRRGetCrtcTransformReply	96
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    Window	window B32;
+    RROutput	output B32;
+} xRRSetOutputPrimaryReq;
+#define sz_xRRSetOutputPrimaryReq	12
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    Window	window B32;
+} xRRGetOutputPrimaryReq;
+#define sz_xRRGetOutputPrimaryReq	8
+
+typedef struct {
+    BYTE	type;
+    CARD8	pad;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    RROutput	output B32;
+    CARD32	pad1 B32;
+    CARD32	pad2 B32;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+} xRRGetOutputPrimaryReply;
+#define sz_xRRGetOutputPrimaryReply	32
+
+/*
+ * Additions for 1.4
+ */
+
+typedef struct {
+    PictFormat format B32;
+    CARD16 maxWidth B16, maxHeight B16;
+    Rotation rotations B16;
+    CARD16 pad0 B16;
+    CARD32 pad1 B32;
+} xRRScanoutPixmapInfo;
+#define sz_xRRScanoutPixmapInfo	16
+
+typedef struct {
+    RRCrtc crtc B32;
+    CARD32 set B32;
+    INT16 x B16, y B16;
+    RRMode mode B32;
+    Rotation rotation B16;
+    CARD16 nOutput B16;
+    xRenderTransform spritePositionTransform;
+    xRenderTransform spriteImageTransform;
+    Pixmap pixmap B32;
+    INT16 xPixmap B16, yPixmap B16;
+} xRRCrtcConfig;
+#define sz_xRRCrtcConfig (2*sz_xRenderTransform + 28)
+
+typedef struct {
+    CARD8 reqType;
+    CARD8 randrReqType;
+    CARD16 length B16;
+    Drawable drawable B32;
+} xRRQueryScanoutPixmapsReq;
+#define sz_xRRQueryScanoutPixmapsReq	8
+
+typedef struct {
+    BYTE	type;
+    CARD8	pad;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    CARD32	pad0 B32;
+    CARD32	pad1 B32;
+    CARD32	pad2 B32;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+} xRRQueryScanoutPixmapsReply;
+#define sz_xRRQueryScanoutPixmapsReply	32
+
+typedef struct {
+    CARD8 reqType;
+    CARD8 randrReqType;
+    CARD16 length B16;
+    Pixmap pid B32;
+    Drawable drawable B32;
+    CARD16 width B16, height B16;
+    PictFormat format B32;
+    Rotation rotations B16;
+    CARD16 pad B16;
+} xRRCreateScanoutPixmapReq;
+#define sz_xRRCreateScanoutPixmapReq	24
+
+typedef struct {
+    CARD8 reqType;
+    CARD8 randrReqType;
+    CARD16 length B16;
+    RRCrtc crtc B32;
+    xRenderTransform positionTransform;
+    xRenderTransform imageTransform;
+} xRRSetCrtcSpriteTransformReq;
+#define sz_xRRSetCrtcSpriteTransformReq	(2*sz_xRenderTransform + 8)
+
+typedef struct {
+    CARD8 reqType;
+    CARD8 randrReqType;
+    CARD16 length B16;
+    RRCrtc crtc B32;
+} xRRGetCrtcSpriteTransformReq;
+#define sz_xRRGetCrtcSpriteTransformReq	8
+
+typedef struct {
+    BYTE type;
+    CARD8 pad;
+    CARD16 sequenceNumber B16;
+    CARD32 length B32;
+    xRenderTransform positionTransform;
+    xRenderTransform imageTransform;
+} xRRGetCrtcSpriteTransformReply;
+#define sz_xRRGetCrtcSpriteTransformReply	(2*sz_xRenderTransform + 8)
+
+typedef struct {
+    CARD8 reqType;
+    CARD8 randrReqType;
+    CARD16 length B16;
+    Drawable drawable B32;
+    CARD32 set B32;
+    CARD16 screenPixmapWidth B16, screenPixmapHeight B16;
+    CARD16 screenWidth B16, screenHeight B16;
+    CARD32 widthInMillimeters B32;
+    CARD32 heightInMillimeters B32;
+    CARD16 nConfigs B16;
+    CARD16 pad0 B16;
+    CARD32 pad1 B32;
+} xRRSetCrtcConfigsReq;
+#define sz_xRRSetCrtcConfigsReq 36
+
+typedef struct {
+    BYTE	type;
+    CARD8	status;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    CARD32	pad0 B32;
+    CARD32	pad1 B32;
+    CARD32	pad2 B16;
+    CARD32	pad3 B32;
+    CARD32	pad4 B32;
+    CARD32	pad5 B32;
+} xRRSetCrtcConfigsReply;
+#define sz_xRRSetCrtcConfigsReply	32
+
+/*
+ * event
+ */
+typedef struct {
+    CARD8 type;				/* always evBase + ScreenChangeNotify */
+    CARD8 rotation;			/* new rotation */
+    CARD16 sequenceNumber B16;
+    Time timestamp B32;			/* time screen was changed */
+    Time configTimestamp B32;		/* time config data was changed */
+    Window root B32;			/* root window */
+    Window window B32;			/* window requesting notification */
+    SizeID sizeID B16;			/* new size ID */
+    CARD16 subpixelOrder B16;		/* subpixel order */
+    CARD16 widthInPixels B16;		/* new size */
+    CARD16 heightInPixels B16;
+    CARD16 widthInMillimeters B16;
+    CARD16 heightInMillimeters B16;
+} xRRScreenChangeNotifyEvent;
+#define sz_xRRScreenChangeNotifyEvent	32
+
+typedef struct {
+    CARD8 type;				/* always evBase + RRNotify */
+    CARD8 subCode;			/* RRNotify_CrtcChange */
+    CARD16 sequenceNumber B16;
+    Time timestamp B32;			/* time crtc was changed */
+    Window window B32;			/* window requesting notification */
+    RRCrtc crtc B32;			/* affected CRTC */
+    RRMode mode B32;			/* current mode */
+    CARD16 rotation B16;		/* rotation and reflection */
+    CARD16 pad1 B16;			/* unused */
+    INT16 x B16;			/* new location */
+    INT16 y B16;
+    CARD16 width B16;			/* new size */
+    CARD16 height B16;
+} xRRCrtcChangeNotifyEvent;
+#define sz_xRRCrtcChangeNotifyEvent	32
+
+typedef struct {
+    CARD8 type;				/* always evBase + RRNotify */
+    CARD8 subCode;			/* RRNotify_OutputChange */
+    CARD16 sequenceNumber B16;
+    Time timestamp B32;			/* time output was changed */
+    Time configTimestamp B32;		/* time config was changed */
+    Window window B32;			/* window requesting notification */
+    RROutput output B32;		/* affected output */
+    RRCrtc crtc B32;			/* current crtc */
+    RRMode mode B32;			/* current mode */
+    CARD16 rotation B16;		/* rotation and reflection */
+    CARD8 connection;			/* connection status */
+    CARD8 subpixelOrder;		/* subpixel order */
+} xRROutputChangeNotifyEvent;
+#define sz_xRROutputChangeNotifyEvent	32
+
+typedef struct {
+    CARD8 type;				/* always evBase + RRNotify */
+    CARD8 subCode;			/* RRNotify_OutputProperty */
+    CARD16 sequenceNumber B16;
+    Window window B32;			/* window requesting notification */
+    RROutput output B32;		/* affected output */
+    Atom atom B32;			/* property name */
+    Time timestamp B32;			/* time crtc was changed */
+    CARD8 state;			/* NewValue or Deleted */
+    CARD8 pad1;
+    CARD16 pad2 B16;
+    CARD32 pad3 B32;
+    CARD32 pad4 B32;
+} xRROutputPropertyNotifyEvent;
+#define sz_xRROutputPropertyNotifyEvent	32
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RRCrtc	crtc B32;
+} xRRGetPanningReq; 
+#define sz_xRRGetPanningReq		8
+
+typedef struct {
+    BYTE	type;
+    CARD8	status;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    Time	timestamp B32;
+    CARD16	left B16;
+    CARD16	top B16;
+    CARD16	width B16;
+    CARD16	height B16;
+    CARD16	track_left B16;
+    CARD16	track_top B16;
+    CARD16	track_width B16;
+    CARD16	track_height B16;
+    INT16	border_left B16;
+    INT16	border_top B16;
+    INT16	border_right B16;
+    INT16	border_bottom B16;
+} xRRGetPanningReply;
+#define sz_xRRGetPanningReply		36
+
+typedef struct {
+    CARD8	reqType;
+    CARD8	randrReqType;
+    CARD16	length B16;
+    RRCrtc	crtc B32;
+    Time	timestamp B32;
+    CARD16	left B16;
+    CARD16	top B16;
+    CARD16	width B16;
+    CARD16	height B16;
+    CARD16	track_left B16;
+    CARD16	track_top B16;
+    CARD16	track_width B16;
+    CARD16	track_height B16;
+    INT16	border_left B16;
+    INT16	border_top B16;
+    INT16	border_right B16;
+    INT16	border_bottom B16;
+} xRRSetPanningReq; 
+#define sz_xRRSetPanningReq		36
+
+typedef struct {
+    BYTE	type;
+    CARD8	status;
+    CARD16	sequenceNumber B16;
+    CARD32	length B32;
+    Time	newTimestamp B32;
+    CARD32      pad1 B32;
+    CARD32      pad2 B32;
+    CARD32      pad3 B32;
+    CARD32      pad4 B32;
+    CARD32      pad5 B32;
+} xRRSetPanningReply;
+#define sz_xRRSetPanningReply	32
+
+#undef PictFormat
+#undef RRModeFlags
+#undef RRCrtc
+#undef RRMode
+#undef RROutput
+#undef RRMode
+#undef RRCrtc
+#undef Drawable
+#undef Window
+#undef Font
+#undef Pixmap
+#undef Cursor
+#undef Colormap
+#undef GContext
+#undef Atom
+#undef Time
+#undef KeyCode
+#undef KeySym
+#undef Rotation
+#undef SizeID
+#undef SubpixelOrder
+
+#endif /* _XRANDRP_H_ */
diff --git a/X11/extensions/randrproto.txt b/X11/extensions/randrproto.txt
index 9fe800f0c..20cac7562 100644
--- a/X11/extensions/randrproto.txt
+++ b/X11/extensions/randrproto.txt
@@ -1,2577 +1,2623 @@
-	       The X Resize, Rotate and Reflect Extension
-			     Version 1.3.1
-			       2009-10-5
-
-			      Jim Gettys
-			   Jim.Gettys@hp.com
-		     Cambridge Research Laboratory
-				HP Labs
-			Hewlett Packard Company
-
-			     Keith Packard
-			keith.packard@intel.com
-		     Open Source Technology Center
-			   Intel Corporation
-
-1. Introduction
-
-The X Resize, Rotate and Reflect Extension, called RandR for short,
-brings the ability to resize, rotate and reflect the root window of a
-screen. It is based on the X Resize and Rotate Extension as specified
-in the Proceedings of the 2001 Usenix Technical Conference [RANDR].
-
-RandR as implemented and integrated into the X server differs in
-one substantial fashion from the design discussed in that paper: that
-is, RandR 1.0 does not implement the depth switching described in that
-document, and the support described for that in the protocol in that
-document and in the implementation has been removed from the
-protocol described here, as it has been overtaken by events.
-
-These events include:
-      ► Modern toolkits (in this case, GTK+ 2.x) have progressed to the point
-	of implementing migration between screens of arbitrary depths
-      ► The continued advance of Moore's law has made limited amounts of VRAM
-	less of an issue, reducing the pressure to implement depth switching
-	on laptops or desktop systems
-      ► The continued decline of legacy toolkits whose design would have
-	required depth switching to support migration
-      ► The lack of depth switching implementation experience in the
-	intervening time, due to events beyond our control
-
-Additionally, the requirement to support depth switching might
-complicate other re-engineering of the device independent part of the
-X server that is currently being contemplated.
-
-Rather than further delaying RandR's widespread deployment for a feature
-long wanted by the community (resizing of screens, particularly on laptops),
-or the deployment of a protocol design that might be flawed due to lack of
-implementation experience, we decided to remove depth switching from the
-protocol. It may be implemented at a later time if resources and
-interests permit as a revision to the protocol described here, which will
-remain a stable base for applications. The protocol described here has been
-implemented in the main X.org server, and more fully in the hw/kdrive
-implementation in the distribution, which fully implements resizing,
-rotation and reflection.
-
-1.2 Introduction to version 1.2 of the extension
-
-One of the significant limitations found in version 1.1 of the RandR
-protocol was the inability to deal with the Xinerama model where multiple
-monitors display portions of a common underlying screen. In this environment,
-zero or more video outputs are associated with each CRT controller which
-defines both a set of video timings and a 'viewport' within the larger
-screen. This viewport is independent of the overall size of the screen, and
-may be located anywhere within the screen.
-
-The effect is to decouple the reported size of the screen from the size
-presented by each video output, and to permit multiple outputs to present
-information for a single screen.
-
-To extend RandR for this model, we separate out the output, CRTC and screen
-configuration information and permit them to be configured separately. For
-compatibility with the 1.1 version of the protocol, we make the 1.1 requests
-simultaneously affect both the screen and the (presumably sole) CRTC and
-output. The set of available outputs are presented with UTF-8 encoded names
-and may be connected to CRTCs as permitted by the underlying hardware. CRTC
-configuration is now done with full mode information instead of just size
-and refresh rate, and these modes have names. These names also use UTF-8
-encoding. New modes may also be added by the user.
-
-Additional requests and events are provided for this new functionality.
-
-       ┌────────────────────────────────┬──────────┐
-    ┏━━━━━━━┳───────────────┐       ╔════════╗ ╔════════╗
-    ┃   1   ┃               │       ║   A    ║ ║   B    ║
-    ┃   ┏━━━╋━━━━━━━━━━━━━━━┫       ║        ║ ║        ║
-    ┣━━━╋━━━┛               ┃       ╚════════╝ ╚════════╝
-    │   ┃         2         ┃─────────────────┐
-    │   ┃                   ┃        ╔═══════════════════╗
-    │   ┃                   ┃        ║                   ║
-    │   ┗━━━━━━━━━━━━━━━━━━━┫        ║        C          ║
-    └───────────────────────┘        ║                   ║
-    ┌──────┐  ┏━━━━┓  ╔══════╗       ║                   ║
-    │screen│  ┃CRTC┃  ║output║       ╚═══════════════════╝
-    └──────┘  ┗━━━━┛  ╚══════╝
-
-In this picture, the screen is covered (incompletely) by two CRTCs. CRTC1
-is connected to two outputs, A and B. CRTC2 is connected to output C.
-Outputs A and B will present exactly the same region of the screen using
-the same mode line. Output C will present a different (larger) region of
-the screen using a different mode line.
-
-RandR provides information about each available CRTC and output; the
-connection between CRTC and output is under application control, although
-the hardware will probably impose restrictions on the possible
-configurations. The protocol doesn't try to describe these restrictions,
-instead it provides a mechanism to find out what combinations are supported.
-
-For instance, dual-link DVI gangs two CRTC outputs together to provide higher
-bandwidth for large resolution screens. This is exposed in RandR by
-requiring that nothing be connected to the second CRTC when driving a high
-resolution screen on the first.
-
-1.3 Introduction to version 1.3 of the extension
-
-Version 1.3 builds on the changes made with version 1.2 and adds some new
-capabilities without fundmentally changing the extension again. The
-following features are added in this version:
-
-   • Projective Transforms. The implementation work for general rotation
-     support made it trivial to add full projective transformations. These
-     can be used to scale the screen up/down as well as perform projector
-     keystone correct or other effects.
-
-   • Panning. It was removed with RandR 1.2 because the old semantics didn't
-     fit any longer. With RandR 1.3 panning can be specified per crtc.
-
-1.4 Introduction to version 1.4 of the extension
-
-Version 1.4 adds a couple more capabilities to further expose the
-underlying hardware to clients
-
-   • Per-crtc pixmaps. This provides for multiple scan-out buffers
-     which applications can create and assign to arbitrary collections
-     of crtcs.
-
-   • Sprite position and image transforms. These provide a projective
-     transform for both the hot spot location and the sprite image
-     itself for each CRTC.
-
-   • RRSetCrtcConfigs request. This supplies a set of
-     crtc configurations to the server that must be applied together
-     or not at all. This can reduce screen flicker while also
-     providing the server a complete configuration for appropriate
-     resource management.
-
-The first two additions, per-crtc pixmaps and sprite transforms are
-designed to solve two problems:
-
- 1) Screen transforms. The software transform code in the X server
-    uses a shadow frame buffer, adding another copy to every graphics
-    operation. Worse, the server has no idea about when clients are
-    done drawing a frame, so the user gets additional latency and
-    judder.
-
-    The goal is to move this operation out to the compositing manager
-    which already deals with an extra copy of the frame buffer for
-    many operations. Have the compositing manager create and draw to a
-    separate pixmap for scanout. It can perform whatever transforms
-    are required to get the image in the right orientation for the
-    user.
-
- 2) Hardware scanout engine size limits. With a single scanout buffer
-    for the entire screen, it's possible for the user to ask for a
-    configuration which requires that scanout buffer to be larger than
-    the hardware is capable of scanning out from. Again, having the
-    compositing manager create a pixmap for each CRTC will allow for
-    any configuration where monitor position within the virtual space
-    isn't limited by the scanout limits.
-
-In both of these cases, the Sprite transforms are necessary to ensure
-that the sprite appears at the desired spot on each CRTC and with the
-right shape.
-
-1.99 Acknowledgements
-
-Our thanks to the contributors to the design found on the xpert mailing
-list, in particular:
-
-Alan Hourihane for work on the early implementation
-Andrew C. Aitchison for help with the XFree86 DDX implementation
-Andy Ritger for early questions about how mergefb/Xinerama work with RandR
-Carl Worth for editing the specification and Usenix paper
-David Dawes for XFree86 DDX integration work
-Thomas Winischhofer for the hardware-accelerated SiS rotation implementation
-Matthew Tippett and Kevin Martin for splitting outputs and CRTCs to more
-fully expose what video hardware can do
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-2. Screen change model
-
-Screens may change dynamically, either under control of this extension, or
-due to external events. Examples include: monitors being swapped, pressing a
-button to switch from internal display to an external monitor on a laptop,
-or, eventually, the hotplug of a display card entirely on busses such as
-Cardbus or Express Card which permit hot-swap (which will require other work
-in addition to this extension).
-
-Since the screen configuration is dynamic and asynchronous to the client and
-may change at any time RandR provides mechanisms to ensure that your clients
-view is up to date with the configuration possibilities of the moment and
-enforces applications that wish to control the configuration to prove that
-their information is up to date before honoring requests to change the
-screen configuration (by requiring a timestamp on the request).
-
-Interested applications are notified whenever the screen configuration
-changes, providing the current size of the screen and subpixel order (see
-the Render extension [RENDER]), to enable proper rendering of subpixel
-decimated client text to continue, along with a time stamp of the
-configuration change. A client must refresh its knowledge of the screen
-configuration before attempting to change the configuration after a
-notification, or the request will fail.
-
-To avoid multiplicative explosion between orientation, reflection and sizes,
-the sizes are only those sizes in the normal (0) rotation.
-
-Rotation and reflection and how they interact can be confusing. In Randr,
-the coordinate system is rotated in a counter-clockwise direction relative
-to the normal orientation. Reflection is along the window system coordinate
-system, not the physical screen X and Y axis, so that rotation and
-reflection do not interact. The other way to consider reflection is to is
-specified in the "normal" orientation, before rotation, if you find the
-other way confusing.
-
-We expect that most clients and toolkits will be oblivious to changes to the
-screen structure, as they generally use the values in the connections Display
-structure directly. By toolkits updating the values on the fly, we believe
-pop-up menus and other pop up windows will position themselves correctly in
-the face of screen configuration changes (the issue is ensuring that pop-ups
-are visible on the reconfigured screen).
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-3. Data Types
-
-The subpixel order is shared with the Render extension, and is documented
-there. The only datatype defined is the screen size, defined in the normal
-(0 degree) orientation.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-4. Errors
-
-Errors are sent using core X error reports.
-
-Output
-	A value for an OUTPUT argument does not name a defined OUTPUT.
-CRTC
-	A value for a CRTC argument does not name a defined CRTC.
-Mode
-	A value for a MODE argument does not name a defined MODE.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-5. Protocol Types
-
-RRCONFIGSTATUS { Success
-		 InvalidConfigTime
-		 InvalidTime
-		 Failed }
-
-	A value of type RRCONFIGSTATUS returned when manipulating the output
-	configuration or querying information from the server that has some
-	time-dependency.
-
-	InvalidConfigTime indicates that the supplied configuration
-	timestamp does not match the current X server configuration
-	timestamp. Usually this means that the output configuration has
-	changed since the timestamp was received by the application.
-
-	InvalidTime indicates that the supplied output reconfiguration time
-	is earlier than the most recent output reconfiguration request.
-	Generally this indicates that another application has reconfigured
-	the output using a later timestamp.
-
-	Failed is returned whenever the operation is unsuccessful for some
-	other reason. This generally indicates that the requested output
-	configuration is unsupported by the hardware. The goal is to make
-	these limitations expressed by the protocol, but when that isn't
-	possible it is correct to return this error value. If, as a
-	implentor, you find this error code required, please submit the
-	hardware constraints that exist so that a future version of the
-	extension can correctly capture the configuration constraints in
-	your system.
-
-ROTATION { Rotate_0
-	   Rotate_90
-	   Rotate_180
-	   Rotate_270
-	   Reflect_X
-	   Reflect_Y }
-
-	These values are used both to indicate a set of allowed rotations
-	and reflections as well as to indicate a specific rotation and
-	reflection combination.
-
-RRSELECTMASK { RRScreenChangeNotifyMask
-	       RRCrtcChangeNotifyMask (New in version 1.2)
-	       RROutputChangeNotifyMask (New in version 1.2)
-	       RROutputPropertyNotifyMask (New in version 1.2) }
-
-SIZEID { CARD16 }
-
-MODE { XID or None }
-
-CRTC { XID }
-
-OUTPUT { XID }
-
-CONNECTION { Connected, Disconnected, UnknownConnection }
-
-	This value provides an indication of whether an output is actually
-	connected to a monitor or other presentation device.
-
-SUBPIXELORDER { SubPixelUnknown		The subpixel order uses the Render
-		SubPixelHorizontalRGB	extensions definitions; they are here
-		SubPixelHorizontalBGR	only for convenience.
-		SubPixelVerticalRGB
-		SubPixelVerticalBGR
-		SubPixelNone }
-
-SCREENSIZE { widthInPixels, heightInPixels: CARD16
-	     widthInMillimeters, heightInMillimeters: CARD16 }
-
-MODEFLAG { HSyncPositive
-	   HSyncNegative
-	   VSyncPositive
-	   VSyncNegative
-	   Interlace
-	   DoubleScan
-	   CSync
-	   CSyncPositive
-	   CSyncNegative
-	   HSkewPresent
-	   BCast
-	   PixelMultiplex
-	   DoubleClock
-	   ClockDivideBy2 }
-
-MODEINFO { id: MODE
-	   name: STRING
-	   width, height: CARD16
-	   dotClock: CARD32
-	   hSyncStart, hSyncEnd, hTotal, hSkew: CARD16
-	   vSyncStart, vSyncEnd, vTotal: CARD16
-	   modeFlags: SETofMODEFLAG }
-
-REFRESH { rates: LISTofCARD16 }
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-5.4. Protocol Types added in version 1.4 of the extension
-
-SCANOUTPIXMAPINFO { format: PICTFORMAT
-		    maxWidth, maxHeight: CARD16
-		    rotations: SETofROTATION }
-
-	'format' is the format of the pixels within the scanout
-	pixmap. Only 'Direct' formats are supported, this will never
-	be an 'Indexed' format.
-
-	'maxWidth' and 'maxHeight' define the largest supported
-	scanout pixmap. There is no minimum size; scanout pixmaps down
-	to 1x1 may be created.
-
-	'rotations' lists the set of rotations which can be provided
-	without additional latency or memory usage within the
-	environment. This typically means that they are supported
-	directly by the hardware. It is expected that a compositing
-	manager will perform other transforms as a part of the
-	compositing process in conjunction with the sprite transforms
-	described in this extension.
-
-CRTCCONFIG { crtc: CRTC
-	     x, y: INT16
-	     mode: MODE
-	     rotation: ROTATION
-	     sprite-position-transform: TRANSFORM
-	     sprite-image-transform: TRANSFORM
-	     outputs: LISTofOUTPUT
-	     pixmap: PIXMAP, None or CurrentScanoutPixmap
-	     pixmap-x, pixmap-y: INT16 }
-
-	The sprite-position-transform and sprite-image-transform
-	values are used as in the RRSetCrtcSpriteTransform request
-	position-transform and image-transform parameters.
-
-	'pixmap' specifies the origin of the pixel data to be presented on
-	'crtc'. If 'pixmap' is None, then data will be presented from
-	the screen pixmap. If 'pixmap' is 'CurrentScanoutPixmap', then
-	whatever source is currently in use will remain in use, whether
-	that is the screen pixmap or some other allocated scanout pixmap.
-
-	'pixmap-x' and 'pixmap-y' specify the origin of the scanout
-	data within the pixmap, the area from that location to
-	pixmap-x + width-of(mode), pixmap-y + height-of(mode) is what
-	will be seen on the connected outputs.
-
-	The pixmap value must specify a scanout pixmap as created by
-	RRCreateScanoutPixmap, or a Match error results.
-
-	The specified pixmap must be at least as large as the area to
-	be scanned out, or a Match error results.
-
-	The specified pixmap must have had the specified 'rotation'
-	included as a part of its creation paramaeters, or a Match
-	error results.
-
-	If 'pixmap' is destroyed while still being used as a scanout
-	pixmap, then the associated CRTC will have its scanout pixmap
-	set back to None, the CRTC origin set back to 0,0 (to make
-	sure it fits) and the screen pixmap width and height increased
-	to be at least as big as the current CRTC mode.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-6. Extension Initialization
-
-The name of this extension is "RANDR".
-
-┌───
-    RRQueryVersion
-	client-major-version:	CARD32
-	client-minor-version:	CARD32
-      ▶
-	major-version:		CARD32
-	minor-version:		CARD32
-└───
-
-	The client sends the highest supported version to the server
-	and the server sends the highest version it supports, but no
-	higher than the requested version. Major versions changes can
-	introduce incompatibilities in existing functionality, minor
-	version changes introduce only backward compatible changes.
-	It is the clients responsibility to ensure that the server
-	supports a version which is compatible with its expectations.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-7. Extension Requests
-
-┌───
-    RRSelectInput
-	window: WINDOW
-	enable: SETofRRSELECTMASK
-└───
-	Errors: Window, Value
-
-	If 'enable' is RRScreenChangeNotifyMask, RRScreenChangeNotify events
-	will be sent when the screen configuration changes, either from
-	this protocol extension, or due to detected external screen
-	configuration changes. RRScreenChangeNotify may also be sent when
-	this request executes if the screen configuration has changed since
-	the client connected, to avoid race conditions.
-
-	New for version 1.2:
-
-	If 'enable' contains RRCrtcChangeMask, RRCrtcChangeNotify events
-	will be sent when a the configuration for a CRTC associated with the
-	screen changes, either through this protocol extension or due to
-	detected external changes. RRCrtcChangeNotify may also be sent when
-	this request executes if the CRTC configuration has changed since
-	the client connected, to avoid race conditions.
-
-	If 'enable' contains RROutputChangeMask, RROutputChangeNotify events
-	will be sent when a the configuration for an output associated with
-	the screen changes, either through this protocol extension or due to
-	detected external changes. RROutputChangeNotify may also be sent
-	when this request executes if the output configuration has changed
-	since the client connected, to avoid race conditions.
-
-	If 'enable' contains RROutputPropertyNotifyMask,
-	RROutputPropertyNotify events will be sent when properties change on
-	this output.
-
-┌───
-    RRSetScreenConfig
-	window: WINDOW
-	timestamp: TIMESTAMP
-	config-timestamp: TIMESTAMP
-	size-id: SIZEID
-	rotation: ROTATION
-	rate: CARD16
-      ▶
-	status: RRCONFIGSTATUS
-	new-timestamp: TIMESTAMP
-	config-timestamp: TIMESTAMP
-	root: WINDOW
-	subpixelOrder: SUBPIXELORDER
-└───
-	Errors: Value, Match
-
-	If 'timestamp' is less than the time when the configuration was last
-	successfully set, the request is ignored and InvalidTime returned in
-	status.
-
-	If 'config-timestamp' is not equal to when the server's screen
-	configurations last changed, the request is ignored and
-	InvalidConfigTime returned in status. This could occur if the
-	screen changed since you last made a RRGetScreenInfo request,
-	perhaps by a different piece of display hardware being installed.
-	Rather than allowing an incorrect call to be executed based on stale
-	data, the server will ignore the request.
-
-	'rate' contains the desired refresh rate. If it is zero, the server
-	selects an appropriate rate.
-
-	This request may fail for other indeterminate reasons, in which case
-	'status' will be set to Failed and no configuration change will be
-	made.
-
-	This request sets the screen to the specified size, rate, rotation
-	and reflection.
-
-	When this request succeeds, 'status' contains Success and the
-	requested changes to configuration will have been made.
-
-	'new-time-stamp' contains the time at which this request was
-	executed.
-
-	'config-timestamp' contains the time when the possible screen
-	configurations were last changed.
-
-	'root' contains the root window for the screen indicated by the
-	window.
-
-	'subpixelOrder' contains the resulting subpixel order of the screen
-	to allow correct subpixel rendering.
-
-	Value errors are generated when 'rotation', 'rate' or 'size-id'
-	are invalid.
-
-┌───
-    RRGetScreenInfo
-	window: WINDOW
-      ▶
-	rotations: SETofROTATION
-	root: WINDOW
-	timestamp: TIMESTAMP
-	config-timestamp: TIMESTAMP
-	size-id: SIZEID
-	rotation: ROTATION
-	rate: CARD16
-	sizes: LISTofSCREENSIZE
-	refresh: LISTofREFRESH
-└───
-
-	Errors: Window
-
-	RRGetScreenInfo returns information about the current and available
-	configurations for the screen associated with 'window'.
-
-	'rotations' contains the set of rotations and reflections supported
-	by the screen.
-
-	'root' is the root window of the screen.
-
-	'config-timestamp' indicates when the screen configuration
-	information last changed: requests to set the screen will fail
-	unless the timestamp indicates that the information the client
-	is using is up to date, to ensure clients can be well behaved
-	in the face of race conditions.
-
-	'timestamp' indicates when the configuration was last set.
-
-	'size-id' indicates which size is active.
-
-	'rate' is the current refresh rate. This is zero when the refresh
-	rate is unknown or on devices for which refresh is not relevant.
-
-	'sizes' is the list of possible frame buffer sizes (at the normal
-	orientation. Each size indicates both the linear physical size of
-	the screen and the pixel size.
-
-	'refresh' is the list of refresh rates for each size. Each element
-	of 'sizes' has a corresponding element in 'refresh'. An empty list
-	indicates no known rates, or a device for which refresh is not
-	relevant.
-
-	The default size of the screen (the size that would become the
-	current size when the server resets) is the first size in the
-	list.
-
-7.1. Extension Requests added in version 1.2 of the extension
-
-As introduced above, version 1.2 of the extension splits the screen size
-from the crtc and output configuration, permitting the subset of the screen
-presented by multiple outputs to be configured. As a separate notion, the
-size of the screen itself may be arbitrarily configured within a defined
-range. As crtcs and outputs are added and removed from the system, the set
-returned by the extension will change so that applications can detect
-dynamic changes in the display environment.
-
-┌───
-    RRGetScreenSizeRange
-	window: WINDOW
-      ▶
-	CARD16	minWidth, minHeight
-	CARD16	maxWidth, maxHeight
-└───
-	Errors: Window
-
-	Returns the range of possible screen sizes. The screen may be set to
-	any size within this range.
-
-┌───
-    RRSetScreenSize
-	window: WINDOW
-	width: CARD16
-	height: CARD16
-	width-in-millimeters: CARD32
-	height-in-millimeters: CARD32
-└───
-	Errors: Window, Match, Value
-
-	Sets the screen to the specified size. 'width' and 'height' must be
-	within the range allowed by GetScreenSizeRanges, otherwise a Value
-	error results. All active monitors must be configured to display a
-	subset of the specified size, else a Match error results.
-
-	'width-in-millimeters' and 'height-in-millimeters' can be set to
-	reflect the physical size of the screen reported both through this
-	extension and the core protocol. They must be non-zero, or Value
-	error results.
-
-	If panning is enabled, the width and height of the panning and the
-	tracking areas are adapted to the new size and clamped afterwards.
-	Disabled panning axes remain disabled.
-	Panning borders are disabled if their requirements are no longer met
-	(see RRSetPanning).
-
-┌───
-    RRGetScreenResources
-	window: WINDOW
-      ▶
-	timestamp: TIMESTAMP
-	config-timestamp: TIMESTAMP
-	crtcs: LISTofCRTC
-	outputs: LISTofOUTPUT
-	modes: LISTofMODEINFO
-└───
-	Errors: Window
-
-	RRGetScreenResources returns the list of outputs and crtcs connected
-	to the screen associated with 'window'.
-
-	'timestamp' indicates when the configuration was last set.
-
-	'config-timestamp' indicates when the configuration information last
-	changed. Requests to configure the output will fail unless the
-	timestamp indicates that the information the client is using is up
-	to date, to ensure clients can be well behaved in the face of race
-	conditions.
-
-	'crtcs' contains the list of CRTCs associated with the screen.
-
-	'outputs' contains the list of outputs associated with the screen.
-
-	'modes' contains the list of modes associated with the screen
-
-	This request explicitly asks the server to ensure that the
-	configuration data is up-to-date wrt the hardware. If that requires
-	polling, this is when such polling would take place.  If the
-	current configuration is all that's required, use
-	RRGetScreenResourcesCurrent instead.
-
-┌───
-    RRGetOutputInfo
-	output: OUTPUT
-	config-timestamp: TIMESTAMP
-      ▶
-	status: RRCONFIGSTATUS
-	timestamp: TIMESTAMP
-	crtc: CRTC
-
-	name: STRING
-	connection: CONNECTION
-	subpixel-order: SUBPIXELORDER
-	widthInMillimeters, heightInMillimeters: CARD32
-	crtcs: LISTofCRTC
-	clones: LISTofOUTPUT
-	modes: LISTofMODE
-	num-preferred: CARD16
-└───
-	Errors: Output
-
-	RRGetOutputInfo returns information about the current and available
-	configurations 'output'.
-
-	If 'config-timestamp' does not match the current configuration
-	timestamp (as returned by RRGetScreenResources), 'status' is set to
-	InvalidConfigTime and the remaining reply data is empty. Otherwise,
-	'status' is set to Success.
-
-	'timestamp' indicates when the configuration was last set.
-
-	'crtc' is the current source CRTC for video data, or Disabled if the
-	output is not connected to any CRTC.
-
-	'name' is a UTF-8 encoded string designed to be presented to the
-	user to indicate which output this is. E.g. "S-Video" or "DVI".
-
-	'connection' indicates whether the hardware was able to detect a
-	device connected to this output. If the hardware cannot determine
-	whether something is connected, it will set this to
-	UnknownConnection.
-
-	'subpixel-order' contains the resulting subpixel order of the
-	connected device to allow correct subpixel rendering.
-
-	'widthInMillimeters' and 'heightInMillimeters' report the physical
-	size of the displayed area. If unknown, or not really fixed (e.g.,
-	for a projector), these	values are both zero.
-
-	'crtcs' is the list of CRTCs that this output may be connected to.
-	Attempting to connect this output to a different CRTC results in a
-	Match error.
-
-	'clones' is the list of outputs which may be simultaneously
-	connected to the same CRTC along with this output. Attempting to
-	connect this output with an output not in the 'clones' list
-	results in a Match error.
-
-	'modes' is the list of modes supported by this output. Attempting to
-	connect this output to a CRTC not using one of these modes results
-	in a Match error.
-
-	The first 'num-preferred' modes in 'modes' are preferred by the
-	monitor in some way; for fixed-pixel devices, this would generally
-	indicate which modes match the resolution of the output device.
-
-┌───
-    RRListOutputProperties
-	output:OUTPUT
-      ▶
-	atoms: LISTof ATOM
-└───
-	Errors: Output
-
-	This request returns the atoms of properties currently defined on
-	the output.
-
-┌───
-    RRQueryOutputProperty
-	output: OUTPUT
-	property: ATOM
-      ▶
-	pending: BOOL
-	range: BOOL
-	immutable: BOOL
-	valid-values: LISTofINT32
-└───
-	Errors: Name, Atom, Output
-
-	If the specified property does not exist for the specified output,
-	then a Name error is returned.
-
-	If 'pending' is TRUE, changes made to property values with
-	RRChangeOutputProperty will be saved in the pending property value
-	and be automatically copied to the current value on the next
-	RRSetCrtcConfig request involving the named output. If 'pending' is
-	FALSE, changes are copied immediately.
-
-	If 'range' is TRUE, then the valid-values list will contain
-	precisely two values indicating the minimum and maximum allowed
-	values. If 'range' is FALSE, then the valid-values list will contain
-	the list of possible values; attempts to set other values will
-	result in a Value error.
-
-	If 'immutable' is TRUE, then the property configuration cannot be
-	changed by clients. Immutable properties are interpreted by the X
-	server.
-
-┌───
-    RRConfigureOutputProperty
-	output: OUTPUT
-	property: ATOM
-	pending: BOOL
-	range: BOOL
-	valid-values: LISTofINT32
-└───
-	Errors: Access, Name, Atom, Output
-
-	If the specified property is 'immutable', an Access error is
-	returned.
-
-	Otherwise, the configuration of the specified property is changed to
-	the values provided in this request.
-
-	If the specified property does not exist for the specified output,
-	it is created with an empty value and None type.
-
-┌───
-    RRChangeOutputProperty
-	output: OUTPUT
-	property, type: ATOM
-	format: {8, 16, 32}
-	mode: { Replace, Prepend, Append }
-	data: LISTofINT8 or LISTofINT16 or LISTofINT32
-└───
-	Errors: Alloc, Atom, Match, Value, Output
-
-	This request alters the value of the property for the specified
-	output. If the property is marked as a 'pending' property, only the
-	pending value of the property is changed. Otherwise, changes are
-	reflected in both the pending and current values of the property.
-	The type is uninterpreted by the server.  The format specifies
-	whether the data should be viewed as a list of 8-bit, 16-bit, or
-	32-bit quantities so that the server can correctly byte-swap as
-	necessary.
-
-	If the mode is Replace, the previous property value is discarded.
-	If the mode is Prepend or Append, then the type and format must
-	match the existing property value (or a Match error results).  If
-	the property is undefined, it is treated as defined with the correct
-	type and format with zero-length data.
-
-	For Prepend, the data is tacked on to the beginning of the existing
-	data, and for Append, it is tacked on to the end of the existing data.
-
-	This request generates a OutputPropertyNotify
-
-	The lifetime of a property is not tied to the storing client.
-	Properties remain until explicitly deleted, until the output is
-	destroyed, or until server reset (see section 10).
-
-	The maximum size of a property is server-dependent and may vary
-	dynamically.
-
-┌───
-    RRDeleteOutputProperty
-	output: OUTPUT
-	property: ATOM
-└───
-	Errors: Atom, Output
-
-	This request deletes the property from the specified window if the
-	property exists and generates a OutputPropertyNotify event unless
-	the property does not exist.
-
-┌───
-    RRGetOutputProperty
-	output: OUTPUT
-	property: ATOM
-	type: ATOM or AnyPropertyType
-	long-offset, long-length: CARD32
-	delete: BOOL
-	pending: BOOL
-      ▶
-	type: ATOM or None
-	format: {0, 8, 16, 32}
-	bytes-after: CARD32
-	value: LISTofINT8 or LISTofINT16 or LISTofINT32
-└───
-	Errors: Atom, Value, Output
-
-	If the specified property does not exist for the specified output,
-	then the return type is None, the format and bytes-after are zero,
-	and the value is empty.  The delete argument is ignored in this
-	case.
-
-	If the specified property exists but its type does not match the
-	specified type, then the return type is the actual type of the
-	property, the format is the actual format of the property (never
-	zero), the bytes-after is the length of the property in bytes (even
-	if the format is 16 or 32), and the value is empty.  The delete
-	argument is ignored in this case.
-
-	If the specified property exists and either AnyPropertyType is
-	specified or the specified type matches the actual type of the
-	property, then the return type is the actual type of the property,
-	the format is the actual format of the property (never zero), and
-	the bytes-after and value are as follows, given:
-
-		N = actual length of the stored property in bytes
-				  (even if the format is 16 or 32)
-		I = 4 × offset
-		T = N - I
-		L = MINIMUM(T, 4 × long-length)
-		A = N - (I + L)
-
-	If 'pending' is true, and if the property holds a pending value,
-	then the value returned will be the pending value of the property
-	rather than the current value.  The returned value starts at byte
-	index I in the property (indexing from 0), and its length in bytes
-	is L.  However, it is a Value error if long-offset is given such
-	that L is negative.  The value of bytes-after is A, giving the
-	number of trailing unread bytes in the stored property.  If delete
-	is True and the bytes-after is zero, the property is also deleted
-	from the output, and a RROutputPropertyNotify event is generated.
-
-┌───
-    RRCreateMode
-	window: WINDOW
-	modeinfo: MODEINFO
-      ▶
-	mode: MODE
-└───
-	Errors: Window, Name, Value
-
-	'modeinfo' provides a new mode for outputs on the screen
-	associated with 'window'. If the name of 'modeinfo' names an
-	existing mode, a Name error is returned.  If some parameter of the
-	mode is not valid in some other way, a Value error is returned.
-
-	The returned 'mode' provides the id for the mode.
-
-┌───
-    RRDestroyMode
-	mode: MODE
-└───
-	Errors: Mode, Access
-
-	The user-defined 'mode' is destroyed. 'mode' must name a mode
-	defined with RRCreateMode, else an Match error is returned.  If
-	'mode' is in use by some CRTC or Output, then an Access error is
-	returned.
-
-┌───
-    RRAddOutputMode
-	output: OUTPUT
-	mode: MODE
-└───
-	Errors: Output, Mode, Match
-
-	'output' indicates which output is to be configured.
-
-	'mode' specifies which mode to add. If 'mode' is not valid for
-	'output', then a Match error is generated.
-
-	This request generates OutputChangeNotify events.
-
-┌───
-    RRDeleteOutputMode
-	output: OUTPUT
-	mode: MODE
-└───
-	Errors: Output, Mode
-
-	'output' indicates which output is to be configured.
-
-	'mode' specifies which mode to delete. 'mode' must have been added
-	with RRAddOutputMode, else an Access error is returned. 'mode' must
-	not be active, else a Match error is returned.
-
-	This request generates OutputChangeNotify events.
-
-┌───
-    RRGetCrtcInfo
-	crtc: CRTC
-	config-timestamp: TIMESTAMP
-      ▶
-	status: RRCONFIGSTATUS
-	timestamp: TIMESTAMP
-	x, y: INT16
-	width, height: CARD16
-	mode: MODE
-	rotation: ROTATION
-	outputs: LISTofOUTPUT
-
-	rotations: SETofROTATION
-	possible-outputs: LISTofOUTPUT
-└───
-
-	Errors: Window
-
-	RRGetCrtcModes returns information about the current and available
-	configurations for the specified crtc connected to the screen
-	associated with 'window'.
-
-	If 'config-timestamp' does not match the current configuration
-	timestamp (as returned by RRGetScreenResources), 'status' is set to
-	InvalidConfigTime and the remaining reply data is empty. Otherwise,
-	'status' is set to Success.
-
-	'timestamp' indicates when the configuration was last set.
-
-	'x' and 'y' indicate the position of this CRTC within the screen
-	region. They will be set to 0 when the CRTC is disabled.
-
-	'width' and 'height' indicate the size of the area within the screen
-	presented by this CRTC. This may be different than the size of the
-	mode due to rotation. They will be set to 0 when the CRTC
-	is disabled.
-
-	'mode' indicates which mode is active, or None indicating that the
-	CRTC has been disabled and is not displaying the screen contents.
-
-	'rotation' indicates the active rotation. It is set to Rotate_0
-	when the CRTC is disabled.
-
-	'outputs' is the list of outputs currently connected to this CRTC
-	and is empty when the CRTC is disabled.
-
-	'rotations' contains the set of rotations and reflections supported
-	by the CRTC.
-
-	'possible-outputs' lists all of the outputs which may be connected
-	to this CRTC.
-
-┌───
-    RRSetCrtcConfig
-	crtc: CRTC
-	timestamp: TIMESTAMP
-	config-timestamp: TIMESTAMP
-	x, y: INT16
-	mode: MODE
-	rotation: ROTATION
-	outputs: LISTofOUTPUT
-      ▶
-	status: RRCONFIGSTATUS
-	new-timestamp: TIMESTAMP
-└───
-	Errors: Value, Match
-
-	If 'timestamp' is less than the time when the configuration was last
-	successfully set, the request is ignored and InvalidTime returned in
-	status.
-
-	If 'config-timestamp' is not equal to when the monitor's
-	configuration last changed, the request is ignored and
-	InvalidConfigTime returned in status. This could occur if the
-	monitor changed since you last made a RRGetScreenInfo request,
-	perhaps by a different monitor being connected to the machine.
-	Rather than allowing an incorrect call to be executed based on stale
-	data, the server will ignore the request.
-
-	'x' and 'y' contain the desired location within the screen for this
-	monitor's content. 'x' and 'y' must be within the screen size, else
-	a Value error results.
-
-	'mode' is either the desired mode or None indicating the CRTC should
-	be disabled. If 'mode' is not one of these values, a Value
-	error results. 'mode' must be valid for all of the configured outputs,
-	else a Match error.
-
-	'rotation' contains the desired rotation along with which
-	reflections should be enabled. The rotation and reflection values
-	must be among those allowed for this monitor, else a Value error
-	results.
-
-	'outputs' contains the set of outputs that this CRTC should be
-	connected to. The set must be among the list of acceptable output
-	sets for this CRTC or a Match error results.
-
-	If 'mode' is None, then 'outputs' must be empty, else a Match error
-	results. Conversely, if 'mode' is not None, then 'outputs' must not be
-	empty, else a Match error results.
-
-	This request may fail for other indeterminate reasons, in which case
-	'status' will be set to Failed and no configuration change will be
-	made.
-
-	This request sets the CRTC to the specified position, mode, rotation
-	and reflection. The entire area of the CRTC must fit within the
-	screen size, else a Match error results. As an example, rotating the
-	screen so that a single CRTC fills the entire screen before and
-	after may necessitate disabling the CRTC, resizing the screen,
-	then re-enabling the CRTC at the new configuration to avoid an
-	invalid intermediate configuration.
-
-	If panning is enabled, the width and height of the panning and the
-	tracking areas are clamped to the new mode size.
-	Disabled panning axes remain disabled.
-	Panning borders are disabled if their requirements are no longer met
-	(see RRSetPanning).
-
-	When this request succeeds, 'status' contains Success and the
-	requested changes to configuration will have been made.
-
-	'new-time-stamp' contains the time at which this request was
-	executed.
-
-┌───
-    RRGetCrtcGammaSize
-	crtc: CRTC
-      ▶
-	size: CARD16
-└───
-	Errors: Crtc
-
-	This request returns the size of the gamma ramps used by 'crtc'.
-
-┌───
-    RRGetCrtcGamma
-	crtc: CRTC
-      ▶
-	red: LISTofCARD16
-	green: LISTofCARD16
-	blue: LISTofCARD16
-└───
-	Errors: Crtc
-
-	This request returns the currently set gamma ramps for 'crtc'.  All
-	three lists will be the size returned by the RRGetCrtcGammaSize
-	request.
-
-┌───
-    RRSetCrtcGamma
-	crtc: CRTC
-	red: LISTofCARD16
-	green: LISTofCARD16
-	blue: LISTofCARD16
-└───
-	Errors: Crtc, Match
-
-	This request sets the gamma ramps for 'crtc'. All three lists
-	must be the size returned by RRGetCrtcGammaSize else a Value error
-	results.
-
-7.2. Extension Requests added in version 1.3 of the extension
-
-┌───
-    RRGetScreenResourcesCurrent
-	window: WINDOW
-      ▶
-	timestamp: TIMESTAMP
-	config-timestamp: TIMESTAMP
-	crtcs: LISTofCRTC
-	outputs: LISTofOUTPUT
-	modes: LISTofMODEINFO
-└───
-	Errors: Window
-
-	RRGetScreenResourcesCurrent returns the list of outputs and crtcs
-	connected to the screen associated with 'window'.
-
-	'timestamp' indicates when the configuration was last set.
-
-	'config-timestamp' indicates when the configuration information last
-	changed. Requests to configure the output will fail unless the
-	timestamp indicates that the information the client is using is up
-	to date, to ensure clients can be well behaved in the face of race
-	conditions.
-
-	'crtcs' contains the list of CRTCs associated with the screen.
-
-	'outputs' contains the list of outputs associated with the screen.
-
-	'modes' contains the list of modes associated with the screen.
-
-	Unlike RRGetScreenResources, this merely returns the current
-	configuration, and does not poll for hardware changes.
-
-┌───
-    RRSetCrtcTransform
-	crtc: CRTC
-	transform: TRANSFORM
-	filter: STRING8
-	values: LISTofFIXED
-└───
-	Errors: Crtc, Match
-
-	This request provides a mechanism that is more general than the
-	existing rotation and reflection values for describing the
-	transformation from frame buffer image to crtc presentation.
-	'transform' is a full 2D projective transformation from screen
-	coordinate space to crtc coordinate space. This transformation is
-	applied before the rotation and reflection values to compute the
-	complete transform.
-
-	'filter' and 'values' specify a Render filter that may be used by the
-	server when transforming data from frame buffer to crtc.
-
-	This request sets the transform to be used at the next
-	RRSetCrtcConfig request execution; it does not cause any change to
-	occur in the current configuration.
-
-	When a non-identity transformation is in use, the rectangle returned
-	by RRGetCrtcInfo defines the bounding rectangle of the screen that is
-	projected to the crtc. It is this projected rectangle which must be
-	within the area of the screen when the mode is set.
-
-┌───
-    RRGetCrtcTransform
-	crtc: CRTC
-      ▶
-	pending-transform: TRANSFORM
-	pending-filter: STRING8
-	pending-values: LISTofFIXED
-	current-transform: TRANSFORM
-	current-filter: STRING8
-	current-values: LISTofFIXED
-└───
-
-	This request returns the pending and current transforms for the
-	specified CRTC. The pending transform will be the same as the current
-	transform if no new pending transform has been set since the last call
-	to RRSetCrtcConfig.
-
-┌───
-    RRGetPanning
-	crtc: CRTC
-      ▶
-	status: RRCONFIGSTATUS
-	timestamp: TIMESTAMP
-	left, top, width, height: CARD16
-	track_left, track_top, track_width, track_height: CARD16
-	border_left, border_top, border_right, border_bottom: INT16
-└───
-
-	Errors: Crtc
-
-	Version 1.3 adds panning support again. If multiple crtcs are active
-	the panning behavior can be defined per crtc individually.
-	RRGetPanning returns information about the currently set panning
-	configuration for the specified crtc.  If the CRTC does not support
-	panning, all fields (except timestamp) will be 0.
-
-	'timestamp' indicates when the configuration was last set.
-
-	All other entries are explained for RRSetPanning.
-
-┌───
-    RRSetPanning
-	crtc: CRTC
-	timestamp: TIMESTAMP
-	left, top, width, height: CARD16
-	track_left, track_top, track_width, track_height: CARD16
-	border_left, border_top, border_right, border_bottom: INT16
-      ▶
-	status: RRCONFIGSTATUS
-	new-timestamp: TIMESTAMP
-└───
-	Errors: Crtc, Match
-
-	This request sets the panning parameters.  As soon as panning is
-	enabled, the CRTC position can change with every pointer move.
-	RRCrtcChangeNotify events are sent to the clients requesting those.
-
-	If 'timestamp' is less than the time when the configuration was last
-	successfully set, the request is ignored and InvalidTime returned in
-	status.
-
-	┌──┳━━━━━━━━━━━━━━┳─────┬ ─ ─ ─ ─ ─ ┐
-	│  ┃     CRTC     ┃     │
-	│  ┃              ┃     │           │
-	│  ┃             X┃→    │
-	│  ┃              ┃     │           │  framebuffer
-	│  ┗━━━━━━━━━━━━━━┛     │
-	│                       │           │
-	│panning area           │
-	└───────────────────────┴ ─ ─ ─ ─ ─ ┘
-
-	'left', 'top', 'width', and 'height' contain the total panning area
-	for this CRTC.  'width' has to be larger than or equal to the CRTC's
-	width or 0, and 'left'+'width' must be within the screen size, else a
-	Match error results.  Equivalent restrictions for the height exist.
-	'width' or 'height' set to 0 indicate that panning should be disabled
-	on the according axis.  Setting 'width'/'height' to the CRTC's
-	width/height will disable panning on the X/Y axis as well, but
-	RRSetScreenSize will silently enable panning if the screen size is
-	increased. This does not happen if set to 0.
-
-	┌────────┳━━━━━━━━━━━━━━┳ ─ ─ ─ ─ ─ ┐
-	│        ┃     CRTC     ┃
-	│        ┃              ┃           │
-	│        ┃              ┃
-	│        ┃              ┃           │  tracking area
-	│        ┗━━━━━━━━━━━━━━┫     X
-	│               ↓       │     ↓     │
-	│panning area           │
-	└───────────────────────┴ ─ ─ ─ ─ ─ ┘
-
-	'track_left', 'track_top', 'track_width', and 'track_height' contain
-	the pointer area for which the panning region is updated.  For normal
-	use cases it should enclose the panning area minus borders, and is
-	typically set to either the panning area minus borders, or to the
-	total screen size. If set to the total screen size, the CRTC will pan
-	in the remaining axis even if the pointer is outside the panning area
-	on a different CRTC, as shown in the figure above. If the pointer is
-	outside the tracking area, the CRTC will not pan. Zero can be used as
-	an alias for the total screen size.
-
-	┌──┳━━━━━━━━━━━━━━┳────────────┐
-	│  ┃     CRTC     ┃            │
-	│  ┃              ┃            │
-	│  ┃              ┃→           │
-	│  ┃           X←→┃            │
-	│  ┃       border_right        │
-	│  ┗━━━━━━━━━━━━━━┛            │
-	│                              │
-	│panning area                  │
-	└──────────────────────────────┘
-
-	'border_left', 'border_top', 'border_right', and 'border_bottom'
-	define the distances from the CRTC borders that will activate panning
-	if the pointer hits them.  If the borders are 0, the screen will pan
-	when the pointer hits the CRTC borders (behavior of pre-RandR Xserver
-	panning).  If the borders are positive, the screen will pan when the
-	pointer gets close to the CRTC borders, if they are negative, the
-	screen will only pan when the pointer is already way past the CRTC
-	borders.  Negative values might confuse users and disable panning to
-	the very edges of the screen.  Thus they are discouraged.
-	border_left + border_right has to be lower or equal than the CRTC's
-	width, else a Match error results.  An equivalent restriction for the
-	height exists.
-
-	Screen size changes update the panning and the tracking areas to the
-	new size. Both screen size changes and mode changes clamp these areas
-	to the current CRTC size.  In these cases panning borders are disabled
-	if their requirements are no longer met.
-
-	When this request succeeds, 'status' contains Success and the
-	requested changes to configuration will have been made.
-
-	'new-time-stamp' contains the time at which this request was
-	executed.
-
-┌───
-    RRSetOutputPrimary
-	window: WINDOW
-	output: OUTPUT
-└───
-	Errors: Match, Output, Window
-
-	RRSetOutputPrimary marks 'output' as the primary output for the
-	screen with the same root window as 'window'. This output's CRTC
-	will be sorted to the front of the list in Xinerama and RANDR
-	geometry requests for the benefit of older applications. The
-	default primary output is None, and None is a legal value to pass
-	to RRSetOutputPrimary. This request is expected to be used by
-	desktop environments to mark the screen that should hold the primary
-	menu bar or panel.
-
-	As this changes the logical layout of the screen, ConfigureNotify
-	and RRScreenChangeNotify will be generated on the appropriate root
-	window when the primary output is changed by this call. This request
-	also generates RROutputChangeNotify events on the outputs that gained
-	and lost primary status.
-
-	If an output is disconnected asynchronously (eg. due to recabling),
-	the primary status does not change, but RROutputChangeNotify events
-	will be generated if the hardware is capable of detecting this;
-	clients are expected to reconfigure if appropriate.
-
-	If an output is deleted (eg. due to device hotplug), the server will
-	act as though None was passed to RRSetOutputPrimary, including
-	generating the appropriate events.
-
-┌───
-    RRGetOutputPrimary
-	window: WINDOW
-      ▶
-	output: OUTPUT
-└───
-	Errors: Window
-
-	RRGetOutputPrimary returns the primary output for the screen.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-7.3. Extension Requests added in version 1.4 of the extension.
-
-┌───
-    RRQueryScanoutPixmaps
-	window: WINDOW
-      ▶
-	infos: LISTofSCANOUTPIXMAPINFO
-└───
-	Errors: Window
-
-	This request returns information about the server support for
-	alternate scanout pixmaps. For each pictformat, there is a set
-	of rotations and a maximum supported size. The rotations here
-	are those provided by the scanout hardware itself, not by
-	software emulation.
-
-┌───
-    RRCreateScanoutPixmap
-	pixmap: PIXMAP
-	drawable: DRAWABLE
-	width, height: CARD16
-	format: PICTFORMAT
-	rotations: SETofROTATION
-└───
-	Errors: Drawable, Match, Value
-
-	Creates a pixmap which can subsequently be used as a scanout
-	buffer for the screen associated with 'drawable'. 'rotations'
-	is the set of rotation values which may be used with the
-	resulting scanout buffer when it is associated with a CRTC.
-
-	'format' must be one of the supported scanout formats, or a
-	Match error results.
-
-	'width' and 'height' must be within the supported range for
-	the specified format or a Value error results.
-
-	'rotations' must be a subset of those supported for the
-	specified format or a Match error results.
-
-┌───
-    RRSetCrtcSpriteTransform
-	crtc: CRTC
-	position-transform: TRANSFORM
-	image-transform: TRANSFORM
-└───
-	Sets the sprite transforms for the specified crtc, any sprites
-	presented on this crtc will have their positions transformed
-	by the position-transform matrix. Sprite images displayed on the crtc
-	will be transformed by the image-transform matrix.
-
-┌───
-    RRGetCrtcSpriteTransform
-	crtc: CRTC
-      ▶
-	position-transform: TRANSFORM
-	image-transform: TRANSFORM
-└───
-	Gets the sprite transforms for the specified crtc.
-
-┌───
-    RRSetCrtcConfigs
-	drawable: DRAWABLE
-	screen-pixmap-width: CARD16
-	screen-pixmap-height: CARD16
-	screen-width: CARD16
-	screen-height: CARD16
-	width-in-millimeters: CARD32
-	height-in-millimeters: CARD32
-	configs: LISTofCRTCCONFIG
-      ▶
-	status: RRCONFIGSTATUS
-└───
-	Errors: Value, Match
-
-	This works much like RRSetScreenSize followed by a sequence of
-	RRSetCrtcConfig, except that the entire configuration is set
-	in a single operation, either succeeding or failing without
-	any partial execution.
-
-	In addition to the pre-1.4 semantics, this request adds the
-	ability to specific a scanout pixmap for each crtc, and
-	integrates the 1.4 sprite transform request as well.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-8. Extension Events
-
-Clients MAY select for ConfigureNotify on the root window to be
-informed of screen changes. This may be advantageous if all your
-client needs to know is the size of the root window, as it avoids
-round trips to set up the extension.
-
-RRScreenChangeNotify is sent if RRSelectInput has requested it
-whenever properties of the screen change, which may be due to external
-factors, such as re-cabling a monitor, etc.
-
-┌───
-    RRScreenChangeNotify
-
-	rotation: ROTATION;		new rotation
-	sequenceNumber: CARD16		low 16 bits of request seq. number
-	timestamp: TIMESTAMP		time screen was changed
-	configTimestamp: TIMESTAMP	time config data was changed
-	root: WINDOW			root window of screen
-	window: WINDOW			window requesting notification
-	size-id: SIZEID			index of new SCREENSIZE
-	subpixelOrder: SUBPIXELORDER	order of subpixels
-	widthInPixels: CARD16		width in pixels of the new SCREENSIZE
-	heightInPixels: CARD16		height in pixels of the new SCREENSIZE
-	widthInMillimeters: CARD16	width in mm of the new SCREENSIZE
-	heightInMillimeters: CARD16	height in mm of the new SCREENSIZE
-└───
-	This event is generated whenever the screen configuration is changed
-	and sent to requesting clients. 'timestamp' indicates when the
-	screen configuration was changed. 'configTimestamp' says when the
-	last time the configuration was changed. 'root' is the root of the
-	screen the change occurred on, 'window' is window selecting for this
-	event. 'size-id' contains the index of the current size.
-
-	This event is sent whenever the screen's configuration changes
-	or if a new screen configuration becomes available that was
-	not available in the past. In this case (config-timestamp in
-	the event not being equal to the config-timestamp returned in
-	the last call to RRGetScreenInfo), the client MUST call
-	RRGetScreenInfo to update its view of possible screen
-	configurations to have a correct view of possible screen
-	organizations.
-
-	Clients which select screen change notification events may be
-	sent an event immediately if the screen configuration was
-	changed between when they connected to the X server and
-	selected for notification. This is to prevent a common race
-	that might occur on log-in, where many applications start up
-	just at the time when a display manager or log in script might
-	be changing the screen size or configuration.
-
-	Note that the sizes in this event reflect the new SCREENSIZE and
-	thus will appear rotated by the 'rotation' parameter from the sizes
-	of the screen itself. In other words, when rotation is 90 or 270,
-	widthInPixels in this event will be the same as the height value
-	from a ConfigureNotify that reflects the same size change. This
-	will probably confuse developers.
-
-8.1 Events added in version 1.2 of the RandR extension
-
-┌───
-    RROutputChangeNotify:
-	timestamp: TIMESTAMP		time screen was reconfigured
-	config-timestamp: TIMESTAMP	time available config data was changed
-	window: WINDOW			window requesting notification
-	output: OUTPUT			output affected by change
-	crtc: CRTC			connected CRTC or None
-	mode: MODE			mode in use on CRTC or None
-	connection: CONNECTION		connection status
-└───
-
-	This event is generated whenever the available output configurations
-	have changed and is sent to requesting clients. 'timestamp'
-	indicates when the crtc configuration was changed by a client.
-	'config-timestamp' says when the last time the available
-	configurations changed. 'root' is the root of the screen the change
-	occurred on, 'window' is window selecting for this event. The
-	precise change can be detected by examining the new state of the
-	system.
-
-┌───
-    RROutputPropertyNotify:
-	window: WINDOW			window requesting notification
-	output: OUTPUT			output affected by change
-	atom: ATOM			affected property
-	time: TIMESTAMP			time property was changed
-	subpixel-order: SUBPIXELORDER	order of subpixels
-	state: { NewValue, Deleted }	new property state
-└───
-
-	This event is reported to clients selecting RROutputPropertyChange
-	on the window and is generated with state NewValue when a property
-	of the window is changed using RRChangeOutputProperty even when
-	adding zero-length data and when replacing all or part of a property
-	with identical data.  It is generated with state Deleted when a
-	property of the window is deleted using either
-	RRDeleteOutputProperty or RRGetOutputProperty.  The timestamp
-	indicates the server time when the property was changed.
-
-┌───
-    RRCrtcChangeNotify
-	timestamp: TIMESTAMP		time monitor was changed
-	window: WINDOW			window requesting notification
-	crtc: CRTC			CRTC which changed
-	mode: MODE			new mode
-	rotation: ROTATION;		new rotation
-	x: INT16			x position of CRTC within screen
-	y: INT16			y position of CRTC within screen
-	width: CARD16			width of new mode
-	height: CARD16			height of new mode
-└───
-	This event is generated whenever the CRTC configuration is changed
-	and sent to requesting clients. 'timestamp' indicates when the
-	CRTC configuration was changed. 'window' is window selecting for this
-	event. 'mode' is the new mode, or None if the crtc is disabled.
-	'x' and 'y' mark the location in the screen where this CRTC
-	is reading data. 'width' and 'height' indicate the size of the
-	mode. 'x', 'y, 'width' and 'height' are all zero when 'mode' is None.
-
-	This event is sent whenever the monitor's configuration changes
-	or if a new monitor configuration becomes available that was
-	not available in the past. In this case, the client MUST call
-	RRGetCrtcModes to update its view of possible monitor
-	configurations to have a correct view of possible monitor
-	organizations.
-
-	Clients which select monitor change notification events may be
-	sent an event immediately if the monitor configuration was
-	changed between when they connected to the X server and
-	selected for notification. This is to prevent a common race
-	that might occur on log-in, where many applications start up
-	just at the time when a display manager or log in script might
-	be changing the monitor size or configuration.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-9. Properties
-
-Properties are used for output specific parameters, and for announcing
-static or rarely changing data.  Announced data is typically
-immutable.  Properties are also used for evaluating new parameters
-before adding them to the RandR protocol.
-
-The following properties are hereby declared official, and drivers SHOULD
-prefix driver specific properties with '_', unless they are planned to be
-added to this specification.  List values, that are not declared by the table
-below, and will remain driver specific or are not planned to be added to this
-specification, SHOULD be prefixed with "_" as well in order to avoid name
-space or semantics clashes with future extensions of these values.
-
-Beginning with version 1.3 of the RandR extension, certain properties
-are mandatory and MUST be provided by implementations.  Earlier
-versions of the RandR extension MAY provide these properties as well,
-as long as the semantics are not altered.  Clients SHOULD fall back
-gracefully to lower version functionality, though, if the driver
-doesn't handle a mandatory property correctly.
-
-9.1 Known properties
-
-    "Backlight"			aka RR_PROPERTY_BACKLIGHT
-	Type:			int32
-	Flags:			-
-	Range/List:		0-x (driver specific)
-
-	This property controls the brightness on laptop panels and equivalent
-	displays with a backlight controller. The driver specific maximum
-	value MUST turn the backlight to full brightness, 1 SHOULD turn the
-	backlight to minimum brightness, 0 SHOULD turn the backlight off.
-
-    "CloneList"			aka RR_PROPERTY_CLONE_LIST
-	Type:			int32 [2*n] / Atom pairs
-	Flags:			Immutable
-	Range/List:		0-
-
-	Some combinations of outputs on some cards cannot be served
-	independently from each other, because they are wired up to the same
-	encoder outputs.
-	This property lists all output + signal format pairs that are
-	driven together with this output, and thus can only be programmed in
-	clone mode with the same CRTC.
-	This property MUST be symmetric, but may change with changing signal
-	format. I.e. if the property for DVI-1/VGA specifies VGA-1/VGA to be
-	cloned, VGA-1/VGA has to list DVI-1/VGA as well.
-	Outputs / format pairs listed in this property MUST be included in the
-	CompatibilityList.
-
-    "CompatibilityList"		aka RR_PROPERTY_COMPATIBILITY_LIST
-	Type:			int32 [2*n] / Atom pairs
-	Flags:			Immutable
-	Range/List:		0-
-
-	Some combinations of outputs on some cards cannot be served at all,
-	because the according encoder is only capable of driving one output at
-	a time.
-	This property lists all output + signal format pairs that can be
-	driven together with this output. NULL atoms specify any output / any
-	signal format, respectively.
-	This property MUST be symmetric, but may change with changing signal
-	format. I.e. if the property for DVI-1/TMDS specifies VGA-1/VGA to be
-	available, VGA-1/VGA has to list DVI-1/TMDS as well.
-
-    "ConnectorNumber"		aka RR_PROPERTY_CONNECTOR_NUMBER
-	Type:			int32
-	Flags:			Immutable, Static
-	Range/List:		0-
-
-	Outputs that route their signal to the same connector MUST
-	have the same connector number. Outputs with the same
-	connector number MUST route their signal to the same
-	connector, except if it is 0, which indicates unknown
-	connectivity. 1 is called the primary connector, 2 the
-	secondary. 3 is typically a TV connector, but that is completely
-	driver / hardware dependent.
-	Outputs with the same connector number SHOULD have the same
-	connector type. Meaning and client behavior for mismatching
-	connector types is undefined at the moment.
-
-    "ConnectorType"		aka RR_PROPERTY_CONNECTOR_TYPE
-	Type:			int32 / Atom
-	Flags:			Immutable, Static
-	Range/List:		unknown VGA DVI DVI‐I DVI‐A DVI‐D HDMI Panel
-				TV TV-Composite TV-SVideo TV-Component
-				TV-SCART TV-C4 DisplayPort
-
-	Connector type, as far as known to the driver.
-	Values with dashes (TV‐Composite) describe more specific versions of
-	the base values (TV). The former SHOULD be used if the connector is
-	not capable of producing other signal formats. The later SHOULD be
-	used if the exact connector is unknown, or the connector is a
-	multi‐format connector that is not described otherwise. DVI, for
-	instance, SHOULD be handled like a DVI‐I connector, unless additional
-	information is available to the user agent. PANEL describes
-	laptop‐internal (normally LVDS) displays. TV, TV‐SCART, TV‐Component,
-	and TV‐C4 with signal format VGA are valid combinations and describe
-	RGB TV signals.
-
-    "EDID"			aka RR_PROPERTY_RANDR_EDID
-	Type:			int8 [n]
-	Flags:			Immutable
-	Range/List:		-
-
-	Raw EDID data from the device attached to the according
-	output. Should include main EDID data and all extension
-	blocks. Previously known as EdidData.
-
-    "SignalFormat"		aka RR_PROPERTY_SIGNAL_FORMAT
-	Type:			int32 / Atom
-	Flags:			-
-	Range/List:		unknown VGA TMDS LVDS Composite Composite-PAL
-				Composite-NTSC Composite-SECAM SVideo
-				Component DisplayPort
-
-	Signal format / physical protocol format that is used for the
-	specified output. valid-values lists all possible formats on this
-	output, which SHOULD be a subset of the list above and MUST be static.
-	Values with dashes (Composite-PAL) describe more specific versions of
-	the base values (Composite) and SHOULD be used if known to the driver.
-	A driver MAY change this property of an output if the underlying
-	hardware indicates a protocol change (e.g. TV formats).  Clients are
-	allowed to change the signal format in order to select a different
-	signal format (e.g. Composite etc.) or physical protocol (e.g. VGA or
-	TMDS on DVI-I).
-	Laptop panels SHOULD not be detected with this property, but rather by
-	ConnectorType.
-
-    "SignalProperties"		aka RR_PROPERTY_SIGNAL_FORMAT
-	Type:			int32 [n] / Atom
-	Flags:			-
-	Range/List:		For Composite signals:
-				  NTSC NTSC-M NTSC-J NTSC-N NTSC-4.43 NTSC-film
-				  PAL PAL-B PAL-G PAL-H PAL-H PAL-I PAL-M PAL-D
-				  PAL-N PAL-Nc PAL-L PAL-60
-				  SECAM SECAM-L SECAM-B SECAM-G SECAM-D SECAM-K
-				  SECAM-H SECAM-K
-				For TMDS signals:
-				  SingleLink DualLink
-				For DisplayPort signals:
-				  Lane1 Lane2 Lane4 LowSpeed HiSpeed
-
-	Properties of the signal format that is currently used for the
-	specified output. valid-values lists all possible properties on this
-	output, which SHOULD be a subset of the list above. It will change if
-	SignalFormat changes.  Multiple properties are allowed.
-	Values with dashes (PAL-B) describe more specific versions of the base
-	values (PAL) and SHOULD be used if known to the driver.  A driver MAY
-	change this property of an output if the underlying hardware indicates
-	a signal change (e.g. TV formats).  Clients are allowed to change the
-	properties in order to select a different signal subformat.
-
-
-9.2 Properties introduced with version 1.2 of the RandR extension
-
-Property			Immutable	Mandatory since
-────────			─────────	───────────────
-EDID				yes		n/a
-
-EDID is provided by the RandR frontend, thus not driver specific.
-
-
-9.3 Properties introduced with version 1.3 of the RandR extension
-
-Property			Immutable	Mandatory since
-────────			─────────	───────────────
-CloneList			yes		not mandatory
-CompatibilityList		yes		not mandatory
-ConnectorNumber			yes: static	not mandatory
-ConnectorType			yes: static	RandR 1.3
-SignalFormat			no		RandR 1.3
-SignalProperties		no		not mandatory
-
-9.4 Properties introduced with version 1.3.1 of the RandR extension
-
-Property			Immutable	Mandatory since
-────────			─────────	───────────────
-Backlight			no		not mandatory
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-10. Extension Versioning
-
-The RandR extension was developed in parallel with the implementation
-to ensure the feasibility of various portions of the design. As
-portions of the extension are implemented, the version number of the
-extension has changed to reflect the portions of the standard provided.
-This document describes the version 1.2 of the specification, the
-partial implementations have version numbers less than that. Here's a
-list of what each version provided:
-
-	0.0: This prototype implemented resize and rotation in the
-	     TinyX server Used approximately the protocol described in
-	     the Usenix paper. Appeared in the TinyX server in
-	     XFree86 4.2, but not in the XFree86 main server.
-
-	0.1: Added subpixel order, added an event for subpixel order.
-	     This version was never checked in to XFree86 CVS.
-
-	1.0: Implements resize, rotation, and reflection. Implemented
-	     both in the XFree86 main server (size change only at this
-	     date), and fully (size change, rotation, and reflection)
-	     in XFree86's TinyX server.
-
-	1.1: Added refresh rates
-
-	1.2: Separate screens from CRTCs and outputs, switch to full VESA
-	     modes
-
-	1.3: Added cheap version of RRGetScreenResources.  Added CRTC
-	     transformations.  Added panning.  Added primary outputs.
-	     Added standard properties.
-
-Compatibility between 0.0 and 1.0 was *NOT* preserved, and 0.0 clients
-will fail against 1.0 servers. The wire encoding op-codes were
-changed for GetScreenInfo to ensure this failure in a relatively
-graceful way. Version 1.1 servers and clients are cross compatible with
-1.0. Version 1.1 is considered to be stable and we intend upward
-compatibility from this point. Version 1.2 offers an extended model of the
-system with multiple output support. Version 1.3 adds a cheap version of
-GetScreenResources to avoid expensive DDC operations, CRTC transformations,
-panning, and the primary output concept. 1.2 and 1.3 are backward-compatible
-with 1.1.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-11. Relationship with other extensions
-
-Two other extensions have a direct relationship with this extension. This
-section attempts to explain how these three are supposed to work together.
-
-11.1 XFree86-VidModeExtension
-
-XFree86-VidModeExtension changes the configuration of a single monitor
-attached to the screen without changing the configuration of the screen
-itself. It provides the ability to specify new mode lines for the server to
-use along with selecting among existing mode lines. As it uses screen
-numbers instead of window identifiers, it can be used to affect multiple
-monitors in a single-screen Xinerama configuration. However, the association
-between screen numbers and root windows in a multi-Screen environment is not
-defined by the extension. Version 2.0 of this extension added the ability to
-adjust the DAC values in a TrueColor server to modify the brightness curves
-of the display.
-
-All of the utility of this extension is subsumed by RandR version 1.2, RandR
-should be used in preference to XFree86-VidModeExtension where both are
-present.
-
-11.2 Xinerama
-
-Xinerama provides a mechanism for describing the relationship between the
-overall screen display and monitors placed within that area. As such, it
-provides the query functionality of RandR 1.2 without any of the
-configuration functionality. Applications using Xinerama to discover
-monitor geometry can continue to do so, with the caveat that they will not be
-informed of changes when they occur. However, Xinerama configuration data
-will be updated, so applications selecting for RandR notification and
-re-querying the configuration with the Xinerama extension will get updated
-information. It is probably better to view RandR as a superset of Xinerama
-at this point and use it in preference to Xinerama where both are present.
-
-			      ❧❧❧❧❧❧❧❧❧❧❧
-
-Appendix A. Protocol Encoding
-
-Syntactic Conventions
-
-This document uses the same syntactic conventions as the core X
-protocol encoding document.
-
-A.1 Common Types
-
-┌───
-    ROTATION
-	0x0001	Rotate_0
-	0x0002	Rotate_90
-	0x0004	Rotate_180
-	0x0008	Rotate_270
-	0x0010	Reflect_X
-	0x0020	Reflect_Y
-└───
-	Used to encode both sets of possible rotations and individual
-	selected rotations.
-
-┌───
-    RRSELECTMASK
-	0x0001	ScreenChangeNotifyMask
-	0x0002	CrtcChangeNotifyMask		Added in version 1.2
-	0x0004	OutputChangeNotifyMask		Added in version 1.2
-	0x0008	OutputPropertyNotifyMask	Added in version 1.2
-└───
-      Event select mask for RRSelectInput
-
-┌───
-    RRCONFIGSTATUS
-	0x0 Success
-	0x1 InvalidConfigTime
-	0x2 InvalidTime
-	0x3 Failed
-└───
-	Return status for requests which depend on time.
-
-┌───
-    MODEINFO (32)				Added in version 1.2
-	4	CARD32		id
-	2	CARD16		width in pixels
-	2	CARD16		height in pixels
-	4	CARD32		dot clock
-	2	CARD16		h sync start
-	2	CARD16		h sync end
-	2	CARD16		h total
-	2	CARD16		h skew
-	2	CARD16		v sync start
-	2	CARD16		v sync end
-	2	CARD16		v total
-	2	CARD16		name length
-	4	SETofMODEFLAG	mode flags
-└───
-
-	An output mode specifies the complete CRTC timings for
-	a specific mode. The vertical and horizontal synchronization rates
-	can be computed given the dot clock and the h total/v total
-	values. If the dot clock is zero, then all of the timing
-	parameters and flags are not used, and must be zero as this
-	indicates that the timings are unknown or otherwise unused.
-	The name itself will be encoded separately in each usage.
-
-┌───
-    MODEFLAG
-	0x00000001	HSyncPositive
-	0x00000002	HSyncNegative
-	0x00000004	VSyncPositive
-	0x00000008	VSyncNegative
-	0x00000010	Interlace
-	0x00000020	DoubleScan
-	0x00000040	CSync
-	0x00000080	CSyncPositive
-	0x00000100	CSyncNegative
-	0x00000200	HSkewPresent
-	0x00000400	BCast
-	0x00000800	PixelMultiplex
-	0x00001000	DoubleClock
-	0x00002000	ClockDivideBy2
-└───
-┌───
-    CONNECTION
-	0		Connected
-	1		Disconnected
-	2		UnknownConnection
-└───
-
-
-A.2 Protocol Requests
-
-Opcodes 1 and 3 were used in the 0.0 protocols, and will return
-errors if used in version 1.0.
-
-┌───
-    RRQueryVersion
-
-	1	CARD8			major opcode
-	1	0			RandR opcode
-	2	3			length
-	4	CARD32			major version
-	4	CARD32			minor version
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	0			reply length
-	1	CARD32			major version
-	1	CARD32			minor version
-└───
-┌───
-    RRSetScreenConfig
-
-	1	CARD8			major opcode
-	1	2			RandR opcode
-	2	6			length
-	4	WINDOW			window on screen to be configured
-	4	TIMESTAMP		timestamp
-	4	TIMESTAMP		config timestamp
-	2	SIZEID			size index
-	2	ROTATION		rotation/reflection
-	2	CARD16			refresh rate (1.1 only)
-	2	CARD16			pad
-      ▶
-	1	1			Reply
-	1	RRCONFIGSTATUS		status
-	2	CARD16			sequence number
-	4	0			reply length
-	4	TIMESTAMP		new timestamp
-	4	TIMESTAMP		new configuration timestamp
-	4	WINDOW			root
-	2	SUBPIXELORDER		subpixel order defined in Render
-	2	CARD16			pad4
-	4	CARD32			pad5
-	4	CARD32			pad6
-└───
-┌───
-    RRSelectInput
-
-	1	CARD8			major opcode
-	1	4			RandR opcode
-	2	3			length
-	4	WINDOW			window
-	2	SETofRRSELECTMASK	enable
-	2	CARD16			pad
-└───
-┌───
-    RRGetScreenInfo
-
-	1	CARD8			major opcode
-	1	5			RandR opcode
-	2	2			length
-	4	WINDOW			window
-      ▶
-	1	1			Reply
-	1	CARD8			set of Rotations
-	2	CARD16			sequence number
-	4	0			reply length
-	4	WINDOW			root window
-	4	TIMESTAMP		timestamp
-	4	TIMESTAMP		config timestamp
-	2	CARD16			number of SCREENSIZE following
-	2	SIZEID			current size index
-	2	ROTATION		current rotation and reflection
-	2	CARD16			current rate (added in version 1.1)
-	2	CARD16			length of rate info (number of CARD16s)
-	2	CARD16			pad
-
-	SCREENSIZE
-	2	CARD16			width in pixels
-	2	CARD16			height in pixels
-	2	CARD16			width in millimeters
-	2	CARD16			height in millimeters
-
-	REFRESH
-	2	CARD16			number of rates (n)
-	2n	CARD16			rates
-└───
-
-A.2.1 Protocol Requests added with version 1.2
-
-┌───
-    RRGetScreenSizeRange
-	1	CARD8			major opcode
-	1	6			RandR opcode
-	2	2			length
-	4	WINDOW			window
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	0			reply length
-	2	CARD16			minWidth
-	2	CARD16			minHeight
-	2	CARD16			maxWidth
-	2	CARD16			maxHeight
-	16				unused
-└───
-┌───
-    RRSetScreenSize
-	1	CARD8			major opcode
-	1	7			RandR opcode
-	2	5			length
-	4	WINDOW			window
-	2	CARD16			width
-	2	CARD16			height
-	4	CARD32			width in millimeters
-	4	CARD32			height in millimeters
-└───
-┌───
-    RRGetScreenResources
-	1	CARD8			major opcode
-	1	8			RandR opcode
-	2	2			length
-	4	WINDOW			window
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	c+o+8m+(b+p)/4		reply length
-	4	TIMESTAMP		timestamp
-	4	TIMESTAMP		config-timestamp
-	2	c			number of CRTCs
-	2	o			number of outputs
-	2	m			number of modeinfos
-	2	b			total bytes in mode names
-	8				unused
-	4c	LISTofCRTC		crtcs
-	4o	LISTofOUTPUT		outputs
-	32m	LISTofMODEINFO		modeinfos
-	b	STRING8			mode names
-	p				unused, p=pad(b)
-└───
-┌───
-    RRGetOutputInfo
-	1	CARD8			major opcode
-	1	9			RandR opcode
-	2	3			length
-	4	OUTPUT			output
-	4	TIMESTAMP		config-timestamp
-      ▶
-	1	1			Reply
-	1	RRCONFIGSTATUS		status
-	2	CARD16			sequence number
-	4	1+c+m+(n+p)/4		reply length
-	4	TIMESTAMP		timestamp
-	4	CRTC			current connected crtc
-	4	CARD32			width in millimeters
-	4	CARD32			height in millimeters
-	1	CONNECTION		connection
-	1	SUBPIXELORDER		subpixel-order
-	2	c			number of CRTCs
-	2	m			number of modes
-	2	p			number of preferred modes
-	2	o			number of clones
-	2	n			length of name
-	4c	LISTofCRTC		crtcs
-	4m	LISTofMODE		modes
-	4o	LISTofOUTPUT		clones
-	n	STRING8			name
-	p				unused, p=pad(n)
-└───
-┌───
-    RRListOutputProperties
-	1	CARD8			major opcode
-	1	10			RandR opcode
-	2	2			length
-	4	OUTPUT			output
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	n			reply length
-	2	n			number of ATOMs in atoms
-	22				unused
-	4n	LISTofATOM		atoms
-└───
-┌───
-    RRQueryOutputProperty
-	1	CARD8			major opcode
-	1	11			RandR opcode
-	2	3			request length
-	4	OUTPUT			output
-	4	ATOM			property
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	n			reply length
-	1	BOOL			pending
-	1	BOOL			range
-	1	BOOL			immutable
-	21				unused
-	4n	LISTofINT32		valid values
-└───
-┌───
-    RRConfigureOutputProperty
-	1	CARD8			major opcode
-	1	12			RandR opcode
-	2	4+n			request length
-	4	OUTPUT			output
-	4	ATOM			property
-	1	BOOL			pending
-	1	BOOL			range
-	2				unused
-	4n	LISTofINT32		valid values
-└───
-┌───
-    RRChangeOutputProperty
-	1	CARD8			major opcode
-	1	13			RandR opcode
-	2	6+(n+p)/4		request length
-	4	OUTPUT			output
-	4	ATOM			property
-	4	ATOM			type
-	1	CARD8			format
-	1				mode
-		0	Replace
-		1	Prepend
-		2	Append
-	2				unused
-	4	CARD32			length of data in format units
-					(= n for format = 8)
-					(= n/2 for format = 16)
-					(= n/4 for format = 32)
-	n	LISTofBYTE		data
-					(n is a multiple of 2 for format = 16)
-					(n is a multiple of 4 for format = 32)
-	p				unused, p=pad(n)
-└───
-┌───
-    RRDeleteOutputProperty
-	1	CARD8			major opcode
-	1	14			RandR opcode
-	2	3			request length
-	4	OUTPUT			output
-	4	ATOM			property
-└───
-┌───
-    RRGetOutputProperty
-	1	CARD8			major opcode
-	1	15			RandR opcode
-	2	7			request length
-	4	OUTPUT			output
-	4	ATOM			property
-	4	ATOM			type
-		0	AnyPropertyType
-	4	CARD32			long-offset
-	4	CARD32			long-length
-	1	BOOL			delete
-	1	BOOL			pending
-	2				unused
-      ▶
-	1	1			Reply
-	1	CARD8			format
-	2	CARD16			sequence number
-	4	(n+p)/4			reply length
-	4	ATOM			type
-		0	None
-	4	CARD32			bytes-after
-	4	CARD32			length of value in format units
-					(= 0 for format = 0)
-					(= n for format = 8)
-					(= n/2 for format = 16)
-					(= n/4 for format = 32)
-	12				unused
-	n	LISTofBYTE		value
-					(n is zero for format = 0)
-					(n is a multiple of 2 for format = 16)
-					(n is a multiple of 4 for format = 32)
-	p				unused, p=pad(n)
-└───
-┌───
-    RRCreateMode
-	1	CARD8			major opcode
-	1	16			RandR opcode
-	2	12+(n+p)/4		length
-	4	WINDOW			window
-	32	MODEINFO		mode
-	n	STRING8			mode name
-	p				unused, p=pad(n)
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	0			reply length
-	4	MODE			mode
-	20				unused
-└───
-┌───
-    RRDestroyMode
-	1	CARD8			major opcode
-	1	17			RandR opcode
-	2	2			length
-	4	MODE			mode
-└───
-┌───
-    RRAddOutputMode
-	1	CARD8			major opcode
-	1	18			RandR opcode
-	2	3			length
-	4	OUTPUT			output
-	4	MODE			mode
-└───
-┌───
-    RRDeleteOutputMode
-	1	CARD8			major opcode
-	1	19			RandR opcode
-	2	3			length
-	4	OUTPUT			output
-	4	MODE			mode
-└───
-┌───
-    RRGetCrtcInfo
-	1	CARD8			major opcode
-	1	20			RandR opcode
-	2	3			length
-	4	CRTC			crtc
-	4	TIMESTAMP		config-timestamp
-      ▶
-	1	1			Reply
-	1	RRCONFIGSTATUS		status
-	2	CARD16			sequence number
-	4	o+p			reply length
-	4	TIMESTATMP		timestamp
-	2	INT16			x
-	2	INT16			y
-	2	CARD16			width
-	2	CARD16			height
-	4	MODE			mode
-	2	ROTATION		current rotation and reflection
-	2	ROTATION		set of possible rotations
-	2	o			number of outputs
-	2	p			number of possible outputs
-	4o	LISTofOUTPUT		outputs
-	4p	LISTofOUTPUT		possible outputs
-└───
-┌───
-    RRSetCrtcConfig
-	1	CARD8			major opcode
-	1	21			RandR opcode
-	2	7+2n			length
-	4	CRTC			crtc
-	4	TIMESTAMP		timestamp
-	4	TIMESTAMP		config timestamp
-	2	INT16			x
-	2	INT16			y
-	4	MODE			mode
-	2	ROTATION		rotation/reflection
-	2				unused
-	8n	LISTofOUTPUT		outputs
-      ▶
-	1	1			Reply
-	1	RRCONFIGSTATUS		status
-	2	CARD16			sequence number
-	4	0			reply length
-	4	TIMESTAMP		new timestamp
-	20				unused
-└───
-┌───
-    RRGetCrtcGammaSize
-	1	CARD8			major opcode
-	1	22			RandR opcode
-	2	2			length
-	4	CRTC			crtc
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	0			reply length
-	2	CARD16			size
-	22				unused
-└───
-┌───
-    RRGetCrtcGamma
-	1	CARD8			major opcode
-	1	23			RandR opcode
-	2	2			length
-	4	CRTC			crtc
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	(6n+2)/4		reply length
-	2	n			size
-	20				unused
-	2n	LISTofCARD16		red
-	2n	LISTofCARD16		green
-	2n	LISTofCARD16		blue
-	p				unused, p=pad(6n)
-└───
-┌───
-    RRSetCrtcGamma
-	1	CARD8			major opcode
-	1	24			RandR opcode
-	2	3+(6n+2)/4		length
-	4	CRTC			crtc
-	2	n			size
-	2				unused
-	2n	LISTofCARD16		red
-	2n	LISTofCARD16		green
-	2n	LISTofCARD16		blue
-	p				unused, p=pad(6n)
-└───
-
-A.2.2 Protocol Requests added with version 1.3
-
-┌───
-    RRGetScreenResourcesCurrent
-	1	CARD8			major opcode
-	1	25			RandR opcode
-	2	2			length
-	4	WINDOW			window
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	c+o+8m+(b+p)/4		reply length
-	4	TIMESTAMP		timestamp
-	4	TIMESTAMP		config-timestamp
-	2	c			number of CRTCs
-	2	o			number of outputs
-	2	m			number of modeinfos
-	2	b			total bytes in mode names
-	8				unused
-	4c	LISTofCRTC		crtcs
-	4o	LISTofOUTPUT		outputs
-	32m	LISTofMODEINFO		modeinfos
-	b	STRING8			mode names
-	p				unused, p=pad(b)
-└───
-
-┌───
-    RRSetCrtcTransform
-	1	CARD8			major opcode
-	1	26			RandR opcode
-	2	12+(n+p)/4+v		length
-	4	CRTC			crtc
-	36	TRANSFORM		transform
-	2	CARD16			filter length
-	2				unused
-	n	STRING8			filter name
-	p				unused, p=pad(n)
-	4v	FIXED			filter params
-└───
-
-┌───
-    RRGetCrtcTransform
-	1	CARD8			major opcode
-	1	27			RandR opcode
-	2	2			length
-	4	CRTC			crtc
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	16+(pn+pnp)/4+(cn+cnp)/4+pf+cf	reply length
-	36	TRANSFORM		pending transform
-	1	BOOL			has transforms
-	3				unused
-	36	TRANSFORM		current transform
-	4				unused
-	2	pn			pending filter name length
-	2	pf			pending filter num params
-	2	cn			current filter name length
-	2	cf			current filter num params
-	pn	STRING8			pending filter name
-	pnp				unused, pnp=pad(pn)
-	4*pf	FIXED			pending filter params
-	cn	STRING8			current filter name
-	cnp				unused, cnp=pad(cn)
-	4*cf	FIXED			current filter params
-└───
-
-┌───
-    RRGetPanning
-	1	CARD8			major opcode
-	1	28			RandR opcode
-	2	2			length
-	4	CRTC			crtc
-      ▶
-	1	1			Reply
-	1	RRCONFIGSTATUS		status
-	2	CARD16			sequence number
-	4	1			reply length
-	4	TIMESTAMP		timestamp
-	2	CARD16			left
-	2	CARD16			top
-	2	CARD16			width
-	2	CARD16			height
-	2	CARD16			track_left
-	2	CARD16			track_top
-	2	CARD16			track_width
-	2	CARD16			track_height
-	2	INT16			border_left
-	2	INT16			border_top
-	2	INT16			border_right
-	2	INT16			border_bottom
-└───
-┌───
-    RRSetPanning
-	1	CARD8			major opcode
-	1	29			RandR opcode
-	2	9			length
-	4	CRTC			crtc
-	4	TIMESTAMP		timestamp
-	2	CARD16			left
-	2	CARD16			top
-	2	CARD16			width
-	2	CARD16			height
-	2	CARD16			track_left
-	2	CARD16			track_top
-	2	CARD16			track_width
-	2	CARD16			track_height
-	2	INT16			border_left
-	2	INT16			border_top
-	2	INT16			border_right
-	2	INT16			border_bottom
-      ▶
-	1	1			Reply
-	1	RRCONFIGSTATUS		status
-	2	CARD16			sequence number
-	4	0			reply length
-	4	TIMESTAMP		new timestamp
-	20				unused
-└───
-
-┌───
-    RRSetOutputPrimary
-	1	CARD8			major opcode
-	1	30			RandR opcode
-	2	3			length
-	4	WINDOW			window
-	4	OUTPUT			output
-└───
-
-┌───
-    RRGetOutputPrimary
-	1	CARD8			major opcode
-	1	31			RandR opcode
-	2	2			length
-	4	WINDOW			window
-      ▶
-	1	1			Reply
-	1				unused
-	2	CARD16			sequence number
-	4	CARD32			length
-	4	OUTPUT			output
-	4	CARD32			pad1
-	4	CARD32			pad2
-	4	CARD32			pad3
-	4	CARD32			pad4
-└───
-
-A.3 Protocol Events
-
-┌───
-    RRScreenChangeNotify
-	1	Base + 0		code
-	1	ROTATION		new rotation and reflection
-	2	CARD16			sequence number
-	4	TIMESTAMP		timestamp
-	4	TIMESTAMP		configuration timestamp
-	4	WINDOW			root window
-	4	WINDOW			request window
-	2	SIZEID			size ID
-	2	SUBPIXELORDER		subpixel order defined in Render
-	2	CARD16			width in pixels
-	2	CARD16			height in pixels
-	2	CARD16			width in millimeters
-	2	CARD16			height in millimeters
-└───
-
-A.3.1 Protocol Events added with version 1.2
-
-┌───
-    RRCrtcChangeNotify
-	1	Base + 1		code
-	1	0			sub-code
-	2	CARD16			sequence number
-	4	TIMESTAMP		timestamp
-	4	WINDOW			request window
-	4	CRTC			crtc affected
-	4	MODE			mode in use
-	2	ROTATION		new rotation and reflection
-	2				unused
-	2	INT16			x
-	2	INT16			y
-	2	CARD16			width
-	2	CARD16			height
-└───
-┌───
-    RROutputChangeNotify
-	1	Base + 1		code
-	1	1			sub-code
-	2	CARD16			sequence number
-	4	TIMESTAMP		timestamp
-	4	TIMESTAMP		configuration timestamp
-	4	WINDOW			request window
-	4	OUTPUT			output affected
-	4	CRTC			crtc in use
-	4	MODE			mode in use
-	2	ROTATION		rotation in use
-	1	CONNECTION		connection status
-	1	SUBPIXELORDER		subpixel order
-└───
-┌───
-    RROutputPropertyNotify
-	1	Base + 1		code
-	1	2			sub-code
-	2	CARD16			sequence number
-	4	WINDOW			window
-	4	OUTPUT			output
-	4	ATOM			atom
-	4	TIMESTAMP		time
-	1				state
-		0	NewValue
-		1	Deleted
-	11				unused
-└───
-
-A.4 Protocol Errors
-
-┌───
-    ERRORS
-	Base + 0		Output
-	Base + 1		Crtc
-	Base + 2		Mode
-└───
-
-Bibliography
-
-[RANDR] Gettys, Jim and Keith Packard, "The X Resize and Rotate
-	Extension - RandR", Proceedings of the 2001 USENIX Annual
-	Technical Conference, Boston, MA
-
-[RENDER]
-	Packard, Keith, "The X Rendering Extension", work in progress,
-	http://cgit.freedesktop.org/xorg/proto/renderproto/tree/renderproto.txt
+	       The X Resize, Rotate and Reflect Extension
+			     Version 1.4.0
+			       2009-10-5
+
+			      Jim Gettys
+			   Jim.Gettys@hp.com
+		     Cambridge Research Laboratory
+				HP Labs
+			Hewlett Packard Company
+
+			     Keith Packard
+			keith.packard@intel.com
+		     Open Source Technology Center
+			   Intel Corporation
+
+1. Introduction
+
+The X Resize, Rotate and Reflect Extension, called RandR for short,
+brings the ability to resize, rotate and reflect the root window of a
+screen. It is based on the X Resize and Rotate Extension as specified
+in the Proceedings of the 2001 Usenix Technical Conference [RANDR].
+
+RandR as implemented and integrated into the X server differs in
+one substantial fashion from the design discussed in that paper: that
+is, RandR 1.0 does not implement the depth switching described in that
+document, and the support described for that in the protocol in that
+document and in the implementation has been removed from the
+protocol described here, as it has been overtaken by events.
+
+These events include:
+      ► Modern toolkits (in this case, GTK+ 2.x) have progressed to the point
+	of implementing migration between screens of arbitrary depths
+      ► The continued advance of Moore's law has made limited amounts of VRAM
+	less of an issue, reducing the pressure to implement depth switching
+	on laptops or desktop systems
+      ► The continued decline of legacy toolkits whose design would have
+	required depth switching to support migration
+      ► The lack of depth switching implementation experience in the
+	intervening time, due to events beyond our control
+
+Additionally, the requirement to support depth switching might
+complicate other re-engineering of the device independent part of the
+X server that is currently being contemplated.
+
+Rather than further delaying RandR's widespread deployment for a feature
+long wanted by the community (resizing of screens, particularly on laptops),
+or the deployment of a protocol design that might be flawed due to lack of
+implementation experience, we decided to remove depth switching from the
+protocol. It may be implemented at a later time if resources and
+interests permit as a revision to the protocol described here, which will
+remain a stable base for applications. The protocol described here has been
+implemented in the main X.org server, and more fully in the hw/kdrive
+implementation in the distribution, which fully implements resizing,
+rotation and reflection.
+
+1.2 Introduction to version 1.2 of the extension
+
+One of the significant limitations found in version 1.1 of the RandR
+protocol was the inability to deal with the Xinerama model where multiple
+monitors display portions of a common underlying screen. In this environment,
+zero or more video outputs are associated with each CRT controller which
+defines both a set of video timings and a 'viewport' within the larger
+screen. This viewport is independent of the overall size of the screen, and
+may be located anywhere within the screen.
+
+The effect is to decouple the reported size of the screen from the size
+presented by each video output, and to permit multiple outputs to present
+information for a single screen.
+
+To extend RandR for this model, we separate out the output, CRTC and screen
+configuration information and permit them to be configured separately. For
+compatibility with the 1.1 version of the protocol, we make the 1.1 requests
+simultaneously affect both the screen and the (presumably sole) CRTC and
+output. The set of available outputs are presented with UTF-8 encoded names
+and may be connected to CRTCs as permitted by the underlying hardware. CRTC
+configuration is now done with full mode information instead of just size
+and refresh rate, and these modes have names. These names also use UTF-8
+encoding. New modes may also be added by the user.
+
+Additional requests and events are provided for this new functionality.
+
+       ┌────────────────────────────────┬──────────┐
+    ┏━━━━━━━┳───────────────┐       ╔════════╗ ╔════════╗
+    ┃   1   ┃               │       ║   A    ║ ║   B    ║
+    ┃   ┏━━━╋━━━━━━━━━━━━━━━┫       ║        ║ ║        ║
+    ┣━━━╋━━━┛               ┃       ╚════════╝ ╚════════╝
+    │   ┃         2         ┃─────────────────┐
+    │   ┃                   ┃        ╔═══════════════════╗
+    │   ┃                   ┃        ║                   ║
+    │   ┗━━━━━━━━━━━━━━━━━━━┫        ║        C          ║
+    └───────────────────────┘        ║                   ║
+    ┌──────┐  ┏━━━━┓  ╔══════╗       ║                   ║
+    │screen│  ┃CRTC┃  ║output║       ╚═══════════════════╝
+    └──────┘  ┗━━━━┛  ╚══════╝
+
+In this picture, the screen is covered (incompletely) by two CRTCs. CRTC1
+is connected to two outputs, A and B. CRTC2 is connected to output C.
+Outputs A and B will present exactly the same region of the screen using
+the same mode line. Output C will present a different (larger) region of
+the screen using a different mode line.
+
+RandR provides information about each available CRTC and output; the
+connection between CRTC and output is under application control, although
+the hardware will probably impose restrictions on the possible
+configurations. The protocol doesn't try to describe these restrictions,
+instead it provides a mechanism to find out what combinations are supported.
+
+For instance, dual-link DVI gangs two CRTC outputs together to provide higher
+bandwidth for large resolution screens. This is exposed in RandR by
+requiring that nothing be connected to the second CRTC when driving a high
+resolution screen on the first.
+
+1.3 Introduction to version 1.3 of the extension
+
+Version 1.3 builds on the changes made with version 1.2 and adds some new
+capabilities without fundmentally changing the extension again. The
+following features are added in this version:
+
+   • Projective Transforms. The implementation work for general rotation
+     support made it trivial to add full projective transformations. These
+     can be used to scale the screen up/down as well as perform projector
+     keystone correct or other effects.
+
+   • Panning. It was removed with RandR 1.2 because the old semantics didn't
+     fit any longer. With RandR 1.3 panning can be specified per crtc.
+
+1.4 Introduction to version 1.4 of the extension
+
+Version 1.4 adds a couple more capabilities to further expose the
+underlying hardware to clients
+
+   • Per-crtc pixmaps. This provides for multiple scan-out buffers
+     which applications can create and assign to arbitrary collections
+     of crtcs.
+
+   • Sprite position and image transforms. These provide a projective
+     transform for both the hot spot location and the sprite image
+     itself for each CRTC.
+
+   • RRSetCrtcConfigs request. This supplies a set of
+     crtc configurations to the server that must be applied together
+     or not at all. This can reduce screen flicker while also
+     providing the server a complete configuration for appropriate
+     resource management.
+
+The first two additions, per-crtc pixmaps and sprite transforms are
+designed to solve two problems:
+
+ 1) Screen transforms. The software transform code in the X server
+    uses a shadow frame buffer, adding another copy to every graphics
+    operation. Worse, the server has no idea about when clients are
+    done drawing a frame, so the user gets additional latency and
+    judder.
+
+    The goal is to move this operation out to the compositing manager
+    which already deals with an extra copy of the frame buffer for
+    many operations. Have the compositing manager create and draw to a
+    separate pixmap for scanout. It can perform whatever transforms
+    are required to get the image in the right orientation for the
+    user.
+
+ 2) Hardware scanout engine size limits. With a single scanout buffer
+    for the entire screen, it's possible for the user to ask for a
+    configuration which requires that scanout buffer to be larger than
+    the hardware is capable of scanning out from. Again, having the
+    compositing manager create a pixmap for each CRTC will allow for
+    any configuration where monitor position within the virtual space
+    isn't limited by the scanout limits.
+
+In both of these cases, the Sprite transforms are necessary to ensure
+that the sprite appears at the desired spot on each CRTC and with the
+right shape.
+
+1.99 Acknowledgements
+
+Our thanks to the contributors to the design found on the xpert mailing
+list, in particular:
+
+Alan Hourihane for work on the early implementation
+Andrew C. Aitchison for help with the XFree86 DDX implementation
+Andy Ritger for early questions about how mergefb/Xinerama work with RandR
+Carl Worth for editing the specification and Usenix paper
+David Dawes for XFree86 DDX integration work
+Thomas Winischhofer for the hardware-accelerated SiS rotation implementation
+Matthew Tippett and Kevin Martin for splitting outputs and CRTCs to more
+fully expose what video hardware can do
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+2. Screen change model
+
+Screens may change dynamically, either under control of this extension, or
+due to external events. Examples include: monitors being swapped, pressing a
+button to switch from internal display to an external monitor on a laptop,
+or, eventually, the hotplug of a display card entirely on busses such as
+Cardbus or Express Card which permit hot-swap (which will require other work
+in addition to this extension).
+
+Since the screen configuration is dynamic and asynchronous to the client and
+may change at any time RandR provides mechanisms to ensure that your clients
+view is up to date with the configuration possibilities of the moment and
+enforces applications that wish to control the configuration to prove that
+their information is up to date before honoring requests to change the
+screen configuration (by requiring a timestamp on the request).
+
+Interested applications are notified whenever the screen configuration
+changes, providing the current size of the screen and subpixel order (see
+the Render extension [RENDER]), to enable proper rendering of subpixel
+decimated client text to continue, along with a time stamp of the
+configuration change. A client must refresh its knowledge of the screen
+configuration before attempting to change the configuration after a
+notification, or the request will fail.
+
+To avoid multiplicative explosion between orientation, reflection and sizes,
+the sizes are only those sizes in the normal (0) rotation.
+
+Rotation and reflection and how they interact can be confusing. In Randr,
+the coordinate system is rotated in a counter-clockwise direction relative
+to the normal orientation. Reflection is along the window system coordinate
+system, not the physical screen X and Y axis, so that rotation and
+reflection do not interact. The other way to consider reflection is to is
+specified in the "normal" orientation, before rotation, if you find the
+other way confusing.
+
+We expect that most clients and toolkits will be oblivious to changes to the
+screen structure, as they generally use the values in the connections Display
+structure directly. By toolkits updating the values on the fly, we believe
+pop-up menus and other pop up windows will position themselves correctly in
+the face of screen configuration changes (the issue is ensuring that pop-ups
+are visible on the reconfigured screen).
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+3. Data Types
+
+The subpixel order is shared with the Render extension, and is documented
+there. The only datatype defined is the screen size, defined in the normal
+(0 degree) orientation.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+4. Errors
+
+Errors are sent using core X error reports.
+
+Output
+	A value for an OUTPUT argument does not name a defined OUTPUT.
+CRTC
+	A value for a CRTC argument does not name a defined CRTC.
+Mode
+	A value for a MODE argument does not name a defined MODE.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+5. Protocol Types
+
+RRCONFIGSTATUS { Success
+		 InvalidConfigTime
+		 InvalidTime
+		 Failed }
+
+	A value of type RRCONFIGSTATUS returned when manipulating the output
+	configuration or querying information from the server that has some
+	time-dependency.
+
+	InvalidConfigTime indicates that the supplied configuration
+	timestamp does not match the current X server configuration
+	timestamp. Usually this means that the output configuration has
+	changed since the timestamp was received by the application.
+
+	InvalidTime indicates that the supplied output reconfiguration time
+	is earlier than the most recent output reconfiguration request.
+	Generally this indicates that another application has reconfigured
+	the output using a later timestamp.
+
+	Failed is returned whenever the operation is unsuccessful for some
+	other reason. This generally indicates that the requested output
+	configuration is unsupported by the hardware. The goal is to make
+	these limitations expressed by the protocol, but when that isn't
+	possible it is correct to return this error value. If, as a
+	implentor, you find this error code required, please submit the
+	hardware constraints that exist so that a future version of the
+	extension can correctly capture the configuration constraints in
+	your system.
+
+ROTATION { Rotate_0
+	   Rotate_90
+	   Rotate_180
+	   Rotate_270
+	   Reflect_X
+	   Reflect_Y }
+
+	These values are used both to indicate a set of allowed rotations
+	and reflections as well as to indicate a specific rotation and
+	reflection combination.
+
+RRSELECTMASK { RRScreenChangeNotifyMask
+	       RRCrtcChangeNotifyMask (New in version 1.2)
+	       RROutputChangeNotifyMask (New in version 1.2)
+	       RROutputPropertyNotifyMask (New in version 1.2) }
+
+SIZEID { CARD16 }
+
+MODE { XID or None }
+
+CRTC { XID }
+
+OUTPUT { XID }
+
+CONNECTION { Connected, Disconnected, UnknownConnection }
+
+	This value provides an indication of whether an output is actually
+	connected to a monitor or other presentation device.
+
+SUBPIXELORDER { SubPixelUnknown		The subpixel order uses the Render
+		SubPixelHorizontalRGB	extensions definitions; they are here
+		SubPixelHorizontalBGR	only for convenience.
+		SubPixelVerticalRGB
+		SubPixelVerticalBGR
+		SubPixelNone }
+
+SCREENSIZE { widthInPixels, heightInPixels: CARD16
+	     widthInMillimeters, heightInMillimeters: CARD16 }
+
+MODEFLAG { HSyncPositive
+	   HSyncNegative
+	   VSyncPositive
+	   VSyncNegative
+	   Interlace
+	   DoubleScan
+	   CSync
+	   CSyncPositive
+	   CSyncNegative
+	   HSkewPresent
+	   BCast
+	   PixelMultiplex
+	   DoubleClock
+	   ClockDivideBy2 }
+
+MODEINFO { id: MODE
+	   name: STRING
+	   width, height: CARD16
+	   dotClock: CARD32
+	   hSyncStart, hSyncEnd, hTotal, hSkew: CARD16
+	   vSyncStart, vSyncEnd, vTotal: CARD16
+	   modeFlags: SETofMODEFLAG }
+
+REFRESH { rates: LISTofCARD16 }
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+5.4. Protocol Types added in version 1.4 of the extension
+
+SCANOUTPIXMAPINFO { format: PICTFORMAT
+		    maxWidth, maxHeight: CARD16
+		    rotations: SETofROTATION }
+
+	'format' is the format of the pixels within the scanout
+	pixmap. Only 'Direct' formats are supported, this will never
+	be an 'Indexed' format.
+
+	'maxWidth' and 'maxHeight' define the largest supported
+	scanout pixmap. There is no minimum size; scanout pixmaps down
+	to 1x1 may be created.
+
+	'rotations' lists the set of rotations which can be provided
+	without additional latency or memory usage within the
+	environment. This typically means that they are supported
+	directly by the hardware. It is expected that a compositing
+	manager will perform other transforms as a part of the
+	compositing process in conjunction with the sprite transforms
+	described in this extension.
+
+SCREENFLAG { SetScreenPixmapSize
+             SetScreenSize
+	     SetScreenSizeInMillimeters
+	     SetScreenCrtcs }
+
+CRTCFLAG { SetCrtcPosition
+	   SetCrtcMode
+	   SetCrtcRotation
+	   SetCrtcOutputs
+	   SetCrtcSpritePositionTransform
+	   SetCrtcSpriteImageTransform
+	   SetCrtcPixmap
+	   SetCrtcPixmapPosition }
+
+CRTCCONFIG { crtc: CRTC
+	     set: SETofCRTCFLAG
+	     x, y: INT16
+	     mode: MODE
+	     rotation: ROTATION
+	     sprite-position-transform: TRANSFORM
+	     sprite-image-transform: TRANSFORM
+	     outputs: LISTofOUTPUT
+	     pixmap: PIXMAP or None
+	     pixmap-x, pixmap-y: INT16 }
+
+	If 'set' includes SetCrtcSpritePositionTransform, then
+	sprite-position-transform is used as in the
+	RRSetCrtcSpriteTransform request position-transform parameter.
+
+	If 'set' includes SetCrtcSpriteImageTransform, then
+	sprite-image-transform is used as in the
+	RRSetCrtcSpriteTransform request image-transform parameter.
+
+	If 'set' includes SetCrtcPixmap, then 'pixmap' specifies the
+	origin of the pixel data to be presented on 'crtc'. If
+	'pixmap' is None, then data will be presented from the screen
+	pixmap.
+
+	If 'set' includes SetCrtcPixmapPosition, then 'pixmap-x' and
+	'pixmap-y' specify the origin of the scanout data within the
+	pixmap, the area from that location to pixmap-x +
+	width-of(mode), pixmap-y + height-of(mode) is what will be
+	seen on the connected outputs.
+
+	If 'set' includes SetCrtcPixmap, then 'pixmap' must specify a
+	scanout pixmap as created by RRCreateScanoutPixmap or
+	None. Otherwise a Match error results. Furthermore: 
+
+	 * 'pixmap' must be at least as large as the area to be
+	   scanned out, or a Match error results.
+
+	 * If 'pixmap' is destroyed while still being used as a
+	   scanout pixmap, then the associated CRTC will have its
+	   scanout pixmap set back to None, the CRTC origin set back
+	   to 0,0 (to make sure it fits) and the screen pixmap width
+	   and height increased to be at least as big as the current
+	   CRTC mode.
+
+	 * Future crtc changes that do not change the scanout pixmap
+	   will cause an existing scanout pixmap to be resized to be
+	   large enough to hold the new mode at the then-current
+	   pixmap-x/pixmap-y location.
+
+	If 'set' includes SetCrtcRotation then:
+
+	 * Any new or existing scanout pixmap must have had the
+	   specified 'rotation' included as a part of its creation
+	   parameters, or a Match error results.
+
+	 * If no scanout pixmap is in use, then the crtc must support
+	   'rotation' else a Value error results.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+6. Extension Initialization
+
+The name of this extension is "RANDR".
+
+┌───
+    RRQueryVersion
+	client-major-version:	CARD32
+	client-minor-version:	CARD32
+      ▶
+	major-version:		CARD32
+	minor-version:		CARD32
+└───
+
+	The client sends the highest supported version to the server
+	and the server sends the highest version it supports, but no
+	higher than the requested version. Major versions changes can
+	introduce incompatibilities in existing functionality, minor
+	version changes introduce only backward compatible changes.
+	It is the clients responsibility to ensure that the server
+	supports a version which is compatible with its expectations.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+7. Extension Requests
+
+┌───
+    RRSelectInput
+	window: WINDOW
+	enable: SETofRRSELECTMASK
+└───
+	Errors: Window, Value
+
+	If 'enable' is RRScreenChangeNotifyMask, RRScreenChangeNotify events
+	will be sent when the screen configuration changes, either from
+	this protocol extension, or due to detected external screen
+	configuration changes. RRScreenChangeNotify may also be sent when
+	this request executes if the screen configuration has changed since
+	the client connected, to avoid race conditions.
+
+	New for version 1.2:
+
+	If 'enable' contains RRCrtcChangeMask, RRCrtcChangeNotify events
+	will be sent when a the configuration for a CRTC associated with the
+	screen changes, either through this protocol extension or due to
+	detected external changes. RRCrtcChangeNotify may also be sent when
+	this request executes if the CRTC configuration has changed since
+	the client connected, to avoid race conditions.
+
+	If 'enable' contains RROutputChangeMask, RROutputChangeNotify events
+	will be sent when a the configuration for an output associated with
+	the screen changes, either through this protocol extension or due to
+	detected external changes. RROutputChangeNotify may also be sent
+	when this request executes if the output configuration has changed
+	since the client connected, to avoid race conditions.
+
+	If 'enable' contains RROutputPropertyNotifyMask,
+	RROutputPropertyNotify events will be sent when properties change on
+	this output.
+
+┌───
+    RRSetScreenConfig
+	window: WINDOW
+	timestamp: TIMESTAMP
+	config-timestamp: TIMESTAMP
+	size-id: SIZEID
+	rotation: ROTATION
+	rate: CARD16
+      ▶
+	status: RRCONFIGSTATUS
+	new-timestamp: TIMESTAMP
+	config-timestamp: TIMESTAMP
+	root: WINDOW
+	subpixelOrder: SUBPIXELORDER
+└───
+	Errors: Value, Match
+
+	If 'timestamp' is less than the time when the configuration was last
+	successfully set, the request is ignored and InvalidTime returned in
+	status.
+
+	If 'config-timestamp' is not equal to when the server's screen
+	configurations last changed, the request is ignored and
+	InvalidConfigTime returned in status. This could occur if the
+	screen changed since you last made a RRGetScreenInfo request,
+	perhaps by a different piece of display hardware being installed.
+	Rather than allowing an incorrect call to be executed based on stale
+	data, the server will ignore the request.
+
+	'rate' contains the desired refresh rate. If it is zero, the server
+	selects an appropriate rate.
+
+	This request may fail for other indeterminate reasons, in which case
+	'status' will be set to Failed and no configuration change will be
+	made.
+
+	This request sets the screen to the specified size, rate, rotation
+	and reflection.
+
+	When this request succeeds, 'status' contains Success and the
+	requested changes to configuration will have been made.
+
+	'new-time-stamp' contains the time at which this request was
+	executed.
+
+	'config-timestamp' contains the time when the possible screen
+	configurations were last changed.
+
+	'root' contains the root window for the screen indicated by the
+	window.
+
+	'subpixelOrder' contains the resulting subpixel order of the screen
+	to allow correct subpixel rendering.
+
+	Value errors are generated when 'rotation', 'rate' or 'size-id'
+	are invalid.
+
+┌───
+    RRGetScreenInfo
+	window: WINDOW
+      ▶
+	rotations: SETofROTATION
+	root: WINDOW
+	timestamp: TIMESTAMP
+	config-timestamp: TIMESTAMP
+	size-id: SIZEID
+	rotation: ROTATION
+	rate: CARD16
+	sizes: LISTofSCREENSIZE
+	refresh: LISTofREFRESH
+└───
+
+	Errors: Window
+
+	RRGetScreenInfo returns information about the current and available
+	configurations for the screen associated with 'window'.
+
+	'rotations' contains the set of rotations and reflections supported
+	by the screen.
+
+	'root' is the root window of the screen.
+
+	'config-timestamp' indicates when the screen configuration
+	information last changed: requests to set the screen will fail
+	unless the timestamp indicates that the information the client
+	is using is up to date, to ensure clients can be well behaved
+	in the face of race conditions.
+
+	'timestamp' indicates when the configuration was last set.
+
+	'size-id' indicates which size is active.
+
+	'rate' is the current refresh rate. This is zero when the refresh
+	rate is unknown or on devices for which refresh is not relevant.
+
+	'sizes' is the list of possible frame buffer sizes (at the normal
+	orientation. Each size indicates both the linear physical size of
+	the screen and the pixel size.
+
+	'refresh' is the list of refresh rates for each size. Each element
+	of 'sizes' has a corresponding element in 'refresh'. An empty list
+	indicates no known rates, or a device for which refresh is not
+	relevant.
+
+	The default size of the screen (the size that would become the
+	current size when the server resets) is the first size in the
+	list.
+
+7.1. Extension Requests added in version 1.2 of the extension
+
+As introduced above, version 1.2 of the extension splits the screen size
+from the crtc and output configuration, permitting the subset of the screen
+presented by multiple outputs to be configured. As a separate notion, the
+size of the screen itself may be arbitrarily configured within a defined
+range. As crtcs and outputs are added and removed from the system, the set
+returned by the extension will change so that applications can detect
+dynamic changes in the display environment.
+
+┌───
+    RRGetScreenSizeRange
+	window: WINDOW
+      ▶
+	CARD16	minWidth, minHeight
+	CARD16	maxWidth, maxHeight
+└───
+	Errors: Window
+
+	Returns the range of possible screen sizes. The screen may be set to
+	any size within this range.
+
+┌───
+    RRSetScreenSize
+	window: WINDOW
+	width: CARD16
+	height: CARD16
+	width-in-millimeters: CARD32
+	height-in-millimeters: CARD32
+└───
+	Errors: Window, Match, Value
+
+	Sets the screen to the specified size. 'width' and 'height' must be
+	within the range allowed by GetScreenSizeRanges, otherwise a Value
+	error results. All active monitors must be configured to display a
+	subset of the specified size, else a Match error results.
+
+	'width-in-millimeters' and 'height-in-millimeters' can be set to
+	reflect the physical size of the screen reported both through this
+	extension and the core protocol. They must be non-zero, or Value
+	error results.
+
+	If panning is enabled, the width and height of the panning and the
+	tracking areas are adapted to the new size and clamped afterwards.
+	Disabled panning axes remain disabled.
+	Panning borders are disabled if their requirements are no longer met
+	(see RRSetPanning).
+
+┌───
+    RRGetScreenResources
+	window: WINDOW
+      ▶
+	timestamp: TIMESTAMP
+	config-timestamp: TIMESTAMP
+	crtcs: LISTofCRTC
+	outputs: LISTofOUTPUT
+	modes: LISTofMODEINFO
+└───
+	Errors: Window
+
+	RRGetScreenResources returns the list of outputs and crtcs connected
+	to the screen associated with 'window'.
+
+	'timestamp' indicates when the configuration was last set.
+
+	'config-timestamp' indicates when the configuration information last
+	changed. Requests to configure the output will fail unless the
+	timestamp indicates that the information the client is using is up
+	to date, to ensure clients can be well behaved in the face of race
+	conditions.
+
+	'crtcs' contains the list of CRTCs associated with the screen.
+
+	'outputs' contains the list of outputs associated with the screen.
+
+	'modes' contains the list of modes associated with the screen
+
+	This request explicitly asks the server to ensure that the
+	configuration data is up-to-date wrt the hardware. If that requires
+	polling, this is when such polling would take place.  If the
+	current configuration is all that's required, use
+	RRGetScreenResourcesCurrent instead.
+
+┌───
+    RRGetOutputInfo
+	output: OUTPUT
+	config-timestamp: TIMESTAMP
+      ▶
+	status: RRCONFIGSTATUS
+	timestamp: TIMESTAMP
+	crtc: CRTC
+
+	name: STRING
+	connection: CONNECTION
+	subpixel-order: SUBPIXELORDER
+	widthInMillimeters, heightInMillimeters: CARD32
+	crtcs: LISTofCRTC
+	clones: LISTofOUTPUT
+	modes: LISTofMODE
+	num-preferred: CARD16
+└───
+	Errors: Output
+
+	RRGetOutputInfo returns information about the current and available
+	configurations 'output'.
+
+	If 'config-timestamp' does not match the current configuration
+	timestamp (as returned by RRGetScreenResources), 'status' is set to
+	InvalidConfigTime and the remaining reply data is empty. Otherwise,
+	'status' is set to Success.
+
+	'timestamp' indicates when the configuration was last set.
+
+	'crtc' is the current source CRTC for video data, or Disabled if the
+	output is not connected to any CRTC.
+
+	'name' is a UTF-8 encoded string designed to be presented to the
+	user to indicate which output this is. E.g. "S-Video" or "DVI".
+
+	'connection' indicates whether the hardware was able to detect a
+	device connected to this output. If the hardware cannot determine
+	whether something is connected, it will set this to
+	UnknownConnection.
+
+	'subpixel-order' contains the resulting subpixel order of the
+	connected device to allow correct subpixel rendering.
+
+	'widthInMillimeters' and 'heightInMillimeters' report the physical
+	size of the displayed area. If unknown, or not really fixed (e.g.,
+	for a projector), these	values are both zero.
+
+	'crtcs' is the list of CRTCs that this output may be connected to.
+	Attempting to connect this output to a different CRTC results in a
+	Match error.
+
+	'clones' is the list of outputs which may be simultaneously
+	connected to the same CRTC along with this output. Attempting to
+	connect this output with an output not in the 'clones' list
+	results in a Match error.
+
+	'modes' is the list of modes supported by this output. Attempting to
+	connect this output to a CRTC not using one of these modes results
+	in a Match error.
+
+	The first 'num-preferred' modes in 'modes' are preferred by the
+	monitor in some way; for fixed-pixel devices, this would generally
+	indicate which modes match the resolution of the output device.
+
+┌───
+    RRListOutputProperties
+	output:OUTPUT
+      ▶
+	atoms: LISTof ATOM
+└───
+	Errors: Output
+
+	This request returns the atoms of properties currently defined on
+	the output.
+
+┌───
+    RRQueryOutputProperty
+	output: OUTPUT
+	property: ATOM
+      ▶
+	pending: BOOL
+	range: BOOL
+	immutable: BOOL
+	valid-values: LISTofINT32
+└───
+	Errors: Name, Atom, Output
+
+	If the specified property does not exist for the specified output,
+	then a Name error is returned.
+
+	If 'pending' is TRUE, changes made to property values with
+	RRChangeOutputProperty will be saved in the pending property value
+	and be automatically copied to the current value on the next
+	RRSetCrtcConfig request involving the named output. If 'pending' is
+	FALSE, changes are copied immediately.
+
+	If 'range' is TRUE, then the valid-values list will contain
+	precisely two values indicating the minimum and maximum allowed
+	values. If 'range' is FALSE, then the valid-values list will contain
+	the list of possible values; attempts to set other values will
+	result in a Value error.
+
+	If 'immutable' is TRUE, then the property configuration cannot be
+	changed by clients. Immutable properties are interpreted by the X
+	server.
+
+┌───
+    RRConfigureOutputProperty
+	output: OUTPUT
+	property: ATOM
+	pending: BOOL
+	range: BOOL
+	valid-values: LISTofINT32
+└───
+	Errors: Access, Name, Atom, Output
+
+	If the specified property is 'immutable', an Access error is
+	returned.
+
+	Otherwise, the configuration of the specified property is changed to
+	the values provided in this request.
+
+	If the specified property does not exist for the specified output,
+	it is created with an empty value and None type.
+
+┌───
+    RRChangeOutputProperty
+	output: OUTPUT
+	property, type: ATOM
+	format: {8, 16, 32}
+	mode: { Replace, Prepend, Append }
+	data: LISTofINT8 or LISTofINT16 or LISTofINT32
+└───
+	Errors: Alloc, Atom, Match, Value, Output
+
+	This request alters the value of the property for the specified
+	output. If the property is marked as a 'pending' property, only the
+	pending value of the property is changed. Otherwise, changes are
+	reflected in both the pending and current values of the property.
+	The type is uninterpreted by the server.  The format specifies
+	whether the data should be viewed as a list of 8-bit, 16-bit, or
+	32-bit quantities so that the server can correctly byte-swap as
+	necessary.
+
+	If the mode is Replace, the previous property value is discarded.
+	If the mode is Prepend or Append, then the type and format must
+	match the existing property value (or a Match error results).  If
+	the property is undefined, it is treated as defined with the correct
+	type and format with zero-length data.
+
+	For Prepend, the data is tacked on to the beginning of the existing
+	data, and for Append, it is tacked on to the end of the existing data.
+
+	This request generates a OutputPropertyNotify
+
+	The lifetime of a property is not tied to the storing client.
+	Properties remain until explicitly deleted, until the output is
+	destroyed, or until server reset (see section 10).
+
+	The maximum size of a property is server-dependent and may vary
+	dynamically.
+
+┌───
+    RRDeleteOutputProperty
+	output: OUTPUT
+	property: ATOM
+└───
+	Errors: Atom, Output
+
+	This request deletes the property from the specified window if the
+	property exists and generates a OutputPropertyNotify event unless
+	the property does not exist.
+
+┌───
+    RRGetOutputProperty
+	output: OUTPUT
+	property: ATOM
+	type: ATOM or AnyPropertyType
+	long-offset, long-length: CARD32
+	delete: BOOL
+	pending: BOOL
+      ▶
+	type: ATOM or None
+	format: {0, 8, 16, 32}
+	bytes-after: CARD32
+	value: LISTofINT8 or LISTofINT16 or LISTofINT32
+└───
+	Errors: Atom, Value, Output
+
+	If the specified property does not exist for the specified output,
+	then the return type is None, the format and bytes-after are zero,
+	and the value is empty.  The delete argument is ignored in this
+	case.
+
+	If the specified property exists but its type does not match the
+	specified type, then the return type is the actual type of the
+	property, the format is the actual format of the property (never
+	zero), the bytes-after is the length of the property in bytes (even
+	if the format is 16 or 32), and the value is empty.  The delete
+	argument is ignored in this case.
+
+	If the specified property exists and either AnyPropertyType is
+	specified or the specified type matches the actual type of the
+	property, then the return type is the actual type of the property,
+	the format is the actual format of the property (never zero), and
+	the bytes-after and value are as follows, given:
+
+		N = actual length of the stored property in bytes
+				  (even if the format is 16 or 32)
+		I = 4 × offset
+		T = N - I
+		L = MINIMUM(T, 4 × long-length)
+		A = N - (I + L)
+
+	If 'pending' is true, and if the property holds a pending value,
+	then the value returned will be the pending value of the property
+	rather than the current value.  The returned value starts at byte
+	index I in the property (indexing from 0), and its length in bytes
+	is L.  However, it is a Value error if long-offset is given such
+	that L is negative.  The value of bytes-after is A, giving the
+	number of trailing unread bytes in the stored property.  If delete
+	is True and the bytes-after is zero, the property is also deleted
+	from the output, and a RROutputPropertyNotify event is generated.
+
+┌───
+    RRCreateMode
+	window: WINDOW
+	modeinfo: MODEINFO
+      ▶
+	mode: MODE
+└───
+	Errors: Window, Name, Value
+
+	'modeinfo' provides a new mode for outputs on the screen
+	associated with 'window'. If the name of 'modeinfo' names an
+	existing mode, a Name error is returned.  If some parameter of the
+	mode is not valid in some other way, a Value error is returned.
+
+	The returned 'mode' provides the id for the mode.
+
+┌───
+    RRDestroyMode
+	mode: MODE
+└───
+	Errors: Mode, Access
+
+	The user-defined 'mode' is destroyed. 'mode' must name a mode
+	defined with RRCreateMode, else an Match error is returned.  If
+	'mode' is in use by some CRTC or Output, then an Access error is
+	returned.
+
+┌───
+    RRAddOutputMode
+	output: OUTPUT
+	mode: MODE
+└───
+	Errors: Output, Mode, Match
+
+	'output' indicates which output is to be configured.
+
+	'mode' specifies which mode to add. If 'mode' is not valid for
+	'output', then a Match error is generated.
+
+	This request generates OutputChangeNotify events.
+
+┌───
+    RRDeleteOutputMode
+	output: OUTPUT
+	mode: MODE
+└───
+	Errors: Output, Mode
+
+	'output' indicates which output is to be configured.
+
+	'mode' specifies which mode to delete. 'mode' must have been added
+	with RRAddOutputMode, else an Access error is returned. 'mode' must
+	not be active, else a Match error is returned.
+
+	This request generates OutputChangeNotify events.
+
+┌───
+    RRGetCrtcInfo
+	crtc: CRTC
+	config-timestamp: TIMESTAMP
+      ▶
+	status: RRCONFIGSTATUS
+	timestamp: TIMESTAMP
+	x, y: INT16
+	width, height: CARD16
+	mode: MODE
+	rotation: ROTATION
+	outputs: LISTofOUTPUT
+
+	rotations: SETofROTATION
+	possible-outputs: LISTofOUTPUT
+└───
+
+	Errors: Window
+
+	RRGetCrtcModes returns information about the current and available
+	configurations for the specified crtc connected to the screen
+	associated with 'window'.
+
+	If 'config-timestamp' does not match the current configuration
+	timestamp (as returned by RRGetScreenResources), 'status' is set to
+	InvalidConfigTime and the remaining reply data is empty. Otherwise,
+	'status' is set to Success.
+
+	'timestamp' indicates when the configuration was last set.
+
+	'x' and 'y' indicate the position of this CRTC within the screen
+	region. They will be set to 0 when the CRTC is disabled.
+
+	'width' and 'height' indicate the size of the area within the screen
+	presented by this CRTC. This may be different than the size of the
+	mode due to rotation. They will be set to 0 when the CRTC
+	is disabled.
+
+	'mode' indicates which mode is active, or None indicating that the
+	CRTC has been disabled and is not displaying the screen contents.
+
+	'rotation' indicates the active rotation. It is set to Rotate_0
+	when the CRTC is disabled.
+
+	'outputs' is the list of outputs currently connected to this CRTC
+	and is empty when the CRTC is disabled.
+
+	'rotations' contains the set of rotations and reflections supported
+	by the CRTC.
+
+	'possible-outputs' lists all of the outputs which may be connected
+	to this CRTC.
+
+┌───
+    RRSetCrtcConfig
+	crtc: CRTC
+	timestamp: TIMESTAMP
+	config-timestamp: TIMESTAMP
+	x, y: INT16
+	mode: MODE
+	rotation: ROTATION
+	outputs: LISTofOUTPUT
+      ▶
+	status: RRCONFIGSTATUS
+	new-timestamp: TIMESTAMP
+└───
+	Errors: Value, Match
+
+	If 'timestamp' is less than the time when the configuration was last
+	successfully set, the request is ignored and InvalidTime returned in
+	status.
+
+	If 'config-timestamp' is not equal to when the monitor's
+	configuration last changed, the request is ignored and
+	InvalidConfigTime returned in status. This could occur if the
+	monitor changed since you last made a RRGetScreenInfo request,
+	perhaps by a different monitor being connected to the machine.
+	Rather than allowing an incorrect call to be executed based on stale
+	data, the server will ignore the request.
+
+	'x' and 'y' contain the desired location within the screen for this
+	monitor's content. 'x' and 'y' must be within the screen size, else
+	a Value error results.
+
+	'mode' is either the desired mode or None indicating the CRTC should
+	be disabled. If 'mode' is not one of these values, a Value
+	error results. 'mode' must be valid for all of the configured outputs,
+	else a Match error.
+
+	'rotation' contains the desired rotation along with which
+	reflections should be enabled. The rotation and reflection values
+	must be among those allowed for this monitor, else a Value error
+	results.
+
+	'outputs' contains the set of outputs that this CRTC should be
+	connected to. The set must be among the list of acceptable output
+	sets for this CRTC or a Match error results.
+
+	If 'mode' is None, then 'outputs' must be empty, else a Match error
+	results. Conversely, if 'mode' is not None, then 'outputs' must not be
+	empty, else a Match error results.
+
+	This request may fail for other indeterminate reasons, in which case
+	'status' will be set to Failed and no configuration change will be
+	made.
+
+	This request sets the CRTC to the specified position, mode, rotation
+	and reflection. The entire area of the CRTC must fit within the
+	screen size, else a Match error results. As an example, rotating the
+	screen so that a single CRTC fills the entire screen before and
+	after may necessitate disabling the CRTC, resizing the screen,
+	then re-enabling the CRTC at the new configuration to avoid an
+	invalid intermediate configuration.
+
+	If panning is enabled, the width and height of the panning and the
+	tracking areas are clamped to the new mode size.
+	Disabled panning axes remain disabled.
+	Panning borders are disabled if their requirements are no longer met
+	(see RRSetPanning).
+
+	When this request succeeds, 'status' contains Success and the
+	requested changes to configuration will have been made.
+
+	'new-time-stamp' contains the time at which this request was
+	executed.
+
+┌───
+    RRGetCrtcGammaSize
+	crtc: CRTC
+      ▶
+	size: CARD16
+└───
+	Errors: Crtc
+
+	This request returns the size of the gamma ramps used by 'crtc'.
+
+┌───
+    RRGetCrtcGamma
+	crtc: CRTC
+      ▶
+	red: LISTofCARD16
+	green: LISTofCARD16
+	blue: LISTofCARD16
+└───
+	Errors: Crtc
+
+	This request returns the currently set gamma ramps for 'crtc'.  All
+	three lists will be the size returned by the RRGetCrtcGammaSize
+	request.
+
+┌───
+    RRSetCrtcGamma
+	crtc: CRTC
+	red: LISTofCARD16
+	green: LISTofCARD16
+	blue: LISTofCARD16
+└───
+	Errors: Crtc, Match
+
+	This request sets the gamma ramps for 'crtc'. All three lists
+	must be the size returned by RRGetCrtcGammaSize else a Value error
+	results.
+
+7.2. Extension Requests added in version 1.3 of the extension
+
+┌───
+    RRGetScreenResourcesCurrent
+	window: WINDOW
+      ▶
+	timestamp: TIMESTAMP
+	config-timestamp: TIMESTAMP
+	crtcs: LISTofCRTC
+	outputs: LISTofOUTPUT
+	modes: LISTofMODEINFO
+└───
+	Errors: Window
+
+	RRGetScreenResourcesCurrent returns the list of outputs and crtcs
+	connected to the screen associated with 'window'.
+
+	'timestamp' indicates when the configuration was last set.
+
+	'config-timestamp' indicates when the configuration information last
+	changed. Requests to configure the output will fail unless the
+	timestamp indicates that the information the client is using is up
+	to date, to ensure clients can be well behaved in the face of race
+	conditions.
+
+	'crtcs' contains the list of CRTCs associated with the screen.
+
+	'outputs' contains the list of outputs associated with the screen.
+
+	'modes' contains the list of modes associated with the screen.
+
+	Unlike RRGetScreenResources, this merely returns the current
+	configuration, and does not poll for hardware changes.
+
+┌───
+    RRSetCrtcTransform
+	crtc: CRTC
+	transform: TRANSFORM
+	filter: STRING8
+	values: LISTofFIXED
+└───
+	Errors: Crtc, Match
+
+	This request provides a mechanism that is more general than the
+	existing rotation and reflection values for describing the
+	transformation from frame buffer image to crtc presentation.
+	'transform' is a full 2D projective transformation from screen
+	coordinate space to crtc coordinate space. This transformation is
+	applied before the rotation and reflection values to compute the
+	complete transform.
+
+	'filter' and 'values' specify a Render filter that may be used by the
+	server when transforming data from frame buffer to crtc.
+
+	This request sets the transform to be used at the next
+	RRSetCrtcConfig request execution; it does not cause any change to
+	occur in the current configuration.
+
+	When a non-identity transformation is in use, the rectangle returned
+	by RRGetCrtcInfo defines the bounding rectangle of the screen that is
+	projected to the crtc. It is this projected rectangle which must be
+	within the area of the screen when the mode is set.
+
+┌───
+    RRGetCrtcTransform
+	crtc: CRTC
+      ▶
+	pending-transform: TRANSFORM
+	pending-filter: STRING8
+	pending-values: LISTofFIXED
+	current-transform: TRANSFORM
+	current-filter: STRING8
+	current-values: LISTofFIXED
+└───
+
+	This request returns the pending and current transforms for the
+	specified CRTC. The pending transform will be the same as the current
+	transform if no new pending transform has been set since the last call
+	to RRSetCrtcConfig.
+
+┌───
+    RRGetPanning
+	crtc: CRTC
+      ▶
+	status: RRCONFIGSTATUS
+	timestamp: TIMESTAMP
+	left, top, width, height: CARD16
+	track_left, track_top, track_width, track_height: CARD16
+	border_left, border_top, border_right, border_bottom: INT16
+└───
+
+	Errors: Crtc
+
+	Version 1.3 adds panning support again. If multiple crtcs are active
+	the panning behavior can be defined per crtc individually.
+	RRGetPanning returns information about the currently set panning
+	configuration for the specified crtc.  If the CRTC does not support
+	panning, all fields (except timestamp) will be 0.
+
+	'timestamp' indicates when the configuration was last set.
+
+	All other entries are explained for RRSetPanning.
+
+┌───
+    RRSetPanning
+	crtc: CRTC
+	timestamp: TIMESTAMP
+	left, top, width, height: CARD16
+	track_left, track_top, track_width, track_height: CARD16
+	border_left, border_top, border_right, border_bottom: INT16
+      ▶
+	status: RRCONFIGSTATUS
+	new-timestamp: TIMESTAMP
+└───
+	Errors: Crtc, Match
+
+	This request sets the panning parameters.  As soon as panning is
+	enabled, the CRTC position can change with every pointer move.
+	RRCrtcChangeNotify events are sent to the clients requesting those.
+
+	If 'timestamp' is less than the time when the configuration was last
+	successfully set, the request is ignored and InvalidTime returned in
+	status.
+
+	┌──┳━━━━━━━━━━━━━━┳─────┬ ─ ─ ─ ─ ─ ┐
+	│  ┃     CRTC     ┃     │
+	│  ┃              ┃     │           │
+	│  ┃             X┃→    │
+	│  ┃              ┃     │           │  framebuffer
+	│  ┗━━━━━━━━━━━━━━┛     │
+	│                       │           │
+	│panning area           │
+	└───────────────────────┴ ─ ─ ─ ─ ─ ┘
+
+	'left', 'top', 'width', and 'height' contain the total panning area
+	for this CRTC.  'width' has to be larger than or equal to the CRTC's
+	width or 0, and 'left'+'width' must be within the screen size, else a
+	Match error results.  Equivalent restrictions for the height exist.
+	'width' or 'height' set to 0 indicate that panning should be disabled
+	on the according axis.  Setting 'width'/'height' to the CRTC's
+	width/height will disable panning on the X/Y axis as well, but
+	RRSetScreenSize will silently enable panning if the screen size is
+	increased. This does not happen if set to 0.
+
+	┌────────┳━━━━━━━━━━━━━━┳ ─ ─ ─ ─ ─ ┐
+	│        ┃     CRTC     ┃
+	│        ┃              ┃           │
+	│        ┃              ┃
+	│        ┃              ┃           │  tracking area
+	│        ┗━━━━━━━━━━━━━━┫     X
+	│               ↓       │     ↓     │
+	│panning area           │
+	└───────────────────────┴ ─ ─ ─ ─ ─ ┘
+
+	'track_left', 'track_top', 'track_width', and 'track_height' contain
+	the pointer area for which the panning region is updated.  For normal
+	use cases it should enclose the panning area minus borders, and is
+	typically set to either the panning area minus borders, or to the
+	total screen size. If set to the total screen size, the CRTC will pan
+	in the remaining axis even if the pointer is outside the panning area
+	on a different CRTC, as shown in the figure above. If the pointer is
+	outside the tracking area, the CRTC will not pan. Zero can be used as
+	an alias for the total screen size.
+
+	┌──┳━━━━━━━━━━━━━━┳────────────┐
+	│  ┃     CRTC     ┃            │
+	│  ┃              ┃            │
+	│  ┃              ┃→           │
+	│  ┃           X←→┃            │
+	│  ┃       border_right        │
+	│  ┗━━━━━━━━━━━━━━┛            │
+	│                              │
+	│panning area                  │
+	└──────────────────────────────┘
+
+	'border_left', 'border_top', 'border_right', and 'border_bottom'
+	define the distances from the CRTC borders that will activate panning
+	if the pointer hits them.  If the borders are 0, the screen will pan
+	when the pointer hits the CRTC borders (behavior of pre-RandR Xserver
+	panning).  If the borders are positive, the screen will pan when the
+	pointer gets close to the CRTC borders, if they are negative, the
+	screen will only pan when the pointer is already way past the CRTC
+	borders.  Negative values might confuse users and disable panning to
+	the very edges of the screen.  Thus they are discouraged.
+	border_left + border_right has to be lower or equal than the CRTC's
+	width, else a Match error results.  An equivalent restriction for the
+	height exists.
+
+	Screen size changes update the panning and the tracking areas to the
+	new size. Both screen size changes and mode changes clamp these areas
+	to the current CRTC size.  In these cases panning borders are disabled
+	if their requirements are no longer met.
+
+	When this request succeeds, 'status' contains Success and the
+	requested changes to configuration will have been made.
+
+	'new-time-stamp' contains the time at which this request was
+	executed.
+
+┌───
+    RRSetOutputPrimary
+	window: WINDOW
+	output: OUTPUT
+└───
+	Errors: Match, Output, Window
+
+	RRSetOutputPrimary marks 'output' as the primary output for the
+	screen with the same root window as 'window'. This output's CRTC
+	will be sorted to the front of the list in Xinerama and RANDR
+	geometry requests for the benefit of older applications. The
+	default primary output is None, and None is a legal value to pass
+	to RRSetOutputPrimary. This request is expected to be used by
+	desktop environments to mark the screen that should hold the primary
+	menu bar or panel.
+
+	As this changes the logical layout of the screen, ConfigureNotify
+	and RRScreenChangeNotify will be generated on the appropriate root
+	window when the primary output is changed by this call. This request
+	also generates RROutputChangeNotify events on the outputs that gained
+	and lost primary status.
+
+	If an output is disconnected asynchronously (eg. due to recabling),
+	the primary status does not change, but RROutputChangeNotify events
+	will be generated if the hardware is capable of detecting this;
+	clients are expected to reconfigure if appropriate.
+
+	If an output is deleted (eg. due to device hotplug), the server will
+	act as though None was passed to RRSetOutputPrimary, including
+	generating the appropriate events.
+
+┌───
+    RRGetOutputPrimary
+	window: WINDOW
+      ▶
+	output: OUTPUT
+└───
+	Errors: Window
+
+	RRGetOutputPrimary returns the primary output for the screen.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+7.3. Extension Requests added in version 1.4 of the extension.
+
+┌───
+    RRQueryScanoutPixmaps
+	window: WINDOW
+      ▶
+	infos: LISTofSCANOUTPIXMAPINFO
+└───
+	Errors: Window
+
+	This request returns information about the server support for
+	alternate scanout pixmaps. For each pictformat, there is a set
+	of rotations and a maximum supported size. The rotations here
+	are those provided by the scanout hardware itself, not by
+	software emulation.
+
+┌───
+    RRCreateScanoutPixmap
+	pixmap: PIXMAP
+	drawable: DRAWABLE
+	width, height: CARD16
+	format: PICTFORMAT
+	rotations: SETofROTATION
+└───
+	Errors: Drawable, Match, Value
+
+	Creates a pixmap which can subsequently be used as a scanout
+	buffer for the screen associated with 'drawable'. 'rotations'
+	is the set of rotation values which may be used with the
+	resulting scanout buffer when it is associated with a CRTC.
+
+	'format' must be one of the supported scanout formats, or a
+	Match error results.
+
+	'width' and 'height' must be within the supported range for
+	the specified format or a Value error results.
+
+	'rotations' must be a subset of those supported for the
+	specified format or a Match error results.
+
+┌───
+    RRSetCrtcSpriteTransform
+	crtc: CRTC
+	position-transform: TRANSFORM
+	image-transform: TRANSFORM
+└───
+	Sets the sprite transforms for the specified crtc, any sprites
+	presented on this crtc will have their positions transformed
+	by the position-transform matrix. Sprite images displayed on the crtc
+	will be transformed by the image-transform matrix.
+
+┌───
+    RRGetCrtcSpriteTransform
+	crtc: CRTC
+      ▶
+	position-transform: TRANSFORM
+	image-transform: TRANSFORM
+└───
+	Gets the sprite transforms for the specified crtc.
+
+┌───
+    RRSetCrtcConfigs
+	drawable: DRAWABLE
+	set: SETofSCREENFLAG
+	screen-pixmap-width: CARD16
+	screen-pixmap-height: CARD16
+	screen-width: CARD16
+	screen-height: CARD16
+	width-in-millimeters: CARD32
+	height-in-millimeters: CARD32
+	configs: LISTofCRTCCONFIG
+      ▶
+	status: RRCONFIGSTATUS
+└───
+	Errors: Value, Match
+
+	This works much like RRSetScreenSize followed by a sequence of
+	RRSetCrtcConfig, except that the entire configuration can be set
+	in a single operation, either succeeding or failing without
+	any partial execution.
+
+	If 'set' includes 'SetScreenPixmapSize', then
+	'screen-pixmap-width' and 'screen-pixmap-height' specify the
+	new screen pixmap size.
+
+	If 'set' includes 'SetScreenSize', then 'screen-width' and
+	'screen-height' specify the new screen size.
+
+	If 'set' includes 'SetScreenSizeInMillimeters', then
+	'width-in-millimeters' and 'height-in-millimeters' specify
+	the new screen physical size.
+
+	If 'set' includes 'SetScreenCrtcs', then 'configs' includes
+	the list of new CRTC configurations.
+
+	In addition to the pre-1.4 semantics, this request adds the
+	ability to specific a scanout pixmap for each crtc, and
+	integrates the 1.4 sprite transform request as well.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+8. Extension Events
+
+Clients MAY select for ConfigureNotify on the root window to be
+informed of screen changes. This may be advantageous if all your
+client needs to know is the size of the root window, as it avoids
+round trips to set up the extension.
+
+RRScreenChangeNotify is sent if RRSelectInput has requested it
+whenever properties of the screen change, which may be due to external
+factors, such as re-cabling a monitor, etc.
+
+┌───
+    RRScreenChangeNotify
+
+	rotation: ROTATION;		new rotation
+	sequenceNumber: CARD16		low 16 bits of request seq. number
+	timestamp: TIMESTAMP		time screen was changed
+	configTimestamp: TIMESTAMP	time config data was changed
+	root: WINDOW			root window of screen
+	window: WINDOW			window requesting notification
+	size-id: SIZEID			index of new SCREENSIZE
+	subpixelOrder: SUBPIXELORDER	order of subpixels
+	widthInPixels: CARD16		width in pixels of the new SCREENSIZE
+	heightInPixels: CARD16		height in pixels of the new SCREENSIZE
+	widthInMillimeters: CARD16	width in mm of the new SCREENSIZE
+	heightInMillimeters: CARD16	height in mm of the new SCREENSIZE
+└───
+	This event is generated whenever the screen configuration is changed
+	and sent to requesting clients. 'timestamp' indicates when the
+	screen configuration was changed. 'configTimestamp' says when the
+	last time the configuration was changed. 'root' is the root of the
+	screen the change occurred on, 'window' is window selecting for this
+	event. 'size-id' contains the index of the current size.
+
+	This event is sent whenever the screen's configuration changes
+	or if a new screen configuration becomes available that was
+	not available in the past. In this case (config-timestamp in
+	the event not being equal to the config-timestamp returned in
+	the last call to RRGetScreenInfo), the client MUST call
+	RRGetScreenInfo to update its view of possible screen
+	configurations to have a correct view of possible screen
+	organizations.
+
+	Clients which select screen change notification events may be
+	sent an event immediately if the screen configuration was
+	changed between when they connected to the X server and
+	selected for notification. This is to prevent a common race
+	that might occur on log-in, where many applications start up
+	just at the time when a display manager or log in script might
+	be changing the screen size or configuration.
+
+	Note that the sizes in this event reflect the new SCREENSIZE and
+	thus will appear rotated by the 'rotation' parameter from the sizes
+	of the screen itself. In other words, when rotation is 90 or 270,
+	widthInPixels in this event will be the same as the height value
+	from a ConfigureNotify that reflects the same size change. This
+	will probably confuse developers.
+
+8.1 Events added in version 1.2 of the RandR extension
+
+┌───
+    RROutputChangeNotify:
+	timestamp: TIMESTAMP		time screen was reconfigured
+	config-timestamp: TIMESTAMP	time available config data was changed
+	window: WINDOW			window requesting notification
+	output: OUTPUT			output affected by change
+	crtc: CRTC			connected CRTC or None
+	mode: MODE			mode in use on CRTC or None
+	connection: CONNECTION		connection status
+└───
+
+	This event is generated whenever the available output configurations
+	have changed and is sent to requesting clients. 'timestamp'
+	indicates when the crtc configuration was changed by a client.
+	'config-timestamp' says when the last time the available
+	configurations changed. 'root' is the root of the screen the change
+	occurred on, 'window' is window selecting for this event. The
+	precise change can be detected by examining the new state of the
+	system.
+
+┌───
+    RROutputPropertyNotify:
+	window: WINDOW			window requesting notification
+	output: OUTPUT			output affected by change
+	atom: ATOM			affected property
+	time: TIMESTAMP			time property was changed
+	subpixel-order: SUBPIXELORDER	order of subpixels
+	state: { NewValue, Deleted }	new property state
+└───
+
+	This event is reported to clients selecting RROutputPropertyChange
+	on the window and is generated with state NewValue when a property
+	of the window is changed using RRChangeOutputProperty even when
+	adding zero-length data and when replacing all or part of a property
+	with identical data.  It is generated with state Deleted when a
+	property of the window is deleted using either
+	RRDeleteOutputProperty or RRGetOutputProperty.  The timestamp
+	indicates the server time when the property was changed.
+
+┌───
+    RRCrtcChangeNotify
+	timestamp: TIMESTAMP		time monitor was changed
+	window: WINDOW			window requesting notification
+	crtc: CRTC			CRTC which changed
+	mode: MODE			new mode
+	rotation: ROTATION;		new rotation
+	x: INT16			x position of CRTC within screen
+	y: INT16			y position of CRTC within screen
+	width: CARD16			width of new mode
+	height: CARD16			height of new mode
+└───
+	This event is generated whenever the CRTC configuration is changed
+	and sent to requesting clients. 'timestamp' indicates when the
+	CRTC configuration was changed. 'window' is window selecting for this
+	event. 'mode' is the new mode, or None if the crtc is disabled.
+	'x' and 'y' mark the location in the screen where this CRTC
+	is reading data. 'width' and 'height' indicate the size of the
+	mode. 'x', 'y, 'width' and 'height' are all zero when 'mode' is None.
+
+	This event is sent whenever the monitor's configuration changes
+	or if a new monitor configuration becomes available that was
+	not available in the past. In this case, the client MUST call
+	RRGetCrtcModes to update its view of possible monitor
+	configurations to have a correct view of possible monitor
+	organizations.
+
+	Clients which select monitor change notification events may be
+	sent an event immediately if the monitor configuration was
+	changed between when they connected to the X server and
+	selected for notification. This is to prevent a common race
+	that might occur on log-in, where many applications start up
+	just at the time when a display manager or log in script might
+	be changing the monitor size or configuration.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+9. Properties
+
+Properties are used for output specific parameters, and for announcing
+static or rarely changing data.  Announced data is typically
+immutable.  Properties are also used for evaluating new parameters
+before adding them to the RandR protocol.
+
+The following properties are hereby declared official, and drivers SHOULD
+prefix driver specific properties with '_', unless they are planned to be
+added to this specification.  List values, that are not declared by the table
+below, and will remain driver specific or are not planned to be added to this
+specification, SHOULD be prefixed with "_" as well in order to avoid name
+space or semantics clashes with future extensions of these values.
+
+Beginning with version 1.3 of the RandR extension, certain properties
+are mandatory and MUST be provided by implementations.  Earlier
+versions of the RandR extension MAY provide these properties as well,
+as long as the semantics are not altered.  Clients SHOULD fall back
+gracefully to lower version functionality, though, if the driver
+doesn't handle a mandatory property correctly.
+
+9.1 Known properties
+
+    "Backlight"			aka RR_PROPERTY_BACKLIGHT
+	Type:			int32
+	Flags:			-
+	Range/List:		0-x (driver specific)
+
+	This property controls the brightness on laptop panels and equivalent
+	displays with a backlight controller. The driver specific maximum
+	value MUST turn the backlight to full brightness, 1 SHOULD turn the
+	backlight to minimum brightness, 0 SHOULD turn the backlight off.
+
+    "CloneList"			aka RR_PROPERTY_CLONE_LIST
+	Type:			int32 [2*n] / Atom pairs
+	Flags:			Immutable
+	Range/List:		0-
+
+	Some combinations of outputs on some cards cannot be served
+	independently from each other, because they are wired up to the same
+	encoder outputs.
+	This property lists all output + signal format pairs that are
+	driven together with this output, and thus can only be programmed in
+	clone mode with the same CRTC.
+	This property MUST be symmetric, but may change with changing signal
+	format. I.e. if the property for DVI-1/VGA specifies VGA-1/VGA to be
+	cloned, VGA-1/VGA has to list DVI-1/VGA as well.
+	Outputs / format pairs listed in this property MUST be included in the
+	CompatibilityList.
+
+    "CompatibilityList"		aka RR_PROPERTY_COMPATIBILITY_LIST
+	Type:			int32 [2*n] / Atom pairs
+	Flags:			Immutable
+	Range/List:		0-
+
+	Some combinations of outputs on some cards cannot be served at all,
+	because the according encoder is only capable of driving one output at
+	a time.
+	This property lists all output + signal format pairs that can be
+	driven together with this output. NULL atoms specify any output / any
+	signal format, respectively.
+	This property MUST be symmetric, but may change with changing signal
+	format. I.e. if the property for DVI-1/TMDS specifies VGA-1/VGA to be
+	available, VGA-1/VGA has to list DVI-1/TMDS as well.
+
+    "ConnectorNumber"		aka RR_PROPERTY_CONNECTOR_NUMBER
+	Type:			int32
+	Flags:			Immutable, Static
+	Range/List:		0-
+
+	Outputs that route their signal to the same connector MUST
+	have the same connector number. Outputs with the same
+	connector number MUST route their signal to the same
+	connector, except if it is 0, which indicates unknown
+	connectivity. 1 is called the primary connector, 2 the
+	secondary. 3 is typically a TV connector, but that is completely
+	driver / hardware dependent.
+	Outputs with the same connector number SHOULD have the same
+	connector type. Meaning and client behavior for mismatching
+	connector types is undefined at the moment.
+
+    "ConnectorType"		aka RR_PROPERTY_CONNECTOR_TYPE
+	Type:			int32 / Atom
+	Flags:			Immutable, Static
+	Range/List:		unknown VGA DVI DVI‐I DVI‐A DVI‐D HDMI Panel
+				TV TV-Composite TV-SVideo TV-Component
+				TV-SCART TV-C4 DisplayPort
+
+	Connector type, as far as known to the driver.
+	Values with dashes (TV‐Composite) describe more specific versions of
+	the base values (TV). The former SHOULD be used if the connector is
+	not capable of producing other signal formats. The later SHOULD be
+	used if the exact connector is unknown, or the connector is a
+	multi‐format connector that is not described otherwise. DVI, for
+	instance, SHOULD be handled like a DVI‐I connector, unless additional
+	information is available to the user agent. PANEL describes
+	laptop‐internal (normally LVDS) displays. TV, TV‐SCART, TV‐Component,
+	and TV‐C4 with signal format VGA are valid combinations and describe
+	RGB TV signals.
+
+    "EDID"			aka RR_PROPERTY_RANDR_EDID
+	Type:			int8 [n]
+	Flags:			Immutable
+	Range/List:		-
+
+	Raw EDID data from the device attached to the according
+	output. Should include main EDID data and all extension
+	blocks. Previously known as EdidData.
+
+    "SignalFormat"		aka RR_PROPERTY_SIGNAL_FORMAT
+	Type:			int32 / Atom
+	Flags:			-
+	Range/List:		unknown VGA TMDS LVDS Composite Composite-PAL
+				Composite-NTSC Composite-SECAM SVideo
+				Component DisplayPort
+
+	Signal format / physical protocol format that is used for the
+	specified output. valid-values lists all possible formats on this
+	output, which SHOULD be a subset of the list above and MUST be static.
+	Values with dashes (Composite-PAL) describe more specific versions of
+	the base values (Composite) and SHOULD be used if known to the driver.
+	A driver MAY change this property of an output if the underlying
+	hardware indicates a protocol change (e.g. TV formats).  Clients are
+	allowed to change the signal format in order to select a different
+	signal format (e.g. Composite etc.) or physical protocol (e.g. VGA or
+	TMDS on DVI-I).
+	Laptop panels SHOULD not be detected with this property, but rather by
+	ConnectorType.
+
+    "SignalProperties"		aka RR_PROPERTY_SIGNAL_FORMAT
+	Type:			int32 [n] / Atom
+	Flags:			-
+	Range/List:		For Composite signals:
+				  NTSC NTSC-M NTSC-J NTSC-N NTSC-4.43 NTSC-film
+				  PAL PAL-B PAL-G PAL-H PAL-H PAL-I PAL-M PAL-D
+				  PAL-N PAL-Nc PAL-L PAL-60
+				  SECAM SECAM-L SECAM-B SECAM-G SECAM-D SECAM-K
+				  SECAM-H SECAM-K
+				For TMDS signals:
+				  SingleLink DualLink
+				For DisplayPort signals:
+				  Lane1 Lane2 Lane4 LowSpeed HiSpeed
+
+	Properties of the signal format that is currently used for the
+	specified output. valid-values lists all possible properties on this
+	output, which SHOULD be a subset of the list above. It will change if
+	SignalFormat changes.  Multiple properties are allowed.
+	Values with dashes (PAL-B) describe more specific versions of the base
+	values (PAL) and SHOULD be used if known to the driver.  A driver MAY
+	change this property of an output if the underlying hardware indicates
+	a signal change (e.g. TV formats).  Clients are allowed to change the
+	properties in order to select a different signal subformat.
+
+
+9.2 Properties introduced with version 1.2 of the RandR extension
+
+Property			Immutable	Mandatory since
+────────			─────────	───────────────
+EDID				yes		n/a
+
+EDID is provided by the RandR frontend, thus not driver specific.
+
+
+9.3 Properties introduced with version 1.3 of the RandR extension
+
+Property			Immutable	Mandatory since
+────────			─────────	───────────────
+CloneList			yes		not mandatory
+CompatibilityList		yes		not mandatory
+ConnectorNumber			yes: static	not mandatory
+ConnectorType			yes: static	RandR 1.3
+SignalFormat			no		RandR 1.3
+SignalProperties		no		not mandatory
+
+9.4 Properties introduced with version 1.3.1 of the RandR extension
+
+Property			Immutable	Mandatory since
+────────			─────────	───────────────
+Backlight			no		not mandatory
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+10. Extension Versioning
+
+The RandR extension was developed in parallel with the implementation
+to ensure the feasibility of various portions of the design. As
+portions of the extension are implemented, the version number of the
+extension has changed to reflect the portions of the standard provided.
+This document describes the version 1.2 of the specification, the
+partial implementations have version numbers less than that. Here's a
+list of what each version provided:
+
+	0.0: This prototype implemented resize and rotation in the
+	     TinyX server Used approximately the protocol described in
+	     the Usenix paper. Appeared in the TinyX server in
+	     XFree86 4.2, but not in the XFree86 main server.
+
+	0.1: Added subpixel order, added an event for subpixel order.
+	     This version was never checked in to XFree86 CVS.
+
+	1.0: Implements resize, rotation, and reflection. Implemented
+	     both in the XFree86 main server (size change only at this
+	     date), and fully (size change, rotation, and reflection)
+	     in XFree86's TinyX server.
+
+	1.1: Added refresh rates
+
+	1.2: Separate screens from CRTCs and outputs, switch to full VESA
+	     modes
+
+	1.3: Added cheap version of RRGetScreenResources.  Added CRTC
+	     transformations.  Added panning.  Added primary outputs.
+	     Added standard properties.
+
+Compatibility between 0.0 and 1.0 was *NOT* preserved, and 0.0 clients
+will fail against 1.0 servers. The wire encoding op-codes were
+changed for GetScreenInfo to ensure this failure in a relatively
+graceful way. Version 1.1 servers and clients are cross compatible with
+1.0. Version 1.1 is considered to be stable and we intend upward
+compatibility from this point. Version 1.2 offers an extended model of the
+system with multiple output support. Version 1.3 adds a cheap version of
+GetScreenResources to avoid expensive DDC operations, CRTC transformations,
+panning, and the primary output concept. 1.2 and 1.3 are backward-compatible
+with 1.1.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+11. Relationship with other extensions
+
+Two other extensions have a direct relationship with this extension. This
+section attempts to explain how these three are supposed to work together.
+
+11.1 XFree86-VidModeExtension
+
+XFree86-VidModeExtension changes the configuration of a single monitor
+attached to the screen without changing the configuration of the screen
+itself. It provides the ability to specify new mode lines for the server to
+use along with selecting among existing mode lines. As it uses screen
+numbers instead of window identifiers, it can be used to affect multiple
+monitors in a single-screen Xinerama configuration. However, the association
+between screen numbers and root windows in a multi-Screen environment is not
+defined by the extension. Version 2.0 of this extension added the ability to
+adjust the DAC values in a TrueColor server to modify the brightness curves
+of the display.
+
+All of the utility of this extension is subsumed by RandR version 1.2, RandR
+should be used in preference to XFree86-VidModeExtension where both are
+present.
+
+11.2 Xinerama
+
+Xinerama provides a mechanism for describing the relationship between the
+overall screen display and monitors placed within that area. As such, it
+provides the query functionality of RandR 1.2 without any of the
+configuration functionality. Applications using Xinerama to discover
+monitor geometry can continue to do so, with the caveat that they will not be
+informed of changes when they occur. However, Xinerama configuration data
+will be updated, so applications selecting for RandR notification and
+re-querying the configuration with the Xinerama extension will get updated
+information. It is probably better to view RandR as a superset of Xinerama
+at this point and use it in preference to Xinerama where both are present.
+
+			      ❧❧❧❧❧❧❧❧❧❧❧
+
+Appendix A. Protocol Encoding
+
+Syntactic Conventions
+
+This document uses the same syntactic conventions as the core X
+protocol encoding document.
+
+A.1 Common Types
+
+┌───
+    ROTATION
+	0x0001	Rotate_0
+	0x0002	Rotate_90
+	0x0004	Rotate_180
+	0x0008	Rotate_270
+	0x0010	Reflect_X
+	0x0020	Reflect_Y
+└───
+	Used to encode both sets of possible rotations and individual
+	selected rotations.
+
+┌───
+    RRSELECTMASK
+	0x0001	ScreenChangeNotifyMask
+	0x0002	CrtcChangeNotifyMask		Added in version 1.2
+	0x0004	OutputChangeNotifyMask		Added in version 1.2
+	0x0008	OutputPropertyNotifyMask	Added in version 1.2
+└───
+      Event select mask for RRSelectInput
+
+┌───
+    RRCONFIGSTATUS
+	0x0 Success
+	0x1 InvalidConfigTime
+	0x2 InvalidTime
+	0x3 Failed
+└───
+	Return status for requests which depend on time.
+
+┌───
+    MODEINFO (32)				Added in version 1.2
+	4	CARD32		id
+	2	CARD16		width in pixels
+	2	CARD16		height in pixels
+	4	CARD32		dot clock
+	2	CARD16		h sync start
+	2	CARD16		h sync end
+	2	CARD16		h total
+	2	CARD16		h skew
+	2	CARD16		v sync start
+	2	CARD16		v sync end
+	2	CARD16		v total
+	2	CARD16		name length
+	4	SETofMODEFLAG	mode flags
+└───
+
+	An output mode specifies the complete CRTC timings for
+	a specific mode. The vertical and horizontal synchronization rates
+	can be computed given the dot clock and the h total/v total
+	values. If the dot clock is zero, then all of the timing
+	parameters and flags are not used, and must be zero as this
+	indicates that the timings are unknown or otherwise unused.
+	The name itself will be encoded separately in each usage.
+
+┌───
+    MODEFLAG
+	0x00000001	HSyncPositive
+	0x00000002	HSyncNegative
+	0x00000004	VSyncPositive
+	0x00000008	VSyncNegative
+	0x00000010	Interlace
+	0x00000020	DoubleScan
+	0x00000040	CSync
+	0x00000080	CSyncPositive
+	0x00000100	CSyncNegative
+	0x00000200	HSkewPresent
+	0x00000400	BCast
+	0x00000800	PixelMultiplex
+	0x00001000	DoubleClock
+	0x00002000	ClockDivideBy2
+└───
+┌───
+    CONNECTION
+	0		Connected
+	1		Disconnected
+	2		UnknownConnection
+└───
+
+
+A.2 Protocol Requests
+
+Opcodes 1 and 3 were used in the 0.0 protocols, and will return
+errors if used in version 1.0.
+
+┌───
+    RRQueryVersion
+
+	1	CARD8			major opcode
+	1	0			RandR opcode
+	2	3			length
+	4	CARD32			major version
+	4	CARD32			minor version
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	0			reply length
+	1	CARD32			major version
+	1	CARD32			minor version
+└───
+┌───
+    RRSetScreenConfig
+
+	1	CARD8			major opcode
+	1	2			RandR opcode
+	2	6			length
+	4	WINDOW			window on screen to be configured
+	4	TIMESTAMP		timestamp
+	4	TIMESTAMP		config timestamp
+	2	SIZEID			size index
+	2	ROTATION		rotation/reflection
+	2	CARD16			refresh rate (1.1 only)
+	2	CARD16			pad
+      ▶
+	1	1			Reply
+	1	RRCONFIGSTATUS		status
+	2	CARD16			sequence number
+	4	0			reply length
+	4	TIMESTAMP		new timestamp
+	4	TIMESTAMP		new configuration timestamp
+	4	WINDOW			root
+	2	SUBPIXELORDER		subpixel order defined in Render
+	2	CARD16			pad4
+	4	CARD32			pad5
+	4	CARD32			pad6
+└───
+┌───
+    RRSelectInput
+
+	1	CARD8			major opcode
+	1	4			RandR opcode
+	2	3			length
+	4	WINDOW			window
+	2	SETofRRSELECTMASK	enable
+	2	CARD16			pad
+└───
+┌───
+    RRGetScreenInfo
+
+	1	CARD8			major opcode
+	1	5			RandR opcode
+	2	2			length
+	4	WINDOW			window
+      ▶
+	1	1			Reply
+	1	CARD8			set of Rotations
+	2	CARD16			sequence number
+	4	0			reply length
+	4	WINDOW			root window
+	4	TIMESTAMP		timestamp
+	4	TIMESTAMP		config timestamp
+	2	CARD16			number of SCREENSIZE following
+	2	SIZEID			current size index
+	2	ROTATION		current rotation and reflection
+	2	CARD16			current rate (added in version 1.1)
+	2	CARD16			length of rate info (number of CARD16s)
+	2	CARD16			pad
+
+	SCREENSIZE
+	2	CARD16			width in pixels
+	2	CARD16			height in pixels
+	2	CARD16			width in millimeters
+	2	CARD16			height in millimeters
+
+	REFRESH
+	2	CARD16			number of rates (n)
+	2n	CARD16			rates
+└───
+
+A.2.1 Protocol Requests added with version 1.2
+
+┌───
+    RRGetScreenSizeRange
+	1	CARD8			major opcode
+	1	6			RandR opcode
+	2	2			length
+	4	WINDOW			window
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	0			reply length
+	2	CARD16			minWidth
+	2	CARD16			minHeight
+	2	CARD16			maxWidth
+	2	CARD16			maxHeight
+	16				unused
+└───
+┌───
+    RRSetScreenSize
+	1	CARD8			major opcode
+	1	7			RandR opcode
+	2	5			length
+	4	WINDOW			window
+	2	CARD16			width
+	2	CARD16			height
+	4	CARD32			width in millimeters
+	4	CARD32			height in millimeters
+└───
+┌───
+    RRGetScreenResources
+	1	CARD8			major opcode
+	1	8			RandR opcode
+	2	2			length
+	4	WINDOW			window
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	c+o+8m+(b+p)/4		reply length
+	4	TIMESTAMP		timestamp
+	4	TIMESTAMP		config-timestamp
+	2	c			number of CRTCs
+	2	o			number of outputs
+	2	m			number of modeinfos
+	2	b			total bytes in mode names
+	8				unused
+	4c	LISTofCRTC		crtcs
+	4o	LISTofOUTPUT		outputs
+	32m	LISTofMODEINFO		modeinfos
+	b	STRING8			mode names
+	p				unused, p=pad(b)
+└───
+┌───
+    RRGetOutputInfo
+	1	CARD8			major opcode
+	1	9			RandR opcode
+	2	3			length
+	4	OUTPUT			output
+	4	TIMESTAMP		config-timestamp
+      ▶
+	1	1			Reply
+	1	RRCONFIGSTATUS		status
+	2	CARD16			sequence number
+	4	1+c+m+(n+p)/4		reply length
+	4	TIMESTAMP		timestamp
+	4	CRTC			current connected crtc
+	4	CARD32			width in millimeters
+	4	CARD32			height in millimeters
+	1	CONNECTION		connection
+	1	SUBPIXELORDER		subpixel-order
+	2	c			number of CRTCs
+	2	m			number of modes
+	2	p			number of preferred modes
+	2	o			number of clones
+	2	n			length of name
+	4c	LISTofCRTC		crtcs
+	4m	LISTofMODE		modes
+	4o	LISTofOUTPUT		clones
+	n	STRING8			name
+	p				unused, p=pad(n)
+└───
+┌───
+    RRListOutputProperties
+	1	CARD8			major opcode
+	1	10			RandR opcode
+	2	2			length
+	4	OUTPUT			output
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	n			reply length
+	2	n			number of ATOMs in atoms
+	22				unused
+	4n	LISTofATOM		atoms
+└───
+┌───
+    RRQueryOutputProperty
+	1	CARD8			major opcode
+	1	11			RandR opcode
+	2	3			request length
+	4	OUTPUT			output
+	4	ATOM			property
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	n			reply length
+	1	BOOL			pending
+	1	BOOL			range
+	1	BOOL			immutable
+	21				unused
+	4n	LISTofINT32		valid values
+└───
+┌───
+    RRConfigureOutputProperty
+	1	CARD8			major opcode
+	1	12			RandR opcode
+	2	4+n			request length
+	4	OUTPUT			output
+	4	ATOM			property
+	1	BOOL			pending
+	1	BOOL			range
+	2				unused
+	4n	LISTofINT32		valid values
+└───
+┌───
+    RRChangeOutputProperty
+	1	CARD8			major opcode
+	1	13			RandR opcode
+	2	6+(n+p)/4		request length
+	4	OUTPUT			output
+	4	ATOM			property
+	4	ATOM			type
+	1	CARD8			format
+	1				mode
+		0	Replace
+		1	Prepend
+		2	Append
+	2				unused
+	4	CARD32			length of data in format units
+					(= n for format = 8)
+					(= n/2 for format = 16)
+					(= n/4 for format = 32)
+	n	LISTofBYTE		data
+					(n is a multiple of 2 for format = 16)
+					(n is a multiple of 4 for format = 32)
+	p				unused, p=pad(n)
+└───
+┌───
+    RRDeleteOutputProperty
+	1	CARD8			major opcode
+	1	14			RandR opcode
+	2	3			request length
+	4	OUTPUT			output
+	4	ATOM			property
+└───
+┌───
+    RRGetOutputProperty
+	1	CARD8			major opcode
+	1	15			RandR opcode
+	2	7			request length
+	4	OUTPUT			output
+	4	ATOM			property
+	4	ATOM			type
+		0	AnyPropertyType
+	4	CARD32			long-offset
+	4	CARD32			long-length
+	1	BOOL			delete
+	1	BOOL			pending
+	2				unused
+      ▶
+	1	1			Reply
+	1	CARD8			format
+	2	CARD16			sequence number
+	4	(n+p)/4			reply length
+	4	ATOM			type
+		0	None
+	4	CARD32			bytes-after
+	4	CARD32			length of value in format units
+					(= 0 for format = 0)
+					(= n for format = 8)
+					(= n/2 for format = 16)
+					(= n/4 for format = 32)
+	12				unused
+	n	LISTofBYTE		value
+					(n is zero for format = 0)
+					(n is a multiple of 2 for format = 16)
+					(n is a multiple of 4 for format = 32)
+	p				unused, p=pad(n)
+└───
+┌───
+    RRCreateMode
+	1	CARD8			major opcode
+	1	16			RandR opcode
+	2	12+(n+p)/4		length
+	4	WINDOW			window
+	32	MODEINFO		mode
+	n	STRING8			mode name
+	p				unused, p=pad(n)
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	0			reply length
+	4	MODE			mode
+	20				unused
+└───
+┌───
+    RRDestroyMode
+	1	CARD8			major opcode
+	1	17			RandR opcode
+	2	2			length
+	4	MODE			mode
+└───
+┌───
+    RRAddOutputMode
+	1	CARD8			major opcode
+	1	18			RandR opcode
+	2	3			length
+	4	OUTPUT			output
+	4	MODE			mode
+└───
+┌───
+    RRDeleteOutputMode
+	1	CARD8			major opcode
+	1	19			RandR opcode
+	2	3			length
+	4	OUTPUT			output
+	4	MODE			mode
+└───
+┌───
+    RRGetCrtcInfo
+	1	CARD8			major opcode
+	1	20			RandR opcode
+	2	3			length
+	4	CRTC			crtc
+	4	TIMESTAMP		config-timestamp
+      ▶
+	1	1			Reply
+	1	RRCONFIGSTATUS		status
+	2	CARD16			sequence number
+	4	o+p			reply length
+	4	TIMESTATMP		timestamp
+	2	INT16			x
+	2	INT16			y
+	2	CARD16			width
+	2	CARD16			height
+	4	MODE			mode
+	2	ROTATION		current rotation and reflection
+	2	ROTATION		set of possible rotations
+	2	o			number of outputs
+	2	p			number of possible outputs
+	4o	LISTofOUTPUT		outputs
+	4p	LISTofOUTPUT		possible outputs
+└───
+┌───
+    RRSetCrtcConfig
+	1	CARD8			major opcode
+	1	21			RandR opcode
+	2	7+2n			length
+	4	CRTC			crtc
+	4	TIMESTAMP		timestamp
+	4	TIMESTAMP		config timestamp
+	2	INT16			x
+	2	INT16			y
+	4	MODE			mode
+	2	ROTATION		rotation/reflection
+	2				unused
+	8n	LISTofOUTPUT		outputs
+      ▶
+	1	1			Reply
+	1	RRCONFIGSTATUS		status
+	2	CARD16			sequence number
+	4	0			reply length
+	4	TIMESTAMP		new timestamp
+	20				unused
+└───
+┌───
+    RRGetCrtcGammaSize
+	1	CARD8			major opcode
+	1	22			RandR opcode
+	2	2			length
+	4	CRTC			crtc
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	0			reply length
+	2	CARD16			size
+	22				unused
+└───
+┌───
+    RRGetCrtcGamma
+	1	CARD8			major opcode
+	1	23			RandR opcode
+	2	2			length
+	4	CRTC			crtc
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	(6n+2)/4		reply length
+	2	n			size
+	20				unused
+	2n	LISTofCARD16		red
+	2n	LISTofCARD16		green
+	2n	LISTofCARD16		blue
+	p				unused, p=pad(6n)
+└───
+┌───
+    RRSetCrtcGamma
+	1	CARD8			major opcode
+	1	24			RandR opcode
+	2	3+(6n+2)/4		length
+	4	CRTC			crtc
+	2	n			size
+	2				unused
+	2n	LISTofCARD16		red
+	2n	LISTofCARD16		green
+	2n	LISTofCARD16		blue
+	p				unused, p=pad(6n)
+└───
+
+A.2.2 Protocol Requests added with version 1.3
+
+┌───
+    RRGetScreenResourcesCurrent
+	1	CARD8			major opcode
+	1	25			RandR opcode
+	2	2			length
+	4	WINDOW			window
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	c+o+8m+(b+p)/4		reply length
+	4	TIMESTAMP		timestamp
+	4	TIMESTAMP		config-timestamp
+	2	c			number of CRTCs
+	2	o			number of outputs
+	2	m			number of modeinfos
+	2	b			total bytes in mode names
+	8				unused
+	4c	LISTofCRTC		crtcs
+	4o	LISTofOUTPUT		outputs
+	32m	LISTofMODEINFO		modeinfos
+	b	STRING8			mode names
+	p				unused, p=pad(b)
+└───
+
+┌───
+    RRSetCrtcTransform
+	1	CARD8			major opcode
+	1	26			RandR opcode
+	2	12+(n+p)/4+v		length
+	4	CRTC			crtc
+	36	TRANSFORM		transform
+	2	CARD16			filter length
+	2				unused
+	n	STRING8			filter name
+	p				unused, p=pad(n)
+	4v	FIXED			filter params
+└───
+
+┌───
+    RRGetCrtcTransform
+	1	CARD8			major opcode
+	1	27			RandR opcode
+	2	2			length
+	4	CRTC			crtc
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	16+(pn+pnp)/4+(cn+cnp)/4+pf+cf	reply length
+	36	TRANSFORM		pending transform
+	1	BOOL			has transforms
+	3				unused
+	36	TRANSFORM		current transform
+	4				unused
+	2	pn			pending filter name length
+	2	pf			pending filter num params
+	2	cn			current filter name length
+	2	cf			current filter num params
+	pn	STRING8			pending filter name
+	pnp				unused, pnp=pad(pn)
+	4*pf	FIXED			pending filter params
+	cn	STRING8			current filter name
+	cnp				unused, cnp=pad(cn)
+	4*cf	FIXED			current filter params
+└───
+
+┌───
+    RRGetPanning
+	1	CARD8			major opcode
+	1	28			RandR opcode
+	2	2			length
+	4	CRTC			crtc
+      ▶
+	1	1			Reply
+	1	RRCONFIGSTATUS		status
+	2	CARD16			sequence number
+	4	1			reply length
+	4	TIMESTAMP		timestamp
+	2	CARD16			left
+	2	CARD16			top
+	2	CARD16			width
+	2	CARD16			height
+	2	CARD16			track_left
+	2	CARD16			track_top
+	2	CARD16			track_width
+	2	CARD16			track_height
+	2	INT16			border_left
+	2	INT16			border_top
+	2	INT16			border_right
+	2	INT16			border_bottom
+└───
+┌───
+    RRSetPanning
+	1	CARD8			major opcode
+	1	29			RandR opcode
+	2	9			length
+	4	CRTC			crtc
+	4	TIMESTAMP		timestamp
+	2	CARD16			left
+	2	CARD16			top
+	2	CARD16			width
+	2	CARD16			height
+	2	CARD16			track_left
+	2	CARD16			track_top
+	2	CARD16			track_width
+	2	CARD16			track_height
+	2	INT16			border_left
+	2	INT16			border_top
+	2	INT16			border_right
+	2	INT16			border_bottom
+      ▶
+	1	1			Reply
+	1	RRCONFIGSTATUS		status
+	2	CARD16			sequence number
+	4	0			reply length
+	4	TIMESTAMP		new timestamp
+	20				unused
+└───
+
+┌───
+    RRSetOutputPrimary
+	1	CARD8			major opcode
+	1	30			RandR opcode
+	2	3			length
+	4	WINDOW			window
+	4	OUTPUT			output
+└───
+
+┌───
+    RRGetOutputPrimary
+	1	CARD8			major opcode
+	1	31			RandR opcode
+	2	2			length
+	4	WINDOW			window
+      ▶
+	1	1			Reply
+	1				unused
+	2	CARD16			sequence number
+	4	CARD32			length
+	4	OUTPUT			output
+	4	CARD32			pad1
+	4	CARD32			pad2
+	4	CARD32			pad3
+	4	CARD32			pad4
+└───
+
+A.3 Protocol Events
+
+┌───
+    RRScreenChangeNotify
+	1	Base + 0		code
+	1	ROTATION		new rotation and reflection
+	2	CARD16			sequence number
+	4	TIMESTAMP		timestamp
+	4	TIMESTAMP		configuration timestamp
+	4	WINDOW			root window
+	4	WINDOW			request window
+	2	SIZEID			size ID
+	2	SUBPIXELORDER		subpixel order defined in Render
+	2	CARD16			width in pixels
+	2	CARD16			height in pixels
+	2	CARD16			width in millimeters
+	2	CARD16			height in millimeters
+└───
+
+A.3.1 Protocol Events added with version 1.2
+
+┌───
+    RRCrtcChangeNotify
+	1	Base + 1		code
+	1	0			sub-code
+	2	CARD16			sequence number
+	4	TIMESTAMP		timestamp
+	4	WINDOW			request window
+	4	CRTC			crtc affected
+	4	MODE			mode in use
+	2	ROTATION		new rotation and reflection
+	2				unused
+	2	INT16			x
+	2	INT16			y
+	2	CARD16			width
+	2	CARD16			height
+└───
+┌───
+    RROutputChangeNotify
+	1	Base + 1		code
+	1	1			sub-code
+	2	CARD16			sequence number
+	4	TIMESTAMP		timestamp
+	4	TIMESTAMP		configuration timestamp
+	4	WINDOW			request window
+	4	OUTPUT			output affected
+	4	CRTC			crtc in use
+	4	MODE			mode in use
+	2	ROTATION		rotation in use
+	1	CONNECTION		connection status
+	1	SUBPIXELORDER		subpixel order
+└───
+┌───
+    RROutputPropertyNotify
+	1	Base + 1		code
+	1	2			sub-code
+	2	CARD16			sequence number
+	4	WINDOW			window
+	4	OUTPUT			output
+	4	ATOM			atom
+	4	TIMESTAMP		time
+	1				state
+		0	NewValue
+		1	Deleted
+	11				unused
+└───
+
+A.4 Protocol Errors
+
+┌───
+    ERRORS
+	Base + 0		Output
+	Base + 1		Crtc
+	Base + 2		Mode
+└───
+
+Bibliography
+
+[RANDR] Gettys, Jim and Keith Packard, "The X Resize and Rotate
+	Extension - RandR", Proceedings of the 2001 USENIX Annual
+	Technical Conference, Boston, MA
+
+[RENDER]
+	Packard, Keith, "The X Rendering Extension", work in progress,
+	http://cgit.freedesktop.org/xorg/proto/renderproto/tree/renderproto.txt
-- 
cgit v1.2.3