56 lines
1.8 KiB
Diff
56 lines
1.8 KiB
Diff
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
|
|
index 6f93a0d..01310e6 100644
|
|
--- a/hw/xfree86/modes/xf86RandR12.c
|
|
+++ b/hw/xfree86/modes/xf86RandR12.c
|
|
@@ -55,6 +55,13 @@ typedef struct _xf86RandR12Info {
|
|
int pointerY;
|
|
Rotation rotation; /* current mode */
|
|
Rotation supported_rotations; /* driver supported */
|
|
+
|
|
+ /* Used to wrap EnterVT so we can re-probe the outputs when a laptop unsuspends
|
|
+ * (actually, any time that we switch back into our VT).
|
|
+ *
|
|
+ * See https://bugs.freedesktop.org/show_bug.cgi?id=21554
|
|
+ */
|
|
+ xf86EnterVTProc *orig_EnterVT;
|
|
} XF86RandRInfoRec, *XF86RandRInfoPtr;
|
|
|
|
#ifdef RANDR_12_INTERFACE
|
|
@@ -1646,10 +1653,25 @@ xf86RandR13SetPanning (ScreenPtr pScreen,
|
|
}
|
|
|
|
static Bool
|
|
+xf86RandR12EnterVT (int screen_index, int flags)
|
|
+{
|
|
+ ScreenPtr pScreen = screenInfo.screens[screen_index];
|
|
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
|
+
|
|
+ if (randrp->orig_EnterVT) {
|
|
+ if (!randrp->orig_EnterVT (screen_index, flags))
|
|
+ return FALSE;
|
|
+ }
|
|
+
|
|
+ return RRGetInfo (pScreen, TRUE); /* force a re-probe of outputs and notify clients about changes */
|
|
+}
|
|
+
|
|
+static Bool
|
|
xf86RandR12Init12 (ScreenPtr pScreen)
|
|
{
|
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
|
rrScrPrivPtr rp = rrGetScrPriv(pScreen);
|
|
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
|
|
|
rp->rrGetInfo = xf86RandR12GetInfo12;
|
|
rp->rrScreenSetSize = xf86RandR12ScreenSetSize;
|
|
@@ -1665,6 +1687,10 @@ xf86RandR12Init12 (ScreenPtr pScreen)
|
|
rp->rrModeDestroy = xf86RandR12ModeDestroy;
|
|
rp->rrSetConfig = NULL;
|
|
pScrn->PointerMoved = xf86RandR12PointerMoved;
|
|
+
|
|
+ randrp->orig_EnterVT = pScrn->EnterVT;
|
|
+ pScrn->EnterVT = xf86RandR12EnterVT;
|
|
+
|
|
if (!xf86RandR12CreateObjects12 (pScreen))
|
|
return FALSE;
|
|
|