view: Set parent for view_child subsurfaces on init

view_child_init was calling view_init_subsurfaces, which did not set the
parent attribute for the subchildren. This lead to the subchildren
acting as standalone children. If the parent was an xdg_popup, this
would make the subchild unaware of the popup position.

Introduce view_child_init_subsurfaces for view_child_init to use
instead.

Closes: https://github.com/swaywm/sway/issues/6038
master
Kenny Levinsen 4 years ago committed by Simon Ser
parent 79e43b19d7
commit 1a6471be17

@ -465,6 +465,9 @@ static void view_subsurface_create(struct sway_view *view,
static void view_init_subsurfaces(struct sway_view *view, static void view_init_subsurfaces(struct sway_view *view,
struct wlr_surface *surface); struct wlr_surface *surface);
static void view_child_init_subsurfaces(struct sway_view_child *view_child,
struct wlr_surface *surface);
static void view_handle_surface_new_subsurface(struct wl_listener *listener, static void view_handle_surface_new_subsurface(struct wl_listener *listener,
void *data) { void *data) {
struct sway_view *view = struct sway_view *view =
@ -1033,6 +1036,14 @@ static void view_init_subsurfaces(struct sway_view *view,
} }
} }
static void view_child_init_subsurfaces(struct sway_view_child *view_child,
struct wlr_surface *surface) {
struct wlr_subsurface *subsurface;
wl_list_for_each(subsurface, &surface->subsurfaces, parent_link) {
view_child_subsurface_create(view_child, subsurface);
}
}
static void view_child_handle_surface_map(struct wl_listener *listener, static void view_child_handle_surface_map(struct wl_listener *listener,
void *data) { void *data) {
struct sway_view_child *child = struct sway_view_child *child =
@ -1088,7 +1099,7 @@ void view_child_init(struct sway_view_child *child,
wlr_surface_send_enter(child->surface, workspace->output->wlr_output); wlr_surface_send_enter(child->surface, workspace->output->wlr_output);
} }
view_init_subsurfaces(child->view, surface); view_child_init_subsurfaces(child, surface);
} }
void view_child_destroy(struct sway_view_child *child) { void view_child_destroy(struct sway_view_child *child) {

Loading…
Cancel
Save