term->setcursor (on);
}
+static inline void
+grub_term_cls (struct grub_term_output *term)
+{
+ if (term->cls)
+ (term->cls) ();
+ else
+ {
+ grub_putcode ('\n', term);
+ grub_term_refresh (term);
+ }
+}
+
static inline grub_ssize_t
grub_term_getcharwidth (struct grub_term_output *term, grub_uint32_t c)
{
grub_term_getcolor (struct grub_term_output *term,
grub_uint8_t *normal_color, grub_uint8_t *highlight_color)
{
- term->getcolor (normal_color, highlight_color);
+ if (term->getcolor)
+ term->getcolor (normal_color, highlight_color);
+ else
+ {
+ *normal_color = 0x07;
+ *highlight_color = 0x07;
+ }
}
extern void (*EXPORT_VAR (grub_newline_hook)) (void);
if ((term->flags & GRUB_TERM_DUMB) || (grub_env_get ("debug")))
{
grub_putcode ('\n', term);
- grub_refresh ();
+ grub_term_refresh (term);
}
else
(term->cls) ();
grub_uint32_t *unicode_msg;
grub_uint32_t *last_position;
- grub_cls ();
+ grub_term_cls (term);
grub_sprintf (msg_formatted, msg, PACKAGE_VERSION);
case GRUB_TERM_UP:
case '^':
- current_entry--;
+ if (current_entry > 0)
+ current_entry--;
menu_set_chosen_entry (current_entry);
break;
case GRUB_TERM_DOWN:
case 'v':
- current_entry++;
+ if (current_entry < menu->size - 1)
+ current_entry++;
menu_set_chosen_entry (current_entry);
break;
case GRUB_TERM_NPAGE:
if (current_entry + GRUB_MENU_PAGE_SIZE < menu->size)
- current_entry = 0;
- else
current_entry += GRUB_MENU_PAGE_SIZE;
+ else
+ current_entry = menu->size - 1;
menu_set_chosen_entry (current_entry);
break;
if (nested)
{
- grub_printf ("\n ");
- grub_printf_ (N_("ESC to return previous menu."));
+ grub_puts_terminal ("\n ", term);
+ grub_puts_terminal (_("ESC to return previous menu."), term);
}
}
}
struct menu_viewer_data *data = dataptr;
int oldoffset = data->offset;
int complete_redraw = 0;
+
data->offset = entry - data->first;
if (data->offset > grub_term_num_entries (data->term) - 1)
{
- data->first = data->offset - (grub_term_num_entries (data->term) - 1);
+ data->first = entry - (grub_term_num_entries (data->term) - 1);
data->offset = grub_term_num_entries (data->term) - 1;
complete_redraw = 1;
}
struct menu_viewer_data *data = dataptr;
grub_term_setcursor (data->term, 1);
+ grub_term_cls (data->term);
+
}
static void
grub_errno = GRUB_ERR_NONE;
continue;
}
+
data->term = term;
instance->data = data;
instance->set_chosen_entry = menu_text_set_chosen_entry;
instance->print_timeout = menu_text_print_timeout;
instance->clear_timeout = menu_text_clear_timeout;
instance->fini = menu_text_fini;
-
+
data->menu = menu;
data->offset = entry;
grub_menu_init_page (nested, 0, data->term);
print_entries (menu, data->first, data->offset, data->term);
grub_term_refresh (data->term);
+ grub_menu_register_viewer (instance);
}
}