diff options
-rw-r--r-- | randr/rrxinerama.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/randr/rrxinerama.c b/randr/rrxinerama.c index ad40a1e36..5af6fb03b 100644 --- a/randr/rrxinerama.c +++ b/randr/rrxinerama.c @@ -267,12 +267,26 @@ RRXineramaWriteCrtc(ClientPtr client, RRCrtcPtr crtc) if (RRXineramaCrtcActive (crtc)) { - int width, height; - RRCrtcGetScanoutSize (crtc, &width, &height); - scratch.x_org = crtc->x; - scratch.y_org = crtc->y; - scratch.width = width; - scratch.height = height; + ScreenPtr pScreen = crtc->pScreen; + rrScrPrivPtr pScrPriv = rrGetScrPriv(pScreen); + BoxRec panned_area; + + /* Check to see if crtc is panned and return the full area when applicable. */ + if (pScrPriv && pScrPriv->rrGetPanning && + pScrPriv->rrGetPanning (pScreen, crtc, &panned_area, NULL, NULL) && + (panned_area.x2 > panned_area.x1) && (panned_area.y2 > panned_area.y1)) { + scratch.x_org = panned_area.x1; + scratch.y_org = panned_area.y1; + scratch.width = panned_area.x2 - panned_area.x1; + scratch.height = panned_area.y2 - panned_area.y1; + } else { + int width, height; + RRCrtcGetScanoutSize (crtc, &width, &height); + scratch.x_org = crtc->x; + scratch.y_org = crtc->y; + scratch.width = width; + scratch.height = height; + } if(client->swapped) { register int n; swaps(&scratch.x_org, n); @@ -313,7 +327,6 @@ ProcRRXineramaQueryScreens(ClientPtr client) if(rep.number) { rrScrPriv(pScreen); - xXineramaScreenInfo scratch; int i; int has_primary = (pScrPriv->primaryOutput != NULL); |