New options
scrollbar_thumb_top_offset
scrollbar_thumb_bottom_offset

With these two options we can make scrollbar thumb with round edges so it will 
fit to the scrollbar frame. See screenshots.

offset is a number of pixels to indent from the edge of the center slice of the 
scrollbar's frame.
positive value means we move to the bottom
negative value means we move to the top

in the example given (see screenshots)
scrollbar_thumb_top_offset = -5
scrollbar_thumb_bottom_offset = 5

Sanity checks are present.

-- 
With best regards,
_______________________________
Vladimir Testov, ROSA Laboratory.
www.rosalab.ru

<<attachment: before-scrollbar-thumb-offset.png>>

<<attachment: after-scrollbar-thumb-offset.png>>

diff -Naur grub-new6/grub-core/gfxmenu/gui_list.c grub-new7/grub-core/gfxmenu/gui_list.c
--- grub-new6/grub-core/gfxmenu/gui_list.c	2013-07-17 20:07:37.664064169 +0400
+++ grub-new7/grub-core/gfxmenu/gui_list.c	2013-07-18 17:50:44.251123544 +0400
@@ -56,6 +56,8 @@
   char *scrollbar_thumb_pattern;
   grub_gfxmenu_box_t scrollbar_frame;
   grub_gfxmenu_box_t scrollbar_thumb;
+  int scrollbar_thumb_top_offset;
+  int scrollbar_thumb_bottom_offset;
   int scrollbar_width;
 
   int first_shown_index;
@@ -149,22 +151,26 @@
 
       self->need_to_recreate_scrollbar = 0;
 
+
       /* Sanity checks. */
       if (self->scrollbar_frame != 0 && self->scrollbar_thumb != 0)
         {
           grub_gfxmenu_box_t box = self->menu_box;
           grub_gfxmenu_box_t frame = self->scrollbar_frame;
           grub_gfxmenu_box_t thumb = self->scrollbar_thumb;
-          int box_vertical_pad = (box->get_top_pad (box)
-                                  + box->get_bottom_pad (box));
+
+          int box_top_pad = box->get_top_pad (box);
+          int box_bottom_pad = box->get_bottom_pad (box);
+          int box_vertical_pad = box_top_pad + box_bottom_pad;
+          int frame_top_pad = frame->get_top_pad (frame);
+          int frame_bottom_pad = frame->get_bottom_pad (frame);
+          int frame_vertical_pad = frame_top_pad + frame_bottom_pad;
           int frame_horizontal_pad = (frame->get_left_pad (frame)
                                       + frame->get_right_pad (frame));
-          int frame_vertical_pad = (frame->get_top_pad (frame)
-                                    + frame->get_bottom_pad (frame));
+          int thumb_vertical_pad = (thumb->get_top_pad (thumb)
+                                + thumb->get_bottom_pad (thumb));
           int thumb_horizontal_pad = (thumb->get_left_pad (thumb)
                                       + thumb->get_right_pad (thumb));
-          int thumb_vertical_pad = (thumb->get_top_pad (thumb)
-                                    + thumb->get_bottom_pad (thumb));
           int scrollbar_height = self->bounds.height - box_vertical_pad;
 
           if (self->scrollbar_width < frame_horizontal_pad
@@ -174,6 +180,22 @@
               self->draw_scrollbar = 0;
               return 0;
             }
+
+          /* Check offsets.  */
+          /* Offset from the top of the scrollbar viewport. */
+          int thumb_top = frame_top_pad
+                          + self->scrollbar_thumb_top_offset;
+          /* Offset from the bottom of the scrollbar viewport. */
+          int thumb_bottom = - frame_bottom_pad
+                             + self->scrollbar_thumb_bottom_offset;
+
+          int real_height = scrollbar_height - thumb_top + thumb_bottom;
+          if (thumb_top < 0 || thumb_bottom > 0
+              || real_height < thumb_vertical_pad)
+            {
+              self->scrollbar_thumb_top_offset = 0;
+              self->scrollbar_thumb_bottom_offset = 0;
+            }
         }
     }
 
@@ -250,11 +272,13 @@
                             + thumb->get_bottom_pad (thumb));
   int thumb_horizontal_pad = (thumb->get_left_pad (thumb)
                               + thumb->get_right_pad (thumb));
-  int tracktop = frame->get_top_pad (frame);
+  int tracktop = frame->get_top_pad (frame) + self->scrollbar_thumb_top_offset;
   int tracklen = scrollbar_height - frame_vertical_pad;
   frame->set_content_size (frame,
                            scrollbar_width - frame_horizontal_pad,
                            tracklen);
+  tracklen += - self->scrollbar_thumb_top_offset
+                  + self->scrollbar_thumb_bottom_offset;
   int thumby;
   int thumbheight = tracklen * extent / (max - min) + 1;
   if (thumbheight >= thumb_vertical_pad)
@@ -619,6 +643,16 @@
       grub_free (self->scrollbar_thumb_pattern);
       self->scrollbar_thumb_pattern = value ? grub_strdup (value) : 0;
     }
+  else if (grub_strcmp (name, "scrollbar_thumb_top_offset") == 0)
+    {
+      self->need_to_recreate_scrollbar = 1;
+      self->scrollbar_thumb_top_offset = grub_strtol (value, 0, 10);
+    }
+  else if (grub_strcmp (name, "scrollbar_thumb_bottom_offset") == 0)
+    {
+      self->need_to_recreate_scrollbar = 1;
+      self->scrollbar_thumb_bottom_offset = grub_strtol (value, 0, 10);
+    }
   else if (grub_strcmp (name, "scrollbar_width") == 0)
     {
       self->scrollbar_width = grub_strtoul (value, 0, 10);
@@ -727,6 +761,8 @@
   self->scrollbar_thumb = 0;
   self->scrollbar_frame_pattern = 0;
   self->scrollbar_thumb_pattern = 0;
+  self->scrollbar_thumb_top_offset = 0;
+  self->scrollbar_thumb_bottom_offset = 0;
   self->scrollbar_width = 16;
 
   self->first_shown_index = 0;
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to