Fix screen corruption in menu entry editor and simplify the code

flow while on it.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2013-04-03 15:19:34 +02:00
parent a7b1d6933b
commit 91bf46b188
3 changed files with 24 additions and 31 deletions

View file

@ -1,3 +1,8 @@
2013-04-03 Vladimir Serbinenko <phcoder@gmail.com>
Fix screen corruption in menu entry editor and simplify the code
flow while on it.
2013-04-03 Andrey Borzenkov <arvidjaar@gmail.com> 2013-04-03 Andrey Borzenkov <arvidjaar@gmail.com>
* util/grub-mount.c (fuse_init): Return error if fuse_main * util/grub-mount.c (fuse_init): Return error if fuse_main

View file

@ -253,49 +253,24 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen,
if (!*pos) if (!*pos)
*pos = grub_zalloc ((linep->len + 1) * sizeof (**pos)); *pos = grub_zalloc ((linep->len + 1) * sizeof (**pos));
if (i == region_start || linep == screen->lines + screen->line) if (i == region_start || linep == screen->lines + screen->line
|| (i > region_start && mode == ALL_LINES))
{ {
int sp;
grub_term_gotoxy (term_screen->term, GRUB_TERM_LEFT_BORDER_X
+ GRUB_TERM_MARGIN + 1, (y < 0 ? 0 : y)
+ GRUB_TERM_FIRST_ENTRY_Y);
grub_print_ucs4_menu (linep->buf,
linep->buf + linep->len,
GRUB_TERM_LEFT_BORDER_X + GRUB_TERM_MARGIN
+ 1,
GRUB_TERM_MARGIN
+ GRUB_TERM_SCROLL_WIDTH + 2,
term_screen->term,
(y < 0) ? -y : 0,
term_screen->num_entries
- ((y > 0) ? y : 0), '\\',
*pos);
sp = grub_term_entry_width (term_screen->term)
- (*pos)[linep->len].x;
if (sp > 0)
grub_print_spaces (term_screen->term, sp);
}
else if (i > region_start && mode == ALL_LINES)
{
int sp;
grub_term_gotoxy (term_screen->term, GRUB_TERM_LEFT_BORDER_X grub_term_gotoxy (term_screen->term, GRUB_TERM_LEFT_BORDER_X
+ GRUB_TERM_MARGIN + 1, (y < 0 ? 0 : y) + GRUB_TERM_MARGIN + 1, (y < 0 ? 0 : y)
+ GRUB_TERM_FIRST_ENTRY_Y); + GRUB_TERM_FIRST_ENTRY_Y);
grub_print_ucs4_menu (linep->buf, grub_print_ucs4_menu (linep->buf,
linep->buf + linep->len, linep->buf + linep->len,
GRUB_TERM_LEFT_BORDER_X GRUB_TERM_LEFT_BORDER_X
+ GRUB_TERM_MARGIN + 1, + GRUB_TERM_MARGIN + 1,
GRUB_TERM_MARGIN GRUB_TERM_MARGIN
+ GRUB_TERM_SCROLL_WIDTH + 2, + GRUB_TERM_SCROLL_WIDTH,
term_screen->term, term_screen->term,
(y < 0) ? -y : 0, (y < 0) ? -y : 0,
term_screen->num_entries term_screen->num_entries
- ((y > 0) ? y : 0), '\\', - ((y > 0) ? y : 0), '\\',
*pos); *pos);
sp = grub_term_entry_width (term_screen->term)
- (*pos)[linep->len].x;
if (sp > 0)
grub_print_spaces (term_screen->term, sp);
} }
y += get_logical_num_lines (linep, term_screen); y += get_logical_num_lines (linep, term_screen);
if (y >= term_screen->num_entries) if (y >= term_screen->num_entries)

View file

@ -690,6 +690,13 @@ print_ucs4_terminal (const grub_uint32_t * str,
line_width -= lastspacewidth; line_width -= lastspacewidth;
if (ptr == last_space || *ptr == '\n') if (ptr == last_space || *ptr == '\n')
ptr++; ptr++;
else if (pos)
{
pos[ptr - str].x = line_width - last_width;
pos[ptr - str].y = lines;
pos[ptr - str].valid = 1;
}
line_start = ptr; line_start = ptr;
if (skip_lines) if (skip_lines)
@ -726,6 +733,8 @@ print_ucs4_terminal (const grub_uint32_t * str,
if (!dry_run && !skip_lines && max_lines) if (!dry_run && !skip_lines && max_lines)
{ {
const grub_uint32_t *ptr2; const grub_uint32_t *ptr2;
int sp;
for (ptr2 = line_start; ptr2 < last_position; ptr2++) for (ptr2 = line_start; ptr2 < last_position; ptr2++)
{ {
/* Skip combining characters on non-UTF8 terminals. */ /* Skip combining characters on non-UTF8 terminals. */
@ -736,6 +745,10 @@ print_ucs4_terminal (const grub_uint32_t * str,
continue; continue;
putcode_real (*ptr2, term, fixed_tab); putcode_real (*ptr2, term, fixed_tab);
} }
sp = max_width - pos[last_position - str].x + 1;
if (sp > 0)
grub_print_spaces (term, sp);
} }
return dry_run ? lines : 0; return dry_run ? lines : 0;
} }
@ -908,7 +921,7 @@ print_ucs4_real (const grub_uint32_t * str,
{ {
for (vptr = visual_show; for (vptr = visual_show;
max_lines && vptr < visual + visual_len; vptr++) max_lines && vptr < visual + visual_len; vptr++)
if (visual_show->base == '\n') if (vptr->base == '\n')
max_lines--; max_lines--;
visual_len_show = vptr - visual_show; visual_len_show = vptr - visual_show;