diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2019-10-19 22:02:58 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2019-10-19 22:02:58 +0300 |
commit | 3efbf74517be31bc08df3178a9a0caafb9edc12d (patch) | |
tree | ea60d06530a4fb7eabddc9b91312aebc5e442f99 | |
parent | ffc6af9d31c70de0e5961e5854fbbcf1185a7da7 (diff) | |
download | metacity-3efbf74517be31bc08df3178a9a0caafb9edc12d.tar.gz |
surface: add meta_surface_is_opaque
-rw-r--r-- | src/compositor/meta-surface.c | 40 | ||||
-rw-r--r-- | src/compositor/meta-surface.h | 2 |
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); |