From 4f55271571fbaf63fc8c1c0924512628fb6ed970 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 26 Jul 2024 18:57:18 -0700 Subject: [PATCH] Removed temporary memory from the API It was intended to make the API easier to use, but various automatic garbage collection all had flaws, and making the application periodically clean up temporary memory added cognitive load to using the API, and in many cases was it was difficult to restructure threaded code to handle this. So, we're largely going back to the original system, where the API returns allocated results and you free them. In addition, to solve the problems we originally wanted temporary memory for: * Short strings with a finite count, like device names, get stored in a per-thread string pool. * Events continue to use temporary memory internally, which is cleaned up on the next event processing cycle. --- docs/README-migration.md | 38 ++++------ docs/README-strings.md | 52 ------------- docs/README-winrt.md | 39 ---------- include/SDL3/SDL_audio.h | 26 +++---- include/SDL3/SDL_begin_code.h | 7 +- include/SDL3/SDL_camera.h | 14 ++-- include/SDL3/SDL_clipboard.h | 12 +-- include/SDL3/SDL_events.h | 79 -------------------- include/SDL3/SDL_filesystem.h | 12 +-- include/SDL3/SDL_gamepad.h | 44 +++++------ include/SDL3/SDL_guid.h | 6 +- include/SDL3/SDL_haptic.h | 9 ++- include/SDL3/SDL_hints.h | 2 +- include/SDL3/SDL_joystick.h | 14 ++-- include/SDL3/SDL_keyboard.h | 10 +-- include/SDL3/SDL_locale.h | 4 +- include/SDL3/SDL_mouse.h | 6 +- include/SDL3/SDL_pen.h | 2 +- include/SDL3/SDL_properties.h | 9 ++- include/SDL3/SDL_render.h | 4 +- include/SDL3/SDL_sensor.h | 8 +- include/SDL3/SDL_stdinc.h | 6 +- include/SDL3/SDL_storage.h | 4 +- include/SDL3/SDL_system.h | 8 +- include/SDL3/SDL_thread.h | 2 +- include/SDL3/SDL_touch.h | 10 +-- include/SDL3/SDL_video.h | 39 +++++----- src/SDL_guid.c | 19 +++-- src/SDL_hints.c | 10 +-- src/SDL_internal.h | 15 ++-- src/SDL_properties.c | 4 +- src/SDL_utils.c | 45 +++++++++++ src/SDL_utils_c.h | 2 + src/audio/SDL_audio.c | 20 ++--- src/audio/SDL_audiocvt.c | 12 +-- src/camera/SDL_camera.c | 14 ++-- src/core/android/SDL_android.c | 6 +- src/dynapi/SDL_dynapi_procs.h | 66 ++++++++-------- src/dynapi/gendynapi.py | 2 +- src/events/SDL_events.c | 11 ++- src/events/SDL_events_c.h | 5 ++ src/events/SDL_keyboard.c | 12 +-- src/events/SDL_keymap.c | 5 +- src/events/SDL_mouse.c | 6 +- src/events/SDL_pen.c | 2 +- src/events/SDL_touch.c | 10 +-- src/filesystem/SDL_filesystem.c | 10 +-- src/filesystem/SDL_sysfilesystem.h | 2 +- src/filesystem/winrt/SDL_sysfilesystem.cpp | 2 +- src/haptic/SDL_haptic.c | 10 +-- src/joystick/SDL_gamepad.c | 75 ++++++++----------- src/joystick/SDL_joystick.c | 27 ++++--- src/joystick/apple/SDL_mfijoystick.m | 8 +- src/locale/SDL_locale.c | 6 +- src/render/SDL_render.c | 4 +- src/sensor/SDL_sensor.c | 8 +- src/stdlib/SDL_getenv.c | 17 +++-- src/storage/SDL_storage.c | 2 +- src/storage/generic/SDL_genericstorage.c | 12 +-- src/test/SDL_test_common.c | 34 +++++---- src/thread/SDL_thread.c | 4 +- src/video/SDL_clipboard.c | 26 +++---- src/video/SDL_video.c | 87 +++++++++------------- src/video/cocoa/SDL_cocoawindow.m | 3 +- src/video/kmsdrm/SDL_kmsdrmmouse.c | 3 +- src/video/kmsdrm/SDL_kmsdrmvideo.c | 10 +-- src/video/uikit/SDL_uikitmodes.m | 3 +- src/video/uikit/SDL_uikitwindow.m | 9 +-- src/video/wayland/SDL_waylandwindow.c | 3 +- src/video/windows/SDL_windowsevents.c | 6 +- src/video/x11/SDL_x11modes.c | 3 +- src/video/x11/SDL_x11mouse.c | 3 +- src/video/x11/SDL_x11xinput2.c | 57 ++++++++------ test/gamepadutils.c | 6 +- test/pretest.c | 2 +- test/testaudioinfo.c | 3 +- test/testaudiorecording.c | 7 +- test/testautomation_audio.c | 3 +- test/testautomation_clipboard.c | 26 +++++-- test/testautomation_events.c | 67 +---------------- test/testautomation_guid.c | 4 +- test/testautomation_joystick.c | 12 ++- test/testautomation_pen.c | 1 + test/testautomation_video.c | 42 ++++++----- test/testbounds.c | 3 +- test/testcamera.c | 6 +- test/testcontroller.c | 23 +++--- test/testdialog.c | 3 +- test/testdisplayinfo.c | 6 +- test/testfilesystem.c | 7 +- test/testhaptic.c | 77 ++++++++++--------- test/testhotplug.c | 8 +- test/testime.c | 19 ++++- test/testlocale.c | 3 +- test/testmultiaudio.c | 3 +- test/testpen.c | 4 +- test/testrumble.c | 75 ++++++++++--------- test/testsensor.c | 3 +- test/testsurround.c | 4 +- test/testwm.c | 7 +- 100 files changed, 737 insertions(+), 853 deletions(-) diff --git a/docs/README-migration.md b/docs/README-migration.md index 879c2df00..d6e0b0731 100644 --- a/docs/README-migration.md +++ b/docs/README-migration.md @@ -158,9 +158,9 @@ Rather than iterating over audio devices using a device index, there are new fun if (devices) { for (i = 0; i < num_devices; ++i) { SDL_AudioDeviceID instance_id = devices[i]; - const char *name = SDL_GetAudioDeviceName(instance_id); - SDL_Log("AudioDevice %" SDL_PRIu32 ": %s\n", instance_id, name); + SDL_Log("AudioDevice %" SDL_PRIu32 ": %s\n", instance_id, SDL_GetAudioDeviceName(instance_id)); } + SDL_free(devices); } SDL_QuitSubSystem(SDL_INIT_AUDIO); } @@ -298,10 +298,6 @@ The following symbols have been renamed: The following symbols have been removed: * SDL_MIX_MAXVOLUME - mixer volume is now a float between 0.0 and 1.0 -## SDL_clipboard.h - -SDL_GetClipboardText() and SDL_GetPrimarySelectionText() return a const pointer to temporary memory, which does not need to be freed. You can use SDL_ClaimTemporaryMemory() to convert it to a non-const pointer that should be freed when you're done with it. - ## SDL_cpuinfo.h The intrinsics headers (mmintrin.h, etc.) have been moved to `` and are no longer automatically included in SDL.h. @@ -458,10 +454,6 @@ The following functions have been removed: The following enums have been renamed: * SDL_eventaction => SDL_EventAction -## SDL_filesystem.h - -SDL_GetBasePath() and SDL_GetPrefPath() return a const pointer to temporary memory, which does not need to be freed. You can use SDL_ClaimTemporaryMemory() to convert it to a non-const pointer that should be freed when you're done with it. - ## SDL_gamecontroller.h SDL_gamecontroller.h has been renamed SDL_gamepad.h, and all APIs have been renamed to match. @@ -710,15 +702,13 @@ Rather than iterating over haptic devices using device index, there is a new fun { if (SDL_InitSubSystem(SDL_INIT_HAPTIC) == 0) { int i, num_haptics; - const SDL_HapticID *haptics = SDL_GetHaptics(&num_haptics); + SDL_HapticID *haptics = SDL_GetHaptics(&num_haptics); if (haptics) { for (i = 0; i < num_haptics; ++i) { SDL_HapticID instance_id = haptics[i]; - const char *name = SDL_GetHapticNameForID(instance_id); - - SDL_Log("Haptic %" SDL_PRIu32 ": %s\n", - instance_id, name ? name : "Unknown"); + SDL_Log("Haptic %" SDL_PRIu32 ": %s\n", instance_id, SDL_GetHapticNameForID(instance_id)); } + SDL_free(haptics); } SDL_QuitSubSystem(SDL_INIT_HAPTIC); } @@ -840,7 +830,7 @@ Rather than iterating over joysticks using device index, there is a new function { if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) == 0) { int i, num_joysticks; - const SDL_JoystickID *joysticks = SDL_GetJoysticks(&num_joysticks); + SDL_JoystickID *joysticks = SDL_GetJoysticks(&num_joysticks); if (joysticks) { for (i = 0; i < num_joysticks; ++i) { SDL_JoystickID instance_id = joysticks[i]; @@ -850,6 +840,7 @@ Rather than iterating over joysticks using device index, there is a new function SDL_Log("Joystick %" SDL_PRIu32 ": %s%s%s VID 0x%.4x, PID 0x%.4x\n", instance_id, name ? name : "Unknown", path ? ", " : "", path ? path : "", SDL_GetJoystickVendorForID(instance_id), SDL_GetJoystickProductForID(instance_id)); } + SDL_free(joysticks); } SDL_QuitSubSystem(SDL_INIT_JOYSTICK); } @@ -1034,10 +1025,6 @@ The following symbols have been renamed: SDL_LoadFunction() now returns `SDL_FunctionPointer` instead of `void *`, and should be cast to the appropriate function type. You can define SDL_FUNCTION_POINTER_IS_VOID_POINTER in your project to restore the previous behavior. -## SDL_locale.h - -SDL_GetPreferredLocales() returns a const array of locale pointers, which does not need to be freed. You can use SDL_ClaimTemporaryMemory() to convert it to a non-const pointer that should be freed when you're done with it. - ## SDL_log.h The following macros have been removed: @@ -1588,7 +1575,7 @@ Rather than iterating over sensors using device index, there is a new function S { if (SDL_InitSubSystem(SDL_INIT_SENSOR) == 0) { int i, num_sensors; - const SDL_SensorID *sensors = SDL_GetSensors(&num_sensors); + SDL_SensorID *sensors = SDL_GetSensors(&num_sensors); if (sensors) { for (i = 0; i < num_sensors; ++i) { SDL_Log("Sensor %" SDL_PRIu32 ": %s, type %d, platform type %d\n", @@ -1597,6 +1584,7 @@ Rather than iterating over sensors using device index, there is a new function S SDL_GetSensorTypeForID(sensors[i]), SDL_GetSensorNonPortableTypeForID(sensors[i])); } + SDL_free(sensors); } SDL_QuitSubSystem(SDL_INIT_SENSOR); } @@ -1996,7 +1984,7 @@ Rather than iterating over displays using display index, there is a new function { if (SDL_InitSubSystem(SDL_INIT_VIDEO) == 0) { int i, num_displays = 0; - const SDL_DisplayID *displays = SDL_GetDisplays(&num_displays); + SDL_DisplayID *displays = SDL_GetDisplays(&num_displays); if (displays) { for (i = 0; i < num_displays; ++i) { SDL_DisplayID instance_id = displays[i]; @@ -2004,6 +1992,7 @@ Rather than iterating over displays using display index, there is a new function SDL_Log("Display %" SDL_PRIu32 ": %s\n", instance_id, name ? name : "Unknown"); } + SDL_free(displays); } SDL_QuitSubSystem(SDL_INIT_VIDEO); } @@ -2041,13 +2030,14 @@ Rather than iterating over display modes using an index, there is a new function { SDL_DisplayID display = SDL_GetPrimaryDisplay(); int num_modes = 0; - const SDL_DisplayMode * const *modes = SDL_GetFullscreenDisplayModes(display, &num_modes); + SDL_DisplayMode **modes = SDL_GetFullscreenDisplayModes(display, &num_modes); if (modes) { for (i = 0; i < num_modes; ++i) { SDL_DisplayMode *mode = modes[i]; SDL_Log("Display %" SDL_PRIu32 " mode %d: %dx%d@%gx %gHz\n", display, i, mode->w, mode->h, mode->pixel_density, mode->refresh_rate); } + SDL_free(modes); } } ``` @@ -2080,8 +2070,6 @@ SDL_WindowFlags is used instead of Uint32 for API functions that refer to window SDL_GetWindowOpacity() directly returns the opacity instead of using an out parameter. -SDL_GetWindowICCProfile() returns a const pointer to temporary memory, which does not need to be freed. You can use SDL_ClaimTemporaryMemory() to convert it to a non-const pointer that should be freed when you're done with it. - The following functions have been renamed: * SDL_GL_DeleteContext() => SDL_GL_DestroyContext() * SDL_GetClosestDisplayMode() => SDL_GetClosestFullscreenDisplayMode() diff --git a/docs/README-strings.md b/docs/README-strings.md index 58d94f927..ea86b8d59 100644 --- a/docs/README-strings.md +++ b/docs/README-strings.md @@ -5,55 +5,3 @@ Unless otherwise specified, all strings in SDL, across all platforms, are UTF-8 encoded and can represent the full range of [Unicode](https://unicode.org). - -## The SDL Get String Rule. - -Did you see 'SDL_GetStringRule' in the wiki or headers? Here are the details -that aren't worth copying across dozens of functions' documentation. - -tl;dr: If an SDL function returns a `const char *` string, do not modify or -free it, and if you need to save it, make a copy right away. - -In several cases, SDL wants to return a string to the app, and the question -in any library that does this is: _who owns this thing?_ - -The answer in almost all cases, is that SDL does, but not for long. - -The pointer is only guaranteed to be valid until the next time the event -queue is updated, or SDL_Quit is called. - -The reason for this is memory safety. - -There are several strings that SDL provides that could be freed at -any moment. For example, an app calls SDL_GetAudioDeviceName(), which returns -a string that is part of the internal audio device structure. But, while this -function is returning, the user yanks the USB audio device out of the -computer, and SDL decides to deallocate the structure...and the string! -Now the app is holding a pointer that didn't live long enough to be useful, -and could crash if accessed. - -To avoid this, instead of calling SDL_free on a string as soon as it's done -with it, SDL adds the pointer to a list. This list is freed at specific -points: when the event queue is run (for ongoing cleanup) and when SDL_Quit -is called (to catch things that are just hanging around). This allows the -app to use a string without worrying about it becoming bogus in the middle -of a printf() call. If the app needs it for longer, it should copy it. - -When does "the event queue run"? There are several points: - -- If the app calls SDL_PumpEvents() _from any thread_. -- SDL_PumpEvents is also called by several other APIs internally: - SDL_PollEvent(), SDL_PeepEvents(), SDL_WaitEvent(), - SDL_WaitEventTimeout(), and maybe others. -- If you are using [the main callbacks](main-functions#main-callbacks-in-sdl3), - the event queue can run immediately after any of the callback functions - return. - -Note that these are just guaranteed minimum lifespans; any given string -might live much longer--some might even be static memory that is _never_ -deallocated--but this rule promises that the app has a safe window. - -Note that none of this applies if the return value is `char *` instead of -`const char *`. Please see the specific function's documentation for how -to handle those pointers. - diff --git a/docs/README-winrt.md b/docs/README-winrt.md index eb20ddad7..58a307420 100644 --- a/docs/README-winrt.md +++ b/docs/README-winrt.md @@ -95,45 +95,6 @@ Here is a rough list of what works, and what doesn't: -Upgrade Notes -------------- - -#### SDL_GetPrefPath() usage when upgrading WinRT apps from SDL 2.0.3 - -SDL 2.0.4 fixes two bugs found in the WinRT version of SDL_GetPrefPath(). -The fixes may affect older, SDL 2.0.3-based apps' save data. Please note -that these changes only apply to SDL-based WinRT apps, and not to apps for -any other platform. - -1. SDL_GetPrefPath() would return an invalid path, one in which the path's - directory had not been created. Attempts to create files there - (via fopen(), for example), would fail, unless that directory was - explicitly created beforehand. - -2. SDL_GetPrefPath(), for non-WinPhone-based apps, would return a path inside - a WinRT 'Roaming' folder, the contents of which get automatically - synchronized across multiple devices. This process can occur while an - application runs, and can cause existing save-data to be overwritten - at unexpected times, with data from other devices. (Windows Phone apps - written with SDL 2.0.3 did not utilize a Roaming folder, due to API - restrictions in Windows Phone 8.0). - - -SDL_GetPrefPath(), starting with SDL 2.0.4, addresses these by: - -1. making sure that SDL_GetPrefPath() returns a directory in which data - can be written to immediately, without first needing to create directories. - -2. basing SDL_GetPrefPath() off of a different, non-Roaming folder, the - contents of which do not automatically get synchronized across devices - (and which require less work to use safely, in terms of data integrity). - -Apps that wish to get their Roaming folder's path can do so either by using -SDL_GetWinRTFSPath(), or directly through the WinRT class, -Windows.Storage.ApplicationData. - - - Setup, High-Level Steps ----------------------- diff --git a/include/SDL3/SDL_audio.h b/include/SDL3/SDL_audio.h index 8ee874ac6..da1013f31 100644 --- a/include/SDL3/SDL_audio.h +++ b/include/SDL3/SDL_audio.h @@ -411,7 +411,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); * * \sa SDL_GetNumAudioDrivers */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetAudioDriver(int index); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDriver(int index); /* @} */ /** @@ -428,7 +428,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetAudioDriver(int index); * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCurrentAudioDriver(void); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void); /** * Get a list of currently-connected audio playback devices. @@ -447,7 +447,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCurrentAudioDriver(void); * \param count a pointer filled in with the number of devices returned, may * be NULL. * \returns a 0 terminated array of device instance IDs or NULL on error; call - * SDL_GetError() for more information. + * SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread. * @@ -456,7 +456,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCurrentAudioDriver(void); * \sa SDL_OpenAudioDevice * \sa SDL_GetAudioRecordingDevices */ -extern SDL_DECLSPEC_TEMP const SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackDevices(int *count); +extern SDL_DECLSPEC_FREE SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackDevices(int *count); /** * Get a list of currently-connected audio recording devices. @@ -475,7 +475,7 @@ extern SDL_DECLSPEC_TEMP const SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackD * \param count a pointer filled in with the number of devices returned, may * be NULL. * \returns a 0 terminated array of device instance IDs, or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread. * @@ -484,7 +484,7 @@ extern SDL_DECLSPEC_TEMP const SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackD * \sa SDL_OpenAudioDevice * \sa SDL_GetAudioPlaybackDevices */ -extern SDL_DECLSPEC_TEMP const SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int *count); +extern SDL_DECLSPEC_FREE SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int *count); /** * Get the human-readable name of a specific audio device. @@ -501,7 +501,7 @@ extern SDL_DECLSPEC_TEMP const SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecording * \sa SDL_GetAudioRecordingDevices * \sa SDL_GetDefaultAudioInfo */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceID devid); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceID devid); /** * Get the current audio format of a specific audio device. @@ -550,7 +550,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid * \param devid the instance ID of the device to query. * \param count On output, set to number of channels in the map. Can be NULL. * \returns an array of the current channel mapping, with as many elements as - * the current output spec's channels, or NULL if default. + * the current output spec's channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread. * @@ -558,7 +558,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid * * \sa SDL_SetAudioStreamInputChannelMap */ -extern SDL_DECLSPEC_TEMP const int * SDLCALL SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID devid, int *count); +extern SDL_DECLSPEC_FREE int * SDLCALL SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID devid, int *count); /** * Open a specific audio device. @@ -1098,7 +1098,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream, * \param stream the SDL_AudioStream to query. * \param count On output, set to number of channels in the map. Can be NULL. * \returns an array of the current channel mapping, with as many elements as - * the current output spec's channels, or NULL if default. + * the current output spec's channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. @@ -1107,7 +1107,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream, * * \sa SDL_SetAudioStreamInputChannelMap */ -extern SDL_DECLSPEC_TEMP const int * SDLCALL SDL_GetAudioStreamInputChannelMap(SDL_AudioStream *stream, int *count); +extern SDL_DECLSPEC_FREE int * SDLCALL SDL_GetAudioStreamInputChannelMap(SDL_AudioStream *stream, int *count); /** * Get the current output channel map of an audio stream. @@ -1121,7 +1121,7 @@ extern SDL_DECLSPEC_TEMP const int * SDLCALL SDL_GetAudioStreamInputChannelMap(S * \param stream the SDL_AudioStream to query. * \param count On output, set to number of channels in the map. Can be NULL. * \returns an array of the current channel mapping, with as many elements as - * the current output spec's channels, or NULL if default. + * the current output spec's channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. @@ -1130,7 +1130,7 @@ extern SDL_DECLSPEC_TEMP const int * SDLCALL SDL_GetAudioStreamInputChannelMap(S * * \sa SDL_SetAudioStreamInputChannelMap */ -extern SDL_DECLSPEC_TEMP const int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioStream *stream, int *count); +extern SDL_DECLSPEC_FREE int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioStream *stream, int *count); /** * Set the current input channel map of an audio stream. diff --git a/include/SDL3/SDL_begin_code.h b/include/SDL3/SDL_begin_code.h index a24218759..2483533b8 100644 --- a/include/SDL3/SDL_begin_code.h +++ b/include/SDL3/SDL_begin_code.h @@ -67,8 +67,11 @@ # endif # endif #endif -/* This is used to mark functions that return temporary memory */ -#define SDL_DECLSPEC_TEMP SDL_DECLSPEC + +/* This is used to mark functions that return memory that need to be freed with SDL_free() */ +#ifndef SDL_DECLSPEC_FREE +#define SDL_DECLSPEC_FREE SDL_DECLSPEC +#endif /* By default SDL uses the C calling convention */ #ifndef SDLCALL diff --git a/include/SDL3/SDL_camera.h b/include/SDL3/SDL_camera.h index 451b73c8b..d8aad2d02 100644 --- a/include/SDL3/SDL_camera.h +++ b/include/SDL3/SDL_camera.h @@ -145,7 +145,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumCameraDrivers(void); * * \sa SDL_GetNumCameraDrivers */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCameraDriver(int index); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraDriver(int index); /** * Get the name of the current camera driver. @@ -161,7 +161,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCameraDriver(int index); * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCurrentCameraDriver(void); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void); /** * Get a list of currently connected camera devices. @@ -169,7 +169,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCurrentCameraDriver(void); * \param count a pointer filled in with the number of cameras returned, may * be NULL. * \returns a 0 terminated array of camera instance IDs or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread. * @@ -177,7 +177,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCurrentCameraDriver(void); * * \sa SDL_OpenCamera */ -extern SDL_DECLSPEC_TEMP const SDL_CameraID * SDLCALL SDL_GetCameras(int *count); +extern SDL_DECLSPEC_FREE SDL_CameraID * SDLCALL SDL_GetCameras(int *count); /** * Get the list of native formats/sizes a camera supports. @@ -205,7 +205,7 @@ extern SDL_DECLSPEC_TEMP const SDL_CameraID * SDLCALL SDL_GetCameras(int *count) * \param count a pointer filled in with the number of elements in the list, * may be NULL. * \returns a NULL terminated array of pointers to SDL_CameraSpec or NULL on - * failure; call SDL_GetError() for more information. + * failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread. * @@ -214,7 +214,7 @@ extern SDL_DECLSPEC_TEMP const SDL_CameraID * SDLCALL SDL_GetCameras(int *count) * \sa SDL_GetCameras * \sa SDL_OpenCamera */ -extern SDL_DECLSPEC_TEMP const SDL_CameraSpec * const * SDLCALL SDL_GetCameraSupportedFormats(SDL_CameraID devid, int *count); +extern SDL_DECLSPEC_FREE SDL_CameraSpec ** SDLCALL SDL_GetCameraSupportedFormats(SDL_CameraID devid, int *count); /** * Get the human-readable device name for a camera. @@ -229,7 +229,7 @@ extern SDL_DECLSPEC_TEMP const SDL_CameraSpec * const * SDLCALL SDL_GetCameraSup * * \sa SDL_GetCameras */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance_id); /** * Get the position of the camera in relation to the system. diff --git a/include/SDL3/SDL_clipboard.h b/include/SDL3/SDL_clipboard.h index bc7c14586..9323346d7 100644 --- a/include/SDL3/SDL_clipboard.h +++ b/include/SDL3/SDL_clipboard.h @@ -63,14 +63,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text); * a copy of the clipboard's content. * * \returns the clipboard text on success or an empty string on failure; call - * SDL_GetError() for more information. + * SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_HasClipboardText * \sa SDL_SetClipboardText */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetClipboardText(void); +extern SDL_DECLSPEC_FREE char * SDLCALL SDL_GetClipboardText(void); /** * Query whether the clipboard exists and contains a non-empty text string. @@ -105,14 +105,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetPrimarySelectionText(const char *text); * a copy of the primary selection's content. * * \returns the primary selection text on success or an empty string on - * failure; call SDL_GetError() for more information. + * failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_HasPrimarySelectionText * \sa SDL_SetPrimarySelectionText */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetPrimarySelectionText(void); +extern SDL_DECLSPEC_FREE char * SDLCALL SDL_GetPrimarySelectionText(void); /** * Query whether the primary selection exists and contains a non-empty text @@ -215,14 +215,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_ClearClipboardData(void); * \param mime_type the mime type to read from the clipboard. * \param size a pointer filled in with the length of the returned data. * \returns the retrieved data buffer or NULL on failure; call SDL_GetError() - * for more information. + * for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_HasClipboardData * \sa SDL_SetClipboardData */ -extern SDL_DECLSPEC_TEMP const void * SDLCALL SDL_GetClipboardData(const char *mime_type, size_t *size); +extern SDL_DECLSPEC_FREE void * SDLCALL SDL_GetClipboardData(const char *mime_type, size_t *size); /** * Query whether there is data in the clipboard for the provided mime type. diff --git a/include/SDL3/SDL_events.h b/include/SDL3/SDL_events.h index e07a0397e..694495186 100644 --- a/include/SDL3/SDL_events.h +++ b/include/SDL3/SDL_events.h @@ -352,10 +352,6 @@ typedef struct SDL_KeyboardEvent * will be inserted into the editing text. The length is the number of UTF-8 * characters that will be replaced by new typing. * - * The text string is temporary memory which will be freed in - * SDL_FreeTemporaryMemory() and can be claimed with - * SDL_ClaimTemporaryMemory(). - * * \since This struct is available since SDL 3.0.0. */ typedef struct SDL_TextEditingEvent @@ -372,10 +368,6 @@ typedef struct SDL_TextEditingEvent /** * Keyboard IME candidates event structure (event.edit_candidates.*) * - * The candidates are a single allocation of temporary memory which will be - * freed in SDL_FreeTemporaryMemory() and can be claimed with - * SDL_ClaimTemporaryMemory(). - * * \since This struct is available since SDL 3.0.0. */ typedef struct SDL_TextEditingCandidatesEvent @@ -393,10 +385,6 @@ typedef struct SDL_TextEditingCandidatesEvent /** * Keyboard text input event structure (event.text.*) * - * The text string is temporary memory which will be freed in - * SDL_FreeTemporaryMemory() and can be claimed with - * SDL_ClaimTemporaryMemory(). - * * This event will never be delivered unless text input is enabled by calling * SDL_StartTextInput(). Text input is disabled by default! * @@ -792,10 +780,6 @@ typedef struct SDL_PenButtonEvent * An event used to drop text or request a file open by the system * (event.drop.*) * - * The source and data strings are temporary memory which will be freed in - * SDL_FreeTemporaryMemory() and can be claimed with - * SDL_ClaimTemporaryMemory(). - * * \since This struct is available since SDL 3.0.0. */ typedef struct SDL_DropEvent @@ -859,10 +843,6 @@ typedef struct SDL_QuitEvent * the programmer; the only requirement is that '''type''' is a value obtained * from SDL_RegisterEvents(). * - * If the data pointers are temporary memory, they will be automatically - * transfered to the thread that pulls the event from the queue, or freed if - * the event is flushed. - * * \since This struct is available since SDL 3.0.0. */ typedef struct SDL_UserEvent @@ -1420,65 +1400,6 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EventEnabled(Uint32 type); */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); -/** - * Allocate temporary memory. - * - * You can use this to allocate memory from the temporary memory pool for the - * current thread. - * - * \param size the amount of memory to allocate. - * \returns a pointer to the memory allocated or NULL 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.0.0. - * - * \sa SDL_ClaimTemporaryMemory - * \sa SDL_FreeTemporaryMemory - */ -extern SDL_DECLSPEC void * SDLCALL SDL_AllocateTemporaryMemory(size_t size); - -/** - * Claim ownership of temporary memory. - * - * This function removes memory from the temporary memory pool for the current - * thread and gives ownership to the application. The application should use - * SDL_free() to free it when it is done using it. - * - * \param mem a pointer allocated with SDL_AllocateTemporaryMemory(). - * \returns a pointer to the memory now owned by the application, which must - * be freed using SDL_free(), or NULL if the memory is not in the - * temporary memory pool for the current thread. - * - * \threadsafety It is safe to call this function from any thread. - * - * \since This function is available since SDL 3.0.0. - * - * \sa SDL_AllocateTemporaryMemory - * \sa SDL_free - */ -extern SDL_DECLSPEC void * SDLCALL SDL_ClaimTemporaryMemory(const void *mem); - -/** - * Free temporary memory for the current thread. - * - * This function frees all temporary memory for the current thread. If you - * would like to hold onto a specific pointer beyond this call, you should - * call SDL_ClaimTemporaryMemory() to move it out of the temporary memory - * pool. - * - * This function is automatically called in SDL_Quit() on the main thread and - * in SDL_CleanupTLS() when other threads complete. - * - * \threadsafety It is safe to call this function from any thread. - * - * \since This function is available since SDL 3.0.0. - * - * \sa SDL_AllocateTemporaryMemory - * \sa SDL_ClaimTemporaryMemory - */ -extern SDL_DECLSPEC void SDLCALL SDL_FreeTemporaryMemory(void); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/include/SDL3/SDL_filesystem.h b/include/SDL3/SDL_filesystem.h index 8318b25b7..641300cca 100644 --- a/include/SDL3/SDL_filesystem.h +++ b/include/SDL3/SDL_filesystem.h @@ -77,7 +77,7 @@ extern "C" { * * \sa SDL_GetPrefPath */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetBasePath(void); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetBasePath(void); /** * Get the user-and-app-specific path where files can be written. @@ -125,13 +125,13 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetBasePath(void); * \param app the name of your application. * \returns a UTF-8 string of the user directory in platform-dependent * notation. NULL if there's a problem (creating directory failed, - * etc.). + * etc.). This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_GetBasePath */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetPrefPath(const char *org, const char *app); +extern SDL_DECLSPEC_FREE char * SDLCALL SDL_GetPrefPath(const char *org, const char *app); /** * The type of the OS-provided default folder for a specific purpose. @@ -227,7 +227,7 @@ typedef enum SDL_Folder * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder); /* Abstract filesystem interface */ @@ -367,13 +367,13 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo * * \param count on return, will be set to the number of items in the returned * array. Can be NULL. * \returns an array of strings on success or NULL on failure; call - * SDL_GetError() for more information. + * SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * const * SDLCALL SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count); +extern SDL_DECLSPEC_FREE char ** SDLCALL SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/include/SDL3/SDL_gamepad.h b/include/SDL3/SDL_gamepad.h index 1011c9e5d..0358c76b5 100644 --- a/include/SDL3/SDL_gamepad.h +++ b/include/SDL3/SDL_gamepad.h @@ -392,25 +392,25 @@ extern SDL_DECLSPEC int SDLCALL SDL_ReloadGamepadMappings(void); * \param count a pointer filled in with the number of mappings returned, can * be NULL. * \returns an array of the mapping strings, NULL-terminated, or NULL on - * failure; call SDL_GetError() for more information. + * failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * const * SDLCALL SDL_GetGamepadMappings(int *count); +extern SDL_DECLSPEC_FREE char ** SDLCALL SDL_GetGamepadMappings(int *count); /** * Get the gamepad mapping string for a given GUID. * * \param guid a structure containing the GUID for which a mapping is desired. * \returns a mapping string or NULL on failure; call SDL_GetError() for more - * information. + * information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_GetJoystickGUIDForID * \sa SDL_GetJoystickGUID */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_GUID guid); +extern SDL_DECLSPEC_FREE char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_GUID guid); /** * Get the current mapping of a gamepad. @@ -419,7 +419,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_G * * \param gamepad the gamepad you want to get the current mapping for. * \returns a string that has the gamepad's mapping or NULL if no mapping is - * available; call SDL_GetError() for more information. + * available; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * @@ -428,7 +428,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_G * \sa SDL_GetGamepadMappingForGUID * \sa SDL_SetGamepadMapping */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadMapping(SDL_Gamepad *gamepad); +extern SDL_DECLSPEC_FREE char * SDLCALL SDL_GetGamepadMapping(SDL_Gamepad *gamepad); /** * Set the current mapping of a joystick or gamepad. @@ -465,14 +465,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasGamepad(void); * \param count a pointer filled in with the number of gamepads returned, may * be NULL. * \returns a 0 terminated array of joystick instance IDs or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_HasGamepad * \sa SDL_OpenGamepad */ -extern SDL_DECLSPEC_TEMP const SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); +extern SDL_DECLSPEC_FREE SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); /** * Check if the given joystick is supported by the gamepad interface. @@ -502,7 +502,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); * \sa SDL_GetGamepadName * \sa SDL_GetGamepads */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadNameForID(SDL_JoystickID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadNameForID(SDL_JoystickID instance_id); /** * Get the implementation dependent path of a gamepad. @@ -518,7 +518,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadNameForID(SDL_Joysti * \sa SDL_GetGamepadPath * \sa SDL_GetGamepads */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadPathForID(SDL_JoystickID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPathForID(SDL_JoystickID instance_id); /** * Get the player index of a gamepad. @@ -640,14 +640,14 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadTypeForID(SDL_Joys * This can be called before any gamepads are opened. * * \param instance_id the joystick instance ID. - * \returns the mapping string. Returns NULL if no mapping is available. + * \returns the mapping string. Returns NULL if no mapping is available. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_GetGamepads * \sa SDL_GetGamepadMapping */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadMappingForID(SDL_JoystickID instance_id); +extern SDL_DECLSPEC_FREE char * SDLCALL SDL_GetGamepadMappingForID(SDL_JoystickID instance_id); /** * Open a gamepad for use. @@ -745,7 +745,7 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad * * \sa SDL_GetGamepadNameForID */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *gamepad); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *gamepad); /** * Get the implementation-dependent path for an opened gamepad. @@ -759,7 +759,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *ga * * \sa SDL_GetGamepadPathForID */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadPath(SDL_Gamepad *gamepad); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPath(SDL_Gamepad *gamepad); /** * Get the type of an opened gamepad. @@ -880,7 +880,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *ga * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad); /** * Get the Steam Input handle of an opened gamepad, if available. @@ -995,11 +995,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadEventsEnabled(void); * \param gamepad a gamepad. * \param count a pointer filled in with the number of bindings returned. * \returns a NULL terminated array of pointers to bindings or NULL on - * failure; call SDL_GetError() for more information. + * failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const SDL_GamepadBinding * const * SDLCALL SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count); +extern SDL_DECLSPEC_FREE SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count); /** * Manually pump gamepad updates if not using the loop. @@ -1042,7 +1042,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeFromString(const c * * \sa SDL_GetGamepadTypeFromString */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadStringForType(SDL_GamepadType type); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForType(SDL_GamepadType type); /** * Convert a string into SDL_GamepadAxis enum. @@ -1078,7 +1078,7 @@ extern SDL_DECLSPEC SDL_GamepadAxis SDLCALL SDL_GetGamepadAxisFromString(const c * * \sa SDL_GetGamepadAxisFromString */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadStringForAxis(SDL_GamepadAxis axis); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForAxis(SDL_GamepadAxis axis); /** * Query whether a gamepad has a given axis. @@ -1151,7 +1151,7 @@ extern SDL_DECLSPEC SDL_GamepadButton SDLCALL SDL_GetGamepadButtonFromString(con * * \sa SDL_GetGamepadButtonFromString */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadStringForButton(SDL_GamepadButton button); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForButton(SDL_GamepadButton button); /** * Query whether a gamepad has a given button. @@ -1436,7 +1436,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseGamepad(SDL_Gamepad *gamepad); * * \sa SDL_GetGamepadAppleSFSymbolsNameForAxis */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); /** * Return the sfSymbolsName for a given axis on a gamepad on Apple platforms. @@ -1449,7 +1449,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameFo * * \sa SDL_GetGamepadAppleSFSymbolsNameForButton */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); /* Ends C function definitions when using C++ */ diff --git a/include/SDL3/SDL_guid.h b/include/SDL3/SDL_guid.h index df3f818fe..285b2376e 100644 --- a/include/SDL3/SDL_guid.h +++ b/include/SDL3/SDL_guid.h @@ -67,14 +67,14 @@ typedef struct SDL_GUID { * Get an ASCII string representation for a given SDL_GUID. * * \param guid the SDL_GUID you wish to convert to string. - * \returns the string representation of the GUID or NULL on failure; call - * SDL_GetError() for more information. + * \param pszGUID buffer in which to write the ASCII string. + * \param cbGUID the size of pszGUID, should be at least 33 bytes. * * \since This function is available since SDL 3.0.0. * * \sa SDL_StringToGUID */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GUIDToString(SDL_GUID guid); +extern SDL_DECLSPEC void SDLCALL SDL_GUIDToString(SDL_GUID guid, char *pszGUID, int cbGUID); /** * Convert a GUID string into a SDL_GUID structure. diff --git a/include/SDL3/SDL_haptic.h b/include/SDL3/SDL_haptic.h index bd94aebb2..f34ba15b2 100644 --- a/include/SDL3/SDL_haptic.h +++ b/include/SDL3/SDL_haptic.h @@ -45,6 +45,7 @@ * SDL_HapticID *haptics = SDL_GetHaptics(NULL); * if (haptics) { * haptic = SDL_OpenHaptic(haptics[0]); + * SDL_free(haptics); * } * if (haptic == NULL) * return -1; @@ -934,13 +935,13 @@ typedef Uint32 SDL_HapticID; * \param count a pointer filled in with the number of haptic devices * returned, may be NULL. * \returns a 0 terminated array of haptic device instance IDs or NULL on - * failure; call SDL_GetError() for more information. + * failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_OpenHaptic */ -extern SDL_DECLSPEC_TEMP const SDL_HapticID * SDLCALL SDL_GetHaptics(int *count); +extern SDL_DECLSPEC_FREE SDL_HapticID * SDLCALL SDL_GetHaptics(int *count); /** * Get the implementation dependent name of a haptic device. @@ -957,7 +958,7 @@ extern SDL_DECLSPEC_TEMP const SDL_HapticID * SDLCALL SDL_GetHaptics(int *count) * \sa SDL_GetHapticName * \sa SDL_OpenHaptic */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetHapticNameForID(SDL_HapticID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticNameForID(SDL_HapticID instance_id); /** * Open a haptic device for use. @@ -1019,7 +1020,7 @@ extern SDL_DECLSPEC SDL_HapticID SDLCALL SDL_GetHapticID(SDL_Haptic *haptic); * * \sa SDL_GetHapticNameForID */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetHapticName(SDL_Haptic *haptic); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticName(SDL_Haptic *haptic); /** * Query whether or not the current mouse has haptic capabilities. diff --git a/include/SDL3/SDL_hints.h b/include/SDL3/SDL_hints.h index 7914f3d56..51c629c4f 100644 --- a/include/SDL3/SDL_hints.h +++ b/include/SDL3/SDL_hints.h @@ -3880,7 +3880,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetHints(void); * \sa SDL_SetHint * \sa SDL_SetHintWithPriority */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetHint(const char *name); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetHint(const char *name); /** * Get the boolean value of a hint variable. diff --git a/include/SDL3/SDL_joystick.h b/include/SDL3/SDL_joystick.h index cda666421..20d610d85 100644 --- a/include/SDL3/SDL_joystick.h +++ b/include/SDL3/SDL_joystick.h @@ -204,14 +204,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasJoystick(void); * \param count a pointer filled in with the number of joysticks returned, may * be NULL. * \returns a 0 terminated array of joystick instance IDs or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_HasJoystick * \sa SDL_OpenJoystick */ -extern SDL_DECLSPEC_TEMP const SDL_JoystickID * SDLCALL SDL_GetJoysticks(int *count); +extern SDL_DECLSPEC_FREE SDL_JoystickID * SDLCALL SDL_GetJoysticks(int *count); /** * Get the implementation dependent name of a joystick. @@ -227,7 +227,7 @@ extern SDL_DECLSPEC_TEMP const SDL_JoystickID * SDLCALL SDL_GetJoysticks(int *co * \sa SDL_GetJoystickName * \sa SDL_GetJoysticks */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetJoystickNameForID(SDL_JoystickID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickNameForID(SDL_JoystickID instance_id); /** * Get the implementation dependent path of a joystick. @@ -243,7 +243,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetJoystickNameForID(SDL_Joyst * \sa SDL_GetJoystickPath * \sa SDL_GetJoysticks */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetJoystickPathForID(SDL_JoystickID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPathForID(SDL_JoystickID instance_id); /** * Get the player index of a joystick. @@ -661,7 +661,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joyst * * \sa SDL_GetJoystickNameForID */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetJoystickName(SDL_Joystick *joystick); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickName(SDL_Joystick *joystick); /** * Get the implementation dependent path of a joystick. @@ -674,7 +674,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetJoystickName(SDL_Joystick * * * \sa SDL_GetJoystickPathForID */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetJoystickPath(SDL_Joystick *joystick); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPath(SDL_Joystick *joystick); /** * Get the player index of an opened joystick. @@ -789,7 +789,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick * * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joystick); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joystick); /** * Get the type of an opened joystick. diff --git a/include/SDL3/SDL_keyboard.h b/include/SDL3/SDL_keyboard.h index b0d7ce679..3f48fc0ec 100644 --- a/include/SDL3/SDL_keyboard.h +++ b/include/SDL3/SDL_keyboard.h @@ -76,14 +76,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasKeyboard(void); * \param count a pointer filled in with the number of keyboards returned, may * be NULL. * \returns a 0 terminated array of keyboards instance IDs or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_GetKeyboardNameForID * \sa SDL_HasKeyboard */ -extern SDL_DECLSPEC_TEMP const SDL_KeyboardID * SDLCALL SDL_GetKeyboards(int *count); +extern SDL_DECLSPEC_FREE SDL_KeyboardID * SDLCALL SDL_GetKeyboards(int *count); /** * Get the name of a keyboard. @@ -98,7 +98,7 @@ extern SDL_DECLSPEC_TEMP const SDL_KeyboardID * SDLCALL SDL_GetKeyboards(int *co * * \sa SDL_GetKeyboards */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetKeyboardNameForID(SDL_KeyboardID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyboardNameForID(SDL_KeyboardID instance_id); /** * Query the window which currently has keyboard focus. @@ -297,7 +297,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, const * \sa SDL_GetScancodeFromName * \sa SDL_SetScancodeName */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetScancodeName(SDL_Scancode scancode); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetScancodeName(SDL_Scancode scancode); /** * Get a scancode from a human-readable name. @@ -331,7 +331,7 @@ extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *nam * \sa SDL_GetKeyFromScancode * \sa SDL_GetScancodeFromKey */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetKeyName(SDL_Keycode key); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyName(SDL_Keycode key); /** * Get a key code from a human-readable name. diff --git a/include/SDL3/SDL_locale.h b/include/SDL3/SDL_locale.h index 40fab59e8..66479ceff 100644 --- a/include/SDL3/SDL_locale.h +++ b/include/SDL3/SDL_locale.h @@ -92,11 +92,11 @@ typedef struct SDL_Locale * \param count a pointer filled in with the number of locales returned, may * be NULL. * \returns a NULL terminated array of locale pointers, or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const SDL_Locale * const * SDLCALL SDL_GetPreferredLocales(int *count); +extern SDL_DECLSPEC_FREE SDL_Locale ** SDLCALL SDL_GetPreferredLocales(int *count); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/include/SDL3/SDL_mouse.h b/include/SDL3/SDL_mouse.h index 0598ebca8..82ca7be66 100644 --- a/include/SDL3/SDL_mouse.h +++ b/include/SDL3/SDL_mouse.h @@ -138,14 +138,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasMouse(void); * \param count a pointer filled in with the number of mice returned, may be * NULL. * \returns a 0 terminated array of mouse instance IDs or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_GetMouseNameForID * \sa SDL_HasMouse */ -extern SDL_DECLSPEC_TEMP const SDL_MouseID * SDLCALL SDL_GetMice(int *count); +extern SDL_DECLSPEC_FREE SDL_MouseID * SDLCALL SDL_GetMice(int *count); /** * Get the name of a mouse. @@ -160,7 +160,7 @@ extern SDL_DECLSPEC_TEMP const SDL_MouseID * SDLCALL SDL_GetMice(int *count); * * \sa SDL_GetMice */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetMouseNameForID(SDL_MouseID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetMouseNameForID(SDL_MouseID instance_id); /** * Get the window which currently has mouse focus. diff --git a/include/SDL3/SDL_pen.h b/include/SDL3/SDL_pen.h index 7d44bb597..c02c0081f 100644 --- a/include/SDL3/SDL_pen.h +++ b/include/SDL3/SDL_pen.h @@ -235,7 +235,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PenConnected(SDL_PenID instance_id); * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetPenName(SDL_PenID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetPenName(SDL_PenID instance_id); /** * Pen capabilities, as reported by SDL_GetPenCapabilities() diff --git a/include/SDL3/SDL_properties.h b/include/SDL3/SDL_properties.h index 9450da714..b3e061adc 100644 --- a/include/SDL3/SDL_properties.h +++ b/include/SDL3/SDL_properties.h @@ -384,7 +384,12 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetPointerProperty(SDL_PropertiesID props * \returns the value of the property, or `default_value` if it is not set or * not a string property. * - * \threadsafety It is safe to call this function from any thread. + * \threadsafety It is safe to call this function from any thread, although + * the data returned is not protected and could potentially be + * freed if you call SDL_SetStringProperty() or + * SDL_ClearProperty() on these properties from another thread. + * If you need to avoid this, use SDL_LockProperties() and + * SDL_UnlockProperties(). * * \since This function is available since SDL 3.0.0. * @@ -392,7 +397,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetPointerProperty(SDL_PropertiesID props * \sa SDL_HasProperty * \sa SDL_SetStringProperty */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetStringProperty(SDL_PropertiesID props, const char *name, const char *default_value); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetStringProperty(SDL_PropertiesID props, const char *name, const char *default_value); /** * Get a number property from a group of properties. diff --git a/include/SDL3/SDL_render.h b/include/SDL3/SDL_render.h index df6b8b4c5..855247c8f 100644 --- a/include/SDL3/SDL_render.h +++ b/include/SDL3/SDL_render.h @@ -163,7 +163,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); * * \sa SDL_GetNumRenderDrivers */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetRenderDriver(int index); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetRenderDriver(int index); /** * Create a window and default renderer. @@ -331,7 +331,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetRenderWindow(SDL_Renderer *rende * \sa SDL_CreateRenderer * \sa SDL_CreateRendererWithProperties */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetRendererName(SDL_Renderer *renderer); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetRendererName(SDL_Renderer *renderer); /** * Get the properties associated with a renderer. diff --git a/include/SDL3/SDL_sensor.h b/include/SDL3/SDL_sensor.h index c0ae50487..fdfcb2175 100644 --- a/include/SDL3/SDL_sensor.h +++ b/include/SDL3/SDL_sensor.h @@ -149,11 +149,11 @@ typedef enum SDL_SensorType * \param count a pointer filled in with the number of sensors returned, may * be NULL. * \returns a 0 terminated array of sensor instance IDs or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC const SDL_SensorID * SDLCALL SDL_GetSensors(int *count); +extern SDL_DECLSPEC SDL_SensorID * SDLCALL SDL_GetSensors(int *count); /** * Get the implementation dependent name of a sensor. @@ -165,7 +165,7 @@ extern SDL_DECLSPEC const SDL_SensorID * SDLCALL SDL_GetSensors(int *count); * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetSensorNameForID(SDL_SensorID instance_id); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorNameForID(SDL_SensorID instance_id); /** * Get the type of a sensor. @@ -235,7 +235,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSensorProperties(SDL_Sensor * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetSensorName(SDL_Sensor *sensor); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorName(SDL_Sensor *sensor); /** * Get the type of a sensor. diff --git a/include/SDL3/SDL_stdinc.h b/include/SDL3/SDL_stdinc.h index 1b157786a..83296b257 100644 --- a/include/SDL3/SDL_stdinc.h +++ b/include/SDL3/SDL_stdinc.h @@ -527,9 +527,9 @@ extern "C" { #define SDL_stack_free(data) SDL_free(data) #endif -extern SDL_DECLSPEC SDL_MALLOC void * SDLCALL SDL_malloc(size_t size); -extern SDL_DECLSPEC SDL_MALLOC SDL_ALLOC_SIZE2(1, 2) void * SDLCALL SDL_calloc(size_t nmemb, size_t size); -extern SDL_DECLSPEC SDL_ALLOC_SIZE(2) void * SDLCALL SDL_realloc(void *mem, size_t size); +extern SDL_DECLSPEC_FREE SDL_MALLOC void * SDLCALL SDL_malloc(size_t size); +extern SDL_DECLSPEC_FREE SDL_MALLOC SDL_ALLOC_SIZE2(1, 2) void * SDLCALL SDL_calloc(size_t nmemb, size_t size); +extern SDL_DECLSPEC_FREE SDL_ALLOC_SIZE(2) void * SDLCALL SDL_realloc(void *mem, size_t size); extern SDL_DECLSPEC void SDLCALL SDL_free(void *mem); typedef void *(SDLCALL *SDL_malloc_func)(size_t size); diff --git a/include/SDL3/SDL_storage.h b/include/SDL3/SDL_storage.h index bd78da3f6..fc669a2a3 100644 --- a/include/SDL3/SDL_storage.h +++ b/include/SDL3/SDL_storage.h @@ -410,14 +410,14 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetStorageSpaceRemaining(SDL_Storage *sto * array. Can be NULL. * \returns an array of strings on success or NULL on failure; call * SDL_GetError() for more information. The caller should pass the - * returned pointer to SDL_free when done with it. + * returned pointer to SDL_free when done with it. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \threadsafety It is safe to call this function from any thread, assuming * the `storage` object is thread-safe. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * const * SDLCALL SDL_GlobStorageDirectory(SDL_Storage *storage, const char *path, const char *pattern, SDL_GlobFlags flags, int *count); +extern SDL_DECLSPEC_FREE char ** SDLCALL SDL_GlobStorageDirectory(SDL_Storage *storage, const char *path, const char *pattern, SDL_GlobFlags flags, int *count); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/include/SDL3/SDL_system.h b/include/SDL3/SDL_system.h index a7c1238af..9e79e7940 100644 --- a/include/SDL3/SDL_system.h +++ b/include/SDL3/SDL_system.h @@ -418,7 +418,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); * * \sa SDL_GetAndroidExternalStorageState */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetAndroidInternalStoragePath(void); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidInternalStoragePath(void); /** * Get the current state of external storage for this Android application. @@ -457,7 +457,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAndroidExternalStorageState(void); * * \sa SDL_GetAndroidExternalStorageState */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetAndroidExternalStoragePath(void); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidExternalStoragePath(void); /** * Get the path used for caching data for this Android application. @@ -476,7 +476,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetAndroidExternalStoragePath( * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetAndroidCachePath(void); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidCachePath(void); typedef void (SDLCALL *SDL_RequestAndroidPermissionCallback)(void *userdata, const char *permission, SDL_bool granted); @@ -630,7 +630,7 @@ typedef enum SDL_WinRT_DeviceFamily * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetWinRTFSPath(SDL_WinRT_Path pathType); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetWinRTFSPath(SDL_WinRT_Path pathType); /** * Detects the device family of WinRT platform at runtime. diff --git a/include/SDL3/SDL_thread.h b/include/SDL3/SDL_thread.h index fb98fd735..f6ec760c4 100644 --- a/include/SDL3/SDL_thread.h +++ b/include/SDL3/SDL_thread.h @@ -336,7 +336,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(S * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); /** * Get the thread identifier for the current thread. diff --git a/include/SDL3/SDL_touch.h b/include/SDL3/SDL_touch.h index 6c9f6ccef..5c91152b2 100644 --- a/include/SDL3/SDL_touch.h +++ b/include/SDL3/SDL_touch.h @@ -86,11 +86,11 @@ typedef struct SDL_Finger * \param count a pointer filled in with the number of devices returned, may * be NULL. * \returns a 0 terminated array of touch device IDs or NULL on failure; call - * SDL_GetError() for more information. + * SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *count); +extern SDL_DECLSPEC_FREE SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *count); /** * Get the touch device name as reported from the driver. @@ -101,7 +101,7 @@ extern SDL_DECLSPEC_TEMP const SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *co * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetTouchDeviceName(SDL_TouchID touchID); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetTouchDeviceName(SDL_TouchID touchID); /** * Get the type of the given touch device. @@ -120,11 +120,11 @@ extern SDL_DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_Touch * \param count a pointer filled in with the number of fingers returned, can * be NULL. * \returns a NULL terminated array of SDL_Finger pointers or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const SDL_Finger * const * SDLCALL SDL_GetTouchFingers(SDL_TouchID touchID, int *count); +extern SDL_DECLSPEC_FREE SDL_Finger ** SDLCALL SDL_GetTouchFingers(SDL_TouchID touchID, int *count); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/include/SDL3/SDL_video.h b/include/SDL3/SDL_video.h index 74a0401ee..18ce21062 100644 --- a/include/SDL3/SDL_video.h +++ b/include/SDL3/SDL_video.h @@ -356,7 +356,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); * * \sa SDL_GetNumVideoDrivers */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetVideoDriver(int index); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetVideoDriver(int index); /** * Get the name of the currently initialized video driver. @@ -373,7 +373,7 @@ extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetVideoDriver(int index); * \sa SDL_GetNumVideoDrivers * \sa SDL_GetVideoDriver */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetCurrentVideoDriver(void); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentVideoDriver(void); /** * Get the current system theme. @@ -390,11 +390,11 @@ extern SDL_DECLSPEC SDL_SystemTheme SDLCALL SDL_GetSystemTheme(void); * \param count a pointer filled in with the number of displays returned, may * be NULL. * \returns a 0 terminated array of display instance IDs or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const SDL_DisplayID * SDLCALL SDL_GetDisplays(int *count); +extern SDL_DECLSPEC_FREE SDL_DisplayID * SDLCALL SDL_GetDisplays(int *count); /** * Return the primary display. @@ -448,7 +448,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_Displa * * \sa SDL_GetDisplays */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetDisplayName(SDL_DisplayID displayID); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetDisplayName(SDL_DisplayID displayID); /** * Get the desktop area represented by a display. @@ -551,13 +551,13 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetDisplayContentScale(SDL_DisplayID displ * \param count a pointer filled in with the number of display modes returned, * may be NULL. * \returns a NULL terminated array of display mode pointers or NULL on - * failure; call SDL_GetError() for more information. + * failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. * * \sa SDL_GetDisplays */ -extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * const * SDLCALL SDL_GetFullscreenDisplayModes(SDL_DisplayID displayID, int *count); +extern SDL_DECLSPEC_FREE SDL_DisplayMode ** SDLCALL SDL_GetFullscreenDisplayModes(SDL_DisplayID displayID, int *count); /** * Get the closest match to the requested display mode. @@ -576,16 +576,17 @@ extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * const * SDLCALL SDL_GetFullscre * for the desktop refresh rate. * \param include_high_density_modes boolean to include high density modes in * the search. - * \returns a pointer to the closest display mode equal to or larger than the - * desired mode, or NULL on failure; call SDL_GetError() for more - * information. + * \param mode a pointer filled in with the closest display mode equal to or larger than the + * desired mode. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. * * \since This function is available since SDL 3.0.0. * * \sa SDL_GetDisplays * \sa SDL_GetFullscreenDisplayModes */ -extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, SDL_bool include_high_density_modes); +extern SDL_DECLSPEC int SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, SDL_bool include_high_density_modes, SDL_DisplayMode *mode); /** * Get information about the desktop's display mode. @@ -604,7 +605,7 @@ extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * SDLCALL SDL_GetClosestFullscree * \sa SDL_GetCurrentDisplayMode * \sa SDL_GetDisplays */ -extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * SDLCALL SDL_GetDesktopDisplayMode(SDL_DisplayID displayID); +extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetDesktopDisplayMode(SDL_DisplayID displayID); /** * Get information about the current display mode. @@ -623,7 +624,7 @@ extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * SDLCALL SDL_GetDesktopDisplayMo * \sa SDL_GetDesktopDisplayMode * \sa SDL_GetDisplays */ -extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * SDLCALL SDL_GetCurrentDisplayMode(SDL_DisplayID displayID); +extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetCurrentDisplayMode(SDL_DisplayID displayID); /** * Get the display containing a point. @@ -753,7 +754,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetWindowFullscreenMode(SDL_Window *window, * \sa SDL_SetWindowFullscreenMode * \sa SDL_SetWindowFullscreen */ -extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * SDLCALL SDL_GetWindowFullscreenMode(SDL_Window *window); +extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetWindowFullscreenMode(SDL_Window *window); /** * Get the raw ICC profile data for the screen the window is currently on. @@ -761,11 +762,11 @@ extern SDL_DECLSPEC_TEMP const SDL_DisplayMode * SDLCALL SDL_GetWindowFullscreen * \param window the window to query. * \param size the size of the ICC profile. * \returns the raw ICC profile data on success or NULL on failure; call - * SDL_GetError() for more information. + * SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP const void * SDLCALL SDL_GetWindowICCProfile(SDL_Window *window, size_t *size); +extern SDL_DECLSPEC_FREE void * SDLCALL SDL_GetWindowICCProfile(SDL_Window *window, size_t *size); /** * Get the pixel format associated with the window. @@ -785,11 +786,11 @@ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetWindowPixelFormat(SDL_Window * \param count a pointer filled in with the number of windows returned, may * be NULL. * \returns a NULL terminated array of SDL_Window pointers or NULL on failure; - * call SDL_GetError() for more information. + * call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed. * * \since This function is available since SDL 3.0.0. */ -extern SDL_DECLSPEC_TEMP SDL_Window * const * SDLCALL SDL_GetWindows(int *count); +extern SDL_DECLSPEC_FREE SDL_Window ** SDLCALL SDL_GetWindows(int *count); /** * Create a window with the specified dimensions and flags. @@ -1322,7 +1323,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetWindowTitle(SDL_Window *window, const cha * * \sa SDL_SetWindowTitle */ -extern SDL_DECLSPEC_TEMP const char * SDLCALL SDL_GetWindowTitle(SDL_Window *window); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetWindowTitle(SDL_Window *window); /** * Set the icon for a window. diff --git a/src/SDL_guid.c b/src/SDL_guid.c index d3a3c0b04..cae9683a3 100644 --- a/src/SDL_guid.c +++ b/src/SDL_guid.c @@ -21,21 +21,24 @@ #include "SDL_internal.h" /* convert the guid to a printable string */ -const char *SDL_GUIDToString(SDL_GUID guid) +void SDL_GUIDToString(SDL_GUID guid, char *pszGUID, int cbGUID) { static const char k_rgchHexToASCII[] = "0123456789abcdef"; int i; - char string[sizeof(guid) * 2 + 1]; - for (i = 0; i < sizeof(guid.data); ++i) { + if ((!pszGUID) || (cbGUID <= 0)) { + return; + } + + for (i = 0; i < sizeof(guid.data) && i < (cbGUID - 1) / 2; i++) { + /* each input byte writes 2 ascii chars, and might write a null byte. */ + /* If we don't have room for next input byte, stop */ unsigned char c = guid.data[i]; - string[i * 2 + 0] = k_rgchHexToASCII[c >> 4]; - string[i * 2 + 1] = k_rgchHexToASCII[c & 0x0F]; + *pszGUID++ = k_rgchHexToASCII[c >> 4]; + *pszGUID++ = k_rgchHexToASCII[c & 0x0F]; } - string[sizeof(string) -1] = '\0'; - - return SDL_CreateTemporaryString(string); + *pszGUID = '\0'; } /*----------------------------------------------------------------------------- diff --git a/src/SDL_hints.c b/src/SDL_hints.c index 905264523..1abbeb930 100644 --- a/src/SDL_hints.c +++ b/src/SDL_hints.c @@ -74,7 +74,7 @@ SDL_bool SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPr entry->callback(entry->userdata, name, old_value, value); entry = next; } - SDL_FreeLater(old_value); + SDL_free(old_value); } hint->priority = priority; return SDL_TRUE; @@ -118,7 +118,7 @@ SDL_bool SDL_ResetHint(const char *name) entry = next; } } - SDL_FreeLater(hint->value); + SDL_free(hint->value); hint->value = NULL; hint->priority = SDL_HINT_DEFAULT; return SDL_TRUE; @@ -145,7 +145,7 @@ void SDL_ResetHints(void) entry = next; } } - SDL_FreeLater(hint->value); + SDL_free(hint->value); hint->value = NULL; hint->priority = SDL_HINT_DEFAULT; } @@ -169,7 +169,7 @@ const char *SDL_GetHint(const char *name) for (hint = SDL_hints; hint; hint = hint->next) { if (SDL_strcmp(name, hint->name) == 0) { if (!env || hint->priority == SDL_HINT_OVERRIDE) { - return hint->value; + return SDL_GetPersistentString(hint->value); } break; } @@ -303,7 +303,7 @@ void SDL_ClearHints(void) SDL_hints = hint->next; SDL_free(hint->name); - SDL_FreeLater(hint->value); + SDL_free(hint->value); for (entry = hint->callbacks; entry;) { SDL_HintWatch *freeable = entry; entry = entry->next; diff --git a/src/SDL_internal.h b/src/SDL_internal.h index 4909e5524..1e77ae0e0 100644 --- a/src/SDL_internal.h +++ b/src/SDL_internal.h @@ -279,28 +279,23 @@ #define SDL_MAIN_NOIMPL /* don't drag in header-only implementation of SDL_main */ #include -#include "SDL_utils_c.h" - -/* The internal implementations of these functions have up to nanosecond precision. - We can expose these functions as part of the API if we want to later. -*/ /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus extern "C" { #endif +#include "SDL_utils_c.h" + /* Do any initialization that needs to happen before threads are started */ extern void SDL_InitMainThread(void); +/* The internal implementations of these functions have up to nanosecond precision. + We can expose these functions as part of the API if we want to later. +*/ extern int SDLCALL SDL_WaitSemaphoreTimeoutNS(SDL_Semaphore *sem, Sint64 timeoutNS); extern int SDLCALL SDL_WaitConditionTimeoutNS(SDL_Condition *cond, SDL_Mutex *mutex, Sint64 timeoutNS); extern SDL_bool SDLCALL SDL_WaitEventTimeoutNS(SDL_Event *event, Sint64 timeoutNS); -extern const char *SDL_CreateTemporaryString(const char *string); - -/* Add memory to the temporary memory pool, to be freed automatically later */ -extern void *SDL_FreeLater(void *memory); - /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/src/SDL_properties.c b/src/SDL_properties.c index 164b4ddc6..323bb91dc 100644 --- a/src/SDL_properties.c +++ b/src/SDL_properties.c @@ -65,12 +65,12 @@ static void SDL_FreePropertyWithCleanup(const void *key, const void *value, void } break; case SDL_PROPERTY_TYPE_STRING: - SDL_FreeLater(property->value.string_value); // SDL_GetStringProperty() returns this pointer + SDL_free(property->value.string_value); break; default: break; } - SDL_FreeLater(property->string_storage); // this pointer might be given to the app by SDL_GetStringProperty. + SDL_free(property->string_storage); } SDL_free((void *)key); SDL_free((void *)value); diff --git a/src/SDL_utils.c b/src/SDL_utils.c index 26a25bec4..aaf721031 100644 --- a/src/SDL_utils.c +++ b/src/SDL_utils.c @@ -320,3 +320,48 @@ int SDL_URIToLocal(const char *src, char *dst) } return -1; } + +// This is a set of per-thread persistent strings that we can return from the SDL API. +// This is used for short strings that might persist past the lifetime of the object +// they are related to. + +static SDL_TLSID SDL_string_storage; + +static void SDL_FreePersistentStrings( void *value ) +{ + SDL_HashTable *strings = (SDL_HashTable *)value; + SDL_DestroyHashTable(strings); +} + +const char *SDL_GetPersistentString(const char *string) +{ + if (!string) { + return NULL; + } + if (!*string) { + return ""; + } + + SDL_HashTable *strings = (SDL_HashTable *)SDL_GetTLS(&SDL_string_storage); + if (!strings) { + strings = SDL_CreateHashTable(NULL, 32, SDL_HashString, SDL_KeyMatchString, SDL_NukeFreeValue, SDL_FALSE); + if (!strings) { + return NULL; + } + + SDL_SetTLS(&SDL_string_storage, strings, SDL_FreePersistentStrings); + } + + const void *retval; + if (!SDL_FindInHashTable(strings, string, &retval)) { + char *new_string = SDL_strdup(string); + if (!new_string) { + return NULL; + } + + // If the hash table insert fails, at least we can return the string we allocated + retval = new_string; + SDL_InsertIntoHashTable(strings, string, retval); + } + return (const char *)retval; +} diff --git a/src/SDL_utils_c.h b/src/SDL_utils_c.h index 5e41da3e7..36375e6a1 100644 --- a/src/SDL_utils_c.h +++ b/src/SDL_utils_c.h @@ -65,4 +65,6 @@ extern void SDL_SetObjectValid(void *object, SDL_ObjectType type, SDL_bool valid extern SDL_bool SDL_ObjectValid(void *object, SDL_ObjectType type); extern void SDL_SetObjectsInvalid(void); +extern const char *SDL_GetPersistentString(const char *string); + #endif /* SDL_utils_h_ */ diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index d9c609315..2394865f2 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -134,14 +134,14 @@ int SDL_GetNumAudioDrivers(void) const char *SDL_GetAudioDriver(int index) { if (index >= 0 && index < SDL_GetNumAudioDrivers()) { - return SDL_CreateTemporaryString(deduped_bootstrap[index]->name); + return deduped_bootstrap[index]->name; } return NULL; } const char *SDL_GetCurrentAudioDriver(void) { - return SDL_CreateTemporaryString(current_audio.name); + return current_audio.name; } static int GetDefaultSampleFramesFromFreq(const int freq) @@ -1336,7 +1336,7 @@ static int SDLCALL RecordingAudioThread(void *devicep) // thread entry point } -static const SDL_AudioDeviceID *GetAudioDevices(int *count, SDL_bool recording) +static SDL_AudioDeviceID *GetAudioDevices(int *count, SDL_bool recording) { SDL_AudioDeviceID *retval = NULL; int num_devices = 0; @@ -1379,15 +1379,15 @@ static const SDL_AudioDeviceID *GetAudioDevices(int *count, SDL_bool recording) *count = 0; } } - return SDL_FreeLater(retval); + return retval; } -const SDL_AudioDeviceID *SDL_GetAudioPlaybackDevices(int *count) +SDL_AudioDeviceID *SDL_GetAudioPlaybackDevices(int *count) { return GetAudioDevices(count, SDL_FALSE); } -const SDL_AudioDeviceID *SDL_GetAudioRecordingDevices(int *count) +SDL_AudioDeviceID *SDL_GetAudioRecordingDevices(int *count) { return GetAudioDevices(count, SDL_TRUE); } @@ -1438,7 +1438,7 @@ const char *SDL_GetAudioDeviceName(SDL_AudioDeviceID devid) const char *retval = NULL; SDL_AudioDevice *device = ObtainPhysicalAudioDevice(devid); if (device) { - retval = SDL_CreateTemporaryString(device->name); + retval = SDL_GetPersistentString(device->name); } ReleaseAudioDevice(device); @@ -1465,14 +1465,14 @@ int SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid, SDL_AudioSpec *spec, int * return retval; } -const int *SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID devid, int *count) +int *SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID devid, int *count) { - const int *retval = NULL; + int *retval = NULL; int channels = 0; SDL_AudioDevice *device = ObtainPhysicalAudioDeviceDefaultAllowed(devid); if (device) { channels = device->spec.channels; - retval = SDL_FreeLater(SDL_ChannelMapDup(device->chmap, channels)); + retval = SDL_ChannelMapDup(device->chmap, channels); } ReleaseAudioDevice(device); diff --git a/src/audio/SDL_audiocvt.c b/src/audio/SDL_audiocvt.c index d785b14dc..5f72fdc04 100644 --- a/src/audio/SDL_audiocvt.c +++ b/src/audio/SDL_audiocvt.c @@ -636,14 +636,14 @@ int SDL_SetAudioStreamOutputChannelMap(SDL_AudioStream *stream, const int *chmap return SetAudioStreamChannelMap(stream, &stream->dst_spec, &stream->dst_chmap, chmap, channels, SDL_FALSE); } -const int *SDL_GetAudioStreamInputChannelMap(SDL_AudioStream *stream, int *count) +int *SDL_GetAudioStreamInputChannelMap(SDL_AudioStream *stream, int *count) { - const int *retval = NULL; + int *retval = NULL; int channels = 0; if (stream) { SDL_LockMutex(stream->lock); channels = stream->src_spec.channels; - retval = SDL_FreeLater(SDL_ChannelMapDup(stream->src_chmap, channels)); + retval = SDL_ChannelMapDup(stream->src_chmap, channels); SDL_UnlockMutex(stream->lock); } @@ -654,14 +654,14 @@ const int *SDL_GetAudioStreamInputChannelMap(SDL_AudioStream *stream, int *count return retval; } -const int *SDL_GetAudioStreamOutputChannelMap(SDL_AudioStream *stream, int *count) +int *SDL_GetAudioStreamOutputChannelMap(SDL_AudioStream *stream, int *count) { - const int *retval = NULL; + int *retval = NULL; int channels = 0; if (stream) { SDL_LockMutex(stream->lock); channels = stream->dst_spec.channels; - retval = SDL_FreeLater(SDL_ChannelMapDup(stream->dst_chmap, channels)); + retval = SDL_ChannelMapDup(stream->dst_chmap, channels); SDL_UnlockMutex(stream->lock); } diff --git a/src/camera/SDL_camera.c b/src/camera/SDL_camera.c index 0c5e835f5..160baebcc 100644 --- a/src/camera/SDL_camera.c +++ b/src/camera/SDL_camera.c @@ -66,14 +66,14 @@ int SDL_GetNumCameraDrivers(void) const char *SDL_GetCameraDriver(int index) { if (index >= 0 && index < SDL_GetNumCameraDrivers()) { - return SDL_CreateTemporaryString(bootstrap[index]->name); + return bootstrap[index]->name; } return NULL; } const char *SDL_GetCurrentCameraDriver(void) { - return SDL_CreateTemporaryString(camera_driver.name); + return camera_driver.name; } char *SDL_GetCameraThreadName(SDL_Camera *device, char *buf, size_t buflen) @@ -675,7 +675,7 @@ const char *SDL_GetCameraName(SDL_CameraID instance_id) const char *retval = NULL; SDL_Camera *device = ObtainPhysicalCamera(instance_id); if (device) { - retval = SDL_CreateTemporaryString(device->name); + retval = SDL_GetPersistentString(device->name); ReleaseCamera(device); } return retval; @@ -693,7 +693,7 @@ SDL_CameraPosition SDL_GetCameraPosition(SDL_CameraID instance_id) } -const SDL_CameraID *SDL_GetCameras(int *count) +SDL_CameraID *SDL_GetCameras(int *count) { int dummy_count; if (!count) { @@ -729,10 +729,10 @@ const SDL_CameraID *SDL_GetCameras(int *count) *count = num_devices; - return SDL_FreeLater(retval); + return retval; } -const SDL_CameraSpec * const *SDL_GetCameraSupportedFormats(SDL_CameraID instance_id, int *count) +SDL_CameraSpec **SDL_GetCameraSupportedFormats(SDL_CameraID instance_id, int *count) { if (count) { *count = 0; @@ -761,7 +761,7 @@ const SDL_CameraSpec * const *SDL_GetCameraSupportedFormats(SDL_CameraID instanc ReleaseCamera(device); - return SDL_FreeLater(retval); + return retval; } diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 1e42cd00f..682428935 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -2584,7 +2584,7 @@ const char *SDL_GetAndroidInternalStoragePath(void) LocalReferenceHolder_Cleanup(&refs); } - return SDL_CreateTemporaryString(s_AndroidInternalFilesPath); + return s_AndroidInternalFilesPath; } Uint32 SDL_GetAndroidExternalStorageState(void) @@ -2669,7 +2669,7 @@ const char *SDL_GetAndroidExternalStoragePath(void) LocalReferenceHolder_Cleanup(&refs); } - return SDL_CreateTemporaryString(s_AndroidExternalFilesPath); + return s_AndroidExternalFilesPath; } const char *SDL_GetAndroidCachePath(void) @@ -2715,7 +2715,7 @@ const char *SDL_GetAndroidCachePath(void) LocalReferenceHolder_Cleanup(&refs); } - return SDL_CreateTemporaryString(s_AndroidCachePath); + return s_AndroidCachePath; } int SDL_ShowAndroidToast(const char *message, int duration, int gravity, int xOffset, int yOffset) diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 0ea498c3e..b2fdd503f 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -192,7 +192,7 @@ SDL_DYNAPI_PROC(int,SDL_GL_SetAttribute,(SDL_GLattr a, int b),(a,b),return) SDL_DYNAPI_PROC(int,SDL_GL_SetSwapInterval,(int a),(a),return) SDL_DYNAPI_PROC(int,SDL_GL_SwapWindow,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(void,SDL_GL_UnloadLibrary,(void),(),) -SDL_DYNAPI_PROC(const char *,SDL_GUIDToString,(SDL_GUID a),(a),return) +SDL_DYNAPI_PROC(void,SDL_GUIDToString,(SDL_GUID a, char *b, int c),(a,b,c),) SDL_DYNAPI_PROC(SDL_bool,SDL_GamepadConnected,(SDL_Gamepad *a),(a),return) SDL_DYNAPI_PROC(SDL_bool,SDL_GamepadEventsEnabled,(void),(),return) SDL_DYNAPI_PROC(SDL_bool,SDL_GamepadHasAxis,(SDL_Gamepad *a, SDL_GamepadAxis b),(a,b),return) @@ -208,21 +208,21 @@ SDL_DYNAPI_PROC(void*,SDL_GetAndroidJNIEnv,(void),(),return) SDL_DYNAPI_PROC(int,SDL_GetAndroidSDKVersion,(void),(),return) SDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetAssertionHandler,(void **a),(a),return) SDL_DYNAPI_PROC(const SDL_AssertData*,SDL_GetAssertionReport,(void),(),return) -SDL_DYNAPI_PROC(const int*,SDL_GetAudioDeviceChannelMap,(SDL_AudioDeviceID a, int *b),(a,b),return) +SDL_DYNAPI_PROC(int*,SDL_GetAudioDeviceChannelMap,(SDL_AudioDeviceID a, int *b),(a,b),return) SDL_DYNAPI_PROC(int,SDL_GetAudioDeviceFormat,(SDL_AudioDeviceID a, SDL_AudioSpec *b, int *c),(a,b,c),return) SDL_DYNAPI_PROC(float,SDL_GetAudioDeviceGain,(SDL_AudioDeviceID a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetAudioDeviceName,(SDL_AudioDeviceID a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetAudioDriver,(int a),(a),return) -SDL_DYNAPI_PROC(const SDL_AudioDeviceID*,SDL_GetAudioPlaybackDevices,(int *a),(a),return) -SDL_DYNAPI_PROC(const SDL_AudioDeviceID*,SDL_GetAudioRecordingDevices,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_AudioDeviceID*,SDL_GetAudioPlaybackDevices,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_AudioDeviceID*,SDL_GetAudioRecordingDevices,(int *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetAudioStreamAvailable,(SDL_AudioStream *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetAudioStreamData,(SDL_AudioStream *a, void *b, int c),(a,b,c),return) SDL_DYNAPI_PROC(SDL_AudioDeviceID,SDL_GetAudioStreamDevice,(SDL_AudioStream *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetAudioStreamFormat,(SDL_AudioStream *a, SDL_AudioSpec *b, SDL_AudioSpec *c),(a,b,c),return) SDL_DYNAPI_PROC(float,SDL_GetAudioStreamFrequencyRatio,(SDL_AudioStream *a),(a),return) SDL_DYNAPI_PROC(float,SDL_GetAudioStreamGain,(SDL_AudioStream *a),(a),return) -SDL_DYNAPI_PROC(const int*,SDL_GetAudioStreamInputChannelMap,(SDL_AudioStream *a, int *b),(a,b),return) -SDL_DYNAPI_PROC(const int*,SDL_GetAudioStreamOutputChannelMap,(SDL_AudioStream *a, int *b),(a,b),return) +SDL_DYNAPI_PROC(int*,SDL_GetAudioStreamInputChannelMap,(SDL_AudioStream *a, int *b),(a,b),return) +SDL_DYNAPI_PROC(int*,SDL_GetAudioStreamOutputChannelMap,(SDL_AudioStream *a, int *b),(a,b),return) SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetAudioStreamProperties,(SDL_AudioStream *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetAudioStreamQueued,(SDL_AudioStream *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetBasePath,(void),(),return) @@ -236,11 +236,11 @@ SDL_DYNAPI_PROC(const char*,SDL_GetCameraName,(SDL_CameraID a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetCameraPermissionState,(SDL_Camera *a),(a),return) SDL_DYNAPI_PROC(SDL_CameraPosition,SDL_GetCameraPosition,(SDL_CameraID a),(a),return) SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetCameraProperties,(SDL_Camera *a),(a),return) -SDL_DYNAPI_PROC(const SDL_CameraSpec* const*,SDL_GetCameraSupportedFormats,(SDL_CameraID a, int *b),(a,b),return) -SDL_DYNAPI_PROC(const SDL_CameraID*,SDL_GetCameras,(int *a),(a),return) -SDL_DYNAPI_PROC(const void*,SDL_GetClipboardData,(const char *a, size_t *b),(a,b),return) -SDL_DYNAPI_PROC(const char*,SDL_GetClipboardText,(void),(),return) -SDL_DYNAPI_PROC(const SDL_DisplayMode*,SDL_GetClosestFullscreenDisplayMode,(SDL_DisplayID a, int b, int c, float d, SDL_bool e),(a,b,c,d,e),return) +SDL_DYNAPI_PROC(SDL_CameraSpec**,SDL_GetCameraSupportedFormats,(SDL_CameraID a, int *b),(a,b),return) +SDL_DYNAPI_PROC(SDL_CameraID*,SDL_GetCameras,(int *a),(a),return) +SDL_DYNAPI_PROC(void*,SDL_GetClipboardData,(const char *a, size_t *b),(a,b),return) +SDL_DYNAPI_PROC(char*,SDL_GetClipboardText,(void),(),return) +SDL_DYNAPI_PROC(int,SDL_GetClosestFullscreenDisplayMode,(SDL_DisplayID a, int b, int c, float d, SDL_bool e, SDL_DisplayMode *f),(a,b,c,d,e,f),return) SDL_DYNAPI_PROC(const char*,SDL_GetCurrentAudioDriver,(void),(),return) SDL_DYNAPI_PROC(const char*,SDL_GetCurrentCameraDriver,(void),(),return) SDL_DYNAPI_PROC(const SDL_DisplayMode*,SDL_GetCurrentDisplayMode,(SDL_DisplayID a),(a),return) @@ -269,18 +269,18 @@ SDL_DYNAPI_PROC(SDL_DisplayID,SDL_GetDisplayForWindow,(SDL_Window *a),(a),return SDL_DYNAPI_PROC(const char*,SDL_GetDisplayName,(SDL_DisplayID a),(a),return) SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetDisplayProperties,(SDL_DisplayID a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetDisplayUsableBounds,(SDL_DisplayID a, SDL_Rect *b),(a,b),return) -SDL_DYNAPI_PROC(const SDL_DisplayID*,SDL_GetDisplays,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_DisplayID*,SDL_GetDisplays,(int *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetError,(void),(),return) SDL_DYNAPI_PROC(SDL_bool,SDL_GetEventFilter,(SDL_EventFilter *a, void **b),(a,b),return) SDL_DYNAPI_PROC(float,SDL_GetFloatProperty,(SDL_PropertiesID a, const char *b, float c),(a,b,c),return) -SDL_DYNAPI_PROC(const SDL_DisplayMode* const*,SDL_GetFullscreenDisplayModes,(SDL_DisplayID a, int *b),(a,b),return) +SDL_DYNAPI_PROC(SDL_DisplayMode**,SDL_GetFullscreenDisplayModes,(SDL_DisplayID a, int *b),(a,b),return) SDL_DYNAPI_PROC(int,SDL_GetGDKDefaultUser,(XUserHandle *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetGDKTaskQueue,(XTaskQueueHandle *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetGamepadAppleSFSymbolsNameForAxis,(SDL_Gamepad *a, SDL_GamepadAxis b),(a,b),return) SDL_DYNAPI_PROC(const char*,SDL_GetGamepadAppleSFSymbolsNameForButton,(SDL_Gamepad *a, SDL_GamepadButton b),(a,b),return) SDL_DYNAPI_PROC(Sint16,SDL_GetGamepadAxis,(SDL_Gamepad *a, SDL_GamepadAxis b),(a,b),return) SDL_DYNAPI_PROC(SDL_GamepadAxis,SDL_GetGamepadAxisFromString,(const char *a),(a),return) -SDL_DYNAPI_PROC(const SDL_GamepadBinding* const*,SDL_GetGamepadBindings,(SDL_Gamepad *a, int *b),(a,b),return) +SDL_DYNAPI_PROC(SDL_GamepadBinding**,SDL_GetGamepadBindings,(SDL_Gamepad *a, int *b),(a,b),return) SDL_DYNAPI_PROC(Uint8,SDL_GetGamepadButton,(SDL_Gamepad *a, SDL_GamepadButton b),(a,b),return) SDL_DYNAPI_PROC(SDL_GamepadButton,SDL_GetGamepadButtonFromString,(const char *a),(a),return) SDL_DYNAPI_PROC(SDL_GamepadButtonLabel,SDL_GetGamepadButtonLabel,(SDL_Gamepad *a, SDL_GamepadButton b),(a,b),return) @@ -292,10 +292,10 @@ SDL_DYNAPI_PROC(SDL_Gamepad*,SDL_GetGamepadFromPlayerIndex,(int a),(a),return) SDL_DYNAPI_PROC(SDL_GUID,SDL_GetGamepadGUIDForID,(SDL_JoystickID a),(a),return) SDL_DYNAPI_PROC(SDL_JoystickID,SDL_GetGamepadID,(SDL_Gamepad *a),(a),return) SDL_DYNAPI_PROC(SDL_Joystick*,SDL_GetGamepadJoystick,(SDL_Gamepad *a),(a),return) -SDL_DYNAPI_PROC(const char*,SDL_GetGamepadMapping,(SDL_Gamepad *a),(a),return) -SDL_DYNAPI_PROC(const char*,SDL_GetGamepadMappingForGUID,(SDL_GUID a),(a),return) -SDL_DYNAPI_PROC(const char*,SDL_GetGamepadMappingForID,(SDL_JoystickID a),(a),return) -SDL_DYNAPI_PROC(const char * const *,SDL_GetGamepadMappings,(int *a),(a),return) +SDL_DYNAPI_PROC(char*,SDL_GetGamepadMapping,(SDL_Gamepad *a),(a),return) +SDL_DYNAPI_PROC(char*,SDL_GetGamepadMappingForGUID,(SDL_GUID a),(a),return) +SDL_DYNAPI_PROC(char*,SDL_GetGamepadMappingForID,(SDL_JoystickID a),(a),return) +SDL_DYNAPI_PROC(char **,SDL_GetGamepadMappings,(int *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetGamepadName,(SDL_Gamepad *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetGamepadNameForID,(SDL_JoystickID a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetGamepadPath,(SDL_Gamepad *a),(a),return) @@ -321,7 +321,7 @@ SDL_DYNAPI_PROC(SDL_GamepadType,SDL_GetGamepadTypeForID,(SDL_JoystickID a),(a),r SDL_DYNAPI_PROC(SDL_GamepadType,SDL_GetGamepadTypeFromString,(const char *a),(a),return) SDL_DYNAPI_PROC(Uint16,SDL_GetGamepadVendor,(SDL_Gamepad *a),(a),return) SDL_DYNAPI_PROC(Uint16,SDL_GetGamepadVendorForID,(SDL_JoystickID a),(a),return) -SDL_DYNAPI_PROC(const SDL_JoystickID*,SDL_GetGamepads,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_JoystickID*,SDL_GetGamepads,(int *a),(a),return) SDL_DYNAPI_PROC(SDL_MouseButtonFlags,SDL_GetGlobalMouseState,(float *a, float *b),(a,b),return) SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetGlobalProperties,(void),(),return) SDL_DYNAPI_PROC(SDL_Window*,SDL_GetGrabbedWindow,(void),(),return) @@ -331,7 +331,7 @@ SDL_DYNAPI_PROC(SDL_Haptic*,SDL_GetHapticFromID,(SDL_HapticID a),(a),return) SDL_DYNAPI_PROC(SDL_HapticID,SDL_GetHapticID,(SDL_Haptic *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetHapticName,(SDL_Haptic *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetHapticNameForID,(SDL_HapticID a),(a),return) -SDL_DYNAPI_PROC(const SDL_HapticID*,SDL_GetHaptics,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_HapticID*,SDL_GetHaptics,(int *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GetHint,(const char *a),(a),return) SDL_DYNAPI_PROC(SDL_bool,SDL_GetHintBoolean,(const char *a, SDL_bool b),(a,b),return) SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetIOProperties,(SDL_IOStream *a),(a),return) @@ -367,21 +367,21 @@ SDL_DYNAPI_PROC(SDL_JoystickType,SDL_GetJoystickType,(SDL_Joystick *a),(a),retur SDL_DYNAPI_PROC(SDL_JoystickType,SDL_GetJoystickTypeForID,(SDL_JoystickID a),(a),return) SDL_DYNAPI_PROC(Uint16,SDL_GetJoystickVendor,(SDL_Joystick *a),(a),return) SDL_DYNAPI_PROC(Uint16,SDL_GetJoystickVendorForID,(SDL_JoystickID a),(a),return) -SDL_DYNAPI_PROC(const SDL_JoystickID*,SDL_GetJoysticks,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_JoystickID*,SDL_GetJoysticks,(int *a),(a),return) SDL_DYNAPI_PROC(SDL_Keycode,SDL_GetKeyFromName,(const char *a),(a),return) SDL_DYNAPI_PROC(SDL_Keycode,SDL_GetKeyFromScancode,(SDL_Scancode a, SDL_Keymod b),(a,b),return) SDL_DYNAPI_PROC(const char*,SDL_GetKeyName,(SDL_Keycode a),(a),return) SDL_DYNAPI_PROC(SDL_Window*,SDL_GetKeyboardFocus,(void),(),return) SDL_DYNAPI_PROC(const char*,SDL_GetKeyboardNameForID,(SDL_KeyboardID a),(a),return) SDL_DYNAPI_PROC(const Uint8*,SDL_GetKeyboardState,(int *a),(a),return) -SDL_DYNAPI_PROC(const SDL_KeyboardID*,SDL_GetKeyboards,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_KeyboardID*,SDL_GetKeyboards,(int *a),(a),return) SDL_DYNAPI_PROC(void,SDL_GetLogOutputFunction,(SDL_LogOutputFunction *a, void **b),(a,b),) SDL_DYNAPI_PROC(SDL_LogPriority,SDL_GetLogPriority,(int a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetMasksForPixelFormat,(SDL_PixelFormat a, int *b, Uint32 *c, Uint32 *d, Uint32 *e, Uint32 *f),(a,b,c,d,e,f),return) SDL_DYNAPI_PROC(int,SDL_GetMaxHapticEffects,(SDL_Haptic *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetMaxHapticEffectsPlaying,(SDL_Haptic *a),(a),return) SDL_DYNAPI_PROC(void,SDL_GetMemoryFunctions,(SDL_malloc_func *a, SDL_calloc_func *b, SDL_realloc_func *c, SDL_free_func *d),(a,b,c,d),) -SDL_DYNAPI_PROC(const SDL_MouseID*,SDL_GetMice,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_MouseID*,SDL_GetMice,(int *a),(a),return) SDL_DYNAPI_PROC(SDL_Keymod,SDL_GetModState,(void),(),return) SDL_DYNAPI_PROC(SDL_Window*,SDL_GetMouseFocus,(void),(),return) SDL_DYNAPI_PROC(const char*,SDL_GetMouseNameForID,(SDL_MouseID a),(a),return) @@ -417,10 +417,10 @@ SDL_DYNAPI_PROC(const char*,SDL_GetPixelFormatName,(SDL_PixelFormat a),(a),retur SDL_DYNAPI_PROC(const char*,SDL_GetPlatform,(void),(),return) SDL_DYNAPI_PROC(void*,SDL_GetPointerProperty,(SDL_PropertiesID a, const char *b, void *c),(a,b,c),return) SDL_DYNAPI_PROC(SDL_PowerState,SDL_GetPowerInfo,(int *a, int *b),(a,b),return) -SDL_DYNAPI_PROC(const char*,SDL_GetPrefPath,(const char *a, const char *b),(a,b),return) -SDL_DYNAPI_PROC(const SDL_Locale* const*,SDL_GetPreferredLocales,(int *a),(a),return) +SDL_DYNAPI_PROC(char*,SDL_GetPrefPath,(const char *a, const char *b),(a,b),return) +SDL_DYNAPI_PROC(SDL_Locale**,SDL_GetPreferredLocales,(int *a),(a),return) SDL_DYNAPI_PROC(SDL_DisplayID,SDL_GetPrimaryDisplay,(void),(),return) -SDL_DYNAPI_PROC(const char*,SDL_GetPrimarySelectionText,(void),(),return) +SDL_DYNAPI_PROC(char*,SDL_GetPrimarySelectionText,(void),(),return) SDL_DYNAPI_PROC(SDL_PropertyType,SDL_GetPropertyType,(SDL_PropertiesID a, const char *b),(a,b),return) SDL_DYNAPI_PROC(void,SDL_GetRGB,(Uint32 a, const SDL_PixelFormatDetails *b, const SDL_Palette *c, Uint8 *d, Uint8 *e, Uint8 *f),(a,b,c,d,e,f),) SDL_DYNAPI_PROC(void,SDL_GetRGBA,(Uint32 a, const SDL_PixelFormatDetails *b, const SDL_Palette *c, Uint8 *d, Uint8 *e, Uint8 *f, Uint8 *g),(a,b,c,d,e,f,g),) @@ -473,7 +473,7 @@ SDL_DYNAPI_PROC(int,SDL_GetSensorNonPortableTypeForID,(SDL_SensorID a),(a),retur SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetSensorProperties,(SDL_Sensor *a),(a),return) SDL_DYNAPI_PROC(SDL_SensorType,SDL_GetSensorType,(SDL_Sensor *a),(a),return) SDL_DYNAPI_PROC(SDL_SensorType,SDL_GetSensorTypeForID,(SDL_SensorID a),(a),return) -SDL_DYNAPI_PROC(const SDL_SensorID*,SDL_GetSensors,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_SensorID*,SDL_GetSensors,(int *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetSilenceValueForFormat,(SDL_AudioFormat a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetStorageFileSize,(SDL_Storage *a, const char *b, Uint64 *c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_GetStoragePathInfo,(SDL_Storage *a, const char *b, SDL_PathInfo *c),(a,b,c),return) @@ -505,8 +505,8 @@ SDL_DYNAPI_PROC(Uint64,SDL_GetTicks,(void),(),return) SDL_DYNAPI_PROC(Uint64,SDL_GetTicksNS,(void),(),return) SDL_DYNAPI_PROC(const char*,SDL_GetTouchDeviceName,(SDL_TouchID a),(a),return) SDL_DYNAPI_PROC(SDL_TouchDeviceType,SDL_GetTouchDeviceType,(SDL_TouchID a),(a),return) -SDL_DYNAPI_PROC(const SDL_TouchID*,SDL_GetTouchDevices,(int *a),(a),return) -SDL_DYNAPI_PROC(const SDL_Finger* const*,SDL_GetTouchFingers,(SDL_TouchID a, int *b),(a,b),return) +SDL_DYNAPI_PROC(SDL_TouchID*,SDL_GetTouchDevices,(int *a),(a),return) +SDL_DYNAPI_PROC(SDL_Finger**,SDL_GetTouchFingers,(SDL_TouchID a, int *b),(a,b),return) SDL_DYNAPI_PROC(const char*,SDL_GetUserFolder,(SDL_Folder a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetVersion,(void),(),return) SDL_DYNAPI_PROC(const char*,SDL_GetVideoDriver,(int a),(a),return) @@ -518,7 +518,7 @@ SDL_DYNAPI_PROC(float,SDL_GetWindowDisplayScale,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(SDL_WindowFlags,SDL_GetWindowFlags,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(SDL_Window*,SDL_GetWindowFromID,(SDL_WindowID a),(a),return) SDL_DYNAPI_PROC(const SDL_DisplayMode*,SDL_GetWindowFullscreenMode,(SDL_Window *a),(a),return) -SDL_DYNAPI_PROC(const void*,SDL_GetWindowICCProfile,(SDL_Window *a, size_t *b),(a,b),return) +SDL_DYNAPI_PROC(void*,SDL_GetWindowICCProfile,(SDL_Window *a, size_t *b),(a,b),return) SDL_DYNAPI_PROC(SDL_WindowID,SDL_GetWindowID,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(SDL_bool,SDL_GetWindowKeyboardGrab,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetWindowMaximumSize,(SDL_Window *a, int *b, int *c),(a,b,c),return) @@ -537,9 +537,9 @@ SDL_DYNAPI_PROC(int,SDL_GetWindowSizeInPixels,(SDL_Window *a, int *b, int *c),(a SDL_DYNAPI_PROC(SDL_Surface*,SDL_GetWindowSurface,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GetWindowSurfaceVSync,(SDL_Window *a, int *b),(a,b),return) SDL_DYNAPI_PROC(const char*,SDL_GetWindowTitle,(SDL_Window *a),(a),return) -SDL_DYNAPI_PROC(SDL_Window* const*,SDL_GetWindows,(int *a),(a),return) -SDL_DYNAPI_PROC(const char * const *,SDL_GlobDirectory,(const char *a, const char *b, SDL_GlobFlags c, int *d),(a,b,c,d),return) -SDL_DYNAPI_PROC(const char * const *,SDL_GlobStorageDirectory,(SDL_Storage *a, const char *b, const char *c, SDL_GlobFlags d, int *e),(a,b,c,d,e),return) +SDL_DYNAPI_PROC(SDL_Window**,SDL_GetWindows,(int *a),(a),return) +SDL_DYNAPI_PROC(char **,SDL_GlobDirectory,(const char *a, const char *b, SDL_GlobFlags c, int *d),(a,b,c,d),return) +SDL_DYNAPI_PROC(char **,SDL_GlobStorageDirectory,(SDL_Storage *a, const char *b, const char *c, SDL_GlobFlags d, int *e),(a,b,c,d,e),return) SDL_DYNAPI_PROC(SDL_bool,SDL_HapticEffectSupported,(SDL_Haptic *a, const SDL_HapticEffect *b),(a,b),return) SDL_DYNAPI_PROC(SDL_bool,SDL_HapticRumbleSupported,(SDL_Haptic *a),(a),return) SDL_DYNAPI_PROC(SDL_bool,SDL_HasARMSIMD,(void),(),return) diff --git a/src/dynapi/gendynapi.py b/src/dynapi/gendynapi.py index 339861427..8c4fd3dfb 100755 --- a/src/dynapi/gendynapi.py +++ b/src/dynapi/gendynapi.py @@ -197,7 +197,7 @@ def main(): func_ret = func_ret.replace('extern', ' ') func_ret = func_ret.replace('SDLCALL', ' ') func_ret = func_ret.replace('SDL_DECLSPEC', ' ') - func_ret = func_ret.replace('SDL_DECLSPEC_TEMP', ' ') + func_ret = func_ret.replace('SDL_DECLSPEC_FREE', ' ') # Remove trailing spaces in front of '*' tmp = "" while func_ret != tmp: diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 6a8021b5a..51ad2d38b 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -236,10 +236,6 @@ static void SDL_TransferTemporaryMemoryToEvent(SDL_EventEntry *event) SDL_LinkTemporaryMemoryToEvent(event, event->event.drop.data); break; default: - if (event->event.type >= SDL_EVENT_USER && event->event.type <= SDL_EVENT_LAST-1) { - SDL_LinkTemporaryMemoryToEvent(event, event->event.user.data1); - SDL_LinkTemporaryMemoryToEvent(event, event->event.user.data2); - } break; } } @@ -266,7 +262,7 @@ static void SDL_TransferTemporaryMemoryFromEvent(SDL_EventEntry *event) event->memory = NULL; } -void *SDL_FreeLater(void *memory) +static void *SDL_FreeLater(void *memory) { SDL_TemporaryMemoryState *state; @@ -275,7 +271,7 @@ void *SDL_FreeLater(void *memory) } // Make sure we're not adding this to the list twice - SDL_assert(!SDL_ClaimTemporaryMemory(memory)); + //SDL_assert(!SDL_ClaimTemporaryMemory(memory)); state = SDL_GetTemporaryMemoryState(SDL_TRUE); if (!state) { @@ -1158,6 +1154,9 @@ void SDL_FlushEvents(Uint32 minType, Uint32 maxType) /* Run the system dependent event loops */ static void SDL_PumpEventsInternal(SDL_bool push_sentinel) { + /* Free any temporary memory from old events */ + SDL_FreeTemporaryMemory(); + /* Release any keys held down from last frame */ SDL_ReleaseAutoReleaseKeys(); diff --git a/src/events/SDL_events_c.h b/src/events/SDL_events_c.h index 181583d71..32e00cb1f 100644 --- a/src/events/SDL_events_c.h +++ b/src/events/SDL_events_c.h @@ -45,6 +45,11 @@ extern int SDL_SendKeymapChangedEvent(void); extern int SDL_SendLocaleChangedEvent(void); extern int SDL_SendSystemThemeChangedEvent(void); +extern void *SDL_AllocateTemporaryMemory(size_t size); +extern const char *SDL_CreateTemporaryString(const char *string); +extern void *SDL_ClaimTemporaryMemory(const void *mem); +extern void SDL_FreeTemporaryMemory(void); + extern int SDL_SendQuit(void); extern int SDL_InitEvents(void); diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index b0c3fcb66..63c503d14 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -177,7 +177,7 @@ SDL_bool SDL_HasKeyboard(void) return (SDL_keyboard_count > 0); } -const SDL_KeyboardID *SDL_GetKeyboards(int *count) +SDL_KeyboardID *SDL_GetKeyboards(int *count) { int i; SDL_KeyboardID *keyboards; @@ -198,7 +198,7 @@ const SDL_KeyboardID *SDL_GetKeyboards(int *count) } } - return SDL_FreeLater(keyboards); + return keyboards; } const char *SDL_GetKeyboardNameForID(SDL_KeyboardID instance_id) @@ -207,7 +207,7 @@ const char *SDL_GetKeyboardNameForID(SDL_KeyboardID instance_id) if (keyboard_index < 0) { return NULL; } - return SDL_CreateTemporaryString(SDL_keyboards[keyboard_index].name); + return SDL_GetPersistentString(SDL_keyboards[keyboard_index].name); } void SDL_ResetKeyboard(void) @@ -762,7 +762,7 @@ int SDL_SendEditingText(const char *text, int start, int length) static const char * const *CreateCandidatesForEvent(char **candidates, int num_candidates) { - char **event_candidates; + const char **event_candidates; int i; char *ptr; size_t total_length = (num_candidates + 1) * sizeof(*event_candidates); @@ -773,7 +773,7 @@ static const char * const *CreateCandidatesForEvent(char **candidates, int num_c total_length += length; } - event_candidates = (char **)SDL_malloc(total_length); + event_candidates = (const char **)SDL_AllocateTemporaryMemory(total_length); if (!event_candidates) { return NULL; } @@ -788,7 +788,7 @@ static const char * const *CreateCandidatesForEvent(char **candidates, int num_c } event_candidates[i] = NULL; - return SDL_FreeLater(event_candidates); + return event_candidates; } int SDL_SendEditingTextCandidates(char **candidates, int num_candidates, int selected_candidate, SDL_bool horizontal) diff --git a/src/events/SDL_keymap.c b/src/events/SDL_keymap.c index cfa5b213e..18300d9d6 100644 --- a/src/events/SDL_keymap.c +++ b/src/events/SDL_keymap.c @@ -957,7 +957,8 @@ const char *SDL_GetScancodeName(SDL_Scancode scancode) if (!name) { name = ""; } - return SDL_CreateTemporaryString(name); + // This is pointing to static memory or application managed memory + return name; } SDL_Scancode SDL_GetScancodeFromName(const char *name) @@ -1015,7 +1016,7 @@ const char *SDL_GetKeyName(SDL_Keycode key) end = SDL_UCS4ToUTF8(key, name); *end = '\0'; - return SDL_CreateTemporaryString(name); + return SDL_GetPersistentString(name); } } diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index b7329f959..b56fc7643 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -361,7 +361,7 @@ SDL_bool SDL_HasMouse(void) return (SDL_mouse_count > 0); } -const SDL_MouseID *SDL_GetMice(int *count) +SDL_MouseID *SDL_GetMice(int *count) { int i; SDL_MouseID *mice; @@ -382,7 +382,7 @@ const SDL_MouseID *SDL_GetMice(int *count) } } - return SDL_FreeLater(mice); + return mice; } const char *SDL_GetMouseNameForID(SDL_MouseID instance_id) @@ -391,7 +391,7 @@ const char *SDL_GetMouseNameForID(SDL_MouseID instance_id) if (mouse_index < 0) { return NULL; } - return SDL_CreateTemporaryString(SDL_mice[mouse_index].name); + return SDL_GetPersistentString(SDL_mice[mouse_index].name); } void SDL_SetDefaultCursor(SDL_Cursor *cursor) diff --git a/src/events/SDL_pen.c b/src/events/SDL_pen.c index 5feef99c6..ac33ee4cf 100644 --- a/src/events/SDL_pen.c +++ b/src/events/SDL_pen.c @@ -213,7 +213,7 @@ const char *SDL_GetPenName(SDL_PenID instance_id) { const char *result; SDL_LOAD_LOCK_PEN(pen, instance_id, NULL); - result = pen->name; /* Allocated separately from the pen table, so it is safe to hand to client code */ + result = SDL_GetPersistentString(pen->name); SDL_UNLOCK_PENS(); return result; } diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 9bb14ed64..4206f6383 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -49,7 +49,7 @@ SDL_bool SDL_TouchDevicesAvailable(void) return SDL_num_touch > 0; } -const SDL_TouchID *SDL_GetTouchDevices(int *count) +SDL_TouchID *SDL_GetTouchDevices(int *count) { if (count) { *count = 0; @@ -67,7 +67,7 @@ const SDL_TouchID *SDL_GetTouchDevices(int *count) } } - return SDL_FreeLater(retval); + return retval; } static int SDL_GetTouchIndex(SDL_TouchID id) @@ -105,7 +105,7 @@ const char *SDL_GetTouchDeviceName(SDL_TouchID id) if (!touch) { return NULL; } - return SDL_CreateTemporaryString(touch->name); + return SDL_GetPersistentString(touch->name); } SDL_TouchDeviceType SDL_GetTouchDeviceType(SDL_TouchID id) @@ -134,7 +134,7 @@ static SDL_Finger *SDL_GetFinger(const SDL_Touch *touch, SDL_FingerID id) return touch->fingers[index]; } -const SDL_Finger * const * SDL_GetTouchFingers(SDL_TouchID touchID, int *count) +SDL_Finger **SDL_GetTouchFingers(SDL_TouchID touchID, int *count) { SDL_Finger **fingers; SDL_Finger *finger_data; @@ -164,7 +164,7 @@ const SDL_Finger * const * SDL_GetTouchFingers(SDL_TouchID touchID, int *count) if (count) { *count = touch->num_fingers; } - return SDL_FreeLater(fingers); + return fingers; } int SDL_AddTouch(SDL_TouchID touchID, SDL_TouchDeviceType type, const char *name) diff --git a/src/filesystem/SDL_filesystem.c b/src/filesystem/SDL_filesystem.c index 9eb44d486..442f5021b 100644 --- a/src/filesystem/SDL_filesystem.c +++ b/src/filesystem/SDL_filesystem.c @@ -298,7 +298,7 @@ static int SDLCALL GlobDirectoryCallback(void *userdata, const char *dirname, co return retval; } -const char * const *SDL_InternalGlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count, SDL_GlobEnumeratorFunc enumerator, SDL_GlobGetPathInfoFunc getpathinfo, void *userdata) +char **SDL_InternalGlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count, SDL_GlobEnumeratorFunc enumerator, SDL_GlobGetPathInfoFunc getpathinfo, void *userdata) { int dummycount; if (!count) { @@ -393,7 +393,7 @@ const char * const *SDL_InternalGlobDirectory(const char *path, const char *patt SDL_free(folded); SDL_free(pathcpy); - return SDL_FreeLater(retval); + return retval; } static int GlobDirectoryGetPathInfo(const char *path, SDL_PathInfo *info, void *userdata) @@ -406,7 +406,7 @@ static int GlobDirectoryEnumerator(const char *path, SDL_EnumerateDirectoryCallb return SDL_EnumerateDirectory(path, cb, cbuserdata); } -const char * const *SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count) +char **SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count) { //SDL_Log("SDL_GlobDirectory('%s', '%s') ...", path, pattern); return SDL_InternalGlobDirectory(path, pattern, flags, count, GlobDirectoryEnumerator, GlobDirectoryGetPathInfo, NULL); @@ -441,10 +441,10 @@ const char *SDL_GetUserFolder(SDL_Folder folder) } -const char *SDL_GetPrefPath(const char *org, const char *app) +char *SDL_GetPrefPath(const char *org, const char *app) { char *path = SDL_SYS_GetPrefPath(org, app); - return SDL_FreeLater(path); + return path; } diff --git a/src/filesystem/SDL_sysfilesystem.h b/src/filesystem/SDL_sysfilesystem.h index 5dfb3ebc3..83a59d20a 100644 --- a/src/filesystem/SDL_sysfilesystem.h +++ b/src/filesystem/SDL_sysfilesystem.h @@ -36,7 +36,7 @@ int SDL_SYS_GetPathInfo(const char *path, SDL_PathInfo *info); typedef int (*SDL_GlobEnumeratorFunc)(const char *path, SDL_EnumerateDirectoryCallback cb, void *cbuserdata, void *userdata); typedef int (*SDL_GlobGetPathInfoFunc)(const char *path, SDL_PathInfo *info, void *userdata); -const char * const *SDL_InternalGlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count, SDL_GlobEnumeratorFunc enumerator, SDL_GlobGetPathInfoFunc getpathinfo, void *userdata); +char **SDL_InternalGlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count, SDL_GlobEnumeratorFunc enumerator, SDL_GlobGetPathInfoFunc getpathinfo, void *userdata); #endif diff --git a/src/filesystem/winrt/SDL_sysfilesystem.cpp b/src/filesystem/winrt/SDL_sysfilesystem.cpp index 04dacd55f..df16663e0 100644 --- a/src/filesystem/winrt/SDL_sysfilesystem.cpp +++ b/src/filesystem/winrt/SDL_sysfilesystem.cpp @@ -115,7 +115,7 @@ extern "C" const char *SDL_GetWinRTFSPath(SDL_WinRT_Path pathType) char *utf8Path = WIN_StringToUTF8W(ucs2Path); utf8Paths[pathType] = utf8Path; SDL_free(utf8Path); - return SDL_CreateTemporaryString(utf8Paths[pathType].c_str()); + return SDL_GetPersistentString(utf8Paths[pathType].c_str()); } extern "C" char *SDL_SYS_GetBasePath(void) diff --git a/src/haptic/SDL_haptic.c b/src/haptic/SDL_haptic.c index 4d3ced531..bb009ec56 100644 --- a/src/haptic/SDL_haptic.c +++ b/src/haptic/SDL_haptic.c @@ -63,7 +63,7 @@ static SDL_bool SDL_GetHapticIndex(SDL_HapticID instance_id, int *driver_index) return SDL_FALSE; } -const SDL_HapticID *SDL_GetHaptics(int *count) +SDL_HapticID *SDL_GetHaptics(int *count) { int device_index; int haptic_index = 0, num_haptics = 0; @@ -89,7 +89,7 @@ const SDL_HapticID *SDL_GetHaptics(int *count) } } - return SDL_FreeLater(haptics); + return haptics; } const char *SDL_GetHapticNameForID(SDL_HapticID instance_id) @@ -98,9 +98,9 @@ const char *SDL_GetHapticNameForID(SDL_HapticID instance_id) const char *name = NULL; if (SDL_GetHapticIndex(instance_id, &device_index)) { - name = SDL_SYS_HapticName(device_index); + name = SDL_GetPersistentString(SDL_SYS_HapticName(device_index)); } - return SDL_CreateTemporaryString(name); + return name; } SDL_Haptic *SDL_OpenHaptic(SDL_HapticID instance_id) @@ -189,7 +189,7 @@ const char *SDL_GetHapticName(SDL_Haptic *haptic) { CHECK_HAPTIC_MAGIC(haptic, NULL); - return SDL_CreateTemporaryString(haptic->name); + return SDL_GetPersistentString(haptic->name); } SDL_bool SDL_IsMouseHaptic(void) diff --git a/src/joystick/SDL_gamepad.c b/src/joystick/SDL_gamepad.c index 435f3b3b3..4dc94d7cf 100644 --- a/src/joystick/SDL_gamepad.c +++ b/src/joystick/SDL_gamepad.c @@ -89,7 +89,7 @@ typedef struct GamepadMapping_t typedef struct { int refcount _guarded; - const SDL_JoystickID *joysticks _guarded; + SDL_JoystickID *joysticks _guarded; GamepadMapping_t **joystick_mappings _guarded; int num_changed_mappings _guarded; @@ -579,6 +579,7 @@ static void PopMappingChangeTracking(void) } } + SDL_free(tracker->joysticks); SDL_free(tracker->joystick_mappings); SDL_free(tracker->changed_mappings); SDL_free(tracker); @@ -2075,14 +2076,14 @@ int SDL_AddGamepadMapping(const char *mapping) static char *CreateMappingString(GamepadMapping_t *mapping, SDL_GUID guid) { char *pMappingString, *pPlatformString; - const char *pchGUID; + char pchGUID[33]; size_t needed; SDL_bool need_platform = SDL_FALSE; const char *platform = NULL; SDL_AssertJoysticksLocked(); - pchGUID = SDL_GUIDToString(guid); + SDL_GUIDToString(guid, pchGUID, sizeof(pchGUID)); /* allocate enough memory for GUID + ',' + name + ',' + mapping + \0 */ needed = SDL_strlen(pchGUID) + 1 + SDL_strlen(mapping->name) + 1 + SDL_strlen(mapping->mapping) + 1; @@ -2124,7 +2125,7 @@ static char *CreateMappingString(GamepadMapping_t *mapping, SDL_GUID guid) return pMappingString; } -const char * const *SDL_GetGamepadMappings(int *count) +char **SDL_GetGamepadMappings(int *count) { int num_mappings = 0; char **retval = NULL; @@ -2197,13 +2198,13 @@ const char * const *SDL_GetGamepadMappings(int *count) SDL_free(mappings); } - return SDL_FreeLater(retval); + return retval; } /* * Get the mapping string for this GUID */ -const char *SDL_GetGamepadMappingForGUID(SDL_GUID guid) +char *SDL_GetGamepadMappingForGUID(SDL_GUID guid) { char *retval; @@ -2219,13 +2220,13 @@ const char *SDL_GetGamepadMappingForGUID(SDL_GUID guid) } SDL_UnlockJoysticks(); - return SDL_FreeLater(retval); + return retval; } /* * Get the mapping string for this device */ -const char *SDL_GetGamepadMapping(SDL_Gamepad *gamepad) +char *SDL_GetGamepadMapping(SDL_Gamepad *gamepad) { char *retval; @@ -2237,7 +2238,7 @@ const char *SDL_GetGamepadMapping(SDL_Gamepad *gamepad) } SDL_UnlockJoysticks(); - return SDL_FreeLater(retval); + return retval; } /* @@ -2357,7 +2358,7 @@ int SDL_InitGamepadMappings(void) int SDL_InitGamepads(void) { int i; - const SDL_JoystickID *joysticks; + SDL_JoystickID *joysticks; SDL_gamepads_initialized = SDL_TRUE; @@ -2372,6 +2373,7 @@ int SDL_InitGamepads(void) SDL_PrivateGamepadAdded(joysticks[i]); } } + SDL_free(joysticks); } return 0; @@ -2381,7 +2383,7 @@ SDL_bool SDL_HasGamepad(void) { int num_joysticks = 0; int num_gamepads = 0; - const SDL_JoystickID *joysticks = SDL_GetJoysticks(&num_joysticks); + SDL_JoystickID *joysticks = SDL_GetJoysticks(&num_joysticks); if (joysticks) { int i; for (i = num_joysticks - 1; i >= 0 && num_gamepads == 0; --i) { @@ -2389,6 +2391,7 @@ SDL_bool SDL_HasGamepad(void) ++num_gamepads; } } + SDL_free(joysticks); } if (num_gamepads > 0) { return SDL_TRUE; @@ -2396,11 +2399,11 @@ SDL_bool SDL_HasGamepad(void) return SDL_FALSE; } -const SDL_JoystickID *SDL_GetGamepads(int *count) +SDL_JoystickID *SDL_GetGamepads(int *count) { int num_joysticks = 0; int num_gamepads = 0; - SDL_JoystickID *joysticks = SDL_ClaimTemporaryMemory(SDL_GetJoysticks(&num_joysticks)); + SDL_JoystickID *joysticks = SDL_GetJoysticks(&num_joysticks); if (joysticks) { int i; for (i = num_joysticks - 1; i >= 0; --i) { @@ -2414,7 +2417,7 @@ const SDL_JoystickID *SDL_GetGamepads(int *count) if (count) { *count = num_gamepads; } - return SDL_FreeLater(joysticks); + return joysticks; } const char *SDL_GetGamepadNameForID(SDL_JoystickID instance_id) @@ -2428,7 +2431,7 @@ const char *SDL_GetGamepadNameForID(SDL_JoystickID instance_id) if (SDL_strcmp(mapping->name, "*") == 0) { retval = SDL_GetJoystickNameForID(instance_id); } else { - retval = SDL_CreateTemporaryString(mapping->name); + retval = SDL_GetPersistentString(mapping->name); } } } @@ -2516,7 +2519,7 @@ SDL_GamepadType SDL_GetRealGamepadTypeForID(SDL_JoystickID instance_id) return type; } -const char *SDL_GetGamepadMappingForID(SDL_JoystickID instance_id) +char *SDL_GetGamepadMappingForID(SDL_JoystickID instance_id) { char *retval = NULL; @@ -2524,15 +2527,15 @@ const char *SDL_GetGamepadMappingForID(SDL_JoystickID instance_id) { GamepadMapping_t *mapping = SDL_PrivateGetGamepadMapping(instance_id, SDL_TRUE); if (mapping) { - const char *pchGUID; - const SDL_GUID guid = SDL_GetJoystickGUIDForID(instance_id); - pchGUID = SDL_GUIDToString(guid); + char pchGUID[33]; + SDL_GUID guid = SDL_GetJoystickGUIDForID(instance_id); + SDL_GUIDToString(guid, pchGUID, sizeof(pchGUID)); SDL_asprintf(&retval, "%s,%s,%s", pchGUID, mapping->name, mapping->mapping); } } SDL_UnlockJoysticks(); - return SDL_FreeLater(retval); + return retval; } /* @@ -3307,7 +3310,7 @@ const char *SDL_GetGamepadName(SDL_Gamepad *gamepad) gamepad->joystick->steam_handle != 0) { retval = SDL_GetJoystickName(gamepad->joystick); } else { - retval = SDL_CreateTemporaryString(gamepad->name); + retval = SDL_GetPersistentString(gamepad->name); } } SDL_UnlockJoysticks(); @@ -3427,7 +3430,7 @@ const char * SDL_GetGamepadSerial(SDL_Gamepad *gamepad) if (!joystick) { return NULL; } - return SDL_GetJoystickSerial(joystick); // this already returns a SDL_FreeLater pointer. + return SDL_GetJoystickSerial(joystick); } @@ -3543,7 +3546,7 @@ SDL_Gamepad *SDL_GetGamepadFromPlayerIndex(int player_index) /* * Get the SDL joystick layer bindings for this gamepad */ -const SDL_GamepadBinding * const*SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count) +SDL_GamepadBinding **SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count) { SDL_GamepadBinding **bindings = NULL; @@ -3574,7 +3577,7 @@ const SDL_GamepadBinding * const*SDL_GetGamepadBindings(SDL_Gamepad *gamepad, in } SDL_UnlockJoysticks(); - return SDL_FreeLater(bindings); + return bindings; } int SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms) @@ -3845,9 +3848,9 @@ void SDL_GamepadHandleDelayedGuideButton(SDL_Joystick *joystick) const char *SDL_GetGamepadAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button) { + const char *retval = NULL; #ifdef SDL_JOYSTICK_MFI - char *IOS_GetAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); - char *retval; + const char *IOS_GetAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); SDL_LockJoysticks(); { @@ -3856,21 +3859,15 @@ const char *SDL_GetGamepadAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_ retval = IOS_GetAppleSFSymbolsNameForButton(gamepad, button); } SDL_UnlockJoysticks(); - - // retval was malloc'd by IOS_GetAppleSFSymbolsNameForButton - if (retval && *retval) { - return SDL_FreeLater(retval); - } - SDL_free(retval); #endif - return NULL; + return retval; } const char *SDL_GetGamepadAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis) { + const char *retval = NULL; #ifdef SDL_JOYSTICK_MFI - char *IOS_GetAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); - char *retval; + const char *IOS_GetAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); SDL_LockJoysticks(); { @@ -3879,12 +3876,6 @@ const char *SDL_GetGamepadAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_Ga retval = IOS_GetAppleSFSymbolsNameForAxis(gamepad, axis); } SDL_UnlockJoysticks(); - - // retval was malloc'd by IOS_GetAppleSFSymbolsNameForAxis - if (retval && *retval) { - return SDL_FreeLater(retval); - } - SDL_free(retval); #endif - return NULL; + return retval; } diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c index 4a2760a85..e03537079 100644 --- a/src/joystick/SDL_joystick.c +++ b/src/joystick/SDL_joystick.c @@ -714,7 +714,7 @@ SDL_bool SDL_HasJoystick(void) return SDL_FALSE; } -const SDL_JoystickID *SDL_GetJoysticks(int *count) +SDL_JoystickID *SDL_GetJoysticks(int *count) { int i, num_joysticks, device_index; int joystick_index = 0, total_joysticks = 0; @@ -751,7 +751,7 @@ const SDL_JoystickID *SDL_GetJoysticks(int *count) } SDL_UnlockJoysticks(); - return SDL_FreeLater(joysticks); + return joysticks; } const SDL_SteamVirtualGamepadInfo *SDL_GetJoystickVirtualGamepadInfoForID(SDL_JoystickID instance_id) @@ -780,9 +780,9 @@ const char *SDL_GetJoystickNameForID(SDL_JoystickID instance_id) SDL_LockJoysticks(); info = SDL_GetJoystickVirtualGamepadInfoForID(instance_id); if (info) { - name = SDL_CreateTemporaryString(info->name); + name = SDL_GetPersistentString(info->name); } else if (SDL_GetDriverAndJoystickIndex(instance_id, &driver, &device_index)) { - name = SDL_CreateTemporaryString(driver->GetDeviceName(device_index)); + name = SDL_GetPersistentString(driver->GetDeviceName(device_index)); } SDL_UnlockJoysticks(); @@ -800,7 +800,7 @@ const char *SDL_GetJoystickPathForID(SDL_JoystickID instance_id) SDL_LockJoysticks(); if (SDL_GetDriverAndJoystickIndex(instance_id, &driver, &device_index)) { - path = SDL_CreateTemporaryString(driver->GetDevicePath(device_index)); + path = SDL_GetPersistentString(driver->GetDevicePath(device_index)); } SDL_UnlockJoysticks(); @@ -858,7 +858,7 @@ static SDL_bool IsROGAlly(SDL_Joystick *joystick) SDL_bool has_ally_gyro = SDL_FALSE; if (SDL_InitSubSystem(SDL_INIT_SENSOR) == 0) { - const SDL_SensorID *sensors = SDL_GetSensors(NULL); + SDL_SensorID *sensors = SDL_GetSensors(NULL); if (sensors) { int i; for (i = 0; sensors[i]; ++i) { @@ -877,6 +877,7 @@ static SDL_bool IsROGAlly(SDL_Joystick *joystick) } } } + SDL_free(sensors); } SDL_QuitSubSystem(SDL_INIT_SENSOR); } @@ -951,7 +952,7 @@ static SDL_bool ShouldAttemptSensorFusion(SDL_Joystick *joystick, SDL_bool *inve static void AttemptSensorFusion(SDL_Joystick *joystick, SDL_bool invert_sensors) { - const SDL_SensorID *sensors; + SDL_SensorID *sensors; unsigned int i, j; SDL_AssertJoysticksLocked(); @@ -980,6 +981,7 @@ static void AttemptSensorFusion(SDL_Joystick *joystick, SDL_bool invert_sensors) SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_GYRO, 0.0f); } } + SDL_free(sensors); } SDL_QuitSubSystem(SDL_INIT_SENSOR); @@ -1651,9 +1653,9 @@ const char *SDL_GetJoystickName(SDL_Joystick *joystick) info = SDL_GetJoystickVirtualGamepadInfoForID(joystick->instance_id); if (info) { - retval = SDL_CreateTemporaryString(info->name); + retval = SDL_GetPersistentString(info->name); } else { - retval = SDL_CreateTemporaryString(joystick->name); + retval = SDL_GetPersistentString(joystick->name); } } SDL_UnlockJoysticks(); @@ -1673,7 +1675,7 @@ const char *SDL_GetJoystickPath(SDL_Joystick *joystick) CHECK_JOYSTICK_MAGIC(joystick, NULL); if (joystick->path) { - retval = SDL_CreateTemporaryString(joystick->path); + retval = SDL_GetPersistentString(joystick->path); } else { SDL_Unsupported(); retval = NULL; @@ -1903,7 +1905,7 @@ void SDL_CloseJoystick(SDL_Joystick *joystick) void SDL_QuitJoysticks(void) { int i; - const SDL_JoystickID *joysticks; + SDL_JoystickID *joysticks; SDL_LockJoysticks(); @@ -1914,6 +1916,7 @@ void SDL_QuitJoysticks(void) for (i = 0; joysticks[i]; ++i) { SDL_PrivateJoystickRemoved(joysticks[i]); } + SDL_free(joysticks); } while (SDL_joysticks) { @@ -3428,7 +3431,7 @@ const char *SDL_GetJoystickSerial(SDL_Joystick *joystick) { CHECK_JOYSTICK_MAGIC(joystick, NULL); - retval = SDL_CreateTemporaryString(joystick->serial); + retval = SDL_GetPersistentString(joystick->serial); } SDL_UnlockJoysticks(); diff --git a/src/joystick/apple/SDL_mfijoystick.m b/src/joystick/apple/SDL_mfijoystick.m index 22604ca01..892e1a015 100644 --- a/src/joystick/apple/SDL_mfijoystick.m +++ b/src/joystick/apple/SDL_mfijoystick.m @@ -1916,7 +1916,7 @@ static GCControllerDirectionPad *GetDirectionalPadForController(GCController *co } #endif /* SDL_JOYSTICK_MFI && ENABLE_PHYSICAL_INPUT_PROFILE */ -char *IOS_GetAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button) +const char *IOS_GetAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button) { char elementName[256]; elementName[0] = '\0'; @@ -2031,10 +2031,10 @@ char *IOS_GetAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton } #endif - return SDL_strdup(elementName); + return *elementName ? SDL_GetPersistentString(elementName) : NULL; } -char *IOS_GetAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis) +const char *IOS_GetAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis) { char elementName[256]; elementName[0] = '\0'; @@ -2071,7 +2071,7 @@ char *IOS_GetAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axi } } #endif - return *elementName ? SDL_strdup(elementName) : NULL; + return *elementName ? SDL_GetPersistentString(elementName) : NULL; } SDL_JoystickDriver SDL_IOS_JoystickDriver = { diff --git a/src/locale/SDL_locale.c b/src/locale/SDL_locale.c index 423e0acf5..6b3c80223 100644 --- a/src/locale/SDL_locale.c +++ b/src/locale/SDL_locale.c @@ -22,7 +22,7 @@ #include "SDL_internal.h" #include "SDL_syslocale.h" -static const SDL_Locale * const *build_locales_from_csv_string(char *csv, int *count) +static SDL_Locale **build_locales_from_csv_string(char *csv, int *count) { int i, num_locales; size_t slen; @@ -95,10 +95,10 @@ static const SDL_Locale * const *build_locales_from_csv_string(char *csv, int *c *count = num_locales; } - return SDL_FreeLater(retval); + return retval; } -const SDL_Locale * const *SDL_GetPreferredLocales(int *count) +SDL_Locale **SDL_GetPreferredLocales(int *count) { char locbuf[128]; /* enough for 21 "xx_YY," language strings. */ const char *hint = SDL_GetHint(SDL_HINT_PREFERRED_LOCALES); diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 0bc1d4b79..28a0340b4 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -811,7 +811,7 @@ const char *SDL_GetRenderDriver(int index) SDL_GetNumRenderDrivers() - 1); return NULL; } - return SDL_CreateTemporaryString(render_drivers[index]->name); + return render_drivers[index]->name; #else SDL_SetError("SDL not built with rendering support"); return NULL; @@ -1204,7 +1204,7 @@ const char *SDL_GetRendererName(SDL_Renderer *renderer) { CHECK_RENDERER_MAGIC(renderer, NULL); - return renderer->name; + return SDL_GetPersistentString(renderer->name); } SDL_PropertiesID SDL_GetRendererProperties(SDL_Renderer *renderer) diff --git a/src/sensor/SDL_sensor.c b/src/sensor/SDL_sensor.c index 466bf3734..f13d3e8b0 100644 --- a/src/sensor/SDL_sensor.c +++ b/src/sensor/SDL_sensor.c @@ -170,7 +170,7 @@ SDL_bool SDL_SensorsOpened(void) return opened; } -const SDL_SensorID *SDL_GetSensors(int *count) +SDL_SensorID *SDL_GetSensors(int *count) { int i, num_sensors, device_index; int sensor_index = 0, total_sensors = 0; @@ -207,7 +207,7 @@ const SDL_SensorID *SDL_GetSensors(int *count) } SDL_UnlockSensors(); - return SDL_FreeLater(sensors); + return sensors; } /* @@ -246,7 +246,7 @@ const char *SDL_GetSensorNameForID(SDL_SensorID instance_id) SDL_LockSensors(); if (SDL_GetDriverAndSensorIndex(instance_id, &driver, &device_index)) { - name = SDL_CreateTemporaryString(driver->GetDeviceName(device_index)); + name = SDL_GetPersistentString(driver->GetDeviceName(device_index)); } SDL_UnlockSensors(); @@ -407,7 +407,7 @@ const char *SDL_GetSensorName(SDL_Sensor *sensor) { CHECK_SENSOR_MAGIC(sensor, NULL); - retval = SDL_CreateTemporaryString(sensor->name); + retval = SDL_GetPersistentString(sensor->name); } SDL_UnlockSensors(); diff --git a/src/stdlib/SDL_getenv.c b/src/stdlib/SDL_getenv.c index 020982d45..c37568ab8 100644 --- a/src/stdlib/SDL_getenv.c +++ b/src/stdlib/SDL_getenv.c @@ -185,7 +185,8 @@ const char *SDL_getenv(const char *name) const char *SDL_getenv(const char *name) { DWORD length, maxlen = 0; - char *retval = NULL; + char *string = NULL; + const char *retval = NULL; /* Input validation */ if (!name || *name == '\0') { @@ -193,20 +194,24 @@ const char *SDL_getenv(const char *name) } for ( ; ; ) { - length = GetEnvironmentVariableA(name, retval, maxlen); + length = GetEnvironmentVariableA(name, string, maxlen); if (length > maxlen) { - char *string = (char *)SDL_realloc(retval, length); - if (!string) { + char *temp = (char *)SDL_realloc(string, length); + if (!temp) { return NULL; } - retval = string; + string = temp; maxlen = length; } else { break; } } - return SDL_FreeLater(retval); + if (string) { + retval = SDL_GetPersistentString(string); + SDL_free(string); + } + return retval; } #else const char *SDL_getenv(const char *name) diff --git a/src/storage/SDL_storage.c b/src/storage/SDL_storage.c index 47adcfe7c..bc31f0c4f 100644 --- a/src/storage/SDL_storage.c +++ b/src/storage/SDL_storage.c @@ -353,7 +353,7 @@ static int GlobStorageDirectoryEnumerator(const char *path, SDL_EnumerateDirecto return SDL_EnumerateStorageDirectory((SDL_Storage *) userdata, path, cb, cbuserdata); } -const char * const *SDL_GlobStorageDirectory(SDL_Storage *storage, const char *path, const char *pattern, SDL_GlobFlags flags, int *count) +char **SDL_GlobStorageDirectory(SDL_Storage *storage, const char *path, const char *pattern, SDL_GlobFlags flags, int *count) { CHECK_STORAGE_MAGIC_RET(NULL) return SDL_InternalGlobDirectory(path, pattern, flags, count, GlobStorageDirectoryEnumerator, GlobStorageDirectoryGetPathInfo, storage); diff --git a/src/storage/generic/SDL_genericstorage.c b/src/storage/generic/SDL_genericstorage.c index 859786dfb..ad43ddc34 100644 --- a/src/storage/generic/SDL_genericstorage.c +++ b/src/storage/generic/SDL_genericstorage.c @@ -203,10 +203,8 @@ static SDL_Storage *GENERIC_Title_Create(const char *override, SDL_PropertiesID if (override != NULL) { basepath = SDL_strdup(override); } else { - const char *sdlbasepath = SDL_GetBasePath(); - if (sdlbasepath) { - basepath = SDL_strdup(sdlbasepath); - } + const char *base = SDL_GetBasePath(); + basepath = base ? SDL_strdup(base) : NULL; } if (basepath != NULL) { @@ -242,11 +240,7 @@ static const SDL_StorageInterface GENERIC_user_iface = { static SDL_Storage *GENERIC_User_Create(const char *org, const char *app, SDL_PropertiesID props) { SDL_Storage *result; - char *prefpath = NULL; - const char *sdlprefpath = SDL_GetPrefPath(org, app); - if (sdlprefpath) { - prefpath = SDL_strdup(sdlprefpath); - } + char *prefpath = SDL_GetPrefPath(org, app); if (prefpath == NULL) { return NULL; } diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c index 689be07ff..fbe1f18e6 100644 --- a/src/test/SDL_test_common.c +++ b/src/test/SDL_test_common.c @@ -1130,7 +1130,6 @@ static SDL_HitTestResult SDLCALL SDLTest_ExampleHitTestCallback(SDL_Window *win, SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state) { int i, j, m, n, w, h; - const SDL_DisplayMode *fullscreen_mode; char text[1024]; if (state->flags & SDL_INIT_VIDEO) { @@ -1192,9 +1191,9 @@ SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state) } if (state->verbose & VERBOSE_MODES) { - const SDL_DisplayID *displays; + SDL_DisplayID *displays; SDL_Rect bounds, usablebounds; - const SDL_DisplayMode * const *modes; + SDL_DisplayMode **modes; const SDL_DisplayMode *mode; int bpp; Uint32 Rmask, Gmask, Bmask, Amask; @@ -1258,6 +1257,7 @@ SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state) } } } + SDL_free(modes); #if defined(SDL_VIDEO_DRIVER_WINDOWS) && !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) /* Print the D3D9 adapter index */ @@ -1269,6 +1269,7 @@ SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state) SDL_Log("DXGI Adapter Index: %d Output Index: %d", adapterIndex, outputIndex); #endif } + SDL_free(displays); } if (state->verbose & VERBOSE_RENDER) { @@ -1285,10 +1286,11 @@ SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state) state->displayID = SDL_GetPrimaryDisplay(); if (state->display_index > 0) { - const SDL_DisplayID *displays = SDL_GetDisplays(&n); + SDL_DisplayID *displays = SDL_GetDisplays(&n); if (state->display_index < n) { state->displayID = displays[state->display_index]; } + SDL_free(displays); if (SDL_WINDOWPOS_ISUNDEFINED(state->window_x)) { state->window_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->displayID); @@ -1304,10 +1306,7 @@ SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state) if (state->window_flags & SDL_WINDOW_HIGH_PIXEL_DENSITY) { include_high_density_modes = SDL_TRUE; } - fullscreen_mode = SDL_GetClosestFullscreenDisplayMode(state->displayID, state->window_w, state->window_h, state->refresh_rate, include_high_density_modes); - if (fullscreen_mode) { - SDL_memcpy(&state->fullscreen_mode, fullscreen_mode, sizeof(state->fullscreen_mode)); - } + SDL_GetClosestFullscreenDisplayMode(state->displayID, state->window_w, state->window_h, state->refresh_rate, include_high_density_modes, &state->fullscreen_mode); } state->windows = @@ -1622,7 +1621,7 @@ static void SDLTest_PrintEvent(const SDL_Event *event) SDL_Rect rect; SDL_GetWindowSafeArea(SDL_GetWindowFromID(event->window.windowID), &rect); - SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " changed safe area to: %d,%d %dx%d\n", + SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " changed safe area to: %d,%d %dx%d\n", event->window.windowID, rect.x, rect.y, rect.w, rect.h); break; } @@ -2008,7 +2007,7 @@ static void SDLTest_PasteScreenShot(void) for (i = 0; i < SDL_arraysize(image_formats); ++i) { size_t size; - const void *data = SDL_GetClipboardData(image_formats[i], &size); + void *data = SDL_GetClipboardData(image_formats[i], &size); if (data) { char filename[16]; SDL_IOStream *file; @@ -2020,6 +2019,7 @@ static void SDLTest_PasteScreenShot(void) SDL_WriteIO(file, data, size); SDL_CloseIO(file); } + SDL_free(data); return; } } @@ -2029,7 +2029,7 @@ static void SDLTest_PasteScreenShot(void) static void FullscreenTo(SDLTest_CommonState *state, int index, int windowId) { int num_displays; - const SDL_DisplayID *displays; + SDL_DisplayID *displays; SDL_Window *window; SDL_WindowFlags flags; const SDL_DisplayMode *mode; @@ -2060,8 +2060,9 @@ static void FullscreenTo(SDLTest_CommonState *state, int index, int windowId) if (state->window_flags & SDL_WINDOW_HIGH_PIXEL_DENSITY) { include_high_density_modes = SDL_TRUE; } - mode = SDL_GetClosestFullscreenDisplayMode(displays[index], state->window_w, state->window_h, state->refresh_rate, include_high_density_modes); - SDL_SetWindowFullscreenMode(window, mode); + if (SDL_GetClosestFullscreenDisplayMode(displays[index], state->window_w, state->window_h, state->refresh_rate, include_high_density_modes, &new_mode) == 0) { + SDL_SetWindowFullscreenMode(window, &new_mode); + } } } if (!mode) { @@ -2070,6 +2071,7 @@ static void FullscreenTo(SDLTest_CommonState *state, int index, int windowId) SDL_SetWindowFullscreen(window, SDL_TRUE); } } + SDL_free(displays); } int SDLTest_CommonEventMainCallbacks(SDLTest_CommonState *state, const SDL_Event *event) @@ -2270,12 +2272,13 @@ int SDLTest_CommonEventMainCallbacks(SDLTest_CommonState *state, const SDL_Event case SDLK_V: if (withAlt) { /* Alt-V paste awesome text from the primary selection! */ - const char *text = SDL_GetPrimarySelectionText(); + char *text = SDL_GetPrimarySelectionText(); if (*text) { SDL_Log("Primary selection: %s\n", text); } else { SDL_Log("Primary selection is empty\n"); } + SDL_free(text); } else if (withControl) { if (withShift) { @@ -2283,12 +2286,13 @@ int SDLTest_CommonEventMainCallbacks(SDLTest_CommonState *state, const SDL_Event SDLTest_PasteScreenShot(); } else { /* Ctrl-V paste awesome text! */ - const char *text = SDL_GetClipboardText(); + char *text = SDL_GetClipboardText(); if (*text) { SDL_Log("Clipboard: %s\n", text); } else { SDL_Log("Clipboard is empty\n"); } + SDL_free(text); } } break; diff --git a/src/thread/SDL_thread.c b/src/thread/SDL_thread.c index d502c02c4..a34280b38 100644 --- a/src/thread/SDL_thread.c +++ b/src/thread/SDL_thread.c @@ -433,7 +433,7 @@ SDL_ThreadID SDL_GetThreadID(SDL_Thread *thread) const char *SDL_GetThreadName(SDL_Thread *thread) { if (thread) { - return thread->name; + return SDL_GetPersistentString(thread->name); } else { return NULL; } @@ -451,7 +451,7 @@ void SDL_WaitThread(SDL_Thread *thread, int *status) if (status) { *status = thread->status; } - SDL_FreeLater(thread->name); + SDL_free(thread->name); SDL_free(thread); } } diff --git a/src/video/SDL_clipboard.c b/src/video/SDL_clipboard.c index f89ef60f6..559747e76 100644 --- a/src/video/SDL_clipboard.c +++ b/src/video/SDL_clipboard.c @@ -162,7 +162,7 @@ void *SDL_GetInternalClipboardData(SDL_VideoDevice *_this, const char *mime_type return data; } -const void *SDL_GetClipboardData(const char *mime_type, size_t *size) +void *SDL_GetClipboardData(const char *mime_type, size_t *size) { SDL_VideoDevice *_this = SDL_GetVideoDevice(); @@ -184,16 +184,16 @@ const void *SDL_GetClipboardData(const char *mime_type, size_t *size) *size = 0; if (_this->GetClipboardData) { - return SDL_FreeLater(_this->GetClipboardData(_this, mime_type, size)); + return _this->GetClipboardData(_this, mime_type, size); } else if (_this->GetClipboardText && SDL_IsTextMimeType(mime_type)) { char *text = _this->GetClipboardText(_this); if (text && *text == '\0') { SDL_free(text); text = NULL; } - return SDL_FreeLater(text); + return text; } else { - return SDL_FreeLater(SDL_GetInternalClipboardData(_this, mime_type, size)); + return SDL_GetInternalClipboardData(_this, mime_type, size); } } @@ -282,30 +282,30 @@ int SDL_SetClipboardText(const char *text) return SDL_ClearClipboardData(); } -const char *SDL_GetClipboardText(void) +char *SDL_GetClipboardText(void) { SDL_VideoDevice *_this = SDL_GetVideoDevice(); size_t i, num_mime_types; const char **text_mime_types; size_t length; - const char *text = NULL; + char *text = NULL; if (!_this) { SDL_SetError("Video subsystem must be initialized to get clipboard text"); - return ""; + return SDL_strdup(""); } text_mime_types = SDL_GetTextMimeTypes(_this, &num_mime_types); for (i = 0; i < num_mime_types; ++i) { - const void *clipdata = SDL_GetClipboardData(text_mime_types[i], &length); + void *clipdata = SDL_GetClipboardData(text_mime_types[i], &length); if (clipdata) { - text = (const char *)clipdata; + text = (char *)clipdata; break; } } if (!text) { - text = SDL_CreateTemporaryString(""); + text = SDL_strdup(""); } return text; } @@ -356,7 +356,7 @@ int SDL_SetPrimarySelectionText(const char *text) return 0; } -const char *SDL_GetPrimarySelectionText(void) +char *SDL_GetPrimarySelectionText(void) { SDL_VideoDevice *_this = SDL_GetVideoDevice(); @@ -366,13 +366,13 @@ const char *SDL_GetPrimarySelectionText(void) } if (_this->GetPrimarySelectionText) { - return SDL_FreeLater(_this->GetPrimarySelectionText(_this)); + return _this->GetPrimarySelectionText(_this); } else { const char *text = _this->primary_selection_text; if (!text) { text = ""; } - return SDL_CreateTemporaryString(text); + return SDL_strdup(text); } } diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index cd44953e2..49855ab87 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -519,7 +519,7 @@ int SDL_GetNumVideoDrivers(void) const char *SDL_GetVideoDriver(int index) { if (index >= 0 && index < SDL_GetNumVideoDrivers()) { - return SDL_CreateTemporaryString(bootstrap[index]->name); + return bootstrap[index]->name; } return NULL; } @@ -663,7 +663,7 @@ const char *SDL_GetCurrentVideoDriver(void) SDL_UninitializedVideo(); return NULL; } - return SDL_CreateTemporaryString(_this->name); + return _this->name; } SDL_VideoDevice *SDL_GetVideoDevice(void) @@ -698,7 +698,7 @@ static void SDL_UpdateDesktopBounds(void) SDL_Rect rect; SDL_zero(rect); - const SDL_DisplayID *displays = SDL_GetDisplays(NULL); + SDL_DisplayID *displays = SDL_GetDisplays(NULL); if (displays) { for (int i = 0; displays[i]; ++i) { SDL_Rect bounds; @@ -710,6 +710,7 @@ static void SDL_UpdateDesktopBounds(void) } } } + SDL_free(displays); } SDL_copyp(&_this->desktop_bounds, &rect); } @@ -848,7 +849,7 @@ void SDL_DelVideoDisplay(SDL_DisplayID displayID, SDL_bool send_event) SDL_UpdateDesktopBounds(); } -const SDL_DisplayID *SDL_GetDisplays(int *count) +SDL_DisplayID *SDL_GetDisplays(int *count) { int i; SDL_DisplayID *displays; @@ -877,7 +878,7 @@ const SDL_DisplayID *SDL_GetDisplays(int *count) *count = 0; } } - return SDL_FreeLater(displays); + return displays; } SDL_VideoDisplay *SDL_GetVideoDisplay(SDL_DisplayID displayID) @@ -1115,19 +1116,6 @@ static void SDL_UpdateFullscreenDisplayModes(SDL_VideoDisplay *display) } } -static const SDL_DisplayMode *SDL_CreateTemporaryDisplayMode(const SDL_DisplayMode *mode) -{ - SDL_DisplayMode *retval = NULL; - - if (mode) { - retval = (SDL_DisplayMode *)SDL_malloc(sizeof(*retval)); - if (retval) { - SDL_copyp(retval, mode); - } - } - return SDL_FreeLater(retval); -} - // Return the matching mode as a pointer into our current mode list static const SDL_DisplayMode *SDL_GetFullscreenModeMatch(const SDL_DisplayMode *mode) { @@ -1174,16 +1162,6 @@ static const SDL_DisplayMode *SDL_GetFullscreenModeMatch(const SDL_DisplayMode * return mode; } -// Return the window's fullscreen mode as a pointer into our current mode list -static const SDL_DisplayMode *SDL_GetWindowFullscreenModeInternal(SDL_Window *window) -{ - if (window->flags & SDL_WINDOW_FULLSCREEN) { - return SDL_GetFullscreenModeMatch(&window->current_fullscreen_mode); - } else { - return SDL_GetFullscreenModeMatch(&window->requested_fullscreen_mode); - } -} - SDL_bool SDL_AddFullscreenDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode) { SDL_DisplayMode *modes; @@ -1250,7 +1228,7 @@ void SDL_ResetFullscreenDisplayModes(SDL_VideoDisplay *display) display->current_mode = &display->desktop_mode; } -const SDL_DisplayMode * const *SDL_GetFullscreenDisplayModes(SDL_DisplayID displayID, int *count) +SDL_DisplayMode **SDL_GetFullscreenDisplayModes(SDL_DisplayID displayID, int *count) { int i; int num_modes; @@ -1283,17 +1261,21 @@ const SDL_DisplayMode * const *SDL_GetFullscreenDisplayModes(SDL_DisplayID displ *count = 0; } } - return SDL_FreeLater(retval); + return retval; } -const SDL_DisplayMode *SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, SDL_bool include_high_density_modes) +int SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, SDL_bool include_high_density_modes, SDL_DisplayMode *result) { const SDL_DisplayMode *mode, *closest = NULL; float aspect_ratio; int i; SDL_VideoDisplay *display = SDL_GetVideoDisplay(displayID); - CHECK_DISPLAY_MAGIC(display, NULL); + if (result) { + SDL_zerop(result); + } + + CHECK_DISPLAY_MAGIC(display, -1); if (h > 0) { aspect_ratio = (float)w / h; @@ -1340,7 +1322,13 @@ const SDL_DisplayMode *SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID display closest = mode; } - return SDL_CreateTemporaryDisplayMode(closest); + if (!closest) { + return SDL_SetError("Couldn't find any matching video modes"); + } + if (result) { + SDL_copyp(result, closest); + } + return 0; } static SDL_bool DisplayModeChanged(const SDL_DisplayMode *old, const SDL_DisplayMode *new) @@ -1379,7 +1367,7 @@ const SDL_DisplayMode *SDL_GetDesktopDisplayMode(SDL_DisplayID displayID) CHECK_DISPLAY_MAGIC(display, NULL); - return SDL_CreateTemporaryDisplayMode(&display->desktop_mode); + return &display->desktop_mode; } void SDL_SetCurrentDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode) @@ -1408,7 +1396,7 @@ const SDL_DisplayMode *SDL_GetCurrentDisplayMode(SDL_DisplayID displayID) /* Make sure our mode list is updated */ SDL_UpdateFullscreenDisplayModes(display); - return SDL_CreateTemporaryDisplayMode(display->current_mode); + return display->current_mode; } int SDL_SetDisplayModeForDisplay(SDL_VideoDisplay *display, SDL_DisplayMode *mode) @@ -1771,7 +1759,7 @@ int SDL_UpdateFullscreenMode(SDL_Window *window, SDL_FullscreenOp fullscreen, SD } if (fullscreen) { - mode = (SDL_DisplayMode *)SDL_GetWindowFullscreenModeInternal(window); + mode = (SDL_DisplayMode *)SDL_GetWindowFullscreenMode(window); if (mode) { window->fullscreen_exclusive = SDL_TRUE; } else { @@ -2014,23 +2002,23 @@ int SDL_SetWindowFullscreenMode(SDL_Window *window, const SDL_DisplayMode *mode) const SDL_DisplayMode *SDL_GetWindowFullscreenMode(SDL_Window *window) { - const SDL_DisplayMode *retval; - CHECK_WINDOW_MAGIC(window, NULL); CHECK_WINDOW_NOT_POPUP(window, NULL); - retval = SDL_GetWindowFullscreenModeInternal(window); - - return SDL_CreateTemporaryDisplayMode(retval); + if (window->flags & SDL_WINDOW_FULLSCREEN) { + return SDL_GetFullscreenModeMatch(&window->current_fullscreen_mode); + } else { + return SDL_GetFullscreenModeMatch(&window->requested_fullscreen_mode); + } } -const void *SDL_GetWindowICCProfile(SDL_Window *window, size_t *size) +void *SDL_GetWindowICCProfile(SDL_Window *window, size_t *size) { if (!_this->GetWindowICCProfile) { SDL_Unsupported(); return NULL; } - return SDL_FreeLater(_this->GetWindowICCProfile(_this, window, size)); + return _this->GetWindowICCProfile(_this, window, size); } SDL_PixelFormat SDL_GetWindowPixelFormat(SDL_Window *window) @@ -2080,7 +2068,7 @@ void SDL_ToggleDragAndDropSupport(void) } } -SDL_Window * const *SDLCALL SDL_GetWindows(int *count) +SDL_Window **SDLCALL SDL_GetWindows(int *count) { if (count) { *count = 0; @@ -2115,7 +2103,7 @@ SDL_Window * const *SDLCALL SDL_GetWindows(int *count) if (count) { *count = num_added; } - return SDL_FreeLater(windows); + return windows; } static void ApplyWindowFlags(SDL_Window *window, SDL_WindowFlags flags) @@ -3033,7 +3021,7 @@ int SDL_GetWindowSizeInPixels(SDL_Window *window, int *w, int *h) SDL_GetWindowSize(window, w, h); - if ((window->flags & SDL_WINDOW_FULLSCREEN) && SDL_GetWindowFullscreenModeInternal(window)) { + if ((window->flags & SDL_WINDOW_FULLSCREEN) && SDL_GetWindowFullscreenMode(window)) { mode = SDL_GetCurrentDisplayMode(displayID); } else { mode = SDL_GetDesktopDisplayMode(displayID); @@ -3786,7 +3774,6 @@ void SDL_OnWindowDisplayChanged(SDL_Window *window) { if (window->flags & SDL_WINDOW_FULLSCREEN) { SDL_DisplayID displayID = SDL_GetDisplayForWindowPosition(window); - const SDL_DisplayMode *new_mode = NULL; if (window->requested_fullscreen_mode.w != 0 || window->requested_fullscreen_mode.h != 0) { SDL_bool include_high_density_modes = SDL_FALSE; @@ -3794,11 +3781,7 @@ void SDL_OnWindowDisplayChanged(SDL_Window *window) if (window->requested_fullscreen_mode.pixel_density > 1.0f) { include_high_density_modes = SDL_TRUE; } - new_mode = SDL_GetClosestFullscreenDisplayMode(displayID, window->requested_fullscreen_mode.w, window->requested_fullscreen_mode.h, window->requested_fullscreen_mode.refresh_rate, include_high_density_modes); - } - - if (new_mode) { - SDL_copyp(&window->current_fullscreen_mode, new_mode); + SDL_GetClosestFullscreenDisplayMode(displayID, window->requested_fullscreen_mode.w, window->requested_fullscreen_mode.h, window->requested_fullscreen_mode.refresh_rate, include_high_density_modes, &window->current_fullscreen_mode); } else { SDL_zero(window->current_fullscreen_mode); } diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 5cfeb7091..7dc8ae50f 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -1803,7 +1803,7 @@ static int Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL_ } if (existingTouchCount == 0) { int numFingers; - const SDL_Finger * const *fingers = SDL_GetTouchFingers(touchID, &numFingers); + SDL_Finger **fingers = SDL_GetTouchFingers(touchID, &numFingers); if (fingers) { DLog("Reset Lost Fingers: %d", numFingers); for (--numFingers; numFingers >= 0; --numFingers) { @@ -1816,6 +1816,7 @@ static int Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL_ SDL_Window *window = NULL; SDL_SendTouch(Cocoa_GetEventTimestamp([theEvent timestamp]), touchID, finger->id, window, SDL_FALSE, 0, 0, 0); } + SDL_free(fingers); } } diff --git a/src/video/kmsdrm/SDL_kmsdrmmouse.c b/src/video/kmsdrm/SDL_kmsdrmmouse.c index 16be026e3..2b9a796df 100644 --- a/src/video/kmsdrm/SDL_kmsdrmmouse.c +++ b/src/video/kmsdrm/SDL_kmsdrmmouse.c @@ -315,13 +315,14 @@ static int KMSDRM_ShowCursor(SDL_Cursor *cursor) This happens on video quit, where we get here after the mouse focus has been unset, yet SDL wants to restore the system default cursor (makes no sense here). */ - const SDL_DisplayID *displays = SDL_GetDisplays(NULL); + SDL_DisplayID *displays = SDL_GetDisplays(NULL); if (displays) { /* Iterate on the displays, hiding the cursor. */ for (i = 0; i < displays[i]; i++) { display = SDL_GetVideoDisplay(displays[i]); ret = KMSDRM_RemoveCursorFromBO(display); } + SDL_free(displays); } } else { display = SDL_GetVideoDisplayForWindow(window); diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c index 32adfa28f..513043b2d 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -514,12 +514,11 @@ static drmModeModeInfo *KMSDRM_GetClosestDisplayMode(SDL_VideoDisplay *display, SDL_DisplayData *dispdata = display->internal; drmModeConnector *connector = dispdata->connector; - const SDL_DisplayMode *closest; + SDL_DisplayMode closest; drmModeModeInfo *drm_mode; - closest = SDL_GetClosestFullscreenDisplayMode(display->id, width, height, 0.0f, SDL_FALSE); - if (closest) { - const SDL_DisplayModeData *modedata = closest->internal; + if (SDL_GetClosestFullscreenDisplayMode(display->id, width, height, 0.0f, SDL_FALSE, &closest) == 0) { + const SDL_DisplayModeData *modedata = closest.internal; drm_mode = &connector->modes[modedata->mode_index]; return drm_mode; } else { @@ -535,7 +534,7 @@ static drmModeModeInfo *KMSDRM_GetClosestDisplayMode(SDL_VideoDisplay *display, /* Deinitializes the internal of the SDL Displays in the SDL display list. */ static void KMSDRM_DeinitDisplays(SDL_VideoDevice *_this) { - const SDL_DisplayID *displays; + SDL_DisplayID *displays; SDL_DisplayData *dispdata; int i; @@ -559,6 +558,7 @@ static void KMSDRM_DeinitDisplays(SDL_VideoDevice *_this) dispdata->crtc = NULL; } } + SDL_free(displays); } } diff --git a/src/video/uikit/SDL_uikitmodes.m b/src/video/uikit/SDL_uikitmodes.m index 80f9c9477..50d672201 100644 --- a/src/video/uikit/SDL_uikitmodes.m +++ b/src/video/uikit/SDL_uikitmodes.m @@ -310,7 +310,7 @@ int UIKit_AddDisplay(SDL_bool send_event){ void UIKit_DelDisplay(UIScreen *uiscreen, SDL_bool send_event) { - const SDL_DisplayID *displays; + SDL_DisplayID *displays; int i; displays = SDL_GetDisplays(NULL); @@ -326,6 +326,7 @@ void UIKit_DelDisplay(UIScreen *uiscreen, SDL_bool send_event) break; } } + SDL_free(displays); } } diff --git a/src/video/uikit/SDL_uikitwindow.m b/src/video/uikit/SDL_uikitwindow.m index d105e5905..9102de5f7 100644 --- a/src/video/uikit/SDL_uikitwindow.m +++ b/src/video/uikit/SDL_uikitwindow.m @@ -172,20 +172,19 @@ int UIKit_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Propertie #if !defined(SDL_PLATFORM_TVOS) && !defined(SDL_PLATFORM_VISIONOS) const CGSize origsize = data.uiscreen.currentMode.size; if ((origsize.width == 0.0f) && (origsize.height == 0.0f)) { - const SDL_DisplayMode *bestmode; + SDL_DisplayMode bestmode; SDL_bool include_high_density_modes = SDL_FALSE; if (window->flags & SDL_WINDOW_HIGH_PIXEL_DENSITY) { include_high_density_modes = SDL_TRUE; } - bestmode = SDL_GetClosestFullscreenDisplayMode(display->id, window->w, window->h, 0.0f, include_high_density_modes); - if (bestmode) { - SDL_UIKitDisplayModeData *modedata = (__bridge SDL_UIKitDisplayModeData *)bestmode->internal; + if (SDL_GetClosestFullscreenDisplayMode(display->id, window->w, window->h, 0.0f, include_high_density_modes, &bestmode) == 0) { + SDL_UIKitDisplayModeData *modedata = (__bridge SDL_UIKitDisplayModeData *)bestmode.internal; [data.uiscreen setCurrentMode:modedata.uiscreenmode]; /* desktop_mode doesn't change here (the higher level will * use it to set all the screens back to their defaults * upon window destruction, SDL_Quit(), etc. */ - SDL_SetCurrentDisplayMode(display, bestmode); + SDL_SetCurrentDisplayMode(display, &bestmode); } } diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c index a962f5c43..986275ecd 100644 --- a/src/video/wayland/SDL_waylandwindow.c +++ b/src/video/wayland/SDL_waylandwindow.c @@ -516,7 +516,7 @@ static void Wayland_move_window(SDL_Window *window) { SDL_WindowData *wind = window->internal; SDL_DisplayData *display; - const SDL_DisplayID *displays; + SDL_DisplayID *displays; if (wind->outputs && wind->num_outputs) { display = wind->outputs[wind->num_outputs - 1]; @@ -559,6 +559,7 @@ static void Wayland_move_window(SDL_Window *window) break; } } + SDL_free(displays); } } diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index de87e9e35..bdd19c8c2 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -867,11 +867,11 @@ void WIN_CheckKeyboardAndMouseHotplug(SDL_VideoDevice *_this, SDL_bool initial_c PRAWINPUTDEVICELIST raw_devices = NULL; UINT raw_device_count = 0; int old_keyboard_count = 0; - const SDL_KeyboardID *old_keyboards = NULL; + SDL_KeyboardID *old_keyboards = NULL; int new_keyboard_count = 0; SDL_KeyboardID *new_keyboards = NULL; int old_mouse_count = 0; - const SDL_MouseID *old_mice = NULL; + SDL_MouseID *old_mice = NULL; int new_mouse_count = 0; SDL_MouseID *new_mice = NULL; SDL_bool send_event = !initial_check; @@ -982,7 +982,9 @@ void WIN_CheckKeyboardAndMouseHotplug(SDL_VideoDevice *_this, SDL_bool initial_c } } + SDL_free(old_keyboards); SDL_free(new_keyboards); + SDL_free(old_mice); SDL_free(new_mice); SetupDiDestroyDeviceInfoList(devinfo); diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c index 9419f7730..d830123bf 100644 --- a/src/video/x11/SDL_x11modes.c +++ b/src/video/x11/SDL_x11modes.c @@ -686,7 +686,7 @@ static int X11_UpdateXRandRDisplay(SDL_VideoDevice *_this, Display *dpy, int scr static void X11_HandleXRandROutputChange(SDL_VideoDevice *_this, const XRROutputChangeNotifyEvent *ev) { - const SDL_DisplayID *displays; + SDL_DisplayID *displays; SDL_VideoDisplay *display = NULL; int i; @@ -704,6 +704,7 @@ static void X11_HandleXRandROutputChange(SDL_VideoDevice *_this, const XRROutput break; } } + SDL_free(displays); } if (ev->connection == RR_Disconnected) { /* output is going away */ diff --git a/src/video/x11/SDL_x11mouse.c b/src/video/x11/SDL_x11mouse.c index 1e11a9eb8..3bb88b064 100644 --- a/src/video/x11/SDL_x11mouse.c +++ b/src/video/x11/SDL_x11mouse.c @@ -418,7 +418,7 @@ static int X11_CaptureMouse(SDL_Window *window) static SDL_MouseButtonFlags X11_GetGlobalMouseState(float *x, float *y) { SDL_VideoData *videodata = SDL_GetVideoDevice()->internal; - const SDL_DisplayID *displays; + SDL_DisplayID *displays; Display *display = GetDisplay(); int i; @@ -460,6 +460,7 @@ static SDL_MouseButtonFlags X11_GetGlobalMouseState(float *x, float *y) } } } + SDL_free(displays); } } diff --git a/src/video/x11/SDL_x11xinput2.c b/src/video/x11/SDL_x11xinput2.c index 9ab979f0f..df96499fd 100644 --- a/src/video/x11/SDL_x11xinput2.c +++ b/src/video/x11/SDL_x11xinput2.c @@ -725,6 +725,30 @@ static SDL_bool HasDeviceID(Uint32 deviceID, const Uint32 *list, int count) return SDL_FALSE; } +static void AddDeviceID64(Uint64 deviceID, Uint64 **list, int *count) +{ + int new_count = (*count + 1); + Uint64 *new_list = (Uint64 *)SDL_realloc(*list, new_count * sizeof(*new_list)); + if (!new_list) { + /* Oh well, we'll drop this one */ + return; + } + new_list[new_count - 1] = deviceID; + + *count = new_count; + *list = new_list; +} + +static SDL_bool HasDeviceID64(Uint64 deviceID, const Uint64 *list, int count) +{ + for (int i = 0; i < count; ++i) { + if (deviceID == list[i]) { + return SDL_TRUE; + } + } + return SDL_FALSE; +} + #endif // SDL_VIDEO_DRIVER_X11_XINPUT2 void X11_Xinput2UpdateDevices(SDL_VideoDevice *_this, SDL_bool initial_check) @@ -734,18 +758,17 @@ void X11_Xinput2UpdateDevices(SDL_VideoDevice *_this, SDL_bool initial_check) XIDeviceInfo *info; int ndevices; int old_keyboard_count = 0; - const SDL_KeyboardID *old_keyboards = NULL; + SDL_KeyboardID *old_keyboards = NULL; int new_keyboard_count = 0; SDL_KeyboardID *new_keyboards = NULL; int old_mouse_count = 0; - const SDL_MouseID *old_mice = NULL; + SDL_MouseID *old_mice = NULL; int new_mouse_count = 0; SDL_MouseID *new_mice = NULL; int old_touch_count = 0; - const SDL_TouchID *old_touch_devices64 = NULL; - Uint32 *old_touch_devices = NULL; + Uint64 *old_touch_devices = NULL; int new_touch_count = 0; - Uint32 *new_touch_devices = NULL; + Uint64 *new_touch_devices = NULL; SDL_bool send_event = !initial_check; SDL_assert(X11_Xinput2IsInitialized()); @@ -754,17 +777,7 @@ void X11_Xinput2UpdateDevices(SDL_VideoDevice *_this, SDL_bool initial_check) old_keyboards = SDL_GetKeyboards(&old_keyboard_count); old_mice = SDL_GetMice(&old_mouse_count); - - /* SDL_TouchID is 64-bit, but our helper functions take Uint32 */ - old_touch_devices64 = SDL_GetTouchDevices(&old_touch_count); - if (old_touch_count > 0) { - old_touch_devices = (Uint32 *)SDL_malloc(old_touch_count * sizeof(*old_touch_devices)); - if (old_touch_devices) { - for (int i = 0; i < old_touch_count; ++i) { - old_touch_devices[i] = (Uint32)old_touch_devices64[i]; - } - } - } + old_touch_devices = SDL_GetTouchDevices(&old_touch_count); for (int i = 0; i < ndevices; i++) { XIDeviceInfo *dev = &info[i]; @@ -796,7 +809,7 @@ void X11_Xinput2UpdateDevices(SDL_VideoDevice *_this, SDL_bool initial_check) #ifdef SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH for (int j = 0; j < dev->num_classes; j++) { - Uint32 touchID; + Uint64 touchID; SDL_TouchDeviceType touchType; XIAnyClassInfo *class = dev->classes[j]; XITouchClassInfo *t = (XITouchClassInfo *)class; @@ -806,9 +819,9 @@ void X11_Xinput2UpdateDevices(SDL_VideoDevice *_this, SDL_bool initial_check) continue; } - touchID = (Uint32)t->sourceid; - AddDeviceID(touchID, &new_touch_devices, &new_touch_count); - if (!HasDeviceID(touchID, old_touch_devices, old_touch_count)) { + touchID = (Uint64)t->sourceid; + AddDeviceID64(touchID, &new_touch_devices, &new_touch_count); + if (!HasDeviceID64(touchID, old_touch_devices, old_touch_count)) { if (t->mode == XIDependentTouch) { touchType = SDL_TOUCH_DEVICE_INDIRECT_RELATIVE; } else { /* XIDirectTouch */ @@ -833,12 +846,14 @@ void X11_Xinput2UpdateDevices(SDL_VideoDevice *_this, SDL_bool initial_check) } for (int i = old_touch_count; i--;) { - if (!HasDeviceID(old_touch_devices[i], new_touch_devices, new_touch_count)) { + if (!HasDeviceID64(old_touch_devices[i], new_touch_devices, new_touch_count)) { SDL_DelTouch(old_touch_devices[i]); } } + SDL_free(old_keyboards); SDL_free(new_keyboards); + SDL_free(old_mice); SDL_free(new_mice); SDL_free(old_touch_devices); SDL_free(new_touch_devices); diff --git a/test/gamepadutils.c b/test/gamepadutils.c index 887c83fc7..562a9e0cb 100644 --- a/test/gamepadutils.c +++ b/test/gamepadutils.c @@ -416,12 +416,13 @@ void UpdateGamepadImageFromGamepad(GamepadImage *ctx, SDL_Gamepad *gamepad) } ctx->type = SDL_GetGamepadType(gamepad); - const char *mapping = SDL_GetGamepadMapping(gamepad); + char *mapping = SDL_GetGamepadMapping(gamepad); if (mapping) { if (SDL_strstr(mapping, "SDL_GAMECONTROLLER_USE_BUTTON_LABELS")) { /* Just for display purposes */ ctx->type = SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO; } + SDL_free(mapping); } for (i = 0; i < SDL_GAMEPAD_BUTTON_TOUCHPAD; ++i) { @@ -1021,7 +1022,7 @@ void RenderGamepadDisplay(GamepadDisplay *ctx, SDL_Gamepad *gamepad) const float arrow_extent = 48.0f; SDL_FRect dst, rect, highlight; Uint8 r, g, b, a; - const char *mapping = NULL; + char *mapping; SDL_bool has_accel; SDL_bool has_gyro; @@ -1285,6 +1286,7 @@ void RenderGamepadDisplay(GamepadDisplay *ctx, SDL_Gamepad *gamepad) } } } + SDL_free(mapping); } void DestroyGamepadDisplay(GamepadDisplay *ctx) diff --git a/test/pretest.c b/test/pretest.c index 66c2e3673..9d81f8733 100644 --- a/test/pretest.c +++ b/test/pretest.c @@ -27,7 +27,7 @@ int main(int argc, char *argv[]) (void)argv; SDL_Init(0); start = SDL_GetTicks(); - SDL_GetPrefPath("libsdl", "test_filesystem"); + SDL_free(SDL_GetPrefPath("libsdl", "test_filesystem")); prequit = SDL_GetTicks(); SDL_Log("SDL_GetPrefPath took %" SDL_PRIu64 "ms", prequit - start); SDL_Quit(); diff --git a/test/testaudioinfo.c b/test/testaudioinfo.c index f389e41b0..a32268761 100644 --- a/test/testaudioinfo.c +++ b/test/testaudioinfo.c @@ -20,7 +20,7 @@ print_devices(SDL_bool recording) const char *typestr = (recording ? "recording" : "playback"); int n = 0; int frames; - const SDL_AudioDeviceID *devices = recording ? SDL_GetAudioRecordingDevices(&n) : SDL_GetAudioPlaybackDevices(&n); + SDL_AudioDeviceID *devices = recording ? SDL_GetAudioRecordingDevices(&n) : SDL_GetAudioPlaybackDevices(&n); if (!devices) { SDL_Log(" Driver failed to report %s devices: %s\n\n", typestr, SDL_GetError()); @@ -46,6 +46,7 @@ print_devices(SDL_bool recording) } SDL_Log("\n"); } + SDL_free(devices); } int main(int argc, char **argv) diff --git a/test/testaudiorecording.c b/test/testaudiorecording.c index 214d6d040..b983143c4 100644 --- a/test/testaudiorecording.c +++ b/test/testaudiorecording.c @@ -23,7 +23,7 @@ static SDLTest_CommonState *state = NULL; int SDL_AppInit(void **appstate, int argc, char **argv) { - const SDL_AudioDeviceID *devices; + SDL_AudioDeviceID *devices; SDL_AudioSpec outspec; SDL_AudioSpec inspec; SDL_AudioDeviceID device; @@ -103,6 +103,7 @@ int SDL_AppInit(void **appstate, int argc, char **argv) device = SDL_OpenAudioDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, NULL); if (!device) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for playback: %s!\n", SDL_GetError()); + SDL_free(devices); return SDL_APP_FAILURE; } SDL_PauseAudioDevice(device); @@ -110,9 +111,11 @@ int SDL_AppInit(void **appstate, int argc, char **argv) stream_out = SDL_CreateAudioStream(&outspec, &outspec); if (!stream_out) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create an audio stream for playback: %s!\n", SDL_GetError()); + SDL_free(devices); return SDL_APP_FAILURE; } else if (SDL_BindAudioStream(device, stream_out) == -1) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't bind an audio stream for playback: %s!\n", SDL_GetError()); + SDL_free(devices); return SDL_APP_FAILURE; } @@ -124,8 +127,10 @@ int SDL_AppInit(void **appstate, int argc, char **argv) device = SDL_OpenAudioDevice(want_device, NULL); if (!device) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for recording: %s!\n", SDL_GetError()); + SDL_free(devices); return SDL_APP_FAILURE; } + SDL_free(devices); SDL_PauseAudioDevice(device); SDL_GetAudioDeviceFormat(device, &inspec, NULL); stream_in = SDL_CreateAudioStream(&inspec, &inspec); diff --git a/test/testautomation_audio.c b/test/testautomation_audio.c index a61c58fe4..8ff197492 100644 --- a/test/testautomation_audio.c +++ b/test/testautomation_audio.c @@ -366,7 +366,7 @@ static int audio_enumerateAndNameAudioDevices(void *arg) int t; int i, n; const char *name; - const SDL_AudioDeviceID *devices = NULL; + SDL_AudioDeviceID *devices; /* Iterate over types: t=0 playback device, t=1 recording device */ for (t = 0; t < 2; t++) { @@ -388,6 +388,7 @@ static int audio_enumerateAndNameAudioDevices(void *arg) } } } + SDL_free(devices); } return TEST_COMPLETED; diff --git a/test/testautomation_clipboard.c b/test/testautomation_clipboard.c index 3af66c645..1b67434f1 100644 --- a/test/testautomation_clipboard.c +++ b/test/testautomation_clipboard.c @@ -86,9 +86,9 @@ static int clipboard_testClipboardDataFunctions(void *arg) int last_clipboard_update_count; int last_clipboard_callback_count; int last_clipboard_cleanup_count; - const void *data; + void *data; size_t size; - const char *text; + char *text; const char *expected_text; TestClipboardData test_data1 = { @@ -163,11 +163,12 @@ static int clipboard_testClipboardDataFunctions(void *arg) clipboard_cleanup_count - last_clipboard_cleanup_count); expected_text = "TEST"; - text = (char *) SDL_GetClipboardText(); + text = SDL_GetClipboardText(); SDLTest_AssertCheck( text && SDL_strcmp(text, expected_text) == 0, "Verify clipboard text, expected \"%s\", got \"%s\"", expected_text, text); + SDL_free(text); boolResult = SDL_HasClipboardData(test_mime_types[TEST_MIME_TYPE_TEXT]); SDLTest_AssertCheck( @@ -186,6 +187,7 @@ static int clipboard_testClipboardDataFunctions(void *arg) size == SDL_strlen(expected_text), "Verify test text size, expected %d, got %d", (int)SDL_strlen(expected_text), (int)size); + SDL_free(text); expected_text = "CUSTOM"; boolResult = SDL_HasClipboardData(test_mime_types[TEST_MIME_TYPE_CUSTOM_TEXT]); @@ -205,6 +207,7 @@ static int clipboard_testClipboardDataFunctions(void *arg) size == SDL_strlen(expected_text), "Verify test text size, expected %d, got %d", (int)SDL_strlen(expected_text), (int)size); + SDL_free(text); boolResult = SDL_HasClipboardData(test_mime_types[TEST_MIME_TYPE_DATA]); SDLTest_AssertCheck( @@ -218,6 +221,7 @@ static int clipboard_testClipboardDataFunctions(void *arg) size == test_data1.data_size, "Verify test data size, expected %d, got %d", (int)test_data1.data_size, (int)size); + SDL_free(data); boolResult = SDL_HasClipboardData("test/invalid"); SDLTest_AssertCheck( @@ -232,6 +236,7 @@ static int clipboard_testClipboardDataFunctions(void *arg) size == 0, "Verify invalid data size, expected 0, got %d", (int)size); + SDL_free(data); #if 0 /* There's no guarantee how or when the callback is called */ SDLTest_AssertCheck( @@ -260,11 +265,12 @@ static int clipboard_testClipboardDataFunctions(void *arg) clipboard_cleanup_count - last_clipboard_cleanup_count); expected_text = "TEST"; - text = (char *) SDL_GetClipboardText(); + text = SDL_GetClipboardText(); SDLTest_AssertCheck( text && SDL_strcmp(text, expected_text) == 0, "Verify clipboard text, expected \"%s\", got \"%s\"", expected_text, text); + SDL_free(text); boolResult = SDL_HasClipboardData(test_mime_types[TEST_MIME_TYPE_TEXT]); SDLTest_AssertCheck( @@ -283,6 +289,7 @@ static int clipboard_testClipboardDataFunctions(void *arg) size == SDL_strlen(expected_text), "Verify test text size, expected %d, got %d", (int)SDL_strlen(expected_text), (int)size); + SDL_free(text); expected_text = "CUSTOM"; boolResult = SDL_HasClipboardData(test_mime_types[TEST_MIME_TYPE_CUSTOM_TEXT]); @@ -302,6 +309,7 @@ static int clipboard_testClipboardDataFunctions(void *arg) size == SDL_strlen(expected_text), "Verify test text size, expected %d, got %d", (int)SDL_strlen(expected_text), (int)size); + SDL_free(text); data = SDL_GetClipboardData(test_mime_types[TEST_MIME_TYPE_DATA], &size); SDLTest_AssertCheck( @@ -311,6 +319,7 @@ static int clipboard_testClipboardDataFunctions(void *arg) size == test_data2.data_size, "Verify test data size, expected %d, got %d", (int)test_data2.data_size, (int)size); + SDL_free(data); data = SDL_GetClipboardData("test/invalid", &size); SDLTest_AssertCheck( @@ -321,6 +330,7 @@ static int clipboard_testClipboardDataFunctions(void *arg) size == 0, "Verify invalid data size, expected 0, got %d", (int)size); + SDL_free(data); #if 0 /* There's no guarantee how or when the callback is called */ SDLTest_AssertCheck( @@ -376,7 +386,7 @@ static int clipboard_testClipboardTextFunctions(void *arg) char *text = SDL_strdup(textRef); SDL_bool boolResult; int intResult; - const char *charResult; + char *charResult; int last_clipboard_update_count; SDL_AddEventWatch(ClipboardEventWatch, NULL); @@ -393,6 +403,7 @@ static int clipboard_testClipboardTextFunctions(void *arg) charResult && SDL_strcmp(charResult, "") == 0, "Verify SDL_GetClipboardText returned \"\", got %s", charResult); + SDL_free(charResult); boolResult = SDL_HasClipboardText(); SDLTest_AssertCheck( boolResult == SDL_FALSE, @@ -425,6 +436,7 @@ static int clipboard_testClipboardTextFunctions(void *arg) charResult && SDL_strcmp(textRef, charResult) == 0, "Verify SDL_GetClipboardText returned correct string, expected '%s', got '%s'", textRef, charResult); + SDL_free(charResult); SDLTest_AssertCheck( clipboard_update_count == last_clipboard_update_count + 1, "Verify clipboard update count incremented by 1, got %d", @@ -458,7 +470,7 @@ static int clipboard_testPrimarySelectionTextFunctions(void *arg) char *text = SDL_strdup(textRef); SDL_bool boolResult; int intResult; - const char *charResult; + char *charResult; int last_clipboard_update_count; SDL_AddEventWatch(ClipboardEventWatch, NULL); @@ -475,6 +487,7 @@ static int clipboard_testPrimarySelectionTextFunctions(void *arg) charResult && SDL_strcmp(charResult, "") == 0, "Verify SDL_GetPrimarySelectionText returned \"\", got %s", charResult); + SDL_free(charResult); boolResult = SDL_HasPrimarySelectionText(); SDLTest_AssertCheck( boolResult == SDL_FALSE, @@ -506,6 +519,7 @@ static int clipboard_testPrimarySelectionTextFunctions(void *arg) charResult && SDL_strcmp(textRef, charResult) == 0, "Verify SDL_GetPrimarySelectionText returned correct string, expected '%s', got '%s'", textRef, charResult); + SDL_free(charResult); SDLTest_AssertCheck( clipboard_update_count == last_clipboard_update_count + 1, "Verify clipboard update count incremented by 1, got %d", diff --git a/test/testautomation_events.c b/test/testautomation_events.c index 92438a052..14418f76c 100644 --- a/test/testautomation_events.c +++ b/test/testautomation_events.c @@ -175,67 +175,6 @@ static int events_addDelEventWatchWithUserdata(void *arg) return TEST_COMPLETED; } -/** - * Creates and validates temporary event memory - */ -static int events_temporaryMemory(void *arg) -{ - SDL_Event event; - void *mem, *claimed, *tmp; - SDL_bool found; - - { - /* Create and claim event memory */ - mem = SDL_AllocateTemporaryMemory(1); - SDLTest_AssertCheck(mem != NULL, "SDL_AllocateTemporaryMemory()"); - *(char *)mem = '1'; - - claimed = SDL_ClaimTemporaryMemory(mem); - SDLTest_AssertCheck(claimed != NULL, "SDL_ClaimTemporaryMemory() returned a valid pointer"); - - /* Verify that we can't claim it again */ - tmp = SDL_ClaimTemporaryMemory(mem); - SDLTest_AssertCheck(tmp == NULL, "SDL_ClaimTemporaryMemory() can't claim memory twice"); - - /* Clean up */ - SDL_free(claimed); - } - - { - /* Create event memory and queue it */ - mem = SDL_AllocateTemporaryMemory(1); - SDLTest_AssertCheck(mem != NULL, "SDL_AllocateTemporaryMemory()"); - *(char *)mem = '2'; - - SDL_zero(event); - event.type = SDL_EVENT_USER; - event.user.data1 = mem; - SDL_PushEvent(&event); - - /* Verify that we can't claim the memory once it's on the queue */ - claimed = SDL_ClaimTemporaryMemory(mem); - SDLTest_AssertCheck(claimed == NULL, "SDL_ClaimTemporaryMemory() can't claim memory on the event queue"); - - /* Get the event and verify the memory is valid */ - found = SDL_FALSE; - while (SDL_PollEvent(&event)) { - if (event.type == SDL_EVENT_USER && event.user.data1 == mem) { - found = SDL_TRUE; - } - } - SDLTest_AssertCheck(found, "SDL_PollEvent() returned queued event"); - - /* Verify that we can claim the memory now that we've dequeued it */ - claimed = SDL_ClaimTemporaryMemory(mem); - SDLTest_AssertCheck(claimed != NULL, "SDL_ClaimTemporaryMemory() can claim memory after dequeuing event"); - - /* Clean up */ - SDL_free(claimed); - } - - return TEST_COMPLETED; -} - /* ================= Test References ================== */ /* Events test cases */ @@ -251,13 +190,9 @@ static const SDLTest_TestCaseReference eventsTest3 = { (SDLTest_TestCaseFp)events_addDelEventWatchWithUserdata, "events_addDelEventWatchWithUserdata", "Adds and deletes an event watch function with userdata", TEST_ENABLED }; -static const SDLTest_TestCaseReference eventsTestTemporaryMemory = { - (SDLTest_TestCaseFp)events_temporaryMemory, "events_temporaryMemory", "Creates and validates temporary event memory", TEST_ENABLED -}; - /* Sequence of Events test cases */ static const SDLTest_TestCaseReference *eventsTests[] = { - &eventsTest1, &eventsTest2, &eventsTest3, &eventsTestTemporaryMemory, NULL + &eventsTest1, &eventsTest2, &eventsTest3, NULL }; /* Events test suite (global) */ diff --git a/test/testautomation_guid.c b/test/testautomation_guid.c index b2fe4d8a4..55eaebb51 100644 --- a/test/testautomation_guid.c +++ b/test/testautomation_guid.c @@ -106,13 +106,13 @@ TestGUIDToString(void *arg) SDLTest_AssertPass("Call to SDL_GUIDToString"); for (i = 0; i < NUM_TEST_GUIDS; ++i) { - const char *guid_str; + char guid_str[33]; SDL_GUID guid; upper_lower_to_bytestring(guid.data, test_guids[i].upper, test_guids[i].lower); - guid_str = SDL_GUIDToString(guid); + SDL_GUIDToString(guid, guid_str, sizeof(guid_str)); SDLTest_AssertCheck(SDL_strcmp(guid_str, test_guids[i].str) == 0, "Checking whether strings match, expected %s, got %s\n", test_guids[i].str, guid_str); } diff --git a/test/testautomation_joystick.c b/test/testautomation_joystick.c index a97ce55c7..64fc550e1 100644 --- a/test/testautomation_joystick.c +++ b/test/testautomation_joystick.c @@ -64,13 +64,15 @@ static int TestVirtualJoystick(void *arg) gamepad = SDL_OpenGamepad(SDL_GetJoystickID(joystick)); SDLTest_AssertCheck(gamepad != NULL, "SDL_OpenGamepad() succeeded"); if (gamepad) { - SDLTest_AssertCheck(SDL_strcmp(SDL_GetGamepadName(gamepad), desc.name) == 0, "SDL_GetGamepadName()"); + const char *name = SDL_GetGamepadName(gamepad); + SDLTest_AssertCheck(name && SDL_strcmp(name, desc.name) == 0, "SDL_GetGamepadName()"); SDLTest_AssertCheck(SDL_GetGamepadVendor(gamepad) == desc.vendor_id, "SDL_GetGamepadVendor()"); SDLTest_AssertCheck(SDL_GetGamepadProduct(gamepad) == desc.product_id, "SDL_GetGamepadProduct()"); /* Set an explicit mapping with a different name */ SDL_SetGamepadMapping(SDL_GetJoystickID(joystick), "ff0013db5669727475616c2043007601,Virtual Gamepad,a:b0,b:b1,x:b2,y:b3,back:b4,guide:b5,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b9,rightshoulder:b10,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,misc1:b15,paddle1:b16,paddle2:b17,paddle3:b18,paddle4:b19,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,"); - SDLTest_AssertCheck(SDL_strcmp(SDL_GetGamepadName(gamepad), "Virtual Gamepad") == 0, "SDL_GetGamepadName() == Virtual Gamepad"); + name = SDL_GetGamepadName(gamepad); + SDLTest_AssertCheck(name && SDL_strcmp(name, "Virtual Gamepad") == 0, "SDL_GetGamepadName() == Virtual Gamepad"); SDLTest_AssertCheck(SDL_GetGamepadButtonLabel(gamepad, SDL_GAMEPAD_BUTTON_SOUTH) == SDL_GAMEPAD_BUTTON_LABEL_A, "SDL_GetGamepadButtonLabel(SDL_GAMEPAD_BUTTON_SOUTH) == SDL_GAMEPAD_BUTTON_LABEL_A"); /* Set the south button and verify that the gamepad responds */ @@ -84,7 +86,8 @@ static int TestVirtualJoystick(void *arg) /* Set an explicit mapping with legacy Nintendo style buttons */ SDL_SetGamepadMapping(SDL_GetJoystickID(joystick), "ff0013db5669727475616c2043007601,Virtual Nintendo Gamepad,a:b1,b:b0,x:b3,y:b2,back:b4,guide:b5,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b9,rightshoulder:b10,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,misc1:b15,paddle1:b16,paddle2:b17,paddle3:b18,paddle4:b19,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,"); - SDLTest_AssertCheck(SDL_strcmp(SDL_GetGamepadName(gamepad), "Virtual Nintendo Gamepad") == 0, "SDL_GetGamepadName() == Virtual Nintendo Gamepad"); + name = SDL_GetGamepadName(gamepad); + SDLTest_AssertCheck(name && SDL_strcmp(name, "Virtual Nintendo Gamepad") == 0, "SDL_GetGamepadName() == Virtual Nintendo Gamepad"); SDLTest_AssertCheck(SDL_GetGamepadButtonLabel(gamepad, SDL_GAMEPAD_BUTTON_SOUTH) == SDL_GAMEPAD_BUTTON_LABEL_B, "SDL_GetGamepadButtonLabel(SDL_GAMEPAD_BUTTON_SOUTH) == SDL_GAMEPAD_BUTTON_LABEL_B"); /* Set the south button and verify that the gamepad responds */ @@ -98,7 +101,8 @@ static int TestVirtualJoystick(void *arg) /* Set an explicit mapping with PS4 style buttons */ SDL_SetGamepadMapping(SDL_GetJoystickID(joystick), "ff0013db5669727475616c2043007601,Virtual PS4 Gamepad,type:ps4,a:b0,b:b1,x:b2,y:b3,back:b4,guide:b5,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b9,rightshoulder:b10,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,misc1:b15,paddle1:b16,paddle2:b17,paddle3:b18,paddle4:b19,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,"); - SDLTest_AssertCheck(SDL_strcmp(SDL_GetGamepadName(gamepad), "Virtual PS4 Gamepad") == 0, "SDL_GetGamepadName() == Virtual PS4 Gamepad"); + name = SDL_GetGamepadName(gamepad); + SDLTest_AssertCheck(name && SDL_strcmp(name, "Virtual PS4 Gamepad") == 0, "SDL_GetGamepadName() == Virtual PS4 Gamepad"); SDLTest_AssertCheck(SDL_GetGamepadButtonLabel(gamepad, SDL_GAMEPAD_BUTTON_SOUTH) == SDL_GAMEPAD_BUTTON_LABEL_CROSS, "SDL_GetGamepadButtonLabel(SDL_GAMEPAD_BUTTON_SOUTH) == SDL_GAMEPAD_BUTTON_LABEL_CROSS"); /* Set the south button and verify that the gamepad responds */ diff --git a/test/testautomation_pen.c b/test/testautomation_pen.c index e655dc025..35f3beedf 100644 --- a/test/testautomation_pen.c +++ b/test/testautomation_pen.c @@ -38,6 +38,7 @@ #define SDL_GetPenName SDL_SUT_GetPenName #define SDL_GetPenCapabilities SDL_SUT_GetPenCapabilities #define SDL_GetPenType SDL_SUT_GetPenType +#define SDL_GetPersistentString(X) X #define SDL_GetPenPtr SDL_SUT_GetPenPtr #define SDL_PenModifyBegin SDL_SUT_PenModifyBegin diff --git a/test/testautomation_video.c b/test/testautomation_video.c index 26620a5cc..e40254689 100644 --- a/test/testautomation_video.c +++ b/test/testautomation_video.c @@ -13,7 +13,7 @@ static SDL_Window *createVideoSuiteTestWindow(const char *title) { SDL_Window *window; - SDL_Window * const *windows; + SDL_Window **windows; SDL_Event event; int w, h; int count; @@ -34,6 +34,7 @@ static SDL_Window *createVideoSuiteTestWindow(const char *title) windows = SDL_GetWindows(&count); SDLTest_AssertCheck(windows != NULL, "Validate that returned window list is not NULL"); SDLTest_AssertCheck(windows[0] == window, "Validate that the window is first in the window list"); + SDL_free(windows); /* Wayland and XWayland windows require that a frame be presented before they are fully mapped and visible onscreen. * This is required for the mouse/keyboard grab tests to pass. @@ -305,8 +306,8 @@ static int video_getWindowFlags(void *arg) */ static int video_getFullscreenDisplayModes(void *arg) { - const SDL_DisplayID *displays; - const SDL_DisplayMode * const *modes; + SDL_DisplayID *displays; + SDL_DisplayMode **modes; int count; int i; @@ -321,7 +322,9 @@ static int video_getFullscreenDisplayModes(void *arg) SDLTest_AssertPass("Call to SDL_GetFullscreenDisplayModes(%" SDL_PRIu32 ")", displays[i]); SDLTest_AssertCheck(modes != NULL, "Validate returned value from function; expected != NULL; got: %p", modes); SDLTest_AssertCheck(count >= 0, "Validate number of modes; expected: >= 0; got: %d", count); + SDL_free(modes); } + SDL_free(displays); } return TEST_COMPLETED; @@ -332,11 +335,11 @@ static int video_getFullscreenDisplayModes(void *arg) */ static int video_getClosestDisplayModeCurrentResolution(void *arg) { - const SDL_DisplayID *displays; - const SDL_DisplayMode * const *modes; + SDL_DisplayID *displays; + SDL_DisplayMode **modes; SDL_DisplayMode current; - const SDL_DisplayMode *closest; - int i, num_modes; + SDL_DisplayMode closest; + int i, result, num_modes; /* Get number of displays */ displays = SDL_GetDisplays(NULL); @@ -355,21 +358,23 @@ static int video_getClosestDisplayModeCurrentResolution(void *arg) SDL_memcpy(¤t, modes[0], sizeof(current)); /* Make call */ - closest = SDL_GetClosestFullscreenDisplayMode(displays[i], current.w, current.h, current.refresh_rate, SDL_FALSE); + result = SDL_GetClosestFullscreenDisplayMode(displays[i], current.w, current.h, current.refresh_rate, SDL_FALSE, &closest); SDLTest_AssertPass("Call to SDL_GetClosestFullscreenDisplayMode(target=current)"); - SDLTest_Assert(closest != NULL, "Verify returned value is not NULL"); + SDLTest_AssertCheck(result == 0, "Verify return value; expected: 0, got: %d", result); /* Check that one gets the current resolution back again */ - if (closest) { - SDLTest_AssertCheck(closest->w == current.w, + if (result == 0) { + SDLTest_AssertCheck(closest.w == current.w, "Verify returned width matches current width; expected: %d, got: %d", - current.w, closest->w); - SDLTest_AssertCheck(closest->h == current.h, + current.w, closest.w); + SDLTest_AssertCheck(closest.h == current.h, "Verify returned height matches current height; expected: %d, got: %d", - current.h, closest->h); + current.h, closest.h); } } + SDL_free(modes); } + SDL_free(displays); } return TEST_COMPLETED; @@ -380,8 +385,9 @@ static int video_getClosestDisplayModeCurrentResolution(void *arg) */ static int video_getClosestDisplayModeRandomResolution(void *arg) { - const SDL_DisplayID *displays; + SDL_DisplayID *displays; SDL_DisplayMode target; + SDL_DisplayMode closest; int i; int variation; @@ -403,10 +409,11 @@ static int video_getClosestDisplayModeRandomResolution(void *arg) target.refresh_rate = (variation & 8) ? (float)SDLTest_RandomIntegerInRange(25, 120) : 0.0f; /* Make call; may or may not find anything, so don't validate any further */ - SDL_GetClosestFullscreenDisplayMode(displays[i], target.w, target.h, target.refresh_rate, SDL_FALSE); + SDL_GetClosestFullscreenDisplayMode(displays[i], target.w, target.h, target.refresh_rate, SDL_FALSE, &closest); SDLTest_AssertPass("Call to SDL_GetClosestFullscreenDisplayMode(target=random/variation%d)", variation); } } + SDL_free(displays); } return TEST_COMPLETED; @@ -1668,7 +1675,7 @@ cleanup: */ static int video_setWindowCenteredOnDisplay(void *arg) { - const SDL_DisplayID *displays; + SDL_DisplayID *displays; SDL_Window *window; const char *title = "video_setWindowCenteredOnDisplay Test Window"; int x, y, w, h; @@ -1864,6 +1871,7 @@ static int video_setWindowCenteredOnDisplay(void *arg) destroyVideoSuiteTestWindow(window); } } + SDL_free(displays); } return TEST_COMPLETED; diff --git a/test/testbounds.c b/test/testbounds.c index d747822a0..143f74c6d 100644 --- a/test/testbounds.c +++ b/test/testbounds.c @@ -16,7 +16,7 @@ int main(int argc, char **argv) { - const SDL_DisplayID *displays; + SDL_DisplayID *displays; int i; SDLTest_CommonState *state; @@ -47,6 +47,7 @@ int main(int argc, char **argv) bounds.x, bounds.y, bounds.w, bounds.h, usable.x, usable.y, usable.w, usable.h); } + SDL_free(displays); } SDL_Quit(); diff --git a/test/testcamera.c b/test/testcamera.c index 25dbaa51e..a600e447d 100644 --- a/test/testcamera.c +++ b/test/testcamera.c @@ -28,7 +28,7 @@ static SDL_CameraID back_camera = 0; static void PrintCameraSpecs(SDL_CameraID camera_id) { - const SDL_CameraSpec *const *specs = SDL_GetCameraSupportedFormats(camera_id, NULL); + SDL_CameraSpec **specs = SDL_GetCameraSupportedFormats(camera_id, NULL); if (specs) { int i; @@ -37,6 +37,7 @@ static void PrintCameraSpecs(SDL_CameraID camera_id) const SDL_CameraSpec *s = specs[i]; SDL_Log(" %dx%d %.2f FPS %s\n", s->width, s->height, (float)s->framerate_numerator / s->framerate_denominator, SDL_GetPixelFormatName(s->format)); } + SDL_free(specs); } } @@ -101,7 +102,7 @@ int SDL_AppInit(void **appstate, int argc, char *argv[]) return SDL_APP_FAILURE; } - const SDL_CameraID *devices = SDL_GetCameras(&devcount); + SDL_CameraID *devices = SDL_GetCameras(&devcount); if (!devices) { SDL_Log("SDL_GetCameras failed: %s", SDL_GetError()); return SDL_APP_FAILURE; @@ -139,6 +140,7 @@ int SDL_AppInit(void **appstate, int argc, char *argv[]) camera_id = devices[0]; } } + SDL_free(devices); if (!camera_id) { SDL_Log("No cameras available?"); diff --git a/test/testcontroller.c b/test/testcontroller.c index 5be697c14..dd1311f4c 100644 --- a/test/testcontroller.c +++ b/test/testcontroller.c @@ -351,7 +351,6 @@ static void RefreshControllerName(void) } } - SDL_free(controller_name); if (name) { controller_name = SDL_strdup(name); } else { @@ -680,7 +679,7 @@ static void CopyMapping(void) static void PasteMapping(void) { if (controller) { - const char *mapping = SDL_GetClipboardText(); + char *mapping = SDL_GetClipboardText(); if (MappingHasBindings(mapping)) { StopBinding(); SDL_SetGamepadMapping(controller->id, mapping); @@ -688,6 +687,7 @@ static void PasteMapping(void) } else { /* Not a valid mapping, ignore it */ } + SDL_free(mapping); } } @@ -742,7 +742,7 @@ static void CopyControllerName(void) static void PasteControllerName(void) { SDL_free(controller_name); - controller_name = SDL_strdup(SDL_GetClipboardText()); + controller_name = SDL_GetClipboardText(); CommitControllerName(); } @@ -918,9 +918,9 @@ static void AddController(SDL_JoystickID id, SDL_bool verbose) if (verbose && !SDL_IsGamepad(id)) { const char *name = SDL_GetJoystickName(joystick); const char *path = SDL_GetJoystickPath(joystick); - const char *guid; + char guid[33]; SDL_Log("Opened joystick %s%s%s\n", name, path ? ", " : "", path ? path : ""); - guid = SDL_GUIDToString(SDL_GetJoystickGUID(joystick)); + SDL_GUIDToString(SDL_GetJoystickGUID(joystick), guid, sizeof(guid)); SDL_Log("No gamepad mapping for %s\n", guid); } } else { @@ -973,7 +973,6 @@ static void DelController(SDL_JoystickID id) static void HandleGamepadRemapped(SDL_JoystickID id) { - const char *sdlmapping; char *mapping; int i = FindController(id); @@ -988,8 +987,7 @@ static void HandleGamepadRemapped(SDL_JoystickID id) } /* Get the current mapping */ - sdlmapping = SDL_GetGamepadMapping(controllers[i].gamepad); - mapping = sdlmapping ? SDL_strdup(sdlmapping) : NULL; + mapping = SDL_GetGamepadMapping(controllers[i].gamepad); /* Make sure the mapping has a valid name */ if (mapping && !MappingHasName(mapping)) { @@ -1065,9 +1063,10 @@ static void HandleGamepadAdded(SDL_JoystickID id, SDL_bool verbose) } if (verbose) { - const char *mapping = SDL_GetGamepadMapping(gamepad); + char *mapping = SDL_GetGamepadMapping(gamepad); if (mapping) { SDL_Log("Mapping: %s\n", mapping); + SDL_free(mapping); } } } else { @@ -1187,7 +1186,7 @@ static void OpenVirtualGamepad(void) static void CloseVirtualGamepad(void) { int i; - const SDL_JoystickID *joysticks = SDL_GetJoysticks(NULL); + SDL_JoystickID *joysticks = SDL_GetJoysticks(NULL); if (joysticks) { for (i = 0; joysticks[i]; ++i) { SDL_JoystickID instance_id = joysticks[i]; @@ -1195,6 +1194,7 @@ static void CloseVirtualGamepad(void) SDL_DetachVirtualJoystick(instance_id); } } + SDL_free(joysticks); } if (virtual_joystick) { @@ -2053,13 +2053,14 @@ int main(int argc, char *argv[]) if (show_mappings) { int count = 0; - const char * const *mappings = SDL_GetGamepadMappings(&count); + char **mappings = SDL_GetGamepadMappings(&count); int map_i; SDL_Log("Supported mappings:\n"); for (map_i = 0; map_i < count; ++map_i) { SDL_Log("\t%s\n", mappings[map_i]); } SDL_Log("\n"); + SDL_free(mappings); } /* Create a window to display gamepad state */ diff --git a/test/testdialog.c b/test/testdialog.c index 29b3472dd..c298d7fe8 100644 --- a/test/testdialog.c +++ b/test/testdialog.c @@ -44,7 +44,8 @@ static void SDLCALL callback(void* userdata, const char* const* files, int filte } } -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ SDL_Window *w; SDL_Renderer *r; SDLTest_CommonState *state; diff --git a/test/testdisplayinfo.c b/test/testdisplayinfo.c index 86b9173f9..afb9e8ac3 100644 --- a/test/testdisplayinfo.c +++ b/test/testdisplayinfo.c @@ -33,8 +33,8 @@ print_mode(const char *prefix, const SDL_DisplayMode *mode) int main(int argc, char *argv[]) { - const SDL_DisplayID *displays; - const SDL_DisplayMode * const *modes; + SDL_DisplayID *displays; + SDL_DisplayMode **modes; const SDL_DisplayMode *mode; int num_displays, i; SDLTest_CommonState *state; @@ -94,9 +94,11 @@ int main(int argc, char *argv[]) (void)SDL_snprintf(prefix, sizeof(prefix), " MODE %d", m); print_mode(prefix, modes[m]); } + SDL_free(modes); SDL_Log("\n"); } + SDL_free(displays); SDL_Quit(); SDLTest_CommonDestroyState(state); diff --git a/test/testfilesystem.c b/test/testfilesystem.c index 9d840efd3..e24d9d89e 100644 --- a/test/testfilesystem.c +++ b/test/testfilesystem.c @@ -61,7 +61,7 @@ static int SDLCALL enum_callback(void *userdata, const char *origdir, const char int main(int argc, char *argv[]) { SDLTest_CommonState *state; - const char *pref_path; + char *pref_path; const char *base_path; /* Initialize test framework */ @@ -98,6 +98,7 @@ int main(int argc, char *argv[]) } else { SDL_Log("pref path: '%s'\n", pref_path); } + SDL_free(pref_path); pref_path = SDL_GetPrefPath(NULL, "test_filesystem"); if (!pref_path) { @@ -106,9 +107,10 @@ int main(int argc, char *argv[]) } else { SDL_Log("pref path: '%s'\n", pref_path); } + SDL_free(pref_path); if (base_path) { - const char * const *globlist; + char **globlist; SDL_IOStream *stream; const char *text = "foo\n"; @@ -124,6 +126,7 @@ int main(int argc, char *argv[]) for (i = 0; globlist[i]; i++) { SDL_Log("GLOB[%d]: '%s'", i, globlist[i]); } + SDL_free(globlist); } /* !!! FIXME: put this in a subroutine and make it test more thoroughly (and put it in testautomation). */ diff --git a/test/testhaptic.c b/test/testhaptic.c index 77cb98a16..0406a871a 100644 --- a/test/testhaptic.c +++ b/test/testhaptic.c @@ -40,7 +40,7 @@ int main(int argc, char **argv) int id[9]; int nefx; unsigned int supported; - const SDL_HapticID *haptics; + SDL_HapticID *haptics; int num_haptics; /* Initialize test framework */ @@ -88,44 +88,47 @@ int main(int argc, char **argv) for (i = 0; i < num_haptics; ++i) { SDL_Log(" %s\n", SDL_GetHapticNameForID(haptics[i])); } - if (haptics) { - if (num_haptics == 0) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No Haptic devices found!\n"); - return 1; - } - - /* We'll just use index or the first force feedback device found */ - if (!name) { - i = (index != -1) ? index : 0; - - if (i >= num_haptics) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Index out of range, aborting.\n"); - return 1; - } - } - /* Try to find matching device */ - else { - for (i = 0; i < num_haptics; i++) { - if (SDL_strstr(SDL_GetHapticNameForID(haptics[i]), name) != NULL) { - break; - } - } - - if (i >= num_haptics) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to find device matching '%s', aborting.\n", name); - return 1; - } - } - - haptic = SDL_OpenHaptic(haptics[i]); - if (!haptic) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to create the haptic device: %s\n", SDL_GetError()); - return 1; - } - SDL_Log("Device: %s\n", SDL_GetHapticName(haptic)); - HapticPrintSupported(haptic); + if (num_haptics == 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No Haptic devices found!\n"); + SDL_free(haptics); + return 1; } + /* We'll just use index or the first force feedback device found */ + if (!name) { + i = (index != -1) ? index : 0; + + if (i >= num_haptics) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Index out of range, aborting.\n"); + SDL_free(haptics); + return 1; + } + } + /* Try to find matching device */ + else { + for (i = 0; i < num_haptics; i++) { + if (SDL_strstr(SDL_GetHapticNameForID(haptics[i]), name) != NULL) { + break; + } + } + + if (i >= num_haptics) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to find device matching '%s', aborting.\n", name); + SDL_free(haptics); + return 1; + } + } + + haptic = SDL_OpenHaptic(haptics[i]); + if (!haptic) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to create the haptic device: %s\n", SDL_GetError()); + SDL_free(haptics); + return 1; + } + SDL_Log("Device: %s\n", SDL_GetHapticName(haptic)); + HapticPrintSupported(haptic); + SDL_free(haptics); + /* We only want force feedback errors. */ SDL_ClearError(); diff --git a/test/testhotplug.c b/test/testhotplug.c index 328ef76c1..ec635c1bf 100644 --- a/test/testhotplug.c +++ b/test/testhotplug.c @@ -80,18 +80,18 @@ int main(int argc, char *argv[]) //SDL_CreateWindow("Dummy", 128, 128, 0); */ - SDL_GetKeyboards(&num_keyboards); + SDL_free(SDL_GetKeyboards(&num_keyboards)); SDL_Log("There are %d keyboards at startup\n", num_keyboards); - SDL_GetMice(&num_mice); + SDL_free(SDL_GetMice(&num_mice)); SDL_Log("There are %d mice at startup\n", num_mice); - SDL_GetJoysticks(&num_joysticks); + SDL_free(SDL_GetJoysticks(&num_joysticks)); SDL_Log("There are %d joysticks at startup\n", num_joysticks); if (enable_haptic) { int num_haptics; - SDL_GetHaptics(&num_haptics); + SDL_free(SDL_GetHaptics(&num_haptics)); SDL_Log("There are %d haptic devices at startup\n", num_haptics); } diff --git a/test/testime.c b/test/testime.c index a49b6ebff..b9bf090b0 100644 --- a/test/testime.c +++ b/test/testime.c @@ -53,7 +53,7 @@ static int cursor_length = 0; static SDL_bool cursor_visible; static Uint64 last_cursor_change; static SDL_BlendMode highlight_mode; -static const char **candidates; +static char **candidates; static int num_candidates; static int selected_candidate; static SDL_bool horizontal_candidates; @@ -476,6 +476,11 @@ static void InitInput(void) static void ClearCandidates(void) { + int i; + + for (i = 0; i < num_candidates; ++i) { + SDL_free(candidates[i]); + } SDL_free(candidates); candidates = NULL; num_candidates = 0; @@ -483,12 +488,20 @@ static void ClearCandidates(void) static void SaveCandidates(SDL_Event *event) { + int i; + ClearCandidates(); num_candidates = event->edit_candidates.num_candidates; if (num_candidates > 0) { - candidates = (const char **)SDL_ClaimTemporaryMemory(event->edit_candidates.candidates); - SDL_assert(candidates); + candidates = (char **)SDL_malloc(num_candidates * sizeof(*candidates)); + if (!candidates) { + num_candidates = 0; + return; + } + for (i = 0; i < num_candidates; ++i) { + candidates[i] = SDL_strdup(event->edit_candidates.candidates[i]); + } selected_candidate = event->edit_candidates.selected_candidate; horizontal_candidates = event->edit_candidates.horizontal; } diff --git a/test/testlocale.c b/test/testlocale.c index 5a9a53d34..d0196d2e5 100644 --- a/test/testlocale.c +++ b/test/testlocale.c @@ -15,7 +15,7 @@ static void log_locales(void) { - const SDL_Locale * const *locales = SDL_GetPreferredLocales(NULL); + SDL_Locale **locales = SDL_GetPreferredLocales(NULL); if (!locales) { SDL_Log("Couldn't determine locales: %s", SDL_GetError()); } else { @@ -29,6 +29,7 @@ static void log_locales(void) total++; } SDL_Log("%u locales seen.", total); + SDL_free(locales); } } diff --git a/test/testmultiaudio.c b/test/testmultiaudio.c index 8c91ca1cd..98bab13e3 100644 --- a/test/testmultiaudio.c +++ b/test/testmultiaudio.c @@ -135,7 +135,7 @@ test_multi_audio(const SDL_AudioDeviceID *devices, int devcount) int main(int argc, char **argv) { - const SDL_AudioDeviceID *devices = NULL; + SDL_AudioDeviceID *devices; int devcount = 0; int i; char *filename = NULL; @@ -192,6 +192,7 @@ int main(int argc, char **argv) test_multi_audio(devices, devcount); SDL_free(sound); } + SDL_free(devices); } SDL_free(filename); diff --git a/test/testpen.c b/test/testpen.c index b5318b7cf..288ec5486 100644 --- a/test/testpen.c +++ b/test/testpen.c @@ -222,7 +222,7 @@ static void dump_state(void) for (i = 0; i < pens_nr; ++i) { SDL_PenID penid = pens[i]; SDL_GUID guid = SDL_GetPenGUID(penid); - const char *guid_str; + char guid_str[33]; float axes[SDL_PEN_NUM_AXES]; float x, y; int k; @@ -232,7 +232,7 @@ static void dump_state(void) char *type; char *buttons_str; - guid_str = SDL_GUIDToString(guid); + SDL_GUIDToString(guid, guid_str, sizeof(guid_str)); switch (SDL_GetPenType(penid)) { case SDL_PEN_TYPE_ERASER: diff --git a/test/testrumble.c b/test/testrumble.c index a16fc3bfc..d57463fba 100644 --- a/test/testrumble.c +++ b/test/testrumble.c @@ -39,7 +39,7 @@ int main(int argc, char **argv) char *name = NULL; int index; SDLTest_CommonState *state; - const SDL_HapticID *haptics; + SDL_HapticID *haptics; int num_haptics; /* Initialize test framework */ @@ -89,43 +89,46 @@ int main(int argc, char **argv) SDL_INIT_HAPTIC); haptics = SDL_GetHaptics(&num_haptics); SDL_Log("%d Haptic devices detected.\n", num_haptics); - if (haptics) { - if (num_haptics == 0) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No Haptic devices found!\n"); - return 1; - } - - /* We'll just use index or the first force feedback device found */ - if (!name) { - i = (index != -1) ? index : 0; - - if (i >= num_haptics) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Index out of range, aborting.\n"); - return 1; - } - } - /* Try to find matching device */ - else { - for (i = 0; i < num_haptics; i++) { - if (SDL_strstr(SDL_GetHapticNameForID(haptics[i]), name) != NULL) { - break; - } - } - - if (i >= num_haptics) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to find device matching '%s', aborting.\n", name); - return 1; - } - } - - haptic = SDL_OpenHaptic(haptics[i]); - if (!haptic) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to create the haptic device: %s\n", SDL_GetError()); - return 1; - } - SDL_Log("Device: %s\n", SDL_GetHapticName(haptic)); + if (num_haptics == 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No Haptic devices found!\n"); + SDL_free(haptics); + return 1; } + /* We'll just use index or the first force feedback device found */ + if (!name) { + i = (index != -1) ? index : 0; + + if (i >= num_haptics) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Index out of range, aborting.\n"); + SDL_free(haptics); + return 1; + } + } + /* Try to find matching device */ + else { + for (i = 0; i < num_haptics; i++) { + if (SDL_strstr(SDL_GetHapticNameForID(haptics[i]), name) != NULL) { + break; + } + } + + if (i >= num_haptics) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to find device matching '%s', aborting.\n", name); + SDL_free(haptics); + return 1; + } + } + + haptic = SDL_OpenHaptic(haptics[i]); + if (!haptic) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to create the haptic device: %s\n", SDL_GetError()); + SDL_free(haptics); + return 1; + } + SDL_Log("Device: %s\n", SDL_GetHapticName(haptic)); + SDL_free(haptics); + /* We only want force feedback errors. */ SDL_ClearError(); diff --git a/test/testsensor.c b/test/testsensor.c index 38bced06e..404c9723b 100644 --- a/test/testsensor.c +++ b/test/testsensor.c @@ -58,7 +58,7 @@ static void HandleSensorEvent(SDL_SensorEvent *event) int main(int argc, char **argv) { - const SDL_SensorID *sensors; + SDL_SensorID *sensors; int i, num_sensors, num_opened; SDLTest_CommonState *state; @@ -104,6 +104,7 @@ int main(int argc, char **argv) } } } + SDL_free(sensors); } SDL_Log("Opened %d sensors\n", num_opened); diff --git a/test/testsurround.c b/test/testsurround.c index 7601bffa9..7796001e4 100644 --- a/test/testsurround.c +++ b/test/testsurround.c @@ -146,7 +146,7 @@ static void SDLCALL fill_buffer(void *userdata, SDL_AudioStream *stream, int len int main(int argc, char *argv[]) { - const SDL_AudioDeviceID *devices = NULL; + SDL_AudioDeviceID *devices; SDLTest_CommonState *state; int devcount = 0; int i; @@ -181,7 +181,6 @@ int main(int argc, char *argv[]) devices = SDL_GetAudioPlaybackDevices(&devcount); if (!devices) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_GetAudioPlaybackDevices() failed: %s\n", SDL_GetError()); - devcount = 0; } SDL_Log("Available audio devices:"); @@ -233,6 +232,7 @@ int main(int argc, char *argv[]) SDL_DestroyAudioStream(stream); } + SDL_free(devices); SDL_Quit(); return 0; diff --git a/test/testwm.c b/test/testwm.c index 517e308bd..dfd642a48 100644 --- a/test/testwm.c +++ b/test/testwm.c @@ -53,7 +53,7 @@ static const SDL_DisplayMode *highlighted_mode = NULL; static void draw_modes_menu(SDL_Window *window, SDL_Renderer *renderer, SDL_FRect viewport) { - const SDL_DisplayMode * const *modes; + SDL_DisplayMode **modes; char text[1024]; const int lineHeight = 10; int i, j; @@ -62,7 +62,7 @@ draw_modes_menu(SDL_Window *window, SDL_Renderer *renderer, SDL_FRect viewport) float x, y; float table_top; SDL_FPoint mouse_pos = { -1.0f, -1.0f }; - const SDL_DisplayID *displays; + SDL_DisplayID *displays; /* Get mouse position */ if (SDL_GetMouseFocus() == window) { @@ -99,7 +99,6 @@ draw_modes_menu(SDL_Window *window, SDL_Renderer *renderer, SDL_FRect viewport) } displays = SDL_GetDisplays(NULL); - if (displays) { for (i = 0; displays[i]; ++i) { SDL_DisplayID display = displays[i]; @@ -143,7 +142,9 @@ draw_modes_menu(SDL_Window *window, SDL_Renderer *renderer, SDL_FRect viewport) column_chars = 0; } } + SDL_free(modes); } + SDL_free(displays); } }