changeset 35858:783c81a841f6

(widget-button-click): Fix last change.
author Gerd Moellmann <gerd@gnu.org>
date Fri, 02 Feb 2001 14:55:04 +0000
parents 84bccf78a45f
children c9edddbb8dbf
files lisp/wid-edit.el
diffstat 1 files changed, 25 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/wid-edit.el	Fri Feb 02 13:57:46 2001 +0000
+++ b/lisp/wid-edit.el	Fri Feb 02 14:55:04 2001 +0000
@@ -851,16 +851,23 @@
   "Invoke the button that the mouse is pointing at."
   (interactive "@e")
   (if (widget-event-point event)
-      (progn
-	(mouse-set-point event)
-	(let* ((pos (widget-event-point event))
-	       (button (get-char-property pos 'button)))
-	  (if button
+      (let* ((pos (widget-event-point event))
+	     (button (get-char-property pos 'button)))
+	(if button
+	    ;; Mouse click on a widget button.  Do the following
+	    ;; in a save-excursion so that the click on the button
+	    ;; doesn't change point.
+	    (progn
 	      (save-excursion
+		(mouse-set-point event)
 		(let* ((overlay (widget-get button :button-overlay))
 		       (face (overlay-get overlay 'face))
 		       (mouse-face (overlay-get overlay 'mouse-face)))
 		  (unwind-protect
+		      ;; Read events, including mouse-movement events
+		      ;; until we receive a release event.  Highlight/
+		      ;; unhighlight the button the mouse was initially
+		      ;; on when we move over it.
 		      (let ((track-mouse t))
 			(save-excursion
 			  (when face	; avoid changing around image
@@ -884,18 +891,25 @@
 						 widget-button-pressed-face))
 				(overlay-put overlay 'face face)
 				(overlay-put overlay 'mouse-face mouse-face))))
+
+			  ;; When mouse is released over the button, run
+			  ;; its action function.
 			  (when (and pos
 				     (eq (get-char-property pos 'button) button))
 			    (widget-apply-action button event))))
 		    (overlay-put overlay 'face face)
 		    (overlay-put overlay 'mouse-face mouse-face))))
 
-	    ;; Not on a button.  Find the global command to run, and
-	    ;; check whether it is bound to an up event.  Avoid a
-	    ;; `save-excursion' here, since a global command may
-	    ;; to change point, e.g. like `mouse-drag-drag' does.
-	    (let ((up t)
-		  command)
+		(unless (pos-visible-in-window-p (widget-event-point event))
+		  (mouse-set-point event)
+		  (beginning-of-line)
+		  (recenter)))
+
+	    (let ((up t) command)
+	      ;; Mouse click not on a widget button.  Find the global
+	      ;; command to run, and check whether it is bound to an
+	      ;; up event.
+	      (mouse-set-point event)
 	      (if (memq (event-basic-type event) '(mouse-1 down-mouse-1))
 		  (cond ((setq command	;down event
 			       (lookup-key widget-global-map [down-mouse-1]))
@@ -913,10 +927,6 @@
 		  (setq event (read-event))))
 	      (when command
 		(call-interactively command)))))
-	  (unless (pos-visible-in-window-p (widget-event-point event))
-	    (mouse-set-point event)
-	    (beginning-of-line)
-	    (recenter)))
     (message "You clicked somewhere weird.")))
 
 (defun widget-button-press (pos &optional event)