From 7bb64d8c1de9659f11da7917772919b071e9db82 Mon Sep 17 00:00:00 2001 From: Jan Burgmeier Date: Thu, 4 Feb 2016 14:06:43 +0100 Subject: [PATCH] Fix XineramaQueryScreens for reverse prime Make sure we account for slave CRTCs when building the monitor list, since that's what rrxinerama uses to fake Xinerama geometry. [ajax: Slightly more informative commit message.] Bugzilla: https://bugs.freedesktop.org/92313 Reviewed-by: Dave Airlie --- randr/rrmonitor.c | 6 +++--- randr/rroutput.c | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/randr/rrmonitor.c b/randr/rrmonitor.c index c37dcf8ab..58041bb61 100644 --- a/randr/rrmonitor.c +++ b/randr/rrmonitor.c @@ -326,7 +326,7 @@ RRMonitorMakeList(ScreenPtr screen, Bool get_active, RRMonitorPtr *monitors_ret, RRMonitorSetFromClient(pScrPriv->monitors[list.client_primary], mon); mon++; } else if (list.server_primary >= 0) { - RRMonitorSetFromServer(pScrPriv->crtcs[list.server_primary], mon); + RRMonitorSetFromServer(list.server_crtc[list.server_primary], mon); mon++; } @@ -354,8 +354,8 @@ RRMonitorMakeList(ScreenPtr screen, Bool get_active, RRMonitorPtr *monitors_ret, /* And finish with the list of crtc-inspired monitors */ - for (c = 0; c < pScrPriv->numCrtcs; c++) { - RRCrtcPtr crtc = pScrPriv->crtcs[c]; + for (c = 0; c < list.num_crtcs; c++) { + RRCrtcPtr crtc = list.server_crtc[c]; if (c == list.server_primary && list.client_primary < 0) continue; diff --git a/randr/rroutput.c b/randr/rroutput.c index d12b9ba12..686ae49a6 100644 --- a/randr/rroutput.c +++ b/randr/rroutput.c @@ -543,6 +543,7 @@ ProcRRSetOutputPrimary(ClientPtr client) WindowPtr pWin; rrScrPrivPtr pScrPriv; int ret; + ScreenPtr slave; REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq); @@ -565,8 +566,19 @@ ProcRRSetOutputPrimary(ClientPtr client) pScrPriv = rrGetScrPriv(pWin->drawable.pScreen); if (pScrPriv) + { RRSetPrimaryOutput(pWin->drawable.pScreen, pScrPriv, output); + xorg_list_for_each_entry(slave, + &pWin->drawable.pScreen->output_slave_list, + output_head) { + rrScrPrivPtr pSlavePriv; + pSlavePriv = rrGetScrPriv(slave); + + RRSetPrimaryOutput(slave, pSlavePriv, output); + } + } + return Success; }