Mercurial > emacs
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) |