From cf62e9ad153f4cac3c5e1a782ba357c2e5bd350c Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Thu, 18 Jun 2026 09:53:36 -0400
Subject: [PATCH] Scale pointer coordinates even when logical presentation is
disabled
Logical presentation will be reported as disabled after setting a render target, however, the coordinates may still need to be scaled, as the previous view state is still preserved internally (the 'main_view' in the SDL3 render backend).
---
src/sdl2_compat.c | 46 +++++++++++++++++-----------------------------
1 file changed, 17 insertions(+), 29 deletions(-)
diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index d29e8f6d..e00c8feb 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -2322,22 +2322,18 @@ static SDL2_Event *Event3to2(const SDL_Event *event3, SDL2_Event *event2)
case SDL_EVENT_MOUSE_MOTION:
renderer = SDL3_GetRenderer(SDL3_GetWindowFromID(event3->motion.windowID));
if (renderer) {
- SDL_RendererLogicalPresentation mode = SDL_LOGICAL_PRESENTATION_DISABLED;
- SDL3_GetRenderLogicalPresentation(renderer, NULL, NULL, &mode);
- if (mode != SDL_LOGICAL_PRESENTATION_DISABLED) {
- SDL3_memcpy(&cvtevent3, event3, sizeof (SDL_Event));
- SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
- if (SDL3_GetBooleanProperty(SDL3_GetRendererProperties(renderer), PROP_RENDERER_RELATIVE_SCALING, true)) {
- /* Accumulate scaled relative motion */
- residual_motion_x = SDL3_modff(residual_motion_x + cvtevent3.motion.xrel, &cvtevent3.motion.xrel);
- residual_motion_y = SDL3_modff(residual_motion_y + cvtevent3.motion.yrel, &cvtevent3.motion.yrel);
- } else {
- /* Undo the relative scaling that SDL_ConvertEventToRenderCoordinates() performed */
- cvtevent3.motion.xrel = event3->motion.xrel;
- cvtevent3.motion.yrel = event3->motion.yrel;
- }
- event3 = &cvtevent3;
+ SDL3_memcpy(&cvtevent3, event3, sizeof (SDL_Event));
+ SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
+ if (SDL3_GetBooleanProperty(SDL3_GetRendererProperties(renderer), PROP_RENDERER_RELATIVE_SCALING, true)) {
+ /* Accumulate scaled relative motion */
+ residual_motion_x = SDL3_modff(residual_motion_x + cvtevent3.motion.xrel, &cvtevent3.motion.xrel);
+ residual_motion_y = SDL3_modff(residual_motion_y + cvtevent3.motion.yrel, &cvtevent3.motion.yrel);
+ } else {
+ /* Undo the relative scaling that SDL_ConvertEventToRenderCoordinates() performed */
+ cvtevent3.motion.xrel = event3->motion.xrel;
+ cvtevent3.motion.yrel = event3->motion.yrel;
}
+ event3 = &cvtevent3;
}
if (UseSDL2PrereleaseEvents) {
SDL2PRERELEASE_MouseMotionEvent *motion = (SDL2PRERELEASE_MouseMotionEvent *)&event2->motion;
@@ -2358,13 +2354,9 @@ static SDL2_Event *Event3to2(const SDL_Event *event3, SDL2_Event *event2)
case SDL_EVENT_MOUSE_BUTTON_UP:
renderer = SDL3_GetRenderer(SDL3_GetWindowFromID(event3->button.windowID));
if (renderer) {
- SDL_RendererLogicalPresentation mode = SDL_LOGICAL_PRESENTATION_DISABLED;
- SDL3_GetRenderLogicalPresentation(renderer, NULL, NULL, &mode);
- if (mode != SDL_LOGICAL_PRESENTATION_DISABLED) {
- SDL3_memcpy(&cvtevent3, event3, sizeof (SDL_Event));
- SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
- event3 = &cvtevent3;
- }
+ SDL3_memcpy(&cvtevent3, event3, sizeof(SDL_Event));
+ SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
+ event3 = &cvtevent3;
}
if (UseSDL2PrereleaseEvents) {
SDL2PRERELEASE_MouseButtonEvent *button = (SDL2PRERELEASE_MouseButtonEvent *)&event2->button;
@@ -2381,13 +2373,9 @@ static SDL2_Event *Event3to2(const SDL_Event *event3, SDL2_Event *event2)
case SDL_EVENT_MOUSE_WHEEL:
renderer = SDL3_GetRenderer(SDL3_GetWindowFromID(event3->wheel.windowID));
if (renderer) {
- SDL_RendererLogicalPresentation mode = SDL_LOGICAL_PRESENTATION_DISABLED;
- SDL3_GetRenderLogicalPresentation(renderer, NULL, NULL, &mode);
- if (mode != SDL_LOGICAL_PRESENTATION_DISABLED) {
- SDL3_memcpy(&cvtevent3, event3, sizeof (SDL_Event));
- SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
- event3 = &cvtevent3;
- }
+ SDL3_memcpy(&cvtevent3, event3, sizeof(SDL_Event));
+ SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
+ event3 = &cvtevent3;
}
if (UseSDL2PrereleaseEvents) {
SDL2PRERELEASE_MouseWheelEvent *wheel = (SDL2PRERELEASE_MouseWheelEvent *)&event2->wheel;