forked from Green-Sky/tomato
Merge commit '852f2a6343518919e5ca8d3c1bbcab9f493e3cd8'
This commit is contained in:
237
external/sdl/SDL/include/SDL3/SDL_main.h
vendored
237
external/sdl/SDL/include/SDL3/SDL_main.h
vendored
@ -1,6 +1,6 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@ -23,11 +23,20 @@
|
||||
#define SDL_main_h_
|
||||
|
||||
#include <SDL3/SDL_stdinc.h>
|
||||
#include <SDL3/SDL_events.h>
|
||||
|
||||
/*
|
||||
* For details on how SDL_main works, and how to use it, please refer to:
|
||||
*
|
||||
* https://wiki.libsdl.org/SDL3/README/main-functions
|
||||
*
|
||||
* (or docs/README-main-functions.md in the SDL source tree)
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file SDL_main.h
|
||||
*
|
||||
* \brief Redefine main() on some platforms so that it is called by SDL.
|
||||
* Redefine main() on some platforms so that it is called by SDL.
|
||||
*/
|
||||
|
||||
#ifndef SDL_MAIN_HANDLED
|
||||
@ -140,7 +149,7 @@
|
||||
* \endcode
|
||||
*/
|
||||
|
||||
#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE)
|
||||
#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) || defined(SDL_MAIN_USE_CALLBACKS)
|
||||
#define main SDL_main
|
||||
#endif
|
||||
|
||||
@ -149,11 +158,198 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef int (SDLCALL *SDL_AppInit_func)(int argc, char *argv[]);
|
||||
typedef int (SDLCALL *SDL_AppIterate_func)(void);
|
||||
typedef int (SDLCALL *SDL_AppEvent_func)(const SDL_Event *event);
|
||||
typedef void (SDLCALL *SDL_AppQuit_func)(void);
|
||||
|
||||
/**
|
||||
* You can (optionally!) define SDL_MAIN_USE_CALLBACKS before including
|
||||
* SDL_main.h, and then your application will _not_ have a standard
|
||||
* "main" entry point. Instead, it will operate as a collection of
|
||||
* functions that are called as necessary by the system. On some
|
||||
* platforms, this is just a layer where SDL drives your program
|
||||
* instead of your program driving SDL, on other platforms this might
|
||||
* hook into the OS to manage the lifecycle. Programs on most platforms
|
||||
* can use whichever approach they prefer, but the decision boils down
|
||||
* to:
|
||||
*
|
||||
* - Using a standard "main" function: this works like it always has for
|
||||
* the past 50+ years in C programming, and your app is in control.
|
||||
* - Using the callback functions: this might clean up some code,
|
||||
* avoid some #ifdef blocks in your program for some platforms, be more
|
||||
* resource-friendly to the system, and possibly be the primary way to
|
||||
* access some future platforms (but none require this at the moment).
|
||||
*
|
||||
* This is up to the app; both approaches are considered valid and supported
|
||||
* ways to write SDL apps.
|
||||
*
|
||||
* If using the callbacks, don't define a "main" function. Instead, implement
|
||||
* the functions listed below in your program.
|
||||
*/
|
||||
#ifdef SDL_MAIN_USE_CALLBACKS
|
||||
|
||||
/**
|
||||
* App-implemented initial entry point for SDL_MAIN_USE_CALLBACKS apps.
|
||||
*
|
||||
* Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If
|
||||
* using a standard "main" function, you should not supply this.
|
||||
*
|
||||
* This function is called by SDL once, at startup. The function should
|
||||
* initialize whatever is necessary, possibly create windows and open
|
||||
* audio devices, etc. The `argc` and `argv` parameters work like they would
|
||||
* with a standard "main" function.
|
||||
*
|
||||
* This function should not go into an infinite mainloop; it should do any
|
||||
* one-time setup it requires and then return.
|
||||
*
|
||||
* If this function returns 0, the app will proceed to normal operation,
|
||||
* and will begin receiving repeated calls to SDL_AppIterate and SDL_AppEvent
|
||||
* for the life of the program. If this function returns < 0, SDL will
|
||||
* call SDL_AppQuit and terminate the process with an exit code that reports
|
||||
* an error to the platform. If it returns > 0, the SDL calls SDL_AppQuit
|
||||
* and terminates with an exit code that reports success to the platform.
|
||||
*
|
||||
* \param argc The standard ANSI C main's argc; number of elements in `argv`
|
||||
* \param argv The standard ANSI C main's argv; array of command line arguments.
|
||||
* \returns -1 to terminate with an error, 1 to terminate with success, 0 to continue.
|
||||
*
|
||||
* \threadsafety This function is not thread safe.
|
||||
*
|
||||
* \since This function is available since SDL 3.0.0.
|
||||
*
|
||||
* \sa SDL_AppIterate
|
||||
* \sa SDL_AppEvent
|
||||
* \sa SDL_AppQuit
|
||||
*/
|
||||
extern SDLMAIN_DECLSPEC int SDLCALL SDL_AppInit(int argc, char *argv[]);
|
||||
|
||||
/**
|
||||
* App-implemented iteration entry point for SDL_MAIN_USE_CALLBACKS apps.
|
||||
*
|
||||
* Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If
|
||||
* using a standard "main" function, you should not supply this.
|
||||
*
|
||||
* This function is called repeatedly by SDL after SDL_AppInit returns 0.
|
||||
* The function should operate as a single iteration the program's primary
|
||||
* loop; it should update whatever state it needs and draw a new frame of
|
||||
* video, usually.
|
||||
*
|
||||
* On some platforms, this function will be called at the refresh rate of
|
||||
* the display (which might change during the life of your app!). There are
|
||||
* no promises made about what frequency this function might run at. You
|
||||
* should use SDL's timer functions if you need to see how much time has
|
||||
* passed since the last iteration.
|
||||
*
|
||||
* There is no need to process the SDL event queue during this function;
|
||||
* SDL will send events as they arrive in SDL_AppEvent, and in most cases
|
||||
* the event queue will be empty when this function runs anyhow.
|
||||
*
|
||||
* This function should not go into an infinite mainloop; it should do one
|
||||
* iteration of whatever the program does and return.
|
||||
*
|
||||
* If this function returns 0, the app will continue normal operation,
|
||||
* receiving repeated calls to SDL_AppIterate and SDL_AppEvent for the life
|
||||
* of the program. If this function returns < 0, SDL will call SDL_AppQuit
|
||||
* and terminate the process with an exit code that reports an error to the
|
||||
* platform. If it returns > 0, the SDL calls SDL_AppQuit and terminates with
|
||||
* an exit code that reports success to the platform.
|
||||
*
|
||||
* \returns -1 to terminate with an error, 1 to terminate with success, 0 to continue.
|
||||
*
|
||||
* \threadsafety This function is not thread safe.
|
||||
*
|
||||
* \since This function is available since SDL 3.0.0.
|
||||
*
|
||||
* \sa SDL_AppInit
|
||||
* \sa SDL_AppEvent
|
||||
* \sa SDL_AppQuit
|
||||
*/
|
||||
extern SDLMAIN_DECLSPEC int SDLCALL SDL_AppIterate(void);
|
||||
|
||||
/**
|
||||
* App-implemented event entry point for SDL_MAIN_USE_CALLBACKS apps.
|
||||
*
|
||||
* Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If
|
||||
* using a standard "main" function, you should not supply this.
|
||||
*
|
||||
* This function is called as needed by SDL after SDL_AppInit returns 0;
|
||||
* It is called once for each new event.
|
||||
*
|
||||
* There is (currently) no guarantee about what thread this will be called
|
||||
* from; whatever thread pushes an event onto SDL's queue will trigger this
|
||||
* function. SDL is responsible for pumping the event queue between
|
||||
* each call to SDL_AppIterate, so in normal operation one should only
|
||||
* get events in a serial fashion, but be careful if you have a thread that
|
||||
* explicitly calls SDL_PushEvent.
|
||||
*
|
||||
* Events sent to this function are not owned by the app; if you need to
|
||||
* save the data, you should copy it.
|
||||
*
|
||||
* You do not need to free event data (such as the `file` string in
|
||||
* SDL_EVENT_DROP_FILE), as SDL will free it once this function returns.
|
||||
* Note that this is different than one might expect when using a standard
|
||||
* "main" function!
|
||||
*
|
||||
* This function should not go into an infinite mainloop; it should handle
|
||||
* the provided event appropriately and return.
|
||||
*
|
||||
* If this function returns 0, the app will continue normal operation,
|
||||
* receiving repeated calls to SDL_AppIterate and SDL_AppEvent for the life
|
||||
* of the program. If this function returns < 0, SDL will call SDL_AppQuit
|
||||
* and terminate the process with an exit code that reports an error to the
|
||||
* platform. If it returns > 0, the SDL calls SDL_AppQuit and terminates with
|
||||
* an exit code that reports success to the platform.
|
||||
*
|
||||
* \returns -1 to terminate with an error, 1 to terminate with success, 0 to continue.
|
||||
*
|
||||
* \threadsafety This function is not thread safe.
|
||||
*
|
||||
* \since This function is available since SDL 3.0.0.
|
||||
*
|
||||
* \sa SDL_AppInit
|
||||
* \sa SDL_AppIterate
|
||||
* \sa SDL_AppQuit
|
||||
*/
|
||||
extern SDLMAIN_DECLSPEC int SDLCALL SDL_AppEvent(const SDL_Event *event);
|
||||
|
||||
/**
|
||||
* App-implemented deinit entry point for SDL_MAIN_USE_CALLBACKS apps.
|
||||
*
|
||||
* Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If
|
||||
* using a standard "main" function, you should not supply this.
|
||||
*
|
||||
* This function is called once by SDL before terminating the program.
|
||||
*
|
||||
* This function will be called no matter what, even if SDL_AppInit
|
||||
* requests termination.
|
||||
*
|
||||
* This function should not go into an infinite mainloop; it should
|
||||
* deinitialize any resources necessary, perform whatever shutdown
|
||||
* activities, and return.
|
||||
*
|
||||
* You do not need to call SDL_Quit() in this function, as SDL will call
|
||||
* it after this function returns and before the process terminates, but
|
||||
* it is safe to do so.
|
||||
*
|
||||
* \threadsafety This function is not thread safe.
|
||||
*
|
||||
* \since This function is available since SDL 3.0.0.
|
||||
*
|
||||
* \sa SDL_AppInit
|
||||
* \sa SDL_AppIterate
|
||||
* \sa SDL_AppEvent
|
||||
*/
|
||||
extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void);
|
||||
|
||||
#endif /* SDL_MAIN_USE_CALLBACKS */
|
||||
|
||||
|
||||
/**
|
||||
* The prototype for the application's main() function
|
||||
*/
|
||||
typedef int (*SDL_main_func)(int argc, char *argv[]);
|
||||
extern SDLMAIN_DECLSPEC int SDL_main(int argc, char *argv[]);
|
||||
typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]);
|
||||
extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]);
|
||||
|
||||
|
||||
/**
|
||||
@ -198,6 +394,34 @@ extern DECLSPEC void SDLCALL SDL_SetMainReady(void);
|
||||
*/
|
||||
extern DECLSPEC int SDLCALL SDL_RunApp(int argc, char* argv[], SDL_main_func mainFunction, void * reserved);
|
||||
|
||||
/**
|
||||
* An entry point for SDL's use in SDL_MAIN_USE_CALLBACKS.
|
||||
*
|
||||
* Generally, you should not call this function directly. This only exists to
|
||||
* hand off work into SDL as soon as possible, where it has a lot more control
|
||||
* and functionality available, and make the inline code in SDL_main.h as
|
||||
* small as possible.
|
||||
*
|
||||
* Not all platforms use this, it's actual use is hidden in a magic
|
||||
* header-only library, and you should not call this directly unless you
|
||||
* _really_ know what you're doing.
|
||||
*
|
||||
* \param argc standard Unix main argc
|
||||
* \param argv standard Unix main argv
|
||||
* \param appinit The application's SDL_AppInit function
|
||||
* \param appiter The application's SDL_AppIterate function
|
||||
* \param appevent The application's SDL_AppEvent function
|
||||
* \param appquit The application's SDL_AppQuit function
|
||||
* \returns standard Unix main return value
|
||||
*
|
||||
* \threadsafety It is not safe to call this anywhere except as the only
|
||||
* function call in SDL_main.
|
||||
*
|
||||
* \since This function is available since SDL 3.0.0.
|
||||
*/
|
||||
extern 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);
|
||||
|
||||
|
||||
#if defined(__WIN32__) || defined(__GDK__)
|
||||
|
||||
/**
|
||||
@ -282,7 +506,8 @@ extern DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void);
|
||||
|
||||
#if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL)
|
||||
/* include header-only SDL_main implementations */
|
||||
#if defined(__WIN32__) || defined(__GDK__) || defined(__IOS__) || defined(__TVOS__) \
|
||||
#if defined(SDL_MAIN_USE_CALLBACKS) \
|
||||
|| defined(__WIN32__) || defined(__GDK__) || defined(__IOS__) || defined(__TVOS__) \
|
||||
|| defined(__3DS__) || defined(__NGAGE__) || defined(__PS2__) || defined(__PSP__)
|
||||
|
||||
/* platforms which main (-equivalent) can be implemented in plain C */
|
||||
|
Reference in New Issue
Block a user