summaryrefslogtreecommitdiff
path: root/lib/draw
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2014-04-10 20:01:34 +0300
committerJari Vetoniemi <mailroxas@gmail.com>2014-04-10 20:01:34 +0300
commite874818889ed799c8f4e4db2adf77dd19013c878 (patch)
treef30980d54c56aa45d1dc1384edf8c1b30a95168f /lib/draw
parent8631506d9d1522f1a24e528f75682201b4f3cc7b (diff)
downloadbemenu-e874818889ed799c8f4e4db2adf77dd19013c878.tar.gz
bemenu-e874818889ed799c8f4e4db2adf77dd19013c878.tar.bz2
bemenu-e874818889ed799c8f4e4db2adf77dd19013c878.zip
Cleanup curses better.
Diffstat (limited to 'lib/draw')
-rw-r--r--lib/draw/curses.c19
1 files changed, 18 insertions, 1 deletions
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 <wchar.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <ncurses.h>
#include <dlfcn.h>
+#include <signal.h>
#include <assert.h>
/* 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: