[mutter] surface-actor-x11: Make sure to set a size when unredirected



commit 4c6866741d5ca53d028329f1626298985c005a0c
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Jun 23 16:23:45 2015 -0700

    surface-actor-x11: Make sure to set a size when unredirected
    
    When we're unredirected, we don't have a pixmap, and thus our allocation
    becomes 0x0. So when events come in, they pass right through our actor,
    going to the one underneath in the stack.
    
    Fix this by having a fallback size on the shaped texture actor when
    we're unredirected, causing it to always have a valid allocation.
    
    This fixes clicking on stuff in sloppy / mouse mode focus.

 src/compositor/meta-shaped-texture-private.h |    3 ++
 src/compositor/meta-shaped-texture.c         |   49 ++++++++++++++++++++++----
 src/compositor/meta-surface-actor-x11.c      |    2 +
 3 files changed, 47 insertions(+), 7 deletions(-)
---
diff --git a/src/compositor/meta-shaped-texture-private.h b/src/compositor/meta-shaped-texture-private.h
index 4ee8027..21c6335 100644
--- a/src/compositor/meta-shaped-texture-private.h
+++ b/src/compositor/meta-shaped-texture-private.h
@@ -32,6 +32,9 @@
 ClutterActor *meta_shaped_texture_new (void);
 void meta_shaped_texture_set_texture (MetaShapedTexture *stex,
                                       CoglTexture       *texture);
+void meta_shaped_texture_set_fallback_size (MetaShapedTexture *stex,
+                                            guint              fallback_width,
+                                            guint              fallback_height);
 gboolean meta_shaped_texture_is_obscured (MetaShapedTexture *self);
 
 #endif
diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
index d1ed379..685be36 100644
--- a/src/compositor/meta-shaped-texture.c
+++ b/src/compositor/meta-shaped-texture.c
@@ -86,6 +86,7 @@ struct _MetaShapedTexturePrivate
   cairo_region_t *unobscured_region;
 
   guint tex_width, tex_height;
+  guint fallback_width, fallback_height;
 
   guint create_mipmaps : 1;
 };
@@ -136,7 +137,20 @@ set_unobscured_region (MetaShapedTexture *self,
   g_clear_pointer (&priv->unobscured_region, (GDestroyNotify) cairo_region_destroy);
   if (unobscured_region)
     {
-      cairo_rectangle_int_t bounds = { 0, 0, priv->tex_width, priv->tex_height };
+      guint width, height;
+
+      if (priv->texture)
+        {
+          width = priv->tex_width;
+          height = priv->tex_height;
+        }
+      else
+        {
+          width = priv->fallback_width;
+          height = priv->fallback_height;
+        }
+
+      cairo_rectangle_int_t bounds = { 0, 0, width, height };
       priv->unobscured_region = cairo_region_copy (unobscured_region);
       cairo_region_intersect_rectangle (priv->unobscured_region, &bounds);
     }
@@ -499,12 +513,17 @@ meta_shaped_texture_get_preferred_width (ClutterActor *self,
                                          gfloat       *natural_width_p)
 {
   MetaShapedTexturePrivate *priv = META_SHAPED_TEXTURE (self)->priv;
+  guint width;
 
-  if (min_width_p)
-    *min_width_p = priv->tex_width;
+  if (priv->texture)
+    width = priv->tex_width;
+  else
+    width = priv->fallback_width;
 
+  if (min_width_p)
+    *min_width_p = width;
   if (natural_width_p)
-    *natural_width_p = priv->tex_width;
+    *natural_width_p = width;
 }
 
 static void
@@ -514,12 +533,17 @@ meta_shaped_texture_get_preferred_height (ClutterActor *self,
                                           gfloat       *natural_height_p)
 {
   MetaShapedTexturePrivate *priv = META_SHAPED_TEXTURE (self)->priv;
+  guint height;
 
-  if (min_height_p)
-    *min_height_p = priv->tex_height;
+  if (priv->texture)
+    height = priv->tex_height;
+  else
+    height = priv->fallback_height;
 
+  if (min_height_p)
+    *min_height_p = height;
   if (natural_height_p)
-    *natural_height_p = priv->tex_height;
+    *natural_height_p = height;
 }
 
 static cairo_region_t *
@@ -852,6 +876,17 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
   return surface;
 }
 
+void
+meta_shaped_texture_set_fallback_size (MetaShapedTexture *self,
+                                       guint              fallback_width,
+                                       guint              fallback_height)
+{
+  MetaShapedTexturePrivate *priv = self->priv;
+
+  priv->fallback_width = fallback_width;
+  priv->fallback_height = fallback_height;
+}
+
 static void
 meta_shaped_texture_cull_out (MetaCullable   *cullable,
                               cairo_region_t *unobscured_region,
diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c
index 4aa7ecd..b50b8f2 100644
--- a/src/compositor/meta-surface-actor-x11.c
+++ b/src/compositor/meta-surface-actor-x11.c
@@ -416,6 +416,7 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self,
                                  int width, int height)
 {
   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
+  MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
 
   if (priv->last_width == width &&
       priv->last_height == height)
@@ -424,4 +425,5 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self,
   priv->size_changed = TRUE;
   priv->last_width = width;
   priv->last_height = height;
+  meta_shaped_texture_set_fallback_size (stex, width, height);
 }


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