diff --git a/caca/driver/slang.c b/caca/driver/slang.c index cb224db..c6c1971 100644 --- a/caca/driver/slang.c +++ b/caca/driver/slang.c @@ -115,17 +115,19 @@ static void slang_uninstall_terminal(caca_display_t *); struct driver_private { char *term; + unsigned int sigint_event; }; static void default_sigint (int sig) { - /* Do nothing */ - return; + /* Warn the caller that we got SIGINT. */ + sigwinch_d->drv.p->sigint_event++; } static int slang_init_graphics(caca_display_t *dp) { dp->drv.p = malloc(sizeof(struct driver_private)); + dp->drv.p->sigint_event = 0; #if defined(HAVE_GETENV) && defined(HAVE_PUTENV) slang_install_terminal(dp); @@ -187,6 +189,8 @@ static int slang_init_graphics(caca_display_t *dp) caca_set_canvas_size(dp->cv, SLtt_Screen_Cols, SLtt_Screen_Rows); dp->resize.allow = 0; + SLsig_unblock_signals(); + return 0; } @@ -196,6 +200,7 @@ static int slang_end_graphics(caca_display_t *dp) SLtt_set_mouse_mode(0, 0); SLtt_set_cursor_visibility(1); SLang_reset_tty(); + SLsig_block_signals(); SLsmg_reset_smg(); SLsig_unblock_signals(); @@ -231,6 +236,7 @@ static void slang_display(caca_display_t *dp) { int x, y, i; + SLsig_block_signals(); for(i = 0; i < caca_get_dirty_rect_count(dp->cv); i++) { uint32_t const *cvchars, *cvattrs; @@ -297,6 +303,7 @@ static void slang_display(caca_display_t *dp) } SLsmg_gotorc(caca_wherey(dp->cv), caca_wherex(dp->cv)); SLsmg_refresh(); + SLsig_unblock_signals(); } static void slang_handle_resize(caca_display_t *dp) @@ -305,15 +312,29 @@ static void slang_handle_resize(caca_display_t *dp) dp->resize.w = SLtt_Screen_Cols; dp->resize.h = SLtt_Screen_Rows; + SLsig_block_signals(); if(dp->resize.w != caca_get_canvas_width(dp->cv) || dp->resize.h != caca_get_canvas_height(dp->cv)) SLsmg_reinit_smg(); + SLsig_unblock_signals(); } static int slang_get_event(caca_display_t *dp, caca_privevent_t *ev) { int intkey; + /* If SIGINT was caught, we pass it to the application as Ctrl-C. */ + if(dp->drv.p->sigint_event > 0) + { + ev->type = CACA_EVENT_KEY_PRESS; + ev->data.key.ch = CACA_KEY_CTRL_C; + ev->data.key.utf32 = 0x03; + ev->data.key.utf8[0] = 0x03; + ev->data.key.utf8[1] = 0; + dp->drv.p->sigint_event--; + return 1; + } + if(!SLang_input_pending(0)) { ev->type = CACA_EVENT_NONE;