diff options
author | Hans de Goede <hdegoede@redhat.com> | 2010-09-01 20:04:52 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-09-09 16:25:24 +0200 |
commit | 4efeef330249819189a7a99e2dc65d2b3bc2f17b (patch) | |
tree | 74cfc9e303810b3535538875cb26ce285f4ff902 /client/x11 | |
parent | 039700a90f5c2a0e0d3097e4feae3a84998e4111 (diff) | |
download | spice-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.
Diffstat (limited to 'client/x11')
-rw-r--r-- | client/x11/platform.cpp | 10 |
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); |