Disable CRTC when SetSingleMode has no matching mode. Update RandR as well.
xf86SetSingleMode tries to resize all crtcs to match the selected mode. When
a CRTC has no matching mode, it now disables the CRTC (instead of crashing).
Also, poke the RandR extension when xf86SetSingleMode is done so that
appropriate events can be delivered, and so that future RandR queries return
correct information.
(cherry picked from commit dc6c4f6989
)
This commit is contained in:
parent
67e1c98895
commit
bcf17df69a
|
@ -233,8 +233,6 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
|
|||
int saved_x, saved_y;
|
||||
Rotation saved_rotation;
|
||||
|
||||
adjusted_mode = xf86DuplicateMode(mode);
|
||||
|
||||
crtc->enabled = xf86CrtcInUse (crtc);
|
||||
|
||||
if (!crtc->enabled)
|
||||
|
@ -243,6 +241,8 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
adjusted_mode = xf86DuplicateMode(mode);
|
||||
|
||||
didLock = crtc->funcs->lock (crtc);
|
||||
|
||||
saved_mode = crtc->mode;
|
||||
|
@ -1833,6 +1833,11 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
|
|||
else
|
||||
crtc_mode = xf86OutputFindClosestMode (output, desired);
|
||||
}
|
||||
if (!crtc_mode)
|
||||
{
|
||||
crtc->enabled = FALSE;
|
||||
continue;
|
||||
}
|
||||
if (!xf86CrtcSetMode (crtc, crtc_mode, rotation, 0, 0))
|
||||
ok = FALSE;
|
||||
else
|
||||
|
@ -1844,6 +1849,7 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
|
|||
}
|
||||
}
|
||||
xf86DisableUnusedFunctions(pScrn);
|
||||
xf86RandR12TellChanged (pScrn->pScreen);
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
|
|
@ -1048,6 +1048,28 @@ xf86RandR12CreateScreenResources12 (ScreenPtr pScreen)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Something happened within the screen configuration due
|
||||
* to DGA, VidMode or hot key. Tell RandR
|
||||
*/
|
||||
|
||||
void
|
||||
xf86RandR12TellChanged (ScreenPtr pScreen)
|
||||
{
|
||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||
int c;
|
||||
|
||||
if (!randrp)
|
||||
return;
|
||||
xf86RandR12SetInfo12 (pScreen);
|
||||
for (c = 0; c < config->num_crtc; c++)
|
||||
xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc);
|
||||
|
||||
RRTellChanged (pScreen);
|
||||
}
|
||||
|
||||
static void
|
||||
xf86RandR12PointerMoved (int scrnIndex, int x, int y)
|
||||
{
|
||||
|
|
|
@ -33,5 +33,6 @@ Bool xf86RandR12SetConfig(ScreenPtr pScreen, Rotation rotation, int rate,
|
|||
Rotation xf86RandR12GetRotation(ScreenPtr pScreen);
|
||||
void xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y);
|
||||
Bool xf86RandR12PreInit (ScrnInfoPtr pScrn);
|
||||
void xf86RandR12TellChanged (ScreenPtr pScreen);
|
||||
|
||||
#endif /* _XF86_RANDR_H_ */
|
||||
|
|
Loading…
Reference in New Issue
Block a user