summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2012-10-01 10:02:01 +0200
committerAlexander Larsson <alexl@redhat.com>2012-10-02 13:12:49 +0200
commit83c66c9c2cf6bf411f7d5ae3c89259203626173a (patch)
tree9f6847386440ffd499c9a709632ef49e3cc3aeb7
parentd6809d050a8666f7c98ee4b74f22ff828782fe16 (diff)
downloadgtk+-83c66c9c2cf6bf411f7d5ae3c89259203626173a.tar.gz
Make process_all_updates draw synchronously
By calling XSync in _gdk_x11_display_after_process_all_updates we effectively make gdk rendering sync, which avoids problems with the client animations running faster than the Xserver rendering, thus filling up the X rendering pipes and essentially "locking up" the Xserver (i.e. you can't even close the offending window because the WM is starved too). I verified this worked by making GtkSpinner paint multiple times on my intel driver (which has some issue making this rendering slow atm), and without this patch i get severe lag where even window dragging stops for 5 seconds when i drag the mouse around. However, with the patch everything is smooth. https://bugzilla.gnome.org/show_bug.cgi?id=684639
-rw-r--r--gdk/x11/gdkwindow-x11.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 4ef6f46f8a..e4b880f6b3 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -4858,6 +4858,11 @@ _gdk_x11_display_before_process_all_updates (GdkDisplay *display)
void
_gdk_x11_display_after_process_all_updates (GdkDisplay *display)
{
+ /* Sync after all drawing, otherwise the client can get "ahead" of
+ the server rendering during animations, such that we fill up
+ the Xserver pipes with sync rendering ops not letting other
+ clients (including the VM) do anything. */
+ XSync (GDK_DISPLAY_XDISPLAY (display), FALSE);
}
static Bool