From 4772bdd99cdd9e958d67fd96c5e7ca02de38c8ab Mon Sep 17 00:00:00 2001 From: Chelovechishko Date: Sat, 25 Feb 2017 20:17:12 +0900 Subject: [PATCH] terminal_ncurses: restore original colors on exit Dirty. Fix #132 --- output/terminal_ncurses.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/output/terminal_ncurses.c b/output/terminal_ncurses.c index e38c85f..c28a587 100644 --- a/output/terminal_ncurses.c +++ b/output/terminal_ncurses.c @@ -11,6 +11,11 @@ struct colors { #define COLOR_REDEFINITION -2 +#define MAX_COLOR_REDEFINITION 2 + +static struct colors the_color_redefinitions[MAX_COLOR_REDEFINITION]; + + static void parse_color(char* color_string, struct colors* color) { if (color_string[0] == '#') { if (!can_change_color()) { @@ -24,6 +29,17 @@ static void parse_color(char* color_string, struct colors* color) { } } +static void remember_color_definition(NCURSES_COLOR_T color_number) { + int index = color_number - 1; // array starts from zero and colors - not + if(the_color_redefinitions[index].color == 0) { + the_color_redefinitions[index].color = color_number; + color_content(color_number, + &the_color_redefinitions[index].R, + &the_color_redefinitions[index].G, + &the_color_redefinitions[index].B); + } +} + // ncurses use color range [0, 1000], and we - [0, 255] #define CURSES_COLOR_COEFFICIENT( X ) (( X ) * 1000.0 / 0xFF + 0.5) #define COLORS_STRUCT_NORMALIZE( X ) CURSES_COLOR_COEFFICIENT( X.R ), \ @@ -35,6 +51,7 @@ char* const color_string, NCURSES_COLOR_T predef_color) { parse_color(color_string, &color); NCURSES_COLOR_T return_color_number = predef_color; if (color.color == COLOR_REDEFINITION) { + remember_color_definition(color_number); init_color(color_number, COLORS_STRUCT_NORMALIZE(color)); return_color_number = color_number; } @@ -55,6 +72,8 @@ char* const bg_color_string, int predef_fg_color, int predef_bg_color) { NCURSES_COLOR_T bg_color_number; bg_color_number = change_color_definition(2, bg_color_string, predef_bg_color); + // do not forget to increase MAX_COLOR_REDEFINITION if you change more color + // definitions NCURSES_COLOR_T color_pair_number = 1; init_pair(color_pair_number, fg_color_number, bg_color_number); @@ -65,7 +84,6 @@ char* const bg_color_string, int predef_fg_color, int predef_bg_color) { refresh(); } - void get_terminal_dim_ncurses(int* width, int* height) { getmaxyx(stdscr, *height, *width); clear(); // clearing in case of resieze @@ -134,15 +152,20 @@ int flastd[200]) { return 0; } - // general: cleanup void cleanup_terminal_ncurses(void) { echo(); system("setfont >/dev/null 2>&1"); system("setfont /usr/share/consolefonts/Lat2-Fixed16.psf.gz >/dev/null 2>&1"); system("setterm -blank 10"); - init_color(1, 1000, 0, 0); - init_color(2, 0, 1000, 0); + for(int i = 0; i < MAX_COLOR_REDEFINITION; ++i) { + if(the_color_redefinitions[i].color) { + init_color(the_color_redefinitions[i].color, + the_color_redefinitions[i].R, + the_color_redefinitions[i].G, + the_color_redefinitions[i].B); + } + } endwin(); system("clear"); }