changeset 35456:636e1b6488ea

(widget-button-click): Avoid a save-excursion around running a global binding.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 22 Jan 2001 11:07:10 +0000
parents 726f7fb9d190
children 997bb0c4cbd1
files lisp/wid-edit.el
diffstat 1 files changed, 39 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/wid-edit.el	Mon Jan 22 10:20:06 2001 +0000
+++ b/lisp/wid-edit.el	Mon Jan 22 11:07:10 2001 +0000
@@ -851,47 +851,51 @@
   "Invoke the button that the mouse is pointing at."
   (interactive "@e")
   (if (widget-event-point event)
-      (save-excursion
+      (progn
 	(mouse-set-point event)
 	(let* ((pos (widget-event-point event))
 	       (button (get-char-property pos 'button)))
 	  (if button
-	      (let* ((overlay (widget-get button :button-overlay))
-		     (face (overlay-get overlay 'face))
-		     (mouse-face (overlay-get overlay 'mouse-face)))
-		(unwind-protect
-		    (let ((track-mouse t))
-		      (save-excursion
-			(when face	; avoid changing around image
-			  (overlay-put overlay
-				       'face widget-button-pressed-face)
-			  (overlay-put overlay
-				       'mouse-face widget-button-pressed-face))
-			(unless (widget-apply button :mouse-down-action event)
-			  (while (not (widget-button-release-event-p event))
-			    (setq event (read-event)
-				  pos (widget-event-point event))
-			    (if (and pos
-				     (eq (get-char-property pos 'button)
-					 button))
-				(when face
-				  (overlay-put overlay
-					       'face
-					       widget-button-pressed-face)
-				  (overlay-put overlay
-					       'mouse-face
-					       widget-button-pressed-face))
-			      (overlay-put overlay 'face face)
-			      (overlay-put overlay 'mouse-face mouse-face))))
-			(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)))
+	      (save-excursion
+		(let* ((overlay (widget-get button :button-overlay))
+		       (face (overlay-get overlay 'face))
+		       (mouse-face (overlay-get overlay 'mouse-face)))
+		  (unwind-protect
+		      (let ((track-mouse t))
+			(save-excursion
+			  (when face	; avoid changing around image
+			    (overlay-put overlay
+					 'face widget-button-pressed-face)
+			    (overlay-put overlay
+					 'mouse-face widget-button-pressed-face))
+			  (unless (widget-apply button :mouse-down-action event)
+			    (while (not (widget-button-release-event-p event))
+			      (setq event (read-event)
+				    pos (widget-event-point event))
+			      (if (and pos
+				       (eq (get-char-property pos 'button)
+					   button))
+				  (when face
+				    (overlay-put overlay
+						 'face
+						 widget-button-pressed-face)
+				    (overlay-put overlay
+						 'mouse-face
+						 widget-button-pressed-face))
+				(overlay-put overlay 'face face)
+				(overlay-put overlay 'mouse-face mouse-face))))
+			  (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)
-	      ;; Find the global command to run, and check whether it
-	      ;; is bound to an up 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]))