changeset 72909:3462f8c114c9

(line-move-partial): Use window-line-visiblity to quickly check whether last line is partially visible, and only do the hard (and slow) part in that case.
author Kim F. Storm <storm@cua.dk>
date Fri, 15 Sep 2006 21:04:39 +0000
parents 5c55bc17ef31
children f84c05f61c25
files lisp/simple.el
diffstat 1 files changed, 43 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/simple.el	Fri Sep 15 21:04:28 2006 +0000
+++ b/lisp/simple.el	Fri Sep 15 21:04:39 2006 +0000
@@ -3487,43 +3487,49 @@
 	  (set-window-vscroll nil (- vs (frame-char-height)) t)))
 
     ;; Move forward (down).
-    (let* ((evis (or (pos-visible-in-window-p (window-end nil t) nil t)
-		     (pos-visible-in-window-p (1- (window-end nil t)) nil t)))
-	   (rbot (nth 3 evis))
-	   (vpos (nth 5 evis))
-	   ppos py vs)
-      (cond
-       ;; Last window line should be visible - fail if not.
-       ((null evis)
-	nil)
-       ;; If last line of window is fully visible, move forward.
-       ((null rbot)
-	nil)
-       ;; If cursor is not in the bottom scroll margin, move forward.
-       ((< (setq ppos (posn-at-point)
-		 py (cdr (or (posn-actual-col-row ppos)
-			     (posn-col-row ppos))))
-	   (min (- (window-text-height) scroll-margin 1) (1- vpos)))
-	nil)
-       ;; When already vscrolled, we vscroll some more if we can,
-       ;; or clear vscroll and move forward at end of tall image.
-       ((> (setq vs (window-vscroll nil t)) 0)
-	(when (> rbot 0)
-	  (set-window-vscroll nil (+ vs (min rbot (frame-char-height))) t)))
-       ;; If cursor just entered the bottom scroll margin, move forward,
-       ;; but also vscroll one line so redisplay wont recenter.
-       ((= py (min (- (window-text-height) scroll-margin 1)
-		   (1- vpos)))
-	(set-window-vscroll nil (frame-char-height) t)
-	(line-move-1 arg noerror to-end)
-	t)
-       ;; If there are lines above the last line, scroll-up one line.
-       ((> vpos 0)
-	(scroll-up 1)
-	t)
-       ;; Finally, start vscroll.
-       (t
-	(set-window-vscroll nil (frame-char-height) t))))))
+    (let ((wvis (window-line-visibility)))
+      (when (or (null wvis)
+		(and (consp wvis)
+		     (or (>= (car wvis) (frame-char-height))
+			 (>= (cdr wvis) (frame-char-height)))))
+	(let* ((wend (window-end nil t))
+	       (evis (or (pos-visible-in-window-p wend nil t)
+			 (pos-visible-in-window-p (1- wend) nil t)))
+	       (rbot (nth 3 evis))
+	       (vpos (nth 5 evis))
+	       ppos py vs)
+	  (cond
+	   ;; Last window line should be visible - fail if not.
+	   ((null evis)
+	    nil)
+	   ;; If last line of window is fully visible, move forward.
+	   ((null rbot)
+	    nil)
+	   ;; If cursor is not in the bottom scroll margin, move forward.
+	   ((< (setq ppos (posn-at-point)
+		     py (cdr (or (posn-actual-col-row ppos)
+				 (posn-col-row ppos))))
+	       (min (- (window-text-height) scroll-margin 1) (1- vpos)))
+	    nil)
+	   ;; When already vscrolled, we vscroll some more if we can,
+	   ;; or clear vscroll and move forward at end of tall image.
+	   ((> (setq vs (window-vscroll nil t)) 0)
+	    (when (> rbot 0)
+	      (set-window-vscroll nil (+ vs (min rbot (frame-char-height))) t)))
+	   ;; If cursor just entered the bottom scroll margin, move forward,
+	   ;; but also vscroll one line so redisplay wont recenter.
+	   ((= py (min (- (window-text-height) scroll-margin 1)
+		       (1- vpos)))
+	    (set-window-vscroll nil (frame-char-height) t)
+	    (line-move-1 arg noerror to-end)
+	    t)
+	   ;; If there are lines above the last line, scroll-up one line.
+	   ((> vpos 0)
+	    (scroll-up 1)
+	    t)
+	   ;; Finally, start vscroll.
+	   (t
+	    (set-window-vscroll nil (frame-char-height) t))))))))
 
 
 ;; This is like line-move-1 except that it also performs