Cache loaded theme
This commit is contained in:
parent
bee140683a
commit
9b1209ba15
3 changed files with 70 additions and 67 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue