diff --git a/ChangeLog b/ChangeLog index 8024e21d9..f6ac4191b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2008-08-05 Bean + + * util/console.c (grub_console_cur_color): New variable. + (grub_console_standard_color): Likewise. + (grub_console_normal_color): Likewise. + (grub_console_highlight_color): Likewise. + (color_map): Likewise. + (use_color): Likewise. + (NUM_COLORS): New macro. + (grub_ncurses_setcolorstate): Handle color properly. + (grub_ncurses_setcolor): Don't change color here, just remember the + settings, color will be set in grub_ncurses_setcolorstate. + (grub_ncurses_getcolor): New function. + (grub_ncurses_init): Initialize color pairs. + (grub_ncurses_term): New member grub_ncurses_getcolor. + 2008-08-05 Colin D Bennett High resolution timer support. Implemented for x86 CPUs using TSC. diff --git a/util/console.c b/util/console.c index 8c9401c1d..01eb55758 100644 --- a/util/console.c +++ b/util/console.c @@ -41,6 +41,28 @@ static int grub_console_attr = A_NORMAL; +grub_uint8_t grub_console_cur_color = 7; + +static grub_uint8_t grub_console_standard_color = 0x7; +static grub_uint8_t grub_console_normal_color = 0x7; +static grub_uint8_t grub_console_highlight_color = 0x70; + +#define NUM_COLORS 8 + +static grub_uint8_t color_map[NUM_COLORS] = +{ + COLOR_BLACK, + COLOR_BLUE, + COLOR_GREEN, + COLOR_CYAN, + COLOR_RED, + COLOR_MAGENTA, + COLOR_YELLOW, + COLOR_WHITE +}; + +static int use_color; + static void grub_ncurses_putchar (grub_uint32_t c) { @@ -100,24 +122,46 @@ grub_ncurses_setcolorstate (grub_term_color_state state) switch (state) { case GRUB_TERM_COLOR_STANDARD: + grub_console_cur_color = grub_console_standard_color; grub_console_attr = A_NORMAL; break; case GRUB_TERM_COLOR_NORMAL: + grub_console_cur_color = grub_console_normal_color; grub_console_attr = A_NORMAL; break; case GRUB_TERM_COLOR_HIGHLIGHT: + grub_console_cur_color = grub_console_highlight_color; grub_console_attr = A_STANDOUT; break; default: break; } + + if (use_color) + { + grub_uint8_t fg, bg; + + fg = (grub_console_cur_color & 7); + bg = (grub_console_cur_color >> 4) & 7; + + grub_console_attr = (grub_console_cur_color & 8) ? A_BOLD : A_NORMAL; + color_set ((bg << 3) + fg, 0); + } } /* XXX: This function is never called. */ static void grub_ncurses_setcolor (grub_uint8_t normal_color, grub_uint8_t highlight_color) { - color_set (normal_color << 8 | highlight_color, 0); + grub_console_normal_color = normal_color; + grub_console_highlight_color = highlight_color; +} + +static void +grub_ncurses_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_color) +{ + *normal_color = grub_console_normal_color; + *highlight_color = grub_console_highlight_color; } static int saved_char = ERR; @@ -272,7 +316,23 @@ grub_ncurses_init (void) nonl (); intrflush (stdscr, FALSE); keypad (stdscr, TRUE); - start_color (); + + if (has_colors ()) + { + start_color (); + + if ((COLORS >= NUM_COLORS) && (COLOR_PAIRS >= NUM_COLORS * NUM_COLORS)) + { + int i, j, n; + + n = 0; + for (i = 0; i < NUM_COLORS; i++) + for (j = 0; j < NUM_COLORS; j++) + init_pair(n++, color_map[j], color_map[i]); + + use_color = 1; + } + } return 0; } @@ -300,6 +360,7 @@ static struct grub_term grub_ncurses_term = .cls = grub_ncurses_cls, .setcolorstate = grub_ncurses_setcolorstate, .setcolor = grub_ncurses_setcolor, + .getcolor = grub_ncurses_getcolor, .setcursor = grub_ncurses_setcursor, .refresh = grub_ncurses_refresh, .flags = 0,