# HG changeset patch # User Gerd Moellmann # Date 978612794 0 # Node ID ac8eb6b4eee6dfece2de5095ab04c97179c74920 # Parent 3c5b13084896b0352baaf827c996a7d25d9703b7 (Fdelete_other_windows): Set window's window_end_valid to nil when changing the window's start. Don't change the window's start when its top position hasn't changed. If we do, this will set the window's optional_new_start, which act's like a force_start during redisplay with C-x 1 M-> under particular circumstances (see report from Per Starback to emacs-pretest-bug from 2000-12-13.). (Fdelete_other_windows): Set window's window_end_valid to nil when changing the window's start. diff -r 3c5b13084896 -r ac8eb6b4eee6 src/window.c --- a/src/window.c Thu Jan 04 11:32:58 2001 +0000 +++ b/src/window.c Thu Jan 04 12:53:14 2001 +0000 @@ -1691,8 +1691,7 @@ Qnil, look at just the selected frame; Qvisible, look at visible frames; a frame, just look at windows on that frame. - If MINI is non-zero, perform the operation on minibuffer windows too. -*/ + If MINI is non-zero, perform the operation on minibuffer windows too. */ enum window_loop { @@ -1989,13 +1988,12 @@ { struct window *w; int startpos; - int top; + int top, new_top; if (NILP (window)) window = selected_window; else CHECK_LIVE_WINDOW (window, 0); - w = XWINDOW (window); startpos = marker_position (w->start); @@ -2011,7 +2009,9 @@ on the frame. But don't try to do this if the window start is outside the visible portion (as might happen when the display is not current, due to typeahead). */ - if (startpos >= BUF_BEGV (XBUFFER (w->buffer)) + new_top = XFASTINT (w->top) - FRAME_TOP_MARGIN (XFRAME (WINDOW_FRAME (w))); + if (new_top != top + && startpos >= BUF_BEGV (XBUFFER (w->buffer)) && startpos <= BUF_ZV (XBUFFER (w->buffer))) { struct position pos; @@ -2023,6 +2023,7 @@ pos = *vmotion (startpos, -top, w); set_marker_both (w->start, w->buffer, pos.bufpos, pos.bytepos); + w->window_end_valid = Qnil; w->start_at_line_beg = ((pos.bytepos == BEGV_BYTE || FETCH_BYTE (pos.bytepos - 1) == '\n') ? Qt : Qnil);