@@ -9,7 +9,11 @@ return {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
keybindings = {
|
keybindings = {
|
||||||
{ bind = main("Escape"), action = lunar.quit_compositor },
|
{ bind = main("Shift-Q"), action = lunar.quit_compositor },
|
||||||
{ bind = main("Shift-R"), action = lunar.reload_config },
|
{ bind = main("Shift-R"), action = lunar.reload_config },
|
||||||
},
|
},
|
||||||
|
space = {
|
||||||
|
offset = { 0, 0, 0 },
|
||||||
|
radius = 0.7,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
163
src/LunarWM.c
163
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1141,14 +1147,165 @@ bool LunarWM_init(LunarWM *this)
|
|||||||
|
|
||||||
this->initialized = true;
|
this->initialized = true;
|
||||||
|
|
||||||
// FIXME: Cleanup.
|
|
||||||
|
|
||||||
return true;
|
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)
|
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)
|
void LunarWM_terminate(LunarWM *this)
|
||||||
|
|||||||
Reference in New Issue
Block a user