[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 2b1cf5aff4: Fix drag-and-drop from Chromium family browsers
From: |
Po Lu |
Subject: |
master 2b1cf5aff4: Fix drag-and-drop from Chromium family browsers |
Date: |
Sat, 2 Jul 2022 02:06:50 -0400 (EDT) |
branch: master
commit 2b1cf5aff41f946b64abeb2ec4eea9d243880501
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Fix drag-and-drop from Chromium family browsers
* lisp/x-dnd.el (x-dnd-copy-types): New defcustom.
(x-dnd-default-test-function): Check if data type warrants using
`copy'.
(x-dnd-do-direct-save): Offer application/octet-stream as well.
---
lisp/x-dnd.el | 34 +++++++++++++++++++++++++++-------
1 file changed, 27 insertions(+), 7 deletions(-)
diff --git a/lisp/x-dnd.el b/lisp/x-dnd.el
index 8a7f3e2436..8bea333012 100644
--- a/lisp/x-dnd.el
+++ b/lisp/x-dnd.el
@@ -139,6 +139,16 @@ that was dropped."
:type 'function
:group 'x)
+(defcustom x-dnd-copy-types '("chromium/x-renderer-taint")
+ "List of data types offered by programs that don't support `private'.
+Some programs (such as Chromium) do not support
+`XdndActionPrivate'. The default `x-dnd-test-function' will
+always return `copy' instead, for programs offering one of the
+data types in this list."
+ :version "29.1"
+ :type '(repeat string)
+ :group 'x)
+
;; Internal variables
(defvar x-dnd-current-state nil
@@ -200,13 +210,22 @@ any protocol specific data.")
(defun x-dnd-default-test-function (_window _action types)
"The default test function for drag and drop.
-WINDOW is where the mouse is when this function is called. It may be
-a frame if the mouse is over the menu bar, scroll bar or tool bar.
-ACTION is the suggested action from the source, and TYPES are the
-types the drop data can have. This function only accepts drops with
-types in `x-dnd-known-types'. It always returns the action private."
+WINDOW is where the mouse is when this function is called. It
+may be a frame if the mouse is over the menu bar, scroll bar or
+tool bar. ACTION is the suggested action from the source, and
+TYPES are the types the drop data can have. This function only
+accepts drops with types in `x-dnd-known-types'. It always
+returns the action `private', unless `types' contains a value
+inside `x-dnd-copy-types'."
(let ((type (x-dnd-choose-type types)))
- (when type (cons 'private type))))
+ (when type (let ((list x-dnd-copy-types))
+ (catch 'out
+ (while t
+ (if (not list)
+ (throw 'out (cons 'private type))
+ (if (x-dnd-find-type (car list) types)
+ (throw 'out (cons 'copy type))
+ (setq list (cdr list))))))))))
(defun x-dnd-current-type (frame-or-window)
"Return the type we want the DND data to be in for the current drop.
@@ -1292,7 +1311,8 @@ was taken, or the direct save failed."
;; 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")
+ (let ((action (x-begin-drag '("XdndDirectSave0" "text/uri-list"
+ "application/octet-stream")
'XdndActionDirectSave
frame nil allow-same-frame)))
(if (not x-dnd-xds-performed)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 2b1cf5aff4: Fix drag-and-drop from Chromium family browsers,
Po Lu <=