sdl2-compat: Fix running. but few FIXME's with full screen display mode

From eb5cc6ea5f10360f6bcfa38bc4cd63350a3c3f36 Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
Date: Thu, 2 Feb 2023 10:48:18 +0100
Subject: [PATCH] Fix running. but few FIXME's with full screen display mode

---
 src/sdl2_compat.c | 74 ++++++++++++++++++++++++++++++++++++++---------
 src/sdl3_syms.h   |  7 ++---
 2 files changed, 63 insertions(+), 18 deletions(-)

diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index 42c14b0..b605b80 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -3347,7 +3347,11 @@ DECLSPEC int SDLCALL
 SDL_GetNumDisplayModes(int displayIndex)
 {
     SDL_DisplayID displayID = Display_IndexToID(displayIndex);
-    return SDL3_GetNumDisplayModes(displayID);
+    int count = 0;
+    SDL_DisplayMode **list;
+    list = SDL3_GetFullscreenDisplayModes(displayID, &count);
+    SDL_free(list);
+    return count;
 }
 
 DECLSPEC int SDLCALL
@@ -3374,9 +3378,18 @@ SDL_GetDisplayOrientation(int displayIndex)
 DECLSPEC int SDLCALL
 SDL_GetDisplayMode(int displayIndex, int modeIndex, SDL2_DisplayMode *mode)
 {
-    SDL_DisplayMode dp;
-    int ret = SDL3_GetDisplayMode(Display_IndexToID(displayIndex), modeIndex, mode ? &dp : NULL);
-    DisplayMode_3to2(&dp, mode);
+    SDL_DisplayID displayID = Display_IndexToID(displayIndex);
+    SDL_DisplayMode **list;
+    int count = 0;
+    int ret = -1;
+    list = SDL3_GetFullscreenDisplayModes(displayID, &count);
+    if (modeIndex >= 0 && modeIndex < count) {
+        if (mode) {
+            DisplayMode_3to2(list[modeIndex], mode);
+        }
+        ret = 1;
+    }
+    SDL_free(list);
     return ret;
 }
 
