From 2a8c9dd89a225b2c4eb1567044bd23a420b5d6e0 Mon Sep 17 00:00:00 2001 From: cobaltgit Date: Sun, 4 Oct 2026 15:03:32 +0100 Subject: [PATCH 01/10] Implement window_get_x, window_get_y, window_set_position --- src/backends/appkit.m | 27 +++++++++++++++++++++++++++ src/backends/glfw2.c | 11 +++++++++++ src/backends/glfw3.c | 11 +++++++++++ src/backends/noop.c | 11 +++++++++++ src/backends/sdl1.c | 12 ++++++++++++ src/backends/sdl2.c | 10 ++++++++++ src/backends/sdl3.c | 10 ++++++++++ src/backends/web.c | 11 +++++++++++ src/loop.c | 2 ++ src/platformdefs.h | 2 ++ src/runner.h | 2 ++ src/vm_builtins.c | 39 +++++++++++++++++++++++++++++++++++++++ 12 files changed, 148 insertions(+) diff --git a/src/backends/appkit.m b/src/backends/appkit.m index 5c72fa6e7..97bd5fd0e 100644 --- a/src/backends/appkit.m +++ b/src/backends/appkit.m @@ -333,6 +333,33 @@ void platformSetWindowSize(int32_t width, int32_t height) { [window setFrame:newFrame display:YES animate:NO]; } +bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { + if (!outX || !outY) return false; + NSRect frame = [window frame]; + CGFloat screenHeight = [NSScreen mainScreen].frame.size.height; + *outX = (int32_t)round(frame.origin.x); + *outY = (int32_t)round(screenHeight - (frame.origin.y + frame.size.height)); + return true; +} + +void platformSetWindowPosition(int32_t x, int32_t y) { + if (!window) return; + NSScreen *screen = [window screen]; + if (!screen) { + screen = [NSScreen mainScreen]; + } + + CGFloat screenHeight = [screen frame].size.height; + NSRect frame = [window frame]; + CGFloat windowHeight = frame.size.height; + + CGFloat appKitX = (CGFloat)x; + CGFloat appKitY = screenHeight - (CGFloat)y - windowHeight; + + NSPoint newOrigin = NSMakePoint(appKitX, appKitY); + [window setFrameOrigin:newOrigin]; +} + void platformGetMousePos(double *xPos, double *yPos) { NSPoint mouseLocation = [window mouseLocationOutsideOfEventStream]; *xPos = mouseLocation.x; diff --git a/src/backends/glfw2.c b/src/backends/glfw2.c index 3f07ef37e..a40e389f5 100644 --- a/src/backends/glfw2.c +++ b/src/backends/glfw2.c @@ -82,6 +82,17 @@ void platformSetWindowSize(int32_t width, int32_t height) { glfwSetWindowSize(width, height); } +bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { + (void)outX; + (void)outY; + return false; +} + +void platformSetWindowPosition(int32_t x, int32_t y) { + if (!window) return; + glfwSetWindowPos(x, y); +} + void platformGetMousePos(double *xPos, double *yPos) { if (!xPos || !yPos) return; int mx = 0, my = 0; diff --git a/src/backends/glfw3.c b/src/backends/glfw3.c index 23af551ee..d50aeb86c 100644 --- a/src/backends/glfw3.c +++ b/src/backends/glfw3.c @@ -117,6 +117,17 @@ void platformSetWindowSize(int32_t width, int32_t height) { glfwSetWindowSize(window, logicalW, logicalH); } +bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { + if (!outX || !outY) return false; + glfwGetWindowPos(window, outX, outY); + return true; +} + +void platformSetWindowPosition(int32_t x, int32_t y) { + if (!window) return; + glfwSetWindowPos(window, x, y); +} + void platformGetMousePos(double *xPos, double *yPos) { if (!xPos || !yPos) return; glfwGetCursorPos(window, xPos, yPos); diff --git a/src/backends/noop.c b/src/backends/noop.c index b71767fc3..60bd7a2aa 100644 --- a/src/backends/noop.c +++ b/src/backends/noop.c @@ -50,6 +50,17 @@ void platformSetWindowSize(int32_t width, int32_t height) { if (height > 0) g_height = height; } +bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { + (void)outX; + (void)outY; + return true; +} + +void platformSetWindowPosition(int32_t x, int32_t y) { + (void)x; + (void)y; +} + void platformSetWindowTitle(const char *title) { (void)title; } diff --git a/src/backends/sdl1.c b/src/backends/sdl1.c index cc65997c0..b5f3a1dd6 100644 --- a/src/backends/sdl1.c +++ b/src/backends/sdl1.c @@ -225,6 +225,18 @@ void platformSetWindowSize(int32_t width, int32_t height) { scr = SDL_SetVideoMode(width, height, 0, (gfx == SOFTWARE ? 0 : SDL_OPENGL) | SDL_RESIZABLE); } +// no-op, SDL 1.2 doesn't support getting/setting window position cross-platform +bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { + (void)outX; + (void)outY; + return false; +} + +void platformSetWindowPosition(int32_t x, int32_t y) { + (void)x; + (void)y; +} + void platformGetMousePos(double *xPos, double *yPos) { if (!xPos || !yPos) return; int mx = 0, my = 0; diff --git a/src/backends/sdl2.c b/src/backends/sdl2.c index a1e6db3ce..bc88b0392 100644 --- a/src/backends/sdl2.c +++ b/src/backends/sdl2.c @@ -121,6 +121,16 @@ bool platformGetWindowSize(int32_t* outW, int32_t* outH) { return true; } +bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { + if (!outX || !outY) return false; + SDL_GetWindowPosition(window, outX, outY); + return true; +} + +void platformSetWindowPosition(int32_t x, int32_t y) { + SDL_SetWindowPosition(window, x, y); +} + bool platformGetScaledWindowSize(int32_t* outW, int32_t* outH) { if (!outW || !outH) return false; int w = 0; diff --git a/src/backends/sdl3.c b/src/backends/sdl3.c index 7c9f6bee2..d95288376 100644 --- a/src/backends/sdl3.c +++ b/src/backends/sdl3.c @@ -8,6 +8,7 @@ #include "platformdefs.h" #include "gettime.h" #include +#include #include "runner_mouse.h" static Runner *g_runner; @@ -134,6 +135,15 @@ void platformSetWindowSize(int32_t width, int32_t height) { scr = SDL_GetWindowSurface(window); } +bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { + if (!outX || !outY) return false; + return SDL_GetWindowPosition(window, outX, outY); +} + +void platformSetWindowPosition(int32_t x, int32_t y) { + SDL_SetWindowPosition(window, x, y); +} + void platformGetMousePos(double *xPos, double *yPos) { if (!xPos || !yPos) return; float mx = 0, my = 0; diff --git a/src/backends/web.c b/src/backends/web.c index 6a3301501..43806f39b 100644 --- a/src/backends/web.c +++ b/src/backends/web.c @@ -208,6 +208,17 @@ bool platformGetWindowSize(int32_t *outW, int32_t *outH) { return true; } +bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { + (void)outX; + (void)outY; + return false; +} + +void platformSetWindowPosition(int32_t x, int32_t y) { + (void)x; + (void)y; +} + bool platformGetScaledWindowSize(int32_t *outW, int32_t *outH) { return platformGetWindowSize(outW, outH); } diff --git a/src/loop.c b/src/loop.c index 2059c2aec..140ee1f62 100644 --- a/src/loop.c +++ b/src/loop.c @@ -993,6 +993,8 @@ int loop(CommandLineArgs args, const char *argv0) { runner->osType = args.osType; runner->setWindowSize = platformSetWindowSize; runner->getWindowSize = platformGetWindowSize; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; runner->setWindowTitle = platformSetWindowTitle; Runner_setGameArgs(runner, currentGameArgs, (int32_t) arrlen(currentGameArgs)); platformInitFunctions(runner); diff --git a/src/platformdefs.h b/src/platformdefs.h index 5341d4b71..96a8eab1c 100644 --- a/src/platformdefs.h +++ b/src/platformdefs.h @@ -149,6 +149,8 @@ bool platformGetWindowSize(int32_t* outW, int32_t* outH); bool platformGetScaledWindowSize(int32_t* outW, int32_t* outH); void platformSetWindowSize(int32_t width, int32_t height); void platformSetWindowTitle(const char* title); +bool platformGetWindowPosition(int32_t* outX, int32_t* outY); +void platformSetWindowPosition(int32_t x, int32_t y); void platformSleepUntil(uint64_t time); extern InputRecording *globalInputRecording; diff --git a/src/runner.h b/src/runner.h index c5b9cbe32..da0eab4ea 100644 --- a/src/runner.h +++ b/src/runner.h @@ -746,6 +746,8 @@ struct Runner { void (*setWindowTitle)(const char* title); bool (*getWindowSize)(int32_t* outW, int32_t* outH); void (*setWindowSize)(int32_t width, int32_t height); + bool (*getWindowPosition)(int32_t* outX, int32_t* outY); + void (*setWindowPosition)(int32_t x, int32_t y); bool (*windowHasFocus)(void); void (*setCursor)(int32_t cursorType); int32_t currentCursor; // last value passed to window_set_cursor diff --git a/src/vm_builtins.c b/src/vm_builtins.c index f00536dfb..cbcb3e3f0 100644 --- a/src/vm_builtins.c +++ b/src/vm_builtins.c @@ -9173,6 +9173,42 @@ static RValue builtin_window_get_height(VMContext* ctx, MAYBE_UNUSED RValue* arg return RValue_makeReal((GMLReal) ctx->dataWin->gen8.defaultWindowHeight); } +static RValue builtin_window_get_x(VMContext* ctx, MAYBE_UNUSED RValue* args, MAYBE_UNUSED int32_t argCount) { + Runner* runner = ctx->runner; + if (runner != nullptr && runner->getWindowPosition != nullptr) { + int32_t x = 0; + int32_t y = 0; + if (runner->getWindowPosition(&x, &y)) { + return RValue_makeReal((GMLReal) x); + } + } + return RValue_makeReal((GMLReal)0); +} + +static RValue builtin_window_get_y(VMContext* ctx, MAYBE_UNUSED RValue* args, MAYBE_UNUSED int32_t argCount) { + Runner* runner = ctx->runner; + if (runner != nullptr && runner->getWindowPosition != nullptr) { + int32_t x = 0; + int32_t y = 0; + if (runner->getWindowPosition(&x, &y)) { + return RValue_makeReal((GMLReal) y); + } + } + return RValue_makeReal((GMLReal)0); +} + +static RValue builtin_window_set_position(VMContext* ctx, RValue* args, MAYBE_UNUSED int32_t argCount) { + REQUIRE_ARGC_AT_LEAST("window_set_position", 2, RValue_makeUndefined()); + int32_t x = RValue_toInt32(args[0]); + int32_t y = RValue_toInt32(args[1]); + + Runner* runner = ctx->runner; + if (runner != nullptr && runner->setWindowPosition != nullptr) { + runner->setWindowPosition(x, y); + } + return RValue_makeUndefined(); +} + static RValue builtin_window_set_size(VMContext* ctx, RValue* args, MAYBE_UNUSED int32_t argCount) { REQUIRE_ARGC_AT_LEAST("window_set_size", 2, RValue_makeUndefined()); @@ -23122,6 +23158,9 @@ void VMBuiltins_registerAll(VMContext* ctx) { VM_registerBuiltin(ctx, "window_get_caption", builtin_window_get_caption); VM_registerBuiltin(ctx, "window_get_width", builtin_window_get_width); VM_registerBuiltin(ctx, "window_get_height", builtin_window_get_height); + VM_registerBuiltin(ctx, "window_get_x", builtin_window_get_x); + VM_registerBuiltin(ctx, "window_get_y", builtin_window_get_y); + VM_registerBuiltin(ctx, "window_set_position", builtin_window_set_position); VM_registerBuiltin(ctx, "window_set_size", builtin_window_set_size); VM_registerBuiltin(ctx, "window_center", builtin_window_center); VM_registerBuiltin(ctx, "window_has_focus", builtin_window_has_focus); From c9f50e159ff4906b4d904aa194fdd4341891ba36 Mon Sep 17 00:00:00 2001 From: cobaltgit Date: Wed, 7 Oct 2026 21:04:35 +0100 Subject: [PATCH 02/10] stoopid --- src/backends/appkit.m | 6 ++++-- src/backends/glfw2.c | 6 ++++-- src/backends/glfw3.c | 6 ++++-- src/backends/noop.c | 17 ++++++++++------- src/backends/sdl1.c | 6 ++++-- src/backends/sdl2.c | 6 ++++-- src/backends/sdl3.c | 6 ++++-- src/backends/web.c | 14 ++++++++------ src/loop.c | 2 -- 9 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/backends/appkit.m b/src/backends/appkit.m index 97bd5fd0e..818d93fb9 100644 --- a/src/backends/appkit.m +++ b/src/backends/appkit.m @@ -333,7 +333,7 @@ void platformSetWindowSize(int32_t width, int32_t height) { [window setFrame:newFrame display:YES animate:NO]; } -bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { +static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { if (!outX || !outY) return false; NSRect frame = [window frame]; CGFloat screenHeight = [NSScreen mainScreen].frame.size.height; @@ -342,7 +342,7 @@ bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { return true; } -void platformSetWindowPosition(int32_t x, int32_t y) { +static void platformSetWindowPosition(int32_t x, int32_t y) { if (!window) return; NSScreen *screen = [window screen]; if (!screen) { @@ -668,6 +668,8 @@ void platformInitFunctions(Runner *runner) { g_runner = runner; runner->windowHasFocus = windowIsFocused; runner->setCursor = platformSetCursor; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; runner->currentCursor = GML_CR_ARROW; } diff --git a/src/backends/glfw2.c b/src/backends/glfw2.c index a40e389f5..3826135c7 100644 --- a/src/backends/glfw2.c +++ b/src/backends/glfw2.c @@ -82,13 +82,13 @@ void platformSetWindowSize(int32_t width, int32_t height) { glfwSetWindowSize(width, height); } -bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { +static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { (void)outX; (void)outY; return false; } -void platformSetWindowPosition(int32_t x, int32_t y) { +static void platformSetWindowPosition(int32_t x, int32_t y) { if (!window) return; glfwSetWindowPos(x, y); } @@ -255,6 +255,8 @@ void platformInitFunctions(Runner *runner) { g_runner = runner; runner->windowHasFocus = platformGetWindowFocus; runner->setCursor = platformSetCursor; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; runner->currentCursor = GML_CR_DEFAULT; #ifdef ENABLE_SW_RENDERER if (gfx == SOFTWARE) diff --git a/src/backends/glfw3.c b/src/backends/glfw3.c index d50aeb86c..8a080ba76 100644 --- a/src/backends/glfw3.c +++ b/src/backends/glfw3.c @@ -117,13 +117,13 @@ void platformSetWindowSize(int32_t width, int32_t height) { glfwSetWindowSize(window, logicalW, logicalH); } -bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { +static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { if (!outX || !outY) return false; glfwGetWindowPos(window, outX, outY); return true; } -void platformSetWindowPosition(int32_t x, int32_t y) { +static void platformSetWindowPosition(int32_t x, int32_t y) { if (!window) return; glfwSetWindowPos(window, x, y); } @@ -329,6 +329,8 @@ void platformInitFunctions(Runner *runner) { runner->windowHasFocus = platformGetWindowFocus; runner->setCursor = platformSetCursor; runner->currentCursor = GML_CR_DEFAULT; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; #ifdef ENABLE_SW_RENDERER if (gfx == SOFTWARE) glfwSetWindowSizeCallback(window, resizeCallback); diff --git a/src/backends/noop.c b/src/backends/noop.c index 60bd7a2aa..7fb2ba1c9 100644 --- a/src/backends/noop.c +++ b/src/backends/noop.c @@ -27,11 +27,6 @@ void platformExit(void) { g_initialized = false; } -void platformInitFunctions(Runner *runner) { - g_runner = runner; - runner->setCursor = NULL; - runner->currentCursor = GML_CR_DEFAULT; -} bool platformGetWindowSize(int32_t *outW, int32_t *outH) { if (!outW || !outH) return false; @@ -50,17 +45,25 @@ void platformSetWindowSize(int32_t width, int32_t height) { if (height > 0) g_height = height; } -bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { +static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { (void)outX; (void)outY; return true; } -void platformSetWindowPosition(int32_t x, int32_t y) { +static void platformSetWindowPosition(int32_t x, int32_t y) { (void)x; (void)y; } +void platformInitFunctions(Runner *runner) { + g_runner = runner; + runner->setCursor = NULL; + runner->currentCursor = GML_CR_DEFAULT; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; +} + void platformSetWindowTitle(const char *title) { (void)title; } diff --git a/src/backends/sdl1.c b/src/backends/sdl1.c index b5f3a1dd6..4b7a2f9ca 100644 --- a/src/backends/sdl1.c +++ b/src/backends/sdl1.c @@ -226,13 +226,13 @@ void platformSetWindowSize(int32_t width, int32_t height) { } // no-op, SDL 1.2 doesn't support getting/setting window position cross-platform -bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { +static bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { (void)outX; (void)outY; return false; } -void platformSetWindowPosition(int32_t x, int32_t y) { +static void platformSetWindowPosition(int32_t x, int32_t y) { (void)x; (void)y; } @@ -322,6 +322,8 @@ void platformInitFunctions(Runner *runner) { g_runner = runner; runner->windowHasFocus = platformGetWindowFocus; runner->setCursor = platformSetCursor; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; runner->currentCursor = GML_CR_DEFAULT; } diff --git a/src/backends/sdl2.c b/src/backends/sdl2.c index bc88b0392..b807765b8 100644 --- a/src/backends/sdl2.c +++ b/src/backends/sdl2.c @@ -121,13 +121,13 @@ bool platformGetWindowSize(int32_t* outW, int32_t* outH) { return true; } -bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { +static bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { if (!outX || !outY) return false; SDL_GetWindowPosition(window, outX, outY); return true; } -void platformSetWindowPosition(int32_t x, int32_t y) { +static void platformSetWindowPosition(int32_t x, int32_t y) { SDL_SetWindowPosition(window, x, y); } @@ -294,6 +294,8 @@ void platformInitFunctions(Runner *runner) { g_runner = runner; runner->windowHasFocus = platformGetWindowFocus; runner->setCursor = platformSetCursor; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; runner->currentCursor = GML_CR_DEFAULT; } diff --git a/src/backends/sdl3.c b/src/backends/sdl3.c index d95288376..768a62c3e 100644 --- a/src/backends/sdl3.c +++ b/src/backends/sdl3.c @@ -135,12 +135,12 @@ void platformSetWindowSize(int32_t width, int32_t height) { scr = SDL_GetWindowSurface(window); } -bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { +static bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { if (!outX || !outY) return false; return SDL_GetWindowPosition(window, outX, outY); } -void platformSetWindowPosition(int32_t x, int32_t y) { +static void platformSetWindowPosition(int32_t x, int32_t y) { SDL_SetWindowPosition(window, x, y); } @@ -240,6 +240,8 @@ void platformInitFunctions(Runner *runner) { g_runner = runner; runner->windowHasFocus = platformGetWindowFocus; runner->setCursor = platformSetCursor; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; runner->currentCursor = GML_CR_DEFAULT; } diff --git a/src/backends/web.c b/src/backends/web.c index 43806f39b..4c7c3cdce 100644 --- a/src/backends/web.c +++ b/src/backends/web.c @@ -194,12 +194,6 @@ void platformExit(void) { emscripten_webgl_destroy_context(gWebGLContextHandle); } -void platformInitFunctions(Runner *runner) { - gRunner = runner; - runner->setCursor = nullptr; - runner->currentCursor = GML_CR_DEFAULT; -} - bool platformGetWindowSize(int32_t *outW, int32_t *outH) { if (!outW || !outH) return false; if (!gInitialized) return false; @@ -219,6 +213,14 @@ void platformSetWindowPosition(int32_t x, int32_t y) { (void)y; } +void platformInitFunctions(Runner *runner) { + gRunner = runner; + runner->setCursor = nullptr; + runner->currentCursor = GML_CR_DEFAULT; + runner->getWindowPosition = platformGetWindowPosition; + runner->setWindowPosition = platformSetWindowPosition; +} + bool platformGetScaledWindowSize(int32_t *outW, int32_t *outH) { return platformGetWindowSize(outW, outH); } diff --git a/src/loop.c b/src/loop.c index 140ee1f62..2059c2aec 100644 --- a/src/loop.c +++ b/src/loop.c @@ -993,8 +993,6 @@ int loop(CommandLineArgs args, const char *argv0) { runner->osType = args.osType; runner->setWindowSize = platformSetWindowSize; runner->getWindowSize = platformGetWindowSize; - runner->getWindowPosition = platformGetWindowPosition; - runner->setWindowPosition = platformSetWindowPosition; runner->setWindowTitle = platformSetWindowTitle; Runner_setGameArgs(runner, currentGameArgs, (int32_t) arrlen(currentGameArgs)); platformInitFunctions(runner); From 7119efa917ba84b176dbb4faa31113dbc0270d00 Mon Sep 17 00:00:00 2001 From: cobaltgit Date: Wed, 7 Oct 2026 21:15:03 +0100 Subject: [PATCH 03/10] rid --- src/platformdefs.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/platformdefs.h b/src/platformdefs.h index 96a8eab1c..5341d4b71 100644 --- a/src/platformdefs.h +++ b/src/platformdefs.h @@ -149,8 +149,6 @@ bool platformGetWindowSize(int32_t* outW, int32_t* outH); bool platformGetScaledWindowSize(int32_t* outW, int32_t* outH); void platformSetWindowSize(int32_t width, int32_t height); void platformSetWindowTitle(const char* title); -bool platformGetWindowPosition(int32_t* outX, int32_t* outY); -void platformSetWindowPosition(int32_t x, int32_t y); void platformSleepUntil(uint64_t time); extern InputRecording *globalInputRecording; From 7b88090f19e21353f984343da6796e77b7f8b00e Mon Sep 17 00:00:00 2001 From: cobaltgit Date: Thu, 8 Oct 2026 12:27:08 +0100 Subject: [PATCH 04/10] remove noop stubs --- src/backends/glfw2.c | 7 ------- src/backends/noop.c | 13 ------------- src/backends/sdl1.c | 14 -------------- src/backends/web.c | 13 ------------- 4 files changed, 47 deletions(-) diff --git a/src/backends/glfw2.c b/src/backends/glfw2.c index 3826135c7..684248df4 100644 --- a/src/backends/glfw2.c +++ b/src/backends/glfw2.c @@ -82,12 +82,6 @@ void platformSetWindowSize(int32_t width, int32_t height) { glfwSetWindowSize(width, height); } -static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { - (void)outX; - (void)outY; - return false; -} - static void platformSetWindowPosition(int32_t x, int32_t y) { if (!window) return; glfwSetWindowPos(x, y); @@ -255,7 +249,6 @@ void platformInitFunctions(Runner *runner) { g_runner = runner; runner->windowHasFocus = platformGetWindowFocus; runner->setCursor = platformSetCursor; - runner->getWindowPosition = platformGetWindowPosition; runner->setWindowPosition = platformSetWindowPosition; runner->currentCursor = GML_CR_DEFAULT; #ifdef ENABLE_SW_RENDERER diff --git a/src/backends/noop.c b/src/backends/noop.c index 7fb2ba1c9..52cd937a2 100644 --- a/src/backends/noop.c +++ b/src/backends/noop.c @@ -45,23 +45,10 @@ void platformSetWindowSize(int32_t width, int32_t height) { if (height > 0) g_height = height; } -static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { - (void)outX; - (void)outY; - return true; -} - -static void platformSetWindowPosition(int32_t x, int32_t y) { - (void)x; - (void)y; -} - void platformInitFunctions(Runner *runner) { g_runner = runner; runner->setCursor = NULL; runner->currentCursor = GML_CR_DEFAULT; - runner->getWindowPosition = platformGetWindowPosition; - runner->setWindowPosition = platformSetWindowPosition; } void platformSetWindowTitle(const char *title) { diff --git a/src/backends/sdl1.c b/src/backends/sdl1.c index 4b7a2f9ca..cc65997c0 100644 --- a/src/backends/sdl1.c +++ b/src/backends/sdl1.c @@ -225,18 +225,6 @@ void platformSetWindowSize(int32_t width, int32_t height) { scr = SDL_SetVideoMode(width, height, 0, (gfx == SOFTWARE ? 0 : SDL_OPENGL) | SDL_RESIZABLE); } -// no-op, SDL 1.2 doesn't support getting/setting window position cross-platform -static bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { - (void)outX; - (void)outY; - return false; -} - -static void platformSetWindowPosition(int32_t x, int32_t y) { - (void)x; - (void)y; -} - void platformGetMousePos(double *xPos, double *yPos) { if (!xPos || !yPos) return; int mx = 0, my = 0; @@ -322,8 +310,6 @@ void platformInitFunctions(Runner *runner) { g_runner = runner; runner->windowHasFocus = platformGetWindowFocus; runner->setCursor = platformSetCursor; - runner->getWindowPosition = platformGetWindowPosition; - runner->setWindowPosition = platformSetWindowPosition; runner->currentCursor = GML_CR_DEFAULT; } diff --git a/src/backends/web.c b/src/backends/web.c index 4c7c3cdce..a9f346b68 100644 --- a/src/backends/web.c +++ b/src/backends/web.c @@ -202,23 +202,10 @@ bool platformGetWindowSize(int32_t *outW, int32_t *outH) { return true; } -bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { - (void)outX; - (void)outY; - return false; -} - -void platformSetWindowPosition(int32_t x, int32_t y) { - (void)x; - (void)y; -} - void platformInitFunctions(Runner *runner) { gRunner = runner; runner->setCursor = nullptr; runner->currentCursor = GML_CR_DEFAULT; - runner->getWindowPosition = platformGetWindowPosition; - runner->setWindowPosition = platformSetWindowPosition; } bool platformGetScaledWindowSize(int32_t *outW, int32_t *outH) { From 030dadb129e028257d63b4459719e673f53ac3aa Mon Sep 17 00:00:00 2001 From: cobaltgit Date: Thu, 8 Oct 2026 22:29:20 +0100 Subject: [PATCH 05/10] try fix hidpi for sdl2 + glfw3 --- src/backends/glfw3.c | 17 +++++++++++++++-- src/backends/sdl2.c | 25 +++++++++++++++---------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/backends/glfw3.c b/src/backends/glfw3.c index 8a080ba76..c89decd06 100644 --- a/src/backends/glfw3.c +++ b/src/backends/glfw3.c @@ -117,15 +117,28 @@ void platformSetWindowSize(int32_t width, int32_t height) { glfwSetWindowSize(window, logicalW, logicalH); } +static void platformGetWindowScale(float* outX, float* outY) { + glfwGetWindowContentScale(window, outX, outY); +} + static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { if (!outX || !outY) return false; - glfwGetWindowPos(window, outX, outY); + int rawX, rawY; + float xscale, yscale; + platformGetWindowScale(&xscale, &yscale); + glfwGetWindowPos(window, &rawX, &rawY); + *outX = (int32_t)((float)rawX / xscale + 0.5f); + *outY = (int32_t)((float)rawY / yscale + 0.5f); return true; } static void platformSetWindowPosition(int32_t x, int32_t y) { if (!window) return; - glfwSetWindowPos(window, x, y); + float xscale, yscale; + platformGetWindowScale(&xscale, &yscale); + int targetX = (int)(x * xscale + 0.5f); + int targetY = (int)(y * yscale + 0.5f); + glfwSetWindowPos(window, targetX, targetY); } void platformGetMousePos(double *xPos, double *yPos) { diff --git a/src/backends/sdl2.c b/src/backends/sdl2.c index b807765b8..64d7ad502 100644 --- a/src/backends/sdl2.c +++ b/src/backends/sdl2.c @@ -121,16 +121,6 @@ bool platformGetWindowSize(int32_t* outW, int32_t* outH) { return true; } -static bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { - if (!outX || !outY) return false; - SDL_GetWindowPosition(window, outX, outY); - return true; -} - -static void platformSetWindowPosition(int32_t x, int32_t y) { - SDL_SetWindowPosition(window, x, y); -} - bool platformGetScaledWindowSize(int32_t* outW, int32_t* outH) { if (!outW || !outH) return false; int w = 0; @@ -150,6 +140,21 @@ static float platformGetWindowScale(void) { return (logical_h > 0) ? (float)draw_h / logical_h : 1.0f; } +static void platformSetWindowPosition(int32_t x, int32_t y) { + float scale = platformGetWindowScale(); + SDL_SetWindowPosition(window, (int)(x * scale + 0.5f), (int)(y * scale + 0.5f)); +} + +static bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { + if (!outX || !outY) return false; + int32_t rawX, rawY; + float scale = platformGetWindowScale(); + SDL_GetWindowPosition(window, &rawX, &rawY); + *outX = (int32_t)(rawX / scale + 0.5f); + *outY = (int32_t)(rawY / scale + 0.5f); + return true; +} + void platformSetWindowSize(int32_t width, int32_t height) { if (width <= 0 || height <= 0) return; From 3cfdb26db86bbbaf18a49685a3966c88dac75fc0 Mon Sep 17 00:00:00 2001 From: Cobalt <65132371+cobaltgit@users.noreply.github.com> Date: Thu, 8 Oct 2026 22:51:05 +0100 Subject: [PATCH 06/10] divide --- src/backends/sdl2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/sdl2.c b/src/backends/sdl2.c index 64d7ad502..c477ddda0 100644 --- a/src/backends/sdl2.c +++ b/src/backends/sdl2.c @@ -142,7 +142,7 @@ static float platformGetWindowScale(void) { static void platformSetWindowPosition(int32_t x, int32_t y) { float scale = platformGetWindowScale(); - SDL_SetWindowPosition(window, (int)(x * scale + 0.5f), (int)(y * scale + 0.5f)); + SDL_SetWindowPosition(window, (int)(x / scale + 0.5f), (int)(y / scale + 0.5f)); } static bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { From 1174ce53331697d8da8c6351f9ac5c2486295907 Mon Sep 17 00:00:00 2001 From: Cobalt <65132371+cobaltgit@users.noreply.github.com> Date: Thu, 8 Oct 2026 22:52:22 +0100 Subject: [PATCH 07/10] divide? --- src/backends/glfw3.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/glfw3.c b/src/backends/glfw3.c index c89decd06..4a28a574d 100644 --- a/src/backends/glfw3.c +++ b/src/backends/glfw3.c @@ -136,8 +136,8 @@ static void platformSetWindowPosition(int32_t x, int32_t y) { if (!window) return; float xscale, yscale; platformGetWindowScale(&xscale, &yscale); - int targetX = (int)(x * xscale + 0.5f); - int targetY = (int)(y * yscale + 0.5f); + int targetX = (int)(x / xscale + 0.5f); + int targetY = (int)(y / yscale + 0.5f); glfwSetWindowPos(window, targetX, targetY); } From ce35ec17352dc344708d52d250396c997e06340f Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Thu, 8 Oct 2026 17:55:31 -0400 Subject: [PATCH 08/10] fix --- src/backends/sdl2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/sdl2.c b/src/backends/sdl2.c index c477ddda0..95839de0b 100644 --- a/src/backends/sdl2.c +++ b/src/backends/sdl2.c @@ -150,8 +150,8 @@ static bool platformGetWindowPosition(int32_t* outX, int32_t* outY) { int32_t rawX, rawY; float scale = platformGetWindowScale(); SDL_GetWindowPosition(window, &rawX, &rawY); - *outX = (int32_t)(rawX / scale + 0.5f); - *outY = (int32_t)(rawY / scale + 0.5f); + *outX = (int32_t)(rawX * scale + 0.5f); + *outY = (int32_t)(rawY * scale + 0.5f); return true; } From 0d88cf40ffc4360cab02e36672ab7ab501d1c214 Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Thu, 8 Oct 2026 17:57:44 -0400 Subject: [PATCH 09/10] remove pointless thing --- src/backends/glfw3.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/backends/glfw3.c b/src/backends/glfw3.c index 4a28a574d..075db6d94 100644 --- a/src/backends/glfw3.c +++ b/src/backends/glfw3.c @@ -117,15 +117,11 @@ void platformSetWindowSize(int32_t width, int32_t height) { glfwSetWindowSize(window, logicalW, logicalH); } -static void platformGetWindowScale(float* outX, float* outY) { - glfwGetWindowContentScale(window, outX, outY); -} - static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { if (!outX || !outY) return false; int rawX, rawY; float xscale, yscale; - platformGetWindowScale(&xscale, &yscale); + glfwGetWindowContentScale(window, &xscale, &yscale); glfwGetWindowPos(window, &rawX, &rawY); *outX = (int32_t)((float)rawX / xscale + 0.5f); *outY = (int32_t)((float)rawY / yscale + 0.5f); @@ -135,7 +131,7 @@ static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { static void platformSetWindowPosition(int32_t x, int32_t y) { if (!window) return; float xscale, yscale; - platformGetWindowScale(&xscale, &yscale); + glfwGetWindowContentScale(window, &xscale, &yscale); int targetX = (int)(x / xscale + 0.5f); int targetY = (int)(y / yscale + 0.5f); glfwSetWindowPos(window, targetX, targetY); From 2e80e016815d26c46bb152290cd92098692f6297 Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Thu, 8 Oct 2026 17:58:52 -0400 Subject: [PATCH 10/10] fix --- src/backends/glfw3.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/glfw3.c b/src/backends/glfw3.c index 075db6d94..5a9476816 100644 --- a/src/backends/glfw3.c +++ b/src/backends/glfw3.c @@ -123,8 +123,8 @@ static bool platformGetWindowPosition(int32_t *outX, int32_t *outY) { float xscale, yscale; glfwGetWindowContentScale(window, &xscale, &yscale); glfwGetWindowPos(window, &rawX, &rawY); - *outX = (int32_t)((float)rawX / xscale + 0.5f); - *outY = (int32_t)((float)rawY / yscale + 0.5f); + *outX = (int32_t)((float)rawX * xscale + 0.5f); + *outY = (int32_t)((float)rawY * yscale + 0.5f); return true; }