diff --git a/ChangeLog b/ChangeLog index 7aa2e9f1e..eff0f90ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,34 @@ +2007-12-25 Robert Millan + + * include/grub/term.h (struct grub_term): Add `getcolor' function. + (grub_getcolor): New function. + + * kern/term.c (grub_getcolor): New function. + * normal/menu.c (GRUB_COLOR_MENU_NORMAL): New macro. + (GRUB_COLOR_MENU_HIGHLIGHT): New macro. + (print_entry): Set normal and highlight colors to + `GRUB_COLOR_MENU_NORMAL' and `GRUB_COLOR_MENU_HIGHLIGHT', + respectively, before printing and restore them to old + values afterwards. + (grub_menu_init_page): Likewise. Fill an additional colored space + that would otherwise be left blank. + + * term/efi/console.c (grub_console_getcolor): New function. + (struct grub_console_term.getcolor): New variable. + * term/i386/pc/console.c (grub_console_getcolor): New function. + (struct grub_console_term.getcolor): New variable. + * term/ieee1275/ofconsole.c (grub_ofconsole_getcolor): New function. + (struct grub_console_term.getcolor): New variable. + + * term/i386/pc/serial.c (grub_serial_setcolor): Remove function. + (struct grub_console_term.setcolor): Remove variable. + * term/i386/pc/vesafb.c (grub_virtual_screen_setcolor): Remove function. + (struct grub_console_term.setcolor): Remove variable. + * term/i386/pc/vga.c (grub_vga_setcolor): Remove function. + (struct grub_console_term.setcolor): Remove variable. + * term/gfxterm.c (grub_virtual_screen_setcolor): Remove function. + (struct grub_console_term.setcolor): Remove variable. + 2007-12-25 Robert Millan * configure.ac: Search for possible unifont.hex locations, and diff --git a/include/grub/term.h b/include/grub/term.h index 5cdef5377..f9d4e93f5 100644 --- a/include/grub/term.h +++ b/include/grub/term.h @@ -164,6 +164,10 @@ struct grub_term color is VGA's. */ void (*setcolor) (grub_uint8_t normal_color, grub_uint8_t highlight_color); + /* Get the normal color and the highlight color. The format of each + color is VGA's. */ + void (*getcolor) (grub_uint8_t *normal_color, grub_uint8_t *highlight_color); + /* Turn on/off the cursor. */ void (*setcursor) (int on); @@ -197,6 +201,8 @@ void EXPORT_FUNC(grub_cls) (void); void EXPORT_FUNC(grub_setcolorstate) (grub_term_color_state state); void EXPORT_FUNC(grub_setcolor) (grub_uint8_t normal_color, grub_uint8_t highlight_color); +void EXPORT_FUNC(grub_getcolor) (grub_uint8_t *normal_color, + grub_uint8_t *highlight_color); int EXPORT_FUNC(grub_setcursor) (int on); int EXPORT_FUNC(grub_getcursor) (void); void EXPORT_FUNC(grub_refresh) (void); diff --git a/kern/term.c b/kern/term.c index 726adf9e3..4c45d713d 100644 --- a/kern/term.c +++ b/kern/term.c @@ -230,6 +230,13 @@ grub_setcolor (grub_uint8_t normal_color, grub_uint8_t highlight_color) (grub_cur_term->setcolor) (normal_color, highlight_color); } +void +grub_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_color) +{ + if (grub_cur_term->getcolor) + (grub_cur_term->getcolor) (normal_color, highlight_color); +} + int grub_setcursor (int on) { diff --git a/normal/menu.c b/normal/menu.c index 913b730be..04ee0c1df 100644 --- a/normal/menu.c +++ b/normal/menu.c @@ -25,6 +25,9 @@ #include #include +#define GRUB_COLOR_MENU_NORMAL 0x07 +#define GRUB_COLOR_MENU_HIGHLIGHT 0x70 + static void draw_border (void) { @@ -105,7 +108,8 @@ print_entry (int y, int highlight, grub_menu_entry_t entry) grub_ssize_t len; grub_uint32_t *unicode_title; grub_ssize_t i; - + grub_uint8_t normal_code, highlight_code; + title = entry ? entry->title : ""; unicode_title = grub_malloc (grub_strlen (title) * sizeof (*unicode_title)); if (! unicode_title) @@ -121,6 +125,8 @@ print_entry (int y, int highlight, grub_menu_entry_t entry) return; } + grub_getcolor (&normal_code, &highlight_code); + grub_setcolor (GRUB_COLOR_MENU_NORMAL, GRUB_COLOR_MENU_HIGHLIGHT); grub_setcolorstate (highlight ? GRUB_TERM_COLOR_HIGHLIGHT : GRUB_TERM_COLOR_NORMAL); @@ -153,8 +159,12 @@ print_entry (int y, int highlight, grub_menu_entry_t entry) x++; } } + grub_setcolorstate (GRUB_TERM_COLOR_NORMAL); + grub_putchar (' '); + grub_gotoxy (GRUB_TERM_CURSOR_X, y); + grub_setcolor (normal_code, highlight_code); grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); grub_free (unicode_title); } @@ -199,9 +209,15 @@ print_entries (grub_menu_t menu, int first, int offset) void grub_menu_init_page (int nested, int edit) { + grub_uint8_t normal_code, highlight_code; + grub_getcolor (&normal_code, &highlight_code); + grub_setcolor (GRUB_COLOR_MENU_NORMAL, GRUB_COLOR_MENU_HIGHLIGHT); + grub_normal_init_page (); draw_border (); print_message (nested, edit); + + grub_setcolor (normal_code, highlight_code); } /* Return the current timeout. If the variable "timeout" is not set or diff --git a/term/efi/console.c b/term/efi/console.c index c373bace9..af198e56e 100644 --- a/term/efi/console.c +++ b/term/efi/console.c @@ -259,6 +259,13 @@ grub_console_setcolor (grub_uint8_t normal_color, grub_uint8_t highlight_color) grub_console_highlight_color = highlight_color; } +static void +grub_console_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_color) +{ + *normal_color = grub_console_normal_color; + *highlight_color = grub_console_highlight_color; +} + static void grub_console_setcursor (int on) { @@ -283,6 +290,7 @@ static struct grub_term grub_console_term = .cls = grub_console_cls, .setcolorstate = grub_console_setcolorstate, .setcolor = grub_console_setcolor, + .getcolor = grub_console_getcolor, .setcursor = grub_console_setcursor, .flags = 0, .next = 0 diff --git a/term/gfxterm.c b/term/gfxterm.c index 7e49a81ad..0ace430a9 100644 --- a/term/gfxterm.c +++ b/term/gfxterm.c @@ -839,14 +839,6 @@ grub_virtual_screen_setcolorstate (grub_term_color_state state) } } -static void -grub_virtual_screen_setcolor (grub_uint8_t normal_color, - grub_uint8_t highlight_color) -{ - virtual_screen.fg_color_setting = grub_video_map_color (normal_color); - virtual_screen.bg_color_setting = grub_video_map_color (highlight_color); -} - static void grub_gfxterm_setcursor (int on) { @@ -882,7 +874,6 @@ static struct grub_term grub_video_term = .gotoxy = grub_gfxterm_gotoxy, .cls = grub_gfxterm_cls, .setcolorstate = grub_virtual_screen_setcolorstate, - .setcolor = grub_virtual_screen_setcolor, .setcursor = grub_gfxterm_setcursor, .refresh = grub_gfxterm_refresh, .flags = 0, diff --git a/term/i386/pc/console.c b/term/i386/pc/console.c index 3d5db882d..9fae1181f 100644 --- a/term/i386/pc/console.c +++ b/term/i386/pc/console.c @@ -117,6 +117,13 @@ grub_console_setcolor (grub_uint8_t normal_color, grub_uint8_t highlight_color) grub_console_highlight_color = highlight_color; } +static void +grub_console_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_color) +{ + *normal_color = grub_console_normal_color; + *highlight_color = grub_console_highlight_color; +} + static struct grub_term grub_console_term = { .name = "console", @@ -132,6 +139,7 @@ static struct grub_term grub_console_term = .cls = grub_console_cls, .setcolorstate = grub_console_setcolorstate, .setcolor = grub_console_setcolor, + .getcolor = grub_console_getcolor, .setcursor = grub_console_setcursor, .flags = 0, .next = 0 diff --git a/term/i386/pc/serial.c b/term/i386/pc/serial.c index 578ea4041..1fc2be137 100644 --- a/term/i386/pc/serial.c +++ b/term/i386/pc/serial.c @@ -453,13 +453,6 @@ grub_serial_setcolorstate (const grub_term_color_state state) keep_track = 1; } -static void -grub_serial_setcolor (grub_uint8_t normal_color __attribute__ ((unused)), - grub_uint8_t highlight_color __attribute__ ((unused))) -{ - /* FIXME */ -} - static void grub_serial_setcursor (const int on) { @@ -483,7 +476,6 @@ static struct grub_term grub_serial_term = .gotoxy = grub_serial_gotoxy, .cls = grub_serial_cls, .setcolorstate = grub_serial_setcolorstate, - .setcolor = grub_serial_setcolor, .setcursor = grub_serial_setcursor, .flags = 0, .next = 0 diff --git a/term/i386/pc/vesafb.c b/term/i386/pc/vesafb.c index 8614a3b8a..d14ad89ca 100644 --- a/term/i386/pc/vesafb.c +++ b/term/i386/pc/vesafb.c @@ -564,13 +564,6 @@ grub_virtual_screen_setcolorstate (grub_term_color_state state) } } -static void -grub_virtual_screen_setcolor (grub_uint8_t normal_color __attribute__ ((unused)), - grub_uint8_t highlight_color __attribute__ ((unused))) -{ - /* FIXME */ -} - static void grub_vesafb_setcursor (int on) { @@ -599,7 +592,6 @@ static struct grub_term grub_vesafb_term = .gotoxy = grub_vesafb_gotoxy, .cls = grub_vesafb_cls, .setcolorstate = grub_virtual_screen_setcolorstate, - .setcolor = grub_virtual_screen_setcolor, .setcursor = grub_vesafb_setcursor, .flags = 0, .next = 0 diff --git a/term/i386/pc/vga.c b/term/i386/pc/vga.c index 0be79a7f5..16e4dee24 100644 --- a/term/i386/pc/vga.c +++ b/term/i386/pc/vga.c @@ -459,13 +459,6 @@ grub_vga_setcolorstate (grub_term_color_state state) } } -static void -grub_vga_setcolor (grub_uint8_t normal_color __attribute__ ((unused)), - grub_uint8_t highlight_color __attribute__ ((unused))) -{ - /* FIXME */ -} - static void grub_vga_setcursor (int on) { @@ -494,7 +487,6 @@ static struct grub_term grub_vga_term = .gotoxy = grub_vga_gotoxy, .cls = grub_vga_cls, .setcolorstate = grub_vga_setcolorstate, - .setcolor = grub_vga_setcolor, .setcursor = grub_vga_setcursor, .flags = 0, .next = 0 diff --git a/term/ieee1275/ofconsole.c b/term/ieee1275/ofconsole.c index 9eb1202a0..845f198fd 100644 --- a/term/ieee1275/ofconsole.c +++ b/term/ieee1275/ofconsole.c @@ -129,6 +129,13 @@ grub_ofconsole_setcolor (grub_uint8_t normal_color, bgcolor = highlight_color; } +static void +grub_ofconsole_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_color) +{ + *normal_color = fgcolor; + *highlight_color = bgcolor; +} + static int grub_ofconsole_readkey (int *key) { @@ -364,6 +371,7 @@ static struct grub_term grub_ofconsole_term = .cls = grub_ofconsole_cls, .setcolorstate = grub_ofconsole_setcolorstate, .setcolor = grub_ofconsole_setcolor, + .getcolor = grub_ofconsole_getcolor, .setcursor = grub_ofconsole_setcursor, .refresh = grub_ofconsole_refresh, .flags = 0,