xwm: introduce associate/dissociate events

We'll soon introduce a unified wlr_surface map event. Up until now, compositors
have been using wlr_xwayland_surface's map event to setup various wlr_surface
related listeners (e.g. commit). This will no longer be possible when that
event is moved over to wlr_surface. Introduce new events where the compositor
can add/remove wlr_surface event listeners.
This commit is contained in:
Kirill Primak 2023-03-11 14:01:02 +03:00 committed by Simon Ser
parent 2d6a09d9f0
commit 75d03f2b68
2 changed files with 9 additions and 0 deletions

View file

@ -150,6 +150,9 @@ struct wlr_xwayland_surface {
struct wl_signal request_fullscreen; struct wl_signal request_fullscreen;
struct wl_signal request_activate; struct wl_signal request_activate;
struct wl_signal associate;
struct wl_signal dissociate;
struct wl_signal map; struct wl_signal map;
struct wl_signal unmap; struct wl_signal unmap;
struct wl_signal set_title; struct wl_signal set_title;

View file

@ -171,6 +171,8 @@ static struct wlr_xwayland_surface *xwayland_surface_create(
wl_signal_init(&surface->events.request_maximize); wl_signal_init(&surface->events.request_maximize);
wl_signal_init(&surface->events.request_fullscreen); wl_signal_init(&surface->events.request_fullscreen);
wl_signal_init(&surface->events.request_activate); wl_signal_init(&surface->events.request_activate);
wl_signal_init(&surface->events.associate);
wl_signal_init(&surface->events.dissociate);
wl_signal_init(&surface->events.map); wl_signal_init(&surface->events.map);
wl_signal_init(&surface->events.unmap); wl_signal_init(&surface->events.unmap);
wl_signal_init(&surface->events.set_class); wl_signal_init(&surface->events.set_class);
@ -399,6 +401,8 @@ static void xwayland_surface_dissociate(struct wlr_xwayland_surface *xsurface) {
xwayland_surface_set_mapped(xsurface, false); xwayland_surface_set_mapped(xsurface, false);
if (xsurface->surface != NULL) { if (xsurface->surface != NULL) {
wl_signal_emit_mutable(&xsurface->events.dissociate, NULL);
wl_list_remove(&xsurface->surface_commit.link); wl_list_remove(&xsurface->surface_commit.link);
wl_list_remove(&xsurface->surface_precommit.link); wl_list_remove(&xsurface->surface_precommit.link);
wlr_addon_finish(&xsurface->surface_addon); wlr_addon_finish(&xsurface->surface_addon);
@ -962,6 +966,8 @@ static void xwayland_surface_associate(struct wlr_xwm *xwm,
if (xwm->xres) { if (xwm->xres) {
read_surface_client_id(xwm, xsurface); read_surface_client_id(xwm, xsurface);
} }
wl_signal_emit_mutable(&xsurface->events.associate, NULL);
} }
static void xwm_handle_create_notify(struct wlr_xwm *xwm, static void xwm_handle_create_notify(struct wlr_xwm *xwm,