--- a/src/window.c Sun Jan 25 13:18:26 2026 +0100 +++ b/src/window.c Sun Jan 25 13:49:49 2026 +0100 @@ -47,28 +47,29 @@ SDL_WindowFlags flags = SDL_WINDOW_OPENGL; flags |= settings.fullscreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE; - window->window = SDL_CreateWindow("Ascension",800, 600, flags); - if (window->window == NULL) { + window->sdl = SDL_CreateWindow("Ascension",800, 600, flags); + if (window->sdl == NULL) { asc_error("Creating Window failed: %s", SDL_GetError()); return; } - window->id = SDL_GetWindowID(window->window); + window->id = SDL_GetWindowID(window->sdl); { - Sint32 w, h; - SDL_GetWindowSize(window->window, &w, &h); - window->dimensions = ASC_VEC2U(w, h); + int x,y, w, h; + SDL_GetWindowPosition(window->sdl, &x, &y); + SDL_GetWindowSize(window->sdl, &w, &h); + window->rect = ASC_RECT(x, y, w, h); } window->resized = true; // count initial sizing as resize // default UI scale window->ui_scale = 1.0f; - if (asc_gl_context_initialize(&window->glctx, window->window, &settings)) { + if (asc_gl_context_initialize(&window->glctx, window->sdl, &settings)) { char ui_scene_name[16]; snprintf(ui_scene_name, sizeof(ui_scene_name), "Window %u UI", index); asc_camera_init(&window->ui_camera, .type = ASC_CAMERA_ORTHO, - .ortho.rect = ASC_RECT(0, 0, window->dimensions.width, window->dimensions.height), + .ortho.rect = ASC_RECTV(ASC_VEC2I_0, window->rect.size), .viewport_update_func = asc_camera_ortho_update_size); asc_scene_init(&window->ui, ui_scene_name, &window->ui_camera); asc_dprintf("Window %u initialized at index %u", window->id, index); @@ -76,8 +77,8 @@ } else { asc_error("Creating GL context failed for window %u at index %u", window->id, index); // cleanup on error - SDL_DestroyWindow(window->window); - window->window = NULL; + SDL_DestroyWindow(window->sdl); + window->sdl = NULL; window->id = 0; } } @@ -107,8 +108,8 @@ asc_gl_context_destroy(&window->glctx); // destroy window - if (window->window != NULL) { - SDL_DestroyWindow(window->window); + if (window->sdl != NULL) { + SDL_DestroyWindow(window->sdl); } // if another window was active, make the other context current again @@ -152,19 +153,19 @@ } // Clear the color buffer for the window frame - int window_width = window->dimensions.width; - int window_height = window->dimensions.height; - glViewport(0, 0, window_width, window_height); + glViewport(0, 0, + (GLsizei) window->rect.size.width, + (GLsizei) window->rect.size.height); glClear(GL_COLOR_BUFFER_BIT); // Update the viewports when the window resized if (window->resized) { for (unsigned int i = 0; i < ASC_MAX_SCENES; i++) { if (asc_scene_active(&window->scenes[i])) { - asc_window_update_viewport(window->scenes[i].camera, window->dimensions); + asc_window_update_viewport(window->scenes[i].camera, window->rect.size); } } - asc_window_update_viewport(window->ui.camera, window->dimensions); + asc_window_update_viewport(window->ui.camera, window->rect.size); } // Execute camera updates @@ -189,10 +190,11 @@ asc_scene_draw(&window->ui); // Swap Buffers - SDL_GL_SwapWindow(window->window); + SDL_GL_SwapWindow(window->sdl); // Clear Flags window->resized = false; + window->moved = false; if (index != active_index) { asc_window_activate(active_index); @@ -218,7 +220,7 @@ asc_vec2u asc_window_display_resolution(void) { const AscWindow *window = asc_active_window; - SDL_DisplayID display = SDL_GetDisplayForWindow(window->window); + SDL_DisplayID display = SDL_GetDisplayForWindow(window->sdl); const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(display); if (dm == NULL) { asc_error("Failed to get display mode for window %u on display %d: %s", @@ -228,31 +230,46 @@ } float asc_window_ui_scale(unsigned int index) { - assert(asc_context.windows[index].window != NULL); + assert(asc_context.windows[index].sdl != NULL); return asc_context.windows[index].ui_scale; } +// TODO: error handling for all SDL_SetStuff() functions + void asc_window_set_title(unsigned index, const char *title) { - assert(asc_context.windows[index].window != NULL); - SDL_SetWindowTitle(asc_context.windows[index].window, title); + assert(asc_context.windows[index].sdl != NULL); + SDL_SetWindowTitle(asc_context.windows[index].sdl, title); } void asc_window_set_position(unsigned index, asc_vec2i pos) { - assert(asc_context.windows[index].window != NULL); - SDL_SetWindowPosition(asc_context.windows[index].window, pos.x, pos.y); + assert(asc_context.windows[index].sdl != NULL); + SDL_SetWindowPosition(asc_context.windows[index].sdl, pos.x, pos.y); } void asc_window_center(unsigned index) { // TODO: add support for multiple displays - // TODO: add support for centering just one axis - assert(asc_context.windows[index].window != NULL); - SDL_SetWindowPosition(asc_context.windows[index].window, - SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + const AscWindow *window = asc_context.windows + index; + assert(window->sdl != NULL); + SDL_SetWindowPosition(window->sdl, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); +} + +void asc_window_hcenter(unsigned index) { + // TODO: add support for multiple displays + const AscWindow *window = asc_context.windows + index; + assert(window->sdl != NULL); + SDL_SetWindowPosition(window->sdl, SDL_WINDOWPOS_CENTERED, window->rect.pos.y); +} + +void asc_window_vcenter(unsigned index) { + // TODO: add support for multiple displays + const AscWindow *window = asc_context.windows + index; + assert(window->sdl != NULL); + SDL_SetWindowPosition(window->sdl, window->rect.pos.x, SDL_WINDOWPOS_CENTERED); } void asc_window_set_size(unsigned index, asc_vec2u size) { - assert(asc_context.windows[index].window != NULL); - asc_context.windows[index].dimensions = size; + const AscWindow *window = asc_context.windows + index; + assert(window->sdl != NULL); // TODO: check what needs to be changed when SDL_WINDOW_ALLOW_HIGHDPI is supported by the engine - SDL_SetWindowSize(asc_context.windows[index].window, (int)size.width, (int)size.height); + SDL_SetWindowSize(window->sdl, (int)size.width, (int)size.height); }