Mercurial > sdl-ios-xcode
changeset 1123:28ac87a38c17
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.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 21 Aug 2005 06:18:54 +0000 |
parents | e253d5448fce |
children | 4a061326d752 |
files | src/events/SDL_active.c src/events/SDL_events.c src/events/SDL_events_c.h src/events/SDL_keyboard.c src/events/SDL_mouse.c src/events/SDL_quit.c |
diffstat | 6 files changed, 35 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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) {
--- 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;
--- 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;
--- 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)
--- 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)
--- 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)