From 423702593627c4a5eb59f11fbb7b02732c82b371 Mon Sep 17 00:00:00 2001 From: "Peter Åstrand (astrand)" Date: Tue, 27 Mar 2018 09:25:02 +0200 Subject: vncRandRDisableOutput: Disable only the requested output This only matters when using clones, which we do not accept yet. This patch is for completeness and to avoid future surprises. --- unix/xserver/hw/vnc/RandrGlue.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'unix/xserver') diff --git a/unix/xserver/hw/vnc/RandrGlue.c b/unix/xserver/hw/vnc/RandrGlue.c index ddf671e0..214b1d0d 100644 --- a/unix/xserver/hw/vnc/RandrGlue.c +++ b/unix/xserver/hw/vnc/RandrGlue.c @@ -177,12 +177,37 @@ int vncRandRDisableOutput(int outputIdx) { rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]); RRCrtcPtr crtc; + int i; + RROutputPtr *outputs; + int numOutputs = 0; + RRModePtr mode; + int ret; crtc = rp->outputs[outputIdx]->crtc; if (crtc == NULL) return 1; - return RRCrtcSet(crtc, NULL, crtc->x, crtc->y, crtc->rotation, 0, NULL); + /* Remove this output from the CRTC configuration */ + outputs = malloc(crtc->numOutputs * sizeof(RROutputPtr)); + if (!outputs) { + return 0; + } + + for (i = 0; i < crtc->numOutputs; i++) { + if (rp->outputs[outputIdx] != crtc->outputs[i]) { + outputs[numOutputs++] = crtc->outputs[i]; + } + } + + if (numOutputs == 0) { + mode = NULL; + } else { + mode = crtc->mode; + } + + ret = RRCrtcSet(crtc, mode, crtc->x, crtc->y, crtc->rotation, numOutputs, outputs); + free(outputs); + return ret; } unsigned int vncRandRGetOutputId(int outputIdx) -- cgit v1.2.3