* window.h (struct window): Change window_end_valid member from

Lisp_Object to a bitfield.  Adjust comments.
(wset_window_end_valid): Remove.
* window.c (adjust_window_count): Clear window_end_valid.
(Fwindow_end): Adjust user.  Remove ancient #if 0 code.
(Fwindow_line_height, set_window_buffer, Frecenter)
(Fsplit_window_internal, Fdelete_other_windows_internal)
(Fset_window_fringes, Fset_window_scroll_bars): Adjust users.
* dispnew.c (adjust_glyph_matrix, clear_window_matrices): Likewise.
* xdisp.c (check_window_end, reconsider_clip_changes)
(redisplay_internal, mark_window_display_accurate_1, redisplay_window)
(try_window, try_window_reusing_current_matrix, note_mouse_highlight)
(find_first_unchanged_at_end_row, try_window_id): Likewise.
This commit is contained in:
Dmitry Antipov 2013-01-22 15:48:00 +04:00
parent 1dcb8ea263
commit 9d93ce29bd
5 changed files with 61 additions and 59 deletions

View file

@ -1,3 +1,19 @@
2013-01-22 Dmitry Antipov <dmantipov@yandex.ru>
* window.h (struct window): Change window_end_valid member from
Lisp_Object to a bitfield. Adjust comments.
(wset_window_end_valid): Remove.
* window.c (adjust_window_count): Clear window_end_valid.
(Fwindow_end): Adjust user. Remove ancient #if 0 code.
(Fwindow_line_height, set_window_buffer, Frecenter)
(Fsplit_window_internal, Fdelete_other_windows_internal)
(Fset_window_fringes, Fset_window_scroll_bars): Adjust users.
* dispnew.c (adjust_glyph_matrix, clear_window_matrices): Likewise.
* xdisp.c (check_window_end, reconsider_clip_changes)
(redisplay_internal, mark_window_display_accurate_1, redisplay_window)
(try_window, try_window_reusing_current_matrix, note_mouse_highlight)
(find_first_unchanged_at_end_row, try_window_id): Likewise.
2013-01-22 Dmitry Antipov <dmantipov@yandex.ru>
* xdisp.c (mark_window_display_accurate): Simplify the loop

View file

@ -607,7 +607,7 @@ adjust_glyph_matrix (struct window *w, struct glyph_matrix *matrix, int x, int y
are invalidated below. */
if (INTEGERP (w->window_end_vpos)
&& XFASTINT (w->window_end_vpos) >= i)
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
while (i < matrix->nrows)
matrix->rows[i++].enabled_p = 0;
@ -862,7 +862,7 @@ clear_window_matrices (struct window *w, bool desired_p)
else
{
clear_glyph_matrix (w->current_matrix);
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
}
}

View file

@ -286,6 +286,8 @@ adjust_window_count (struct window *w, int arg)
b = b->base_buffer;
b->window_count += arg;
eassert (b->window_count >= 0);
/* Catch redisplay's attention. */
w->window_end_valid = 0;
}
}
@ -1489,17 +1491,8 @@ if it isn't already recorded. */)
CHECK_BUFFER (buf);
b = XBUFFER (buf);
#if 0 /* This change broke some things. We should make it later. */
/* If we don't know the end position, return nil.
The user can compute it with vertical-motion if he wants to.
It would be nicer to do it automatically,
but that's so slow that it would probably bother people. */
if (NILP (w->window_end_valid))
return Qnil;
#endif
if (! NILP (update)
&& (windows_or_buffers_changed || NILP (w->window_end_valid))
&& (windows_or_buffers_changed || !w->window_end_valid)
&& !noninteractive)
{
struct text_pos startp;
@ -1706,7 +1699,7 @@ Return nil if window display is not up-to-date. In that case, use
b = XBUFFER (w->buffer);
/* Fail if current matrix is not up-to-date. */
if (NILP (w->window_end_valid)
if (!w->window_end_valid
|| current_buffer->clip_changed
|| current_buffer->prevent_redisplay_optimizations_p
|| w->last_modified < BUF_MODIFF (b)
@ -2038,7 +2031,7 @@ replace_window (Lisp_Object old, Lisp_Object new, int setflag)
n->pseudo_window_p = 0;
wset_window_end_vpos (n, make_number (0));
wset_window_end_pos (n, make_number (0));
wset_window_end_valid (n, Qnil);
n->window_end_valid = 0;
n->frozen_window_start_p = 0;
}
@ -2973,7 +2966,7 @@ window-start value is reasonable when this function is called. */)
pos = *vmotion (startpos, -top, w);
set_marker_both (w->start, w->buffer, pos.bufpos, pos.bytepos);
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
w->start_at_line_beg = (pos.bytepos == BEGV_BYTE
|| FETCH_BYTE (pos.bytepos - 1) == '\n');
/* We need to do this, so that the window-scroll-functions
@ -3189,7 +3182,7 @@ set_window_buffer (Lisp_Object window, Lisp_Object buffer, int run_hooks_p, int
wset_window_end_pos (w, make_number (0));
wset_window_end_vpos (w, make_number (0));
memset (&w->last_cursor, 0, sizeof w->last_cursor);
wset_window_end_valid (w, Qnil);
if (!(keep_margins_p && samebuf))
{ /* If we're not actually changing the buffer, don't reset hscroll and
vscroll. This case happens for example when called from
@ -3958,7 +3951,7 @@ set correctly. See the code of `split-window' for how this is done. */)
wset_next (o, new);
}
wset_window_end_valid (n, Qnil);
n->window_end_valid = 0;
memset (&n->last_cursor, 0, sizeof n->last_cursor);
/* Get special geometry settings from reference window. */
@ -5368,7 +5361,7 @@ and redisplay normally--don't erase and redraw the frame. */)
/* Set the new window start. */
set_marker_both (w->start, w->buffer, charpos, bytepos);
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
w->optional_new_start = 1;
@ -6319,7 +6312,7 @@ display marginal areas and the text area. */)
adjust_window_margins (w);
clear_glyph_matrix (w->current_matrix);
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
++windows_or_buffers_changed;
adjust_glyphs (XFRAME (WINDOW_FRAME (w)));
@ -6389,7 +6382,7 @@ Fourth parameter HORIZONTAL-TYPE is currently unused. */)
adjust_window_margins (w);
clear_glyph_matrix (w->current_matrix);
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
++windows_or_buffers_changed;
adjust_glyphs (XFRAME (WINDOW_FRAME (w)));

