| 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 | |