[metacity] surface: add meta_surface_is_opaque



commit 3efbf74517be31bc08df3178a9a0caafb9edc12d
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sat Oct 19 22:02:58 2019 +0300

    surface: add meta_surface_is_opaque

 src/compositor/meta-surface.c | 40 ++++++++++++++++++++++++++++++++++++++++
 src/compositor/meta-surface.h |  2 ++
 2 files changed, 42 insertions(+)
---
diff --git a/src/compositor/meta-surface.c b/src/compositor/meta-surface.c
index 5ea92782..d3ead157 100644
--- a/src/compositor/meta-surface.c
+++ b/src/compositor/meta-surface.c
@@ -19,6 +19,7 @@
 #include "meta-surface-private.h"
 
 #include <X11/extensions/Xcomposite.h>
+#include <X11/extensions/Xrender.h>
 
 #include "display-private.h"
 #include "errors.h"
@@ -623,6 +624,45 @@ meta_surface_get_image (MetaSurface *self)
   return META_SURFACE_GET_CLASS (self)->get_image (self);
 }
 
+gboolean
+meta_surface_is_opaque (MetaSurface *self)
+{
+  MetaSurfacePrivate *priv;
+  Visual *xvisual;
+  XRenderPictFormat *format;
+  XserverRegion region;
+  int n_rects;
+  XRectangle bounds;
+  XRectangle *rects;
+
+  priv = meta_surface_get_instance_private (self);
+
+  if (priv->window->opacity != 0xffffffff)
+    return FALSE;
+
+  xvisual = meta_window_get_toplevel_xvisual (priv->window);
+  format = XRenderFindVisualFormat (priv->xdisplay, xvisual);
+
+  if (format->type != PictTypeDirect || !format->direct.alphaMask)
+    return TRUE;
+
+  if (priv->opaque_region == None)
+    return FALSE;
+
+  region = XFixesCreateRegion (priv->xdisplay, NULL, 0);
+
+  XFixesSubtractRegion (priv->xdisplay,
+                        region,
+                        priv->shape_region,
+                        priv->opaque_region);
+
+  rects = XFixesFetchRegionAndBounds (priv->xdisplay, region, &n_rects, &bounds);
+  XFixesDestroyRegion (priv->xdisplay, region);
+  XFree (rects);
+
+  return (n_rects == 0 || bounds.width == 0 || bounds.height == 0);
+}
+
 gboolean
 meta_surface_is_visible (MetaSurface *self)
 {
diff --git a/src/compositor/meta-surface.h b/src/compositor/meta-surface.h
index b763c885..9fc74ed8 100644
--- a/src/compositor/meta-surface.h
+++ b/src/compositor/meta-surface.h
@@ -47,6 +47,8 @@ XserverRegion    meta_surface_get_shape_region      (MetaSurface        *self);
 
 cairo_surface_t *meta_surface_get_image             (MetaSurface        *self);
 
+gboolean         meta_surface_is_opaque             (MetaSurface        *self);
+
 gboolean         meta_surface_is_visible            (MetaSurface        *self);
 
 void             meta_surface_show                  (MetaSurface        *self);


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