Various fixes to make multiterm work

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2009-12-25 01:13:21 +01:00
parent 4fc4ee303d
commit fa533ebb5c
5 changed files with 36 additions and 11 deletions

View file

@ -359,6 +359,18 @@ grub_term_setcursor (struct grub_term_output *term, int on)
term->setcursor (on); 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 static inline grub_ssize_t
grub_term_getcharwidth (struct grub_term_output *term, grub_uint32_t c) grub_term_getcharwidth (struct grub_term_output *term, grub_uint32_t c)
{ {
@ -372,7 +384,13 @@ static inline void
grub_term_getcolor (struct grub_term_output *term, grub_term_getcolor (struct grub_term_output *term,
grub_uint8_t *normal_color, grub_uint8_t *highlight_color) 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); extern void (*EXPORT_VAR (grub_newline_hook)) (void);

View file

@ -132,7 +132,7 @@ grub_cls (void)
if ((term->flags & GRUB_TERM_DUMB) || (grub_env_get ("debug"))) if ((term->flags & GRUB_TERM_DUMB) || (grub_env_get ("debug")))
{ {
grub_putcode ('\n', term); grub_putcode ('\n', term);
grub_refresh (); grub_term_refresh (term);
} }
else else
(term->cls) (); (term->cls) ();

View file

@ -409,7 +409,7 @@ grub_normal_init_page (struct grub_term_output *term)
grub_uint32_t *unicode_msg; grub_uint32_t *unicode_msg;
grub_uint32_t *last_position; grub_uint32_t *last_position;
grub_cls (); grub_term_cls (term);
grub_sprintf (msg_formatted, msg, PACKAGE_VERSION); grub_sprintf (msg_formatted, msg, PACKAGE_VERSION);

View file

@ -391,13 +391,15 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
case GRUB_TERM_UP: case GRUB_TERM_UP:
case '^': case '^':
current_entry--; if (current_entry > 0)
current_entry--;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (current_entry);
break; break;
case GRUB_TERM_DOWN: case GRUB_TERM_DOWN:
case 'v': case 'v':
current_entry++; if (current_entry < menu->size - 1)
current_entry++;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (current_entry);
break; break;
@ -411,9 +413,9 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
case GRUB_TERM_NPAGE: case GRUB_TERM_NPAGE:
if (current_entry + GRUB_MENU_PAGE_SIZE < menu->size) if (current_entry + GRUB_MENU_PAGE_SIZE < menu->size)
current_entry = 0;
else
current_entry += GRUB_MENU_PAGE_SIZE; current_entry += GRUB_MENU_PAGE_SIZE;
else
current_entry = menu->size - 1;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (current_entry);
break; break;

View file

@ -202,8 +202,8 @@ entry is highlighted.\n");
if (nested) if (nested)
{ {
grub_printf ("\n "); grub_puts_terminal ("\n ", term);
grub_printf_ (N_("ESC to return previous menu.")); grub_puts_terminal (_("ESC to return previous menu."), term);
} }
} }
} }
@ -385,10 +385,11 @@ menu_text_set_chosen_entry (int entry, void *dataptr)
struct menu_viewer_data *data = dataptr; struct menu_viewer_data *data = dataptr;
int oldoffset = data->offset; int oldoffset = data->offset;
int complete_redraw = 0; int complete_redraw = 0;
data->offset = entry - data->first; data->offset = entry - data->first;
if (data->offset > grub_term_num_entries (data->term) - 1) 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; data->offset = grub_term_num_entries (data->term) - 1;
complete_redraw = 1; complete_redraw = 1;
} }
@ -418,6 +419,8 @@ menu_text_fini (void *dataptr)
struct menu_viewer_data *data = dataptr; struct menu_viewer_data *data = dataptr;
grub_term_setcursor (data->term, 1); grub_term_setcursor (data->term, 1);
grub_term_cls (data->term);
} }
static void static void
@ -456,13 +459,14 @@ grub_menu_text_register_instances (int entry, grub_menu_t menu, int nested)
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
continue; continue;
} }
data->term = term; data->term = term;
instance->data = data; instance->data = data;
instance->set_chosen_entry = menu_text_set_chosen_entry; instance->set_chosen_entry = menu_text_set_chosen_entry;
instance->print_timeout = menu_text_print_timeout; instance->print_timeout = menu_text_print_timeout;
instance->clear_timeout = menu_text_clear_timeout; instance->clear_timeout = menu_text_clear_timeout;
instance->fini = menu_text_fini; instance->fini = menu_text_fini;
data->menu = menu; data->menu = menu;
data->offset = entry; data->offset = entry;
@ -477,5 +481,6 @@ grub_menu_text_register_instances (int entry, grub_menu_t menu, int nested)
grub_menu_init_page (nested, 0, data->term); grub_menu_init_page (nested, 0, data->term);
print_entries (menu, data->first, data->offset, data->term); print_entries (menu, data->first, data->offset, data->term);
grub_term_refresh (data->term); grub_term_refresh (data->term);
grub_menu_register_viewer (instance);
} }
} }