Cache loaded theme

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2009-12-26 02:37:01 +01:00
parent bee140683a
commit 9b1209ba15
3 changed files with 70 additions and 67 deletions

View file

@ -37,21 +37,39 @@
#include <grub/gfxmenu_view.h>
#include <grub/time.h>
void
grub_gfxmenu_viewer_fini (void *data)
{
grub_gfxmenu_view_t view = data;
grub_gfxmenu_view_t cached_view;
grub_gfxmenu_view_destroy (view);
static grub_err_t
set_graphics_mode (void)
{
const char *modestr = grub_env_get ("gfxmode");
if (!modestr || !modestr[0])
modestr = "auto";
return grub_video_set_mode (modestr, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
}
/* FIXME: conflicts with gfxterm. */
static grub_err_t
set_text_mode (void)
{
return grub_video_restore ();
}
void
grub_gfxmenu_viewer_fini (void *data __attribute__ ((unused)))
{
set_text_mode ();
}
/* FIXME: 't' and 'c'. */
grub_err_t
grub_gfxmenu_try (int entry, grub_menu_t menu, int nested)
{
grub_gfxmenu_view_t view;
grub_gfxmenu_view_t view = NULL;
const char *theme_path;
struct grub_menu_viewer *instance;
grub_err_t err;
struct grub_video_mode_info mode_info;
theme_path = grub_env_get ("theme");
if (! theme_path)
@ -61,15 +79,41 @@ grub_gfxmenu_try (int entry, grub_menu_t menu, int nested)
if (!instance)
return grub_errno;
/* Create the view. */
view = grub_gfxmenu_view_new (theme_path, menu, entry, nested);
set_graphics_mode ();
err = grub_video_get_info (&mode_info);
if (err)
{
set_text_mode ();
return 0;
}
if (! view)
if (!cached_view || grub_strcmp (cached_view->theme_path, theme_path) != 0
|| cached_view->screen.width != (int) mode_info.width
|| cached_view->screen.height != (int) mode_info.height)
{
grub_free (cached_view);
/* Create the view. */
cached_view = grub_gfxmenu_view_new (theme_path, mode_info.width,
mode_info.height);
}
if (! cached_view)
{
grub_free (instance);
set_text_mode ();
return grub_errno;
}
view = cached_view;
view->double_repaint = (mode_info.mode_type
& GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED)
&& !(mode_info.mode_type & GRUB_VIDEO_MODE_TYPE_UPDATING_SWAP);
view->selected = entry;
view->menu = menu;
view->nested = nested;
view->first_timeout = -1;
grub_gfxmenu_view_draw (view);
instance->data = view;
@ -90,5 +134,6 @@ GRUB_MOD_INIT (gfxmenu)
GRUB_MOD_FINI (gfxmenu)
{
grub_gfxmenu_view_destroy (cached_view);
grub_gfxmenu_try_hook = NULL;
}