123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- /*
- Simple DirectMedia Layer
- 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
- arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- /**
- * # CategoryInit
- *
- * All SDL programs need to initialize the library before starting to work
- * with it.
- *
- * Almost everything can simply call SDL_Init() near startup, with a handful
- * of flags to specify subsystems to touch. These are here to make sure SDL
- * does not even attempt to touch low-level pieces of the operating system
- * that you don't intend to use. For example, you might be using SDL for video
- * and input but chose an external library for audio, and in this case you
- * would just need to leave off the `SDL_INIT_AUDIO` flag to make sure that
- * external library has complete control.
- *
- * Most apps, when terminating, should call SDL_Quit(). This will clean up
- * (nearly) everything that SDL might have allocated, and crucially, it'll
- * make sure that the display's resolution is back to what the user expects if
- * you had previously changed it for your game.
- *
- * SDL3 apps are strongly encouraged to call SDL_SetAppMetadata() at startup
- * to fill in details about the program. This is completely optional, but it
- * helps in small ways (we can provide an About dialog box for the macOS menu,
- * we can name the app in the system's audio mixer, etc). Those that want to
- * provide a _lot_ of information should look at the more-detailed
- * SDL_SetAppMetadataProperty().
- */
- #ifndef SDL_init_h_
- #define SDL_init_h_
- #include <SDL3/SDL_stdinc.h>
- #include <SDL3/SDL_error.h>
- #include <SDL3/SDL_events.h>
- #include <SDL3/SDL_begin_code.h>
- /* Set up for C function definitions, even when using C++ */
- #ifdef __cplusplus
- extern "C" {
- #endif
- /* As of version 0.5, SDL is loaded dynamically into the application */
- /**
- * Initialization flags for SDL_Init and/or SDL_InitSubSystem
- *
- * These are the flags which may be passed to SDL_Init(). You should specify
- * the subsystems which you will be using in your application.
- *
- * \since This datatype is available since SDL 3.1.3.
- *
- * \sa SDL_Init
- * \sa SDL_Quit
- * \sa SDL_InitSubSystem
- * \sa SDL_QuitSubSystem
- * \sa SDL_WasInit
- */
- typedef Uint32 SDL_InitFlags;
- #define SDL_INIT_AUDIO 0x00000010u /**< `SDL_INIT_AUDIO` implies `SDL_INIT_EVENTS` */
- #define SDL_INIT_VIDEO 0x00000020u /**< `SDL_INIT_VIDEO` implies `SDL_INIT_EVENTS` */
- #define SDL_INIT_JOYSTICK 0x00000200u /**< `SDL_INIT_JOYSTICK` implies `SDL_INIT_EVENTS`, should be initialized on the same thread as SDL_INIT_VIDEO on Windows if you don't set SDL_HINT_JOYSTICK_THREAD */
- #define SDL_INIT_HAPTIC 0x00001000u
- #define SDL_INIT_GAMEPAD 0x00002000u /**< `SDL_INIT_GAMEPAD` implies `SDL_INIT_JOYSTICK` */
- #define SDL_INIT_EVENTS 0x00004000u
- #define SDL_INIT_SENSOR 0x00008000u /**< `SDL_INIT_SENSOR` implies `SDL_INIT_EVENTS` */
- #define SDL_INIT_CAMERA 0x00010000u /**< `SDL_INIT_CAMERA` implies `SDL_INIT_EVENTS` */
- /**
- * Return values for optional main callbacks.
- *
- * Returning SDL_APP_SUCCESS or SDL_APP_FAILURE from SDL_AppInit,
- * SDL_AppEvent, or SDL_AppIterate will terminate the program and report
- * success/failure to the operating system. What that means is
- * platform-dependent. On Unix, for example, on success, the process error
- * code will be zero, and on failure it will be 1. This interface doesn't
- * allow you to return specific exit codes, just whether there was an error
- * generally or not.
- *
- * Returning SDL_APP_CONTINUE from these functions will let the app continue
- * to run.
- *
- * See
- * [Main callbacks in SDL3](https://wiki.libsdl.org/SDL3/README/main-functions#main-callbacks-in-sdl3)
- * for complete details.
- *
- * \since This enum is available since SDL 3.1.3.
- */
- typedef enum SDL_AppResult
- {
- SDL_APP_CONTINUE, /**< Value that requests that the app continue from the main callbacks. */
- SDL_APP_SUCCESS, /**< Value that requests termination with success from the main callbacks. */
- SDL_APP_FAILURE /**< Value that requests termination with error from the main callbacks. */
- } SDL_AppResult;
- typedef SDL_AppResult (SDLCALL *SDL_AppInit_func)(void **appstate, int argc, char *argv[]);
- typedef SDL_AppResult (SDLCALL *SDL_AppIterate_func)(void *appstate);
- typedef SDL_AppResult (SDLCALL *SDL_AppEvent_func)(void *appstate, SDL_Event *event);
- typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate, SDL_AppResult result);
- /**
- * Initialize the SDL library.
- *
- * SDL_Init() simply forwards to calling SDL_InitSubSystem(). Therefore, the
- * two may be used interchangeably. Though for readability of your code
- * SDL_InitSubSystem() might be preferred.
- *
- * The file I/O (for example: SDL_IOFromFile) and threading (SDL_CreateThread)
- * subsystems are initialized by default. Message boxes
- * (SDL_ShowSimpleMessageBox) also attempt to work without initializing the
- * video subsystem, in hopes of being useful in showing an error dialog when
- * SDL_Init fails. You must specifically initialize other subsystems if you
- * use them in your application.
- *
- * Logging (such as SDL_Log) works without initialization, too.
- *
- * `flags` may be any of the following OR'd together:
- *
- * - `SDL_INIT_AUDIO`: audio subsystem; automatically initializes the events
- * subsystem
- * - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events
- * subsystem
- * - `SDL_INIT_JOYSTICK`: joystick subsystem; automatically initializes the
- * events subsystem
- * - `SDL_INIT_HAPTIC`: haptic (force feedback) subsystem
- * - `SDL_INIT_GAMEPAD`: gamepad subsystem; automatically initializes the
- * joystick subsystem
- * - `SDL_INIT_EVENTS`: events subsystem
- * - `SDL_INIT_SENSOR`: sensor subsystem; automatically initializes the events
- * subsystem
- * - `SDL_INIT_CAMERA`: camera subsystem; automatically initializes the events
- * subsystem
- *
- * Subsystem initialization is ref-counted, you must call SDL_QuitSubSystem()
- * for each SDL_InitSubSystem() to correctly shutdown a subsystem manually (or
- * call SDL_Quit() to force shutdown). If a subsystem is already loaded then
- * this call will increase the ref-count and return.
- *
- * Consider reporting some basic metadata about your application before
- * calling SDL_Init, using either SDL_SetAppMetadata() or
- * SDL_SetAppMetadataProperty().
- *
- * \param flags subsystem initialization flags.
- * \returns true on success or false on failure; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.1.3.
- *
- * \sa SDL_SetAppMetadata
- * \sa SDL_SetAppMetadataProperty
- * \sa SDL_InitSubSystem
- * \sa SDL_Quit
- * \sa SDL_SetMainReady
- * \sa SDL_WasInit
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_Init(SDL_InitFlags flags);
- /**
- * Compatibility function to initialize the SDL library.
- *
- * This function and SDL_Init() are interchangeable.
- *
- * \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
- * \returns true on success or false on failure; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.1.3.
- *
- * \sa SDL_Init
- * \sa SDL_Quit
- * \sa SDL_QuitSubSystem
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags);
- /**
- * Shut down specific SDL subsystems.
- *
- * You still need to call SDL_Quit() even if you close all open subsystems
- * with SDL_QuitSubSystem().
- *
- * \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
- *
- * \since This function is available since SDL 3.1.3.
- *
- * \sa SDL_InitSubSystem
- * \sa SDL_Quit
- */
- extern SDL_DECLSPEC void SDLCALL SDL_QuitSubSystem(SDL_InitFlags flags);
- /**
- * Get a mask of the specified subsystems which are currently initialized.
- *
- * \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
- * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it
- * returns the initialization status of the specified subsystems.
- *
- * \since This function is available since SDL 3.1.3.
- *
- * \sa SDL_Init
- * \sa SDL_InitSubSystem
- */
- extern SDL_DECLSPEC SDL_InitFlags SDLCALL SDL_WasInit(SDL_InitFlags flags);
- /**
- * Clean up all initialized subsystems.
- *
- * You should call this function even if you have already shutdown each
- * initialized subsystem with SDL_QuitSubSystem(). It is safe to call this
- * function even in the case of errors in initialization.
- *
- * You can use this function with atexit() to ensure that it is run when your
- * application is shutdown, but it is not wise to do this from a library or
- * other dynamically loaded code.
- *
- * \since This function is available since SDL 3.1.3.
- *
- * \sa SDL_Init
- * \sa SDL_QuitSubSystem
- */
- extern SDL_DECLSPEC void SDLCALL SDL_Quit(void);
- /**
- * Specify basic metadata about your app.
- *
- * You can optionally provide metadata about your app to SDL. This is not
- * required, but strongly encouraged.
- *
- * There are several locations where SDL can make use of metadata (an "About"
- * box in the macOS menu bar, the name of the app can be shown on some audio
- * mixers, etc). Any piece of metadata can be left as NULL, if a specific
- * detail doesn't make sense for the app.
- *
- * This function should be called as early as possible, before SDL_Init.
- * Multiple calls to this function are allowed, but various state might not
- * change once it has been set up with a previous call to this function.
- *
- * Passing a NULL removes any previous metadata.
- *
- * This is a simplified interface for the most important information. You can
- * supply significantly more detailed metadata with
- * SDL_SetAppMetadataProperty().
- *
- * \param appname The name of the application ("My Game 2: Bad Guy's
- * Revenge!").
- * \param appversion The version of the application ("1.0.0beta5" or a git
- * hash, or whatever makes sense).
- * \param appidentifier A unique string in reverse-domain format that
- * identifies this app ("com.example.mygame2").
- * \returns true on success or false on failure; call SDL_GetError() for more
- * information.
- *
- * \threadsafety It is safe to call this function from any thread.
- *
- * \since This function is available since SDL 3.1.3.
- *
- * \sa SDL_SetAppMetadataProperty
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadata(const char *appname, const char *appversion, const char *appidentifier);
- /**
- * Specify metadata about your app through a set of properties.
- *
- * You can optionally provide metadata about your app to SDL. This is not
- * required, but strongly encouraged.
- *
- * There are several locations where SDL can make use of metadata (an "About"
- * box in the macOS menu bar, the name of the app can be shown on some audio
- * mixers, etc). Any piece of metadata can be left out, if a specific detail
- * doesn't make sense for the app.
- *
- * This function should be called as early as possible, before SDL_Init.
- * Multiple calls to this function are allowed, but various state might not
- * change once it has been set up with a previous call to this function.
- *
- * Once set, this metadata can be read using SDL_GetMetadataProperty().
- *
- * These are the supported properties:
- *
- * - `SDL_PROP_APP_METADATA_NAME_STRING`: The human-readable name of the
- * application, like "My Game 2: Bad Guy's Revenge!". This will show up
- * anywhere the OS shows the name of the application separately from window
- * titles, such as volume control applets, etc. This defaults to "SDL
- * Application".
- * - `SDL_PROP_APP_METADATA_VERSION_STRING`: The version of the app that is
- * running; there are no rules on format, so "1.0.3beta2" and "April 22nd,
- * 2024" and a git hash are all valid options. This has no default.
- * - `SDL_PROP_APP_METADATA_IDENTIFIER_STRING`: A unique string that
- * identifies this app. This must be in reverse-domain format, like
- * "com.example.mygame2". This string is used by desktop compositors to
- * identify and group windows together, as well as match applications with
- * associated desktop settings and icons. If you plan to package your
- * application in a container such as Flatpak, the app ID should match the
- * name of your Flatpak container as well. This has no default.
- * - `SDL_PROP_APP_METADATA_CREATOR_STRING`: The human-readable name of the
- * creator/developer/maker of this app, like "MojoWorkshop, LLC"
- * - `SDL_PROP_APP_METADATA_COPYRIGHT_STRING`: The human-readable copyright
- * notice, like "Copyright (c) 2024 MojoWorkshop, LLC" or whatnot. Keep this
- * to one line, don't paste a copy of a whole software license in here. This
- * has no default.
- * - `SDL_PROP_APP_METADATA_URL_STRING`: A URL to the app on the web. Maybe a
- * product page, or a storefront, or even a GitHub repository, for user's
- * further information This has no default.
- * - `SDL_PROP_APP_METADATA_TYPE_STRING`: The type of application this is.
- * Currently this string can be "game" for a video game, "mediaplayer" for a
- * media player, or generically "application" if nothing else applies.
- * Future versions of SDL might add new types. This defaults to
- * "application".
- *
- * \param name the name of the metadata property to set.
- * \param value the value of the property, or NULL to remove that property.
- * \returns true on success or false on failure; call SDL_GetError() for more
- * information.
- *
- * \threadsafety It is safe to call this function from any thread.
- *
- * \since This function is available since SDL 3.1.3.
- *
- * \sa SDL_GetAppMetadataProperty
- * \sa SDL_SetAppMetadata
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadataProperty(const char *name, const char *value);
- #define SDL_PROP_APP_METADATA_NAME_STRING "SDL.app.metadata.name"
- #define SDL_PROP_APP_METADATA_VERSION_STRING "SDL.app.metadata.version"
- #define SDL_PROP_APP_METADATA_IDENTIFIER_STRING "SDL.app.metadata.identifier"
- #define SDL_PROP_APP_METADATA_CREATOR_STRING "SDL.app.metadata.creator"
- #define SDL_PROP_APP_METADATA_COPYRIGHT_STRING "SDL.app.metadata.copyright"
- #define SDL_PROP_APP_METADATA_URL_STRING "SDL.app.metadata.url"
- #define SDL_PROP_APP_METADATA_TYPE_STRING "SDL.app.metadata.type"
- /**
- * Get metadata about your app.
- *
- * This returns metadata previously set using SDL_SetAppMetadata() or
- * SDL_SetAppMetadataProperty(). See SDL_SetAppMetadataProperty() for the list
- * of available properties and their meanings.
- *
- * \param name the name of the metadata property to get.
- * \returns the current value of the metadata property, or the default if it
- * is not set, NULL for properties with no default.
- *
- * \threadsafety It is safe to call this function from any thread, although
- * the string returned is not protected and could potentially be
- * freed if you call SDL_SetAppMetadataProperty() to set that
- * property from another thread.
- *
- * \since This function is available since SDL 3.1.3.
- *
- * \sa SDL_SetAppMetadata
- * \sa SDL_SetAppMetadataProperty
- */
- extern SDL_DECLSPEC const char * SDLCALL SDL_GetAppMetadataProperty(const char *name);
- /* Ends C function definitions when using C++ */
- #ifdef __cplusplus
- }
- #endif
- #include <SDL3/SDL_close_code.h>
- #endif /* SDL_init_h_ */
|