mirror of
https://github.com/labwc/labwc.git
synced 2025-11-02 09:01:47 -05:00
xdg/xwayland: Do not destroy scene node on unmap
This prevents segfaulting when unminimizing
This commit is contained in:
parent
c2f7e0be3d
commit
29021dad6a
3 changed files with 22 additions and 22 deletions
|
|
@ -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;
|
||||
|
|
|
|||
13
src/xdg.c
13
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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue