[gtk+] Automatically flush window when doing non-double-buffered expose



commit 7ab7ffa542be7a6dcda1a35d151ace5e22a8d721
Author: Alexander Larsson <alexl redhat com>
Date:   Mon Sep 14 16:07:43 2009 +0200

    Automatically flush window when doing non-double-buffered expose
    
    Applications using non-double-buffered drawing using cairo (e.g. Abiword)
    can draw directly to the window using cairo and thus manage to avoid
    the automatic flushing of outstanding moves. This can cause redraw
    inconsistencies like bug 593507.
    
    We fix this by always flushing when exposing non-double-buffered widgets.

 docs/reference/gdk/gdk-sections.txt |    1 +
 gtk/gtkmain.c                       |   10 +++++++++-
 2 files changed, 10 insertions(+), 1 deletions(-)
---
diff --git a/docs/reference/gdk/gdk-sections.txt b/docs/reference/gdk/gdk-sections.txt
index 5bdc717..43d000c 100644
--- a/docs/reference/gdk/gdk-sections.txt
+++ b/docs/reference/gdk/gdk-sections.txt
@@ -662,6 +662,7 @@ gdk_window_resize
 gdk_window_move_resize
 gdk_window_scroll
 gdk_window_move_region
+gdk_window_flush
 gdk_window_ensure_native
 gdk_window_reparent
 gdk_window_clear
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 11aee08..e47e1be 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1559,7 +1559,15 @@ gtk_main_do_event (GdkEvent *event)
 	  gdk_window_end_paint (event->any.window);
 	}
       else
-	gtk_widget_send_expose (event_widget, event);
+	{
+	  /* The app may paint with a previously allocated cairo_t,
+	     which will draw directly to the window. We can't catch cairo
+	     drap operatoins to automatically flush the window, thus we
+	     need to explicitly flush any outstanding moves or double
+	     buffering */
+	  gdk_window_flush (event->any.window);
+	  gtk_widget_send_expose (event_widget, event);
+	}
       break;
 
     case GDK_PROPERTY_NOTIFY:



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