diff -x '*.mk' -Nurp grub2/conf/i386-pc.rmk grub2.color/conf/i386-pc.rmk
--- grub2/conf/i386-pc.rmk 2007-12-26 08:51:18.000000000 +0100
+++ grub2.color/conf/i386-pc.rmk 2008-01-01 17:43:27.000000000 +0100
@@ -111,7 +111,7 @@ grub_emu_SOURCES = commands/boot.c comma
kern/loader.c kern/main.c kern/misc.c kern/parser.c \
grub_script.tab.c kern/partition.c kern/rescue.c kern/term.c \
normal/arg.c normal/cmdline.c normal/command.c normal/function.c\
- normal/completion.c normal/main.c \
+ normal/completion.c normal/main.c normal/color.c \
normal/menu.c normal/menu_entry.c normal/misc.c normal/script.c \
partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \
partmap/acorn.c partmap/gpt.c \
@@ -168,6 +168,7 @@ normal_mod_DEPENDENCIES = grub_script.ta
normal_mod_SOURCES = normal/arg.c normal/cmdline.c normal/command.c \
normal/completion.c normal/execute.c \
normal/function.c normal/lexer.c normal/main.c normal/menu.c \
+ normal/color.c \
normal/menu_entry.c normal/misc.c grub_script.tab.c \
normal/script.c normal/i386/setjmp.S
normal_mod_CFLAGS = $(COMMON_CFLAGS)
diff -x '*.mk' -Nurp grub2/include/grub/normal.h grub2.color/include/grub/normal.h
--- grub2/include/grub/normal.h 2007-07-22 01:32:22.000000000 +0200
+++ grub2.color/include/grub/normal.h 2008-01-01 18:06:36.000000000 +0100
@@ -154,6 +154,8 @@ grub_err_t grub_normal_print_device_info
grub_err_t grub_normal_menu_addentry (const char *title,
struct grub_script *script,
const char *sourcecode);
+void grub_normal_color_reload (void);
+void wait_after_message (void);
#ifdef GRUB_UTIL
void grub_normal_init (void);
diff -x '*.mk' -Nurp grub2/normal/color.c grub2.color/normal/color.c
--- grub2/normal/color.c 1970-01-01 01:00:00.000000000 +0100
+++ grub2.color/normal/color.c 2008-01-01 18:03:28.000000000 +0100
@@ -0,0 +1,119 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 1999,2000,2001,2002,2003,2004,2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+
+/* Borrowed from GRUB Legacy */
+static char *color_list[16] =
+{
+ "black",
+ "blue",
+ "green",
+ "cyan",
+ "red",
+ "magenta",
+ "brown",
+ "light-gray",
+ "dark-gray",
+ "light-blue",
+ "light-green",
+ "light-cyan",
+ "light-red",
+ "light-magenta",
+ "yellow",
+ "white"
+};
+
+static int
+parse_color_name (grub_uint8_t *ret, char *name)
+{
+ grub_uint8_t i;
+ for (i = 0; i < sizeof (color_list) / sizeof (*color_list); i++)
+ if (! grub_strcmp (name, color_list[i]))
+ {
+ *ret = i;
+ return 0;
+ }
+ return -1;
+}
+
+void
+grub_parse_color_name_pair (grub_uint8_t *ret, char *name)
+{
+ grub_uint8_t fg, bg;
+ char *fg_name, *bg_name;
+
+ /* nothing specified by user */
+ if (name == NULL)
+ return;
+
+ fg_name = grub_strdup (name);
+ if (fg_name == NULL)
+ {
+ /* "out of memory" message was printed by grub_strdup() */
+ wait_after_message ();
+ return;
+ }
+
+ bg_name = grub_strchr (fg_name, '/');
+ if (bg_name == NULL)
+ {
+ grub_printf ("Warning: syntax error (missing slash) in `%s'\n", fg_name);
+ wait_after_message ();
+ goto free_and_return;
+ }
+
+ *(bg_name++) = '\0';
+
+ if (parse_color_name (&fg, fg_name) == -1)
+ {
+ grub_printf ("Warning: invalid foreground color `%s'\n", fg_name);
+ wait_after_message ();
+ goto free_and_return;
+ }
+ if (parse_color_name (&bg, bg_name) == -1)
+ {
+ grub_printf ("Warning: invalid background color `%s'\n", bg_name);
+ wait_after_message ();
+ goto free_and_return;
+ }
+
+ *ret = (bg << 4) | fg;
+
+free_and_return:
+ grub_free (fg_name);
+}
+
+/* Replace default console colors with the ones specified by
+ user (if any). */
+void
+grub_normal_color_reload (void)
+{
+ grub_uint8_t color_normal, color_highlight;
+
+ grub_getcolor (&color_normal, &color_highlight);
+
+ grub_parse_color_name_pair (&color_normal, grub_env_get ("color_normal"));
+ grub_parse_color_name_pair (&color_highlight, grub_env_get ("color_highlight"));
+
+ grub_setcolor (color_normal, color_highlight);
+ grub_setcolorstate (GRUB_TERM_COLOR_NORMAL);
+}
diff -x '*.mk' -Nurp grub2/normal/command.c grub2.color/normal/command.c
--- grub2/normal/command.c 2007-07-22 01:32:29.000000000 +0200
+++ grub2.color/normal/command.c 2008-01-01 18:06:16.000000000 +0100
@@ -365,6 +365,14 @@ lsmod_command (struct grub_arg_list *sta
return 0;
}
+static grub_err_t
+color_command (struct grub_arg_list *state __attribute__ ((unused)),
+ int argc __attribute__ ((unused)), char **args __attribute__ ((unused)))
+{
+ grub_normal_color_reload ();
+ return 0;
+}
+
void
grub_command_init (void)
{
@@ -391,4 +399,7 @@ grub_command_init (void)
grub_register_command ("lsmod", lsmod_command, GRUB_COMMAND_FLAG_BOTH,
"lsmod", "Show loaded modules.", 0);
+
+ grub_register_command ("color", color_command, GRUB_COMMAND_FLAG_BOTH,
+ "color", "Set colors in the current terminal.", 0);
}
diff -x '*.mk' -Nurp grub2/normal/main.c grub2.color/normal/main.c
--- grub2/normal/main.c 2007-07-22 01:32:29.000000000 +0200
+++ grub2.color/normal/main.c 2008-01-01 18:04:33.000000000 +0100
@@ -268,12 +268,7 @@ read_config_file (const char *config, in
grub_file_close (file);
if (errors > 0)
- {
- /* Wait until the user pushes any key so that the user can
- see what happened. */
- grub_printf ("\nPress any key to continue...");
- (void) grub_getkey ();
- }
+ wait_after_message ();
return newmenu;
}
diff -x '*.mk' -Nurp grub2/normal/menu.c grub2.color/normal/menu.c
--- grub2/normal/menu.c 2007-12-25 12:10:46.000000000 +0100
+++ grub2.color/normal/menu.c 2008-01-01 18:29:05.000000000 +0100
@@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+ * Copyright (C) 2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -25,8 +25,17 @@
#include
#include
-#define GRUB_COLOR_MENU_NORMAL 0x07
-#define GRUB_COLOR_MENU_HIGHLIGHT 0x70
+static grub_uint8_t grub_color_menu_normal;
+static grub_uint8_t grub_color_menu_highlight;
+
+/* Wait until the user pushes any key so that the user
+ can see what happened. */
+void
+wait_after_message (void)
+{
+ grub_printf ("\nPress any key to continue...");
+ (void) grub_getkey ();
+}
static void
draw_border (void)
@@ -57,7 +66,7 @@ draw_border (void)
grub_putcode (GRUB_TERM_DISP_HLINE);
grub_putcode (GRUB_TERM_DISP_LR);
- grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
+ grub_setcolorstate (GRUB_TERM_COLOR_NORMAL);
grub_gotoxy (GRUB_TERM_MARGIN,
(GRUB_TERM_TOP_BORDER_Y + GRUB_TERM_NUM_ENTRIES
@@ -67,6 +76,8 @@ draw_border (void)
static void
print_message (int nested, int edit)
{
+ grub_setcolorstate (GRUB_TERM_COLOR_NORMAL);
+
if (edit)
{
grub_printf ("\n\
@@ -108,7 +119,7 @@ print_entry (int y, int highlight, grub_
grub_ssize_t len;
grub_uint32_t *unicode_title;
grub_ssize_t i;
- grub_uint8_t normal_code, highlight_code;
+ grub_uint8_t old_color_normal, old_color_highlight;
title = entry ? entry->title : "";
unicode_title = grub_malloc (grub_strlen (title) * sizeof (*unicode_title));
@@ -124,9 +135,9 @@ print_entry (int y, int highlight, grub_
grub_free (unicode_title);
return;
}
-
- grub_getcolor (&normal_code, &highlight_code);
- grub_setcolor (GRUB_COLOR_MENU_NORMAL, GRUB_COLOR_MENU_HIGHLIGHT);
+
+ grub_getcolor (&old_color_normal, &old_color_highlight);
+ grub_setcolor (grub_color_menu_normal, grub_color_menu_highlight);
grub_setcolorstate (highlight
? GRUB_TERM_COLOR_HIGHLIGHT
: GRUB_TERM_COLOR_NORMAL);
@@ -164,8 +175,8 @@ print_entry (int y, int highlight, grub_
grub_gotoxy (GRUB_TERM_CURSOR_X, y);
- grub_setcolor (normal_code, highlight_code);
- grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
+ grub_setcolor (old_color_normal, old_color_highlight);
+ grub_setcolorstate (GRUB_TERM_COLOR_NORMAL);
grub_free (unicode_title);
}
@@ -209,15 +220,23 @@ print_entries (grub_menu_t menu, int fir
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_uint8_t old_color_normal, old_color_highlight;
+
+ grub_getcolor (&old_color_normal, &old_color_highlight);
+
+ /* By default, use the same colors for the menu. */
+ grub_color_menu_normal = old_color_normal;
+ grub_color_menu_highlight = old_color_highlight;
+
+ /* Then give user a chance to replace them. */
+ grub_parse_color_name_pair (&grub_color_menu_normal, grub_env_get ("menu_color_normal"));
+ grub_parse_color_name_pair (&grub_color_menu_highlight, grub_env_get ("menu_color_highlight"));
grub_normal_init_page ();
+ grub_setcolor (grub_color_menu_normal, grub_color_menu_highlight);
draw_border ();
+ grub_setcolor (old_color_normal, old_color_highlight);
print_message (nested, edit);
-
- grub_setcolor (normal_code, highlight_code);
}
/* Return the current timeout. If the variable "timeout" is not set or
@@ -501,10 +520,7 @@ grub_menu_run (grub_menu_t menu, int nes
grub_print_error ();
grub_errno = GRUB_ERR_NONE;
- /* Wait until the user pushes any key so that the user
- can see what happened. */
- grub_printf ("\nPress any key to continue...");
- (void) grub_getkey ();
+ wait_after_message ();
}
}
}
diff -x '*.mk' -Nurp grub2/normal/menu_entry.c grub2.color/normal/menu_entry.c
--- grub2/normal/menu_entry.c 2007-12-30 09:52:05.000000000 +0100
+++ grub2.color/normal/menu_entry.c 2008-01-01 17:30:37.000000000 +0100
@@ -1030,10 +1030,7 @@ run (struct screen *screen)
{
grub_print_error ();
grub_errno = GRUB_ERR_NONE;
- /* Wait until the user pushes any key so that the user
- can see what happened. */
- grub_printf ("\nPress any key to continue...");
- (void) grub_getkey ();
+ wait_after_message ();
}
return 1;