[gtk+/gtk-2-24] gdkwindow: Handle updates created by outstanding moves in same update



commit 692a0e5906c5da7f85c16c9d6cbb0d3ed8b4a576
Author: Alexander Larsson <alexl redhat com>
Date:   Wed Apr 10 14:32:15 2013 +0200

    gdkwindow: Handle updates created by outstanding moves in same update
    
    If gdk_window_flush_outstanding_moves() creates new update area
    we handle this directly in the same draw to avoid flashing.
    
    This mainly affects win32 as X11 does its exposes from moves async.
    However, its important for win32 since ScrollDC seems to sometimes
    invalidate (and not copy) unexected regions.
    
    http://bugzilla.gnome.org/show_bug.cgi?674051

 gdk/gdkwindow.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)
---
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 6526250..f5f0339 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -5463,6 +5463,7 @@ gdk_window_process_updates_internal (GdkWindow *window)
   GdkWindowImplIface *impl_iface;
   gboolean save_region = FALSE;
   GdkRectangle clip_box;
+  int iteration;
 
   /* Ensure the window lives while updating it */
   g_object_ref (window);
@@ -5470,8 +5471,15 @@ gdk_window_process_updates_internal (GdkWindow *window)
   /* If an update got queued during update processing, we can get a
    * window in the update queue that has an empty update_area.
    * just ignore it.
+   *
+   * We run this multiple times if needed because on win32 the
+   * first run can cause new (synchronous) updates from
+   * gdk_window_flush_outstanding_moves(). However, we
+   * limit it to two iterations to avoid any potential loops.
    */
-  if (private->update_area)
+  iteration = 0;
+  while (private->update_area &&
+        iteration++ < 2)
     {
       GdkRegion *update_area = private->update_area;
       private->update_area = NULL;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]