Blame SOURCES/0392-grub-core-gfxmenu-gui_list.c-Refresh-first_shown_ent.patch

f96e0b
From a4ff5d5fe50365bd4ba31addc3fa67b59aa59d78 Mon Sep 17 00:00:00 2001
f96e0b
From: Vladimir Testov <vladimir.testov@rosalab.ru>
f96e0b
Date: Mon, 29 Apr 2013 13:40:11 +0200
f96e0b
Subject: [PATCH 392/482] 	* grub-core/gfxmenu/gui_list.c: Refresh
f96e0b
 first_shown_entry value when 	cached view is reused. 	*
f96e0b
 grub-core/gfxmenu/view.c: Call the refresh procedure for all 	open boot
f96e0b
 menus.
f96e0b
f96e0b
---
f96e0b
 ChangeLog                    |  7 +++++++
f96e0b
 grub-core/gfxmenu/gui_list.c | 13 ++++++++++++-
f96e0b
 grub-core/gfxmenu/view.c     | 22 ++++++++++++++++++++++
f96e0b
 include/grub/gui.h           |  2 ++
f96e0b
 4 files changed, 43 insertions(+), 1 deletion(-)
f96e0b
f96e0b
diff --git a/ChangeLog b/ChangeLog
f96e0b
index eff0b6b..86effa0 100644
f96e0b
--- a/ChangeLog
f96e0b
+++ b/ChangeLog
f96e0b
@@ -1,3 +1,10 @@
f96e0b
+2013-04-29 Vladimir Testov <vladimir.testov@rosalab.ru>
f96e0b
+
f96e0b
+	* grub-core/gfxmenu/gui_list.c: Refresh first_shown_entry value when
f96e0b
+	cached view is reused.
f96e0b
+	* grub-core/gfxmenu/view.c: Call the refresh procedure for all
f96e0b
+	open boot menus.
f96e0b
+
f96e0b
 2013-04-29  Vladimir Serbinenko  <phcoder@gmail.com>
f96e0b
 
f96e0b
 	Unify more code in grub-install_header.
f96e0b
diff --git a/grub-core/gfxmenu/gui_list.c b/grub-core/gfxmenu/gui_list.c
f96e0b
index 1982d9a..a06603b 100644
f96e0b
--- a/grub-core/gfxmenu/gui_list.c
f96e0b
+++ b/grub-core/gfxmenu/gui_list.c
f96e0b
@@ -541,6 +541,16 @@ list_set_view_info (void *vself,
f96e0b
   self->view = view;
f96e0b
 }
f96e0b
 
f96e0b
+/* Refresh list variables */
f96e0b
+static void
f96e0b
+list_refresh_info (void *vself,
f96e0b
+                   grub_gfxmenu_view_t view)
f96e0b
+{
f96e0b
+  list_impl_t self = vself;
f96e0b
+  if (view->nested)
f96e0b
+    self->first_shown_index = 0;
f96e0b
+}
f96e0b
+
f96e0b
 static struct grub_gui_component_ops list_comp_ops =
f96e0b
   {
f96e0b
     .destroy = list_destroy,
f96e0b
@@ -557,7 +567,8 @@ static struct grub_gui_component_ops list_comp_ops =
f96e0b
 
f96e0b
 static struct grub_gui_list_ops list_ops =
f96e0b
 {
f96e0b
-  .set_view_info = list_set_view_info
f96e0b
+  .set_view_info = list_set_view_info,
f96e0b
+  .refresh_list = list_refresh_info
f96e0b
 };
f96e0b
 
f96e0b
 grub_gui_component_t
f96e0b
diff --git a/grub-core/gfxmenu/view.c b/grub-core/gfxmenu/view.c
f96e0b
index 6de96ca..475fc76 100644
f96e0b
--- a/grub-core/gfxmenu/view.c
f96e0b
+++ b/grub-core/gfxmenu/view.c
f96e0b
@@ -237,6 +237,27 @@ update_menu_components (grub_gfxmenu_view_t view)
f96e0b
 }
f96e0b
 
f96e0b
 static void
f96e0b
+refresh_menu_visit (grub_gui_component_t component,
f96e0b
+              void *userdata)
f96e0b
+{
f96e0b
+  grub_gfxmenu_view_t view;
f96e0b
+  view = userdata;
f96e0b
+  if (component->ops->is_instance (component, "list"))
f96e0b
+    {
f96e0b
+      grub_gui_list_t list = (grub_gui_list_t) component;
f96e0b
+      list->ops->refresh_list (list, view);
f96e0b
+    }
f96e0b
+}
f96e0b
+
f96e0b
+/* Refresh list information (useful for submenus) */
f96e0b
+static void
f96e0b
+refresh_menu_components (grub_gfxmenu_view_t view)
f96e0b
+{
f96e0b
+  grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
f96e0b
+                                refresh_menu_visit, view);
f96e0b
+}
f96e0b
+
f96e0b
+static void
f96e0b
 draw_message (grub_gfxmenu_view_t view)
f96e0b
 {
f96e0b
   char *text = view->progress_message_text;
f96e0b
@@ -294,6 +315,7 @@ grub_gfxmenu_view_draw (grub_gfxmenu_view_t view)
f96e0b
 			  view->screen.x, view->screen.y,
f96e0b
 			  view->screen.width, view->screen.height);
f96e0b
 
f96e0b
+  refresh_menu_components (view);
f96e0b
   update_menu_components (view);
f96e0b
 
f96e0b
   grub_gfxmenu_view_redraw (view, &view->screen);
f96e0b
diff --git a/include/grub/gui.h b/include/grub/gui.h
f96e0b
index ef0795c..4b8ec89 100644
f96e0b
--- a/include/grub/gui.h
f96e0b
+++ b/include/grub/gui.h
f96e0b
@@ -67,6 +67,8 @@ struct grub_gui_list_ops
f96e0b
 {
f96e0b
   void (*set_view_info) (void *self,
f96e0b
                          grub_gfxmenu_view_t view);
f96e0b
+  void (*refresh_list) (void *self,
f96e0b
+                        grub_gfxmenu_view_t view);
f96e0b
 };
f96e0b
 
f96e0b
 struct grub_gui_progress_ops
f96e0b
-- 
f96e0b
1.8.2.1
f96e0b