summaryrefslogtreecommitdiff
path: root/lisp/dnd.el
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2006-09-07 07:44:33 +0000
committerJan Djärv <jan.h.d@swipnet.se>2006-09-07 07:44:33 +0000
commitc79b0f8ffd729710b342911bd663c6705c394d8b (patch)
treea4a10c71559e2ee07a32a4157c0f829487887110 /lisp/dnd.el
parent31a7c2ff1f7c3addb7c945f688bcb37d893d761a (diff)
downloademacs-c79b0f8ffd729710b342911bd663c6705c394d8b.tar.gz
* dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
(dnd-open-remote-url): New function. (dnd-open-remote-file-function): Set to dnd-open-remote-url if not windows-nt. 2006-09-07 Jason Rumney <jasonr@gnu.org> * dnd.el (dnd-open-remote-file-function): New variable. (dnd-open-unc-file): New function. (dnd-open-file): Call dnd-open-remote-file-function if set.
Diffstat (limited to 'lisp/dnd.el')
-rw-r--r--lisp/dnd.el61
1 files changed, 55 insertions, 6 deletions
diff --git a/lisp/dnd.el b/lisp/dnd.el
index 85881b3261f..18a98957032 100644
--- a/lisp/dnd.el
+++ b/lisp/dnd.el
@@ -34,14 +34,16 @@
;;; Customizable variables
+(eval-when-compile
+ (require 'url-handlers))
;;;###autoload
(defcustom dnd-protocol-alist
- '(
- ("^file:///" . dnd-open-local-file) ; XDND format.
- ("^file://" . dnd-open-file) ; URL with host
- ("^file:" . dnd-open-local-file) ; Old KDE, Motif, Sun
- )
+ '(("^file:///" . dnd-open-local-file) ; XDND format.
+ ("^file://" . dnd-open-file) ; URL with host
+ ("^file:" . dnd-open-local-file) ; Old KDE, Motif, Sun
+ ("^\\(https?\\|ftp\\|file\\|nfs\\)://" . dnd-open-file)
+ )
"The functions to call for different protocols when a drop is made.
This variable is used by `dnd-handle-one-url' and `dnd-handle-file-name'.
@@ -59,6 +61,22 @@ if some action was made, or nil if the URL is ignored."
:group 'dnd)
+(defcustom dnd-open-remote-file-function
+ (if (eq system-type 'windows-nt)
+ 'dnd-open-unc-file
+ 'dnd-open-remote-url)
+ "The function to call when opening a file on a remote machine.
+The function will be called with two arguments; URI and ACTION. See
+`dnd-open-file' for details.
+If nil, then dragging remote files into Emacs will result in an error.
+Predefined functions are `dnd-open-unc-file' and `dnd-open-remote-url'.
+`dnd-open-unc-file' attempts to open the file using its UNC name and is the
+default on MS-Windows. `dnd-open-remote-url' uses `url-handler-mode' and
+is the default except for MS-Windows."
+ :version "22.1"
+ :type 'function
+ :group 'dnd)
+
(defcustom dnd-open-file-other-window nil
"If non-nil, always use find-file-other-window to open dropped files."
@@ -158,6 +176,35 @@ The last / in file:/// is part of the file name. ACTION is ignored."
'private)
(error "Can not read %s" uri))))
+(defun dnd-open-unc-file (uri action)
+ "Open a remote file using its unc path.
+The file is opened in the current window, or a new window if
+`dnd-open-file-other-window' is set. URI is the url for the file,
+and must have the format file://hostname/file-name. ACTION is ignored.
+//hostname/file-name is the unc path."
+ (let ((unc-file (if (string-match "^file:" uri)
+ (substring uri 5))))
+ (if (and unc-file (file-readable-p unc-file))
+ (progn
+ (if dnd-open-file-other-window
+ (find-file-other-window unc-file)
+ (find-file unc-file))
+ 'private)
+ (error "Invalid file url"))))
+
+(defun dnd-open-remote-url (uri action)
+ "Open a remote file with `find-file' and `url-handler-mode'.
+Turns `url-handler-mode' on if not on before. The file is opened in the
+current window, or a new window if `dnd-open-file-other-window' is set.
+URI is the url for the file. ACTION is ignored."
+ (progn
+ (or url-handler-mode (url-handler-mode))
+ (if dnd-open-file-other-window
+ (find-file-other-window uri)
+ (find-file uri))
+ 'private))
+
+
(defun dnd-open-file (uri action)
"Open a local or remote file.
The file is opened in the current window, or a new window if
@@ -169,7 +216,9 @@ The last / in file://hostname/ is part of the file name."
;; file. Otherwise return nil.
(let ((local-file (dnd-get-local-file-uri uri)))
(if local-file (dnd-open-local-file local-file action)
- (error "Remote files not supported"))))
+ (if dnd-open-remote-file-function
+ (funcall dnd-open-remote-file-function uri action)
+ (error "Remote files not supported")))))
(defun dnd-insert-text (window action text)