[gtk+] gdk: Fix invalidation w/ pixel cache when changing child window geometry.



commit 09a181d205b6d19054361b5a0d65cc877aebc191
Author: Alexander Larsson <alexl redhat com>
Date:   Mon Nov 9 15:14:57 2015 +0100

    gdk: Fix invalidation w/ pixel cache when changing child window geometry.
    
    When moving/scrolling a child window we can't use the current clip
    region to limit what is invalidated, because there may be a pixel
    cache that listens for changes outside the clip region. Instead
    invalidate the entire area and rely on the invalidation code to limit
    the repaint to the actually visible area.

 gdk/gdkwindow.c |   24 +++++++++++++++++-------
 1 files changed, 17 insertions(+), 7 deletions(-)
---
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 9206ead..7e2dfb7 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -5761,11 +5761,16 @@ gdk_window_move_resize_internal (GdkWindow *window,
   if (gdk_window_is_viewable (window) &&
       !window->input_only)
     {
+      GdkRectangle r;
+
       expose = TRUE;
 
-      old_region = cairo_region_copy (window->clip_region);
-      /* Adjust regions to parent window coords */
-      cairo_region_translate (old_region, window->x, window->y);
+      r.x = window->x;
+      r.y = window->y;
+      r.width = window->width;
+      r.height = window->height;
+
+      old_region = cairo_region_create_rectangle (&r);
     }
 
   /* Set the new position and size */
@@ -5801,9 +5806,14 @@ gdk_window_move_resize_internal (GdkWindow *window,
 
   if (expose)
     {
-      new_region = cairo_region_copy (window->clip_region);
-      /* Adjust region to parent window coords */
-      cairo_region_translate (new_region, window->x, window->y);
+      GdkRectangle r;
+
+      r.x = window->x;
+      r.y = window->y;
+      r.width = window->width;
+      r.height = window->height;
+
+      new_region = cairo_region_create_rectangle (&r);
 
       cairo_region_union (new_region, old_region);
 
@@ -5940,7 +5950,7 @@ gdk_window_scroll (GdkWindow *window,
 
   move_native_children (window);
 
-  gdk_window_invalidate_region_full (window, window->clip_region, TRUE);
+  gdk_window_invalidate_rect_full (window, NULL, TRUE);
 
   _gdk_synthesize_crossing_events_for_geometry_change (window);
 }


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