diff --git a/lunarwm/init.lua b/lunarwm/init.lua index b8da509..05f4699 100644 --- a/lunarwm/init.lua +++ b/lunarwm/init.lua @@ -9,7 +9,11 @@ return { }, }, keybindings = { - { bind = main("Escape"), action = lunar.quit_compositor }, + { bind = main("Shift-Q"), action = lunar.quit_compositor }, { bind = main("Shift-R"), action = lunar.reload_config }, }, + space = { + offset = { 0, 0, 0 }, + radius = 0.7, + }, } diff --git a/src/LunarWM.c b/src/LunarWM.c index ca35e22..6f21954 100644 --- a/src/LunarWM.c +++ b/src/LunarWM.c @@ -1050,6 +1050,12 @@ static bool init_xr(LunarWM *this) } } + free(extension_properties); + free(a_view_config_types); + free(a_swapchain_formats); + free(a_environment_blend_modes); + vector_free(v_active_instance_extensions); + return true; } @@ -1141,14 +1147,165 @@ bool LunarWM_init(LunarWM *this) this->initialized = true; - // FIXME: Cleanup. - return true; } +static void free_swapchain_info(LunarWM_SwapchainInfo *sc) +{ + if (!sc) + return; + if (sc->v_image_views) { + for (size_t i = 0; i < vector_size(sc->v_image_views); ++i) { + GLuint fb = sc->v_image_views[i]; + if (fb) + glDeleteFramebuffers(1, &fb); + } + vector_free(sc->v_image_views); + sc->v_image_views = NULL; + } + if (sc->swapchain) { + xrDestroySwapchain(sc->swapchain); + sc->swapchain = XR_NULL_HANDLE; + } +} + +static void cleanup_xr(LunarWM *this) +{ + for (int i = 0; i < 2; ++i) { + if (this->xr.swapchain_images[i].a_imgs) { + free(this->xr.swapchain_images[i].a_imgs); + this->xr.swapchain_images[i].a_imgs = NULL; + this->xr.swapchain_images[i].a_imgs_count = 0; + } + } + + if (this->xr.swapchains.v_color) { + for (size_t i = 0; i < vector_size(this->xr.swapchains.v_color); ++i) + free_swapchain_info(&this->xr.swapchains.v_color[i]); + vector_free(this->xr.swapchains.v_color); + this->xr.swapchains.v_color = NULL; + } + if (this->xr.swapchains.v_depth) { + for (size_t i = 0; i < vector_size(this->xr.swapchains.v_depth); ++i) + free_swapchain_info(&this->xr.swapchains.v_depth[i]); + vector_free(this->xr.swapchains.v_depth); + this->xr.swapchains.v_depth = NULL; + } + + if (this->renderer.fbo) { + glDeleteFramebuffers(1, &this->renderer.fbo); + this->renderer.fbo = 0; + } + this->renderer.tmp_rt = (RenderTexture2D) { 0 }; + + if (this->xr.view_space) + xrDestroySpace(this->xr.view_space), + this->xr.view_space = XR_NULL_HANDLE; + if (this->xr.local_space) + xrDestroySpace(this->xr.local_space), + this->xr.local_space = XR_NULL_HANDLE; + + for (size_t i = 0; i < 2; ++i) { + if (this->xr.hands[i].hand_tracker && this->xr.DestroyHandTrackerEXT) + this->xr.DestroyHandTrackerEXT(this->xr.hands[i].hand_tracker); + this->xr.hands[i].hand_tracker = XR_NULL_HANDLE; + } + + if (this->xr.a_view_configuration_views) { + free(this->xr.a_view_configuration_views); + this->xr.a_view_configuration_views = NULL; + this->xr.view_configuration_views_count = 0; + } + + if (this->xr.session != XR_NULL_HANDLE) { + if (this->xr.session_running) + xrEndSession(this->xr.session); + xrDestroySession(this->xr.session); + this->xr.session = XR_NULL_HANDLE; + this->xr.session_running = false; + } + + if (this->xr.instance) + xrDestroyInstance(this->xr.instance), + this->xr.instance = XR_NULL_HANDLE; +} + +static void cleanup_wayland(LunarWM *this) +{ + if (this->wayland.v_toplevels) { + for (size_t i = 0; i < vector_size(this->wayland.v_toplevels); ++i) { + if (this->wayland.v_toplevels[i]) { + LunarWM_Toplevel_destroy(this->wayland.v_toplevels[i]); + free(this->wayland.v_toplevels[i]); + } + } + vector_free(this->wayland.v_toplevels); + this->wayland.v_toplevels = NULL; + } + + if (this->wayland.cursor) { + wlr_cursor_destroy(this->wayland.cursor); + this->wayland.cursor = NULL; + } + + if (this->wayland.seat) { + wlr_seat_destroy(this->wayland.seat); + this->wayland.seat = NULL; + } + + if (this->wayland.allocator) { + wlr_allocator_destroy(this->wayland.allocator); + this->wayland.allocator = NULL; + } + if (this->wayland.renderer) { + wlr_renderer_destroy(this->wayland.renderer); + this->wayland.renderer = NULL; + } + if (this->wayland.session) { + wlr_session_destroy(this->wayland.session); + this->wayland.session = NULL; + } + + if (this->wayland.backend) { + wlr_backend_destroy(this->wayland.backend); + this->wayland.backend = NULL; + } + + if (this->wayland.display) { + wl_display_destroy(this->wayland.display); + this->wayland.display = NULL; + } +} + +static void cleanup_lua_cfg(LunarWM *this) +{ + if (this->cman) { + config_manager_destroy(this->cman); + this->cman = NULL; + } +} + +static void cleanup_raylib_egl(LunarWM *this) +{ + if (IsWindowReady()) { + CloseWindow(); + } +} + void LunarWM_destroy(LunarWM *this) { - // FIXME: Cleanup. + if (!this) + return; + + eglMakeCurrent(this->wayland.egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, + this->wayland.egl_context); + + cleanup_xr(this); + cleanup_raylib_egl(this); + cleanup_wayland(this); + cleanup_lua_cfg(this); + + memset(this, 0, sizeof(*this)); } void LunarWM_terminate(LunarWM *this)