commit 1846944f0454fec08ad91a04ab04e3b1ffcd1764
parent 1dc661af176d80db8b283e9c38fd127f71d33052
Author: Alexander Orzechowski <alex@ozal.ski>
Date: Tue, 23 Jan 2024 10:17:26 -0500
xdg_shell: Extract struct for popup descriptor
Diffstat:
4 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
@@ -177,6 +177,11 @@ struct sway_xwayland_unmanaged {
};
#endif
+struct sway_popup_desc {
+ struct wlr_scene_node *relative;
+ struct sway_view *view;
+};
+
struct sway_xdg_popup {
struct sway_view *view;
@@ -184,6 +189,8 @@ struct sway_xdg_popup {
struct wlr_scene_tree *xdg_surface_tree;
struct wlr_xdg_popup *wlr_xdg_popup;
+ struct sway_popup_desc desc;
+
struct wl_listener surface_commit;
struct wl_listener new_popup;
struct wl_listener destroy;
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
@@ -609,17 +609,15 @@ static void arrange_output(struct sway_output *output, int width, int height) {
void arrange_popups(struct wlr_scene_tree *popups) {
struct wlr_scene_node *node;
wl_list_for_each(node, &popups->children, link) {
- struct sway_xdg_popup *popup = scene_descriptor_try_get(node,
+ 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) {
- struct wlr_scene_tree *tree = popup->view->content_tree;
-
int lx, ly;
- wlr_scene_node_coords(&tree->node, &lx, &ly);
- wlr_scene_node_set_position(&popup->scene_tree->node, lx, ly);
+ wlr_scene_node_coords(popup->relative, &lx, &ly);
+ wlr_scene_node_set_position(node, lx, ly);
}
}
}
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
@@ -97,8 +97,11 @@ static struct sway_xdg_popup *popup_create(struct wlr_xdg_popup *wlr_popup,
return NULL;
}
+ popup->desc.relative = &view->content_tree->node;
+ popup->desc.view = view;
+
if (!scene_descriptor_assign(&popup->scene_tree->node,
- SWAY_SCENE_DESC_POPUP, popup)) {
+ SWAY_SCENE_DESC_POPUP, &popup->desc)) {
sway_log(SWAY_ERROR, "Failed to allocate a popup scene descriptor");
wlr_scene_node_destroy(&popup->scene_tree->node);
free(popup);
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
@@ -90,7 +90,7 @@ struct sway_node *node_at_coords(
}
if (!con) {
- struct sway_xdg_popup *popup =
+ struct sway_popup_desc *popup =
scene_descriptor_try_get(current, SWAY_SCENE_DESC_POPUP);
if (popup) {
con = popup->view->container;