diff -Naur grub-new7/grub-core/gfxmenu/gui_list.c grub-new8/grub-core/gfxmenu/gui_list.c --- grub-new7/grub-core/gfxmenu/gui_list.c 2013-07-19 19:49:41.875854896 +0400 +++ grub-new8/grub-core/gfxmenu/gui_list.c 2013-07-19 19:52:28.168444172 +0400 @@ -25,6 +25,12 @@ #include #include +enum scrollbar_slices { + SCROLLBAR_SLICE_WEST, + SCROLLBAR_SLICE_CENTER, + SCROLLBAR_SLICE_EAST +}; + struct grub_gui_list_impl { struct grub_gui_list list; @@ -59,6 +65,7 @@ int scrollbar_thumb_top_offset; int scrollbar_thumb_bottom_offset; int scrollbar_width; + int scrollbar_slice; int first_shown_index; @@ -136,6 +143,9 @@ return (self->menu_box != 0 && self->selected_item_box != 0); } +static void +list_get_minimal_size (void *vself, unsigned *width, unsigned *height); + static int check_scrollbar (list_impl_t self) { @@ -198,6 +208,18 @@ self->draw_scrollbar = 0; return 0; } + + /* Checks for scrollbar_slice option. */ + if (self->scrollbar_slice == SCROLLBAR_SLICE_CENTER) + { + unsigned min_menu_width, min_menu_height; + list_get_minimal_size (self, &min_menu_width, &min_menu_height); + if ((int) min_menu_width + self->scrollbar_width > (int) self->bounds.width) + { + self->draw_scrollbar = 0; + return 0; + } + } } } @@ -333,7 +355,7 @@ oviewport.width - 2 * boxpad, oviewport.height - 2 * boxpad); - int cwidth = oviewport.width - 2 * boxpad - 2; + int cwidth = oviewport.width - 2 * boxpad; if (selbox->get_border_width) cwidth -= selbox->get_border_width (selbox); selbox->set_content_size (selbox, cwidth, item_height); @@ -435,11 +457,12 @@ int box_top_pad = box->get_top_pad (box); int box_right_pad = box->get_right_pad (box); int box_bottom_pad = box->get_bottom_pad (box); - grub_video_rect_t vpsave2, content_rect; + grub_video_rect_t vpsave2, content_rect, scrollbar_rect; int num_shown_items = get_num_shown_items (self); int drawing_scrollbar = (self->draw_scrollbar && (num_shown_items < self->view->menu->size) && check_scrollbar (self)); + int scrollbar_width = self->scrollbar_width; content_rect.x = box_left_pad; content_rect.y = box_top_pad; @@ -448,6 +471,36 @@ box->set_content_size (box, content_rect.width, content_rect.height); + scrollbar_rect.width = scrollbar_width; + scrollbar_rect.y = content_rect.y; + scrollbar_rect.height = content_rect.height; + switch (self->scrollbar_slice) + { + case SCROLLBAR_SLICE_WEST: + content_rect.x += 2; + content_rect.width -= 2; + scrollbar_rect.x = box_left_pad - scrollbar_width; + if (scrollbar_width > box_left_pad) + { + scrollbar_rect.x = 0; + scrollbar_rect.width = box_left_pad; + } + break; + case SCROLLBAR_SLICE_CENTER: + content_rect.width -= 2; + if (drawing_scrollbar) + content_rect.width -= scrollbar_width; + scrollbar_rect.x = self->bounds.width - box_right_pad + - scrollbar_width; + break; + case SCROLLBAR_SLICE_EAST: + content_rect.width -= 2; + scrollbar_rect.x = self->bounds.width - box_right_pad; + if (scrollbar_width > box_right_pad) + scrollbar_rect.width = box_right_pad; + break; + } + box->draw (box, 0, 0); grub_gui_set_viewport (&content_rect, &vpsave2); @@ -456,16 +509,12 @@ if (drawing_scrollbar) { - /* Draw the scrollbar in the east slice. */ - content_rect.x = self->bounds.width - box_right_pad; - content_rect.width = box_right_pad; - - grub_gui_set_viewport (&content_rect, &vpsave2); + grub_gui_set_viewport (&scrollbar_rect, &vpsave2); draw_scrollbar (self, self->first_shown_index, num_shown_items, 0, self->view->menu->size, - self->scrollbar_width, - content_rect.height); + scrollbar_width, + scrollbar_rect.height); grub_gui_restore_viewport (&vpsave2); } } @@ -659,6 +708,15 @@ { self->scrollbar_width = grub_strtoul (value, 0, 10); } + else if (grub_strcmp (name, "scrollbar_slice") == 0) + { + if (grub_strcmp (value, "west") == 0) + self->scrollbar_slice = SCROLLBAR_SLICE_WEST; + else if (grub_strcmp (value, "center") == 0) + self->scrollbar_slice = SCROLLBAR_SLICE_CENTER; + else if (grub_strcmp (value, "east") == 0) + self->scrollbar_slice = SCROLLBAR_SLICE_EAST; + } else if (grub_strcmp (name, "scrollbar") == 0) { self->draw_scrollbar = grub_strcmp (value, "false") != 0; @@ -766,6 +824,7 @@ self->scrollbar_thumb_top_offset = 0; self->scrollbar_thumb_bottom_offset = 0; self->scrollbar_width = 16; + self->scrollbar_slice = SCROLLBAR_SLICE_EAST; self->first_shown_index = 0;