From f782abe5f0f8fd431381e5b2af420afa62da646c Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
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 140d37d7fae..133f68769ad 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 cb82d4ffd5b..cc8b891df71 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 */
+ }
}
}