annotate SDL3/SDL_main_impl.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 Simple DirectMedia Layer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 This software is provided 'as-is', without any express or implied
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 warranty. In no event will the authors be held liable for any damages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 arising from the use of this software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 Permission is granted to anyone to use this software for any purpose,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 including commercial applications, and to alter it and redistribute it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 freely, subject to the following restrictions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 1. The origin of this software must not be misrepresented; you must not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 claim that you wrote the original software. If you use this software
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 in a product, an acknowledgment in the product documentation would be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 appreciated but is not required.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 2. Altered source versions must be plainly marked as such, and must not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 misrepresented as being the original software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 3. This notice may not be removed or altered from any source distribution.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 /* WIKI CATEGORY: Main */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 #ifndef SDL_main_impl_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 #define SDL_main_impl_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 #ifndef SDL_main_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 #error "This header should not be included directly, but only via SDL_main.h!"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 /* if someone wants to include SDL_main.h but doesn't want the main handing magic,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 (maybe to call SDL_RegisterApp()) they can #define SDL_MAIN_HANDLED first.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 SDL_MAIN_NOIMPL is for SDL-internal usage (only affects implementation,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 not definition of SDL_MAIN_AVAILABLE etc in SDL_main.h) and if the user wants
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 to have the SDL_main implementation (from this header) in another source file
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 than their main() function, for example if SDL_main requires C++
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 and main() is implemented in plain C */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 #if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 /* the implementations below must be able to use the implement real main(), nothing renamed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 (the user's main() will be renamed to SDL_main so it can be called from here) */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 #ifdef main
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 #undef main
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 #ifdef SDL_MAIN_USE_CALLBACKS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 #if 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 /* currently there are no platforms that _need_ a magic entry point here
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 for callbacks, but if one shows up, implement it here. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 #else /* use a standard SDL_main, which the app SHOULD NOT ALSO SUPPLY. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 /* this define makes the normal SDL_main entry point stuff work...we just provide SDL_main() instead of the app. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 #define SDL_MAIN_CALLBACK_STANDARD 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 int SDL_main(int argc, char **argv)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 return SDL_EnterAppMainCallbacks(argc, argv, SDL_AppInit, SDL_AppIterate, SDL_AppEvent, SDL_AppQuit);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 #endif /* platform-specific tests */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 #endif /* SDL_MAIN_USE_CALLBACKS */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 /* set up the usual SDL_main stuff if we're not using callbacks or if we are but need the normal entry point,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 unless the real entry point needs to be somewhere else entirely, like Android where it's in Java code */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 #if (!defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD)) && !defined(SDL_MAIN_EXPORTED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 #if defined(SDL_PLATFORM_PRIVATE_MAIN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 /* Private platforms may have their own ideas about entry points. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 #include "SDL_main_impl_private.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 #elif defined(SDL_PLATFORM_WINDOWS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 /* these defines/typedefs are needed for the WinMain() definition */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 #ifndef WINAPI
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 #define WINAPI __stdcall
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 typedef struct HINSTANCE__ * HINSTANCE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 typedef char *LPSTR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 typedef wchar_t *PWSTR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 /* The VC++ compiler needs main/wmain defined, but not for GDK */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 #if defined(_MSC_VER) && !defined(SDL_PLATFORM_GDK)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 /* This is where execution begins [console apps] */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 #if defined(UNICODE) && UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 int wmain(int argc, wchar_t *wargv[], wchar_t *wenvp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 (void)argc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 (void)wargv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 (void)wenvp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 return SDL_RunApp(0, NULL, SDL_main, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 #else /* ANSI */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 int main(int argc, char *argv[])
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 (void)argc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 (void)argv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 return SDL_RunApp(0, NULL, SDL_main, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 #endif /* UNICODE */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 #endif /* _MSC_VER && ! SDL_PLATFORM_GDK */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 /* This is where execution begins [windowed apps and GDK] */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 extern "C" {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 #if defined(UNICODE) && UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, PWSTR szCmdLine, int sw)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 #else /* ANSI */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 (void)hInst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 (void)hPrev;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 (void)szCmdLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 (void)sw;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 return SDL_RunApp(0, NULL, SDL_main, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 } /* extern "C" */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 /* end of SDL_PLATFORM_WINDOWS impls */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 #else /* platforms that use a standard main() and just call SDL_RunApp(), like iOS and 3DS */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 int main(int argc, char *argv[])
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 return SDL_RunApp(argc, argv, SDL_main, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 /* end of impls for standard-conforming platforms */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 #endif /* SDL_PLATFORM_WIN32 etc */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 #endif /* !defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD) */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 /* rename users main() function to SDL_main() so it can be called from the wrappers above */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 #define main SDL_main
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 #endif /* SDL_MAIN_HANDLED */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 #endif /* SDL_main_impl_h_ */