sdl2-compat: events: Adjust mouse coordinates when using 2D renderer's logical scaling.

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)