annotate lisp/dnd.el @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 280c8ae2476d
children bec49af30c2f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
109259
e76d2bc9dbbe * dnd.el, font-setting.el, x-dnd.el: Use utf-8 coding (for author name).
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
1 ;;; dnd.el --- drag and drop support. -*- coding: utf-8 -*-
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2
109259
e76d2bc9dbbe * dnd.el, font-setting.el, x-dnd.el: Use utf-8 coding (for author name).
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
3 ;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
e76d2bc9dbbe * dnd.el, font-setting.el, x-dnd.el: Use utf-8 coding (for author name).
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
4 ;; Free Software Foundation, Inc.
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
5
109259
e76d2bc9dbbe * dnd.el, font-setting.el, x-dnd.el: Use utf-8 coding (for author name).
Glenn Morris <rgm@gnu.org>
parents: 106815
diff changeset
6 ;; Author: Jan Djärv <jan.h.d@swipnet.se>
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
7 ;; Maintainer: FSF
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
8 ;; Keywords: window, drag, drop
110015
280c8ae2476d Add "Package:" file headers to denote built-in packages.
Chong Yidong <cyd@stupidchicken.com>
parents: 109259
diff changeset
9 ;; Package: emacs
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
10
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
11 ;; This file is part of GNU Emacs.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
12
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
13 ;; GNU Emacs is free software: you can redistribute it and/or modify
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
15 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
16 ;; (at your option) any later version.
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
17
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
18 ;; GNU Emacs is distributed in the hope that it will be useful,
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
21 ;; GNU General Public License for more details.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
22
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
24 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
25
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
26 ;;; Commentary:
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
27
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
28 ;; This file provides the generic handling of the drop part only.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
29 ;; Different DND backends (X11, W32, etc.) that handle the platform
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
30 ;; specific DND parts call the functions here to do final delivery of
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
31 ;; a drop.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
32
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
33 ;;; Code:
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
34
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
35 ;;; Customizable variables
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
36
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
37
62311
a8f10a069bde (dnd-protocol-alist): Add autoload.
Richard M. Stallman <rms@gnu.org>
parents: 62240
diff changeset
38 ;;;###autoload
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
39 (defcustom dnd-protocol-alist
105870
26baacb565b0 * textmodes/tex-mode.el (tex-alt-dvi-print-command)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100908
diff changeset
40 `((,(purecopy "^file:///") . dnd-open-local-file) ; XDND format.
26baacb565b0 * textmodes/tex-mode.el (tex-alt-dvi-print-command)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100908
diff changeset
41 (,(purecopy "^file://") . dnd-open-file) ; URL with host
26baacb565b0 * textmodes/tex-mode.el (tex-alt-dvi-print-command)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100908
diff changeset
42 (,(purecopy "^file:") . dnd-open-local-file) ; Old KDE, Motif, Sun
26baacb565b0 * textmodes/tex-mode.el (tex-alt-dvi-print-command)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100908
diff changeset
43 (,(purecopy "^\\(https?\\|ftp\\|file\\|nfs\\)://") . dnd-open-file)
72687
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
44 )
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
45
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
46 "The functions to call for different protocols when a drop is made.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
47 This variable is used by `dnd-handle-one-url' and `dnd-handle-file-name'.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
48 The list contains of (REGEXP . FUNCTION) pairs.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
49 The functions shall take two arguments, URL, which is the URL dropped and
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
50 ACTION which is the action to be performed for the drop (move, copy, link,
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
51 private or ask).
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
52 If no match is found here, and the value of `browse-url-browser-function'
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
53 is a pair of (REGEXP . FUNCTION), those regexps are tried for a match.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
54 If no match is found, the URL is inserted as text by calling `dnd-insert-text'.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
55 The function shall return the action done (move, copy, link or private)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
56 if some action was made, or nil if the URL is ignored."
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
57 :version "22.1"
62240
19d278c4224b * dnd.el (dnd-protocol-alist): Improve custom type.
Reiner Steib <Reiner.Steib@gmx.de>
parents: 61482
diff changeset
58 :type '(repeat (cons (regexp) (function)))
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
59 :group 'dnd)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
60
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
61
72687
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
62 (defcustom dnd-open-remote-file-function
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
63 (if (eq system-type 'windows-nt)
72912
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
64 'dnd-open-local-file
72687
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
65 'dnd-open-remote-url)
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
66 "The function to call when opening a file on a remote machine.
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
67 The function will be called with two arguments; URI and ACTION. See
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
68 `dnd-open-file' for details.
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
69 If nil, then dragging remote files into Emacs will result in an error.
72912
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
70 Predefined functions are `dnd-open-local-file' and `dnd-open-remote-url'.
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
71 `dnd-open-local-file' attempts to open a remote file using its UNC name and
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
72 is the default on MS-Windows. `dnd-open-remote-url' uses `url-handler-mode'
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
73 and is the default except for MS-Windows."
72687
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
74 :version "22.1"
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
75 :type 'function
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
76 :group 'dnd)
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
77
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
78
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
79 (defcustom dnd-open-file-other-window nil
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
80 "If non-nil, always use find-file-other-window to open dropped files."
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
81 :version "22.1"
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
82 :type 'boolean
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
83 :group 'dnd)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
84
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
85
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
86 ;; Functions
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
87
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
88 (defun dnd-handle-one-url (window action url)
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
89 "Handle one dropped url by calling the appropriate handler.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
90 The handler is first located by looking at `dnd-protocol-alist'.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
91 If no match is found here, and the value of `browse-url-browser-function'
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
92 is a pair of (REGEXP . FUNCTION), those regexps are tried for a match.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
93 If no match is found, just call `dnd-insert-text'.
73330
400487787181 * dnd.el (dnd-handle-one-url): Fix typo in doc-string.
Jan Djärv <jan.h.d@swipnet.se>
parents: 72912
diff changeset
94 WINDOW is where the drop happened, ACTION is the action for the drop,
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
95 URL is what has been dropped.
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
96 Returns ACTION."
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
97 (require 'browse-url)
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
98 (let (ret)
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
99 (or
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
100 (catch 'done
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
101 (dolist (bf dnd-protocol-alist)
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
102 (when (string-match (car bf) url)
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
103 (setq ret (funcall (cdr bf) url action))
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
104 (throw 'done t)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
105 nil)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
106 (when (not (functionp browse-url-browser-function))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
107 (catch 'done
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
108 (dolist (bf browse-url-browser-function)
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
109 (when (string-match (car bf) url)
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
110 (setq ret 'private)
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
111 (funcall (cdr bf) url action)
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
112 (throw 'done t)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
113 nil))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
114 (progn
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
115 (dnd-insert-text window action url)
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
116 (setq ret 'private)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
117 ret))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
118
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
119
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
120 (defun dnd-get-local-file-uri (uri)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
121 "Return an uri converted to file:/// syntax if uri is a local file.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
122 Return nil if URI is not a local file."
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
123
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
124 ;; The hostname may be our hostname, in that case, convert to a local
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
125 ;; file. Otherwise return nil. TODO: How about an IP-address as hostname?
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
126 (let ((hostname (when (string-match "^file://\\([^/]*\\)" uri)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
127 (downcase (match-string 1 uri))))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
128 (system-name-no-dot
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
129 (downcase (if (string-match "^[^\\.]+" system-name)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
130 (match-string 0 system-name)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
131 system-name))))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
132 (when (and hostname
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
133 (or (string-equal "localhost" hostname)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
134 (string-equal (downcase system-name) hostname)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
135 (string-equal system-name-no-dot hostname)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
136 (concat "file://" (substring uri (+ 7 (length hostname)))))))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
137
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
138 (defun dnd-get-local-file-name (uri &optional must-exist)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
139 "Return file name converted from file:/// or file: syntax.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
140 URI is the uri for the file. If MUST-EXIST is given and non-nil,
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
141 only return non-nil if the file exists.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
142 Return nil if URI is not a local file."
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
143 (let ((f (cond ((string-match "^file:///" uri) ; XDND format.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
144 (substring uri (1- (match-end 0))))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
145 ((string-match "^file:" uri) ; Old KDE, Motif, Sun
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
146 (substring uri (match-end 0))))))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
147 (when (and f must-exist)
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
148 (setq f (replace-regexp-in-string
77132
4d39a7fbbc3c (dnd-get-local-file-name): Decode both upper and lower
Jason Rumney <jasonr@gnu.org>
parents: 75347
diff changeset
149 "%[A-Fa-f0-9][A-Fa-f0-9]"
70760
eca94c558ceb (dnd-handle-one-url): Change 3rd arg ARG to URL. Don't unescape URL.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 68651
diff changeset
150 (lambda (arg)
90603
d383ea975152 (dnd-get-local-file-name): Give a unibyte string to
Kenichi Handa <handa@m17n.org>
parents: 72912
diff changeset
151 (let ((str (make-string 1 0)))
d383ea975152 (dnd-get-local-file-name): Give a unibyte string to
Kenichi Handa <handa@m17n.org>
parents: 72912
diff changeset
152 (aset str 0 (string-to-number (substring arg 1) 16))
d383ea975152 (dnd-get-local-file-name): Give a unibyte string to
Kenichi Handa <handa@m17n.org>
parents: 72912
diff changeset
153 str))
78061
08057013c059 (dnd-get-local-file-name): Set fixcase to t in call to
Jan Djärv <jan.h.d@swipnet.se>
parents: 77132
diff changeset
154 f t t))
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
155 (let* ((decoded-f (decode-coding-string
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
156 f
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
157 (or file-name-coding-system
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
158 default-file-name-coding-system)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
159 (try-f (if (file-readable-p decoded-f) decoded-f f)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
160 (when (file-readable-p try-f) try-f)))))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
161
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
162
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
163 (defun dnd-open-local-file (uri action)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
164 "Open a local file.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
165 The file is opened in the current window, or a new window if
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
166 `dnd-open-file-other-window' is set. URI is the url for the file,
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
167 and must have the format file:file-name or file:///file-name.
72912
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
168 The last / in file:/// is part of the file name. If the system
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
169 natively supports unc file names, then remote urls of the form
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
170 file://server-name/file-name will also be handled by this function.
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
171 An alternative for systems that do not support unc file names is
1c4d17d3a136 (dnd-open-remote-file-function): Use dnd-open-local-file on ms-windows.
Jason Rumney <jasonr@gnu.org>
parents: 72689
diff changeset
172 `dnd-open-remote-url'. ACTION is ignored."
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
173
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
174 (let* ((f (dnd-get-local-file-name uri t)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
175 (if (and f (file-readable-p f))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
176 (progn
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
177 (if dnd-open-file-other-window
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
178 (find-file-other-window f)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
179 (find-file f))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
180 'private)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
181 (error "Can not read %s" uri))))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
182
72687
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
183 (defun dnd-open-remote-url (uri action)
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
184 "Open a remote file with `find-file' and `url-handler-mode'.
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
185 Turns `url-handler-mode' on if not on before. The file is opened in the
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
186 current window, or a new window if `dnd-open-file-other-window' is set.
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
187 URI is the url for the file. ACTION is ignored."
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
188 (progn
72689
3ff56e45c67f * dnd.el: Fix bootstrapping
Jan Djärv <jan.h.d@swipnet.se>
parents: 72687
diff changeset
189 (require 'url-handlers)
72687
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
190 (or url-handler-mode (url-handler-mode))
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
191 (if dnd-open-file-other-window
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
192 (find-file-other-window uri)
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
193 (find-file uri))
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
194 'private))
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
195
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
196
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
197 (defun dnd-open-file (uri action)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
198 "Open a local or remote file.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
199 The file is opened in the current window, or a new window if
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
200 `dnd-open-file-other-window' is set. URI is the url for the file,
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
201 and must have the format file://hostname/file-name. ACTION is ignored.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
202 The last / in file://hostname/ is part of the file name."
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
203
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
204 ;; The hostname may be our hostname, in that case, convert to a local
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
205 ;; file. Otherwise return nil.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
206 (let ((local-file (dnd-get-local-file-uri uri)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
207 (if local-file (dnd-open-local-file local-file action)
72687
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
208 (if dnd-open-remote-file-function
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
209 (funcall dnd-open-remote-file-function uri action)
eedaad0e9f80 * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle.
Jan Djärv <jan.h.d@swipnet.se>
parents: 70760
diff changeset
210 (error "Remote files not supported")))))
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
211
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
212
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
213 (defun dnd-insert-text (window action text)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
214 "Insert text at point or push to the kill ring if buffer is read only.
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
215 TEXT is the text as a string, WINDOW is the window where the drop happened."
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
216 (if (or buffer-read-only
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
217 (not (windowp window)))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
218 (progn
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
219 (kill-new text)
65582
4d1085b02d64 Message format spec fixes (1)
Deepak Goel <deego@gnufans.org>
parents: 64762
diff changeset
220 (message "%s"
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
221 (substitute-command-keys
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
222 "The dropped text can be accessed with \\[yank]")))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
223 (insert text))
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
224 action)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
225
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
226
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
227 (provide 'dnd)
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
228
61482
0d768c0d43e2 Add arch taglines
Miles Bader <miles@gnu.org>
parents: 61479
diff changeset
229 ;; arch-tag: 0472f6a5-2e8f-4304-9e44-1a0877c771b7
61479
4ce8a38362c4 First version
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
230 ;;; dnd.el ends here