[metacity] surface: add meta_surface_is_opaque
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] surface: add meta_surface_is_opaque
- Date: Sun, 20 Oct 2019 12:28:53 +0000 (UTC)
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]