From 75a2e7e6f357febe5171a086976cd31c7e5bb3a5 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Sun, 30 Jul 2023 15:42:20 -0400
Subject: [PATCH] events: Adjust mouse coordinates when using 2D renderer's
logical scaling.
Fixes #86.
---
src/sdl2_compat.c | 21 +++++++++++++++++++++
src/sdl3_syms.h | 1 +
2 files changed, 22 insertions(+)
diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index a9c1de1..513f48e 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -1285,6 +1285,9 @@ static int GetIndexFromJoystickInstance(SDL_JoystickID jid);
static SDL2_Event *
Event3to2(const SDL_Event *event3, SDL2_Event *event2)
{
+ SDL_Renderer *renderer;
+ SDL_Event cvtevent3;
+
#if 0
if (event3->type == SDL_SYSWMEVENT) {
return SDL_FALSE; /* !!! FIXME: figure out what to do with this. */
@@ -1301,6 +1304,12 @@ Event3to2(const SDL_Event *event3, SDL2_Event *event2)
/* mouse coords became floats in SDL3: */
switch (event3->type) {
case SDL_EVENT_MOUSE_MOTION:
+ renderer = SDL3_GetRenderer(SDL3_GetWindowFromID(event3->motion.windowID));
+ if (renderer) {
+ SDL_memcpy(&cvtevent3, event3, sizeof (SDL_Event));
+ SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
+ event3 = &cvtevent3;
+ }
event2->motion.x = (Sint32)event3->motion.x;
event2->motion.y = (Sint32)event3->motion.y;
event2->motion.xrel = (Sint32)event3->motion.xrel;
@@ -1308,10 +1317,22 @@ Event3to2(const SDL_Event *event3, SDL2_Event *event2)
break;
case SDL_EVENT_MOUSE_BUTTON_DOWN:
case SDL_EVENT_MOUSE_BUTTON_UP:
+ renderer = SDL3_GetRenderer(SDL3_GetWindowFromID(event3->button.windowID));
+ if (renderer) {
+ SDL_memcpy(&cvtevent3, event3, sizeof (SDL_Event));
+ SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
+ event3 = &cvtevent3;
+ }
event2->button.x = (Sint32)event3->button.x;
event2->button.y = (Sint32)event3->button.y;
break;
case SDL_EVENT_MOUSE_WHEEL:
+ renderer = SDL3_GetRenderer(SDL3_GetWindowFromID(event3->wheel.windowID));
+ if (renderer) {
+ SDL_memcpy(&cvtevent3, event3, sizeof (SDL_Event));
+ SDL3_ConvertEventToRenderCoordinates(renderer, &cvtevent3);
+ event3 = &cvtevent3;
+ }
event2->wheel.x = (Sint32)event3->wheel.x;
event2->wheel.y = (Sint32)event3->wheel.y;
event2->wheel.preciseX = event3->wheel.x;
diff --git a/src/sdl3_syms.h b/src/sdl3_syms.h
index cf4528f..2fe4dd6 100644
--- a/src/sdl3_syms.h
+++ b/src/sdl3_syms.h
@@ -439,6 +439,7 @@ SDL3_SYM_PASSTHROUGH(int,SetSurfaceBlendMode,(SDL_Surface *a, SDL_BlendMode b),(
SDL3_SYM_PASSTHROUGH(int,GetSurfaceBlendMode,(SDL_Surface *a, SDL_BlendMode *b),(a,b),return)
SDL3_SYM_RENAMED(SDL_bool,SetClipRect,SetSurfaceClipRect,(SDL_Surface *a, const SDL_Rect *b),(a,b),return)
SDL3_SYM(int,GetSurfaceClipRect,(SDL_Surface *a, SDL_Rect *b),(a,b),return)
+SDL3_SYM(int,ConvertEventToRenderCoordinates,(SDL_Renderer *a, SDL_Event *b),(a,b),return)
SDL3_SYM(SDL_Surface*,ConvertSurface,(SDL_Surface *a, const SDL_PixelFormat *b),(a,b),return)
SDL3_SYM(SDL_Surface*,ConvertSurfaceFormat,(SDL_Surface *a, Uint32 b),(a,b),return)
SDL3_SYM_PASSTHROUGH(int,ConvertPixels,(int a, int b, Uint32 c, const void *d, int e, Uint32 f, void *g, int h),(a,b,c,d,e,f,g,h),return)