src/window.c

changeset 294
4df350dac84f
parent 288
8796f03aac26
child 295
c72df1f06671
--- 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);
 }

mercurial