1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-08 15:35:02 +00:00

Fix PGTK DND after a source leaves without dropping anything

* lisp/pgtk-dnd.el (pgtk-dnd-clear-data-on-motion): New flag.
(pgtk-dnd-handle-gdk): Set flag upon drag-leave.  Clear state
upon drag-motion if it is set.
This commit is contained in:
Po Lu 2022-07-23 15:00:12 +08:00
parent 51f5c4b773
commit a4339190ec

View File

@ -336,18 +336,32 @@ Currently XDND, Motif and old KDE 1.x protocols are recognized."
(declare-function pgtk-update-drop-status "pgtkselect.c")
(declare-function pgtk-drop-finish "pgtkselect.c")
(defvar pgtk-dnd-clear-data-on-motion nil
"Whether or not to obtain the new list of targets upon the next drag motion.
For more details, see the function `pgtk-dnd-handle-gdk'.")
(defun pgtk-dnd-handle-gdk (event frame window client-message)
"Handle drag-n-drop EVENT on FRAME.
WINDOW should be the window the event happened on top of.
CLIENT-MESSAGE is the detailed description of the drag-and-drop
message."
(cond
;; We can't handle `drag-leave' here, since that signal is also
;; sent right before `drag-drop', and there is no reliable way to
;; distinguish the two.
;; We can't handle `drag-leave' immediately, since that signal is
;; also sent right before `drag-drop', and there is no reliable way
;; to distinguish a signal sent because the source left from one
;; sent prior to a drop. Instead, set a flag that tells Emacs to
;; clear the drag-and-drop state if anything other than a drop is
;; received.
((not client-message) ; drag-leave
(setq pgtk-dnd-clear-data-on-motion t))
((eq (car client-message) 'lambda) ; drag-motion
(let ((state (pgtk-dnd-get-state-for-frame frame)))
(unless (aref state 0) ;; This is actually an entry.
(unless (and (aref state 0) ;; This is actually an entry.
(not pgtk-dnd-clear-data-on-motion))
(setq pgtk-dnd-clear-data-on-motion nil)
;; Forget the drop first, or else the list of targets will not
;; be cleared if it is nil.
(pgtk-dnd-forget-drop window)
(pgtk-dnd-save-state window nil nil
(pgtk-get-selection-internal
(nth 1 client-message) 'TARGETS)