(init_iterator): Clear it.max_extra_line_spacing.
(move_it_vertically_backward): Don't recure to move further back. (move_it_vertically): Remove superfluous condition. (move_it_by_lines): Clear last_height when moved 0 lines. (resize_mini_window): use it.max_extra_line_spacing. (display_tool_bar_line): Clear row->extra_line_spacing. (try_scrolling): Use move_it_vertically_backward directly. (redisplay_window): Likewise. (compute_line_metrics): Set row->extra_line_spacing. (display_line, display_string): Likewise. (x_produce_glyphs): Update it->max_extra_line_spacing.
This commit is contained in:
parent
f204989e2e
commit
546f98b838
1 changed files with 37 additions and 14 deletions
51
src/xdisp.c
51
src/xdisp.c
|
@ -2075,6 +2075,7 @@ init_iterator (it, w, charpos, bytepos, row, base_face_id)
|
|||
* FRAME_LINE_HEIGHT (it->f));
|
||||
else if (it->f->extra_line_spacing > 0)
|
||||
it->extra_line_spacing = it->f->extra_line_spacing;
|
||||
it->max_extra_line_spacing = 0;
|
||||
}
|
||||
|
||||
/* If realized faces have been removed, e.g. because of face
|
||||
|
@ -6067,10 +6068,13 @@ move_it_vertically_backward (it, dy)
|
|||
{
|
||||
int nlines, h;
|
||||
struct it it2, it3;
|
||||
int start_pos = IT_CHARPOS (*it);
|
||||
int start_pos;
|
||||
|
||||
move_further_back:
|
||||
xassert (dy >= 0);
|
||||
|
||||
start_pos = IT_CHARPOS (*it);
|
||||
|
||||
/* Estimate how many newlines we must move back. */
|
||||
nlines = max (1, dy / FRAME_LINE_HEIGHT (it->f));
|
||||
|
||||
|
@ -6136,13 +6140,13 @@ move_it_vertically_backward (it, dy)
|
|||
a line height of 13 pixels each, recentering with point
|
||||
on the bottom line will try to move -39/2 = 19 pixels
|
||||
backward. Try to avoid moving into the first line. */
|
||||
&& it->current_y - target_y > line_height / 3 * 2
|
||||
&& it->current_y - target_y > line_height * 2 / 3
|
||||
&& IT_CHARPOS (*it) > BEGV)
|
||||
{
|
||||
TRACE_MOVE ((stderr, " not far enough -> move_vert %d\n",
|
||||
target_y - it->current_y));
|
||||
move_it_vertically (it, target_y - it->current_y);
|
||||
xassert (IT_CHARPOS (*it) >= BEGV);
|
||||
dy = it->current_y - target_y;
|
||||
goto move_further_back;
|
||||
}
|
||||
else if (target_y >= it->current_y + line_height
|
||||
&& IT_CHARPOS (*it) < ZV)
|
||||
|
@ -6183,7 +6187,7 @@ move_it_vertically (it, dy)
|
|||
{
|
||||
if (dy <= 0)
|
||||
move_it_vertically_backward (it, -dy);
|
||||
else if (dy > 0)
|
||||
else
|
||||
{
|
||||
TRACE_MOVE ((stderr, "move_it_v: from %d, %d\n", IT_CHARPOS (*it), dy));
|
||||
move_it_to (it, ZV, -1, it->current_y + dy, -1,
|
||||
|
@ -6280,6 +6284,8 @@ move_it_by_lines (it, dvpos, need_y_p)
|
|||
/* DVPOS == 0 means move to the start of the screen line. */
|
||||
move_it_vertically_backward (it, 0);
|
||||
xassert (it->current_x == 0 && it->hpos == 0);
|
||||
/* Let next call to line_bottom_y calculate real line height */
|
||||
last_height = 0;
|
||||
}
|
||||
else if (dvpos > 0)
|
||||
move_it_to (it, -1, -1, -1, it->vpos + dvpos, MOVE_TO_VPOS);
|
||||
|
@ -7423,7 +7429,7 @@ resize_mini_window (w, exact_p)
|
|||
height = it.current_y + last_height;
|
||||
else
|
||||
height = it.current_y + it.max_ascent + it.max_descent;
|
||||
height -= it.extra_line_spacing;
|
||||
height -= min (it.extra_line_spacing, it.max_extra_line_spacing);
|
||||
height = (height + unit - 1) / unit;
|
||||
}
|
||||
|
||||
|
@ -8701,6 +8707,7 @@ display_tool_bar_line (it)
|
|||
{
|
||||
row->height = row->phys_height = it->last_visible_y - row->y;
|
||||
row->ascent = row->phys_ascent = 0;
|
||||
row->extra_line_spacing = 0;
|
||||
}
|
||||
|
||||
row->full_width_p = 1;
|
||||
|
@ -10889,7 +10896,7 @@ make_cursor_line_fully_visible (w, force_p)
|
|||
row = MATRIX_ROW (matrix, w->cursor.vpos);
|
||||
|
||||
/* If the cursor row is not partially visible, there's nothing to do. */
|
||||
if (!MATRIX_ROW_PARTIALLY_VISIBLE_P (row))
|
||||
if (!MATRIX_ROW_PARTIALLY_VISIBLE_P (w, row))
|
||||
return 1;
|
||||
|
||||
/* If the row the cursor is in is taller than the window's height,
|
||||
|
@ -11043,7 +11050,7 @@ try_scrolling (window, just_this_one_p, scroll_conservatively,
|
|||
{
|
||||
start_display (&it, w, scroll_margin_pos);
|
||||
if (this_scroll_margin)
|
||||
move_it_vertically (&it, - this_scroll_margin);
|
||||
move_it_vertically_backward (&it, this_scroll_margin);
|
||||
if (extra_scroll_margin_lines)
|
||||
move_it_by_lines (&it, - extra_scroll_margin_lines, 0);
|
||||
scroll_margin_pos = it.current.pos;
|
||||
|
@ -11163,7 +11170,7 @@ try_scrolling (window, just_this_one_p, scroll_conservatively,
|
|||
if (amount_to_scroll <= 0)
|
||||
return SCROLLING_FAILED;
|
||||
|
||||
move_it_vertically (&it, - amount_to_scroll);
|
||||
move_it_vertically_backward (&it, amount_to_scroll);
|
||||
startp = it.current.pos;
|
||||
}
|
||||
}
|
||||
|
@ -11467,7 +11474,7 @@ try_cursor_movement (window, startp, scroll_step)
|
|||
/* if PT is not in the glyph row, give up. */
|
||||
rc = CURSOR_MOVEMENT_MUST_SCROLL;
|
||||
}
|
||||
else if (MATRIX_ROW_PARTIALLY_VISIBLE_P (row))
|
||||
else if (MATRIX_ROW_PARTIALLY_VISIBLE_P (w, row))
|
||||
{
|
||||
if (PT == MATRIX_ROW_END_CHARPOS (row)
|
||||
&& !row->ends_at_zv_p
|
||||
|
@ -12042,7 +12049,7 @@ redisplay_window (window, just_this_one_p)
|
|||
if (it.current_y <= 0)
|
||||
{
|
||||
init_iterator (&it, w, PT, PT_BYTE, NULL, DEFAULT_FACE_ID);
|
||||
move_it_vertically (&it, 0);
|
||||
move_it_vertically_backward (&it, 0);
|
||||
xassert (IT_CHARPOS (it) <= PT);
|
||||
it.current_y = 0;
|
||||
}
|
||||
|
@ -12391,7 +12398,7 @@ try_window_reusing_current_matrix (w)
|
|||
/* Give up if old or new display is scrolled vertically. We could
|
||||
make this function handle this, but right now it doesn't. */
|
||||
start_row = MATRIX_FIRST_TEXT_ROW (w->current_matrix);
|
||||
if (w->vscroll || MATRIX_ROW_PARTIALLY_VISIBLE_P (start_row))
|
||||
if (w->vscroll || MATRIX_ROW_PARTIALLY_VISIBLE_P (w, start_row))
|
||||
return 0;
|
||||
|
||||
/* The variable new_start now holds the new window start. The old
|
||||
|
@ -12439,7 +12446,7 @@ try_window_reusing_current_matrix (w)
|
|||
start = start_row->start.pos;
|
||||
/* If there are no more rows to try, or just one, give up. */
|
||||
if (start_row == MATRIX_MODE_LINE_ROW (w->current_matrix) - 1
|
||||
|| w->vscroll || MATRIX_ROW_PARTIALLY_VISIBLE_P (start_row)
|
||||
|| w->vscroll || MATRIX_ROW_PARTIALLY_VISIBLE_P (w, start_row)
|
||||
|| CHARPOS (start) == ZV)
|
||||
{
|
||||
clear_glyph_matrix (w->desired_matrix);
|
||||
|
@ -14233,6 +14240,7 @@ compute_line_metrics (it)
|
|||
row->height = it->max_ascent + it->max_descent;
|
||||
row->phys_ascent = it->max_phys_ascent;
|
||||
row->phys_height = it->max_phys_ascent + it->max_phys_descent;
|
||||
row->extra_line_spacing = it->max_extra_line_spacing;
|
||||
}
|
||||
|
||||
/* Compute the width of this line. */
|
||||
|
@ -14276,6 +14284,7 @@ compute_line_metrics (it)
|
|||
row->pixel_width -= it->truncation_pixel_width;
|
||||
row->ascent = row->phys_ascent = 0;
|
||||
row->height = row->phys_height = row->visible_height = 1;
|
||||
row->extra_line_spacing = 0;
|
||||
}
|
||||
|
||||
/* Compute a hash code for this row. */
|
||||
|
@ -14612,6 +14621,7 @@ display_line (it)
|
|||
row->height = it->max_ascent + it->max_descent;
|
||||
row->phys_ascent = it->max_phys_ascent;
|
||||
row->phys_height = it->max_phys_ascent + it->max_phys_descent;
|
||||
row->extra_line_spacing = it->max_extra_line_spacing;
|
||||
|
||||
/* Loop generating characters. The loop is left with IT on the next
|
||||
character to display. */
|
||||
|
@ -14677,6 +14687,8 @@ display_line (it)
|
|||
row->phys_ascent = max (row->phys_ascent, it->max_phys_ascent);
|
||||
row->phys_height = max (row->phys_height,
|
||||
it->max_phys_ascent + it->max_phys_descent);
|
||||
row->extra_line_spacing = max (row->extra_line_spacing,
|
||||
it->max_extra_line_spacing);
|
||||
set_iterator_to_next (it, 1);
|
||||
continue;
|
||||
}
|
||||
|
@ -14705,6 +14717,8 @@ display_line (it)
|
|||
row->phys_ascent = max (row->phys_ascent, it->max_phys_ascent);
|
||||
row->phys_height = max (row->phys_height,
|
||||
it->max_phys_ascent + it->max_phys_descent);
|
||||
row->extra_line_spacing = max (row->extra_line_spacing,
|
||||
it->max_extra_line_spacing);
|
||||
if (it->current_x - it->pixel_width < it->first_visible_x)
|
||||
row->x = x - it->first_visible_x;
|
||||
}
|
||||
|
@ -14856,6 +14870,8 @@ display_line (it)
|
|||
row->phys_ascent = max (row->phys_ascent, it->max_phys_ascent);
|
||||
row->phys_height = max (row->phys_height,
|
||||
it->max_phys_ascent + it->max_phys_descent);
|
||||
row->extra_line_spacing = max (row->extra_line_spacing,
|
||||
it->max_extra_line_spacing);
|
||||
|
||||
/* End of this display line if row is continued. */
|
||||
if (row->continued_p || row->ends_at_zv_p)
|
||||
|
@ -16767,6 +16783,7 @@ display_string (string, lisp_string, face_string, face_string_pos,
|
|||
row->height = it->max_ascent + it->max_descent;
|
||||
row->phys_ascent = it->max_phys_ascent;
|
||||
row->phys_height = it->max_phys_ascent + it->max_phys_descent;
|
||||
row->extra_line_spacing = it->max_extra_line_spacing;
|
||||
|
||||
/* This condition is for the case that we are called with current_x
|
||||
past last_visible_x. */
|
||||
|
@ -16826,6 +16843,8 @@ display_string (string, lisp_string, face_string, face_string_pos,
|
|||
row->phys_ascent = max (row->phys_ascent, it->max_phys_ascent);
|
||||
row->phys_height = max (row->phys_height,
|
||||
it->max_phys_ascent + it->max_phys_descent);
|
||||
row->extra_line_spacing = max (row->extra_line_spacing,
|
||||
it->max_extra_line_spacing);
|
||||
x += glyph->pixel_width;
|
||||
++i;
|
||||
}
|
||||
|
@ -19448,7 +19467,11 @@ x_produce_glyphs (it)
|
|||
it->current_x += it->pixel_width;
|
||||
|
||||
if (extra_line_spacing > 0)
|
||||
it->descent += extra_line_spacing;
|
||||
{
|
||||
it->descent += extra_line_spacing;
|
||||
if (extra_line_spacing > it->max_extra_line_spacing)
|
||||
it->max_extra_line_spacing = extra_line_spacing;
|
||||
}
|
||||
|
||||
it->max_ascent = max (it->max_ascent, it->ascent);
|
||||
it->max_descent = max (it->max_descent, it->descent);
|
||||
|
|
Loading…
Add table
Reference in a new issue