]> code.delx.au - gnu-emacs/blobdiff - lisp/button.el
(proced-after-send-signal-hook): Use defcustom.
[gnu-emacs] / lisp / button.el
index 6a558af445a142f4dbea9d6eb09e862df2d03b01..9732b8bae0598c14cb9c4ee732fb56d400af7cd3 100644 (file)
@@ -1,7 +1,7 @@
 ;;; button.el --- clickable buttons
 ;;
 ;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
-;;   2006, 2007, 2008 Free Software Foundation, Inc.
+;;   2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 ;;
 ;; Author: Miles Bader <miles@gnu.org>
 ;; Keywords: extensions
@@ -437,15 +437,22 @@ Returns the button found."
            (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)