# HG changeset patch # User Sam Lantinga # Date 1124605134 0 # Node ID 28ac87a38c17ec59ce2535a8f8e5a44b3b67fe76 # Parent e253d5448fce13d9ef5e45851e1a765bac6dd5cb 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. diff -r e253d5448fce -r 28ac87a38c17 src/events/SDL_active.c --- a/src/events/SDL_active.c Sat Aug 20 21:39:06 2005 +0000 +++ b/src/events/SDL_active.c Sun Aug 21 06:18:54 2005 +0000 @@ -46,6 +46,9 @@ /* That's it! */ return(0); } +void SDL_AppActiveQuit(void) +{ +} Uint8 SDL_GetAppState(void) { diff -r e253d5448fce -r 28ac87a38c17 src/events/SDL_events.c --- a/src/events/SDL_events.c Sat Aug 20 21:39:06 2005 +0000 +++ b/src/events/SDL_events.c Sun Aug 21 06:18:54 2005 +0000 @@ -196,6 +196,12 @@ /* Halt the event thread, if running */ SDL_StopEventThread(); + /* Shutdown event handlers */ + SDL_AppActiveQuit(); + SDL_KeyboardQuit(); + SDL_MouseQuit(); + SDL_QuitQuit(); + /* Clean out EventQ */ SDL_EventQ.head = 0; SDL_EventQ.tail = 0; diff -r e253d5448fce -r 28ac87a38c17 src/events/SDL_events_c.h --- a/src/events/SDL_events_c.h Sat Aug 20 21:39:06 2005 +0000 +++ b/src/events/SDL_events_c.h Sun Aug 21 06:18:54 2005 +0000 @@ -43,6 +43,12 @@ extern int SDL_MouseInit(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 */ extern SDL_EventFilter SDL_EventOK; diff -r e253d5448fce -r 28ac87a38c17 src/events/SDL_keyboard.c --- a/src/events/SDL_keyboard.c Sat Aug 20 21:39:06 2005 +0000 +++ b/src/events/SDL_keyboard.c Sun Aug 21 06:18:54 2005 +0000 @@ -321,6 +321,9 @@ /* Done. Whew. */ return(0); } +void SDL_KeyboardQuit(void) +{ +} /* We lost the keyboard, so post key up messages for all pressed keys */ void SDL_ResetKeyboard(void) diff -r e253d5448fce -r 28ac87a38c17 src/events/SDL_mouse.c --- a/src/events/SDL_mouse.c Sat Aug 20 21:39:06 2005 +0000 +++ b/src/events/SDL_mouse.c Sun Aug 21 06:18:54 2005 +0000 @@ -58,6 +58,9 @@ /* That's it! */ return(0); } +void SDL_MouseQuit(void) +{ +} /* We lost the mouse, so post button up messages for all pressed buttons */ void SDL_ResetMouse(void) diff -r e253d5448fce -r 28ac87a38c17 src/events/SDL_quit.c --- a/src/events/SDL_quit.c Sat Aug 20 21:39:06 2005 +0000 +++ b/src/events/SDL_quit.c Sun Aug 21 06:18:54 2005 +0000 @@ -54,7 +54,7 @@ void (*ohandler)(int); /* Both SIGINT and SIGTERM are translated into quit interrupts */ - ohandler = signal(SIGINT, SDL_HandleSIG); + ohandler = signal(SIGINT, SDL_HandleSIG); if ( ohandler != SIG_DFL ) signal(SIGINT, ohandler); ohandler = signal(SIGTERM, SDL_HandleSIG); @@ -65,6 +65,19 @@ /* That's it! */ 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 */ int SDL_PrivateQuit(void)