Set the hint value before calling hint callbacks

This allows the hint callbacks to perform more complicated logic involving multiple hints without worrying about which hint has been changed.
This commit is contained in:
Sam Lantinga 2023-06-28 08:53:48 -07:00
parent ad12bb4fd1
commit e643d28d9c
2 changed files with 9 additions and 3 deletions

View File

@ -386,6 +386,8 @@ functionality to your app and aid migration. That is located in the
SDL_AddHintCallback() now returns a standard int result instead of void, returning 0 if the function succeeds or a negative error code if there was an error.
Calling SDL_GetHint() with the name of the hint being changed from within a hint callback will now return the new value rather than the old value. The old value is still passed as a parameter to the hint callback.
The following hints have been removed:
* SDL_HINT_VIDEO_HIGHDPI_DISABLED - high DPI support is always enabled
* SDL_HINT_IDLE_TIMER_DISABLED - use SDL_DisableScreenSaver instead

View File

@ -65,14 +65,18 @@ SDL_bool SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPr
}
if (hint->value != value &&
(value == NULL || !hint->value || SDL_strcmp(hint->value, value) != 0)) {
char *old_value = hint->value;
hint->value = value ? SDL_strdup(value) : NULL;
for (entry = hint->callbacks; entry;) {
/* Save the next entry in case this one is deleted */
SDL_HintWatch *next = entry->next;
entry->callback(entry->userdata, name, hint->value, value);
entry->callback(entry->userdata, name, old_value, value);
entry = next;
}
SDL_free(hint->value);
hint->value = value ? SDL_strdup(value) : NULL;
if (old_value) {
SDL_free(old_value);
}
}
hint->priority = priority;
return SDL_TRUE;