diff --git a/include/sway/layers.h b/include/sway/layers.h index a7afb9001..fd6384e0e 100644 --- a/include/sway/layers.h +++ b/include/sway/layers.h @@ -3,6 +3,7 @@ #include #include #include +#include "sway/tree/view.h" struct sway_layer_surface { struct wl_listener map; @@ -14,10 +15,12 @@ struct sway_layer_surface { bool mapped; + struct wlr_scene_tree *popups; + struct sway_popup_desc desc; + struct sway_output *output; struct wlr_scene_layer_surface_v1 *scene; struct wlr_scene_tree *tree; - struct wlr_scene_tree *popups; struct wlr_layer_surface_v1 *layer_surface; }; diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index 9a35ef95a..769d3a865 100644 --- a/sway/desktop/layer_shell.c +++ b/sway/desktop/layer_shell.c @@ -122,6 +122,16 @@ static struct sway_layer_surface *sway_layer_surface_create( return NULL; } + surface->desc.relative = &scene->tree->node; + + if (!scene_descriptor_assign(&popups->node, + SWAY_SCENE_DESC_POPUP, &surface->desc)) { + sway_log(SWAY_ERROR, "Failed to allocate a popup scene descriptor"); + wlr_scene_node_destroy(&popups->node); + free(surface); + return NULL; + } + surface->tree = scene->tree; surface->scene = scene; surface->layer_surface = scene->layer_surface; @@ -224,10 +234,6 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) { arrange_layers(surface->output); transaction_commit_dirty(); } - - int lx, ly; - wlr_scene_node_coords(&surface->scene->tree->node, &lx, &ly); - wlr_scene_node_set_position(&surface->popups->node, lx, ly); } static void handle_map(struct wl_listener *listener, void *data) { diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index e3196e3af..fd1c3d3a1 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c @@ -612,13 +612,9 @@ void arrange_popups(struct wlr_scene_tree *popups) { struct sway_popup_desc *popup = scene_descriptor_try_get(node, SWAY_SCENE_DESC_POPUP); - // the popup layer may have popups from layer_shell surfaces, in this - // case those don't have a scene descriptor, so lets skip those here. - if (popup) { - int lx, ly; - wlr_scene_node_coords(popup->relative, &lx, &ly); - wlr_scene_node_set_position(node, lx, ly); - } + int lx, ly; + wlr_scene_node_coords(popup->relative, &lx, &ly); + wlr_scene_node_set_position(node, lx, ly); } } diff --git a/sway/input/cursor.c b/sway/input/cursor.c index f25439cbc..25fa603ef 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -92,7 +92,7 @@ struct sway_node *node_at_coords( if (!con) { struct sway_popup_desc *popup = scene_descriptor_try_get(current, SWAY_SCENE_DESC_POPUP); - if (popup) { + if (popup && popup->view) { con = popup->view->container; } }