[metacity] surface: add damage when moving window



commit 7b05a0ef28b3a451bd27bb96eb1e2c5715111df0
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Fri Oct 18 20:30:10 2019 +0300

    surface: add damage when moving window
    
    We need redraw full window in new position and also redraw region
    where window was before it was moved.

 src/compositor/meta-surface.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)
---
diff --git a/src/compositor/meta-surface.c b/src/compositor/meta-surface.c
index 29b6244f..5ea92782 100644
--- a/src/compositor/meta-surface.c
+++ b/src/compositor/meta-surface.c
@@ -41,6 +41,8 @@ typedef struct
 
   int              x;
   int              y;
+  gboolean         position_changed;
+
   int              width;
   int              height;
 
@@ -740,8 +742,25 @@ meta_surface_sync_geometry (MetaSurface *self)
   if (priv->x != rect.x ||
       priv->y != rect.y)
     {
+      if (priv->shape_region != None)
+        {
+          XserverRegion shape_region;
+
+          shape_region = XFixesCreateRegion (priv->xdisplay, NULL, 0);
+          XFixesCopyRegion (priv->xdisplay, shape_region, priv->shape_region);
+          XFixesTranslateRegion (priv->xdisplay, shape_region, priv->x, priv->y);
+
+          meta_compositor_add_damage (priv->compositor,
+                                      "position_changed",
+                                      shape_region);
+
+          XFixesDestroyRegion (priv->xdisplay, shape_region);
+        }
+
       priv->x = rect.x;
       priv->y = rect.y;
+
+      priv->position_changed = TRUE;
     }
 
   if (priv->width != rect.width ||
@@ -783,6 +802,13 @@ meta_surface_pre_paint (MetaSurface *self)
   update_shape_region (self, damage);
   update_opaque_region (self, damage);
 
+  if (priv->position_changed)
+    {
+      XFixesUnionRegion (priv->xdisplay, damage, damage, priv->shape_region);
+
+      priv->position_changed = FALSE;
+    }
+
   if (is_region_empty (priv->xdisplay, damage))
     {
       XFixesDestroyRegion (priv->xdisplay, damage);


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