hints: Added SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE.

Fixes #2349.
This commit is contained in:
Ryan C. Gordon 2022-03-22 09:52:52 -04:00
parent 34fd83ca06
commit f782abe5f0
No known key found for this signature in database
GPG Key ID: FA148B892AB48044
2 changed files with 28 additions and 3 deletions

View File

@ -1943,6 +1943,30 @@ extern "C" {
*/ */
#define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE" #define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE"
/**
* \brief A variable that decides whether to send SDL_QUIT when closing the final window.
*
* By default, SDL sends an SDL_QUIT event when there is only one window
* and it receives an SDL_WINDOWEVENT_CLOSE event, under the assumption most
* apps would also take the loss of this window as a signal to terminate the
* program.
*
* However, it's not unreasonable in some cases to have the program continue
* to live on, perhaps to create new windows later.
*
* Changing this hint to "0" will cause SDL to not send an SDL_QUIT event
* when the final window is requesting to close. Note that in this case,
* there are still other legitimate reasons one might get an SDL_QUIT
* event: choosing "Quit" from the macOS menu bar, sending a SIGINT (ctrl-c)
* on Unix, etc.
*
* The default value is "1". This hint can be changed at any time.
*
* This hint is available since SDL 2.0.22. Before then, you always get
* an SDL_QUIT event when closing the final window.
*/
#define SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE "SDL_QUIT_ON_LAST_WINDOW_CLOSE"
/** /**
* \brief An enumeration of hint priorities * \brief An enumeration of hint priorities

View File

@ -25,7 +25,7 @@
#include "SDL_events.h" #include "SDL_events.h"
#include "SDL_events_c.h" #include "SDL_events_c.h"
#include "SDL_mouse_c.h" #include "SDL_mouse_c.h"
#include "SDL_hints.h"
static int SDLCALL static int SDLCALL
RemovePendingSizeChangedAndResizedEvents(void * userdata, SDL_Event *event) RemovePendingSizeChangedAndResizedEvents(void * userdata, SDL_Event *event)
@ -201,8 +201,9 @@ SDL_SendWindowEvent(SDL_Window * window, Uint8 windowevent, int data1,
if (windowevent == SDL_WINDOWEVENT_CLOSE) { if (windowevent == SDL_WINDOWEVENT_CLOSE) {
if ( !window->prev && !window->next ) { if ( !window->prev && !window->next ) {
/* This is the last window in the list so send the SDL_QUIT event */ if (SDL_GetHintBoolean(SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE, SDL_TRUE)) {
SDL_SendQuit(); SDL_SendQuit(); /* This is the last window in the list so send the SDL_QUIT event */
}
} }
} }