فهرست منبع

Added SDL_GetGlobalProperties()

We'll undoubtedly want to have global properties available
Sam Lantinga 1 سال پیش
والد
کامیت
979214363f
5فایلهای تغییر یافته به همراه37 افزوده شده و 0 حذف شده
  1. 13 0
      include/SDL3/SDL_properties.h
  2. 21 0
      src/SDL_properties.c
  3. 1 0
      src/dynapi/SDL_dynapi.sym
  4. 1 0
      src/dynapi/SDL_dynapi_overrides.h
  5. 1 0
      src/dynapi/SDL_dynapi_procs.h

+ 13 - 0
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
  *

+ 21 - 0
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;

+ 1 - 0
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: *;
 };

+ 1 - 0
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

+ 1 - 0
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)