summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2010-09-01 20:04:52 +0200
committerAlexander Larsson <alexl@redhat.com>2010-09-09 16:25:24 +0200
commit4efeef330249819189a7a99e2dc65d2b3bc2f17b (patch)
tree74cfc9e303810b3535538875cb26ce285f4ff902
parent039700a90f5c2a0e0d3097e4feae3a84998e4111 (diff)
downloadspice-4efeef330249819189a7a99e2dc65d2b3bc2f17b.tar.gz
spice-4efeef330249819189a7a99e2dc65d2b3bc2f17b.tar.xz
spice-4efeef330249819189a7a99e2dc65d2b3bc2f17b.zip
spicec-x11: Fix going into a never ending loop upon xrandr event (#628573) (v2)
When handling an xrandr event the event_listener->on_monitors_change() callback destroys and re-creates the monitor object(s) which results in the DynamicScreen or MultyMonconstructor being called, which triggers more xrandr events. This causes a never ending event handling loop making spicec hang, and eventually making the X-server crash as a backlog of events builds up and it oom's. This patches this by explictly processing the xrandr event caused by the constructor inside the constructor surrounded by the already present guard code against recursive xrandr events.
-rw-r--r--client/x11/platform.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
index 8292d44f..cc1502bd 100644
--- a/client/x11/platform.cpp
+++ b/client/x11/platform.cpp
@@ -778,6 +778,11 @@ DynamicScreen::DynamicScreen(Display* display, int screen, int& next_mon_id)
platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);
XSelectInput(display, platform_win, StructureNotifyMask);
XRRSelectInput(display, platform_win, RRScreenChangeNotifyMask);
+
+ Monitor::self_monitors_change++;
+ process_monitor_configure_events(platform_win);
+ Monitor::self_monitors_change--;
+
XPlatform::set_win_proc(platform_win, root_win_proc);
intern_clipboard_atoms();
X_DEBUG_SYNC(display);
@@ -1046,6 +1051,11 @@ MultyMonScreen::MultyMonScreen(Display* display, int screen, int& next_mon_id)
X_DEBUG_SYNC(get_display());
intern_clipboard_atoms();
XPlatform::set_win_proc(root_window, root_win_proc);
+
+ XMonitor::inc_change_ref();
+ process_monitor_configure_events(root_window);
+ XMonitor::dec_change_ref();
+
X_DEBUG_SYNC(get_display());
//
//platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);