comparison SDL3/SDL_properties.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
comparison
equal deleted inserted replaced
0:e9bb126753e7 1:20d02a178406
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 * # CategoryProperties
24 *
25 * A property is a variable that can be created and retrieved by name at
26 * runtime.
27 *
28 * All properties are part of a property group (SDL_PropertiesID). A property
29 * group can be created with the SDL_CreateProperties function and destroyed
30 * with the SDL_DestroyProperties function.
31 *
32 * Properties can be added to and retrieved from a property group through the
33 * following functions:
34 *
35 * - SDL_SetPointerProperty and SDL_GetPointerProperty operate on `void*`
36 * pointer types.
37 * - SDL_SetStringProperty and SDL_GetStringProperty operate on string types.
38 * - SDL_SetNumberProperty and SDL_GetNumberProperty operate on signed 64-bit
39 * integer types.
40 * - SDL_SetFloatProperty and SDL_GetFloatProperty operate on floating point
41 * types.
42 * - SDL_SetBooleanProperty and SDL_GetBooleanProperty operate on boolean
43 * types.
44 *
45 * Properties can be removed from a group by using SDL_ClearProperty.
46 */
47
48
49 #ifndef SDL_properties_h_
50 #define SDL_properties_h_
51
52 #include <SDL3/SDL_stdinc.h>
53 #include <SDL3/SDL_error.h>
54
55 #include <SDL3/SDL_begin_code.h>
56 /* Set up for C function definitions, even when using C++ */
57 #ifdef __cplusplus
58 extern "C" {
59 #endif
60
61 /**
62 * An ID that represents a properties set.
63 *
64 * \since This datatype is available since SDL 3.2.0.
65 */
66 typedef Uint32 SDL_PropertiesID;
67
68 /**
69 * SDL property type
70 *
71 * \since This enum is available since SDL 3.2.0.
72 */
73 typedef enum SDL_PropertyType
74 {
75 SDL_PROPERTY_TYPE_INVALID,
76 SDL_PROPERTY_TYPE_POINTER,
77 SDL_PROPERTY_TYPE_STRING,
78 SDL_PROPERTY_TYPE_NUMBER,
79 SDL_PROPERTY_TYPE_FLOAT,
80 SDL_PROPERTY_TYPE_BOOLEAN
81 } SDL_PropertyType;
82
83 /**
84 * A generic property for naming things.
85 *
86 * This property is intended to be added to any SDL_PropertiesID that needs a
87 * generic name associated with the property set. It is not guaranteed that
88 * any property set will include this key, but it is convenient to have a
89 * standard key that any piece of code could reasonably agree to use.
90 *
91 * For example, the properties associated with an SDL_Texture might have a
92 * name string of "player sprites", or an SDL_AudioStream might have
93 * "background music", etc. This might also be useful for an SDL_IOStream to
94 * list the path to its asset.
95 *
96 * There is no format for the value set with this key; it is expected to be
97 * human-readable and informational in nature, possibly for logging or
98 * debugging purposes.
99 *
100 * SDL does not currently set this property on any objects it creates, but
101 * this may change in later versions; it is currently expected that apps and
102 * external libraries will take advantage of it, when appropriate.
103 *
104 * \since This macro is available since SDL 3.4.0.
105 */
106 #define SDL_PROP_NAME_STRING "SDL.name"
107
108 /**
109 * Get the global SDL properties.
110 *
111 * \returns a valid property ID on success or 0 on failure; call
112 * SDL_GetError() for more information.
113 *
114 * \since This function is available since SDL 3.2.0.
115 */
116 extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void);
117
118 /**
119 * Create a group of properties.
120 *
121 * All properties are automatically destroyed when SDL_Quit() is called.
122 *
123 * \returns an ID for a new group of properties, or 0 on failure; call
124 * SDL_GetError() for more information.
125 *
126 * \threadsafety It is safe to call this function from any thread.
127 *
128 * \since This function is available since SDL 3.2.0.
129 *
130 * \sa SDL_DestroyProperties
131 */
132 extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_CreateProperties(void);
133
134 /**
135 * Copy a group of properties.
136 *
137 * Copy all the properties from one group of properties to another, with the
138 * exception of properties requiring cleanup (set using
139 * SDL_SetPointerPropertyWithCleanup()), which will not be copied. Any
140 * property that already exists on `dst` will be overwritten.
141 *
142 * \param src the properties to copy.
143 * \param dst the destination properties.
144 * \returns true on success or false on failure; call SDL_GetError() for more
145 * information.
146 *
147 * \threadsafety It is safe to call this function from any thread. This
148 * function acquires simultaneous mutex locks on both the source
149 * and destination property sets.
150 *
151 * \since This function is available since SDL 3.2.0.
152 */
153 extern SDL_DECLSPEC bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SDL_PropertiesID dst);
154
155 /**
156 * Lock a group of properties.
157 *
158 * Obtain a multi-threaded lock for these properties. Other threads will wait
159 * while trying to lock these properties until they are unlocked. Properties
160 * must be unlocked before they are destroyed.
161 *
162 * The lock is automatically taken when setting individual properties, this
163 * function is only needed when you want to set several properties atomically
164 * or want to guarantee that properties being queried aren't freed in another
165 * thread.
166 *
167 * \param props the properties to lock.
168 * \returns true on success or false on failure; call SDL_GetError() for more
169 * information.
170 *
171 * \threadsafety It is safe to call this function from any thread.
172 *
173 * \since This function is available since SDL 3.2.0.
174 *
175 * \sa SDL_UnlockProperties
176 */
177 extern SDL_DECLSPEC bool SDLCALL SDL_LockProperties(SDL_PropertiesID props);
178
179 /**
180 * Unlock a group of properties.
181 *
182 * \param props the properties to unlock.
183 *
184 * \threadsafety It is safe to call this function from any thread.
185 *
186 * \since This function is available since SDL 3.2.0.
187 *
188 * \sa SDL_LockProperties
189 */
190 extern SDL_DECLSPEC void SDLCALL SDL_UnlockProperties(SDL_PropertiesID props);
191
192 /**
193 * A callback used to free resources when a property is deleted.
194 *
195 * This should release any resources associated with `value` that are no
196 * longer needed.
197 *
198 * This callback is set per-property. Different properties in the same group
199 * can have different cleanup callbacks.
200 *
201 * This callback will be called _during_ SDL_SetPointerPropertyWithCleanup if
202 * the function fails for any reason.
203 *
204 * \param userdata an app-defined pointer passed to the callback.
205 * \param value the pointer assigned to the property to clean up.
206 *
207 * \threadsafety This callback may fire without any locks held; if this is a
208 * concern, the app should provide its own locking.
209 *
210 * \since This datatype is available since SDL 3.2.0.
211 *
212 * \sa SDL_SetPointerPropertyWithCleanup
213 */
214 typedef void (SDLCALL *SDL_CleanupPropertyCallback)(void *userdata, void *value);
215
216 /**
217 * Set a pointer property in a group of properties with a cleanup function
218 * that is called when the property is deleted.
219 *
220 * The cleanup function is also called if setting the property fails for any
221 * reason.
222 *
223 * For simply setting basic data types, like numbers, bools, or strings, use
224 * SDL_SetNumberProperty, SDL_SetBooleanProperty, or SDL_SetStringProperty
225 * instead, as those functions will handle cleanup on your behalf. This
226 * function is only for more complex, custom data.
227 *
228 * \param props the properties to modify.
229 * \param name the name of the property to modify.
230 * \param value the new value of the property, or NULL to delete the property.
231 * \param cleanup the function to call when this property is deleted, or NULL
232 * if no cleanup is necessary.
233 * \param userdata a pointer that is passed to the cleanup function.
234 * \returns true on success or false on failure; call SDL_GetError() for more
235 * information.
236 *
237 * \threadsafety It is safe to call this function from any thread.
238 *
239 * \since This function is available since SDL 3.2.0.
240 *
241 * \sa SDL_GetPointerProperty
242 * \sa SDL_SetPointerProperty
243 * \sa SDL_CleanupPropertyCallback
244 */
245 extern SDL_DECLSPEC bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_PropertiesID props, const char *name, void *value, SDL_CleanupPropertyCallback cleanup, void *userdata);
246
247 /**
248 * Set a pointer property in a group of properties.
249 *
250 * \param props the properties to modify.
251 * \param name the name of the property to modify.
252 * \param value the new value of the property, or NULL to delete the property.
253 * \returns true on success or false on failure; call SDL_GetError() for more
254 * information.
255 *
256 * \threadsafety It is safe to call this function from any thread.
257 *
258 * \since This function is available since SDL 3.2.0.
259 *
260 * \sa SDL_GetPointerProperty
261 * \sa SDL_HasProperty
262 * \sa SDL_SetBooleanProperty
263 * \sa SDL_SetFloatProperty
264 * \sa SDL_SetNumberProperty
265 * \sa SDL_SetPointerPropertyWithCleanup
266 * \sa SDL_SetStringProperty
267 */
268 extern SDL_DECLSPEC bool SDLCALL SDL_SetPointerProperty(SDL_PropertiesID props, const char *name, void *value);
269
270 /**
271 * Set a string property in a group of properties.
272 *
273 * This function makes a copy of the string; the caller does not have to
274 * preserve the data after this call completes.
275 *
276 * \param props the properties to modify.
277 * \param name the name of the property to modify.
278 * \param value the new value of the property, or NULL to delete the property.
279 * \returns true on success or false on failure; call SDL_GetError() for more
280 * information.
281 *
282 * \threadsafety It is safe to call this function from any thread.
283 *
284 * \since This function is available since SDL 3.2.0.
285 *
286 * \sa SDL_GetStringProperty
287 */
288 extern SDL_DECLSPEC bool SDLCALL SDL_SetStringProperty(SDL_PropertiesID props, const char *name, const char *value);
289
290 /**
291 * Set an integer property in a group of properties.
292 *
293 * \param props the properties to modify.
294 * \param name the name of the property to modify.
295 * \param value the new value of the property.
296 * \returns true on success or false on failure; call SDL_GetError() for more
297 * information.
298 *
299 * \threadsafety It is safe to call this function from any thread.
300 *
301 * \since This function is available since SDL 3.2.0.
302 *
303 * \sa SDL_GetNumberProperty
304 */
305 extern SDL_DECLSPEC bool SDLCALL SDL_SetNumberProperty(SDL_PropertiesID props, const char *name, Sint64 value);
306
307 /**
308 * Set a floating point property in a group of properties.
309 *
310 * \param props the properties to modify.
311 * \param name the name of the property to modify.
312 * \param value the new value of the property.
313 * \returns true on success or false on failure; call SDL_GetError() for more
314 * information.
315 *
316 * \threadsafety It is safe to call this function from any thread.
317 *
318 * \since This function is available since SDL 3.2.0.
319 *
320 * \sa SDL_GetFloatProperty
321 */
322 extern SDL_DECLSPEC bool SDLCALL SDL_SetFloatProperty(SDL_PropertiesID props, const char *name, float value);
323
324 /**
325 * Set a boolean property in a group of properties.
326 *
327 * \param props the properties to modify.
328 * \param name the name of the property to modify.
329 * \param value the new value of the property.
330 * \returns true on success or false on failure; call SDL_GetError() for more
331 * information.
332 *
333 * \threadsafety It is safe to call this function from any thread.
334 *
335 * \since This function is available since SDL 3.2.0.
336 *
337 * \sa SDL_GetBooleanProperty
338 */
339 extern SDL_DECLSPEC bool SDLCALL SDL_SetBooleanProperty(SDL_PropertiesID props, const char *name, bool value);
340
341 /**
342 * Return whether a property exists in a group of properties.
343 *
344 * \param props the properties to query.
345 * \param name the name of the property to query.
346 * \returns true if the property exists, or false if it doesn't.
347 *
348 * \threadsafety It is safe to call this function from any thread.
349 *
350 * \since This function is available since SDL 3.2.0.
351 *
352 * \sa SDL_GetPropertyType
353 */
354 extern SDL_DECLSPEC bool SDLCALL SDL_HasProperty(SDL_PropertiesID props, const char *name);
355
356 /**
357 * Get the type of a property in a group of properties.
358 *
359 * \param props the properties to query.
360 * \param name the name of the property to query.
361 * \returns the type of the property, or SDL_PROPERTY_TYPE_INVALID if it is
362 * not set.
363 *
364 * \threadsafety It is safe to call this function from any thread.
365 *
366 * \since This function is available since SDL 3.2.0.
367 *
368 * \sa SDL_HasProperty
369 */
370 extern SDL_DECLSPEC SDL_PropertyType SDLCALL SDL_GetPropertyType(SDL_PropertiesID props, const char *name);
371
372 /**
373 * Get a pointer property from a group of properties.
374 *
375 * By convention, the names of properties that SDL exposes on objects will
376 * start with "SDL.", and properties that SDL uses internally will start with
377 * "SDL.internal.". These should be considered read-only and should not be
378 * modified by applications.
379 *
380 * \param props the properties to query.
381 * \param name the name of the property to query.
382 * \param default_value the default value of the property.
383 * \returns the value of the property, or `default_value` if it is not set or
384 * not a pointer property.
385 *
386 * \threadsafety It is safe to call this function from any thread, although
387 * the data returned is not protected and could potentially be
388 * freed if you call SDL_SetPointerProperty() or
389 * SDL_ClearProperty() on these properties from another thread.
390 * If you need to avoid this, use SDL_LockProperties() and
391 * SDL_UnlockProperties().
392 *
393 * \since This function is available since SDL 3.2.0.
394 *
395 * \sa SDL_GetBooleanProperty
396 * \sa SDL_GetFloatProperty
397 * \sa SDL_GetNumberProperty
398 * \sa SDL_GetPropertyType
399 * \sa SDL_GetStringProperty
400 * \sa SDL_HasProperty
401 * \sa SDL_SetPointerProperty
402 */
403 extern SDL_DECLSPEC void * SDLCALL SDL_GetPointerProperty(SDL_PropertiesID props, const char *name, void *default_value);
404
405 /**
406 * Get a string property from a group of properties.
407 *
408 * \param props the properties to query.
409 * \param name the name of the property to query.
410 * \param default_value the default value of the property.
411 * \returns the value of the property, or `default_value` if it is not set or
412 * not a string property.
413 *
414 * \threadsafety It is safe to call this function from any thread, although
415 * the data returned is not protected and could potentially be
416 * freed if you call SDL_SetStringProperty() or
417 * SDL_ClearProperty() on these properties from another thread.
418 * If you need to avoid this, use SDL_LockProperties() and
419 * SDL_UnlockProperties().
420 *
421 * \since This function is available since SDL 3.2.0.
422 *
423 * \sa SDL_GetPropertyType
424 * \sa SDL_HasProperty
425 * \sa SDL_SetStringProperty
426 */
427 extern SDL_DECLSPEC const char * SDLCALL SDL_GetStringProperty(SDL_PropertiesID props, const char *name, const char *default_value);
428
429 /**
430 * Get a number property from a group of properties.
431 *
432 * You can use SDL_GetPropertyType() to query whether the property exists and
433 * is a number property.
434 *
435 * \param props the properties to query.
436 * \param name the name of the property to query.
437 * \param default_value the default value of the property.
438 * \returns the value of the property, or `default_value` if it is not set or
439 * not a number property.
440 *
441 * \threadsafety It is safe to call this function from any thread.
442 *
443 * \since This function is available since SDL 3.2.0.
444 *
445 * \sa SDL_GetPropertyType
446 * \sa SDL_HasProperty
447 * \sa SDL_SetNumberProperty
448 */
449 extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetNumberProperty(SDL_PropertiesID props, const char *name, Sint64 default_value);
450
451 /**
452 * Get a floating point property from a group of properties.
453 *
454 * You can use SDL_GetPropertyType() to query whether the property exists and
455 * is a floating point property.
456 *
457 * \param props the properties to query.
458 * \param name the name of the property to query.
459 * \param default_value the default value of the property.
460 * \returns the value of the property, or `default_value` if it is not set or
461 * not a float property.
462 *
463 * \threadsafety It is safe to call this function from any thread.
464 *
465 * \since This function is available since SDL 3.2.0.
466 *
467 * \sa SDL_GetPropertyType
468 * \sa SDL_HasProperty
469 * \sa SDL_SetFloatProperty
470 */
471 extern SDL_DECLSPEC float SDLCALL SDL_GetFloatProperty(SDL_PropertiesID props, const char *name, float default_value);
472
473 /**
474 * Get a boolean property from a group of properties.
475 *
476 * You can use SDL_GetPropertyType() to query whether the property exists and
477 * is a boolean property.
478 *
479 * \param props the properties to query.
480 * \param name the name of the property to query.
481 * \param default_value the default value of the property.
482 * \returns the value of the property, or `default_value` if it is not set or
483 * not a boolean property.
484 *
485 * \threadsafety It is safe to call this function from any thread.
486 *
487 * \since This function is available since SDL 3.2.0.
488 *
489 * \sa SDL_GetPropertyType
490 * \sa SDL_HasProperty
491 * \sa SDL_SetBooleanProperty
492 */
493 extern SDL_DECLSPEC bool SDLCALL SDL_GetBooleanProperty(SDL_PropertiesID props, const char *name, bool default_value);
494
495 /**
496 * Clear a property from a group of properties.
497 *
498 * \param props the properties to modify.
499 * \param name the name of the property to clear.
500 * \returns true on success or false on failure; call SDL_GetError() for more
501 * information.
502 *
503 * \threadsafety It is safe to call this function from any thread.
504 *
505 * \since This function is available since SDL 3.2.0.
506 */
507 extern SDL_DECLSPEC bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, const char *name);
508
509 /**
510 * A callback used to enumerate all the properties in a group of properties.
511 *
512 * This callback is called from SDL_EnumerateProperties(), and is called once
513 * per property in the set.
514 *
515 * \param userdata an app-defined pointer passed to the callback.
516 * \param props the SDL_PropertiesID that is being enumerated.
517 * \param name the next property name in the enumeration.
518 *
519 * \threadsafety SDL_EnumerateProperties holds a lock on `props` during this
520 * callback.
521 *
522 * \since This datatype is available since SDL 3.2.0.
523 *
524 * \sa SDL_EnumerateProperties
525 */
526 typedef void (SDLCALL *SDL_EnumeratePropertiesCallback)(void *userdata, SDL_PropertiesID props, const char *name);
527
528 /**
529 * Enumerate the properties contained in a group of properties.
530 *
531 * The callback function is called for each property in the group of
532 * properties. The properties are locked during enumeration.
533 *
534 * \param props the properties to query.
535 * \param callback the function to call for each property.
536 * \param userdata a pointer that is passed to `callback`.
537 * \returns true on success or false on failure; call SDL_GetError() for more
538 * information.
539 *
540 * \threadsafety It is safe to call this function from any thread.
541 *
542 * \since This function is available since SDL 3.2.0.
543 */
544 extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID props, SDL_EnumeratePropertiesCallback callback, void *userdata);
545
546 /**
547 * Destroy a group of properties.
548 *
549 * All properties are deleted and their cleanup functions will be called, if
550 * any.
551 *
552 * \param props the properties to destroy.
553 *
554 * \threadsafety This function should not be called while these properties are
555 * locked or other threads might be setting or getting values
556 * from these properties.
557 *
558 * \since This function is available since SDL 3.2.0.
559 *
560 * \sa SDL_CreateProperties
561 */
562 extern SDL_DECLSPEC void SDLCALL SDL_DestroyProperties(SDL_PropertiesID props);
563
564 /* Ends C function definitions when using C++ */
565 #ifdef __cplusplus
566 }
567 #endif
568 #include <SDL3/SDL_close_code.h>
569
570 #endif /* SDL_properties_h_ */