* 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
This commit is contained in:
Stefan Monnier 2014-05-27 01:01:49 -04:00
parent ca0279be70
commit a366fbe2b7
2 changed files with 37 additions and 22 deletions

View file

@ -1,3 +1,8 @@
2014-05-27 Stefan Monnier <monnier@iro.umontreal.ca>
* 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 <schwab@linux-m68k.org>
* 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 <dgutov@yandex.ru>
* 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.

View file

@ -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)