diff --git a/src/ssd/ssd.c b/src/ssd/ssd.c index 14f0ee95..677c2017 100644 --- a/src/ssd/ssd.c +++ b/src/ssd/ssd.c @@ -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; diff --git a/src/xdg.c b/src/xdg.c index ee06781c..3b6178f3 100644 --- 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; diff --git a/src/xwayland.c b/src/xwayland.c index 59878d12..fa4be0fa 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -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;