SDL 3.0
SDL_main_impl.h
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22/* WIKI CATEGORY: Main */
23
24#ifndef SDL_main_impl_h_
25#define SDL_main_impl_h_
26
27#ifndef SDL_main_h_
28#error "This header should not be included directly, but only via SDL_main.h!"
29#endif
30
31/* if someone wants to include SDL_main.h but doesn't want the main handing magic,
32 (maybe to call SDL_RegisterApp()) they can #define SDL_MAIN_HANDLED first
33 SDL_MAIN_NOIMPL is for SDL-internal usage (only affects implementation,
34 not definition of SDL_MAIN_AVAILABLE etc in SDL_main.h) and if the user wants
35 to have the SDL_main implementation (from this header) in another source file
36 than their main() function, for example if SDL_main requires C++
37 and main() is implemented in plain C */
38#if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL)
39
40 /* the implementations below must be able to use the implement real main(), nothing renamed
41 (the user's main() will be renamed to SDL_main so it can be called from here) */
42 #ifdef main
43 #undef main
44 #endif
45
46 #ifdef SDL_MAIN_USE_CALLBACKS
47
48 #if 0
49 /* currently there are no platforms that _need_ a magic entry point here
50 for callbacks, but if one shows up, implement it here. */
51
52 #else /* use a standard SDL_main, which the app SHOULD NOT ALSO SUPPLY. */
53
54 /* this define makes the normal SDL_main entry point stuff work...we just provide SDL_main() instead of the app. */
55 #define SDL_MAIN_CALLBACK_STANDARD 1
56
57 int SDL_main(int argc, char **argv)
58 {
59 return SDL_EnterAppMainCallbacks(argc, argv, SDL_AppInit, SDL_AppIterate, SDL_AppEvent, SDL_AppQuit);
60 }
61
62 #endif /* platform-specific tests */
63
64 #endif /* SDL_MAIN_USE_CALLBACKS */
65
66
67 /* set up the usual SDL_main stuff if we're not using callbacks or if we are but need the normal entry point. */
68 #if !defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD)
69
70 #if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK)
71
72 /* these defines/typedefs are needed for the WinMain() definition */
73 #ifndef WINAPI
74 #define WINAPI __stdcall
75 #endif
76
77 typedef struct HINSTANCE__ * HINSTANCE;
78 typedef char *LPSTR;
79 typedef wchar_t *PWSTR;
80
81 /* The VC++ compiler needs main/wmain defined, but not for GDK */
82 #if defined(_MSC_VER) && !defined(SDL_PLATFORM_GDK)
83
84 /* This is where execution begins [console apps] */
85 #if defined( UNICODE ) && UNICODE
86 int wmain(int argc, wchar_t *wargv[], wchar_t *wenvp)
87 {
88 (void)argc;
89 (void)wargv;
90 (void)wenvp;
91 return SDL_RunApp(0, NULL, SDL_main, NULL);
92 }
93 #else /* ANSI */
94 int main(int argc, char *argv[])
95 {
96 (void)argc;
97 (void)argv;
98 return SDL_RunApp(0, NULL, SDL_main, NULL);
99 }
100 #endif /* UNICODE */
101
102 #endif /* _MSC_VER && ! SDL_PLATFORM_GDK */
103
104 /* This is where execution begins [windowed apps and GDK] */
105
106 #ifdef __cplusplus
107 extern "C" {
108 #endif
109
110 #if defined( UNICODE ) && UNICODE
111 int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, PWSTR szCmdLine, int sw)
112 #else /* ANSI */
113 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
114 #endif
115 {
116 (void)hInst;
117 (void)hPrev;
118 (void)szCmdLine;
119 (void)sw;
120 return SDL_RunApp(0, NULL, SDL_main, NULL);
121 }
122
123 #ifdef __cplusplus
124 } /* extern "C" */
125 #endif
126
127 /* end of SDL_PLATFORM_WIN32 and SDL_PLATFORM_GDK impls */
128
129 #elif defined(SDL_PLATFORM_WINRT)
130
131 /* WinRT main based on SDL_winrt_main_NonXAML.cpp, placed in the public domain by David Ludwig 3/13/14 */
132
133 #include <wrl.h>
134
135 /* At least one file in any SDL/WinRT app appears to require compilation
136 with C++/CX, otherwise a Windows Metadata file won't get created, and
137 an APPX0702 build error can appear shortly after linking.
138
139 The following set of preprocessor code forces this file to be compiled
140 as C++/CX, which appears to cause Visual C++ 2012's build tools to
141 create this .winmd file, and will help allow builds of SDL/WinRT apps
142 to proceed without error.
143
144 If other files in an app's project enable C++/CX compilation, then it might
145 be possible for the .cpp file including SDL_main.h to be compiled without /ZW,
146 for Visual C++'s build tools to create a winmd file, and for the app to
147 build without APPX0702 errors. In this case, if
148 SDL_WINRT_METADATA_FILE_AVAILABLE is defined as a C/C++ macro, then
149 the #error (to force C++/CX compilation) will be disabled.
150
151 Please note that /ZW can be specified on a file-by-file basis. To do this,
152 right click on the file in Visual C++, click Properties, then change the
153 setting through the dialog that comes up.
154 */
155 #ifndef SDL_WINRT_METADATA_FILE_AVAILABLE
156 #if !defined(__cplusplus) || (!defined(__cplusplus_winrt) && _MSVC_LANG < 202002L)
157 #error The C++ file that includes SDL_main.h must be compiled as C++ code with /ZW, otherwise build errors due to missing .winmd files can occur.
158 #endif
159 #endif
160
161 /* Prevent MSVC++ from warning about threading models when defining our
162 custom WinMain. The threading model will instead be set via a direct
163 call to Windows::Foundation::Initialize (rather than via an attributed
164 function).
165
166 To note, this warning (C4447) does not seem to come up unless this file
167 is compiled with C++/CX enabled (via the /ZW compiler flag).
168 */
169 #ifdef _MSC_VER
170 #pragma warning(disable : 4447)
171 /* Make sure the function to initialize the Windows Runtime gets linked in. */
172 #pragma comment(lib, "runtimeobject.lib")
173 #endif
174
175 #ifdef __cplusplus
176 extern "C" {
177 #endif
178 int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
179 {
180 return SDL_RunApp(0, NULL, SDL_main, NULL);
181 }
182 #if _MSVC_LANG >= 202002L
183 int main(int argc, char** argv) {
184 return SDL_RunApp(argc, argv, SDL_main, NULL);
185 }
186 #endif
187 #ifdef __cplusplus
188 } /* extern "C" */
189 #endif
190
191 /* end of WinRT impl */
192
193 #elif defined(SDL_PLATFORM_NGAGE)
194 /* same typedef as in ngage SDKs e32def.h */
195 typedef signed int TInt;
196 /* TODO: if it turns out that this only works when built as C++,
197 move SDL_PLATFORM_NGAGE into the C++ section in SDL_main.h */
198 TInt E32Main()
199 {
200 return SDL_RunApp(0, NULL, SDL_main, NULL);
201 }
202
203 /* end of SDL_PLATFORM_NGAGE impl */
204
205 #else /* platforms that use a standard main() and just call SDL_RunApp(), like iOS and 3DS */
206 int main(int argc, char *argv[])
207 {
208 return SDL_RunApp(argc, argv, SDL_main, NULL);
209 }
210
211 /* end of impls for standard-conforming platforms */
212
213 #endif /* SDL_PLATFORM_WIN32 etc */
214
215 #endif /* !defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD) */
216
217 /* rename users main() function to SDL_main() so it can be called from the wrappers above */
218 #define main SDL_main
219
220#endif /* SDL_MAIN_HANDLED */
221
222#endif /* SDL_main_impl_h_ */
#define NULL
SDLMAIN_DECLSPEC int SDL_main(int argc, char *argv[])
int SDL_EnterAppMainCallbacks(int argc, char *argv[], SDL_AppInit_func appinit, SDL_AppIterate_func appiter, SDL_AppEvent_func appevent, SDL_AppQuit_func appquit)
int SDL_RunApp(int argc, char *argv[], SDL_main_func mainFunction, void *reserved)
#define main