diff --git a/src/wayland/meta-wayland-popup.c b/src/wayland/meta-wayland-popup.c index 93fea932e..6c4b78425 100644 --- a/src/wayland/meta-wayland-popup.c +++ b/src/wayland/meta-wayland-popup.c @@ -62,7 +62,6 @@ struct _MetaWaylandPopupGrab struct _MetaWaylandPopup { MetaWaylandPopupGrab *grab; - struct wl_listener surface_destroy_listener; MetaWaylandPopupSurface *popup_surface; struct wl_list link; }; @@ -231,7 +230,6 @@ meta_wayland_popup_destroy (MetaWaylandPopup *popup) { meta_wayland_popup_surface_dismiss (popup->popup_surface); - wl_list_remove (&popup->surface_destroy_listener.link); wl_list_remove (&popup->link); g_slice_free (MetaWaylandPopup, popup); } @@ -253,16 +251,6 @@ meta_wayland_popup_get_top_popup (MetaWaylandPopup *popup) return meta_wayland_popup_grab_get_top_popup (popup->grab); } -static void -on_popup_surface_destroy (struct wl_listener *listener, - void *data) -{ - MetaWaylandPopup *popup = - wl_container_of (listener, popup, surface_destroy_listener); - - meta_wayland_popup_dismiss (popup); -} - MetaWaylandPopup * meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface, MetaWaylandPopupGrab *grab) @@ -278,17 +266,6 @@ meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface, popup = g_slice_new0 (MetaWaylandPopup); popup->grab = grab; popup->popup_surface = popup_surface; - popup->surface_destroy_listener.notify = on_popup_surface_destroy; - if (surface->xdg_popup) - { - wl_resource_add_destroy_listener (surface->xdg_popup, - &popup->surface_destroy_listener); - } - else if (surface->wl_shell_surface) - { - wl_resource_add_destroy_listener (surface->wl_shell_surface, - &popup->surface_destroy_listener); - } wl_list_insert (&grab->all_popups, &popup->link); diff --git a/src/wayland/meta-wayland-wl-shell.c b/src/wayland/meta-wayland-wl-shell.c index c3f40bf1a..6b1d16733 100644 --- a/src/wayland/meta-wayland-wl-shell.c +++ b/src/wayland/meta-wayland-wl-shell.c @@ -61,6 +61,9 @@ wl_shell_surface_destructor (struct wl_resource *resource) meta_wayland_compositor_destroy_frame_callbacks (surface->compositor, surface); + if (surface->popup.popup) + meta_wayland_popup_dismiss (surface->popup.popup); + for (l = surface->wl_shell.children; l; l = l->next) { MetaWaylandSurface *child_surface = l->data; @@ -168,6 +171,13 @@ wl_shell_surface_set_state (MetaWaylandSurface *surface, if (surface->window && old_state != state) { + if (old_state == META_WL_SHELL_SURFACE_STATE_POPUP && + surface->popup.popup) + { + meta_wayland_popup_dismiss (surface->popup.popup); + surface->popup.popup = NULL; + } + if (state == META_WL_SHELL_SURFACE_STATE_FULLSCREEN) meta_window_make_fullscreen (surface->window); else @@ -498,7 +508,10 @@ wl_shell_surface_role_commit (MetaWaylandSurfaceRole *surface_role, } else if (!surface->buffer_ref.buffer && window) { - meta_wayland_surface_destroy_window (surface); + if (surface->popup.popup) + meta_wayland_popup_dismiss (surface->popup.popup); + else + meta_wayland_surface_destroy_window (surface); return; }