]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/view.c
support scrolling menu entry's text (#1539)
[Ventoy.git] / GRUB2 / MOD_SRC / grub-2.04 / grub-core / gfxmenu / view.c
index 0bd7515e4f24f338d6427c1c59f7964b05c96cb8..51fb1752e57370c9198ae45d3a5322afb98eaf59 100644 (file)
@@ -37,6 +37,7 @@
 #include <grub/gui_string_util.h>
 #include <grub/icon_manager.h>
 #include <grub/i18n.h>
+#include <grub/charset.h>
 
 static void
 init_terminal (grub_gfxmenu_view_t view);
@@ -142,6 +143,8 @@ grub_gfxmenu_view_destroy (grub_gfxmenu_view_t view)
   grub_free (view->title_text);
   grub_free (view->progress_message_text);
   grub_free (view->theme_path);
+  if (view->menu_title_offset)
+    grub_free (view->menu_title_offset);
   if (view->canvas)
     view->canvas->component.ops->destroy (view->canvas);
   grub_free (view);
@@ -428,6 +431,27 @@ grub_gfxmenu_set_chosen_entry (int entry, void *data)
   
 }
 
+void
+grub_gfxmenu_scroll_chosen_entry (void *data, int diren)
+{
+  grub_gfxmenu_view_t view = data;
+  const char *item_title;
+  int off;
+
+  if (!view->menu->size)
+    return;
+
+  item_title = grub_menu_get_entry (view->menu, view->selected)->title;
+  off = view->menu_title_offset[view->selected] + diren;
+
+  if (off < 0
+      || off > grub_utf8_get_num_code (item_title, grub_strlen(item_title)))
+    return;
+
+  view->menu_title_offset[view->selected] = off;
+  grub_gfxmenu_redraw_menu (view);
+}
+
 static void
 grub_gfxmenu_draw_terminal_box (void)
 {