terminal_ncurses: restore original colors on exit

Dirty. Fix #132
master
Chelovechishko 9 years ago
parent 85ecaa1306
commit 4772bdd99c
  1. 31
      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");
}

Loading…
Cancel
Save