comparison lisp/wid-edit.el @ 48842:66dc7b1b4b00

(widget-move): Don't loop infinitely when there is no field or button.
author Andreas Schwab <schwab@suse.de>
date Sat, 14 Dec 2002 14:25:53 +0000
parents e84d99848b76
children 60e3eed1b79e
comparison
equal deleted inserted replaced
48841:24ee0d16711c 48842:66dc7b1b4b00
1000 1000
1001 (defun widget-move (arg) 1001 (defun widget-move (arg)
1002 "Move point to the ARG next field or button. 1002 "Move point to the ARG next field or button.
1003 ARG may be negative to move backward." 1003 ARG may be negative to move backward."
1004 (or (bobp) (> arg 0) (backward-char)) 1004 (or (bobp) (> arg 0) (backward-char))
1005 (let ((pos (point)) 1005 (let ((wrapped 0)
1006 (number arg) 1006 (number arg)
1007 (old (widget-tabable-at)) 1007 (old (widget-tabable-at))
1008 new) 1008 new)
1009 ;; Forward. 1009 ;; Forward.
1010 (while (> arg 0) 1010 (while (> arg 0)
1011 (cond ((eobp) 1011 (cond ((eobp)
1012 (goto-char (point-min))) 1012 (goto-char (point-min))
1013 (setq wrapped (1+ wrapped)))
1013 (widget-use-overlay-change 1014 (widget-use-overlay-change
1014 (goto-char (next-overlay-change (point)))) 1015 (goto-char (next-overlay-change (point))))
1015 (t 1016 (t
1016 (forward-char 1))) 1017 (forward-char 1)))
1017 (and (eq pos (point)) 1018 (and (= wrapped 2)
1018 (eq arg number) 1019 (eq arg number)
1019 (error "No buttons or fields found")) 1020 (error "No buttons or fields found"))
1020 (let ((new (widget-tabable-at))) 1021 (let ((new (widget-tabable-at)))
1021 (when new 1022 (when new
1022 (unless (eq new old) 1023 (unless (eq new old)
1023 (setq arg (1- arg)) 1024 (setq arg (1- arg))
1024 (setq old new))))) 1025 (setq old new)))))
1025 ;; Backward. 1026 ;; Backward.
1026 (while (< arg 0) 1027 (while (< arg 0)
1027 (cond ((bobp) 1028 (cond ((bobp)
1028 (goto-char (point-max))) 1029 (goto-char (point-max))
1030 (setq wrapped (1+ wrapped)))
1029 (widget-use-overlay-change 1031 (widget-use-overlay-change
1030 (goto-char (previous-overlay-change (point)))) 1032 (goto-char (previous-overlay-change (point))))
1031 (t 1033 (t
1032 (backward-char 1))) 1034 (backward-char 1)))
1033 (and (eq pos (point)) 1035 (and (= wrapped 2)
1034 (eq arg number) 1036 (eq arg number)
1035 (error "No buttons or fields found")) 1037 (error "No buttons or fields found"))
1036 (let ((new (widget-tabable-at))) 1038 (let ((new (widget-tabable-at)))
1037 (when new 1039 (when new
1038 (unless (eq new old) 1040 (unless (eq new old)