summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orzechowski <alex@ozal.ski>2024-01-23 10:17:37 -0500
committerKirill Primak <vyivel@eclair.cafe>2024-02-12 19:19:22 +0300
commit09c360d503eb7309de46af3745001df7dd911438 (patch)
treed69bb2e93c2a241b14f5a2140420535a15b4e75d
parent1846944f0454fec08ad91a04ab04e3b1ffcd1764 (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.
-rw-r--r--include/sway/layers.h5
-rw-r--r--sway/desktop/layer_shell.c14
-rw-r--r--sway/desktop/transaction.c10
-rw-r--r--sway/input/cursor.c2
4 files changed, 18 insertions, 13 deletions
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 <stdbool.h>
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_layer_shell_v1.h>
+#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;
}
}