diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c index 681321a70..137a47bc1 100644 --- a/src/compositor/meta-window-actor.c +++ b/src/compositor/meta-window-actor.c @@ -68,7 +68,7 @@ struct _MetaWindowActorPrivate gchar * desc; - /* A region that matches the shape of the window, including frame bounds */ + /* If the window is shaped, a region that matches the shape */ cairo_region_t *shape_region; /* A rectangular region with the visible extents of the window */ cairo_region_t *bounding_region; @@ -560,7 +560,16 @@ meta_window_actor_get_shape_bounds (MetaWindowActor *self, { MetaWindowActorPrivate *priv = self->priv; - cairo_region_get_extents (priv->shape_region, bounds); + /* We need to be defensive here because there are corner cases + * where getting the shape fails on a window being destroyed + * and similar. + */ + if (priv->shape_region) + cairo_region_get_extents (priv->shape_region, bounds); + else if (priv->bounding_region) + cairo_region_get_extents (priv->bounding_region, bounds); + else + bounds->x = bounds->y = bounds->width = bounds->height = 0; } static void @@ -1604,7 +1613,12 @@ meta_window_actor_get_obscured_region (MetaWindowActor *self) MetaWindowActorPrivate *priv = self->priv; if (!priv->argb32 && priv->opacity == 0xff && priv->back_pixmap) - return priv->shape_region; + { + if (priv->shape_region) + return priv->shape_region; + else + return priv->bounding_region; + } else return NULL; } @@ -1853,17 +1867,25 @@ check_needs_shadow (MetaWindowActor *self) if (*shadow_location == NULL && should_have_shadow) { if (priv->shadow_shape == NULL) - priv->shadow_shape = meta_window_shape_new (priv->shape_region); + { + if (priv->shape_region) + priv->shadow_shape = meta_window_shape_new (priv->shape_region); + else if (priv->bounding_region) + priv->shadow_shape = meta_window_shape_new (priv->bounding_region); + } - MetaShadowFactory *factory = meta_shadow_factory_get_default (); - const char *shadow_class = meta_window_actor_get_shadow_class (self); - cairo_rectangle_int_t shape_bounds; + if (priv->shadow_shape != NULL) + { + MetaShadowFactory *factory = meta_shadow_factory_get_default (); + const char *shadow_class = meta_window_actor_get_shadow_class (self); + cairo_rectangle_int_t shape_bounds; - meta_window_actor_get_shape_bounds (self, &shape_bounds); - *shadow_location = meta_shadow_factory_get_shadow (factory, - priv->shadow_shape, - shape_bounds.width, shape_bounds.height, - shadow_class, appears_focused); + meta_window_actor_get_shape_bounds (self, &shape_bounds); + *shadow_location = meta_shadow_factory_get_shadow (factory, + priv->shadow_shape, + shape_bounds.width, shape_bounds.height, + shadow_class, appears_focused); + } } if (old_shadow != NULL)