From c28fc68df1f32175cea32c758a544af05c066452 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 22 Oct 2015 14:07:52 +0200 Subject: [PATCH] wayland: Add MetaWaylandSurface::destroy signal There's places where it would be convenient to add listeners to this, so add the signal. The signal is only emitted once during destruction, it is convenient for the places where we want notifications at a time the object is still alive, as opposed to weak refs which notify after the fact. --- src/wayland/meta-wayland-surface.c | 32 ++++++++++++++++++++++++++++++ src/wayland/meta-wayland-surface.h | 1 + 2 files changed, 33 insertions(+) diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index 4699cfd57..876586b34 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -137,6 +137,13 @@ G_DEFINE_TYPE (MetaWaylandSurfaceRoleDND, meta_wayland_surface_role_dnd, META_TYPE_WAYLAND_SURFACE_ROLE); +enum { + SURFACE_DESTROY, + N_SURFACE_SIGNALS +}; + +guint surface_signals[N_SURFACE_SIGNALS] = { 0 }; + static void meta_wayland_surface_role_assigned (MetaWaylandSurfaceRole *surface_role); @@ -2670,6 +2677,20 @@ meta_wayland_surface_get_absolute_coordinates (MetaWaylandSurface *surface, *y = v.y; } +static void +meta_wayland_surface_dispose (GObject *object) +{ + MetaWaylandSurface *surface = META_WAYLAND_SURFACE (object); + + if (!surface->destroying) + { + g_signal_emit (object, surface_signals[SURFACE_DESTROY], 0); + surface->destroying = TRUE; + } + + G_OBJECT_CLASS (meta_wayland_surface_parent_class)->dispose (object); +} + static void meta_wayland_surface_init (MetaWaylandSurface *surface) { @@ -2679,6 +2700,17 @@ meta_wayland_surface_init (MetaWaylandSurface *surface) static void meta_wayland_surface_class_init (MetaWaylandSurfaceClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = meta_wayland_surface_dispose; + + surface_signals[SURFACE_DESTROY] = + g_signal_new ("destroy", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h index c817ed715..15be68630 100644 --- a/src/wayland/meta-wayland-surface.h +++ b/src/wayland/meta-wayland-surface.h @@ -198,6 +198,7 @@ struct _MetaWaylandSurface MetaWaylandSerial acked_configure_serial; gboolean has_set_geometry; gboolean is_modal; + gboolean destroying; /* xdg_popup */ struct {