diff --git a/include/labwc.h b/include/labwc.h index 7446348e..f6430a88 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -404,7 +404,7 @@ void view_update_app_id(struct view *view); void view_impl_map(struct view *view); void view_adjust_size(struct view *view, int *w, int *h); -void view_handle_destroy(struct view *view); +void view_destroy(struct view *view); void foreign_toplevel_handle_create(struct view *view); diff --git a/src/view.c b/src/view.c index 6af744c0..22e03531 100644 --- a/src/view.c +++ b/src/view.c @@ -653,7 +653,7 @@ view_update_app_id(struct view *view) } void -view_handle_destroy(struct view *view) +view_destroy(struct view *view) { if (view->toplevel_handle) { wlr_foreign_toplevel_handle_v1_destroy(view->toplevel_handle); @@ -671,43 +671,25 @@ view_handle_destroy(struct view *view) view->server->cycle_view, LAB_CYCLE_DIR_BACKWARD); /* If we cycled back to ourselves, then we have no windows. - * just remove it and close the osd for good. */ - if (view->server->cycle_view == view) { + * just remove it and close the OSD for good. */ + if (view->server->cycle_view == view || !view->server->cycle_view) { view->server->cycle_view = NULL; osd_finish(view->server); } - } else if (view->server->cycle_view != NULL) { - /* If we have an OSD, but are not the cycled view, just - * update the OSD to reflect the view has now gone. */ + } + + if (view->server->cycle_view) { + /* Update the OSD to reflect the view has now gone. */ osd_update(view->server); } - if (view->type == LAB_XDG_SHELL_VIEW) { - view->xdg_surface = NULL; - } -#ifdef HAVE_XWAYLAND - if (view->type == LAB_XWAYLAND_VIEW) { - view->xwayland_surface = NULL; - } -#endif - - wl_list_remove(&view->link); - wl_list_remove(&view->destroy.link); -#ifdef HAVE_XWAYLAND - if (view->type == LAB_XWAYLAND_VIEW) { - wl_list_remove(&view->map.link); - wl_list_remove(&view->unmap.link); - wl_list_remove(&view->request_configure.link); - wl_list_remove(&view->request_maximize.link); - wl_list_remove(&view->request_fullscreen.link); - } -#endif - if (view->scene_tree) { ssd_destroy(view); wlr_scene_node_destroy(&view->scene_tree->node); view->scene_tree = NULL; } + /* Remove view from server->views */ + wl_list_remove(&view->link); free(view); } diff --git a/src/xdg.c b/src/xdg.c index e9f3179e..15d4d9c8 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -78,7 +78,16 @@ static void handle_destroy(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, destroy); - view_handle_destroy(view); + assert(view->type == LAB_XDG_SHELL_VIEW); + + /* Reset XDG specific surface for good measure */ + view->xdg_surface = NULL; + + /* Remove XDG specific handlers */ + wl_list_remove(&view->destroy.link); + + /* And finally destroy / free the view */ + view_destroy(view); } static void diff --git a/src/xwayland.c b/src/xwayland.c index 65b52696..986803be 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -96,7 +96,21 @@ static void handle_destroy(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, destroy); - view_handle_destroy(view); + assert(view->type == LAB_XWAYLAND_VIEW); + + /* Reset XWayland specific surface for good measure */ + view->xwayland_surface = NULL; + + /* Remove XWayland specific handlers */ + wl_list_remove(&view->map.link); + wl_list_remove(&view->unmap.link); + wl_list_remove(&view->request_configure.link); + wl_list_remove(&view->request_maximize.link); + wl_list_remove(&view->request_fullscreen.link); + wl_list_remove(&view->destroy.link); + + /* And finally destroy / free the view */ + view_destroy(view); } static void