I had a quick look in RandR's Xinerama implementation and noticed it doesn't seem to treat having no monitors as a cause for concern at all, which supports my guess that it's a transitional state that the driver will go through when it's shut down both outputs and not yet brought them back up.
Here's a patch which I believe should do something more useful. If
Xinerama says we have no monitors, it uses the default non-Xinerama
behaviour, which I believe treats the screen like a single monitor
the size of the virtual screen, or something (this seems like a
tolerable fallback - just keeping the old configuration for the moment would
be another possibility). When the CRTC comes back up, RandR hopefully emits
another "screen size changed" event, GDK notices and re-enables Xinerama-ish
behaviour, and all is well with the world.
It seems to work for me, anyway, but it's 4am here so please review it
carefully!
Hope this helps,
Simon
--- gtk+2.0-2.10.11.orig/gdk/x11/gdkscreen-x11.c
+++ gtk+2.0-2.10.11/gdk/x11/gdkscreen-x11.c
@@ -600,16 +601,20 @@
GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
XineramaScreenInfo *monitors = XineramaQueryScreens (GDK_SCREEN_XDISPLAY (screen),
&screen_x11->num_monitors);
- if (screen_x11->num_monitors <= 0)
+ if (screen_x11->num_monitors <= 0 || monitors == NULL)
{
- /* FIXME: We need to trap errors, since XINERAMA isn't always XINERAMA.
- * I don't think the num_monitors <= 0 check has any validity.
- */
- g_error ("error while retrieving Xinerama information");
+ /* If Xinerama doesn't think we have any monitors, try acting as
+ * though we had no Xinerama. If the "no monitors" condition
+ * is because XRandR 1.2 is currently switching between CRTCs,
+ * we'll be notified again when we have our monitor back,
+ * and can go back into Xinerama-ish mode at that point. */
+ if (monitors)
+ XFree (monitors);
+ return FALSE;
}
else
{
int i;
screen_x11->monitors = g_new0 (GdkRectangle, screen_x11->num_monitors);
for (i = 0; i < screen_x11->num_monitors; i++)
signature.asc
Description: Digital signature

