diff --git a/src/compositor/meta-surface-actor-wayland.c b/src/compositor/meta-surface-actor-wayland.c index a70d8e108..67bc42e43 100644 --- a/src/compositor/meta-surface-actor-wayland.c +++ b/src/compositor/meta-surface-actor-wayland.c @@ -110,6 +110,9 @@ meta_surface_actor_wayland_get_scale (MetaSurfaceActorWayland *actor) MetaWindow *window = surface->window; int output_scale = 1; + if (!priv->surface) + return 1; + while (surface) { if (surface->window) @@ -301,3 +304,12 @@ meta_surface_actor_wayland_get_surface (MetaSurfaceActorWayland *self) MetaSurfaceActorWaylandPrivate *priv = meta_surface_actor_wayland_get_instance_private (self); return priv->surface; } + +void +meta_surface_actor_wayland_surface_destroyed (MetaSurfaceActorWayland *self) +{ + MetaSurfaceActorWaylandPrivate *priv = + meta_surface_actor_wayland_get_instance_private (self); + + priv->surface = NULL; +} diff --git a/src/compositor/meta-surface-actor-wayland.h b/src/compositor/meta-surface-actor-wayland.h index 28fd43cab..7071cdb0a 100644 --- a/src/compositor/meta-surface-actor-wayland.h +++ b/src/compositor/meta-surface-actor-wayland.h @@ -57,6 +57,7 @@ GType meta_surface_actor_wayland_get_type (void); MetaSurfaceActor * meta_surface_actor_wayland_new (MetaWaylandSurface *surface); MetaWaylandSurface * meta_surface_actor_wayland_get_surface (MetaSurfaceActorWayland *self); +void meta_surface_actor_wayland_surface_destroyed (MetaSurfaceActorWayland *self); void meta_surface_actor_wayland_set_texture (MetaSurfaceActorWayland *self, CoglTexture *texture); diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c index a6aebc9da..0202fdaa8 100644 --- a/src/compositor/meta-window-actor.c +++ b/src/compositor/meta-window-actor.c @@ -616,8 +616,10 @@ meta_window_actor_get_shape_bounds (MetaWindowActor *self, #ifdef HAVE_WAYLAND if (META_IS_SURFACE_ACTOR_WAYLAND (priv->surface)) { - double scale = priv->surface ? - meta_surface_actor_wayland_get_scale (META_SURFACE_ACTOR_WAYLAND (priv->surface)) : 1.; + MetaSurfaceActorWayland *surface_actor = + META_SURFACE_ACTOR_WAYLAND (priv->surface); + double scale = meta_surface_actor_wayland_get_scale (surface_actor); + bounds->x *= scale; bounds->y *= scale; bounds->width *= scale; diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index 31aca2dfa..565d0611c 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -802,6 +802,9 @@ wl_surface_destructor (struct wl_resource *resource) if (surface->input_region) cairo_region_destroy (surface->input_region); + meta_surface_actor_wayland_surface_destroyed ( + META_SURFACE_ACTOR_WAYLAND (surface->surface_actor)); + g_object_unref (surface->surface_actor); meta_wayland_compositor_destroy_frame_callbacks (compositor, surface);