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:
parent
84baf4e181
commit
4c6866741d
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user