diff --git a/include/view-impl-common.h b/include/view-impl-common.h index 8bb6aba5..77ffcdc9 100644 --- a/include/view-impl-common.h +++ b/include/view-impl-common.h @@ -20,6 +20,9 @@ void view_impl_map(struct view *view); */ void view_impl_apply_geometry(struct view *view, int w, int h); +void view_init(struct view *view); +void view_destroy(struct view *view); + void view_impl_remove_common_listeners(struct view *view); #endif /* __LABWC_VIEW_IMPL_COMMON_H */ diff --git a/include/view.h b/include/view.h index b0d02b43..631ceeb8 100644 --- a/include/view.h +++ b/include/view.h @@ -202,9 +202,6 @@ void view_adjust_size(struct view *view, int *w, int *h); void view_evacuate_region(struct view *view); void view_on_output_destroy(struct view *view); -void view_init(struct view *view); -void view_destroy(struct view *view); - /* xdg.c */ struct wlr_xdg_surface *xdg_surface_from_view(struct view *view); diff --git a/src/view-impl-common.c b/src/view-impl-common.c index 725c2792..08d0caae 100644 --- a/src/view-impl-common.c +++ b/src/view-impl-common.c @@ -1,11 +1,17 @@ // SPDX-License-Identifier: GPL-2.0-only /* view-impl-common.c: common code for shell view->impl functions */ +#include #include #include #include "common/list.h" +#include "common/mem.h" #include "labwc.h" +#include "menu/menu.h" +#include "node.h" +#include "ssd.h" #include "view.h" #include "view-impl-common.h" +#include "workspaces.h" void view_impl_move_to_front(struct view *view) @@ -101,3 +107,90 @@ view_impl_remove_common_listeners(struct view *view) wl_list_remove(&view->request_fullscreen.link); wl_list_remove(&view->set_title.link); } + +void +view_init(struct view *view) +{ + assert(view); + + view->workspace = view->server->workspace_current; + view->scene_tree = wlr_scene_tree_create(view->workspace->tree); + wlr_scene_node_set_enabled(&view->scene_tree->node, false); + node_descriptor_create(&view->scene_tree->node, + LAB_NODE_DESC_VIEW, view); + + view->impl->setup_common_listeners(view); + view->impl->setup_specific_listeners(view); + + wl_list_insert(&view->server->views, &view->link); +} + +void +view_destroy(struct view *view) +{ + assert(view); + struct server *server = view->server; + bool need_cursor_update = false; + + view->impl->remove_common_listeners(view); + view->impl->remove_specific_listeners(view); + + if (view->toplevel.handle) { + wlr_foreign_toplevel_handle_v1_destroy(view->toplevel.handle); + } + + if (server->grabbed_view == view) { + /* Application got killed while moving around */ + server->input_mode = LAB_INPUT_STATE_PASSTHROUGH; + server->grabbed_view = NULL; + need_cursor_update = true; + regions_hide_overlay(&server->seat); + } + + if (server->focused_view == view) { + server->focused_view = NULL; + need_cursor_update = true; + } + + if (server->seat.pressed.view == view) { + seat_reset_pressed(&server->seat); + } + + if (view->tiled_region_evacuate) { + zfree(view->tiled_region_evacuate); + } + + osd_on_view_destroy(view); + ssd_destroy(view->ssd); + view->ssd = NULL; + + if (view->scene_tree) { + wlr_scene_node_destroy(&view->scene_tree->node); + view->scene_tree = NULL; + } + + /* + * The layer-shell top-layer is disabled when an application is running + * in fullscreen mode, so if that's the case, we have to re-enable it + * here. + */ + if (view->fullscreen && view->output) { + uint32_t top = ZWLR_LAYER_SHELL_V1_LAYER_TOP; + wlr_scene_node_set_enabled(&view->output->layer_tree[top]->node, + true); + } + + /* If we spawned a window menu, close it */ + if (server->menu_current + && server->menu_current->triggered_by_view == view) { + menu_close_root(server); + } + + /* Remove view from server->views */ + wl_list_remove(&view->link); + free(view); + + if (need_cursor_update) { + cursor_update_focus(server); + } +} diff --git a/src/view.c b/src/view.c index bd95ba0e..b6ebac25 100644 --- a/src/view.c +++ b/src/view.c @@ -1047,89 +1047,3 @@ view_reload_ssd(struct view *view) decorate(view); } } - -void -view_init(struct view *view) -{ - assert(view); - - view->workspace = view->server->workspace_current; - view->scene_tree = wlr_scene_tree_create(view->workspace->tree); - wlr_scene_node_set_enabled(&view->scene_tree->node, false); - node_descriptor_create(&view->scene_tree->node, - LAB_NODE_DESC_VIEW, view); - - view->impl->setup_common_listeners(view); - view->impl->setup_specific_listeners(view); - - wl_list_insert(&view->server->views, &view->link); -} - -void -view_destroy(struct view *view) -{ - assert(view); - struct server *server = view->server; - bool need_cursor_update = false; - - view->impl->remove_common_listeners(view); - view->impl->remove_specific_listeners(view); - - if (view->toplevel.handle) { - wlr_foreign_toplevel_handle_v1_destroy(view->toplevel.handle); - } - - if (server->grabbed_view == view) { - /* Application got killed while moving around */ - server->input_mode = LAB_INPUT_STATE_PASSTHROUGH; - server->grabbed_view = NULL; - need_cursor_update = true; - regions_hide_overlay(&server->seat); - } - - if (server->focused_view == view) { - server->focused_view = NULL; - need_cursor_update = true; - } - - if (server->seat.pressed.view == view) { - seat_reset_pressed(&server->seat); - } - - if (view->tiled_region_evacuate) { - zfree(view->tiled_region_evacuate); - } - - osd_on_view_destroy(view); - undecorate(view); - - if (view->scene_tree) { - wlr_scene_node_destroy(&view->scene_tree->node); - view->scene_tree = NULL; - } - - /* - * The layer-shell top-layer is disabled when an application is running - * in fullscreen mode, so if that's the case, we have to re-enable it - * here. - */ - if (view->fullscreen && view->output) { - uint32_t top = ZWLR_LAYER_SHELL_V1_LAYER_TOP; - wlr_scene_node_set_enabled(&view->output->layer_tree[top]->node, - true); - } - - /* If we spawned a window menu, close it */ - if (server->menu_current - && server->menu_current->triggered_by_view == view) { - menu_close_root(server); - } - - /* Remove view from server->views */ - wl_list_remove(&view->link); - free(view); - - if (need_cursor_update) { - cursor_update_focus(server); - } -}