From 7271b5089073d84d74709d3986e1bb32234f1c4d Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 28 Nov 2013 05:01:29 +0000 Subject: [PATCH] [mucurses] Use "[2J" ANSI escape sequence to clear screen Signed-off-by: Michael Brown --- src/hci/mucurses/ansi_screen.c | 33 ++++++++++++++++++++++----------- src/hci/mucurses/clear.c | 10 ++++++++++ src/include/curses.h | 13 ++++++++----- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/hci/mucurses/ansi_screen.c b/src/hci/mucurses/ansi_screen.c index d952e5f2..ea9ab80c 100644 --- a/src/hci/mucurses/ansi_screen.c +++ b/src/hci/mucurses/ansi_screen.c @@ -14,12 +14,26 @@ unsigned short _LINES = 24; static unsigned int saved_usage; +static void ansiscr_attrs ( struct _curses_screen *scr, attr_t attrs ) { + int bold = ( attrs & A_BOLD ); + attr_t cpair = PAIR_NUMBER ( attrs ); + short fcol; + short bcol; + + if ( scr->attrs != attrs ) { + scr->attrs = attrs; + pair_content ( cpair, &fcol, &bcol ); + /* ANSI escape sequence to update character attributes */ + printf ( "\033[0;%d;3%d;4%dm", ( bold ? 1 : 22 ), fcol, bcol ); + } +} + static void ansiscr_reset ( struct _curses_screen *scr ) { /* Reset terminal attributes and clear screen */ scr->attrs = 0; scr->curs_x = 0; scr->curs_y = 0; - printf ( "\033[0m" ); + printf ( "\033[0m\033[2J" ); } static void ansiscr_init ( struct _curses_screen *scr ) { @@ -32,6 +46,11 @@ static void ansiscr_exit ( struct _curses_screen *scr ) { console_set_usage ( saved_usage ); } +static void ansiscr_erase ( struct _curses_screen *scr, attr_t attrs ) { + ansiscr_attrs ( scr, attrs ); + printf ( "\033[2J" ); +} + static void ansiscr_movetoyx ( struct _curses_screen *scr, unsigned int y, unsigned int x ) { if ( ( x != scr->curs_x ) || ( y != scr->curs_y ) ) { @@ -45,18 +64,9 @@ static void ansiscr_movetoyx ( struct _curses_screen *scr, static void ansiscr_putc ( struct _curses_screen *scr, chtype c ) { unsigned int character = ( c & A_CHARTEXT ); attr_t attrs = ( c & ( A_ATTRIBUTES | A_COLOR ) ); - int bold = ( attrs & A_BOLD ); - attr_t cpair = PAIR_NUMBER ( attrs ); - short fcol; - short bcol; /* Update attributes if changed */ - if ( attrs != scr->attrs ) { - scr->attrs = attrs; - pair_content ( cpair, &fcol, &bcol ); - /* ANSI escape sequence to update character attributes */ - printf ( "\033[0;%d;3%d;4%dm", ( bold ? 1 : 22 ), fcol, bcol ); - } + ansiscr_attrs ( scr, attrs ); /* Print the actual character */ putchar ( character ); @@ -79,6 +89,7 @@ static bool ansiscr_peek ( struct _curses_screen *scr __unused ) { SCREEN _ansi_screen = { .init = ansiscr_init, .exit = ansiscr_exit, + .erase = ansiscr_erase, .movetoyx = ansiscr_movetoyx, .putc = ansiscr_putc, .getc = ansiscr_getc, diff --git a/src/hci/mucurses/clear.c b/src/hci/mucurses/clear.c index 79b296cf..f5e52ca2 100644 --- a/src/hci/mucurses/clear.c +++ b/src/hci/mucurses/clear.c @@ -88,3 +88,13 @@ int werase ( WINDOW *win ) { wclrtobot( win ); return OK; } + +/** + * Completely clear the screen + * + * @ret rc return status code + */ +int erase ( void ) { + stdscr->scr->erase( stdscr->scr, stdscr->attrs ); + return OK; +} diff --git a/src/include/curses.h b/src/include/curses.h index 20697790..1230e0af 100644 --- a/src/include/curses.h +++ b/src/include/curses.h @@ -37,6 +37,13 @@ typedef struct _curses_screen { void ( *init ) ( struct _curses_screen *scr ); void ( *exit ) ( struct _curses_screen *scr ); + /** + * Erase screen + * + * @v scr screen on which to operate + * @v attrs attributes + */ + void ( * erase ) ( struct _curses_screen *scr, attr_t attrs ); /** * Move cursor to position specified by x,y coords * @@ -242,7 +249,7 @@ extern int echo ( void ); extern int echochar ( const chtype ); extern int endwin ( void ); extern char erasechar ( void ); -//extern int erase ( void ); +extern int erase ( void ); extern void filter ( void ); extern int flash ( void ); extern int flushinp ( void ); @@ -552,10 +559,6 @@ static inline int deleteln ( void ) { return wdeleteln( stdscr ); } -static inline int erase ( void ) { - return werase ( stdscr ); -} - static inline int getch ( void ) { return wgetch ( stdscr ); }