diff options
Diffstat (limited to 'contrib/SDL-3.2.8/include/SDL3/SDL_main.h')
| -rw-r--r-- | contrib/SDL-3.2.8/include/SDL3/SDL_main.h | 675 |
1 files changed, 675 insertions, 0 deletions
diff --git a/contrib/SDL-3.2.8/include/SDL3/SDL_main.h b/contrib/SDL-3.2.8/include/SDL3/SDL_main.h new file mode 100644 index 0000000..905d78e --- /dev/null +++ b/contrib/SDL-3.2.8/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_ */ | ||
