[PATCH 6/6] randr: Hook up the new RandR 1.4 functionality

Keith Packard keithp at keithp.com
Sun Dec 5 14:22:52 PST 2010


This bumps the supported RandR protocol version and adds the dispatch
hooks needed to call the new functions

Signed-off-by: Keith Packard <keithp at keithp.com>
---
 include/protocol-versions.h |    2 +-
 randr/rrdispatch.c          |    6 ++
 randr/rrsdispatch.c         |  132 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 139 insertions(+), 1 deletions(-)

diff --git a/include/protocol-versions.h b/include/protocol-versions.h
index c674465..50cbf43 100644
--- a/include/protocol-versions.h
+++ b/include/protocol-versions.h
@@ -65,7 +65,7 @@
 
 /* RandR */
 #define SERVER_RANDR_MAJOR_VERSION		1
-#define SERVER_RANDR_MINOR_VERSION		3
+#define SERVER_RANDR_MINOR_VERSION		4
 
 /* Record */
 #define SERVER_RECORD_MAJOR_VERSION		1
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index ebfda57..aed746b 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -224,5 +224,11 @@ int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
     ProcRRSetPanning,		/* 29 */
     ProcRRSetOutputPrimary,	/* 30 */
     ProcRRGetOutputPrimary,	/* 31 */
+/* V1.4 additions */
+    ProcRRQueryScanoutPixmaps,	/* 32 */
+    ProcRRCreateScanoutPixmap,	/* 33 */
+    ProcRRSetCrtcSpriteTransform,/* 34 */
+    ProcRRGetCrtcSpriteTransform,/* 35 */
+    ProcRRSetCrtcConfigs,	 /* 36 */
 };
 
diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index e16090a..c848f91 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -461,6 +461,132 @@ SProcRRGetOutputPrimary (ClientPtr client)
     return ProcRandrVector[stuff->randrReqType](client);
 }
 
+static int
+SProcRRQueryScanoutPixmaps (ClientPtr client)
+{
+    int n;
+    REQUEST(xRRQueryScanoutPixmapsReq);
+
+    REQUEST_SIZE_MATCH(xRRQueryScanoutPixmapsReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->drawable, n);
+    return ProcRandrVector[stuff->randrReqType](client);
+}
+
+static int
+SProcRRCreateScanoutPixmap (ClientPtr client)
+{
+    int n;
+    REQUEST(xRRCreateScanoutPixmapReq);
+
+    REQUEST_SIZE_MATCH(xRRCreateScanoutPixmapReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->pid, n);
+    swapl(&stuff->drawable, n);
+    swaps(&stuff->width, n);
+    swaps(&stuff->height, n);
+    swapl(&stuff->format, n);
+    swaps(&stuff->rotations, n);
+    return ProcRandrVector[stuff->randrReqType](client);
+}
+
+static void
+swap_transform(xRenderTransform *t)
+{
+    int n;
+    swapl(&t->matrix11, n);
+    swapl(&t->matrix12, n);
+    swapl(&t->matrix13, n);
+    swapl(&t->matrix21, n);
+    swapl(&t->matrix22, n);
+    swapl(&t->matrix23, n);
+    swapl(&t->matrix31, n);
+    swapl(&t->matrix32, n);
+    swapl(&t->matrix33, n);
+}
+
+static int
+SProcRRSetCrtcSpriteTransform (ClientPtr client)
+{
+    int n;
+    REQUEST(xRRSetCrtcSpriteTransformReq);
+
+    REQUEST_SIZE_MATCH(xRRSetCrtcSpriteTransformReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->crtc, n);
+    swap_transform(&stuff->positionTransform);
+    swap_transform(&stuff->imageTransform);
+    return ProcRandrVector[stuff->randrReqType](client);
+}
+
+static int
+SProcRRGetCrtcSpriteTransform (ClientPtr client)
+{
+    int n;
+    REQUEST(xRRGetCrtcSpriteTransformReq);
+
+    REQUEST_SIZE_MATCH(xRRGetCrtcSpriteTransformReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->crtc, n);
+    return ProcRandrVector[stuff->randrReqType](client);
+}
+
+static int
+SProcRRSetCrtcConfigs (ClientPtr client)
+{
+    int n;
+    REQUEST(xRRSetCrtcConfigsReq);
+    int c;
+    int extra_len;
+    int num_configs;
+    int num_output_ids;
+    xRRCrtcConfig *x_configs;
+
+    REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigsReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->drawable, n);
+    swaps(&stuff->screenPixmapWidth, n);
+    swaps(&stuff->screenPixmapHeight, n);
+    swaps(&stuff->screenWidth, n);
+    swaps(&stuff->screenHeight, n);
+    swapl(&stuff->widthInMillimeters, n);
+    swapl(&stuff->heightInMillimeters, n);
+    swaps(&stuff->nConfigs, n);
+
+    extra_len = client->req_len - bytes_to_int32(sizeof(xRRSetCrtcConfigsReq));
+
+    num_configs = stuff->nConfigs;
+
+    /* Check request length against number of configs specified */
+    if (num_configs * (sizeof (xRRCrtcConfig) >> 2) > extra_len)
+	return BadLength;
+
+    x_configs = (xRRCrtcConfig *) (stuff + 1);
+    for (c = 0; c < num_configs; c++) {
+	swapl(&x_configs->crtc, n);
+	swaps(&x_configs->x, n);
+	swaps(&x_configs->y, n);
+	swapl(&x_configs->mode, n);
+	swaps(&x_configs->rotation, n);
+	swaps(&x_configs->nOutput, n);
+	swap_transform(&x_configs->spritePositionTransform);
+	swap_transform(&x_configs->spriteImageTransform);
+	swapl(&x_configs->pixmap, n);
+	swaps(&x_configs->xPixmap, n);
+	swaps(&x_configs->yPixmap, n);
+	x_configs++;
+    }
+
+    /* Let the other dispatch function deal with verifying that
+     * the right number of output ids are present, just
+     * swap whatever is here
+     */
+    num_output_ids = extra_len - (num_configs * (sizeof (xRRCrtcConfig)) >> 2);
+    SwapLongs((CARD32 *) x_configs, num_output_ids);
+
+    return ProcRandrVector[stuff->randrReqType](client);
+}
+
 int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
     SProcRRQueryVersion,	/* 0 */
 /* we skip 1 to make old clients fail pretty immediately */
@@ -499,5 +625,11 @@ int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
     SProcRRSetPanning,		/* 29 */
     SProcRRSetOutputPrimary,	/* 30 */
     SProcRRGetOutputPrimary,	/* 31 */
+/* V1.4 additions */
+    SProcRRQueryScanoutPixmaps,	/* 32 */
+    SProcRRCreateScanoutPixmap,	/* 33 */
+    SProcRRSetCrtcSpriteTransform,/* 34 */
+    SProcRRGetCrtcSpriteTransform,/* 35 */
+    SProcRRSetCrtcConfigs,	/* 36 */
 };
 
-- 
1.7.2.3



More information about the xorg-devel mailing list