emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r117162: * lisp/mouse.el (mouse-set-region): Handle


From: Stefan Monnier
Subject: [Emacs-diffs] trunk r117162: * lisp/mouse.el (mouse-set-region): Handle spurious drag events.
Date: Tue, 27 May 2014 05:01:55 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 117162
revision-id: address@hidden
parent: address@hidden
fixes bug: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=17562
committer: Stefan Monnier <address@hidden>
branch nick: trunk
timestamp: Tue 2014-05-27 01:01:49 -0400
message:
  * lisp/mouse.el (mouse-set-region): Handle spurious drag events.
  (mouse-drag-track): Annotate `mouse-drag-start' so we know we moved.
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/mouse.el                  mouse.el-20091113204419-o5vbwnq5f7feedwu-123
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2014-05-26 02:28:09 +0000
+++ b/lisp/ChangeLog    2014-05-27 05:01:49 +0000
@@ -1,3 +1,8 @@
+2014-05-27  Stefan Monnier  <address@hidden>
+
+       * 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  <address@hidden>
 
        * 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  <address@hidden>
 
-       * 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.

=== modified file 'lisp/mouse.el'
--- a/lisp/mouse.el     2014-05-26 02:28:09 +0000
+++ b/lisp/mouse.el     2014-05-27 05:01:49 +0000
@@ -550,13 +550,20 @@
        (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 @@
          (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)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]