Improve bidi handling in entry editor.
This commit is contained in:
parent
4542e71b8b
commit
34f71cb866
8 changed files with 453 additions and 267 deletions
|
@ -43,15 +43,12 @@ struct line
|
|||
int len;
|
||||
/* The maximum length of the line. */
|
||||
int max_len;
|
||||
struct grub_term_pos **pos;
|
||||
};
|
||||
|
||||
struct per_term_screen
|
||||
{
|
||||
struct grub_term_output *term;
|
||||
/* The X coordinate. */
|
||||
int x;
|
||||
/* The Y coordinate. */
|
||||
int y;
|
||||
int y_line_start;
|
||||
/* Number of entries. */
|
||||
int num_entries;
|
||||
|
@ -90,13 +87,18 @@ static int completion_type;
|
|||
|
||||
/* Initialize a line. */
|
||||
static int
|
||||
init_line (struct line *linep)
|
||||
init_line (struct screen *screen, struct line *linep)
|
||||
{
|
||||
linep->len = 0;
|
||||
linep->max_len = 80;
|
||||
linep->buf = grub_malloc ((linep->max_len + 1) * sizeof (linep->buf[0]));
|
||||
if (! linep->buf)
|
||||
return 0;
|
||||
linep->pos = grub_zalloc (screen->nterms * sizeof (linep->pos[0]));
|
||||
if (! linep->buf || !linep->pos)
|
||||
{
|
||||
grub_free (linep->buf);
|
||||
grub_free (linep->pos);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -125,94 +127,17 @@ get_logical_num_lines (struct line *linep, struct per_term_screen *term_screen)
|
|||
/ grub_term_entry_width (term_screen->term)) + 1;
|
||||
}
|
||||
|
||||
static void
|
||||
advance (struct screen *screen)
|
||||
{
|
||||
unsigned i;
|
||||
struct grub_unicode_glyph glyph;
|
||||
|
||||
screen->column += grub_unicode_aglomerate_comb (screen->lines[screen->line].buf + screen->column,
|
||||
screen->lines[screen->line].len - screen->column,
|
||||
&glyph);
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
grub_ssize_t width;
|
||||
width = grub_term_getcharwidth (screen->terms[i].term, &glyph);
|
||||
screen->terms[i].x += width;
|
||||
if (screen->terms[i].x
|
||||
== grub_term_entry_width (screen->terms[i].term))
|
||||
{
|
||||
screen->terms[i].x = 0;
|
||||
screen->terms[i].y++;
|
||||
}
|
||||
if (screen->terms[i].x
|
||||
> grub_term_entry_width (screen->terms[i].term))
|
||||
{
|
||||
screen->terms[i].x = width;
|
||||
screen->terms[i].y++;
|
||||
}
|
||||
}
|
||||
grub_free (glyph.combining);
|
||||
}
|
||||
|
||||
static void
|
||||
advance_to (struct screen *screen, int c)
|
||||
{
|
||||
if (c > screen->lines[screen->line].len)
|
||||
c = screen->lines[screen->line].len;
|
||||
|
||||
while (screen->column < c)
|
||||
advance (screen);
|
||||
}
|
||||
|
||||
/* Print a line. */
|
||||
static int
|
||||
print_line (struct line *linep, int offset, int y,
|
||||
struct per_term_screen *term_screen, int dry_run)
|
||||
{
|
||||
int x;
|
||||
int i;
|
||||
|
||||
grub_term_gotoxy (term_screen->term,
|
||||
GRUB_TERM_LEFT_BORDER_X + GRUB_TERM_MARGIN + 1,
|
||||
y + GRUB_TERM_FIRST_ENTRY_Y);
|
||||
|
||||
x = 0;
|
||||
for (i = 0; i + offset < (int) linep->len;)
|
||||
{
|
||||
grub_ssize_t width;
|
||||
grub_size_t delta = 0;
|
||||
struct grub_unicode_glyph glyph;
|
||||
|
||||
delta = grub_unicode_aglomerate_comb (linep->buf + offset + i,
|
||||
linep->len - offset - i,
|
||||
&glyph);
|
||||
width = grub_term_getcharwidth (term_screen->term, &glyph);
|
||||
grub_free (glyph.combining);
|
||||
|
||||
if (x + width > grub_term_entry_width (term_screen->term) && x != 0)
|
||||
break;
|
||||
x += width;
|
||||
i += delta;
|
||||
}
|
||||
|
||||
if (dry_run)
|
||||
return i;
|
||||
|
||||
grub_print_ucs4 (linep->buf + offset,
|
||||
linep->buf + offset + i, 0, 0, term_screen->term);
|
||||
|
||||
if (i + offset != linep->len)
|
||||
grub_putcode ('\\', term_screen->term);
|
||||
else
|
||||
{
|
||||
for (;
|
||||
x <= (int) grub_term_entry_width (term_screen->term);
|
||||
x++)
|
||||
grub_putcode (' ', term_screen->term);
|
||||
}
|
||||
return i;
|
||||
screen->column = grub_unicode_get_comb_end (screen->lines[screen->line].buf
|
||||
+ screen->lines[screen->line].len,
|
||||
screen->lines[screen->line].buf
|
||||
+ c)
|
||||
- screen->lines[screen->line].buf;
|
||||
}
|
||||
|
||||
/* Print an empty line. */
|
||||
|
@ -225,7 +150,7 @@ print_empty_line (int y, struct per_term_screen *term_screen)
|
|||
GRUB_TERM_LEFT_BORDER_X + GRUB_TERM_MARGIN + 1,
|
||||
y + GRUB_TERM_FIRST_ENTRY_Y);
|
||||
|
||||
for (i = 0; i < grub_term_entry_width (term_screen->term) + 1; i++)
|
||||
for (i = 0; i < grub_term_entry_width (term_screen->term); i++)
|
||||
grub_putcode (' ', term_screen->term);
|
||||
}
|
||||
|
||||
|
@ -261,7 +186,7 @@ print_down (int flag, struct per_term_screen *term_screen)
|
|||
/* Draw the lines of the screen SCREEN. */
|
||||
static void
|
||||
update_screen (struct screen *screen, struct per_term_screen *term_screen,
|
||||
int region_start, int region_column,
|
||||
int region_start, int region_column __attribute__ ((unused)),
|
||||
int up, int down, enum update_mode mode)
|
||||
{
|
||||
int up_flag = 0;
|
||||
|
@ -270,19 +195,26 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen,
|
|||
int i;
|
||||
struct line *linep;
|
||||
|
||||
y = term_screen->y_line_start;
|
||||
linep = screen->lines;
|
||||
|
||||
for (i = 0; i < screen->line; i++, linep++)
|
||||
y += get_logical_num_lines (linep, term_screen);
|
||||
linep = screen->lines + screen->line;
|
||||
y += grub_getstringwidth (linep->buf, linep->buf + screen->column,
|
||||
term_screen->term) / grub_term_entry_width (term_screen->term);
|
||||
|
||||
/* Check if scrolling is necessary. */
|
||||
if (term_screen->y < 0 || term_screen->y >= term_screen->num_entries)
|
||||
if (y < 0 || y >= term_screen->num_entries)
|
||||
{
|
||||
int delta;
|
||||
if (term_screen->y < 0)
|
||||
delta = -term_screen->y;
|
||||
if (y < 0)
|
||||
delta = -y;
|
||||
else
|
||||
delta = term_screen->num_entries - 1 - term_screen->y;
|
||||
term_screen->y += delta;
|
||||
delta = term_screen->num_entries - 1 - y;
|
||||
term_screen->y_line_start += delta;
|
||||
|
||||
region_start = 0;
|
||||
region_column = 0;
|
||||
up = 1;
|
||||
down = 1;
|
||||
mode = ALL_LINES;
|
||||
|
@ -293,58 +225,81 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen,
|
|||
/* Draw lines. This code is tricky, because this must calculate logical
|
||||
positions. */
|
||||
y = term_screen->y_line_start;
|
||||
i = screen->line;
|
||||
linep = screen->lines + i;
|
||||
while (y > 0)
|
||||
{
|
||||
i--;
|
||||
linep--;
|
||||
y -= get_logical_num_lines (linep, term_screen);
|
||||
}
|
||||
i = 0;
|
||||
linep = screen->lines;
|
||||
while (1)
|
||||
{
|
||||
int add;
|
||||
add = get_logical_num_lines (linep, term_screen);
|
||||
if (y + add > 0)
|
||||
break;
|
||||
i++;
|
||||
linep++;
|
||||
y += add;
|
||||
}
|
||||
|
||||
if (y < 0 || i > 0)
|
||||
up_flag = 1;
|
||||
|
||||
do
|
||||
{
|
||||
int column;
|
||||
int off = 0;
|
||||
int full_len;
|
||||
struct grub_term_pos **pos;
|
||||
|
||||
if (linep >= screen->lines + screen->num_lines)
|
||||
break;
|
||||
|
||||
full_len = grub_getstringwidth (linep->buf, linep->buf + linep->len,
|
||||
term_screen->term);
|
||||
pos = linep->pos + (term_screen - screen->terms);
|
||||
|
||||
for (column = 0;
|
||||
column <= full_len
|
||||
&& y < term_screen->num_entries;
|
||||
column += grub_term_entry_width (term_screen->term), y++)
|
||||
if (!*pos)
|
||||
*pos = grub_zalloc ((linep->len + 1) * sizeof (**pos));
|
||||
|
||||
if (i == region_start || linep == screen->lines + screen->line)
|
||||
{
|
||||
if (y < 0)
|
||||
{
|
||||
off += print_line (linep, off, y, term_screen, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i == region_start)
|
||||
{
|
||||
if (region_column >= column
|
||||
&& region_column
|
||||
< (column
|
||||
+ grub_term_entry_width (term_screen->term)))
|
||||
off += print_line (linep, off, y, term_screen, 0);
|
||||
else if (region_column < column)
|
||||
off += print_line (linep, off, y, term_screen, 0);
|
||||
else
|
||||
off += print_line (linep, off, y, term_screen, 1);
|
||||
}
|
||||
else if (i > region_start && mode == ALL_LINES)
|
||||
off += print_line (linep, off, y, term_screen, 0);
|
||||
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_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);
|
||||
}
|
||||
|
||||
if (y == term_screen->num_entries)
|
||||
y += get_logical_num_lines (linep, term_screen);
|
||||
if (y >= term_screen->num_entries)
|
||||
{
|
||||
if (off <= linep->len || i + 1 < screen->num_lines)
|
||||
down_flag = 1;
|
||||
|
@ -367,10 +322,30 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen,
|
|||
}
|
||||
|
||||
/* Place the cursor. */
|
||||
grub_term_gotoxy (term_screen->term,
|
||||
GRUB_TERM_LEFT_BORDER_X + GRUB_TERM_MARGIN + 1
|
||||
+ term_screen->x,
|
||||
GRUB_TERM_FIRST_ENTRY_Y + term_screen->y);
|
||||
if (screen->lines[screen->line].pos[term_screen - screen->terms])
|
||||
{
|
||||
const struct grub_term_pos *cpos;
|
||||
for (cpos = &(screen->lines[screen->line].pos[term_screen - screen->terms])[screen->column];
|
||||
cpos >= &(screen->lines[screen->line].pos[term_screen - screen->terms])[0];
|
||||
cpos--)
|
||||
if (cpos->valid)
|
||||
break;
|
||||
y = term_screen->y_line_start;
|
||||
for (i = 0; i < screen->line; i++)
|
||||
y += get_logical_num_lines (screen->lines + i, term_screen);
|
||||
if (cpos >= &(screen->lines[screen->line].pos[term_screen - screen->terms])[0])
|
||||
grub_term_gotoxy (term_screen->term,
|
||||
cpos->x + GRUB_TERM_LEFT_BORDER_X
|
||||
+ GRUB_TERM_MARGIN + 1,
|
||||
cpos->y + y
|
||||
+ GRUB_TERM_FIRST_ENTRY_Y);
|
||||
else
|
||||
grub_term_gotoxy (term_screen->term,
|
||||
GRUB_TERM_LEFT_BORDER_X
|
||||
+ GRUB_TERM_MARGIN + 1,
|
||||
y + GRUB_TERM_FIRST_ENTRY_Y);
|
||||
|
||||
}
|
||||
|
||||
grub_term_refresh (term_screen->term);
|
||||
}
|
||||
|
@ -424,7 +399,7 @@ insert_string (struct screen *screen, const char *s, int update)
|
|||
((screen->num_lines - screen->line - 2)
|
||||
* sizeof (struct line)));
|
||||
|
||||
if (! init_line (screen->lines + screen->line + 1))
|
||||
if (! init_line (screen, screen->lines + screen->line + 1))
|
||||
return 0;
|
||||
|
||||
/* Fold the line. */
|
||||
|
@ -439,6 +414,11 @@ insert_string (struct screen *screen, const char *s, int update)
|
|||
current_linep->buf + screen->column,
|
||||
size * sizeof (next_linep->buf[0]));
|
||||
current_linep->len = screen->column;
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
grub_free (current_linep->pos[i]);
|
||||
current_linep->pos[i] = 0;
|
||||
}
|
||||
next_linep->len = size;
|
||||
|
||||
/* Update a dirty region. */
|
||||
|
@ -457,12 +437,6 @@ insert_string (struct screen *screen, const char *s, int update)
|
|||
/* Move the cursor. */
|
||||
screen->column = screen->real_column = 0;
|
||||
screen->line++;
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].x = 0;
|
||||
screen->terms[i].y++;
|
||||
screen->terms[i].y_line_start = screen->terms[i].y;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
else
|
||||
|
@ -501,6 +475,12 @@ insert_string (struct screen *screen, const char *s, int update)
|
|||
size * sizeof (current_linep->buf[0]));
|
||||
grub_free (unicode_msg);
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
grub_free (current_linep->pos[i]);
|
||||
current_linep->pos[i] = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
orig_num[i] = get_logical_num_lines (current_linep,
|
||||
&screen->terms[i]);
|
||||
|
@ -582,7 +562,7 @@ make_screen (grub_menu_entry_t entry)
|
|||
goto fail;
|
||||
|
||||
/* Initialize the first line which must be always present. */
|
||||
if (! init_line (screen->lines))
|
||||
if (! init_line (screen, screen->lines))
|
||||
goto fail;
|
||||
|
||||
insert_string (screen, (char *) entry->sourcecode, 0);
|
||||
|
@ -593,9 +573,7 @@ make_screen (grub_menu_entry_t entry)
|
|||
screen->line = 0;
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].x = 0;
|
||||
screen->terms[i].y = 0;
|
||||
screen->terms[i].y_line_start = screen->terms[i].y;
|
||||
screen->terms[i].y_line_start = 0;
|
||||
}
|
||||
|
||||
return screen;
|
||||
|
@ -609,21 +587,20 @@ static int
|
|||
forward_char (struct screen *screen, int update)
|
||||
{
|
||||
struct line *linep;
|
||||
unsigned i;
|
||||
|
||||
linep = screen->lines + screen->line;
|
||||
if (screen->column < linep->len)
|
||||
advance (screen);
|
||||
{
|
||||
screen->column = grub_unicode_get_comb_end (screen->lines[screen->line].buf
|
||||
+ screen->lines[screen->line].len,
|
||||
screen->lines[screen->line].buf
|
||||
+ screen->column + 1)
|
||||
- screen->lines[screen->line].buf;
|
||||
}
|
||||
else if (screen->num_lines > screen->line + 1)
|
||||
{
|
||||
screen->column = 0;
|
||||
screen->line++;
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].x = 0;
|
||||
screen->terms[i].y++;
|
||||
screen->terms[i].y_line_start = screen->terms[i].y;
|
||||
}
|
||||
}
|
||||
|
||||
screen->real_column = screen->column;
|
||||
|
@ -636,8 +613,6 @@ forward_char (struct screen *screen, int update)
|
|||
static int
|
||||
backward_char (struct screen *screen, int update)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
if (screen->column > 0)
|
||||
{
|
||||
struct grub_unicode_glyph glyph;
|
||||
|
@ -653,36 +628,16 @@ backward_char (struct screen *screen, int update)
|
|||
grub_unicode_aglomerate_comb (screen->lines[screen->line].buf + screen->column,
|
||||
screen->lines[screen->line].len - screen->column,
|
||||
&glyph);
|
||||
screen->column = grub_unicode_get_comb_start (linep->buf,
|
||||
linep->buf + screen->column)
|
||||
- linep->buf;
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
grub_ssize_t width;
|
||||
width = grub_term_getcharwidth (screen->terms[i].term, &glyph);
|
||||
screen->terms[i].x -= width;
|
||||
if (screen->terms[i].x < 0)
|
||||
{
|
||||
screen->terms[i].x
|
||||
= grub_term_entry_width (screen->terms[i].term) - 1;
|
||||
screen->terms[i].y--;
|
||||
}
|
||||
}
|
||||
grub_free (glyph.combining);
|
||||
}
|
||||
else if (screen->line > 0)
|
||||
{
|
||||
struct line *linep;
|
||||
|
||||
screen->column = 0;
|
||||
screen->line--;
|
||||
linep = screen->lines + screen->line;
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].y_line_start -= get_logical_num_lines (linep, &screen->terms[i]);
|
||||
screen->terms[i].y = screen->terms[i].y_line_start;
|
||||
screen->terms[i].x = 0;
|
||||
}
|
||||
advance_to (screen, screen->lines[screen->line].len);
|
||||
screen->column = screen->lines[screen->line].len;
|
||||
}
|
||||
|
||||
screen->real_column = screen->column;
|
||||
|
@ -696,8 +651,6 @@ backward_char (struct screen *screen, int update)
|
|||
static int
|
||||
previous_line (struct screen *screen, int update)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
if (screen->line > 0)
|
||||
{
|
||||
struct line *linep;
|
||||
|
@ -712,22 +665,10 @@ previous_line (struct screen *screen, int update)
|
|||
col = screen->real_column;
|
||||
|
||||
screen->column = 0;
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].y_line_start -= get_logical_num_lines (linep, &screen->terms[i]);
|
||||
screen->terms[i].y = screen->terms[i].y_line_start;
|
||||
screen->terms[i].x = 0;
|
||||
}
|
||||
advance_to (screen, col);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].y = screen->terms[i].y_line_start;
|
||||
screen->terms[i].x = 0;
|
||||
}
|
||||
screen->column = 0;
|
||||
}
|
||||
|
||||
|
@ -740,8 +681,6 @@ previous_line (struct screen *screen, int update)
|
|||
static int
|
||||
next_line (struct screen *screen, int update)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
if (screen->line < screen->num_lines - 1)
|
||||
{
|
||||
struct line *linep;
|
||||
|
@ -758,12 +697,6 @@ next_line (struct screen *screen, int update)
|
|||
c = screen->real_column;
|
||||
screen->column = 0;
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].y_line_start += get_logical_num_lines (linep, &screen->terms[i]);
|
||||
screen->terms[i].x = 0;
|
||||
screen->terms[i].y = screen->terms[i].y_line_start;
|
||||
}
|
||||
advance_to (screen, c);
|
||||
}
|
||||
else
|
||||
|
@ -778,14 +711,7 @@ next_line (struct screen *screen, int update)
|
|||
static int
|
||||
beginning_of_line (struct screen *screen, int update)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
screen->column = screen->real_column = 0;
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].x = 0;
|
||||
screen->terms[i].y = screen->terms[i].y_line_start;
|
||||
}
|
||||
|
||||
if (update)
|
||||
update_screen_all (screen, screen->num_lines, 0, 0, 0, NO_LINE);
|
||||
|
@ -826,6 +752,11 @@ delete_char (struct screen *screen, int update)
|
|||
* sizeof (linep->buf[0]));
|
||||
linep->len--;
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
grub_free (linep->pos[i]);
|
||||
linep->pos[i] = 0;
|
||||
}
|
||||
start = screen->line;
|
||||
column = screen->column;
|
||||
|
||||
|
@ -848,6 +779,7 @@ delete_char (struct screen *screen, int update)
|
|||
else if (screen->num_lines > screen->line + 1)
|
||||
{
|
||||
struct line *next_linep;
|
||||
unsigned i;
|
||||
|
||||
next_linep = linep + 1;
|
||||
if (! ensure_space (linep, next_linep->len))
|
||||
|
@ -856,6 +788,11 @@ delete_char (struct screen *screen, int update)
|
|||
grub_memmove (linep->buf + linep->len, next_linep->buf,
|
||||
next_linep->len * sizeof (linep->buf[0]));
|
||||
linep->len += next_linep->len;
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
grub_free (linep->pos[i]);
|
||||
linep->pos[i] = 0;
|
||||
}
|
||||
|
||||
grub_free (next_linep->buf);
|
||||
grub_memmove (next_linep,
|
||||
|
@ -975,24 +912,12 @@ yank (struct screen *screen, int update)
|
|||
static int
|
||||
open_line (struct screen *screen, int update)
|
||||
{
|
||||
int saved_y[screen->nterms];
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
saved_y[i] = screen->terms[i].y;
|
||||
|
||||
if (! insert_string (screen, "\n", 0))
|
||||
return 0;
|
||||
|
||||
if (! backward_char (screen, 0))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < screen->nterms; i++)
|
||||
{
|
||||
screen->terms[i].y = saved_y[i];
|
||||
screen->terms[i].y_line_start = screen->terms[i].y;
|
||||
}
|
||||
|
||||
if (update)
|
||||
update_screen_all (screen, screen->line, screen->column, 0, 1, ALL_LINES);
|
||||
|
||||
|
@ -1303,7 +1228,20 @@ grub_menu_entry_run (grub_menu_entry_t entry)
|
|||
screen->nterms = 0;
|
||||
FOR_ACTIVE_TERM_OUTPUTS(term)
|
||||
screen->nterms++;
|
||||
screen->terms = grub_malloc (screen->nterms * sizeof (screen->terms[0]));
|
||||
|
||||
for (i = 0; i < (unsigned) screen->num_lines; i++)
|
||||
{
|
||||
grub_free (screen->lines[i].pos);
|
||||
screen->lines[i].pos = grub_zalloc (screen->nterms * sizeof (screen->lines[i].pos[0]));
|
||||
if (! screen->lines[i].pos)
|
||||
{
|
||||
grub_print_error ();
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
screen->terms = grub_zalloc (screen->nterms * sizeof (screen->terms[0]));
|
||||
if (!screen->terms)
|
||||
{
|
||||
grub_print_error ();
|
||||
|
@ -1314,9 +1252,7 @@ grub_menu_entry_run (grub_menu_entry_t entry)
|
|||
FOR_ACTIVE_TERM_OUTPUTS(term)
|
||||
{
|
||||
screen->terms[i].term = term;
|
||||
screen->terms[i].x = 0;
|
||||
screen->terms[i].y = 0;
|
||||
screen->terms[i].y_line_start = screen->terms[i].y;
|
||||
screen->terms[i].y_line_start = 0;
|
||||
i++;
|
||||
}
|
||||
/* Draw the screen. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue