emacs-diffs
[Top][All Lists]
Advanced

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

master 9561d45de1: Fix clicking on files in Dired when drag is enabled


From: Po Lu
Subject: master 9561d45de1: Fix clicking on files in Dired when drag is enabled
Date: Tue, 12 Apr 2022 07:22:23 -0400 (EDT)

branch: master
commit 9561d45de16b1dece79410c126ff741c09d91e22
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Fix clicking on files in Dired when drag is enabled
    
    * lisp/dired.el (dired-mouse-drag): Don't drag if the mouse
    didn't move far enough.
---
 lisp/dired.el | 75 +++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 44 insertions(+), 31 deletions(-)

diff --git a/lisp/dired.el b/lisp/dired.el
index d6e189cba3..5accad8efd 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -1726,37 +1726,50 @@ when Emacs exits or the user drags another file.")
     (with-selected-window (posn-window (event-end event))
       (goto-char (posn-point (event-end event))))
     (track-mouse
-      (let ((new-event (read-event)))
-        (if (not (eq (event-basic-type new-event) 'mouse-movement))
-            (when (eq (event-basic-type new-event) 'mouse-1)
-              (push new-event unread-command-events))
-          ;; We can get an error if there's by some chance no file
-          ;; name at point.
-          (condition-case nil
-              (let ((filename (with-selected-window (posn-window
-                                                     (event-end event))
-                                (dired-file-name-at-point))))
-                (when filename
-                  ;; In theory x-dnd-username combined with a proper
-                  ;; file URI containing the hostname of the remote
-                  ;; server could be used here instead of creating a
-                  ;; local copy of the remote file, but no program
-                  ;; actually implements file DND according to the
-                  ;; spec.
-                  (when (file-remote-p filename)
-                    (setq filename (file-local-copy filename))
-                    (setq dired-last-dragged-remote-file filename)
-                    (add-hook 'kill-emacs-hook
-                              #'dired-remove-last-dragged-local-file))
-                  (gui-backend-set-selection 'XdndSelection filename)
-                  (x-begin-drag '("text/uri-list" "text/x-dnd-username"
-                                  "FILE_NAME" "FILE" "HOST_NAME")
-                                (if (eq 'dired-mouse-drag-files 'link)
-                                    'XdndActionLink
-                                  'XdndActionCopy)
-                                nil nil t)))
-            (error (when (eq (event-basic-type new-event) 'mouse-1)
-                     (push new-event unread-command-events)))))))))
+      (let ((beginning-position (mouse-pixel-position))
+            new-event)
+        (catch 'track-again
+          (setq new-event (read-event))
+          (if (not (eq (event-basic-type new-event) 'mouse-movement))
+              (when (eq (event-basic-type new-event) 'mouse-1)
+                (push new-event unread-command-events))
+            (let ((current-position (mouse-pixel-position)))
+              ;; If the mouse didn't move far enough, don't
+              ;; inadvertently trigger a drag.
+              (when (and (eq (car current-position) (car beginning-position))
+                         (ignore-errors
+                           (and (> 3 (abs (- (cadr beginning-position)
+                                             (cadr current-position))))
+                                (> 3 (abs (- (caddr beginning-position)
+                                             (caddr current-position)))))))
+                (throw 'track-again nil)))
+            ;; We can get an error if there's by some chance no file
+            ;; name at point.
+            (condition-case nil
+                (let ((filename (with-selected-window (posn-window
+                                                       (event-end event))
+                                  (dired-file-name-at-point))))
+                  (when filename
+                    ;; In theory x-dnd-username combined with a proper
+                    ;; file URI containing the hostname of the remote
+                    ;; server could be used here instead of creating a
+                    ;; local copy of the remote file, but no program
+                    ;; actually implements file DND according to the
+                    ;; spec.
+                    (when (file-remote-p filename)
+                      (setq filename (file-local-copy filename))
+                      (setq dired-last-dragged-remote-file filename)
+                      (add-hook 'kill-emacs-hook
+                                #'dired-remove-last-dragged-local-file))
+                    (gui-backend-set-selection 'XdndSelection filename)
+                    (x-begin-drag '("text/uri-list" "text/x-dnd-username"
+                                    "FILE_NAME" "FILE" "HOST_NAME")
+                                  (if (eq 'dired-mouse-drag-files 'link)
+                                      'XdndActionLink
+                                    'XdndActionCopy)
+                                  nil nil t)))
+              (error (when (eq (event-basic-type new-event) 'mouse-1)
+                       (push new-event unread-command-events))))))))))
 
 (defvar dired-mouse-drag-files-map (let ((keymap (make-sparse-keymap)))
                                      (define-key keymap [down-mouse-1] 
#'dired-mouse-drag)



reply via email to

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