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.
This commit is contained in:
Jasper St. Pierre 2015-06-23 16:23:45 -07:00
parent 84baf4e181
commit 4c6866741d
3 changed files with 47 additions and 7 deletions

View File

@ -32,6 +32,9 @@
ClutterActor *meta_shaped_texture_new (void); ClutterActor *meta_shaped_texture_new (void);
void meta_shaped_texture_set_texture (MetaShapedTexture *stex, void meta_shaped_texture_set_texture (MetaShapedTexture *stex,
CoglTexture *texture); 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); gboolean meta_shaped_texture_is_obscured (MetaShapedTexture *self);
#endif #endif

View File

@ -86,6 +86,7 @@ struct _MetaShapedTexturePrivate
cairo_region_t *unobscured_region; cairo_region_t *unobscured_region;
guint tex_width, tex_height; guint tex_width, tex_height;
guint fallback_width, fallback_height;
guint create_mipmaps : 1; guint create_mipmaps : 1;
}; };
@ -136,7 +137,20 @@ set_unobscured_region (MetaShapedTexture *self,
g_clear_pointer (&priv->unobscured_region, (GDestroyNotify) cairo_region_destroy); g_clear_pointer (&priv->unobscured_region, (GDestroyNotify) cairo_region_destroy);
if (unobscured_region) 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); priv->unobscured_region = cairo_region_copy (unobscured_region);
cairo_region_intersect_rectangle (priv->unobscured_region, &bounds); cairo_region_intersect_rectangle (priv->unobscured_region, &bounds);
} }
@ -499,12 +513,17 @@ meta_shaped_texture_get_preferred_width (ClutterActor *self,
gfloat *natural_width_p) gfloat *natural_width_p)
{ {
MetaShapedTexturePrivate *priv = META_SHAPED_TEXTURE (self)->priv; MetaShapedTexturePrivate *priv = META_SHAPED_TEXTURE (self)->priv;
guint width;
if (priv->texture)
width = priv->tex_width;
else
width = priv->fallback_width;
if (min_width_p) if (min_width_p)
*min_width_p = priv->tex_width; *min_width_p = width;
if (natural_width_p) if (natural_width_p)
*natural_width_p = priv->tex_width; *natural_width_p = width;
} }
static void static void
@ -514,12 +533,17 @@ meta_shaped_texture_get_preferred_height (ClutterActor *self,
gfloat *natural_height_p) gfloat *natural_height_p)
{ {
MetaShapedTexturePrivate *priv = META_SHAPED_TEXTURE (self)->priv; MetaShapedTexturePrivate *priv = META_SHAPED_TEXTURE (self)->priv;
guint height;
if (priv->texture)
height = priv->tex_height;
else
height = priv->fallback_height;
if (min_height_p) if (min_height_p)
*min_height_p = priv->tex_height; *min_height_p = height;
if (natural_height_p) if (natural_height_p)
*natural_height_p = priv->tex_height; *natural_height_p = height;
} }
static cairo_region_t * static cairo_region_t *
@ -852,6 +876,17 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
return surface; 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 static void
meta_shaped_texture_cull_out (MetaCullable *cullable, meta_shaped_texture_cull_out (MetaCullable *cullable,
cairo_region_t *unobscured_region, cairo_region_t *unobscured_region,

View File

@ -416,6 +416,7 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self,
int width, int height) int width, int height)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); 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 && if (priv->last_width == width &&
priv->last_height == height) priv->last_height == height)
@ -424,4 +425,5 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self,
priv->size_changed = TRUE; priv->size_changed = TRUE;
priv->last_width = width; priv->last_width = width;
priv->last_height = height; priv->last_height = height;
meta_shaped_texture_set_fallback_size (stex, width, height);
} }