diff options
author | Alexander Orzechowski <alex@ozal.ski> | 2024-01-23 10:17:37 -0500 |
---|---|---|
committer | Kirill Primak <vyivel@eclair.cafe> | 2024-02-12 19:19:22 +0300 |
commit | 09c360d503eb7309de46af3745001df7dd911438 (patch) | |
tree | d69bb2e93c2a241b14f5a2140420535a15b4e75d /sway | |
parent | 1846944f0454fec08ad91a04ab04e3b1ffcd1764 (diff) |
layer_shell: Handle popups through popup descriptor
We tried to synchronize layer shell popups with the parent layer shell
on commits, but this is subtly wrong because we would only update
the position for one layer shell that was committed, but not any other
layer that might be affected. By moving handling to the scene descriptor
we can iterate all popups and ensure they are synchronized.
Diffstat (limited to 'sway')
-rw-r--r-- | sway/desktop/layer_shell.c | 14 | ||||
-rw-r--r-- | sway/desktop/transaction.c | 10 | ||||
-rw-r--r-- | sway/input/cursor.c | 2 |
3 files changed, 14 insertions, 12 deletions
diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index 9a35ef95..769d3a86 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 e3196e3a..fd1c3d3a 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 f25439cb..25fa603e 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; } } |