[gtk+/transparent-windows: 5/8] gdk: Make sure we don't copy to/from layered regions when moving a window



commit 0f6784a919dd2ee223a30c1ff6e602994373730f
Author: Alexander Larsson <alexl redhat com>
Date:   Thu Dec 1 16:27:37 2011 +0100

    gdk: Make sure we don't copy to/from layered regions when moving a window

 gdk/gdkwindow.c |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)
---
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index d1ac763..a5b373a 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -5979,7 +5979,7 @@ gdk_window_move_resize_internal (GdkWindow *window,
 				 gint       width,
 				 gint       height)
 {
-  cairo_region_t *old_region, *new_region, *copy_area;
+  cairo_region_t *old_region, *old_layered, *new_region, *copy_area;
   cairo_region_t *old_native_child_region, *new_native_child_region;
   GdkWindow *impl_window;
   GdkWindowImplClass *impl_class;
@@ -6012,6 +6012,7 @@ gdk_window_move_resize_internal (GdkWindow *window,
 
   expose = FALSE;
   old_region = NULL;
+  old_layered = NULL;
 
   impl_window = gdk_window_get_impl_window (window);
 
@@ -6025,8 +6026,10 @@ gdk_window_move_resize_internal (GdkWindow *window,
       expose = TRUE;
 
       old_region = cairo_region_copy (window->clip_region);
-      /* Adjust region to parent window coords */
+      old_layered = cairo_region_copy (window->layered_region);
+      /* Adjust regions to parent window coords */
       cairo_region_translate (old_region, window->x, window->y);
+      cairo_region_translate (old_layered, window->x, window->y);
 
       old_native_child_region = collect_native_child_region (window, TRUE);
       if (old_native_child_region)
@@ -6106,7 +6109,19 @@ gdk_window_move_resize_internal (GdkWindow *window,
        * Everything in the old and new regions that is not copied must be
        * invalidated (including children) as this is newly exposed
        */
-      copy_area = cairo_region_copy (new_region);
+      if (window->has_alpha_background)
+	copy_area = cairo_region_create (); /* Copy nothing for alpha windows */
+      else
+	copy_area = cairo_region_copy (new_region);
+
+      /* Don't copy from a previously layered region */
+      cairo_region_translate (old_layered, dx, dy);
+      cairo_region_subtract (copy_area, old_layered);
+
+      /* Don't copy into a layered region */
+      cairo_region_translate (copy_area, -window->x, -window->y);
+      cairo_region_subtract (copy_area, window->layered_region);
+      cairo_region_translate (copy_area, window->x, window->y);
 
       cairo_region_union (new_region, old_region);
 
@@ -6155,6 +6170,7 @@ gdk_window_move_resize_internal (GdkWindow *window,
       gdk_window_invalidate_region_full (window->parent, new_region, TRUE, CLEAR_BG_ALL);
 
       cairo_region_destroy (old_region);
+      cairo_region_destroy (old_layered);
       cairo_region_destroy (new_region);
     }
 



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