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
This commit is contained in:
parent
3eacd1d2c1
commit
9608780d27
6 changed files with 35 additions and 1 deletions
|
@ -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)
|
||||||
/* 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);
|
||||||
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)
|
||||||
/* 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)
|
||||||
/* 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)
|
||||||
|
|
|
@ -54,7 +54,7 @@ int SDL_QuitInit(void)
|
||||||
void (*ohandler)(int);
|
void (*ohandler)(int);
|
||||||
|
|
||||||
/* Both SIGINT and SIGTERM are translated into quit interrupts */
|
/* Both SIGINT and SIGTERM are translated into quit interrupts */
|
||||||
ohandler = signal(SIGINT, SDL_HandleSIG);
|
ohandler = signal(SIGINT, SDL_HandleSIG);
|
||||||
if ( ohandler != SIG_DFL )
|
if ( ohandler != SIG_DFL )
|
||||||
signal(SIGINT, ohandler);
|
signal(SIGINT, ohandler);
|
||||||
ohandler = signal(SIGTERM, SDL_HandleSIG);
|
ohandler = signal(SIGTERM, SDL_HandleSIG);
|
||||||
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue