diff -ru grub-2.00/grub-core/gfxmenu/view.c grub-2.00.patched/grub-core/gfxmenu/view.c --- grub-2.00/grub-core/gfxmenu/view.c 2012-02-24 11:19:45.000000000 +0100 +++ grub-2.00.patched/grub-core/gfxmenu/view.c 2013-03-03 16:36:08.945858667 +0100 @@ -42,6 +42,7 @@ init_terminal (grub_gfxmenu_view_t view); static grub_video_rect_t term_rect; static grub_gfxmenu_view_t term_view; +static grub_video_rect_t title_rect; /* Create a new view object, loading the theme specified by THEME_PATH and associating MODEL with the view. */ @@ -141,18 +142,69 @@ static void draw_title (grub_gfxmenu_view_t view) { - if (! view->title_text) + const char *env_title; + const char *title; + char *title_formatted; + const char *env_posx; + const char *env_posy; + int title_width; + int title_height; + int x; + int y; + int ybase; + + env_title = grub_env_get ("title"); + if (env_title) + { + title = env_title; + } + else if (view->title_text) + { + title = view->title_text; + } + if (! title) return; - - /* Center the title. */ - int title_width = grub_font_get_string_width (view->title_font, - view->title_text); - int x = (view->screen.width - title_width) / 2; - int y = 40 + grub_font_get_ascent (view->title_font); - grub_font_draw_string (view->title_text, + if (grub_strstr(title, "%s")) + { + title_formatted = grub_xasprintf (title, PACKAGE_VERSION); + if (!title_formatted) + return; + } + else + { + title_formatted = grub_strdup (title); + } + title_width = grub_font_get_string_width (view->title_font, title_formatted); + env_posx = grub_env_get ("title_posx"); + if (env_posx) + { + x = (int) grub_strtol (env_posx, (char**) &env_posx, 0); + } + else + { + /* Center the title. */ + x = (view->screen.width - title_width) / 2; + } + env_posy = grub_env_get ("title_posy"); + if (env_posy) + { + y = (int) grub_strtol (env_posy, (char**) &env_posy, 0); + } + else + { + y = 40; + } + title_height = grub_font_get_ascent (view->title_font); + ybase = y + title_height; + grub_font_draw_string (title_formatted, view->title_font, grub_video_map_rgba_color (view->title_color), - x, y); + x, ybase); + grub_free (title_formatted); + title_rect.x = x; + title_rect.y = y; + title_rect.width = title_width; + title_rect.height = title_height; } struct progress_value_data @@ -324,11 +376,13 @@ grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas, redraw_menu_visit, view); + grub_gfxmenu_view_redraw (view, &title_rect); grub_video_swap_buffers (); if (view->double_repaint) { grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas, redraw_menu_visit, view); + grub_gfxmenu_view_redraw (view, &title_rect); } } diff -ru grub-2.00/grub-core/normal/main.c grub-2.00.patched/grub-core/normal/main.c --- grub-2.00/grub-core/normal/main.c 2012-06-26 03:59:57.000000000 +0200 +++ grub-2.00.patched/grub-core/normal/main.c 2013-03-02 18:00:52.297175990 +0100 @@ -226,28 +226,49 @@ { grub_ssize_t msg_len; int posx; - const char *msg = _("GNU GRUB version %s"); + const char *msg; char *msg_formatted; grub_uint32_t *unicode_msg; + const char *position; grub_uint32_t *last_position; + + msg = grub_env_get ("title"); + if (!msg) + { + msg = _("GNU GRUB version %s"); + } + if (grub_strstr(msg, "%s")) + { + msg_formatted = grub_xasprintf (msg, PACKAGE_VERSION); + if (!msg_formatted) + return; + } + else + { + msg_formatted = grub_strdup (msg); + } grub_term_cls (term); - - msg_formatted = grub_xasprintf (msg, PACKAGE_VERSION); - if (!msg_formatted) - return; msg_len = grub_utf8_to_ucs4_alloc (msg_formatted, &unicode_msg, &last_position); grub_free (msg_formatted); if (msg_len < 0) - { - return; - } + { + return; + } - posx = grub_getstringwidth (unicode_msg, last_position, term); - posx = (grub_term_width (term) - posx) / 2; + position = grub_env_get ("title_posx"); + if (position) + { + posx = (int) grub_strtol (position, (char**) &position, 0); + } + else + { + posx = grub_getstringwidth (unicode_msg, last_position, term); + posx = (grub_term_width (term) - posx) / 2; + } grub_term_gotoxy (term, posx, 1); grub_print_ucs4 (unicode_msg, last_position, 0, 0, term); diff -ru grub-2.00/grub-core/normal/menu.c grub-2.00.patched/grub-core/normal/menu.c --- grub-2.00/grub-core/normal/menu.c 2012-05-17 14:55:37.000000000 +0200 +++ grub-2.00.patched/grub-core/normal/menu.c 2013-03-05 21:50:02.095248560 +0100 @@ -158,7 +158,7 @@ grub_err_t err = GRUB_ERR_NONE; int errs_before; grub_menu_t menu = NULL; - char *optr, *buf, *oldchosen = NULL, *olddefault = NULL; + char *optr, *buf, *oldchosen = NULL, *olddefault = NULL, *multimenu = NULL; const char *ptr, *chosen, *def; grub_size_t sz = 0; @@ -263,15 +263,19 @@ } grub_env_context_close (); } - if (oldchosen) - grub_env_set ("chosen", oldchosen); - else - grub_env_unset ("chosen"); - if (olddefault) - grub_env_set ("default", olddefault); - else - grub_env_unset ("default"); - grub_env_unset ("timeout"); + multimenu = grub_env_get ("multimenu"); + if (! multimenu) + { + if (oldchosen) + grub_env_set ("chosen", oldchosen); + else + grub_env_unset ("chosen"); + if (olddefault) + grub_env_set ("default", olddefault); + else + grub_env_unset ("default"); + grub_env_unset ("timeout"); + } } /* Execute ENTRY from the menu MENU, falling back to entries specified