Added a hint to prevent SDL from installing signal handlers.

Fixes Bugzilla #2431.
This commit is contained in:
Ryan C. Gordon 2015-03-24 14:29:25 -04:00
parent 162ef5eae9
commit a91a5604cd
2 changed files with 26 additions and 1 deletions

View File

@ -546,6 +546,18 @@ extern "C" {
*/ */
#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT" #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 * \brief An enumeration of hint priorities
*/ */

View File

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