Compute freevars in cconv-analyse.
[bpt/emacs.git] / lisp / follow.el
index 7af3a04..7f4093d 100644 (file)
@@ -1,7 +1,6 @@
 ;;; follow.el --- synchronize windows showing the same buffer
 
-;; Copyright (C) 1995, 1996, 1997, 1999, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1995-1997, 1999, 2001-2011 Free Software Foundation, Inc.
 
 ;; Author: Anders Lindgren <andersl@andersl.com>
 ;; Maintainer: FSF (Anders' email bounces, Sep 2005)
@@ -872,8 +871,7 @@ Returns (end-pos end-of-buffer-p)"
       ;; XEmacs can calculate the end of the window by using
       ;; the 'guarantee options. GOOD!
       (let ((end (window-end win t)))
-       (if (= end (funcall (symbol-function 'point-max)
-                           (window-buffer win)))
+       (if (= end (point-max (window-buffer win)))
            (list end t)
          (list (+ end 1) nil)))
     ;; Emacs: We have to calculate the end by ourselves.
@@ -1033,21 +1031,27 @@ Note that this handles the case when the cache has been set to nil."
 (defun follow-select-if-visible (dest win-start-end)
   "Select and return a window, if DEST is visible in it.
 Return the selected window."
-  (let (win)
+  (let (win win-end)
     (while (and (not win) win-start-end)
       ;; Don't select a window that was just moved. This makes it
       ;; possible to later select the last window after a `end-of-buffer'
       ;; command.
       (when (follow-pos-visible dest (caar win-start-end) win-start-end)
-       (setq win (caar win-start-end))
+       (setq win (caar win-start-end)
+             win-end (car (cddr (car win-start-end))))
        (select-window win))
       (setq win-start-end (cdr win-start-end)))
     ;; The last line of the window may be partially visible; if so,
     ;; and if point is visible in the next window, select the next
     ;; window instead.
-    (and (/= dest (point-max))
+    (and win
+        (/= dest (point-max))
         win-start-end
         (follow-pos-visible dest (caar win-start-end) win-start-end)
+        (save-excursion
+          (goto-char dest)
+          (vertical-motion 1 win)
+          (>= (point) win-end))
         (setq win (caar win-start-end))
         (select-window win))
     win))
@@ -1373,13 +1377,13 @@ non-first windows in Follow mode."
                 ((and visible aligned)
                  (follow-debug-message "same"))
                 ;; Pick a position in any window.  If the display is
-                ;; ok, this will pick the `correct' window.  If the
-                ;; display is wierd (e.g., after a delete at the
-                ;; beginning of the window) do this anyway.
+                ;; ok, this will pick the `correct' window.
                 ((follow-select-if-visible dest win-start-end)
                  (follow-debug-message "visible")
-                 (setq visible t)
-                 (goto-char dest))
+                 (goto-char dest)
+                 ;; We have to perform redisplay, since scrolling is
+                 ;; needed in case the line is partially visible.
+                 (setq visible nil))
                 ;; Not visible anywhere else, lets pick this one.
                 ;; (Is this case used?)
                 (visible
@@ -1411,16 +1415,10 @@ non-first windows in Follow mode."
                (let ((p (window-point win)))
                  (set-window-start win (window-start win) nil)
                  (set-window-point win p))))
-           (unless (or visible
-                       ;; Use the UPDATE argument of window-end
-                       ;; instead of calling follow-pos-visible
-                       ;; (which may be inaccurate for partially
-                       ;; visible lines).
-                       (and (>= dest (window-start))
-                            (< dest (window-end nil t))))
-             ;; If point is not visible in the selected window,
-             ;; perform a redisplay; this causes scrolling.
-             (sit-for 0)
+           (unless visible
+             ;; If point may not be visible in the selected window,
+             ;; perform a redisplay; this ensures scrolling.
+             (redisplay)
              (setq selected-window-up-to-date t)
              (follow-avoid-tail-recenter)
              (setq win-start-end (follow-windows-start-end windows))
@@ -2122,5 +2120,4 @@ This prevents `mouse-drag-region' from messing things up."
 ;; | save it".             -- Douglas Adams, "Last Chance to See"           |
 ;; \------------------------------------------------------------------------/
 
-;; arch-tag: 7b16bb1a-808c-4991-a8cc-66d3822936d0
 ;;; follow.el ends here