[Spice-devel] [PATCH] RFC: client/x11: reuse existing platform_win

Marc-André Lureau marcandre.lureau at gmail.com
Thu Jul 28 09:01:53 PDT 2011


Each time a {Dynamic,MultyMon}Scren is created, a new platform_win is
created to receive the notifications from X11. This looks very
suspicious already. Since I am not a xlib expert, I suppose that each
window will receive X11 events.

Whenever XRR ScreenChangeNotify event is received (caused by external
process), init_monitors() is called and this will recreate new
platform_wins. And sometime, this event happen in a loop and Xorg
takes 100% cpu. If only one platform_win is used, the loop doesn't
happen for me, but seem to still happen for others.

Related bug:
https://bugzilla.redhat.com/show_bug.cgi?id=692833
---
 client/x11/platform.cpp |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
index fe98eae..609898a 100644
--- a/client/x11/platform.cpp
+++ b/client/x11/platform.cpp
@@ -84,7 +84,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;
@@ -925,6 +925,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);
@@ -1229,6 +1232,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);
-- 
1.7.6



More information about the Spice-devel mailing list