@@ -3401,15 +3414,24 @@ SDL_GetDesktopDisplayMode(int displayIndex, SDL2_DisplayMode *mode)
 DECLSPEC int SDLCALL
 SDL_GetWindowDisplayMode(SDL_Window *window, SDL2_DisplayMode *mode)
 {
-    SDL_DisplayMode dp;
-    int ret = SDL3_GetWindowDisplayMode(window, mode ? &dp : NULL);
-    DisplayMode_3to2(&dp, mode);
+    int ret;
+    SDL_DisplayMode *dp;
+    dp = SDL3_GetWindowFullscreenMode(window);
+    if (dp) {
+        if (mode) {
+            DisplayMode_3to2(dp, mode);
+        }
+        ret = 0;
+    } else {
+        ret = -1;
+    }
     return ret;
 }
 
 DECLSPEC SDL2_DisplayMode * SDLCALL
 SDL_GetClosestDisplayMode(int displayIndex, const SDL2_DisplayMode *mode, SDL2_DisplayMode *closest)
 {
+#if 0
     SDL_DisplayMode dp;
     SDL_DisplayMode closest3;
     SDL_DisplayMode *ret;
@@ -3418,14 +3440,35 @@ SDL_GetClosestDisplayMode(int displayIndex, const SDL2_DisplayMode *mode, SDL2_D
     ret = SDL3_GetClosestDisplayMode(Display_IndexToID(displayIndex), mode ? &dp : NULL, closest ? &closest3 : NULL);
     DisplayMode_3to2(ret, &ret2);
     return &ret2;
+#endif
+    // FIXME
+    SDL_Log("FIXME missing SDL_GetClosestDisplayMode");
+    return NULL;
 }
 
 DECLSPEC int SDLCALL
 SDL_SetWindowDisplayMode(SDL_Window *window, const SDL2_DisplayMode *mode)
 {
+#if 0
     SDL_DisplayMode dp;
     DisplayMode_2to3(mode, &dp);
-    return SDL3_SetWindowDisplayMode(window, mode ? &dp : NULL);
+    return SDL3_SetWindowFullscreenMode(window, mode ? &dp : NULL);
+#else
+    int count = 0;
+    SDL_DisplayMode **list;
+    int ret = -1;
+    list = SDL3_GetFullscreenDisplayModes(SDL3_GetWindowID(window), &count);
+    if (list && count) {
+        ret = SDL3_SetWindowFullscreenMode(window, list[0]);
+        ret = 0;
+
+    } else {
+        SDL_Log("FIXME no FullscreenDisplayModes ?");
+        SDL_Log("list = %p count = %d window:%p %d", list, count, window, SDL3_GetWindowID(window));
+    }
+    SDL_free(list);
+    return 0;  // FIXME
+#endif
 }
 
 DECLSPEC int SDLCALL
@@ -3746,9 +3789,9 @@ SDL_GetWindowFlags(SDL_Window *window)
 DECLSPEC SDL_Window * SDLCALL
 SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
 {
-    flags &= SDL2_WINDOW_SHOWN;
+    flags &= ~SDL2_WINDOW_SHOWN;
     if (flags & SDL2_WINDOW_FULLSCREEN_DESKTOP) {
-        flags &= SDL2_WINDOW_FULLSCREEN_DESKTOP;
+        flags &= ~SDL2_WINDOW_FULLSCREEN_DESKTOP;
         flags |= SDL_WINDOW_FULLSCREEN; /* FIXME  force fullscreen desktop ? */
     }
     return SDL3_CreateWindow(title, x, y, w, h, flags);
@@ -3757,11 +3800,16 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
 DECLSPEC int SDLCALL
 SDL_SetWindowFullscreen(SDL_Window *window, Uint32 flags)
 {
+    int flags3 = SDL_FALSE;
+
     if (flags & SDL2_WINDOW_FULLSCREEN_DESKTOP) {
-        flags &= SDL2_WINDOW_FULLSCREEN_DESKTOP;
-        flags |= SDL_WINDOW_FULLSCREEN; /* FIXME  force fullscreen desktop ? */
+        flags3 = SDL_TRUE;
+    }
+    if (flags & SDL_WINDOW_FULLSCREEN) {
+        flags3 = SDL_TRUE;
     }
-    return SDL3_SetWindowFullscreen(window, flags);
+
+    return SDL3_SetWindowFullscreen(window, flags3);
 }
 
 /* SDL3 added a return value. We just throw it away for SDL2. */
diff --git a/src/sdl3_syms.h b/src/sdl3_syms.h
index adacdd4..6a562b1 100644
--- a/src/sdl3_syms.h
+++ b/src/sdl3_syms.h
@@ -482,13 +482,9 @@ SDL3_SYM_PASSTHROUGH(const char*,GetVideoDriver,(int a),(a),return)
 SDL3_SYM_PASSTHROUGH(const char*,GetCurrentVideoDriver,(void),(),return)
 SDL3_SYM(const char*,GetDisplayName,(SDL_DisplayID a),(a),return)
 SDL3_SYM(int,GetDisplayBounds,(SDL_DisplayID a, SDL_Rect *b),(a,b),return)
-SDL3_SYM(int,GetNumDisplayModes,(SDL_DisplayID a),(a),return)
-SDL3_SYM(int,GetDisplayMode,(SDL_DisplayID a, int b, SDL_DisplayMode *c),(a,b,c),return)
 SDL3_SYM(int,GetDesktopDisplayMode,(SDL_DisplayID a, SDL_DisplayMode *b),(a,b),return)
 SDL3_SYM(int,GetCurrentDisplayMode,(SDL_DisplayID a, SDL_DisplayMode *b),(a,b),return)
-SDL3_SYM(SDL_DisplayMode*,GetClosestDisplayMode,(SDL_DisplayID a, const SDL_DisplayMode *b, SDL_DisplayMode *c),(a,b,c),return)
-SDL3_SYM(int,SetWindowDisplayMode,(SDL_Window *a, const SDL_DisplayMode *b),(a,b),return)
-SDL3_SYM(int,GetWindowDisplayMode,(SDL_Window *a, SDL_DisplayMode *b),(a,b),return)
+SDL3_SYM(int,SetWindowFullscreenMode,(SDL_Window *a, const SDL_DisplayMode *b),(a,b),return)
 SDL3_SYM_PASSTHROUGH(Uint32,GetWindowPixelFormat,(SDL_Window *a),(a),return)
 SDL3_SYM(SDL_Window*,CreateWindow,(const char *a, int b, int c, int d, int e, Uint32 f),(a,b,c,d,e,f),return)
 SDL3_SYM_PASSTHROUGH(SDL_Window*,CreateWindowFrom,(const void *a),(a),return)
@@ -916,6 +912,7 @@ SDL3_SYM(SDL_DisplayID,GetDisplayForRect,(const SDL_Rect *a),(a),return)
 SDL3_SYM(SDL_DisplayID,GetPrimaryDisplay,(),(),return)
 SDL3_SYM(int,RunApp,(int a, char *b, SDL_main_func c, void *d),(a,b,c,d),return)
 SDL3_SYM(SDL_DisplayMode *,GetWindowFullscreenMode,(SDL_Window *a),(a),return)
+SDL3_SYM(SDL_DisplayMode **,GetFullscreenDisplayModes,(SDL_DisplayID a, int *b),(a,b),return)
 
 #undef SDL3_SYM
 #undef SDL3_SYM_PASSTHROUGH