]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xdg/xwayland: Do not destroy scene node on unmap
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Wed, 23 Feb 2022 00:32:07 +0000 (01:32 +0100)
committerJohan Malm <jgm323@gmail.com>
Wed, 23 Feb 2022 21:47:01 +0000 (21:47 +0000)
This prevents segfaulting when unminimizing

src/ssd/ssd.c
src/xdg.c
src/xwayland.c

index 14f0ee9589f076d77ff85efe4438e6c95fac62dd..677c2017f3945e391130bd0f24f030cf8e904472 100644 (file)
@@ -149,12 +149,10 @@ ssd_create(struct view *view)
 {
        if (view->ssd.tree) {
                /* SSD was hidden. Just enable it */
-               wlr_log(WLR_ERROR, "Unhiding SSD");
                wlr_scene_node_set_enabled(&view->ssd.tree->node, true);
                return;
        }
 
-       wlr_log(WLR_ERROR, "Creating SSD");
        view->ssd.tree = wlr_scene_tree_create(&view->scene_tree->node);
        wlr_scene_node_lower_to_bottom(&view->ssd.tree->node);
        ssd_extents_create(view);
@@ -224,8 +222,6 @@ ssd_destroy(struct view *view)
                return;
        }
 
-       wlr_log(WLR_ERROR, "Destroying SSD");
-
        /* Maybe reset focused view */
        if (view->server->ssd_focused_view == view) {
                view->server->ssd_focused_view = NULL;
index ee06781c81989fb9e60eef0b918e4325491f0edf..3b6178f3a2e26b12ba72378b2ff0caa05d3a7cba 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -299,8 +299,12 @@ xdg_toplevel_view_get_string_prop(struct view *view, const char *prop)
 static void
 xdg_toplevel_view_map(struct view *view)
 {
+       if (view->mapped) {
+               return;
+       }
        view->mapped = true;
        view->surface = view->xdg_surface->surface;
+       wlr_scene_node_set_enabled(&view->scene_tree->node, true);
        if (!view->been_mapped) {
                struct wlr_xdg_toplevel_requested *requested =
                        &view->xdg_surface->toplevel->requested;
@@ -340,9 +344,7 @@ xdg_toplevel_view_unmap(struct view *view)
 {
        if (view->mapped) {
                view->mapped = false;
-               damage_all_outputs(view->server);
-               wlr_scene_node_destroy(view->scene_node);
-               ssd_hide(view);
+               wlr_scene_node_set_enabled(&view->scene_tree->node, false);
                wl_list_remove(&view->commit.link);
                desktop_focus_topmost_mapped_view(view->server);
        }
@@ -391,14 +393,13 @@ xdg_surface_new(struct wl_listener *listener, void *data)
        view->xdg_surface = xdg_surface;
 
        view->scene_tree = wlr_scene_tree_create(&view->server->view_tree->node);
+       wlr_scene_node_set_enabled(&view->scene_tree->node, false);
 
        view->scene_node = wlr_scene_xdg_surface_create(
                &view->scene_tree->node, view->xdg_surface);
        if (!view->scene_node) {
-               wlr_scene_node_destroy(&view->scene_tree->node);
-               view->scene_tree = NULL;
+               /* TODO: might need further clean up */
                wl_resource_post_no_memory(view->surface->resource);
-               /* TODO: should we free(view) here? */
                return;
        }
        view->scene_tree->node.data = view;
index 59878d12b07230bdf53c5792d88b0e122ddf289b..fa4be0fac210f24b94056ca3c9c4ae271877dce2 100644 (file)
@@ -246,7 +246,11 @@ top_left_edge_boundary_check(struct view *view)
 static void
 map(struct view *view)
 {
+       if (view->mapped) {
+               return;
+       }
        view->mapped = true;
+       wlr_scene_node_set_enabled(&view->scene_tree->node, true);
        if (!view->fullscreen && view->xwayland_surface->fullscreen) {
                view_set_fullscreen(view, true, NULL);
        }
@@ -256,18 +260,17 @@ map(struct view *view)
                view->w = view->xwayland_surface->width;
                view->h = view->xwayland_surface->height;
        }
-       view->surface = view->xwayland_surface->surface;
 
-       view->scene_node = wlr_scene_subsurface_tree_create(
-               &view->scene_tree->node, view->surface);
-       if (!view->scene_node) {
-               wlr_scene_node_destroy(&view->scene_tree->node);
-               view->scene_tree = NULL;
-               wl_resource_post_no_memory(view->surface->resource);
-               /* TODO: should we free(view) here? */
-               return;
+       if (view->surface != view->xwayland_surface->surface) {
+               view->surface = view->xwayland_surface->surface;
+               view->scene_node = wlr_scene_subsurface_tree_create(
+                       &view->scene_tree->node, view->surface);
+               if (!view->scene_node) {
+                       /* TODO: might need further clean up */
+                       wl_resource_post_no_memory(view->surface->resource);
+                       return;
+               }
        }
-       view->scene_tree->node.data = view;
 
        view->ssd.enabled = want_deco(view);
 
@@ -308,9 +311,8 @@ unmap(struct view *view)
 {
        if (view->mapped) {
                view->mapped = false;
-               damage_all_outputs(view->server);
+               wlr_scene_node_set_enabled(&view->scene_tree->node, false);
                wl_list_remove(&view->commit.link);
-               ssd_hide(view);
                desktop_focus_topmost_mapped_view(view->server);
        }
 }
@@ -376,6 +378,7 @@ xwayland_surface_new(struct wl_listener *listener, void *data)
        view->xwayland_surface = xsurface;
 
        view->scene_tree = wlr_scene_tree_create(&view->server->view_tree->node);
+       view->scene_tree->node.data = view;
        xsurface->data = view;
 
        view->map.notify = handle_map;