179
199
callback->notify_failure (callback_data);
202
static struct grub_menu_viewer *viewers;
205
menu_set_chosen_entry (int entry)
207
struct grub_menu_viewer *cur;
208
for (cur = viewers; cur; cur = cur->next)
209
cur->set_chosen_entry (entry, cur->data);
213
menu_print_timeout (int timeout)
215
struct grub_menu_viewer *cur;
216
for (cur = viewers; cur; cur = cur->next)
217
cur->print_timeout (timeout, cur->data);
223
struct grub_menu_viewer *cur, *next;
224
for (cur = viewers; cur; cur = next)
227
cur->fini (cur->data);
234
menu_init (int entry, grub_menu_t menu, int nested)
236
struct grub_term_output *term;
238
FOR_ACTIVE_TERM_OUTPUTS(term)
242
if (grub_gfxmenu_try_hook && grub_strcmp (term->name, "gfxterm") == 0)
244
err = grub_gfxmenu_try_hook (entry, menu, nested);
248
grub_errno = GRUB_ERR_NONE;
251
err = grub_menu_try_text (term, entry, menu, nested);
255
grub_errno = GRUB_ERR_NONE;
262
struct grub_menu_viewer *cur;
263
for (cur = viewers; cur; cur = cur->next)
264
cur->clear_timeout (cur->data);
268
grub_menu_register_viewer (struct grub_menu_viewer *viewer)
270
viewer->next = viewers;
274
/* Get the entry number from the variable NAME. */
276
get_entry_number (const char *name)
281
val = grub_env_get (name);
287
entry = (int) grub_strtoul (val, 0, 0);
289
if (grub_errno != GRUB_ERR_NONE)
291
grub_errno = GRUB_ERR_NONE;
300
#define GRUB_MENU_PAGE_SIZE 10
302
/* Show the menu and handle menu entry selection. Returns the menu entry
303
index that should be executed or -1 if no entry should be executed (e.g.,
304
Esc pressed to exit a sub-menu or switching menu viewers).
305
If the return value is not -1, then *AUTO_BOOT is nonzero iff the menu
306
entry to be executed is a result of an automatic default selection because
309
run_menu (grub_menu_t menu, int nested, int *auto_boot)
311
grub_uint64_t saved_time;
312
int default_entry, current_entry;
315
default_entry = get_entry_number ("default");
317
/* If DEFAULT_ENTRY is not within the menu entries, fall back to
319
if (default_entry < 0 || default_entry >= menu->size)
322
/* If timeout is 0, drawing is pointless (and ugly). */
323
if (grub_menu_get_timeout () == 0)
326
return default_entry;
329
current_entry = default_entry;
331
/* Initialize the time. */
332
saved_time = grub_get_time_ms ();
335
menu_init (current_entry, menu, nested);
337
timeout = grub_menu_get_timeout ();
340
menu_print_timeout (timeout);
345
timeout = grub_menu_get_timeout ();
347
if (grub_normal_exit_level)
352
grub_uint64_t current_time;
354
current_time = grub_get_time_ms ();
355
if (current_time - saved_time >= 1000)
358
grub_menu_set_timeout (timeout);
359
saved_time = current_time;
360
menu_print_timeout (timeout);
366
grub_env_unset ("timeout");
369
return default_entry;
372
if (grub_checkkey () >= 0 || timeout < 0)
374
c = GRUB_TERM_ASCII_CHAR (grub_getkey ());
378
grub_env_unset ("timeout");
379
grub_env_unset ("fallback");
387
menu_set_chosen_entry (current_entry);
391
current_entry = menu->size - 1;
392
menu_set_chosen_entry (current_entry);
397
if (current_entry > 0)
399
menu_set_chosen_entry (current_entry);
404
if (current_entry < menu->size - 1)
406
menu_set_chosen_entry (current_entry);
409
case GRUB_TERM_PPAGE:
410
if (current_entry < GRUB_MENU_PAGE_SIZE)
413
current_entry -= GRUB_MENU_PAGE_SIZE;
414
menu_set_chosen_entry (current_entry);
417
case GRUB_TERM_NPAGE:
418
if (current_entry + GRUB_MENU_PAGE_SIZE < menu->size)
419
current_entry += GRUB_MENU_PAGE_SIZE;
421
current_entry = menu->size - 1;
422
menu_set_chosen_entry (current_entry);
430
return current_entry;
442
grub_cmdline_run (1);
448
grub_menu_entry_t e = grub_menu_get_entry (menu, current_entry);
450
grub_menu_entry_run (e);
460
/* Never reach here. */
464
/* Callback invoked immediately before a menu entry is executed. */
466
notify_booting (grub_menu_entry_t entry,
467
void *userdata __attribute__((unused)))
470
grub_printf_ (N_("Booting \'%s\'"), entry->title);
471
grub_printf ("\n\n");
474
/* Callback invoked when a default menu entry executed because of a timeout
475
has failed and an attempt will be made to execute the next fallback
478
notify_fallback (grub_menu_entry_t entry,
479
void *userdata __attribute__((unused)))
482
grub_printf_ (N_("Falling back to \'%s\'"), entry->title);
483
grub_printf ("\n\n");
484
grub_millisleep (DEFAULT_ENTRY_ERROR_DELAY_MS);
487
/* Callback invoked when a menu entry has failed and there is no remaining
488
fallback entry to attempt. */
490
notify_execution_failure (void *userdata __attribute__((unused)))
492
if (grub_errno != GRUB_ERR_NONE)
495
grub_errno = GRUB_ERR_NONE;
498
grub_printf_ (N_("Failed to boot default entries.\n"));
499
grub_wait_after_message ();
502
/* Callbacks used by the text menu to provide user feedback when menu entries
504
static struct grub_menu_execute_callback execution_callback =
506
.notify_booting = notify_booting,
507
.notify_fallback = notify_fallback,
508
.notify_failure = notify_execution_failure
512
show_menu (grub_menu_t menu, int nested)
520
boot_entry = run_menu (menu, nested, &auto_boot);
524
e = grub_menu_get_entry (menu, boot_entry);
526
continue; /* Menu is empty. */
532
grub_menu_execute_with_fallback (menu, e, &execution_callback, 0);
536
grub_errno = GRUB_ERR_NONE;
537
grub_menu_execute_entry (e);
538
if (grub_errno != GRUB_ERR_NONE)
541
grub_errno = GRUB_ERR_NONE;
542
grub_wait_after_message ();
547
return GRUB_ERR_NONE;
551
grub_show_menu (grub_menu_t menu, int nested)
553
grub_err_t err1, err2;
557
err1 = show_menu (menu, nested);
560
if (grub_normal_exit_level)
563
err2 = grub_auth_check_authentication (NULL);
567
grub_errno = GRUB_ERR_NONE;