diff options
| author | Furkan Sahin <furkan-dev@proton.me> | 2019-02-05 19:07:01 +0100 |
|---|---|---|
| committer | Furkan Sahin <furkan-dev@proton.me> | 2019-02-05 19:07:01 +0100 |
| commit | 4f953b52e282f1dc629c2b7fff57a243e0a13656 (patch) | |
| tree | 6fc82f57acad787472ea2b413b643e58cd7acc94 | |
| parent | 12bbae917da8b9c08c47130033da8053bf9fd325 (diff) | |
Fix close_popups for xdg-shell
wlr_xdg_popup_destroy will destroy popups, so we need to walk the tree
carefully. It's enough to just destroy all direct children, since destroying
the parent will also destroy all children.
| -rw-r--r-- | sway/desktop/xdg_shell.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index 152bd26f..ce6fe41a 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c @@ -236,19 +236,11 @@ static void _close(struct sway_view *view) { } } -static void close_popups_iterator(struct wlr_surface *surface, - int sx, int sy, void *data) { - struct wlr_xdg_surface *xdg_surface = - wlr_xdg_surface_from_wlr_surface(surface); - if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP - && xdg_surface->popup) { - wlr_xdg_popup_destroy(xdg_surface); - } -} - static void close_popups(struct sway_view *view) { - wlr_xdg_surface_for_each_popup(view->wlr_xdg_surface, - close_popups_iterator, NULL); + struct wlr_xdg_popup *popup, *tmp; + wl_list_for_each_safe(popup, tmp, &view->wlr_xdg_surface->popups, link) { + wlr_xdg_popup_destroy(popup->base); + } } static void destroy(struct sway_view *view) { |
