wayland/wl_shell: Dismiss popup when parent is destroyed

Dismiss the popup when the parent is destroyed, and do this in the
destructor of the parent object. This makes the parent destory listener
unnecessary, since we already handle the parent child unlinking
explicitly in the object destructor.

https://bugzilla.gnome.org/show_bug.cgi?id=763431
This commit is contained in:
Jonas Ådahl 2016-01-22 10:35:05 +08:00
parent 61c717abb3
commit a89aa1d8cc

View File

@ -69,6 +69,12 @@ wl_shell_surface_destructor (struct wl_resource *resource)
MetaWaylandSurface *child_surface = l->data; MetaWaylandSurface *child_surface = l->data;
child_surface->wl_shell.parent_surface = NULL; child_surface->wl_shell.parent_surface = NULL;
if (child_surface->popup.parent == surface)
{
meta_wayland_popup_dismiss (child_surface->popup.popup);
child_surface->popup.parent = NULL;
}
} }
if (surface->wl_shell.parent_surface) if (surface->wl_shell.parent_surface)
@ -84,7 +90,6 @@ wl_shell_surface_destructor (struct wl_resource *resource)
if (surface->popup.popup) if (surface->popup.popup)
{ {
wl_list_remove (&surface->popup.parent_destroy_listener.link);
surface->popup.parent = NULL; surface->popup.parent = NULL;
meta_wayland_popup_dismiss (surface->popup.popup); meta_wayland_popup_dismiss (surface->popup.popup);
@ -252,17 +257,6 @@ wl_shell_surface_set_fullscreen (struct wl_client *client,
META_WL_SHELL_SURFACE_STATE_FULLSCREEN); META_WL_SHELL_SURFACE_STATE_FULLSCREEN);
} }
static void
handle_wl_shell_popup_parent_destroyed (struct wl_listener *listener,
void *data)
{
MetaWaylandSurface *surface =
wl_container_of (listener, surface, popup.parent_destroy_listener);
wl_list_remove (&surface->popup.parent_destroy_listener.link);
surface->popup.parent = NULL;
}
static void static void
create_popup (MetaWaylandSurface *surface) create_popup (MetaWaylandSurface *surface)
{ {
@ -300,7 +294,6 @@ wl_shell_surface_set_popup (struct wl_client *client,
if (surface->popup.popup) if (surface->popup.popup)
{ {
surface->popup.parent = NULL; surface->popup.parent = NULL;
wl_list_remove (&surface->popup.parent_destroy_listener.link);
meta_wayland_popup_dismiss (surface->popup.popup); meta_wayland_popup_dismiss (surface->popup.popup);
} }
@ -314,12 +307,6 @@ wl_shell_surface_set_popup (struct wl_client *client,
return; return;
} }
surface->popup.parent = parent_surf;
surface->popup.parent_destroy_listener.notify =
handle_wl_shell_popup_parent_destroyed;
wl_resource_add_destroy_listener (parent_surf->resource,
&surface->popup.parent_destroy_listener);
set_wl_shell_surface_parent (surface, parent_surf); set_wl_shell_surface_parent (surface, parent_surf);
surface->wl_shell.popup_seat = seat; surface->wl_shell.popup_seat = seat;
surface->wl_shell.x = x; surface->wl_shell.x = x;