Currently every loaded module starts with hardcoded default colors,
ignoring current value of variables normal_color and highlight_color.
This provides inconsistent experience because which color is actually
used for terminal window depends in which place of grub.cfg color is
set. Additionally even if color is set in terminal window, terminal is
closed and reopened again, color is reset to hardcoded default.

The patch makes sure current values are applied on module load. Also
normal_color is applied when new instance of terminal window is created.

In principle this patch makes term->normal_color and
term->highlight_color redundant, as there is no place where they are set
individually, they always follow variables normal_color,
highlight_color.

-andrey
=== modified file 'grub-core/kern/term.c'
Index: b/grub-core/kern/term.c
===================================================================
--- a/grub-core/kern/term.c
+++ b/grub-core/kern/term.c
@@ -23,6 +23,9 @@
 #include <grub/env.h>
 #include <grub/time.h>
 
+grub_uint8_t grub_term_normal_color = GRUB_TERM_DEFAULT_NORMAL_COLOR;
+grub_uint8_t grub_term_highlight_color = GRUB_TERM_DEFAULT_HIGHLIGHT_COLOR;
+
 struct grub_term_output *grub_term_outputs_disabled;
 struct grub_term_input *grub_term_inputs_disabled;
 struct grub_term_output *grub_term_outputs;
Index: b/grub-core/normal/color.c
===================================================================
--- a/grub-core/normal/color.c
+++ b/grub-core/normal/color.c
@@ -106,8 +106,6 @@ free_and_return:
   return result;
 }
 
-static grub_uint8_t color_normal, color_highlight;
-
 static void
 set_colors (void)
 {
@@ -116,7 +114,7 @@ set_colors (void)
   FOR_ACTIVE_TERM_OUTPUTS(term)
   {
     /* Reloads terminal `normal' and `highlight' colors.  */
-    grub_term_setcolor (term, color_normal, color_highlight);
+    grub_term_setcolor (term, grub_term_normal_color, grub_term_highlight_color);
 
     /* Propagates `normal' color to terminal current color.  */
     grub_term_setcolorstate (term, GRUB_TERM_COLOR_NORMAL);
@@ -128,7 +126,7 @@ char *
 grub_env_write_color_normal (struct grub_env_var *var __attribute__ ((unused)),
 			     const char *val)
 {
-  if (grub_parse_color_name_pair (&color_normal, val))
+  if (grub_parse_color_name_pair (&grub_term_normal_color, val))
     return NULL;
 
   set_colors ();
@@ -141,7 +139,7 @@ char *
 grub_env_write_color_highlight (struct grub_env_var *var __attribute__ ((unused)),
 				const char *val)
 {
-  if (grub_parse_color_name_pair (&color_highlight, val))
+  if (grub_parse_color_name_pair (&grub_term_highlight_color, val))
     return NULL;
 
   set_colors ();
Index: b/grub-core/normal/main.c
===================================================================
--- a/grub-core/normal/main.c
+++ b/grub-core/normal/main.c
@@ -539,8 +539,8 @@ GRUB_MOD_INIT(normal)
   grub_env_export ("color_highlight");
 
   /* Set default color names.  */
-  grub_env_set ("color_normal", "white/black");
-  grub_env_set ("color_highlight", "black/white");
+  grub_env_set ("color_normal", "light-gray/black");
+  grub_env_set ("color_highlight", "black/light-gray");
 
   for (i = 0; i < ARRAY_SIZE (features); i++)
     {
Index: b/grub-core/term/gfxterm.c
===================================================================
--- a/grub-core/term/gfxterm.c
+++ b/grub-core/term/gfxterm.c
@@ -253,7 +253,7 @@ grub_virtual_screen_setup (unsigned int
 
   virtual_screen.standard_color_setting = DEFAULT_STANDARD_COLOR;
 
-  virtual_screen.term_color = GRUB_TERM_DEFAULT_NORMAL_COLOR;
+  virtual_screen.term_color = grub_term_normal_color;
 
   set_term_color (virtual_screen.term_color);
 
Index: b/include/grub/term.h
===================================================================
--- a/include/grub/term.h
+++ b/include/grub/term.h
@@ -233,6 +233,9 @@ typedef struct grub_term_output *grub_te
 #define GRUB_TERM_DEFAULT_HIGHLIGHT_COLOR 0x70
 #define GRUB_TERM_DEFAULT_STANDARD_COLOR 0x07
 
+extern grub_uint8_t EXPORT_VAR(grub_term_normal_color);
+extern grub_uint8_t EXPORT_VAR(grub_term_highlight_color);
+
 extern struct grub_term_output *EXPORT_VAR(grub_term_outputs_disabled);
 extern struct grub_term_input *EXPORT_VAR(grub_term_inputs_disabled);
 extern struct grub_term_output *EXPORT_VAR(grub_term_outputs);
@@ -273,6 +276,9 @@ static inline void
 grub_term_register_output (const char *name __attribute__ ((unused)),
 			   grub_term_output_t term)
 {
+  term->normal_color = grub_term_normal_color;
+  term->highlight_color = grub_term_highlight_color;
+
   if (grub_term_outputs)
     grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs_disabled),
 		    GRUB_AS_LIST (term));
@@ -289,6 +295,9 @@ static inline void
 grub_term_register_output_inactive (const char *name __attribute__ ((unused)),
 				    grub_term_output_t term)
 {
+  term->normal_color = grub_term_normal_color;
+  term->highlight_color = grub_term_highlight_color;
+
   grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs_disabled),
 		  GRUB_AS_LIST (term));
 }
@@ -297,6 +306,9 @@ static inline void
 grub_term_register_output_active (const char *name __attribute__ ((unused)),
 				  grub_term_output_t term)
 {
+  term->normal_color = grub_term_normal_color;
+  term->highlight_color = grub_term_highlight_color;
+
   if (! term->init || term->init (term) == GRUB_ERR_NONE)
     grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs),
 		    GRUB_AS_LIST (term));
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to