summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--randr/rrcrtc.c12
-rw-r--r--randr/rrscreen.c25
2 files changed, 29 insertions, 8 deletions
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index e8a7b79e1..7409e96c5 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -698,7 +698,15 @@ ProcRRSetCrtcConfig (ClientPtr client)
*/
if (pScrPriv->rrScreenSetSize)
{
- if (stuff->x + mode->mode.width > pScreen->width)
+ int source_width = mode->mode.width;
+ int source_height = mode->mode.height;
+
+ if (rotation == RR_Rotate_90 || rotation == RR_Rotate_270)
+ {
+ source_width = mode->mode.height;
+ source_height = mode->mode.width;
+ }
+ if (stuff->x + source_width > pScreen->width)
{
client->errorValue = stuff->x;
if (outputs)
@@ -706,7 +714,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
return BadValue;
}
- if (stuff->y + mode->mode.height > pScreen->height)
+ if (stuff->y + source_height > pScreen->height)
{
client->errorValue = stuff->y;
if (outputs)
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 76c16b010..38dbaed97 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -268,7 +268,6 @@ ProcRRSetScreenSize (ClientPtr client)
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
- RRCrtcPtr crtc;
int i;
REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
@@ -291,12 +290,26 @@ ProcRRSetScreenSize (ClientPtr client)
client->errorValue = stuff->height;
return BadValue;
}
- for (i = 0; i < pScrPriv->numCrtcs; i++) {
- crtc = pScrPriv->crtcs[i];
- if (crtc->mode &&
- (crtc->x + crtc->mode->mode.width > stuff->width ||
- crtc->y + crtc->mode->mode.height > stuff->height))
+ for (i = 0; i < pScrPriv->numCrtcs; i++)
+ {
+ RRCrtcPtr crtc = pScrPriv->crtcs[i];
+ RRModePtr mode = crtc->mode;
+ if (mode)
+ {
+ int source_width = mode->mode.width;
+ int source_height = mode->mode.height;
+ Rotation rotation = crtc->rotation;
+
+ if (rotation == RR_Rotate_90 || rotation == RR_Rotate_270)
+ {
+ source_width = mode->mode.height;
+ source_height = mode->mode.width;
+ }
+
+ if (crtc->x + source_width > stuff->width ||
+ crtc->y + source_height > stuff->height)
return BadMatch;
+ }
}
if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
{