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