diff options
author | Simon Ser <contact@emersion.fr> | 2023-12-05 17:04:12 +0100 |
---|---|---|
committer | Kirill Primak <vyivel@eclair.cafe> | 2023-12-06 23:24:44 +0300 |
commit | bf2b79b2845a070d84aafaf95e6cfcf9af7eeb9b (patch) | |
tree | e1ddc77b37708f35a8c1fbc8f31a288e71bdae57 | |
parent | ae3acf26f81c0d46f065aeb4860922883a97e1d0 (diff) |
desktop/xwayland: correctly handle association on o-r change
When override-redirect changes, we need to setup/teardown listeners,
just like we do for map.
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3773
-rw-r--r-- | sway/desktop/xwayland.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index a52cf4ad..2c6184fd 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -170,6 +170,7 @@ static void unmanaged_handle_destroy(struct wl_listener *listener, void *data) { } static void handle_map(struct wl_listener *listener, void *data); +static void handle_associate(struct wl_listener *listener, void *data); struct sway_xwayland_view *create_xwayland_view(struct wlr_xwayland_surface *xsurface); @@ -178,14 +179,22 @@ static void unmanaged_handle_override_redirect(struct wl_listener *listener, voi wl_container_of(listener, surface, override_redirect); struct wlr_xwayland_surface *xsurface = surface->wlr_xwayland_surface; - bool mapped = xsurface->surface != NULL && xsurface->surface->mapped; + bool associated = xsurface->surface != NULL; + bool mapped = associated && xsurface->surface->mapped; if (mapped) { unmanaged_handle_unmap(&surface->unmap, NULL); } + if (associated) { + unmanaged_handle_dissociate(&surface->dissociate, NULL); + } unmanaged_handle_destroy(&surface->destroy, NULL); xsurface->data = NULL; + struct sway_xwayland_view *xwayland_view = create_xwayland_view(xsurface); + if (associated) { + handle_associate(&xwayland_view->associate, NULL); + } if (mapped) { handle_map(&xwayland_view->map, xsurface); } @@ -531,20 +540,30 @@ static void handle_map(struct wl_listener *listener, void *data) { transaction_commit_dirty(); } +static void handle_dissociate(struct wl_listener *listener, void *data); + static void handle_override_redirect(struct wl_listener *listener, void *data) { struct sway_xwayland_view *xwayland_view = wl_container_of(listener, xwayland_view, override_redirect); struct sway_view *view = &xwayland_view->view; struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface; - bool mapped = xsurface->surface != NULL && xsurface->surface->mapped; + bool associated = xsurface->surface != NULL; + bool mapped = associated && xsurface->surface->mapped; if (mapped) { handle_unmap(&xwayland_view->unmap, NULL); } + if (associated) { + handle_dissociate(&xwayland_view->dissociate, NULL); + } handle_destroy(&xwayland_view->destroy, view); xsurface->data = NULL; + struct sway_xwayland_unmanaged *unmanaged = create_unmanaged(xsurface); + if (associated) { + unmanaged_handle_associate(&unmanaged->associate, NULL); + } if (mapped) { unmanaged_handle_map(&unmanaged->map, xsurface); } |