* 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:
parent
1dcb8ea263
commit
9d93ce29bd
5 changed files with 61 additions and 59 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
29
src/window.c
29
src/window.c
|
@ -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)));
|
||||
|
|
26
src/window.h
26
src/window.h
|
@ -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;
|
||||
|
|
45
src/xdisp.c
45
src/xdisp.c
|
@ -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))
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue