SDL 3.0
SDL_main_impl.h
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2023 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#ifndef SDL_main_impl_h_
23#define SDL_main_impl_h_
24
25#if !defined(SDL_main_h_)
26#error "This header should not be included directly, but only via SDL_main.h!"
27#endif
28
29/* if someone wants to include SDL_main.h but doesn't want the main handing magic,
30 (maybe to call SDL_RegisterApp()) they can #define SDL_MAIN_HANDLED first
31 SDL_MAIN_NOIMPL is for SDL-internal usage (only affects implementation,
32 not definition of SDL_MAIN_AVAILABLE etc in SDL_main.h) and if the user wants
33 to have the SDL_main implementation (from this header) in another source file
34 than their main() function, for example if SDL_main requires C++
35 and main() is implemented in plain C */
36#if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL)
37
38/* the implementations below must be able to use the implement real main(), nothing renamed
39 (the user's main() will be renamed to SDL_main so it can be called from here) */
40#ifdef main
41# undef main
42#endif /* main */
43
44#if defined(__WIN32__) || defined(__GDK__)
45
46/* these defines/typedefs are needed for the WinMain() definition */
47#ifndef WINAPI
48#define WINAPI __stdcall
49#endif
50
51#include <SDL3/SDL_begin_code.h>
52
53#ifdef __cplusplus
54extern "C" {
55#endif
56
57typedef struct HINSTANCE__ * HINSTANCE;
58typedef char* LPSTR;
59typedef wchar_t* PWSTR;
60
61/* The VC++ compiler needs main/wmain defined, but not for GDK */
62#if defined(_MSC_VER) && !defined(__GDK__)
63
64/* This is where execution begins [console apps] */
65#if defined( UNICODE ) && UNICODE
66int wmain(int argc, wchar_t *wargv[], wchar_t *wenvp)
67{
68 (void)argc;
69 (void)wargv;
70 (void)wenvp;
71 return SDL_RunApp(0, NULL, SDL_main, NULL);
72}
73#else /* ANSI */
74int main(int argc, char *argv[])
75{
76 (void)argc;
77 (void)argv;
78 return SDL_RunApp(0, NULL, SDL_main, NULL);
79}
80#endif /* UNICODE */
81
82#endif /* _MSC_VER && ! __GDK__ */
83
84/* This is where execution begins [windowed apps and GDK] */
85#if defined( UNICODE ) && UNICODE
86int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, PWSTR szCmdLine, int sw)
87#else /* ANSI */
88int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
89#endif
90{
91 (void)hInst;
92 (void)hPrev;
93 (void)szCmdLine;
94 (void)sw;
95 return SDL_RunApp(0, NULL, SDL_main, NULL);
96}
97
98#ifdef __cplusplus
99} /* extern "C" */
100#endif
101
102#include <SDL3/SDL_close_code.h>
103
104/* end of __WIN32__ and __GDK__ impls */
105#elif defined(__WINRT__)
106
107/* WinRT main based on SDL_winrt_main_NonXAML.cpp, placed in the public domain by David Ludwig 3/13/14 */
108
109#include <wrl.h>
110
111/* At least one file in any SDL/WinRT app appears to require compilation
112 with C++/CX, otherwise a Windows Metadata file won't get created, and
113 an APPX0702 build error can appear shortly after linking.
114
115 The following set of preprocessor code forces this file to be compiled
116 as C++/CX, which appears to cause Visual C++ 2012's build tools to
117 create this .winmd file, and will help allow builds of SDL/WinRT apps
118 to proceed without error.
119
120 If other files in an app's project enable C++/CX compilation, then it might
121 be possible for the .cpp file including SDL_main.h to be compiled without /ZW,
122 for Visual C++'s build tools to create a winmd file, and for the app to
123 build without APPX0702 errors. In this case, if
124 SDL_WINRT_METADATA_FILE_AVAILABLE is defined as a C/C++ macro, then
125 the #error (to force C++/CX compilation) will be disabled.
126
127 Please note that /ZW can be specified on a file-by-file basis. To do this,
128 right click on the file in Visual C++, click Properties, then change the
129 setting through the dialog that comes up.
130*/
131#ifndef SDL_WINRT_METADATA_FILE_AVAILABLE
132#if !defined(__cplusplus) || !defined(__cplusplus_winrt)
133#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.
134#endif
135#endif
136
137/* Prevent MSVC++ from warning about threading models when defining our
138 custom WinMain. The threading model will instead be set via a direct
139 call to Windows::Foundation::Initialize (rather than via an attributed
140 function).
141
142 To note, this warning (C4447) does not seem to come up unless this file
143 is compiled with C++/CX enabled (via the /ZW compiler flag).
144*/
145#ifdef _MSC_VER
146#pragma warning(disable : 4447)
147#endif
148
149/* Make sure the function to initialize the Windows Runtime gets linked in. */
150#ifdef _MSC_VER
151#pragma comment(lib, "runtimeobject.lib")
152#endif
153
154int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
155{
156 return SDL_RunApp(0, NULL, SDL_main, NULL);
157}
158
159/* end of WinRT impl */
160#elif defined(__NGAGE__)
161
162/* same typedef as in ngage SDKs e32def.h */
163typedef signed int TInt;
164/* TODO: if it turns out that this only works when built as C++,
165 move __NGAGE__ into the C++ section in SDL_main.h */
166TInt E32Main()
167{
168 return SDL_RunApp(0, NULL, SDL_main, NULL);
169}
170
171/* end of __NGAGE__ impl */
172
173#else /* platforms that use a standard main() and just call SDL_RunApp(), like iOS and 3DS */
174
175#include <SDL3/SDL_begin_code.h>
176
177#ifdef __cplusplus
178extern "C" {
179#endif
180
181int main(int argc, char *argv[])
182{
183 return SDL_RunApp(argc, argv, SDL_main, NULL);
184}
185
186#ifdef __cplusplus
187} /* extern "C" */
188#endif
189
190#include <SDL3/SDL_close_code.h>
191
192/* end of impls for standard-conforming platforms */
193
194#endif /* __WIN32__ etc */
195
196/* rename users main() function to SDL_main() so it can be called from the wrappers above */
197#define main SDL_main
198
199#endif /* SDL_MAIN_HANDLED */
200
201#endif /* SDL_main_impl_h_ */
#define NULL
SDLMAIN_DECLSPEC int SDL_main(int argc, char *argv[])
int SDL_RunApp(int argc, char *argv[], SDL_main_func mainFunction, void *reserved)
#define main
typedef void(APIENTRYP PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode