diff -urN cui32/cui.c cui33/cui.c --- cui32/cui.c Fri Jan 31 00:30:00 2014 +++ cui33/cui.c Fri Jan 31 00:50:00 2014 @@ -330,6 +330,7 @@ struct cui_main_stack stk; cui_main_stack sp = (cui_main_stack)&stk; + void *kd; int key, val; cui focus, obj; @@ -339,7 +340,7 @@ main_stack = sp; cui_esc_enter(); - cui_key_enter(); + if((kd = cui_key_enter()) == NULL) ERR("No Mem"); cui_clear(top_obj); cui_draw(top_obj); @@ -356,7 +357,7 @@ cui_draw(obj); } } - cui_key_exit(); + cui_key_exit(kd); cui_esc_exit(); main_stack = sp->prev; diff -urN cui32/key.c cui33/key.c --- cui32/key.c Thu Jan 30 03:10:00 2014 +++ cui33/key.c Fri Jan 31 00:50:00 2014 @@ -1,28 +1,34 @@ #include "key.h" +#include +#include #include #include #include #include #define KEY_FD 0 -static struct termios term_bak; -void +void * cui_key_enter(void) { - struct termios raw; + struct termios raw, *bak; + + if((bak = malloc(sizeof(struct termios))) == NULL) return NULL; - tcgetattr(KEY_FD, &term_bak); + tcgetattr(KEY_FD, bak); cfmakeraw(&raw); raw.c_lflag &= ~FLUSHO; tcsetattr(KEY_FD, TCSANOW, &raw); + return bak; } void -cui_key_exit(void) +cui_key_exit(void *kd) { - tcsetattr(KEY_FD, TCSANOW, &term_bak); + if(!kd) return; + tcsetattr(KEY_FD, TCSANOW, (struct termios *)kd); + free(kd); } int diff -urN cui32/key.h cui33/key.h --- cui32/key.h Thu Jan 30 03:10:00 2014 +++ cui33/key.h Fri Jan 31 00:50:00 2014 @@ -9,8 +9,8 @@ #define CUI_KEY_RIGHT 0x14 /* DC4 */ #define CUI_KEY_ESC 0x1b -void cui_key_enter(void); -void cui_key_exit(void); +void *cui_key_enter(void); +void cui_key_exit(void *kd); int cui_key_get(void); int cui_key_get2(void);