summaryrefslogtreecommitdiff
path: root/lisp/button.el
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>2001-10-07 17:14:34 +0000
committerMiles Bader <miles@gnu.org>2001-10-07 17:14:34 +0000
commitd6bc0bdc4a8bee466b3885a5b2099fd80f9957fe (patch)
treee13891a9d2107b8cf5c8dc3291b1d9d02610134d /lisp/button.el
parente664497b5f023561ed2bfe12f4335cff999fb9ad (diff)
downloademacs-d6bc0bdc4a8bee466b3885a5b2099fd80f9957fe.tar.gz
(next-button, previous-button): Respect `skip' property.
(push-button, button-activate): Add USE-MOUSE-ACTION argument.
Diffstat (limited to 'lisp/button.el')
-rw-r--r--lisp/button.el30
1 files changed, 22 insertions, 8 deletions
diff --git a/lisp/button.el b/lisp/button.el
index d3506091597..ed2ea106366 100644
--- a/lisp/button.el
+++ b/lisp/button.el
@@ -184,9 +184,14 @@ Buttons inherit them by setting their `category' property to that symbol."
(point-max))
prop val)))
-(defsubst button-activate (button)
- "Call BUTTON's action property."
- (funcall (button-get button 'action) button))
+(defsubst button-activate (button use-mouse-action)
+ "Call BUTTON's action property.
+If USE-MOUSE-ACTION is non-nil, invoke the button's mouse-action
+instead of its normal action; if the button has no mouse-action,
+the normal action is used instead."
+ (funcall (or (and use-mouse-action (button-get button 'mouse-action))
+ (button-get button 'action))
+ button))
(defun button-label (button)
"Return BUTTON's text label."
@@ -314,7 +319,10 @@ If COUNT-CURRENT is non-nil, count any button at POS in the search,
;; Search for the next button boundary.
(setq pos (next-single-char-property-change pos 'button)))
(let ((button (button-at pos)))
- (cond ((and button (>= n 2))
+ (cond ((and button (button-get button 'skip))
+ ;; Found a button, but the button declines to be found; recurse.
+ (next-button (button-start button) n wrap))
+ ((and button (>= n 2))
;; Found a button, but we want a different one; recurse.
(next-button (button-start button) (1- n) wrap))
(button
@@ -344,7 +352,10 @@ If COUNT-CURRENT is non-nil, count any button at POS in the search,
(unless count-current
(setq pos (previous-single-char-property-change pos 'button)))
(let ((button (and (> pos (point-min)) (button-at (1- pos)))))
- (cond ((and button (>= n 2))
+ (cond ((and button (button-get button 'skip))
+ ;; Found a button, but the button declines to be found; recurse.
+ (previous-button (button-start button) n wrap))
+ ((and button (>= n 2))
;; Found a button, but we want a different one; recurse.
(previous-button (button-start button) (1- n) wrap))
(button
@@ -362,9 +373,12 @@ If COUNT-CURRENT is non-nil, count any button at POS in the search,
;; User commands
-(defun push-button (&optional pos)
+(defun push-button (&optional pos use-mouse-action)
"Perform the action specified by a button at location POS.
POS may be either a buffer position or a mouse-event.
+If USE-MOUSE-ACTION is non-nil, invoke the button's mouse-action
+instead of its normal action; if the button has no mouse-action,
+the normal action is used instead.
POS defaults to point, except when `push-button' is invoked
interactively as the result of a mouse-event, in which case, the
mouse event is used.
@@ -376,12 +390,12 @@ return t."
;; POS is a mouse event; switch to the proper window/buffer
(let ((posn (event-start pos)))
(with-current-buffer (window-buffer (posn-window posn))
- (push-button (posn-point posn))))
+ (push-button (posn-point posn) t)))
;; POS is just normal position
(let ((button (button-at (or pos (point)))))
(if (not button)
nil
- (button-activate button)
+ (button-activate button use-mouse-action)
t))))
(defun forward-button (n &optional wrap display-message)