View file

@ -175,17 +175,13 @@ struct window
no scroll bar. A value of t means use frame value. */
Lisp_Object vertical_scroll_bar_type;
/* Z - the buffer position of the last glyph in the current matrix
of W. Only valid if WINDOW_END_VALID is not nil. */
/* Z - the buffer position of the last glyph in the current
matrix of W. Only valid if window_end_valid is nonzero. */
Lisp_Object window_end_pos;
/* Glyph matrix row of the last glyph in the current matrix
of W. Only valid if WINDOW_END_VALID is not nil. */
of W. Only valid if window_end_valid is nonzero. */
Lisp_Object window_end_vpos;
/* t if window_end_pos is truly valid.
This is nil if nontrivial redisplay is preempted
since in that case the frame image that window_end_pos
did not get onto the frame. */
Lisp_Object window_end_valid;
/* Display-table to use for displaying chars in this window.
Nil means use the buffer's own display-table. */
@ -339,12 +335,17 @@ struct window
Otherwise draw them between margin areas and text. */
unsigned fringes_outside_margins : 1;
/* Nonzero if window_end_pos and window_end_vpos are truly valid.
This is zero if nontrivial redisplay is preempted since in that case
the frame image that window_end_pos did not get onto the frame. */
unsigned window_end_valid : 1;
/* Amount by which lines of this window are scrolled in
y-direction (smooth scrolling). */
int vscroll;
/* Z_BYTE - Buffer position of the last glyph in the current matrix of W.
Should be nonnegative, and only valid if window_end_valid is not nil. */
/* Z_BYTE - buffer position of the last glyph in the current matrix of W.
Should be nonnegative, and only valid if window_end_valid is nonzero. */
ptrdiff_t window_end_bytepos;
};
@ -401,11 +402,6 @@ wset_window_end_pos (struct window *w, Lisp_Object val)
w->window_end_pos = val;
}
WINDOW_INLINE void
wset_window_end_valid (struct window *w, Lisp_Object val)
{
w->window_end_valid = val;
}
WINDOW_INLINE void
wset_window_end_vpos (struct window *w, Lisp_Object val)
{
w->window_end_vpos = val;

View file

@ -2539,8 +2539,7 @@ check_it (struct it *it)
static void
check_window_end (struct window *w)
{
if (!MINI_WINDOW_P (w)
&& !NILP (w->window_end_valid))
if (!MINI_WINDOW_P (w) && w->window_end_valid)
{
struct glyph_row *row;
eassert ((row = MATRIX_ROW (w->current_matrix,
@ -12922,10 +12921,10 @@ static void
reconsider_clip_changes (struct window *w, struct buffer *b)
{
if (b->clip_changed
&& !NILP (w->window_end_valid)
&& w->current_matrix->buffer == b
&& w->current_matrix->zv == BUF_ZV (b)
&& w->current_matrix->begv == BUF_BEGV (b))
&& w->window_end_valid
&& w->current_matrix->buffer == b
&& w->current_matrix->zv == BUF_ZV (b)
&& w->current_matrix->begv == BUF_BEGV (b))
b->clip_changed = 0;
/* If display wasn't paused, and W is not a tool bar window, see if
@ -12933,8 +12932,7 @@ reconsider_clip_changes (struct window *w, struct buffer *b)
we set b->clip_changed to 1 to force updating the screen. If
b->clip_changed has already been set to 1, we can skip this
check. */
if (!b->clip_changed
&& BUFFERP (w->buffer) && !NILP (w->window_end_valid))
if (!b->clip_changed && BUFFERP (w->buffer) && w->window_end_valid)
{
ptrdiff_t pt;
@ -13328,7 +13326,7 @@ redisplay_internal (void)
else if (XFASTINT (w->window_end_vpos) == this_line_vpos
&& this_line_vpos > 0)
wset_window_end_vpos (w, make_number (this_line_vpos - 1));
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
/* Update hint: No need to try to scroll in update_window. */
w->desired_matrix->no_scrolling_p = 1;
@ -13758,7 +13756,7 @@ mark_window_display_accurate_1 (struct window *w, int accurate_p)
else
w->last_point = marker_position (w->pointm);
wset_window_end_valid (w, w->buffer);
w->window_end_valid = 1;
w->update_mode_line = 0;
}
}
@ -15460,7 +15458,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p)
set_buffer_internal_1 (XBUFFER (w->buffer));
current_matrix_up_to_date_p
= (!NILP (w->window_end_valid)
= (w->window_end_valid
&& !current_buffer->clip_changed
&& !current_buffer->prevent_redisplay_optimizations_p
&& !window_outdated (w));
@ -15483,7 +15481,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p)
specbind (Qinhibit_point_motion_hooks, Qt);
buffer_unchanged_p
= (!NILP (w->window_end_valid)
= (w->window_end_valid
&& !current_buffer->clip_changed
&& !window_outdated (w));
@ -15496,7 +15494,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p)
if (XMARKER (w->start)->buffer == current_buffer)
compute_window_start_on_continuation_line (w);
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
}
/* Some sanity checks. */
@ -15585,7 +15583,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p)
w->force_start = 0;
w->vscroll = 0;
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
/* Forget any recorded base line for line number display. */
if (!buffer_unchanged_p)
@ -16034,8 +16032,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p)
line.) */
if (w->cursor.vpos < 0)
{
if (!NILP (w->window_end_valid)
&& PT >= Z - XFASTINT (w->window_end_pos))
if (w->window_end_valid && PT >= Z - XFASTINT (w->window_end_pos))
{
clear_glyph_matrix (w->desired_matrix);
move_it_by_lines (&it, 1);
@ -16352,7 +16349,7 @@ try_window (Lisp_Object window, struct text_pos pos, int flags)
}
/* But that is not valid info until redisplay finishes. */
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
return 1;
}
@ -16599,7 +16596,7 @@ try_window_reusing_current_matrix (struct window *w)
wset_window_end_pos (w, make_number (Z - ZV));
wset_window_end_vpos (w, make_number (0));
}
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
/* Update hint: don't try scrolling again in update_window. */
w->desired_matrix->no_scrolling_p = 1;
@ -16797,7 +16794,7 @@ try_window_reusing_current_matrix (struct window *w)
(w, make_number (XFASTINT (w->window_end_vpos) - nrows_scrolled));
}
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
w->desired_matrix->no_scrolling_p = 1;
#ifdef GLYPH_DEBUG
@ -16930,7 +16927,7 @@ find_first_unchanged_at_end_row (struct window *w,
/* Display must not have been paused, otherwise the current matrix
is not up to date. */
eassert (!NILP (w->window_end_valid));
eassert (w->window_end_valid);
/* A value of window_end_pos >= END_UNCHANGED means that the window
end is in the range of changed text. If so, there is no
@ -17114,7 +17111,7 @@ row_containing_pos (struct window *w, ptrdiff_t charpos,
/* Try to redisplay window W by reusing its existing display. W's
current matrix must be up to date when this function is called,
i.e. window_end_valid must not be nil.
i.e. window_end_valid must be nonzero.
Value is
@ -17222,7 +17219,7 @@ try_window_id (struct window *w)
GIVE_UP (7);
/* Verify that display wasn't paused. */
if (NILP (w->window_end_valid))
if (!w->window_end_valid)
GIVE_UP (8);
/* Can't use this if highlighting a region because a cursor movement
@ -17873,7 +17870,7 @@ try_window_id (struct window *w)
debug_end_vpos = XFASTINT (w->window_end_vpos));
/* Record that display has not been completed. */
wset_window_end_valid (w, Qnil);
w->window_end_valid = 0;
w->desired_matrix->no_scrolling_p = 1;
return 3;
@ -27782,7 +27779,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
And verify the buffer's text has not changed. */
b = XBUFFER (w->buffer);
if (part == ON_TEXT
&& EQ (w->window_end_valid, w->buffer)
&& w->window_end_valid
&& w->last_modified == BUF_MODIFF (b)
&& w->last_overlay_modified == BUF_OVERLAY_MODIFF (b))
{