From 7bfc41db3c1a53bcd0d05c00920b816270077e0b Mon Sep 17 00:00:00 2001
From: Daniel Gibson <[EMAIL REDACTED]>
Date: Thu, 15 Dec 2022 06:01:34 +0100
Subject: [PATCH] Unify all the SDL_*RunApp() functions into just SDL_RunApp()
makes the SDL_main code shorter
Also added a generic SDL_RunApp() implementation for platforms that
don't really need it.
Some platforms (that use SDL_main but haven't been ported yet) are
still missing, but are added in the following commits.
---
CMakeLists.txt | 1 +
build-scripts/fnsince.pl | 1 -
include/SDL3/SDL_main.h | 111 +++++++++----------------
include/SDL3/SDL_main_impl.h | 38 ++-------
src/core/SDL_runapp.c | 45 ++++++++++
src/core/gdk/SDL_gdk.cpp | 2 +-
src/core/n3ds/SDL_n3ds.c | 2 +-
src/core/windows/SDL_windows.c | 7 +-
src/core/winrt/SDL_winrtapp_common.cpp | 2 +-
src/dynapi/SDL_dynapi.sym | 5 +-
src/dynapi/SDL_dynapi_overrides.h | 6 +-
src/dynapi/SDL_dynapi_procs.h | 12 +--
src/main/windows/SDL_windows_main.c | 2 +-
src/video/uikit/SDL_uikitappdelegate.m | 2 +-
14 files changed, 106 insertions(+), 130 deletions(-)
create mode 100644 src/core/SDL_runapp.c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d6e3d620fd9..5ab49f6da875 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -515,6 +515,7 @@ file(GLOB SOURCE_FILES
${SDL3_SOURCE_DIR}/src/*.c
${SDL3_SOURCE_DIR}/src/atomic/*.c
${SDL3_SOURCE_DIR}/src/audio/*.c
+ ${SDL3_SOURCE_DIR}/src/core/*.c
${SDL3_SOURCE_DIR}/src/cpuinfo/*.c
${SDL3_SOURCE_DIR}/src/dynapi/*.c
${SDL3_SOURCE_DIR}/src/events/*.c
diff --git a/build-scripts/fnsince.pl b/build-scripts/fnsince.pl
index 53a30888e0ac..9e95886db930 100755
--- a/build-scripts/fnsince.pl
+++ b/build-scripts/fnsince.pl
@@ -92,7 +92,6 @@
# until a later release, but are available in the older release.
$funcs{'SDL_WinRTGetFSPathUNICODE'} = '2.0.3';
$funcs{'SDL_WinRTGetFSPathUTF8'} = '2.0.3';
-$funcs{'SDL_WinRTRunApp'} = '2.0.3';
if (not defined $wikipath) {
foreach my $release (@releases) {
diff --git a/include/SDL3/SDL_main.h b/include/SDL3/SDL_main.h
index fffa78a49925..6abddaa47d06 100644
--- a/include/SDL3/SDL_main.h
+++ b/include/SDL3/SDL_main.h
@@ -43,11 +43,13 @@
/* On WinRT, SDL provides a main function that initializes CoreApplication,
creating an instance of IFrameworkView in the process.
- Please note that #include'ing SDL_main.h is not enough to get a main()
- function working. In non-XAML apps, the file,
- src/main/winrt/SDL_WinRT_main_NonXAML.cpp, or a copy of it, must be compiled
- into the app itself. In XAML apps, the function, SDL_WinRTRunApp must be
- called, with a pointer to the Direct3D-hosted XAML control passed in.
+ Ideally, #include'ing SDL_main.h is enough to get a main() function working.
+ However, that requires the source file your main() is in to be compiled
+ as C++ *and* with the /ZW compiler flag. If that's not feasible, add an
+ otherwise empty .cpp file that only contains `#include <SDL3/SDL_main.h>`
+ and build that with /ZW (still include SDL_main.h in your other file with main()!).
+ In XAML apps, instead the function SDL_RunApp() must be called with a pointer
+ to the Direct3D-hosted XAML control passed in as the "reserved" argument.
*/
#define SDL_MAIN_NEEDED
@@ -57,7 +59,7 @@
If you prefer to write your own WinMain-function instead of having SDL
provide one that calls your main() function,
#define SDL_MAIN_HANDLED before #include'ing SDL_main.h
- and call the SDL_GDKRunApp function from your entry point.
+ and call the SDL_RunApp function from your entry point.
*/
#define SDL_MAIN_NEEDED
@@ -161,6 +163,31 @@ extern SDLMAIN_DECLSPEC int SDL_main(int argc, char *argv[]);
*/
extern DECLSPEC void SDLCALL SDL_SetMainReady(void);
+/**
+ * Initializes and launches an SDL application, by doing platform-specific
+ * initialization before calling your mainFunction and cleanups after it returns,
+ * if that is needed for a specific platform, otherwise it just calls mainFunction.
+ * You can use this if you want to use your own main() implementation
+ * without using SDL_main (like when using SDL_MAIN_HANDLED).
+ * When using this, you do *not* need SDL_SetMainReady().
+ *
+ * \param argc The argc parameter from the application's main() function,
+ * or 0 if the platform's main-equivalent has no argc
+ * \param argv The argv parameter from the application's main() function,
+ * or NULL if the platform's main-equivalent has no argv
+ * \param mainFunction Your SDL app's C-style main(), an SDL_main_func.
+ * NOT the function you're calling this from!
+ * Its name doesn't matter, but its signature must be
+ * like int my_main(int argc, char* argv[])
+ * \param reserved should be NULL (reserved for future use, will probably
+ * be platform-specific then)
+ * \return the return value from mainFunction: 0 on success, -1 on failure;
+ * SDL_GetError() might have more information on the failure
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern DECLSPEC int SDLCALL SDL_RunApp(int argc, char* argv[], SDL_main_func mainFunction, void * reserved);
+
#if defined(__WIN32__) || defined(__GDK__)
/**
@@ -207,93 +234,35 @@ extern DECLSPEC void SDLCALL SDL_UnregisterApp(void);
#endif /* defined(__WIN32__) || defined(__GDK__) */
-#ifdef __WIN32__
-
-/**
- * Initialize and launch an SDL/Win32 (classic WinAPI) application.
- *
- * \param mainFunction the SDL app's C-style main(), an SDL_main_func
- * \param reserved reserved for future use; should be NULL
- * \returns 0 on success or -1 on failure; call SDL_GetError() to retrieve
- * more information on the failure.
- *
- * \since This function is available since SDL 3.0.0.
- */
-extern DECLSPEC int SDLCALL SDL_Win32RunApp(SDL_main_func mainFunction, void * reserved);
-
-#endif /* __WIN32__ */
#ifdef __WINRT__
-/**
- * Initialize and launch an SDL/WinRT application.
- *
- * \param mainFunction the SDL app's C-style main(), an SDL_main_func
- * \param reserved reserved for future use; should be NULL
- * \returns 0 on success or -1 on failure; call SDL_GetError() to retrieve
- * more information on the failure.
- *
- * \since This function is available since SDL 2.0.3.
- */
-extern DECLSPEC int SDLCALL SDL_WinRTRunApp(SDL_main_func mainFunction, void * reserved);
+/* for compatibility with SDL2's function of this name */
+#define SDL_WinRTRunApp(MAIN_FUNC, RESERVED) SDL_RunApp(0, NULL, MAIN_FUNC, RESERVED)
#endif /* __WINRT__ */
#if defined(__IOS__)
-/**
- * Initializes and launches an SDL application.
- *
- * \param argc The argc parameter from the application's main() function
- * \param argv The argv parameter from the application's main() function
- * \param mainFunction The SDL app's C-style main(), an SDL_main_func
- * \return the return value from mainFunction
- *
- * \since This function is available since SDL 3.0.0.
- */
-extern DECLSPEC int SDLCALL SDL_UIKitRunApp(int argc, char *argv[], SDL_main_func mainFunction);
+/* for compatibility with SDL2's function of this name */
+#define SDL_UIKitRunApp(ARGC, ARGV, MAIN_FUNC) SDL_RunApp(ARGC, ARGV, MAIN_FUNC, NULL)
#endif /* __IOS__ */
#ifdef __GDK__
-/**
- * Initialize and launch an SDL GDK application.
- *
- * \param mainFunction the SDL app's C-style main(), an SDL_main_func
- * \param reserved reserved for future use; should be NULL
- * \returns 0 on success or -1 on failure; call SDL_GetError() to retrieve
- * more information on the failure.
- *
- * \since This function is available since SDL 3.0.0.
- */
-extern DECLSPEC int SDLCALL SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved);
+/* for compatibility with SDL2's function of this name */
+#define SDL_GDKRunApp(MAIN_FUNC, RESERVED) SDL_RunApp(0, NULL, MAIN_FUNC, RESERVED)
/**
* Callback from the application to let the suspend continue.
*
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 2.28.0.
*/
extern DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void);
#endif /* __GDK__ */
-#ifdef __3DS__
-
-/**
- * Initializes and launches an SDL application.
- *
- * \param argc The argc parameter from the application's main() function
- * \param argv The argv parameter from the application's main() function
- * \param mainFunction The SDL app's C-style main(), an SDL_main_func
- * \return the return value from mainFunction
- *
- * \since This function is available since SDL 3.0.0.
- */
-extern DECLSPEC int SDLCALL SDL_N3DSRunApp(int argc, char *argv[], SDL_main_func mainFunction);
-
-#endif /* __3DS__ */
-
#ifdef __cplusplus
}
#endif
diff --git a/include/SDL3/SDL_main_impl.h b/include/SDL3/SDL_main_impl.h
index 79d6e0b19db6..94166c977a30 100644
--- a/include/SDL3/SDL_main_impl.h
+++ b/include/SDL3/SDL_main_impl.h
@@ -72,7 +72,7 @@ typedef char* LPSTR;
int
console_wmain(int argc, wchar_t *wargv[], wchar_t *wenvp)
{
- return SDL_Win32RunApp(SDL_main, NULL);
+ return SDL_RunApp(0, NULL, SDL_main, NULL);
}
#else /* ANSI */
@@ -81,7 +81,7 @@ console_wmain(int argc, wchar_t *wargv[], wchar_t *wenvp)
int
console_ansi_main(int argc, char *argv[])
{
- return SDL_Win32RunApp(SDL_main, NULL);
+ return SDL_RunApp(0, NULL, SDL_main, NULL);
}
#endif /* UNICODE/ANSI */
@@ -91,11 +91,7 @@ console_ansi_main(int argc, char *argv[])
int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
{
-#ifdef __GDK__
- return SDL_GDKRunApp(SDL_main, NULL);
-#else
- return SDL_Win32RunApp(SDL_main, NULL);
-#endif
+ return SDL_RunApp(0, NULL, SDL_main, NULL);
}
#ifdef __cplusplus
@@ -156,31 +152,11 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
- return SDL_WinRTRunApp(SDL_main, NULL);
+ return SDL_RunApp(0, NULL, SDL_main, NULL);
}
/* end of WinRT impl */
-#elif defined(__IOS__) || defined(__TVOS__)
-
-#include <SDL3/begin_code.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int main(int argc, char *argv[])
-{
- return SDL_UIKitRunApp(argc, argv, SDL_main);
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include <SDL3/close_code.h>
-
-/* end of __IOS__ and __TVOS__ impls */
-#elif defined(__3DS__)
+#elif defined(__IOS__) || defined(__TVOS__) || defined(__3DS__)
#include <SDL3/begin_code.h>
@@ -190,7 +166,7 @@ extern "C" {
int main(int argc, char *argv[])
{
- return SDL_N3DSRunApp(argc, argv, SDL_main);
+ return SDL_RunApp(argc, argv, SDL_main, NULL);
}
#ifdef __cplusplus
@@ -199,7 +175,7 @@ int main(int argc, char *argv[])
#include <SDL3/close_code.h>
-/* end of __3DS__ impl */
+/* end of __IOS__, __3DS__, __TVOS__ impls */
/* TODO: remaining platforms */
diff --git a/src/core/SDL_runapp.c b/src/core/SDL_runapp.c
new file mode 100644
index 000000000000..6adb16b7c18b
--- /dev/null
+++ b/src/core/SDL_runapp.c
@@ -0,0 +1,45 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_internal.h"
+
+/* Most platforms that use/need SDL_main have their own SDL_RunApp() implementation.
+ * If not, you can special case it here by appending || defined(__YOUR_PLATFORM__) */
+#if ( !defined(SDL_MAIN_NEEDED) && !defined(SDL_MAIN_AVAILABLE) ) || defined(__ANDROID__)
+
+DECLSPEC int
+SDL_RunApp(int argc, char* argv[], SDL_main_func mainFunction, void * reserved)
+{
+ char empty[1] = {0};
+ char* argvdummy[2] = { empty, NULL };
+
+ (void)reserved;
+
+ if(argv == NULL)
+ {
+ argc = 0;
+ /* make sure argv isn't NULL, in case some user code doesn't like that */
+ argv = argvdummy;
+ }
+
+ return mainFunction(argc, argv);
+}
+
+#endif
diff --git a/src/core/gdk/SDL_gdk.cpp b/src/core/gdk/SDL_gdk.cpp
index f4f01a737188..ff23abe4d5bd 100644
--- a/src/core/gdk/SDL_gdk.cpp
+++ b/src/core/gdk/SDL_gdk.cpp
@@ -84,7 +84,7 @@ OutOfMemory(void)
/* Gets the arguments with GetCommandLine, converts them to argc and argv
and calls SDL_main */
extern "C" DECLSPEC int
-SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved)
+SDL_RunApp(int, char**, SDL_main_func mainFunction, void *reserved)
{
LPWSTR *argvw;
char **argv;
diff --git a/src/core/n3ds/SDL_n3ds.c b/src/core/n3ds/SDL_n3ds.c
index 1b8727a98cd7..73a68d94a099 100644
--- a/src/core/n3ds/SDL_n3ds.c
+++ b/src/core/n3ds/SDL_n3ds.c
@@ -26,7 +26,7 @@
#include <3ds.h>
DECLSPEC int
-SDL_N3DSRunApp(int argc, char *argv[], SDL_main_func mainFunction)
+SDL_RunApp(int argc, char* argv[], SDL_main_func mainFunction, void * reserved)
{
int result;
/* init */
diff --git a/src/core/windows/SDL_windows.c b/src/core/windows/SDL_windows.c
index 5d417774bd01..9ba9fe1ff4f4 100644
--- a/src/core/windows/SDL_windows.c
+++ b/src/core/windows/SDL_windows.c
@@ -331,7 +331,8 @@ void WIN_RectToRECT(const SDL_Rect *sdlrect, RECT *winrect)
winrect->bottom = sdlrect->y + sdlrect->h - 1;
}
-/* SDL_Win32RunApp(), which does most of the SDL_main work for Win32 */
+/* Win32-specific SDL_RunApp(), which does most of the SDL_main work,
+ based on SDL_windows_main.c, placed in the public domain by Sam Lantinga 4/13/98 */
#ifdef __WIN32__
#include <shellapi.h> /* CommandLineToArgvW() */
@@ -345,7 +346,7 @@ OutOfMemory(void)
}
DECLSPEC int
-SDL_Win32RunApp(SDL_main_func mainFunction, void * xamlBackgroundPanel)
+SDL_RunApp(int _argc, char* _argv[], SDL_main_func mainFunction, void * reserved)
{
/* Gets the arguments with GetCommandLine, converts them to argc and argv
@@ -355,6 +356,8 @@ SDL_Win32RunApp(SDL_main_func mainFunction, void * xamlBackgroundPanel)
char **argv;
int i, argc, result;
+ (void)_argc; (void)_argv; (void)reserved;
+
argvw = CommandLineToArgvW(GetCommandLineW(), &argc);
if (argvw == NULL) {
return OutOfMemory();
diff --git a/src/core/winrt/SDL_winrtapp_common.cpp b/src/core/winrt/SDL_winrtapp_common.cpp
index 4de8e51adca4..1d7219cc61ed 100644
--- a/src/core/winrt/SDL_winrtapp_common.cpp
+++ b/src/core/winrt/SDL_winrtapp_common.cpp
@@ -28,7 +28,7 @@
int (*WINRT_SDLAppEntryPoint)(int, char **) = NULL;
extern "C" DECLSPEC int
-SDL_WinRTRunApp(SDL_main_func mainFunction, void *xamlBackgroundPanel)
+SDL_RunApp(int, char**, SDL_main_func mainFunction, void * xamlBackgroundPanel)
{
if (xamlBackgroundPanel) {
return SDL_WinRTInitXAMLApp(mainFunction, xamlBackgroundPanel);
diff --git a/src/dynapi/SDL_dynapi.sym b/src/dynapi/SDL_dynapi.sym
index 785c1515be59..cffe4f2259f1 100644
--- a/src/dynapi/SDL_dynapi.sym
+++ b/src/dynapi/SDL_dynapi.sym
@@ -521,9 +521,6 @@ SDL3_0.0.0 {
SDL_SetMainReady;
SDL_RegisterApp;
SDL_UnregisterApp;
- SDL_WinRTRunApp;
- SDL_UIKitRunApp;
- SDL_GDKRunApp;
SDL_GDKSuspendComplete;
SDL_GetBasePath;
SDL_GetPrefPath;
@@ -861,7 +858,7 @@ SDL3_0.0.0 {
SDL_DelayNS;
SDL_GetEventState;
SDL_GetRenderDriver;
- SDL_Win32RunApp;
+ SDL_RunApp;
# extra symbols go here (don't modify this line)
local: *;
};
diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h
index 7b6817933586..1927b53eef40 100644
--- a/src/dynapi/SDL_dynapi_overrides.h
+++ b/src/dynapi/SDL_dynapi_overrides.h
@@ -554,7 +554,6 @@
#define SDL_GetAssertionHandler SDL_GetAssertionHandler_REAL
#define SDL_DXGIGetOutputInfo SDL_DXGIGetOutputInfo_REAL
#define SDL_RenderIsClipEnabled SDL_RenderIsClipEnabled_REAL
-#define SDL_WinRTRunApp SDL_WinRTRunApp_REAL
#define SDL_WarpMouseGlobal SDL_WarpMouseGlobal_REAL
#define SDL_WinRTGetFSPathUNICODE SDL_WinRTGetFSPathUNICODE_REAL
#define SDL_WinRTGetFSPathUTF8 SDL_WinRTGetFSPathUTF8_REAL
@@ -693,7 +692,6 @@
#define SDL_RenderCopyF SDL_RenderCopyF_REAL
#define SDL_RenderCopyExF SDL_RenderCopyExF_REAL
#define SDL_GetTouchDeviceType SDL_GetTouchDeviceType_REAL
-#define SDL_UIKitRunApp SDL_UIKitRunApp_REAL
#define SDL_SIMDGetAlignment SDL_SIMDGetAlignment_REAL
#define SDL_SIMDAlloc SDL_SIMDAlloc_REAL
#define SDL_SIMDFree SDL_SIMDFree_REAL
@@ -858,7 +856,6 @@
#define SDL_RenderGetD3D12Device SDL_RenderGetD3D12Device_REAL
#define SDL_utf8strnlen SDL_utf8strnlen_REAL
#define SDL_GDKGetTaskQueue SDL_GDKGetTaskQueue_REAL
-#define SDL_GDKRunApp SDL_GDKRunApp_REAL
#define SDL_GetOriginalMemoryFunctions SDL_GetOriginalMemoryFunctions_REAL
#define SDL_ResetKeyboard SDL_ResetKeyboard_REAL
#define SDL_GetDefaultAudioInfo SDL_GetDefaultAudioInfo_REAL
@@ -885,5 +882,4 @@
#define SDL_DelayNS SDL_DelayNS_REAL
#define SDL_GetEventState SDL_GetEventState_REAL
#define SDL_GetRenderDriver SDL_GetRenderDriver_REAL
-#define SDL_Win32RunApp SDL_Win32RunApp_REAL
-#define SDL_N3DSRunApp SDL_N3DSRunApp_REAL
+#define SDL_RunApp SDL_RunApp_REAL
diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h
index f402bd11409c..9022b043ee9a 100644
--- a/src/dynapi/SDL_dynapi_procs.h
+++ b/src/dynapi/SDL_dynapi_procs.h
@@ -583,7 +583,6 @@ SDL_DYNAPI_PROC(SDL_bool,SDL_DXGIGetOutputInfo,(int a, int *b, int *c),(a,b,c),r
#endif
SDL_DYNAPI_PROC(SDL_bool,SDL_RenderIsClipEnabled,(SDL_Renderer *a),(a),return)
#ifdef __WINRT__
-SDL_DYNAPI_PROC(int,SDL_WinRTRunApp,(SDL_main_func a, void *b),(a,b),return)
SDL_DYNAPI_PROC(const wchar_t*,SDL_WinRTGetFSPathUNICODE,(SDL_WinRT_Path a),(a),return)
SDL_DYNAPI_PROC(const char*,SDL_WinRTGetFSPathUTF8,(SDL_WinRT_Path a),(a),return)
#endif
@@ -744,9 +743,6 @@ SDL_DYNAPI_PROC(int,SDL_RenderFillRectsF,(SDL_Renderer *a, const SDL_FRect *b, i
SDL_DYNAPI_PROC(int,SDL_RenderCopyF,(SDL_Renderer *a, SDL_Texture *b, const SDL_Rect *c, const SDL_FRect *d),(a,b,c,d),return)
SDL_DYNAPI_PROC(int,SDL_RenderCopyExF,(SDL_Renderer *a, SDL_Texture *b, const SDL_Rect *c, const SDL_FRect *d, const double e, const SDL_FPoint *f, const SDL_RendererFlip g),(a,b,c,d,e,f,g),return)
SDL_DYNAPI_PROC(SDL_TouchDeviceType,SDL_GetTouchDeviceType,(SDL_TouchID a),(a),return)
-#ifdef __IOS__
-SDL_DYNAPI_PROC(int,SDL_UIKitRunApp,(int a, char *b[], SDL_main_func c),(a,b,c),return)
-#endif
SDL_DYNAPI_PROC(size_t,SDL_SIMDGetAlignment,(void),(),return)
SDL_DYNAPI_PROC(void*,SDL_SIMDAlloc,(const size_t a),(a),return)
SDL_DYNAPI_PROC(void,SDL_SIMDFree,(void *a),(a),)
@@ -931,7 +927,6 @@ SDL_DYNAPI_PROC(size_t,SDL_utf8strnlen,(const char *a, size_t b),(a,b),return)
#if defined(__GDK__)
SDL_DYNAPI_PROC(int,SDL_GDKGetTaskQueue,(XTaskQueueHandle *a),(a),return)
-SDL_DYNAPI_PROC(int,SDL_GDKRunApp,(SDL_main_func a, void *b),(a,b),return)
#endif
SDL_DYNAPI_PROC(void,SDL_GetOriginalMemoryFunctions,(SDL_malloc_func *a, SDL_calloc_func *b, SDL_realloc_func *c, SDL_free_func *d),(a,b,c,d),)
SDL_DYNAPI_PROC(void,SDL_ResetKeyboard,(void),(),)
@@ -961,9 +956,4 @@ SDL_DYNAPI_PROC(Uint64,SDL_GetTicksNS,(void),(),return)
SDL_DYNAPI_PROC(void,SDL_DelayNS,(Uint64 a),(a),)
SDL_DYNAPI_PROC(Uint8,SDL_GetEventState,(Uint32 a),(a),return)
SDL_DYNAPI_PROC(const char*,SDL_GetRenderDriver,(int a),(a),return)
-#if defined(__WIN32__)
-SDL_DYNAPI_PROC(int,SDL_Win32RunApp,(SDL_main_func a, void *b),(a,b),return)
-#endif
-#if defined(__3DS__)
-SDL_DYNAPI_PROC(int,SDL_N3DSRunApp,(int a, char *b[], SDL_main_func c),(a,b,c),return)
-#endif
+SDL_DYNAPI_PROC(int,SDL_RunApp,(int a, char* b[], SDL_main_func c, void *d),(a,b,c,d),return)
diff --git a/src/main/windows/SDL_windows_main.c b/src/main/windows/SDL_windows_main.c
index 36bad6ea43c7..143330d0ec47 100644
--- a/src/main/windows/SDL_windows_main.c
+++ b/src/main/windows/SDL_windows_main.c
@@ -1,7 +1,7 @@
/*
SDL_windows_main.c, placed in the public domain by Sam Lantinga 4/13/98
- Nothing to do here, the code moved into SDL_main_impl.h and SDL_windows.c (SDL_Win32RunApp())
+ Nothing to do here, the code moved into SDL_main_impl.h and SDL_windows.c (SDL_RunApp())
TODO: remove this file
*/
diff --git a/src/video/uikit/SDL_uikitappdelegate.m b/src/video/uikit/SDL_uikitappdelegate.m
index a55abb815f28..ee8ef8245286 100644
--- a/src/video/uikit/SDL_uikitappdelegate.m
+++ b/src/video/uikit/SDL_uikitappdelegate.m
@@ -47,7 +47,7 @@
static char **forward_argv;
static int exit_status;
-int SDL_UIKitRunApp(int argc, char *argv[], SDL_main_func mainFunction)
+int SDL_RunApp(int argc, char* argv[], SDL_main_func mainFunction, void * reserved)
{
int i;