From e874818889ed799c8f4e4db2adf77dd19013c878 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Thu, 10 Apr 2014 20:01:34 +0300 Subject: Cleanup curses better. --- lib/draw/curses.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'lib/draw') diff --git a/lib/draw/curses.c b/lib/draw/curses.c index c1bb013..0e19538 100644 --- a/lib/draw/curses.c +++ b/lib/draw/curses.c @@ -1,10 +1,12 @@ #include "../internal.h" +#define _XOPEN_SOURCE 700 #include #include #include #include #include #include +#include #include /* ncurses.h likes to define stuff for us. @@ -24,6 +26,7 @@ * Dynamically loaded curses API. */ static struct curses { + struct sigaction action; void *handle; WINDOW *stdscr; WINDOW* (*initscr)(void); @@ -87,7 +90,7 @@ static void _bmDrawCursesDrawLine(int pair, int y, const char *format, ...) static void _bmDrawCursesRender(const bmMenu *menu) { if (!curses.stdscr) { - freopen("/dev/tty", "rw", stdin); + freopen("/dev/tty", "r", stdin); setlocale(LC_CTYPE, ""); if ((curses.stdscr = curses.initscr()) == NULL) return; @@ -134,6 +137,7 @@ static void _bmDrawCursesEndWin(void) curses.endwin(); curses.stdscr = NULL; + freopen("/dev/tty", "w", stdout); } static bmKey _bmDrawCursesGetKey(unsigned int *unicode) @@ -218,9 +222,17 @@ static void _bmDrawCursesFree(void) if (curses.handle) dlclose(curses.handle); + sigaction(SIGABRT, &curses.action, NULL); + sigaction(SIGSEGV, &curses.action, NULL); memset(&curses, 0, sizeof(curses)); } +static void _bmDrawCursesCrashHandler(int sig) +{ + (void)sig; + _bmDrawCursesFree(); +} + int _bmDrawCursesInit(struct _bmRenderApi *api) { memset(&curses, 0, sizeof(curses)); @@ -270,6 +282,11 @@ int _bmDrawCursesInit(struct _bmRenderApi *api) api->render = _bmDrawCursesRender; api->free = _bmDrawCursesFree; + struct sigaction action; + memset(&action, 0, sizeof(struct sigaction)); + action.sa_handler = _bmDrawCursesCrashHandler; + sigaction(SIGABRT, &action, &curses.action); + sigaction(SIGSEGV, &action, &curses.action); return 1; function_pointer_exception: -- cgit v1.2.3-70-g09d2