xwyland/xwm: simplify unpaired_link handling

Always keep it initialized, so that we don't have to check for
xsurface->surface_id.

Will help with WL_SURFACE_SERIAL support, which adds a new way for
a surface to be unpaired.
This commit is contained in:
Simon Ser 2022-10-18 14:31:05 +02:00
parent c6d8a11d2c
commit 2ee59e1a08

View file

@ -159,6 +159,7 @@ static struct wlr_xwayland_surface *xwayland_surface_create(
wl_list_init(&surface->children); wl_list_init(&surface->children);
wl_list_init(&surface->stack_link); wl_list_init(&surface->stack_link);
wl_list_init(&surface->parent_link); wl_list_init(&surface->parent_link);
wl_list_init(&surface->unpaired_link);
wl_signal_init(&surface->events.destroy); wl_signal_init(&surface->events.destroy);
wl_signal_init(&surface->events.request_configure); wl_signal_init(&surface->events.request_configure);
wl_signal_init(&surface->events.request_move); wl_signal_init(&surface->events.request_move);
@ -406,9 +407,7 @@ static void xwayland_surface_destroy(
child->parent = NULL; child->parent = NULL;
} }
if (xsurface->surface_id) { wl_list_remove(&xsurface->unpaired_link);
wl_list_remove(&xsurface->unpaired_link);
}
if (xsurface->surface) { if (xsurface->surface) {
wl_list_remove(&xsurface->surface_destroy.link); wl_list_remove(&xsurface->surface_destroy.link);
@ -879,6 +878,10 @@ static void xwm_map_shell_surface(struct wlr_xwm *xwm,
return; return;
} }
wl_list_remove(&xsurface->unpaired_link);
wl_list_init(&xsurface->unpaired_link);
xsurface->surface_id = 0;
xsurface->surface = surface; xsurface->surface = surface;
// read all surface properties // read all surface properties
@ -913,13 +916,12 @@ static void xsurface_unmap(struct wlr_xwayland_surface *surface) {
xwm_set_net_client_list(surface->xwm); xwm_set_net_client_list(surface->xwm);
} }
if (surface->surface_id) { // Make sure we're not on the unpaired surface list or we
// Make sure we're not on the unpaired surface list or we // could be assigned a surface during surface creation that
// could be assigned a surface during surface creation that // was mapped before this unmap request.
// was mapped before this unmap request. wl_list_remove(&surface->unpaired_link);
wl_list_remove(&surface->unpaired_link); wl_list_init(&surface->unpaired_link);
surface->surface_id = 0; surface->surface_id = 0;
}
if (surface->surface) { if (surface->surface) {
wl_list_remove(&surface->surface_destroy.link); wl_list_remove(&surface->surface_destroy.link);
@ -1129,6 +1131,7 @@ static void xwm_handle_surface_id_message(struct wlr_xwm *xwm,
xwm_map_shell_surface(xwm, xsurface, surface); xwm_map_shell_surface(xwm, xsurface, surface);
} else { } else {
xsurface->surface_id = id; xsurface->surface_id = id;
wl_list_remove(&xsurface->unpaired_link);
wl_list_insert(&xwm->unpaired_surfaces, &xsurface->unpaired_link); wl_list_insert(&xwm->unpaired_surfaces, &xsurface->unpaired_link);
} }
} }
@ -1655,8 +1658,6 @@ static void handle_compositor_new_surface(struct wl_listener *listener,
wl_list_for_each(xsurface, &xwm->unpaired_surfaces, unpaired_link) { wl_list_for_each(xsurface, &xwm->unpaired_surfaces, unpaired_link) {
if (xsurface->surface_id == surface_id) { if (xsurface->surface_id == surface_id) {
xwm_map_shell_surface(xwm, xsurface, surface); xwm_map_shell_surface(xwm, xsurface, surface);
xsurface->surface_id = 0;
wl_list_remove(&xsurface->unpaired_link);
xcb_flush(xwm->xcb_conn); xcb_flush(xwm->xcb_conn);
return; return;
} }