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 |
351 | * SDL_APP_CONTINUE. The function should operate as a single iteration the |
352 | * program's primary loop; it should update whatever state it needs and draw a |
353 | * new frame of video, 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_ */ |
676 | |