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