From f782abe5f0f8fd431381e5b2af420afa62da646c Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 22 Mar 2022 09:52:52 -0400 Subject: [PATCH] hints: Added SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE. Fixes #2349. --- include/SDL_hints.h | 24 ++++++++++++++++++++++++ src/events/SDL_windowevents.c | 7 ++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/include/SDL_hints.h b/include/SDL_hints.h index 140d37d7f..133f68769 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -1943,6 +1943,30 @@ extern "C" { */ #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 diff --git a/src/events/SDL_windowevents.c b/src/events/SDL_windowevents.c index cb82d4ffd..cc8b891df 100644 --- a/src/events/SDL_windowevents.c +++ b/src/events/SDL_windowevents.c @@ -25,7 +25,7 @@ #include "SDL_events.h" #include "SDL_events_c.h" #include "SDL_mouse_c.h" - +#include "SDL_hints.h" static int SDLCALL 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 ( !window->prev && !window->next ) { - /* This is the last window in the list so send the SDL_QUIT event */ - SDL_SendQuit(); + if (SDL_GetHintBoolean(SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE, SDL_TRUE)) { + SDL_SendQuit(); /* This is the last window in the list so send the SDL_QUIT event */ + } } }