remake of one of my previous patches

Now it is much better.

-- 
With best regards,
_______________________________
Vladimir Testov, ROSA Laboratory.
www.rosalab.ru
diff -Naur grub-new9/grub-core/gfxmenu/gui_list.c grub-newA/grub-core/gfxmenu/gui_list.c
--- grub-new9/grub-core/gfxmenu/gui_list.c	2013-03-27 11:27:43.851690260 +0400
+++ grub-newA/grub-core/gfxmenu/gui_list.c	2013-04-10 12:51:47.579232188 +0400
@@ -66,9 +66,11 @@
   int need_to_recreate_boxes;
   char *theme_dir;
   char *menu_box_pattern;
+  char *item_box_pattern;
   char *selected_item_box_pattern;
   grub_gfxmenu_box_t menu_box;
   grub_gfxmenu_box_t selected_item_box;
+  grub_gfxmenu_box_t item_box;
 
   grub_gfxmenu_icon_manager_t icon_manager;
 
@@ -89,6 +91,8 @@
     self->menu_box->destroy (self->menu_box);
   if (self->selected_item_box)
     self->selected_item_box->destroy (self->selected_item_box);
+  if (self->item_box)
+    self->item_box-> destroy (self->item_box);
   if (self->icon_manager)
     grub_gfxmenu_icon_manager_destroy (self->icon_manager);
 
@@ -108,6 +112,9 @@
   grub_gfxmenu_box_t selbox = self->selected_item_box;
   int sel_top_pad = selbox->get_top_pad (selbox);
   int sel_bottom_pad = selbox->get_bottom_pad (selbox);
+  grub_gfxmenu_box_t itbox = self->item_box;
+  int it_top_pad = itbox->get_top_pad (itbox);
+  int it_bottom_pad = itbox->get_bottom_pad (itbox);
       
   if (self->list_version == 0)
     {
@@ -116,8 +123,10 @@
     }
   else
     {
+      int total_top_pad = grub_max (sel_top_pad, it_top_pad);
+      int total_bottom_pad = grub_max (sel_bottom_pad, it_bottom_pad);
       return (self->bounds.height + item_vspace - 2 * boxpad
-              - sel_top_pad - sel_bottom_pad
+              - total_top_pad - total_bottom_pad
               - box_top_pad - box_bottom_pad) / (item_height + item_vspace);
     }
 }
@@ -135,10 +144,15 @@
                              self->selected_item_box_pattern,
                              self->theme_dir);
 
+      grub_gui_recreate_box (&self->item_box,
+                             self->item_box_pattern,
+                             self->theme_dir);
+
       self->need_to_recreate_boxes = 0;
     }
 
-  return (self->menu_box != 0 && self->selected_item_box != 0);
+  return (self->menu_box != 0 && self->selected_item_box != 0
+          && self->item_box != 0);
 }
 
 static int
@@ -237,7 +251,7 @@
 static void
 draw_menu (list_impl_t self, int num_shown_items)
 {
-  if (! self->menu_box || ! self->selected_item_box)
+  if (! self->menu_box || ! self->selected_item_box || ! self->item_box)
     return;
 
   int boxpad = self->item_padding;
@@ -251,9 +265,17 @@
   make_selected_item_visible (self);
 
   grub_gfxmenu_box_t selbox = self->selected_item_box;
-  int sel_leftpad = selbox->get_left_pad (selbox);
+  grub_gfxmenu_box_t itbox = self->item_box;
   int sel_toppad = selbox->get_top_pad (selbox);
+  int it_toppad = itbox->get_top_pad (itbox);
   int item_top = sel_toppad;
+  if ((self->list_version > 0) && (it_toppad > item_top))
+    item_top = it_toppad;
+  int sel_leftpad = selbox->get_left_pad (selbox);
+  int it_leftpad = itbox->get_left_pad (itbox);
+  int total_leftpad = sel_leftpad;
+  if ((self->list_version > 0) && (it_leftpad > total_leftpad))
+    total_leftpad = it_leftpad;
   int menu_index;
   int visible_index;
   struct grub_video_rect oviewport;
@@ -266,25 +288,43 @@
 			   oviewport.height - 2 * boxpad);
 
   int cwidth;
+  int it_cwidth = 0;
   if (self->list_version == 0)
     cwidth = oviewport.width - 2 * boxpad - 2;
   else
