(progn
(let ((action (cdr (assoc (symbol-name (cadr client-message))
x-dnd-xdnd-to-action)))
- (targets (cddr client-message))
+ (targets (cdddr client-message))
(local-value (nth 2 client-message)))
(when (windowp window)
(select-window window))
- (x-dnd-save-state window nil nil
- (apply #'vector targets))
- (x-dnd-maybe-call-test-function window action)
+ ;; Remove XdndDirectSave0 from this list--Emacs does not
+ ;; support this protocol for internal drops.
+ (setq targets (delete 'XdndDirectSave0 targets))
+ (x-dnd-save-state window nil nil (apply #'vector targets))
+ (x-dnd-maybe-call-test-function window action nil)
(unwind-protect
(x-dnd-drop-data event (if (framep window) window
(window-frame window))
(x-dnd-use-offix-drop nil)
(x-dnd-use-unsupported-drop nil)
(prop-deleted nil)
+ (action nil)
encoded-name)
(unwind-protect
- (progn
- (when (file-remote-p file)
- (setq file-name (file-local-copy file))
- (setq dnd-last-dragged-remote-file file-name)
- (add-hook 'kill-emacs-hook
- #'dnd-remove-last-dragged-remote-file))
- (setq encoded-name
- (encode-coding-string name
- (or file-name-coding-system
- default-file-name-coding-system)))
- (setq x-dnd-xds-current-file file-name)
- (x-change-window-property "XdndDirectSave0" encoded-name
- frame "text/plain" 8 nil)
- (gui-set-selection 'XdndSelection (concat "file://" file-name))
- ;; FIXME: this does not work with GTK file managers, since
- ;; they always reach for `text/uri-list' first, contrary to
- ;; the spec.
- (let ((action (x-begin-drag '("XdndDirectSave0" "text/uri-list"
- "application/octet-stream")
- 'XdndActionDirectSave
- frame nil allow-same-frame)))
- (if (not x-dnd-xds-performed)
- action
- (let ((property (x-window-property "XdndDirectSave0" frame
- "AnyPropertyType" nil t)))
- (setq prop-deleted t)
- ;; "System-G" deletes the property upon success.
- (and (or (null property)
- (and (stringp property)
- (not (equal property ""))))
- action)))))
+ (setq action
+ (progn
+ (when (file-remote-p file)
+ (setq file-name (file-local-copy file))
+ (setq dnd-last-dragged-remote-file file-name)
+ (add-hook 'kill-emacs-hook
+ #'dnd-remove-last-dragged-remote-file))
+ (setq encoded-name
+ (encode-coding-string name
+ (or file-name-coding-system
+ default-file-name-coding-system)))
+ (setq x-dnd-xds-current-file file-name)
+ (x-change-window-property "XdndDirectSave0" encoded-name
+ frame "text/plain" 8 nil)
+ (gui-set-selection 'XdndSelection (concat "file://" file-name))
+ ;; FIXME: this does not work with GTK file managers,
+ ;; since they always reach for `text/uri-list' first,
+ ;; contrary to the spec.
+ (let ((action (x-begin-drag '("XdndDirectSave0" "text/uri-list"
+ "application/octet-stream")
+ 'XdndActionDirectSave
+ frame nil allow-same-frame)))
+ (if (not x-dnd-xds-performed)
+ action
+ (let ((property (x-window-property "XdndDirectSave0" frame
+ "AnyPropertyType" nil t)))
+ (setq prop-deleted t)
+ ;; "System-G" deletes the property upon success.
+ (and (or (null property)
+ (and (stringp property)
+ (not (equal property ""))))
+ action))))))
(unless prop-deleted
(x-delete-window-property "XdndDirectSave0" frame))
;; Delete any remote copy that was made.
- (when (not (equal file-name original-file-name))
+ (when (and (not (equal file-name original-file-name))
+ x-dnd-xds-performed)
(delete-file file-name)))))
(defun x-dnd-save-direct (need-name filename)
(if (or (not success)
(< version 5))
0
- "XdndDirectSave0")))))))
+ "XdndActionDirectSave")))))))
;; Internal wheel movement.