changeset 97184:a9fd3177343b

(forward-button): Avoid infloop.
author Chong Yidong <cyd@stupidchicken.com>
date Thu, 31 Jul 2008 22:15:45 +0000
parents 75a85b06acb3
children a5d7e1441bc6
files lisp/button.el
diffstat 1 files changed, 9 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/button.el	Thu Jul 31 22:15:18 2008 +0000
+++ b/lisp/button.el	Thu Jul 31 22:15:45 2008 +0000
@@ -437,15 +437,22 @@
 	    (goto-char (button-start button)))
       ;; Move to Nth next button
       (let ((iterator (if (> n 0) #'next-button #'previous-button))
-	    (wrap-start (if (> n 0) (point-min) (point-max))))
+	    (wrap-start (if (> n 0) (point-min) (point-max)))
+	    opoint fail)
 	(setq n (abs n))
 	(setq button t)			; just to start the loop
-	(while (and (> n 0) button)
+	(while (and (null fail) (> n 0) button)
 	  (setq button (funcall iterator (point)))
 	  (when (and (not button) wrap)
 	    (setq button (funcall iterator wrap-start t)))
 	  (when button
 	    (goto-char (button-start button))
+	    ;; Avoid looping forever (e.g., if all the buttons have
+	    ;; the `skip' property).
+	    (cond ((null opoint)
+		   (setq opoint (point)))
+		  ((= opoint (point))
+		   (setq fail t)))
 	    (unless (button-get button 'skip)
 	      (setq n (1- n)))))))
     (if (null button)