[Spice-devel,7/8] fix infinite loop in resolution change

Submitted by Christophe Fergeau on Aug. 17, 2011, 6:25 p.m.

Details

Message ID 1313580353-3086-8-git-send-email-cfergeau@redhat.com
State New, archived
Headers show

Not browsing as part of any series.

Commit Message

Christophe Fergeau Aug. 17, 2011, 6:25 p.m.
From: Marc-André Lureau <marcandre.lureau@redhat.com>

After hours of investigation, I am a bit clueless.. It seems XRR is sending
us spurious ScreenChangeNotify in a loop. So we keep calling
init_monitors(), which creates new platform_win etc.. Although none of the
clients seems to be resetting the screen (checked all XRRSet..). The fact
that we create many platform_win looks like a bug to me, and indeed, it
seems to help if we reuse the same platform_win over the various
init_monitors() calls.

Fixes rhbz #692833
---
 client/x11/platform.cpp |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

Patch hide | download patch | download mbox

diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
index 2adc160..7c74d38 100644
--- a/client/x11/platform.cpp
+++ b/client/x11/platform.cpp
@@ -81,7 +81,7 @@  static GLXFBConfig **fb_config = NULL;
 static XIM x_input_method = NULL;
 static XIC x_input_context = NULL;
 
-static Window platform_win;
+static Window platform_win = 0;
 static XContext win_proc_context;
 static ProcessLoop* main_loop = NULL;
 static int focus_count = 0;
@@ -922,6 +922,9 @@  DynamicScreen::DynamicScreen(Display* display, int screen, int& next_mon_id)
     , _saved_height (get_height())
     , _out_of_sync (false)
 {
+    if (platform_win != 0)
+        return;
+
     X_DEBUG_SYNC(display);
     //FIXME: replace RootWindow() in other refs as well?
     XLockDisplay(display);
@@ -1226,6 +1229,9 @@  MultyMonScreen::MultyMonScreen(Display* display, int screen, int& next_mon_id)
         throw;
     }
 
+    if (platform_win != 0)
+        return;
+
     XLockDisplay(display);
     platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);
     XUnlockDisplay(display);