Commit 9608780d authored by Sam Lantinga's avatar Sam Lantinga

Date: Fri, 08 Jul 2005 22:43:48 +0200 (CEST)

From: Jiri Svoboda
Subject: [SDL] signal handling bug

I encountered the following bug:
SDL doesn't reset signal handlers for SIGTERM and SIGINT, after calling SDL_Quit these remain hooked to the handler in SDL_quit.c, being translated into SDL_QUIT events.

Consequently an application that issues a SDL_Quit and remains running will ignore any SIGTERM or SIGINT., and specifically CTRL-C presses.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401124
parent 3eacd1d2
...@@ -46,6 +46,9 @@ int SDL_AppActiveInit(void) ...@@ -46,6 +46,9 @@ int SDL_AppActiveInit(void)
/* That's it! */ /* That's it! */
return(0); return(0);
} }
void SDL_AppActiveQuit(void)
{
}
Uint8 SDL_GetAppState(void) Uint8 SDL_GetAppState(void)
{ {
......
...@@ -196,6 +196,12 @@ void SDL_StopEventLoop(void) ...@@ -196,6 +196,12 @@ void SDL_StopEventLoop(void)
/* Halt the event thread, if running */ /* Halt the event thread, if running */
SDL_StopEventThread(); SDL_StopEventThread();
/* Shutdown event handlers */
SDL_AppActiveQuit();
SDL_KeyboardQuit();
SDL_MouseQuit();
SDL_QuitQuit();
/* Clean out EventQ */ /* Clean out EventQ */
SDL_EventQ.head = 0; SDL_EventQ.head = 0;
SDL_EventQ.tail = 0; SDL_EventQ.tail = 0;
......
...@@ -43,6 +43,12 @@ extern int SDL_KeyboardInit(void); ...@@ -43,6 +43,12 @@ extern int SDL_KeyboardInit(void);
extern int SDL_MouseInit(void); extern int SDL_MouseInit(void);
extern int SDL_QuitInit(void); extern int SDL_QuitInit(void);
/* Event handler quit routines */
extern void SDL_AppActiveQuit(void);
extern void SDL_KeyboardQuit(void);
extern void SDL_MouseQuit(void);
extern void SDL_QuitQuit(void);
/* The event filter function */ /* The event filter function */
extern SDL_EventFilter SDL_EventOK; extern SDL_EventFilter SDL_EventOK;
......
...@@ -321,6 +321,9 @@ int SDL_KeyboardInit(void) ...@@ -321,6 +321,9 @@ int SDL_KeyboardInit(void)
/* Done. Whew. */ /* Done. Whew. */
return(0); return(0);
} }
void SDL_KeyboardQuit(void)
{
}
/* We lost the keyboard, so post key up messages for all pressed keys */ /* We lost the keyboard, so post key up messages for all pressed keys */
void SDL_ResetKeyboard(void) void SDL_ResetKeyboard(void)
......
...@@ -58,6 +58,9 @@ int SDL_MouseInit(void) ...@@ -58,6 +58,9 @@ int SDL_MouseInit(void)
/* That's it! */ /* That's it! */
return(0); return(0);
} }
void SDL_MouseQuit(void)
{
}
/* We lost the mouse, so post button up messages for all pressed buttons */ /* We lost the mouse, so post button up messages for all pressed buttons */
void SDL_ResetMouse(void) void SDL_ResetMouse(void)
......
...@@ -65,6 +65,19 @@ int SDL_QuitInit(void) ...@@ -65,6 +65,19 @@ int SDL_QuitInit(void)
/* That's it! */ /* That's it! */
return(0); return(0);
} }
void SDL_QuitQuit(void)
{
#ifndef NO_SIGNAL_H
void (*ohandler)(int);
ohandler = signal(SIGINT, SIG_DFL);
if ( ohandler != SDL_HandleSIG )
signal(SIGINT, ohandler);
ohandler = signal(SIGTERM, SIG_DFL);
if ( ohandler != SDL_HandleSIG )
signal(SIGTERM, ohandler);
#endif /* NO_SIGNAL_H */
}
/* This function returns 1 if it's okay to close the application window */ /* This function returns 1 if it's okay to close the application window */
int SDL_PrivateQuit(void) int SDL_PrivateQuit(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment