]> git.mdlowis.com Git - proto/labwc.git/commitdiff
src/layers.c: Update output for popup after forced move
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Fri, 17 Jun 2022 00:41:34 +0000 (02:41 +0200)
committerJohan Malm <johanmalm@users.noreply.github.com>
Fri, 17 Jun 2022 05:08:06 +0000 (06:08 +0100)
Fixes #369

src/layers.c

index 8c11e1f518238255276b9b6e5ad03f308271ed4b..d36e11a50dd3b8c7d975f109ff1cf7b7c6b1c9da 100644 (file)
@@ -246,16 +246,24 @@ new_popup_notify(struct wl_listener *listener, void *data)
        struct lab_layer_surface *toplevel =
                wl_container_of(listener, toplevel, new_popup);
        struct wlr_xdg_popup *wlr_popup = data;
-       struct output *output =
-               toplevel->scene_layer_surface->layer_surface->output->data;
+
+       int lx, ly;
+       struct server *server = toplevel->server;
+       struct wlr_scene_layer_surface_v1 *surface = toplevel->scene_layer_surface;
+       wlr_scene_node_coords(&surface->tree->node, &lx, &ly);
+
+       if (!surface->layer_surface->output) {
+               /* Work-around for moving layer shell surfaces on output destruction */
+               struct wlr_output *wlr_output;
+               wlr_output = wlr_output_layout_output_at(server->output_layout, lx, ly);
+               surface->layer_surface->output = wlr_output;
+       }
+       struct output *output = surface->layer_surface->output->data;
 
        struct wlr_box output_box = { 0 };
-       wlr_output_layout_get_box(output->server->output_layout,
+       wlr_output_layout_get_box(server->output_layout,
                output->wlr_output, &output_box);
 
-       int lx, ly;
-       wlr_scene_node_coords(&toplevel->scene_layer_surface->tree->node, &lx, &ly);
-
        /*
         * Output geometry expressed in the coordinate system of the toplevel
         * parent of popup. We store this struct the lab_layer_popup struct
@@ -269,11 +277,10 @@ new_popup_notify(struct wl_listener *listener, void *data)
                .height = output_box.height,
        };
        struct lab_layer_popup *popup = create_popup(wlr_popup,
-               toplevel->scene_layer_surface->tree,
-               &output_toplevel_sx_box);
+               surface->tree, &output_toplevel_sx_box);
        popup->output_toplevel_sx_box = output_toplevel_sx_box;
 
-       if (toplevel->scene_layer_surface->layer_surface->current.layer
+       if (surface->layer_surface->current.layer
                        == ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM) {
                move_popup_to_top_layer(toplevel, popup);
        }