aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 a7afb900..fd6384e0 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 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;
}
}