changeset 109801:f4192807d8a6

Fix mouse dragging of words and lines (Bug#6840). * mouse.el (mouse--drag-set-mark-and-point): New function. (mouse-drag-track): Use LOCATION arg to push-mark. Use mouse--drag-set-mark-and-point to take click-count into consideration when updating point and mark (Bug#6840).
author Chong Yidong <cyd@stupidchicken.com>
date Sun, 15 Aug 2010 22:08:01 -0400
parents 76debf804cdd
children acc05fd0631b
files lisp/ChangeLog lisp/mouse.el
diffstat 2 files changed, 29 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Aug 15 23:31:07 2010 +0000
+++ b/lisp/ChangeLog	Sun Aug 15 22:08:01 2010 -0400
@@ -1,3 +1,10 @@
+2010-08-15  Chong Yidong  <cyd@stupidchicken.com>
+
+	* mouse.el (mouse--drag-set-mark-and-point): New function.
+	(mouse-drag-track): Use LOCATION arg to push-mark.  Use
+	mouse--drag-set-mark-and-point to take click-count into
+	consideration when updating point and mark (Bug#6840).
+
 2010-08-15  Chong Yidong  <cyd@stupidchicken.com>
 
 	* progmodes/compile.el (compilation-error-regexp-alist-alist):
--- a/lisp/mouse.el	Sun Aug 15 23:31:07 2010 +0000
+++ b/lisp/mouse.el	Sun Aug 15 22:08:01 2010 -0400
@@ -954,8 +954,7 @@
 	      '(only)
 	    (cons 'only transient-mark-mode)))
     (let ((range (mouse-start-end start-point start-point click-count)))
-      (goto-char (nth 0 range))
-      (push-mark nil t t)
+      (push-mark (nth 0 range) t t)
       (goto-char (nth 1 range)))
 
     ;; Track the mouse until we get a non-movement event.
@@ -974,14 +973,8 @@
 		end-point (posn-point end))
 	  (if (and (eq (posn-window end) start-window)
 		   (integer-or-marker-p end-point))
-	      ;; If moving in the original window, move point by going
-	      ;; to start first, so that if end is in intangible text,
-	      ;; point jumps away from start.  Don't do it if
-	      ;; start=end, or a single click would select a region if
-	      ;; it's on intangible text.
-	      (unless (= start-point end-point)
-		(goto-char start-point)
-		(goto-char end-point))
+	      (mouse--drag-set-mark-and-point start-point
+					      end-point click-count)
 	    (let ((mouse-row (cdr (cdr (mouse-position)))))
 	      (cond
 	       ((null mouse-row))
@@ -999,8 +992,9 @@
 		 (eq (posn-window end) start-window)
 		 (integer-or-marker-p end-point)
 		 (/= start-point end-point))
-	(goto-char start-point)
-	(goto-char end-point))
+	(mouse--drag-set-mark-and-point start-point
+					end-point click-count))
+
       ;; Find its binding.
       (let* ((fun (key-binding (vector (car event))))
 	     (do-multi-click (and (> (event-click-count event) 0)
@@ -1051,6 +1045,21 @@
 		(put 'mouse-2 'event-kind 'mouse-click)))
 	    (push event unread-command-events)))))))
 
+(defun mouse--drag-set-mark-and-point (start click click-count)
+  (let* ((range (mouse-start-end start click click-count))
+	 (beg (nth 0 range))
+	 (end (nth 1 range)))
+    (cond ((eq (mark) beg)
+	   (goto-char end))
+	  ((eq (mark) end)
+	   (goto-char beg))
+	  ((< click (mark))
+	   (set-mark end)
+	   (goto-char beg))
+	  (t
+	   (set-mark beg)
+	   (goto-char end)))))
+
 (defun mouse--remap-link-click-p (start-event end-event)
   (or (and (eq mouse-1-click-follows-link 'double)
 	   (= (event-click-count start-event) 2))
@@ -1166,8 +1175,7 @@
         ((= mode 2)
 	 (list (save-excursion
 		 (goto-char start)
-		 (beginning-of-line 1)
-		 (point))
+		 (line-beginning-position 1))
 	       (save-excursion
 		 (goto-char end)
 		 (forward-line 1)