-    cwidth = oviewport.width - 2 * boxpad - self->scrollbar_left_pad;
+    {
+      cwidth = oviewport.width - 2 * boxpad - self->scrollbar_left_pad;
+      it_cwidth = cwidth;
+    }
   if (selbox->get_border_width)
     cwidth -= selbox->get_border_width (selbox);
+  if (self->list_version > 0)
+    {
+      if (itbox->get_border_width)
+        it_cwidth -= itbox->get_border_width (itbox);
+    }
   if (self->list_version == 0)
-    selbox->set_content_size (selbox, cwidth, item_height - 1);
+    {
+      selbox->set_content_size (selbox, cwidth, item_height - 1);
+    }
   else
-    selbox->set_content_size (selbox, cwidth, item_height);
+    {
+      selbox->set_content_size (selbox, cwidth, item_height);
+      itbox->set_content_size (itbox, it_cwidth, item_height);
+    }
 
-  int string_left_offset = sel_leftpad + self->icon_width + icon_text_space;
+  int string_left_offset = total_leftpad + self->icon_width + icon_text_space;
   int string_top_offset = (item_height - (ascent + descent)) / 2 + ascent;
   int selected_top_offset;
   int top_offset;
 
+  int total_width = cwidth;
+  if ((self->list_version > 0) && (it_cwidth < total_width))
+    total_width = it_cwidth;
+
   grub_video_rect_t svpsave, sviewport;
   sviewport.x = string_left_offset;
-  sviewport.width = cwidth + sel_leftpad - string_left_offset
+  sviewport.width = total_width + total_leftpad - string_left_offset
                     - self->item_right_space;
   sviewport.height = item_height;
 
@@ -327,6 +367,8 @@
         }
       else
         {
+          if (self->list_version > 0)
+            itbox->draw (itbox, 0, item_top - it_toppad);
           font = item_font;
           color = item_color;
           top_offset = string_top_offset;
@@ -381,7 +423,7 @@
 
   check_boxes (self);
 
-  if (! self->menu_box || ! self->selected_item_box)
+  if (! self->menu_box || ! self->selected_item_box || ! self->item_box)
     return;
 
   grub_gui_set_viewport (&self->bounds, &vpsave);
@@ -492,6 +534,10 @@
       grub_gfxmenu_box_t selbox = self->selected_item_box;
       int sel_top_pad = selbox->get_top_pad (selbox);
       int sel_bottom_pad = selbox->get_bottom_pad (selbox);
+
+      grub_gfxmenu_box_t itbox = self->item_box;
+      int it_top_pad = itbox->get_top_pad (itbox);
+      int it_bottom_pad = itbox->get_bottom_pad (itbox);
       
       *width = grub_font_get_string_width (self->item_font, "Typical OS");
       width_s = grub_font_get_string_width (self->selected_item_font,
@@ -511,11 +557,13 @@
         }
       else
         {
+          int max_top_pad = grub_max (sel_top_pad, it_top_pad);
+          int max_bottom_pad = grub_max (sel_bottom_pad, it_bottom_pad);
           *height = (item_height * num_items
                      + item_vspace * (num_items - 1)
                      + 2 * boxpad
                      + box_top_pad + box_bottom_pad
-                     + sel_top_pad + sel_bottom_pad);
+                     + max_top_pad + max_bottom_pad);
         }
     }
   else
@@ -601,6 +649,12 @@
       grub_free (self->menu_box_pattern);
       self->menu_box_pattern = value ? grub_strdup (value) : 0;
     }
+  else if (grub_strcmp (name, "item_pixmap_style") == 0)
+    {
+      self->need_to_recreate_boxes = 1;
+      grub_free (self->item_box_pattern);
+      self->item_box_pattern = value ? grub_strdup (value) : 0;
+    }
   else if (grub_strcmp (name, "selected_item_pixmap_style") == 0)
     {
       self->need_to_recreate_boxes = 1;
@@ -754,8 +808,10 @@
   self->need_to_recreate_boxes = 0;
   self->theme_dir = 0;
   self->menu_box_pattern = 0;
+  self->item_box_pattern = 0;
   self->selected_item_box_pattern = 0;
   self->menu_box = grub_gfxmenu_create_box (0, 0);
+  self->item_box = grub_gfxmenu_create_box (0, 0);
   self->selected_item_box = grub_gfxmenu_create_box (0, 0);
 
   self->icon_manager = grub_gfxmenu_icon_manager_new ();
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to