Browse Source

Added a hint to prevent SDL from installing signal handlers.

Fixes Bugzilla #2431.
Ryan C. Gordon 10 years ago
parent
commit
a91a5604cd
2 changed files with 26 additions and 1 deletions
  1. 12 0
      include/SDL_hints.h
  2. 14 1
      src/events/SDL_quit.c

+ 12 - 0
include/SDL_hints.h

@@ -546,6 +546,18 @@ extern "C" {
  */
 #define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT   "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT"
 
+/**
+ *  \brief Tell SDL not to handle SIGINT.
+ *
+ * This hint only applies to Unix-like platforms.
+ *
+ * The variable can be set to the following values:
+ *   "0"       - SDL will install a SIGINT handler, and when it catches the
+ *               signal, conver it into an SDL_QUIT event.
+ *   "1"       - SDL will not install a SIGINT handler.
+ */
+#define SDL_HINT_DISABLE_SIGINT_HANDLER   "SDL_DISABLE_SIGINT_HANDLER"
+
 /**
  *  \brief  An enumeration of hint priorities
  */

+ 14 - 1
src/events/SDL_quit.c

@@ -19,6 +19,7 @@
   3. This notice may not be removed or altered from any source distribution.
 */
 #include "../SDL_internal.h"
+#include "SDL_hints.h"
 
 /* General quit handling code for SDL */
 
@@ -30,6 +31,8 @@
 #include "SDL_events_c.h"
 
 
+static SDL_bool disable_signals = SDL_FALSE;
+
 #ifdef HAVE_SIGNAL_H
 static void
 SDL_HandleSIG(int sig)
@@ -46,6 +49,12 @@ SDL_HandleSIG(int sig)
 int
 SDL_QuitInit(void)
 {
+    const char *hint = SDL_GetHint(SDL_HINT_DISABLE_SIGINT_HANDLER);
+    disable_signals = hint && (SDL_atoi(hint) == 1);
+    if (disable_signals) {
+        return 0;
+    }
+
 #ifdef HAVE_SIGACTION
     struct sigaction action;
     sigaction(SIGINT, NULL, &action);
@@ -80,12 +89,16 @@ SDL_QuitInit(void)
 #endif /* HAVE_SIGNAL_H */
 
     /* That's it! */
-    return (0);
+    return 0;
 }
 
 void
 SDL_QuitQuit(void)
 {
+    if (disable_signals) {
+        return;
+    }
+
 #ifdef HAVE_SIGACTION
     struct sigaction action;
     sigaction(SIGINT, NULL, &action);