diff options
author | Keith Packard <keithp@keithp.com> | 2010-05-07 22:56:04 -0700 |
---|---|---|
committer | Julien Cristau <jcristau@debian.org> | 2010-09-04 11:43:20 +0200 |
commit | 3fabfc198b6f22338f7691907db1b7c849ccac4c (patch) | |
tree | e056351f151fb178eae178bc1b09cd80c35f91af | |
parent | 4c313472c45de171efb76231e7c7f323aa4eda3f (diff) |
Clean up RandR12 bits on screen close (bug 27114)
When resetting the server, pScrn->EnterVT must be unwrapped or the
next server generation will end up wrapping the wrapper and causing an
infinite recursion on EnterVT.
Signed-off-by: Keith Packard <keithp@keithp.com>
Tested-by: Michael Stapelberg <michael+freedesktop@stapelberg.de>
(cherry picked from commit 68a9ee8370e6f9b38218376ac92d5130a5b0ef1e)
-rw-r--r-- | hw/xfree86/modes/xf86Crtc.c | 2 | ||||
-rw-r--r-- | hw/xfree86/modes/xf86RandR12.c | 26 | ||||
-rw-r--r-- | hw/xfree86/modes/xf86RandR12.h | 1 |
3 files changed, 28 insertions, 1 deletions
diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 334fad424..3fcd79b55 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -756,6 +756,8 @@ xf86CrtcCloseScreen (int index, ScreenPtr screen) crtc->randr_crtc = NULL; } + xf86RandR12CloseScreen (screen); + return screen->CloseScreen (index, screen); } diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 7ba09b6fe..9325e9b5e 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -927,6 +927,24 @@ xf86RandR12Init (ScreenPtr pScreen) } void +xf86RandR12CloseScreen (ScreenPtr pScreen) +{ + XF86RandRInfoPtr randrp; + +#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0) + if (xf86RandR12Key == NULL) + return; +#endif + + randrp = XF86RANDRINFO(pScreen); +#if RANDR_12_INTERFACE + xf86Screens[pScreen->myNum]->EnterVT = randrp->orig_EnterVT; +#endif + + free(randrp); +} + +void xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotations) { XF86RandRInfoPtr randrp; @@ -1754,10 +1772,16 @@ static Bool xf86RandR12EnterVT (int screen_index, int flags) { ScreenPtr pScreen = screenInfo.screens[screen_index]; + ScrnInfoPtr pScrn = xf86Screens[screen_index]; XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); + Bool ret; if (randrp->orig_EnterVT) { - if (!randrp->orig_EnterVT (screen_index, flags)) + pScrn->EnterVT = randrp->orig_EnterVT; + ret = pScrn->EnterVT (screen_index, flags); + randrp->orig_EnterVT = pScrn->EnterVT; + pScrn->EnterVT = xf86RandR12EnterVT; + if (!ret) return FALSE; } diff --git a/hw/xfree86/modes/xf86RandR12.h b/hw/xfree86/modes/xf86RandR12.h index c8d9918cf..0c586beee 100644 --- a/hw/xfree86/modes/xf86RandR12.h +++ b/hw/xfree86/modes/xf86RandR12.h @@ -30,6 +30,7 @@ extern _X_EXPORT Bool xf86RandR12CreateScreenResources (ScreenPtr pScreen); extern _X_EXPORT Bool xf86RandR12Init(ScreenPtr pScreen); +extern _X_EXPORT void xf86RandR12CloseScreen(ScreenPtr pScreen); extern _X_EXPORT void xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotation); extern _X_EXPORT void xf86RandR12SetTransformSupport (ScreenPtr pScreen, Bool transforms); extern _X_EXPORT Bool xf86RandR12SetConfig(ScreenPtr pScreen, Rotation rotation, int rate, |