From: Alexander Larsson Date: Mon, 1 Oct 2012 08:02:01 +0000 (+0200) Subject: Make process_all_updates draw synchronously X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=83c66c9c2cf6bf411f7d5ae3c89259203626173a;p=~andy%2Fgtk 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 --- diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 4ef6f46f8..e4b880f6b 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