summaryrefslogtreecommitdiff
path: root/libweston-desktop
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2016-09-28 19:32:11 (GMT)
committerQuentin Glidic <sardemff7+git@sardemff7.net>2016-10-14 08:52:36 (GMT)
commit2dae4d0110a1e3699f0e99ca0e6a6a6904842253 (patch)
tree1c978abf80234213d2e3045d4e9ba895a9de2aa4 /libweston-desktop
parent2045016d8ed6d52a6b7768ddc0bcd1629df63570 (diff)
downloadweston-master.tar.gz
weston-master.tar.xz
libweston-desktop: destroy wl_shell_surface after the wl_surface is destroyedHEADmaster
The wl_shell_surface spec says that it is destroyed automatically by the server when the wl_surface is destroyed, and indeed it does not have a destroy request. So, do that. Signed-off-by: Giulio Camuffo <giuliocamuffo@gmail.com> Reviewed-by: Quentin Glidic <sardemff7+git@sardemff7.net>
Diffstat (limited to 'libweston-desktop')
-rw-r--r--libweston-desktop/wl-shell.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/libweston-desktop/wl-shell.c b/libweston-desktop/wl-shell.c
index 695b4a3..399139c 100644
--- a/libweston-desktop/wl-shell.c
+++ b/libweston-desktop/wl-shell.c
@@ -56,6 +56,7 @@ struct weston_desktop_wl_shell_surface {
bool added;
struct weston_desktop_seat *popup_seat;
enum weston_desktop_wl_shell_surface_state state;
+ struct wl_listener wl_surface_resource_destroy_listener;
};
static void
@@ -185,6 +186,8 @@ weston_desktop_wl_shell_surface_destroy(struct weston_desktop_surface *dsurface,
{
struct weston_desktop_wl_shell_surface *surface = user_data;
+ wl_list_remove(&surface->wl_surface_resource_destroy_listener.link);
+
weston_desktop_wl_shell_surface_maybe_ungrab(surface);
weston_desktop_surface_unset_relative_to(surface->surface);
if (surface->added)
@@ -404,6 +407,19 @@ static const struct weston_desktop_surface_implementation weston_desktop_wl_shel
};
static void
+wl_surface_resource_destroyed(struct wl_listener *listener,
+ void *data)
+{
+ struct weston_desktop_wl_shell_surface *surface =
+ wl_container_of(listener, surface,
+ wl_surface_resource_destroy_listener);
+
+ /* the wl_shell_surface spec says that wl_shell_surfaces are to be
+ * destroyed automatically when the wl_surface is destroyed. */
+ weston_desktop_surface_destroy(surface->surface);
+}
+
+static void
weston_desktop_wl_shell_protocol_get_shell_surface(struct wl_client *wl_client,
struct wl_resource *resource,
uint32_t id,
@@ -435,6 +451,11 @@ weston_desktop_wl_shell_protocol_get_shell_surface(struct wl_client *wl_client,
return;
}
+ surface->wl_surface_resource_destroy_listener.notify =
+ wl_surface_resource_destroyed;
+ wl_resource_add_destroy_listener(wsurface->resource,
+ &surface->wl_surface_resource_destroy_listener);
+
surface->resource =
weston_desktop_surface_add_resource(surface->surface,
&wl_shell_surface_interface,