Commit 184c07e2 authored by Ulrich Sibiller's avatar Ulrich Sibiller

Screen.c: Ensure that an output is unused before destroying it

Fixes ArcticaProject/nx-libs#293
parent 083051f6
...@@ -3741,6 +3741,27 @@ int nxagentChangeScreenConfig(int screen, int width, int height, int mmWidth, in ...@@ -3741,6 +3741,27 @@ int nxagentChangeScreenConfig(int screen, int width, int height, int mmWidth, in
return r; return r;
} }
/*
Destroy an output after removing it from any crtc that might reference it
*/
void nxagentDropOutput(RROutputPtr o) {
RRCrtcPtr c = o->crtc;
if (c) {
for (int i = 0; i < c->numOutputs; i++) {
if (c->outputs[i] == o) {
#ifdef DEBUG
fprintf(stderr, "nxagentDropOutput: output [%s] is in use by crtc [%p], removing it from there\n", o->name, c);
#endif
RRCrtcSet(c, NULL, 0, 0, RR_Rotate_0, 0, NULL);
}
}
}
#ifdef DEBUG
fprintf(stderr, "nxagentDropOutput: destroying output [%s]\n", o->name);
#endif
RROutputDestroy(o);
}
int nxagentAdjustRandRXinerama(ScreenPtr pScreen) int nxagentAdjustRandRXinerama(ScreenPtr pScreen)
{ {
rrScrPrivPtr pScrPriv; rrScrPrivPtr pScrPriv;
...@@ -3858,6 +3879,8 @@ int nxagentAdjustRandRXinerama(ScreenPtr pScreen) ...@@ -3858,6 +3879,8 @@ int nxagentAdjustRandRXinerama(ScreenPtr pScreen)
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "nxagentAdjustRandRXinerama: destroying crtc\n"); fprintf(stderr, "nxagentAdjustRandRXinerama: destroying crtc\n");
#endif #endif
/* first reset the crtc to free possible outputs, then destroy the crtc */
RRCrtcSet(pScrPriv->crtcs[pScrPriv->numCrtcs - 1], NULL, 0, 0, RR_Rotate_0, 0, NULL);
RRCrtcDestroy(pScrPriv->crtcs[pScrPriv->numCrtcs - 1]); RRCrtcDestroy(pScrPriv->crtcs[pScrPriv->numCrtcs - 1]);
} }
else else
...@@ -3886,22 +3909,13 @@ int nxagentAdjustRandRXinerama(ScreenPtr pScreen) ...@@ -3886,22 +3909,13 @@ int nxagentAdjustRandRXinerama(ScreenPtr pScreen)
} }
/* delete superfluous non-NX outputs */ /* delete superfluous non-NX outputs */
for (i = pScrPriv->numOutputs - 1; i >= 0; i--) { for (i = pScrPriv->numOutputs - 1; i >= 0; i--)
if (strncmp(pScrPriv->outputs[i]->name, "NX", 2)) { if (strncmp(pScrPriv->outputs[i]->name, "NX", 2))
#ifdef DEBUG nxagentDropOutput(pScrPriv->outputs[i]);
fprintf(stderr, "nxagentAdjustRandRXinerama: destroying output [%s]\n", pScrPriv->outputs[i]->name);
#endif
RROutputDestroy(pScrPriv->outputs[i]);
}
}
/* at this stage only NX outputs are left - we delete the superfluous ones */ /* at this stage only NX outputs are left - we delete the superfluous ones */
for (i = pScrPriv->numOutputs - 1; i >= number; i--) { for (i = pScrPriv->numOutputs - 1; i >= number; i--)
#ifdef DEBUG nxagentDropOutput(pScrPriv->outputs[i]);
fprintf(stderr, "nxagentAdjustRandRXinerama: destroying nx output [%s]\n", pScrPriv->outputs[i]->name);
#endif
RROutputDestroy(pScrPriv->outputs[i]);
}
/* add and init outputs */ /* add and init outputs */
for (i = 0; i < number; i++) { for (i = 0; i < number; i++) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment