From: Stefan Monnier Date: Tue, 27 May 2014 05:01:49 +0000 (-0400) Subject: * lisp/mouse.el (mouse-set-region): Handle spurious drag events. X-Git-Tag: emacs-25.0.90~2640^2~46 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a366fbe2b77958df12824da799d65a127b14e834;p=emacs.git * lisp/mouse.el (mouse-set-region): Handle spurious drag events. (mouse-drag-track): Annotate `mouse-drag-start' so we know we moved. Fixes: debbugs:17562 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 594feb08980..080e11ad01f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2014-05-27 Stefan Monnier + + * mouse.el (mouse-set-region): Handle spurious drag events (bug#17562). + (mouse-drag-track): Annotate `mouse-drag-start' so we know we moved. + 2014-05-26 Andreas Schwab * cus-face.el (custom-face-attributes): Add :distant-foreground. @@ -24,8 +29,8 @@ Todo file, make sure we're in the right mode and the buffer local variables are set. (todo-make-categories-list, todo-reset-nondiary-marker) - (todo-reset-done-string, todo-reset-comment-string): After - processing all Todo files, kill the buffers of those files that + (todo-reset-done-string, todo-reset-comment-string): + After processing all Todo files, kill the buffers of those files that weren't being visited before the processing. (todo-display-as-todo-file, todo-add-to-buffer-list) (todo-visit-files-commands): Comment out. @@ -88,8 +93,8 @@ 2014-05-26 Dmitry Gutov - * emacs-lisp/package.el (package--download-one-archive): Use - `write-region' instead of `save-buffer' to avoid running various + * emacs-lisp/package.el (package--download-one-archive): + Use `write-region' instead of `save-buffer' to avoid running various hooks. (Bug#17155) (describe-package-1): Same. Insert newline at the end of the buffer if appropriate. diff --git a/lisp/mouse.el b/lisp/mouse.el index 15f89291af9..d1ab6c24565 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -550,13 +550,20 @@ command alters the kill ring or not." (end (posn-point (event-end click))) (click-count (event-click-count click))) (let ((drag-start (terminal-parameter nil 'mouse-drag-start))) - ;; Drag events don't come with a click count, sadly, so we hack - ;; our way around this problem by remembering the start-event in - ;; `mouse-drag-start' and fetching the click-count from there. (when drag-start + ;; Drag events don't come with a click count, sadly, so we hack + ;; our way around this problem by remembering the start-event in + ;; `mouse-drag-start' and fetching the click-count from there. (when (and (<= click-count 1) (equal beg (posn-point (event-start drag-start)))) (setq click-count (event-click-count drag-start))) + ;; Occasionally we get spurious drag events where the user hasn't + ;; dragged his mouse, but instead Emacs has dragged the text under the + ;; user's mouse. Try to recover those cases (bug#17562). + (when (and (equal (posn-x-y (event-start click)) + (posn-x-y (event-end click))) + (not (eq (car drag-start) 'mouse-movement))) + (setq end beg)) (setf (terminal-parameter nil 'mouse-drag-start) nil))) (when (and (integerp beg) (integerp end)) (let ((range (mouse-start-end beg end (1- click-count)))) @@ -820,22 +827,25 @@ The region will be defined with mark and point." (lambda (event) (interactive "e") (let* ((end (event-end event)) (end-point (posn-point end))) - (unless (eq end-point start-point) + (unless (eq end-point start-point) ;; As soon as the user moves, we can re-enable auto-hscroll. - (setq auto-hscroll-mode auto-hscroll-mode-saved)) - (if (and (eq (posn-window end) start-window) - (integer-or-marker-p 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)) - ((< mouse-row top) - (mouse-scroll-subr start-window (- mouse-row top) - nil start-point)) - ((>= mouse-row bottom) - (mouse-scroll-subr start-window (1+ (- mouse-row bottom)) - nil start-point)))))))) + (setq auto-hscroll-mode auto-hscroll-mode-saved) + ;; And remember that we have moved, so mouse-set-region can know + ;; its event is really a drag event. + (setcar start-event 'mouse-movement)) + (if (and (eq (posn-window end) start-window) + (integer-or-marker-p 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)) + ((< mouse-row top) + (mouse-scroll-subr start-window (- mouse-row top) + nil start-point)) + ((>= mouse-row bottom) + (mouse-scroll-subr start-window (1+ (- mouse-row bottom)) + nil start-point)))))))) map) t (lambda () (setq track-mouse nil)