Yeah, the patch.

On Monday, July 15, 2013 05:31:11 PM Vladimir Testov wrote:
> First. The structure should be changed a little to apply the 4th patch and
> some of the following patches.
> Second. After applying the patch GRUB won't count some values during every
> redrawing of the boot menu.
> Third. For me, source code became a little more human-readable.
> --
> With best regards,
> _______________________________
> Vladimir Testov, ROSA Laboratory.
> www.rosalab.ru
> 
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
-- 
With best regards,
_______________________________
Vladimir Testov, ROSA Laboratory.
www.rosalab.ru
diff -Naur grub-new2/grub-core/gfxmenu/gui_list.c grub-new3/grub-core/gfxmenu/gui_list.c
--- grub-new2/grub-core/gfxmenu/gui_list.c	2013-07-11 18:17:38.856943765 +0400
+++ grub-new3/grub-core/gfxmenu/gui_list.c	2013-07-15 15:30:26.585116409 +0400
@@ -42,9 +42,13 @@
   int item_spacing;
   grub_font_t item_font;
   grub_font_t selected_item_font;
-  grub_video_rgba_color_t item_color;
+  int selected_item_font_set;
+  grub_video_rgba_color_t item_color_name;
+  grub_video_color_t item_color;
   int selected_item_color_set;
-  grub_video_rgba_color_t selected_item_color;
+  grub_video_rgba_color_t selected_item_color_name;
+  grub_video_color_t selected_item_color;
+  int need_to_recreate_colors;
 
   int draw_scrollbar;
   int need_to_recreate_scrollbar;
@@ -149,6 +153,21 @@
   return (self->scrollbar_frame != 0 && self->scrollbar_thumb != 0);
 }
 
+static void
+check_colors (list_impl_t self)
+{
+  if (self->need_to_recreate_colors)
+    {
+      self->item_color = grub_video_map_rgba_color (self->item_color_name);
+      self->selected_item_color =
+        (self->selected_item_color_set
+         ? grub_video_map_rgba_color (self->selected_item_color_name)
+         : self->item_color);
+
+      self->need_to_recreate_colors = 0;
+    }
+}
+
 static const char *
 list_get_id (void *vself)
 {
@@ -262,17 +281,27 @@
   sviewport.width = cwidth - string_left_offset;
   sviewport.height = item_height;
 
+  check_colors (self);
+
   for (visible_index = 0, menu_index = self->first_shown_index;
        visible_index < num_shown_items && menu_index < self->view->menu->size;
        visible_index++, menu_index++)
     {
       int is_selected = (menu_index == self->view->selected);
       struct grub_video_bitmap *icon;
+      grub_font_t font;
+      grub_video_color_t color;
 
       if (is_selected)
         {
-          selbox->draw (selbox, 0,
-                        item_top - sel_toppad);
+          selbox->draw (selbox, 0, item_top - sel_toppad);
+          font = self->selected_item_font;
+          color = self->selected_item_color;
+        }
+      else
+        {
+          font = self->item_font;
+          color = self->item_color;
         }
 
       icon = get_item_icon (self, menu_index);
@@ -284,20 +313,12 @@
 
       const char *item_title =
         grub_menu_get_entry (self->view->menu, menu_index)->title;
-      grub_font_t font =
-        (is_selected && self->selected_item_font
-         ? self->selected_item_font
-         : self->item_font);
-      grub_video_rgba_color_t text_color =
-        ((is_selected && self->selected_item_color_set)
-         ? self->selected_item_color
-         : self->item_color);
 
       sviewport.y = item_top;
       grub_gui_set_viewport (&sviewport, &svpsave);
       grub_font_draw_string (item_title,
                              font,
-                             grub_video_map_rgba_color (text_color),
+                             color,
                              0,
                              string_top_offset);
       grub_gui_restore_viewport (&svpsave);
@@ -445,17 +466,23 @@
   if (grub_strcmp (name, "item_font") == 0)
     {
       self->item_font = grub_font_get (value);
+      if (!self->selected_item_font_set)
+        self->selected_item_font = self->item_font;
     }
   else if (grub_strcmp (name, "selected_item_font") == 0)
     {
       if (! value || grub_strcmp (value, "inherit") == 0)
-        self->selected_item_font = 0;
+        self->selected_item_font = self->item_font;
       else
-        self->selected_item_font = grub_font_get (value);
+        {
+          self->selected_item_font = grub_font_get (value);
+          self->selected_item_font_set = 1;
+        }
     }
   else if (grub_strcmp (name, "item_color") == 0)
     {
-      grub_video_parse_color (value, &self->item_color);
+      if (grub_video_parse_color (value, &self->item_color_name) == GRUB_ERR_NONE)
+        self->need_to_recreate_colors = 1;
     }
   else if (grub_strcmp (name, "selected_item_color") == 0)
     {
@@ -465,9 +492,12 @@
         }
       else
         {
-          if (grub_video_parse_color (value, &self->selected_item_color)
+          if (grub_video_parse_color (value, &self->selected_item_color_name)
               == GRUB_ERR_NONE)
-            self->selected_item_color_set = 1;
+            {
+              self->selected_item_color_set = 1;
+              self->need_to_recreate_colors = 1;
+            }
         }
     }
   else if (grub_strcmp (name, "icon_width") == 0)
@@ -620,10 +650,15 @@
   self->item_icon_space = 4;
   self->item_spacing = 16;
   self->item_font = default_font;
-  self->selected_item_font = 0;    /* Default to using the item_font.  */
-  self->item_color = default_fg_color;
+  self->selected_item_font = default_font;
+  self->selected_item_font_set = 0; /* Default to using the item_font.  */
+  self->item_color_name = default_fg_color;
+  self->item_color = grub_video_map_rgba_color (self->item_color_name);
   self->selected_item_color_set = 0;  /* Default to using the item_color.  */
-  self->selected_item_color = default_fg_color;
+  self->selected_item_color_name = default_fg_color;
+  self->selected_item_color =
+    grub_video_map_rgba_color (self->selected_item_color_name);
+  self->need_to_recreate_colors = 0;
 
   self->draw_scrollbar = 1;
   self->need_to_recreate_scrollbar = 1;
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to