diff --git a/include/SDL3/SDL_properties.h b/include/SDL3/SDL_properties.h index 9a6ebf3152..588bdfc4ca 100644 --- a/include/SDL3/SDL_properties.h +++ b/include/SDL3/SDL_properties.h @@ -39,6 +39,19 @@ extern "C" { */ typedef Uint32 SDL_PropertiesID; +/** + * Get the global SDL properties + * + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.0.0. + * + * \sa SDL_GetProperty + * \sa SDL_SetProperty + */ +extern DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void); + /** * Create a set of properties * diff --git a/src/SDL_properties.c b/src/SDL_properties.c index d0b9c60f17..49ae6866cd 100644 --- a/src/SDL_properties.c +++ b/src/SDL_properties.c @@ -39,6 +39,7 @@ typedef struct static SDL_HashTable *SDL_properties; static SDL_RWLock *SDL_properties_lock; static SDL_PropertiesID SDL_last_properties_id; +static SDL_PropertiesID SDL_global_properties; static void SDL_FreeProperty(const void *key, const void *value, void *data) @@ -81,11 +82,23 @@ int SDL_InitProperties(void) return -1; } } + + /* Create the global properties here to avoid race conditions later */ + if (!SDL_global_properties) { + SDL_global_properties = SDL_CreateProperties(); + if (!SDL_global_properties) { + return -1; + } + } return 0; } void SDL_QuitProperties(void) { + if (SDL_global_properties) { + SDL_DestroyProperties(SDL_global_properties); + SDL_global_properties = 0; + } if (SDL_properties) { SDL_DestroyHashTable(SDL_properties); SDL_properties = NULL; @@ -96,6 +109,14 @@ void SDL_QuitProperties(void) } } +SDL_PropertiesID SDL_GetGlobalProperties(void) +{ + if (!SDL_properties && SDL_InitProperties() < 0) { + return 0; + } + return SDL_global_properties; +} + SDL_PropertiesID SDL_CreateProperties(void) { SDL_PropertiesID props = 0; diff --git a/src/dynapi/SDL_dynapi.sym b/src/dynapi/SDL_dynapi.sym index 720591affb..e6fd996c64 100644 --- a/src/dynapi/SDL_dynapi.sym +++ b/src/dynapi/SDL_dynapi.sym @@ -922,6 +922,7 @@ SDL3_0.0.0 { SDL_GetDisplayProperties; SDL_SetPropertyWithCleanup; SDL_SetX11EventHook; + SDL_GetGlobalProperties; # extra symbols go here (don't modify this line) local: *; }; diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index a6c5440ca3..97d05e88ba 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -947,3 +947,4 @@ #define SDL_GetDisplayProperties SDL_GetDisplayProperties_REAL #define SDL_SetPropertyWithCleanup SDL_SetPropertyWithCleanup_REAL #define SDL_SetX11EventHook SDL_SetX11EventHook_REAL +#define SDL_GetGlobalProperties SDL_GetGlobalProperties_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 3348c67a8f..6402252224 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -980,3 +980,4 @@ SDL_DYNAPI_PROC(void*,SDL_AllocateEventMemory,(size_t a),(a),return) SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetDisplayProperties,(SDL_DisplayID a),(a),return) SDL_DYNAPI_PROC(int,SDL_SetPropertyWithCleanup,(SDL_PropertiesID a, const char *b, void *c, void (SDLCALL *d)(void *userdata, void *value), void *e),(a,b,c,d,e),return) SDL_DYNAPI_PROC(void,SDL_SetX11EventHook,(SDL_X11EventHook a, void *b),(a,b),) +SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetGlobalProperties,(void),(),return)