diff options
author | 3gg <3gg@shellblade.net> | 2025-08-30 16:53:58 -0700 |
---|---|---|
committer | 3gg <3gg@shellblade.net> | 2025-08-30 16:53:58 -0700 |
commit | 6aaedb813fa11ba0679c3051bc2eb28646b9506c (patch) | |
tree | 34acbfc9840e02cb4753e6306ea7ce978bf8b58e /src/contrib/SDL-3.2.20/include/SDL3/SDL_main.h | |
parent | 8f228ade99dd3d4c8da9b78ade1815c9adf85c8f (diff) |
Update to SDL3
Diffstat (limited to 'src/contrib/SDL-3.2.20/include/SDL3/SDL_main.h')
-rw-r--r-- | src/contrib/SDL-3.2.20/include/SDL3/SDL_main.h | 675 |
1 files changed, 675 insertions, 0 deletions
diff --git a/src/contrib/SDL-3.2.20/include/SDL3/SDL_main.h b/src/contrib/SDL-3.2.20/include/SDL3/SDL_main.h new file mode 100644 index 0000000..905d78e --- /dev/null +++ b/src/contrib/SDL-3.2.20/include/SDL3/SDL_main.h | |||
@@ -0,0 +1,675 @@ | |||
1 | /* | ||
2 | Simple DirectMedia Layer | ||
3 | Copyright (C) 1997-2025 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 | /** | ||
23 | * # CategoryMain | ||
24 | * | ||
25 | * Redefine main() if necessary so that it is called by SDL. | ||
26 | * | ||
27 | * In order to make this consistent on all platforms, the application's main() | ||
28 | * should look like this: | ||
29 | * | ||
30 | * ```c | ||
31 | * #include <SDL3/SDL.h> | ||
32 | * #include <SDL3/SDL_main.h> | ||
33 | * | ||
34 | * int main(int argc, char *argv[]) | ||
35 | * { | ||
36 | * } | ||
37 | * ``` | ||
38 | * | ||
39 | * SDL will take care of platform specific details on how it gets called. | ||
40 | * | ||
41 | * This is also where an app can be configured to use the main callbacks, via | ||
42 | * the SDL_MAIN_USE_CALLBACKS macro. | ||
43 | * | ||
44 | * SDL_main.h is a "single-header library," which is to say that including | ||
45 | * this header inserts code into your program, and you should only include it | ||
46 | * once in most cases. SDL.h does not include this header automatically. | ||
47 | * | ||
48 | * For more information, see: | ||
49 | * | ||
50 | * https://wiki.libsdl.org/SDL3/README/main-functions | ||
51 | */ | ||
52 | |||
53 | #ifndef SDL_main_h_ | ||
54 | #define SDL_main_h_ | ||
55 | |||
56 | #include <SDL3/SDL_platform_defines.h> | ||
57 | #include <SDL3/SDL_stdinc.h> | ||
58 | #include <SDL3/SDL_error.h> | ||
59 | #include <SDL3/SDL_events.h> | ||
60 | |||
61 | #ifdef SDL_WIKI_DOCUMENTATION_SECTION | ||
62 | |||
63 | /** | ||
64 | * Inform SDL that the app is providing an entry point instead of SDL. | ||
65 | * | ||
66 | * SDL does not define this macro, but will check if it is defined when | ||
67 | * including `SDL_main.h`. If defined, SDL will expect the app to provide the | ||
68 | * proper entry point for the platform, and all the other magic details | ||
69 | * needed, like manually calling SDL_SetMainReady. | ||
70 | * | ||
71 | * Please see [README/main-functions](README/main-functions), (or | ||
72 | * docs/README-main-functions.md in the source tree) for a more detailed | ||
73 | * explanation. | ||
74 | * | ||
75 | * \since This macro is used by the headers since SDL 3.2.0. | ||
76 | */ | ||
77 | #define SDL_MAIN_HANDLED 1 | ||
78 | |||
79 | /** | ||
80 | * Inform SDL to use the main callbacks instead of main. | ||
81 | * | ||
82 | * SDL does not define this macro, but will check if it is defined when | ||
83 | * including `SDL_main.h`. If defined, SDL will expect the app to provide | ||
84 | * several functions: SDL_AppInit, SDL_AppEvent, SDL_AppIterate, and | ||
85 | * SDL_AppQuit. The app should not provide a `main` function in this case, and | ||
86 | * doing so will likely cause the build to fail. | ||
87 | * | ||
88 | * Please see [README/main-functions](README/main-functions), (or | ||
89 | * docs/README-main-functions.md in the source tree) for a more detailed | ||
90 | * explanation. | ||
91 | * | ||
92 | * \since This macro is used by the headers since SDL 3.2.0. | ||
93 | * | ||
94 | * \sa SDL_AppInit | ||
95 | * \sa SDL_AppEvent | ||
96 | * \sa SDL_AppIterate | ||
97 | * \sa SDL_AppQuit | ||
98 | */ | ||
99 | #define SDL_MAIN_USE_CALLBACKS 1 | ||
100 | |||
101 | /** | ||
102 | * Defined if the target platform offers a special mainline through SDL. | ||
103 | * | ||
104 | * This won't be defined otherwise. If defined, SDL's headers will redefine | ||
105 | * `main` to `SDL_main`. | ||
106 | * | ||
107 | * This macro is defined by `SDL_main.h`, which is not automatically included | ||
108 | * by `SDL.h`. | ||
109 | * | ||
110 | * Even if available, an app can define SDL_MAIN_HANDLED and provide their | ||
111 | * own, if they know what they're doing. | ||
112 | * | ||
113 | * This macro is used internally by SDL, and apps probably shouldn't rely on it. | ||
114 | * | ||
115 | * \since This macro is available since SDL 3.2.0. | ||
116 | */ | ||
117 | #define SDL_MAIN_AVAILABLE | ||
118 | |||
119 | /** | ||
120 | * Defined if the target platform _requires_ a special mainline through SDL. | ||
121 | * | ||
122 | * This won't be defined otherwise. If defined, SDL's headers will redefine | ||
123 | * `main` to `SDL_main`. | ||
124 | * | ||
125 | * This macro is defined by `SDL_main.h`, which is not automatically included | ||
126 | * by `SDL.h`. | ||
127 | * | ||
128 | * Even if required, an app can define SDL_MAIN_HANDLED and provide their | ||
129 | * own, if they know what they're doing. | ||
130 | * | ||
131 | * This macro is used internally by SDL, and apps probably shouldn't rely on it. | ||
132 | * | ||
133 | * \since This macro is available since SDL 3.2.0. | ||
134 | */ | ||
135 | #define SDL_MAIN_NEEDED | ||
136 | |||
137 | #endif | ||
138 | |||
139 | #if defined(__has_include) | ||
140 | #if __has_include("SDL_main_private.h") && __has_include("SDL_main_impl_private.h") | ||
141 | #define SDL_PLATFORM_PRIVATE_MAIN | ||
142 | #endif | ||
143 | #endif | ||
144 | |||
145 | #ifndef SDL_MAIN_HANDLED | ||
146 | #if defined(SDL_PLATFORM_PRIVATE_MAIN) | ||
147 | /* Private platforms may have their own ideas about entry points. */ | ||
148 | #include "SDL_main_private.h" | ||
149 | |||
150 | #elif defined(SDL_PLATFORM_WIN32) | ||
151 | /* On Windows SDL provides WinMain(), which parses the command line and passes | ||
152 | the arguments to your main function. | ||
153 | |||
154 | If you provide your own WinMain(), you may define SDL_MAIN_HANDLED | ||
155 | */ | ||
156 | #define SDL_MAIN_AVAILABLE | ||
157 | |||
158 | #elif defined(SDL_PLATFORM_GDK) | ||
159 | /* On GDK, SDL provides a main function that initializes the game runtime. | ||
160 | |||
161 | If you prefer to write your own WinMain-function instead of having SDL | ||
162 | provide one that calls your main() function, | ||
163 | #define SDL_MAIN_HANDLED before #include'ing SDL_main.h | ||
164 | and call the SDL_RunApp function from your entry point. | ||
165 | */ | ||
166 | #define SDL_MAIN_NEEDED | ||
167 | |||
168 | #elif defined(SDL_PLATFORM_IOS) | ||
169 | /* On iOS SDL provides a main function that creates an application delegate | ||
170 | and starts the iOS application run loop. | ||
171 | |||
172 | To use it, just #include SDL_main.h in the source file that contains your | ||
173 | main() function. | ||
174 | |||
175 | See src/video/uikit/SDL_uikitappdelegate.m for more details. | ||
176 | */ | ||
177 | #define SDL_MAIN_NEEDED | ||
178 | |||
179 | #elif defined(SDL_PLATFORM_ANDROID) | ||
180 | /* On Android SDL provides a Java class in SDLActivity.java that is the | ||
181 | main activity entry point. | ||
182 | |||
183 | See docs/README-android.md for more details on extending that class. | ||
184 | */ | ||
185 | #define SDL_MAIN_NEEDED | ||
186 | |||
187 | /* As this is launched from Java, the real entry point (main() function) | ||
188 | is outside of the the binary built from this code. | ||
189 | This define makes sure that, unlike on other platforms, SDL_main.h | ||
190 | and SDL_main_impl.h export an `SDL_main()` function (to be called | ||
191 | from Java), but don't implement a native `int main(int argc, char* argv[])` | ||
192 | or similar. | ||
193 | */ | ||
194 | #define SDL_MAIN_EXPORTED | ||
195 | |||
196 | #elif defined(SDL_PLATFORM_EMSCRIPTEN) | ||
197 | /* On Emscripten, SDL provides a main function that converts URL | ||
198 | parameters that start with "SDL_" to environment variables, so | ||
199 | they can be used as SDL hints, etc. | ||
200 | |||
201 | This is 100% optional, so if you don't want this to happen, you may | ||
202 | define SDL_MAIN_HANDLED | ||
203 | */ | ||
204 | #define SDL_MAIN_AVAILABLE | ||
205 | |||
206 | #elif defined(SDL_PLATFORM_PSP) | ||
207 | /* On PSP SDL provides a main function that sets the module info, | ||
208 | activates the GPU and starts the thread required to be able to exit | ||
209 | the software. | ||
210 | |||
211 | If you provide this yourself, you may define SDL_MAIN_HANDLED | ||
212 | */ | ||
213 | #define SDL_MAIN_AVAILABLE | ||
214 | |||
215 | #elif defined(SDL_PLATFORM_PS2) | ||
216 | #define SDL_MAIN_AVAILABLE | ||
217 | |||
218 | #define SDL_PS2_SKIP_IOP_RESET() \ | ||
219 | void reset_IOP(); \ | ||
220 | void reset_IOP() {} | ||
221 | |||
222 | #elif defined(SDL_PLATFORM_3DS) | ||
223 | /* | ||
224 | On N3DS, SDL provides a main function that sets up the screens | ||
225 | and storage. | ||
226 | |||
227 | If you provide this yourself, you may define SDL_MAIN_HANDLED | ||
228 | */ | ||
229 | #define SDL_MAIN_AVAILABLE | ||
230 | |||
231 | #endif | ||
232 | #endif /* SDL_MAIN_HANDLED */ | ||
233 | |||
234 | |||
235 | #ifdef SDL_WIKI_DOCUMENTATION_SECTION | ||
236 | |||
237 | /** | ||
238 | * A macro to tag a main entry point function as exported. | ||
239 | * | ||
240 | * Most platforms don't need this, and the macro will be defined to nothing. | ||
241 | * Some, like Android, keep the entry points in a shared library and need to | ||
242 | * explicitly export the symbols. | ||
243 | * | ||
244 | * External code rarely needs this, and if it needs something, it's almost | ||
245 | * always SDL_DECLSPEC instead. | ||
246 | * | ||
247 | * \since This macro is available since SDL 3.2.0. | ||
248 | * | ||
249 | * \sa SDL_DECLSPEC | ||
250 | */ | ||
251 | #define SDLMAIN_DECLSPEC | ||
252 | |||
253 | #elif defined(SDL_MAIN_EXPORTED) | ||
254 | /* We need to export SDL_main so it can be launched from external code, | ||
255 | like SDLActivity.java on Android */ | ||
256 | #define SDLMAIN_DECLSPEC SDL_DECLSPEC | ||
257 | #else | ||
258 | /* usually this is empty */ | ||
259 | #define SDLMAIN_DECLSPEC | ||
260 | #endif /* SDL_MAIN_EXPORTED */ | ||
261 | |||
262 | #if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) || defined(SDL_MAIN_USE_CALLBACKS) | ||
263 | #define main SDL_main | ||
264 | #endif | ||
265 | |||
266 | #include <SDL3/SDL_init.h> | ||
267 | #include <SDL3/SDL_begin_code.h> | ||
268 | #ifdef __cplusplus | ||
269 | extern "C" { | ||
270 | #endif | ||
271 | |||
272 | /* | ||
273 | * You can (optionally!) define SDL_MAIN_USE_CALLBACKS before including | ||
274 | * SDL_main.h, and then your application will _not_ have a standard | ||
275 | * "main" entry point. Instead, it will operate as a collection of | ||
276 | * functions that are called as necessary by the system. On some | ||
277 | * platforms, this is just a layer where SDL drives your program | ||
278 | * instead of your program driving SDL, on other platforms this might | ||
279 | * hook into the OS to manage the lifecycle. Programs on most platforms | ||
280 | * can use whichever approach they prefer, but the decision boils down | ||
281 | * to: | ||
282 | * | ||
283 | * - Using a standard "main" function: this works like it always has for | ||
284 | * the past 50+ years in C programming, and your app is in control. | ||
285 | * - Using the callback functions: this might clean up some code, | ||
286 | * avoid some #ifdef blocks in your program for some platforms, be more | ||
287 | * resource-friendly to the system, and possibly be the primary way to | ||
288 | * access some future platforms (but none require this at the moment). | ||
289 | * | ||
290 | * This is up to the app; both approaches are considered valid and supported | ||
291 | * ways to write SDL apps. | ||
292 | * | ||
293 | * If using the callbacks, don't define a "main" function. Instead, implement | ||
294 | * the functions listed below in your program. | ||
295 | */ | ||
296 | #ifdef SDL_MAIN_USE_CALLBACKS | ||
297 | |||
298 | /** | ||
299 | * App-implemented initial entry point for SDL_MAIN_USE_CALLBACKS apps. | ||
300 | * | ||
301 | * Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a | ||
302 | * standard "main" function, you should not supply this. | ||
303 | * | ||
304 | * This function is called by SDL once, at startup. The function should | ||
305 | * initialize whatever is necessary, possibly create windows and open audio | ||
306 | * devices, etc. The `argc` and `argv` parameters work like they would with a | ||
307 | * standard "main" function. | ||
308 | * | ||
309 | * This function should not go into an infinite mainloop; it should do any | ||
310 | * one-time setup it requires and then return. | ||
311 | * | ||
312 | * The app may optionally assign a pointer to `*appstate`. This pointer will | ||
313 | * be provided on every future call to the other entry points, to allow | ||
314 | * application state to be preserved between functions without the app needing | ||
315 | * to use a global variable. If this isn't set, the pointer will be NULL in | ||
316 | * future entry points. | ||
317 | * | ||
318 | * If this function returns SDL_APP_CONTINUE, the app will proceed to normal | ||
319 | * operation, and will begin receiving repeated calls to SDL_AppIterate and | ||
320 | * SDL_AppEvent for the life of the program. If this function returns | ||
321 | * SDL_APP_FAILURE, SDL will call SDL_AppQuit and terminate the process with | ||
322 | * an exit code that reports an error to the platform. If it returns | ||
323 | * SDL_APP_SUCCESS, SDL calls SDL_AppQuit and terminates with an exit code | ||
324 | * that reports success to the platform. | ||
325 | * | ||
326 | * This function is called by SDL on the main thread. | ||
327 | * | ||
328 | * \param appstate a place where the app can optionally store a pointer for | ||
329 | * future use. | ||
330 | * \param argc the standard ANSI C main's argc; number of elements in `argv`. | ||
331 | * \param argv the standard ANSI C main's argv; array of command line | ||
332 | * arguments. | ||
333 | * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to | ||
334 | * terminate with success, SDL_APP_CONTINUE to continue. | ||
335 | * | ||
336 | * \since This function is available since SDL 3.2.0. | ||
337 | * | ||
338 | * \sa SDL_AppIterate | ||
339 | * \sa SDL_AppEvent | ||
340 | * \sa SDL_AppQuit | ||
341 | */ | ||
342 | extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppInit(void **appstate, int argc, char *argv[]); | ||
343 | |||
344 | /** | ||
345 | * App-implemented iteration entry point for SDL_MAIN_USE_CALLBACKS apps. | ||
346 | * | ||
347 | * Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a | ||
348 | * standard "main" function, you should not supply this. | ||
349 | * | ||
350 | * This function is called repeatedly by SDL after SDL_AppInit returns 0. The | ||
351 | * function should operate as a single iteration the program's primary loop; | ||
352 | * it should update whatever state it needs and draw a new frame of video, | ||
353 | * usually. | ||
354 | * | ||
355 | * On some platforms, this function will be called at the refresh rate of the | ||
356 | * display (which might change during the life of your app!). There are no | ||
357 | * promises made about what frequency this function might run at. You should | ||
358 | * use SDL's timer functions if you need to see how much time has passed since | ||
359 | * the last iteration. | ||
360 | * | ||
361 | * There is no need to process the SDL event queue during this function; SDL | ||
362 | * will send events as they arrive in SDL_AppEvent, and in most cases the | ||
363 | * event queue will be empty when this function runs anyhow. | ||
364 | * | ||
365 | * This function should not go into an infinite mainloop; it should do one | ||
366 | * iteration of whatever the program does and return. | ||
367 | * | ||
368 | * The `appstate` parameter is an optional pointer provided by the app during | ||
369 | * SDL_AppInit(). If the app never provided a pointer, this will be NULL. | ||
370 | * | ||
371 | * If this function returns SDL_APP_CONTINUE, the app will continue normal | ||
372 | * operation, receiving repeated calls to SDL_AppIterate and SDL_AppEvent for | ||
373 | * the life of the program. If this function returns SDL_APP_FAILURE, SDL will | ||
374 | * call SDL_AppQuit and terminate the process with an exit code that reports | ||
375 | * an error to the platform. If it returns SDL_APP_SUCCESS, SDL calls | ||
376 | * SDL_AppQuit and terminates with an exit code that reports success to the | ||
377 | * platform. | ||
378 | * | ||
379 | * This function is called by SDL on the main thread. | ||
380 | * | ||
381 | * \param appstate an optional pointer, provided by the app in SDL_AppInit. | ||
382 | * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to | ||
383 | * terminate with success, SDL_APP_CONTINUE to continue. | ||
384 | * | ||
385 | * \threadsafety This function may get called concurrently with SDL_AppEvent() | ||
386 | * for events not pushed on the main thread. | ||
387 | * | ||
388 | * \since This function is available since SDL 3.2.0. | ||
389 | * | ||
390 | * \sa SDL_AppInit | ||
391 | * \sa SDL_AppEvent | ||
392 | */ | ||
393 | extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppIterate(void *appstate); | ||
394 | |||
395 | /** | ||
396 | * App-implemented event entry point for SDL_MAIN_USE_CALLBACKS apps. | ||
397 | * | ||
398 | * Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a | ||
399 | * standard "main" function, you should not supply this. | ||
400 | * | ||
401 | * This function is called as needed by SDL after SDL_AppInit returns | ||
402 | * SDL_APP_CONTINUE. It is called once for each new event. | ||
403 | * | ||
404 | * There is (currently) no guarantee about what thread this will be called | ||
405 | * from; whatever thread pushes an event onto SDL's queue will trigger this | ||
406 | * function. SDL is responsible for pumping the event queue between each call | ||
407 | * to SDL_AppIterate, so in normal operation one should only get events in a | ||
408 | * serial fashion, but be careful if you have a thread that explicitly calls | ||
409 | * SDL_PushEvent. SDL itself will push events to the queue on the main thread. | ||
410 | * | ||
411 | * Events sent to this function are not owned by the app; if you need to save | ||
412 | * the data, you should copy it. | ||
413 | * | ||
414 | * This function should not go into an infinite mainloop; it should handle the | ||
415 | * provided event appropriately and return. | ||
416 | * | ||
417 | * The `appstate` parameter is an optional pointer provided by the app during | ||
418 | * SDL_AppInit(). If the app never provided a pointer, this will be NULL. | ||
419 | * | ||
420 | * If this function returns SDL_APP_CONTINUE, the app will continue normal | ||
421 | * operation, receiving repeated calls to SDL_AppIterate and SDL_AppEvent for | ||
422 | * the life of the program. If this function returns SDL_APP_FAILURE, SDL will | ||
423 | * call SDL_AppQuit and terminate the process with an exit code that reports | ||
424 | * an error to the platform. If it returns SDL_APP_SUCCESS, SDL calls | ||
425 | * SDL_AppQuit and terminates with an exit code that reports success to the | ||
426 | * platform. | ||
427 | * | ||
428 | * \param appstate an optional pointer, provided by the app in SDL_AppInit. | ||
429 | * \param event the new event for the app to examine. | ||
430 | * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to | ||
431 | * terminate with success, SDL_APP_CONTINUE to continue. | ||
432 | * | ||
433 | * \threadsafety This function may get called concurrently with | ||
434 | * SDL_AppIterate() or SDL_AppQuit() for events not pushed from | ||
435 | * the main thread. | ||
436 | * | ||
437 | * \since This function is available since SDL 3.2.0. | ||
438 | * | ||
439 | * \sa SDL_AppInit | ||
440 | * \sa SDL_AppIterate | ||
441 | */ | ||
442 | extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, SDL_Event *event); | ||
443 | |||
444 | /** | ||
445 | * App-implemented deinit entry point for SDL_MAIN_USE_CALLBACKS apps. | ||
446 | * | ||
447 | * Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a | ||
448 | * standard "main" function, you should not supply this. | ||
449 | * | ||
450 | * This function is called once by SDL before terminating the program. | ||
451 | * | ||
452 | * This function will be called no matter what, even if SDL_AppInit requests | ||
453 | * termination. | ||
454 | * | ||
455 | * This function should not go into an infinite mainloop; it should | ||
456 | * deinitialize any resources necessary, perform whatever shutdown activities, | ||
457 | * and return. | ||
458 | * | ||
459 | * You do not need to call SDL_Quit() in this function, as SDL will call it | ||
460 | * after this function returns and before the process terminates, but it is | ||
461 | * safe to do so. | ||
462 | * | ||
463 | * The `appstate` parameter is an optional pointer provided by the app during | ||
464 | * SDL_AppInit(). If the app never provided a pointer, this will be NULL. This | ||
465 | * function call is the last time this pointer will be provided, so any | ||
466 | * resources to it should be cleaned up here. | ||
467 | * | ||
468 | * This function is called by SDL on the main thread. | ||
469 | * | ||
470 | * \param appstate an optional pointer, provided by the app in SDL_AppInit. | ||
471 | * \param result the result code that terminated the app (success or failure). | ||
472 | * | ||
473 | * \threadsafety SDL_AppEvent() may get called concurrently with this function | ||
474 | * if other threads that push events are still active. | ||
475 | * | ||
476 | * \since This function is available since SDL 3.2.0. | ||
477 | * | ||
478 | * \sa SDL_AppInit | ||
479 | */ | ||
480 | extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate, SDL_AppResult result); | ||
481 | |||
482 | #endif /* SDL_MAIN_USE_CALLBACKS */ | ||
483 | |||
484 | |||
485 | /** | ||
486 | * The prototype for the application's main() function | ||
487 | * | ||
488 | * \param argc an ANSI-C style main function's argc. | ||
489 | * \param argv an ANSI-C style main function's argv. | ||
490 | * \returns an ANSI-C main return code; generally 0 is considered successful | ||
491 | * program completion, and small non-zero values are considered | ||
492 | * errors. | ||
493 | * | ||
494 | * \since This datatype is available since SDL 3.2.0. | ||
495 | */ | ||
496 | typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]); | ||
497 | |||
498 | /** | ||
499 | * An app-supplied function for program entry. | ||
500 | * | ||
501 | * Apps do not directly create this function; they should create a standard | ||
502 | * ANSI-C `main` function instead. If SDL needs to insert some startup code | ||
503 | * before `main` runs, or the platform doesn't actually _use_ a function | ||
504 | * called "main", SDL will do some macro magic to redefine `main` to | ||
505 | * `SDL_main` and provide its own `main`. | ||
506 | * | ||
507 | * Apps should include `SDL_main.h` in the same file as their `main` function, | ||
508 | * and they should not use that symbol for anything else in that file, as it | ||
509 | * might get redefined. | ||
510 | * | ||
511 | * This function is only provided by the app if it isn't using | ||
512 | * SDL_MAIN_USE_CALLBACKS. | ||
513 | * | ||
514 | * Program startup is a surprisingly complex topic. Please see | ||
515 | * [README/main-functions](README/main-functions), (or | ||
516 | * docs/README-main-functions.md in the source tree) for a more detailed | ||
517 | * explanation. | ||
518 | * | ||
519 | * \param argc an ANSI-C style main function's argc. | ||
520 | * \param argv an ANSI-C style main function's argv. | ||
521 | * \returns an ANSI-C main return code; generally 0 is considered successful | ||
522 | * program completion, and small non-zero values are considered | ||
523 | * errors. | ||
524 | * | ||
525 | * \threadsafety This is the program entry point. | ||
526 | * | ||
527 | * \since This function is available since SDL 3.2.0. | ||
528 | */ | ||
529 | extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]); | ||
530 | |||
531 | /** | ||
532 | * Circumvent failure of SDL_Init() when not using SDL_main() as an entry | ||
533 | * point. | ||
534 | * | ||
535 | * This function is defined in SDL_main.h, along with the preprocessor rule to | ||
536 | * redefine main() as SDL_main(). Thus to ensure that your main() function | ||
537 | * will not be changed it is necessary to define SDL_MAIN_HANDLED before | ||
538 | * including SDL.h. | ||
539 | * | ||
540 | * \since This function is available since SDL 3.2.0. | ||
541 | * | ||
542 | * \sa SDL_Init | ||
543 | */ | ||
544 | extern SDL_DECLSPEC void SDLCALL SDL_SetMainReady(void); | ||
545 | |||
546 | /** | ||
547 | * Initializes and launches an SDL application, by doing platform-specific | ||
548 | * initialization before calling your mainFunction and cleanups after it | ||
549 | * returns, if that is needed for a specific platform, otherwise it just calls | ||
550 | * mainFunction. | ||
551 | * | ||
552 | * You can use this if you want to use your own main() implementation without | ||
553 | * using SDL_main (like when using SDL_MAIN_HANDLED). When using this, you do | ||
554 | * *not* need SDL_SetMainReady(). | ||
555 | * | ||
556 | * \param argc the argc parameter from the application's main() function, or 0 | ||
557 | * if the platform's main-equivalent has no argc. | ||
558 | * \param argv the argv parameter from the application's main() function, or | ||
559 | * NULL if the platform's main-equivalent has no argv. | ||
560 | * \param mainFunction your SDL app's C-style main(). NOT the function you're | ||
561 | * calling this from! Its name doesn't matter; it doesn't | ||
562 | * literally have to be `main`. | ||
563 | * \param reserved should be NULL (reserved for future use, will probably be | ||
564 | * platform-specific then). | ||
565 | * \returns the return value from mainFunction: 0 on success, otherwise | ||
566 | * failure; SDL_GetError() might have more information on the | ||
567 | * failure. | ||
568 | * | ||
569 | * \threadsafety Generally this is called once, near startup, from the | ||
570 | * process's initial thread. | ||
571 | * | ||
572 | * \since This function is available since SDL 3.2.0. | ||
573 | */ | ||
574 | extern SDL_DECLSPEC int SDLCALL SDL_RunApp(int argc, char *argv[], SDL_main_func mainFunction, void *reserved); | ||
575 | |||
576 | /** | ||
577 | * An entry point for SDL's use in SDL_MAIN_USE_CALLBACKS. | ||
578 | * | ||
579 | * Generally, you should not call this function directly. This only exists to | ||
580 | * hand off work into SDL as soon as possible, where it has a lot more control | ||
581 | * and functionality available, and make the inline code in SDL_main.h as | ||
582 | * small as possible. | ||
583 | * | ||
584 | * Not all platforms use this, it's actual use is hidden in a magic | ||
585 | * header-only library, and you should not call this directly unless you | ||
586 | * _really_ know what you're doing. | ||
587 | * | ||
588 | * \param argc standard Unix main argc. | ||
589 | * \param argv standard Unix main argv. | ||
590 | * \param appinit the application's SDL_AppInit function. | ||
591 | * \param appiter the application's SDL_AppIterate function. | ||
592 | * \param appevent the application's SDL_AppEvent function. | ||
593 | * \param appquit the application's SDL_AppQuit function. | ||
594 | * \returns standard Unix main return value. | ||
595 | * | ||
596 | * \threadsafety It is not safe to call this anywhere except as the only | ||
597 | * function call in SDL_main. | ||
598 | * | ||
599 | * \since This function is available since SDL 3.2.0. | ||
600 | */ | ||
601 | extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[], SDL_AppInit_func appinit, SDL_AppIterate_func appiter, SDL_AppEvent_func appevent, SDL_AppQuit_func appquit); | ||
602 | |||
603 | |||
604 | #if defined(SDL_PLATFORM_WINDOWS) | ||
605 | |||
606 | /** | ||
607 | * Register a win32 window class for SDL's use. | ||
608 | * | ||
609 | * This can be called to set the application window class at startup. It is | ||
610 | * safe to call this multiple times, as long as every call is eventually | ||
611 | * paired with a call to SDL_UnregisterApp, but a second registration attempt | ||
612 | * while a previous registration is still active will be ignored, other than | ||
613 | * to increment a counter. | ||
614 | * | ||
615 | * Most applications do not need to, and should not, call this directly; SDL | ||
616 | * will call it when initializing the video subsystem. | ||
617 | * | ||
618 | * \param name the window class name, in UTF-8 encoding. If NULL, SDL | ||
619 | * currently uses "SDL_app" but this isn't guaranteed. | ||
620 | * \param style the value to use in WNDCLASSEX::style. If `name` is NULL, SDL | ||
621 | * currently uses `(CS_BYTEALIGNCLIENT | CS_OWNDC)` regardless of | ||
622 | * what is specified here. | ||
623 | * \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL | ||
624 | * will use `GetModuleHandle(NULL)` instead. | ||
625 | * \returns true on success or false on failure; call SDL_GetError() for more | ||
626 | * information. | ||
627 | * | ||
628 | * \since This function is available since SDL 3.2.0. | ||
629 | */ | ||
630 | extern SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); | ||
631 | |||
632 | /** | ||
633 | * Deregister the win32 window class from an SDL_RegisterApp call. | ||
634 | * | ||
635 | * This can be called to undo the effects of SDL_RegisterApp. | ||
636 | * | ||
637 | * Most applications do not need to, and should not, call this directly; SDL | ||
638 | * will call it when deinitializing the video subsystem. | ||
639 | * | ||
640 | * It is safe to call this multiple times, as long as every call is eventually | ||
641 | * paired with a prior call to SDL_RegisterApp. The window class will only be | ||
642 | * deregistered when the registration counter in SDL_RegisterApp decrements to | ||
643 | * zero through calls to this function. | ||
644 | * | ||
645 | * \since This function is available since SDL 3.2.0. | ||
646 | */ | ||
647 | extern SDL_DECLSPEC void SDLCALL SDL_UnregisterApp(void); | ||
648 | |||
649 | #endif /* defined(SDL_PLATFORM_WINDOWS) */ | ||
650 | |||
651 | /** | ||
652 | * Callback from the application to let the suspend continue. | ||
653 | * | ||
654 | * This function is only needed for Xbox GDK support; all other platforms will | ||
655 | * do nothing and set an "unsupported" error message. | ||
656 | * | ||
657 | * \since This function is available since SDL 3.2.0. | ||
658 | */ | ||
659 | extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); | ||
660 | |||
661 | #ifdef __cplusplus | ||
662 | } | ||
663 | #endif | ||
664 | |||
665 | #include <SDL3/SDL_close_code.h> | ||
666 | |||
667 | #if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL) | ||
668 | /* include header-only SDL_main implementations */ | ||
669 | #if defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) | ||
670 | /* platforms which main (-equivalent) can be implemented in plain C */ | ||
671 | #include <SDL3/SDL_main_impl.h> | ||
672 | #endif | ||
673 | #endif | ||
674 | |||
675 | #endif /* SDL_main_h_ */ | ||