[mutter/wip/carlosg/clip-me-harder: 8/10] window-actor: Cull out areas covered by opaque windows



commit ac7aa11417030f2a5a580c04595a0f235d56a357
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Jan 27 15:45:10 2019 +0100

    window-actor: Cull out areas covered by opaque windows
    
    Wayland clients do this through the opaque region in the surface
    actor. However X11 clients were considered fully transparent for
    culling purposes, which may result in mutter painting other bits
    of the background or other windows that will be painted over in
    reality.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/698

 src/compositor/meta-window-actor.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
---
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index cf7c4642d..0dcfe3d83 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -1370,9 +1370,27 @@ meta_window_actor_cull_out (MetaCullable   *cullable,
                             cairo_region_t *clip_region)
 {
   MetaWindowActor *self = META_WINDOW_ACTOR (cullable);
+  MetaWindowActorPrivate *priv =
+    meta_window_actor_get_instance_private (self);
 
   meta_cullable_cull_out_children (cullable, unobscured_region, clip_region);
   meta_window_actor_set_clip_region_beneath (self, clip_region);
+
+  if (unobscured_region && !is_non_opaque (self))
+    {
+      cairo_region_t *region = meta_window_get_frame_bounds (priv->window);
+
+      if (region)
+        {
+          cairo_region_subtract (unobscured_region, region);
+        }
+      else
+        {
+          cairo_rectangle_int_t rect;
+          meta_window_get_frame_rect (priv->window, &rect);
+          cairo_region_subtract_rectangle (unobscured_region, &rect);
+        }
+    }
 }
 
 static void


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