summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-10-19 22:02:58 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-10-19 22:02:58 +0300
commit3efbf74517be31bc08df3178a9a0caafb9edc12d (patch)
treeea60d06530a4fb7eabddc9b91312aebc5e442f99
parentffc6af9d31c70de0e5961e5854fbbcf1185a7da7 (diff)
downloadmetacity-3efbf74517be31bc08df3178a9a0caafb9edc12d.tar.gz
surface: add meta_surface_is_opaque
-rw-r--r--src/compositor/meta-surface.c40
-rw-r--r--src/compositor/meta-surface.h2
2 files changed, 42 insertions, 0 deletions
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"
@@ -624,6 +625,45 @@ meta_surface_get_image (MetaSurface *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)
{
MetaSurfacePrivate *priv;
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);