emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-24 r117521: Fix bug #18545 with lack of scrolling a


From: Eli Zaretskii
Subject: [Emacs-diffs] emacs-24 r117521: Fix bug #18545 with lack of scrolling a window when point goes out of view.
Date: Mon, 29 Sep 2014 19:11:49 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 117521
revision-id: address@hidden
parent: address@hidden
fixes bug: http://debbugs.gnu.org/18545
committer: Eli Zaretskii <address@hidden>
branch nick: emacs-24
timestamp: Mon 2014-09-29 22:10:28 +0300
message:
  Fix bug #18545 with lack of scrolling a window when point goes out of view.
  
   src/xdisp.c (cursor_row_fully_visible_p): Update commentary.
   (redisplay_window): Treat the frame's frozen_window_starts flag
   the same way as the optional_new_start flag for the window: only
   obey it if the glyph row showing point will be fully visible.
   Likewise when the window start is in a continuation line.  If,
   after trying everything under the 'force_start' label, point is
   still not fully visible, give up and scroll the window.  Add
   debugging traces.
   src/window.c (Frecenter): Set the window's redisplay flag.
modified:
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/window.c                   window.c-20091113204419-o5vbwnq5f7feedwu-231
  src/xdisp.c                    xdisp.c-20091113204419-o5vbwnq5f7feedwu-240
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2014-09-24 07:31:11 +0000
+++ b/src/ChangeLog     2014-09-29 19:10:28 +0000
@@ -1,3 +1,16 @@
+2014-09-29  Eli Zaretskii  <address@hidden>
+
+       * xdisp.c (cursor_row_fully_visible_p): Update commentary.
+       (redisplay_window): Treat the frame's frozen_window_starts flag
+       the same way as the optional_new_start flag for the window: only
+       obey it if the glyph row showing point will be fully visible.
+       Likewise when the window start is in a continuation line.  If,
+       after trying everything under the 'force_start' label, point is
+       still not fully visible, give up and scroll the window.  Add
+       debugging traces.  (Bug#18545)
+
+       * window.c (Frecenter): Set the window's redisplay flag.
+
 2014-09-24  Eli Zaretskii  <address@hidden>
 
        * w32term.c (w32_read_socket): Don't use frame dimensions for

=== modified file 'src/window.c'
--- a/src/window.c      2014-09-11 08:47:34 +0000
+++ b/src/window.c      2014-09-29 19:10:28 +0000
@@ -5897,6 +5897,8 @@
   w->start_at_line_beg = (bytepos == BEGV_BYTE ||
                          FETCH_BYTE (bytepos - 1) == '\n');
 
+  wset_redisplay (w);
+
   set_buffer_internal (obuf);
   return Qnil;
 }

=== modified file 'src/xdisp.c'
--- a/src/xdisp.c       2014-09-18 15:10:33 +0000
+++ b/src/xdisp.c       2014-09-29 19:10:28 +0000
@@ -15027,6 +15027,10 @@
    If FORCE_P is non-zero, return 0 even if partial visible cursor row
    is higher than window.
 
+   If CURRENT_MATRIX_P is non-zero, use the information from the
+   window's current glyph matrix; otherwise uze the desired glyph
+   matrix.
+
    A value of 0 means the caller should do scrolling
    as if point had gone off the screen.  */
 
@@ -16136,26 +16140,48 @@
 
   /* If someone specified a new starting point but did not insist,
      check whether it can be used.  */
-  if (w->optional_new_start
+  if ((w->optional_new_start || window_frozen_p (w))
       && CHARPOS (startp) >= BEGV
       && CHARPOS (startp) <= ZV)
     {
+      ptrdiff_t it_charpos;
+
       w->optional_new_start = 0;
       start_display (&it, w, startp);
       move_it_to (&it, PT, 0, it.last_visible_y, -1,
                  MOVE_TO_POS | MOVE_TO_X | MOVE_TO_Y);
-      if (IT_CHARPOS (it) == PT)
-       w->force_start = 1;
-      /* IT may overshoot PT if text at PT is invisible.  */
-      else if (IT_CHARPOS (it) > PT && CHARPOS (startp) <= PT)
-       w->force_start = 1;
+      /* Record IT's position now, since line_bottom_y might change
+        that.  */
+      it_charpos = IT_CHARPOS (it);
+      /* Make sure we set the force_start flag only if the cursor row
+        will be fully visible.  Otherwise, the code under force_start
+        label below will try to move point back into view, which is
+        not what the code which sets optional_new_start wants.  */
+      if ((it.current_y == 0 || line_bottom_y (&it) < it.last_visible_y)
+         && !w->force_start)
+       {
+         if (it_charpos == PT)
+           w->force_start = 1;
+         /* IT may overshoot PT if text at PT is invisible.  */
+         else if (it_charpos > PT && CHARPOS (startp) <= PT)
+           w->force_start = 1;
+#ifdef GLYPH_DEBUG
+         if (w->force_start)
+           {
+             if (window_frozen_p (w))
+               debug_method_add (w, "set force_start from frozen window 
start");
+             else
+               debug_method_add (w, "set force_start from optional_new_start");
+           }
+#endif
+       }
     }
 
  force_start:
 
   /* Handle case where place to start displaying has been specified,
      unless the specified location is outside the accessible range.  */
-  if (w->force_start || window_frozen_p (w))
+  if (w->force_start)
     {
       /* We set this later on if we have to adjust point.  */
       int new_vpos = -1;
@@ -16200,7 +16226,7 @@
          goto need_larger_matrices;
        }
 
-      if (w->cursor.vpos < 0 && !window_frozen_p (w))
+      if (w->cursor.vpos < 0)
        {
          /* If point does not appear, try to move point so it does
             appear. The desired matrix has been built above, so we
@@ -16293,6 +16319,11 @@
            }
          */
        }
+      if (w->cursor.vpos < 0 || !cursor_row_fully_visible_p (w, 0, 0))
+       {
+         clear_glyph_matrix (w->desired_matrix);
+         goto try_to_scroll;
+       }
 
 #ifdef GLYPH_DEBUG
       debug_method_add (w, "forced window start");
@@ -16357,7 +16388,8 @@
               || CHARPOS (startp) == BEGV
               || !window_outdated (w)))
     {
-      int d1, d2, d3, d4, d5, d6;
+      int d1, d2, d5, d6;
+      int rtop, rbot;
 
       /* If first window line is a continuation line, and window start
         is inside the modified region, but the first change is before
@@ -16382,14 +16414,20 @@
          && compute_window_start_on_continuation_line (w)
          /* It doesn't make sense to force the window start like we
             do at label force_start if it is already known that point
-            will not be visible in the resulting window, because
+            will not be fully visible in the resulting window, because
             doing so will move point from its correct position
             instead of scrolling the window to bring point into view.
             See bug#9324.  */
-         && pos_visible_p (w, PT, &d1, &d2, &d3, &d4, &d5, &d6))
+         && pos_visible_p (w, PT, &d1, &d2, &rtop, &rbot, &d5, &d6)
+         /* A very tall row could need more than the window height,
+            in which case we accept that it is partially visible.  */
+         && (rtop != 0) == (rbot != 0))
        {
          w->force_start = 1;
          SET_TEXT_POS_FROM_MARKER (startp, w->start);
+#ifdef GLYPH_DEBUG
+         debug_method_add (w, "recomputed window start in continuation line");
+#endif
          goto force_start;
        }
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]