hints: Added SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE. Fixes #2349.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 140d37d..133f687 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 cb82d4f..cc8b891 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 */
+ }
}
}