diff --git a/src/main.c b/src/main.c index ce1915d..414f16b 100644 --- a/src/main.c +++ b/src/main.c @@ -57,8 +57,10 @@ int main(int argc, char *argv[]) { */ int main(int argc, char *argv[]) { - wn_window window = {0}; - if (!wn_window_init(&window)) { + Arena *global_arena = arena_init(NULL, 0); + + wn_window *window = wn_window_init(global_arena); + if (wn_window_init(global_arena) == NULL) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize wn_window"); return EXIT_FAILURE; } @@ -122,13 +124,13 @@ int main(int argc, char *argv[]) { bool wants_running = true; while (wants_running) { // TODO: Create event handler files - while (SDL_PollEvent(&window.event)) { - switch (window.event.type) { + while (SDL_PollEvent(&window->event)) { + switch (window->event.type) { case SDL_EVENT_QUIT: wants_running = false; break; case SDL_EVENT_KEY_DOWN: - if (window.event.key.key == SDLK_ESCAPE) { + if (window->event.key.key == SDLK_ESCAPE) { wants_running = false; } break; @@ -158,7 +160,7 @@ int main(int argc, char *argv[]) { glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); // glBindVertexArray(0); // no need to unbind it every time - wn_swapwindow(&window); + wn_swapwindow(window); } glDeleteVertexArrays(1, &VAO); @@ -166,7 +168,6 @@ int main(int argc, char *argv[]) { glDeleteBuffers(1, &EBO); wn_shader_deinit(shader); - wn_window_deinit(&window); - + wn_window_deinit(global_arena); return EXIT_SUCCESS; } diff --git a/src/window.c b/src/window.c index 4de00a3..a8a582e 100644 --- a/src/window.c +++ b/src/window.c @@ -1,17 +1,18 @@ #include "window.h" #include "SDL3/SDL_init.h" +#include "arena_allocator.h" #include #include #include -bool wn_window_init(wn_window *window) { - +wn_window *wn_window_init(Arena *arena) { + wn_window *window = arena_alloc(arena, sizeof(wn_window)); window->window = SDL_CreateWindow("Hello SDL3", 320, 240, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); if (!SDL_Init(SDL_INIT_VIDEO)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError()); - return false; + return NULL; } SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4); @@ -22,14 +23,14 @@ bool wn_window_init(wn_window *window) { if (!window->window) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create window: %s", SDL_GetError()); - return false; + return NULL; } window->glcontext = SDL_GL_CreateContext(window->window); if (!window->glcontext) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create OpenGL Context: %s", SDL_GetError()); - return false; + return NULL; } GLenum glewError = glewInit(); @@ -47,12 +48,20 @@ bool wn_window_init(wn_window *window) { SDL_SetWindowRelativeMouseMode(window->window, true); SDL_GetRelativeMouseState(NULL, NULL); - return true; + // add deinit function to arena deinit stack + ArenaDeinitTask deinitTask = (ArenaDeinitTask){.func_param = (void *)window, + .func_ptr = *wn_window_deinit, + .next = NULL}; + + arena_deinit_task_push(arena, deinitTask); + + return window; } -void wn_window_deinit(wn_window *window) { - SDL_GL_DestroyContext(window->glcontext); - SDL_DestroyWindow(window->window); +void wn_window_deinit(void *window) { + wn_window *cast_window = (wn_window *)window; + SDL_GL_DestroyContext(cast_window->glcontext); + SDL_DestroyWindow(cast_window->window); SDL_Quit(); } diff --git a/src/window.h b/src/window.h index 9d55123..a62c07c 100644 --- a/src/window.h +++ b/src/window.h @@ -3,6 +3,7 @@ #include "SDL3/SDL_events.h" #include "SDL3/SDL_render.h" #include "SDL3/SDL_video.h" +#include "arena_allocator.h" #include struct wn_window_s { @@ -13,7 +14,7 @@ struct wn_window_s { }; typedef struct wn_window_s wn_window; -bool wn_window_init(wn_window *window); -void wn_window_deinit(wn_window *window); +wn_window *wn_window_init(Arena *arena); +void wn_window_deinit(void *window); void wn_swapwindow(wn_window *window);