Mercurial > emacs
annotate lisp/x-dnd.el @ 53860:a119a19bb7b3
(rmail-get-new-mail): Remove useless use of
format.
author | Andreas Schwab <schwab@suse.de> |
---|---|
date | Sun, 08 Feb 2004 22:36:05 +0000 |
parents | cc4faf95fea2 |
children | e83b3b3941cf |
rev | line source |
---|---|
53789
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
1 ;;; x-dnd.el --- drag and drop support for X. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
2 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
3 ;; Copyright (C) 2004 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
4 ;; Free Software Foundation, Inc. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
5 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
6 ;; Author: Jan Dj,Ad(Brv <jan.h.d@swipnet.se> |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
7 ;; Maintainer: FSF |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
8 ;; Keywords: window, drag, drop |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
9 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
10 ;; This file is part of GNU Emacs. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
11 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
12 ;; GNU Emacs is free software; you can redistribute it and/or modify |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
13 ;; it under the terms of the GNU General Public License as published by |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
14 ;; the Free Software Foundation; either version 2, or (at your option) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
15 ;; any later version. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
16 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
17 ;; GNU Emacs is distributed in the hope that it will be useful, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
20 ;; GNU General Public License for more details. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
21 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
22 ;; You should have received a copy of the GNU General Public License |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
25 ;; Boston, MA 02111-1307, USA. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
26 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
27 ;;; Commentary: |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
28 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
29 ;; This file provides the drop part only. Currently supported protocols |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
30 ;; are XDND and the old KDE 1.x protocol. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
31 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
32 ;;; Code: |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
33 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
34 ;;; Customizable variables |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
35 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
36 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
37 (defcustom x-dnd-test-function 'x-dnd-default-test-function |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
38 "The function drag and drop uses to determine if to accept or reject a drop. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
39 The function takes three arguments, WINDOW ACTION and TYPES. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
40 WINDOW is where the mouse is when the function is called. WINDOW may be a |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
41 frame if the mouse isn't over a real window (i.e. menu bar, tool bar or |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
42 scroll bar). ACTION is the suggested action from the drag and drop source, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
43 one of the symbols move, copy link or ask. TYPES is a list of available types |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
44 for the drop. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
45 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
46 The function shall return nil to reject the drop or a cons with two values, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
47 the wanted action as car and the wanted type as cdr. The wanted action |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
48 can be copy, move, link, ask or private. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
49 The default value for this variable is `x-dnd-default-test-function'." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
50 :type 'symbol |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
51 :group 'x) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
52 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
53 (defcustom x-dnd-protocol-alist |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
54 '( |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
55 ("^file:///" . x-dnd-open-local-file) ; XDND format. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
56 ("^file://" . x-dnd-open-file) ; URL with host |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
57 ("^file:" . x-dnd-open-local-file) ; Old KDE, Motif, Sun |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
58 ) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
59 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
60 "The functions to call for different protocols when a drop is made. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
61 This variable is used by `x-dnd-handle-uri-list' and `x-dnd-handle-moz-url'. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
62 The list contains of (REGEXP . FUNCTION) pairs. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
63 The functions shall take two arguments, URL, which is the URL dropped and |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
64 ACTION which is the action to be performed for the drop (move, copy, link, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
65 private or ask). |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
66 If no match is found here, and the value of `browse-url-browser-function' |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
67 is a pair of (REGEXP . FUNCTION), those regexps are tried for a match. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
68 Insertion of text is not handeled by these functions, see `x-dnd-types-alist' |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
69 for that. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
70 The function shall return the action done (move, copy, link or private) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
71 if some action was made, or nil if the URL is ignored." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
72 :type 'alist |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
73 :group 'x) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
74 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
75 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
76 (defcustom x-dnd-types-alist |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
77 '( |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
78 ("text/uri-list" . x-dnd-handle-uri-list) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
79 ("text/x-moz-url" . x-dnd-handle-moz-url) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
80 ("FILE_NAME" . x-dnd-handle-uri-list) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
81 ("_NETSCAPE_URL" . x-dnd-handle-uri-list) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
82 ("UTF8_STRING" . x-dnd-insert-utf8-text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
83 ("text/plain;charset=UTF-8" . x-dnd-insert-utf8-text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
84 ("text/plain;charset=utf-8" . x-dnd-insert-utf8-text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
85 ("text/unicode" . x-dnd-insert-utf16-text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
86 ("text/plain" . x-dnd-insert-text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
87 ("STRING" . x-dnd-insert-text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
88 ("TEXT" . x-dnd-insert-text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
89 ) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
90 "Which function to call to handle a drop of that type. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
91 If the type for the drop is not present, or the function is nil, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
92 the drop is rejected. The function takes three arguments, WINDOW, ACTION |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
93 and DATA. WINDOW is where the drop occured, ACTION is the action for |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
94 this drop (copy, move, link, private or ask) as determined by a previous |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
95 call to `x-dnd-test-function'. DATA is the drop data. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
96 The function shall return the action used (copy, move, link or private) if drop |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
97 is successful, nil if not." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
98 :type 'alist |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
99 :group 'x) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
100 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
101 (defcustom x-dnd-open-file-other-window nil |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
102 "If non-nil, always use find-file-other-window to open dropped files." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
103 :type 'boolean |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
104 :group 'x) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
105 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
106 ;; Internal variables |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
107 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
108 (defvar x-dnd-known-types |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
109 '("text/uri-list" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
110 "text/x-moz-url" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
111 "FILE_NAME" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
112 "_NETSCAPE_URL" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
113 "UTF8_STRING" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
114 "text/plain;charset=UTF-8" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
115 "text/plain;charset=utf-8" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
116 "text/unicode" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
117 "text/plain" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
118 "STRING" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
119 "TEXT" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
120 ) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
121 "The types accepted by default for dropped data. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
122 The types are chosen in the order they appear in the list.") |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
123 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
124 (defvar x-dnd-current-state nil |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
125 "The current state for a drop. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
126 This is an alist with one entry for each display. The value for each display |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
127 is a vector that contains the state for drag and drop for that display. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
128 Elements in the vector are: |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
129 Last buffer drag was in, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
130 last window drag was in, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
131 types available for drop, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
132 the action suggested by the source, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
133 the type we want for the drop, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
134 the action we want for the drop.") |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
135 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
136 (defvar x-dnd-empty-state [nil nil nil nil nil nil]) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
137 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
138 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
139 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
140 (defun x-dnd-init-frame (&optional frame) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
141 "Setup drag and drop for FRAME (i.e. create appropriate properties)." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
142 (x-dnd-init-xdnd-for-frame frame)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
143 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
144 (defun x-dnd-get-state-cons-for-frame (frame-or-window) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
145 "Return the entry in x-dnd-current-state for a frame or window." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
146 (let* ((frame (if (framep frame-or-window) frame-or-window |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
147 (window-frame frame-or-window))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
148 (display (frame-parameter frame 'display))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
149 (if (not (assoc display x-dnd-current-state)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
150 (push (cons display x-dnd-empty-state) x-dnd-current-state)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
151 (assoc display x-dnd-current-state))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
152 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
153 (defun x-dnd-get-state-for-frame (frame-or-window) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
154 "Return the state in x-dnd-current-state for a frame or window." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
155 (cdr (x-dnd-get-state-cons-for-frame frame-or-window))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
156 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
157 (defun x-dnd-default-test-function (window action types) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
158 "The default test function for drag and drop. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
159 WINDOW is where the mouse is when this function is called. It may be a frame |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
160 if the mouse is over the menu bar, scroll bar or tool bar. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
161 ACTION is the suggested action from the source, and TYPES are the |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
162 types the drop data can have. This function only accepts drops with |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
163 types in `x-dnd-known-types'. It always returns the action private." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
164 (let ((type (x-dnd-choose-type types))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
165 (when type (cons 'private type)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
166 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
167 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
168 (defun x-dnd-current-type (frame-or-window) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
169 "Return the type we want the DND data to be in for the current drop. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
170 FRAME-OR-WINDOW is the frame or window that the mouse is over." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
171 (aref (x-dnd-get-state-for-frame frame-or-window) 4)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
172 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
173 (defun x-dnd-forget-drop (frame-or-window) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
174 "Remove all state for the last drop. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
175 FRAME-OR-WINDOW is the frame or window that the mouse is over." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
176 (setcdr (x-dnd-get-state-cons-for-frame frame-or-window) x-dnd-empty-state)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
177 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
178 (defun x-dnd-maybe-call-test-function (window action) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
179 "Call `x-dnd-test-function' if something has changed. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
180 WINDOW is the window the mouse is over. ACTION is the suggested |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
181 action from the source. If nothing has changed, return the last |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
182 action and type we got from `x-dnd-test-function'." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
183 (let ((buffer (when (and (windowp window) (window-live-p window)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
184 (window-buffer window))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
185 (current-state (x-dnd-get-state-for-frame window))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
186 (when (or (not (equal buffer (aref current-state 0))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
187 (not (equal window (aref current-state 1))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
188 (not (equal action (aref current-state 3)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
189 (save-excursion |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
190 (when buffer (set-buffer buffer)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
191 (let* ((action-type (funcall x-dnd-test-function |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
192 window |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
193 action |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
194 (aref current-state 2))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
195 (handler (cdr (assoc (cdr action-type) x-dnd-types-alist)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
196 ;; Ignore action-type if we have no handler. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
197 (setq current-state |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
198 (x-dnd-save-state window |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
199 action |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
200 (when handler action-type))))))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
201 (let ((current-state (x-dnd-get-state-for-frame window))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
202 (cons (aref current-state 5) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
203 (aref current-state 4)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
204 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
205 (defun x-dnd-save-state (window action action-type &optional types) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
206 "Save the state of the current drag and drop. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
207 WINDOW is the window the mouse is over. ACTION is the action suggested |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
208 by the source. ACTION-TYPE is the result of calling `x-dnd-test-function'. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
209 If given, TYPES are the types for the drop data that the source supports." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
210 (let ((current-state (x-dnd-get-state-for-frame window))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
211 (aset current-state 5 (car action-type)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
212 (aset current-state 4 (cdr action-type)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
213 (aset current-state 3 action) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
214 (if types (aset current-state 2 types)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
215 (aset current-state 1 window) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
216 (aset current-state 0 (if (and (windowp window) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
217 (window-live-p window)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
218 (window-buffer window) nil)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
219 (setcdr (x-dnd-get-state-cons-for-frame window) current-state))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
220 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
221 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
222 (defun x-dnd-test-and-save-state (window action types) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
223 "Test if drop shall be accepted, and save the state for future reference. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
224 ACTION is the suggested action by the source. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
225 TYPES is a list of types the source supports." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
226 (x-dnd-save-state window |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
227 action |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
228 (x-dnd-maybe-call-test-function window action) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
229 types)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
230 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
231 (defun x-dnd-handle-one-url (window action arg) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
232 "Handle one dropped url by calling the appropriate handler. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
233 The handler is first localted by looking at `x-dnd-protocol-alist'. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
234 If no match is found here, and the value of `browse-url-browser-function' |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
235 is a pair of (REGEXP . FUNCTION), those regexps are tried for a match. |
53790 | 236 If no match is found, just call `x-dnd-insert-text'. |
53789
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
237 WINDOW is where the drop happend, ACTION is the action for the drop, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
238 ARG is the URL that has been dropped. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
239 Returns ACTION." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
240 (require 'browse-url) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
241 (let* ((uri (replace-regexp-in-string |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
242 "%[A-Z0-9][A-Z0-9]" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
243 (lambda (arg) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
244 (format "%c" (string-to-number (substring arg 1) 16))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
245 arg)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
246 ret) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
247 (or |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
248 (catch 'done |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
249 (dolist (bf x-dnd-protocol-alist) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
250 (when (string-match (car bf) uri) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
251 (setq ret (funcall (cdr bf) uri action)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
252 (throw 'done t))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
253 nil) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
254 (when (not (functionp browse-url-browser-function)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
255 (catch 'done |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
256 (dolist (bf browse-url-browser-function) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
257 (when (string-match (car bf) uri) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
258 (setq ret 'private) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
259 (funcall (cdr bf) uri action) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
260 (throw 'done t))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
261 nil)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
262 (x-dnd-insert-text window action uri)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
263 ret)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
264 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
265 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
266 (defun x-dnd-get-local-file-uri (uri) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
267 "Return an uri converted to file:/// syntax if uri is a local file. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
268 Return nil if URI is not a local file." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
269 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
270 ;; The hostname may be our hostname, in that case, convert to a local |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
271 ;; file. Otherwise return nil. TODO: How about an IP-address as hostname? |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
272 (let ((hostname (when (string-match "^file://\\([^/]*\\)" uri) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
273 (downcase (match-string 1 uri)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
274 (system-name-no-dot |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
275 (downcase (if (string-match "^[^\\.]+" system-name) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
276 (match-string 0 system-name) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
277 system-name)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
278 (when (and hostname |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
279 (or (string-equal "localhost" hostname) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
280 (string-equal (downcase system-name) hostname) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
281 (string-equal system-name-no-dot hostname))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
282 (concat "file://" (substring uri (+ 7 (length hostname))))))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
283 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
284 (defun x-dnd-get-local-file-name (uri &optional must-exist) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
285 "Return file name converted from file:/// or file: syntax. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
286 URI is the uri for the file. If MUST-EXIST is given and non-nil, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
287 only return non-nil if the file exists. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
288 Return nil if URI is not a local file." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
289 (let ((f (cond ((string-match "^file:///" uri) ; XDND format. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
290 (substring uri (1- (match-end 0)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
291 ((string-match "^file:" uri) ; Old KDE, Motif, Sun |
53823
cc4faf95fea2
* x-dnd.el (x-dnd-get-local-file-name): Fix byte compiler warning
Jan Djärv <jan.h.d@swipnet.se>
parents:
53797
diff
changeset
|
292 (substring uri (match-end 0)))))) |
53789
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
293 (when (and f must-exist) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
294 (let* ((decoded-f (decode-coding-string |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
295 f |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
296 (or file-name-coding-system |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
297 default-file-name-coding-system))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
298 (try-f (if (file-readable-p decoded-f) decoded-f f))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
299 (when (file-readable-p try-f) try-f))))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
300 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
301 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
302 (defun x-dnd-open-local-file (uri action) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
303 "Open a local file. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
304 The file is opened in the current window, or a new window if |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
305 `x-dnd-open-file-other-window' is set. URI is the url for the file, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
306 and must have the format file:file-name or file:///file-name. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
307 The last / in file:/// is part of the file name. ACTION is ignored." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
308 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
309 (let* ((f (x-dnd-get-local-file-name uri t))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
310 (when f |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
311 (if (file-readable-p f) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
312 (progn |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
313 (if x-dnd-open-file-other-window |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
314 (find-file-other-window f) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
315 (find-file f)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
316 'private) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
317 (error "Can not read %s (%s)" f uri))))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
318 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
319 (defun x-dnd-open-file (uri action) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
320 "Open a local or remote file. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
321 The file is opened in the current window, or a new window if |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
322 `x-dnd-open-file-other-window' is set. URI is the url for the file, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
323 and must have the format file://hostname/file-name. ACTION is ignored. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
324 The last / in file://hostname/ is part of the file name." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
325 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
326 ;; The hostname may be our hostname, in that case, convert to a local |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
327 ;; file. Otherwise return nil. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
328 (let ((local-file (x-dnd-get-local-file-uri uri))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
329 (when local-file (x-dnd-open-local-file local-file action)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
330 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
331 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
332 (defun x-dnd-handle-moz-url (window action data) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
333 "Handle one item of type text/x-moz-url. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
334 WINDOW is the window where the drop happened. ACTION is ignored. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
335 DATA is the moz-url, which is formatted as two strings separated by \r\n. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
336 The first string is the URL, the second string is the title of that URL. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
337 DATA is encoded in utf-16. Decode the URL and call `x-dnd-handle-uri-list'." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
338 (let* ((string (decode-coding-string data 'utf-16le)) ;; ALWAYS LE??? |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
339 (strings (split-string string "[\r\n]" t)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
340 ;; Can one drop more than one moz-url ?? Assume not. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
341 (url (car strings)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
342 (title (car (cdr strings)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
343 (x-dnd-handle-uri-list window action url))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
344 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
345 (defun x-dnd-insert-utf8-text (window action text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
346 "Decode the UTF-8 text and insert it at point. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
347 TEXT is the text as a string, WINDOW is the window where the drop happened." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
348 (x-dnd-insert-text window action (decode-coding-string text 'utf-8))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
349 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
350 (defun x-dnd-insert-utf16-text (window action text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
351 "Decode the UTF-16 text and insert it at point. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
352 TEXT is the text as a string, WINDOW is the window where the drop happened." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
353 (x-dnd-insert-text window action (decode-coding-string text 'utf-16le))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
354 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
355 (defun x-dnd-insert-text (window action text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
356 "Insert text at point or push to the kill ring if buffer is read only. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
357 TEXT is the text as a string, WINDOW is the window where the drop happened." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
358 (if (or buffer-read-only |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
359 (not (windowp window))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
360 (progn |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
361 (kill-new text) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
362 (message |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
363 (substitute-command-keys |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
364 "The dropped text can be accessed with \\[yank]"))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
365 (insert text)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
366 action) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
367 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
368 (defun x-dnd-handle-uri-list (window action string) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
369 "Split an uri-list into separate URIs and call `x-dnd-handle-one-url'. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
370 WINDOW is the window where the drop happened. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
371 STRING is the uri-list as a string. The URIs are separated by \r\n." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
372 (let ((uri-list (split-string string "[\0\r\n]" t)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
373 retval) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
374 (dolist (bf uri-list) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
375 ;; If one URL is handeled, treat as if the whole drop succeeded. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
376 (let ((did-action (x-dnd-handle-one-url window action bf))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
377 (when did-action (setq retval did-action)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
378 retval)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
379 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
380 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
381 (defun x-dnd-choose-type (types &optional known-types) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
382 "Choose which type we want to receive for the drop. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
383 TYPES are the types the source of the drop offers, a vector of type names |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
384 as strings or symbols. Select among the types in `x-dnd-known-types' or |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
385 KNOWN-TYPES if given, and return that type name. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
386 If no suitable type is found, return nil." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
387 (let* ((known-list (or known-types x-dnd-known-types)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
388 (first-known-type (car known-list)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
389 (types-array types) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
390 (found (when first-known-type |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
391 (catch 'done |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
392 (dotimes (i (length types-array)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
393 (let* ((type (aref types-array i)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
394 (typename (if (symbolp type) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
395 (symbol-name type) type))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
396 (when (equal first-known-type typename) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
397 (throw 'done first-known-type)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
398 nil)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
399 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
400 (if (and (not found) (cdr known-list)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
401 (x-dnd-choose-type types (cdr known-list)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
402 found))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
403 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
404 (defun x-dnd-drop-data (event frame window data type) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
405 "Drop one data item onto a frame. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
406 EVENT is the client message for the drop, FRAME is the frame the drop occurred |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
407 on. WINDOW is the window of FRAME where the drop happened. DATA is the data |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
408 received from the source, and type is the type for DATA, see |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
409 `x-dnd-types-alist'). |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
410 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
411 Returns the action used (move, copy, link, private) if drop was successful, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
412 nil if not." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
413 (let* ((type-info (assoc type x-dnd-types-alist)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
414 (handler (cdr type-info)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
415 (state (x-dnd-get-state-for-frame frame)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
416 (action (aref state 5)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
417 (w (posn-window (event-start event)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
418 (when handler |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
419 (if (and (windowp w) (window-live-p w)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
420 ;; If dropping in a window, open files in that window rather |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
421 ;; than in a new widow. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
422 (let ((x-dnd-open-file-other-window nil)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
423 (goto-char (posn-point (event-start event))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
424 (funcall handler window action data)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
425 (let ((x-dnd-open-file-other-window t)) ;; Dropping on non-window. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
426 (select-frame frame) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
427 (funcall handler window action data)))))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
428 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
429 (defun x-dnd-handle-drag-n-drop-event (event) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
430 "Receive drag and drop events (X client messages). |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
431 Currently XDND and old KDE 1.x protocols are recognized. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
432 TODO: Add Motif and OpenWindows." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
433 (interactive "e") |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
434 (let* ((client-message (car (cdr (cdr event)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
435 (window (posn-window (event-start event))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
436 (message-atom (aref client-message 0)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
437 (frame (aref client-message 1)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
438 (format (aref client-message 2)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
439 (data (aref client-message 3))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
440 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
441 (cond ((equal "DndProtocol" message-atom) ;; Old KDE 1.x. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
442 (x-dnd-handle-old-kde event frame window message-atom format data)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
443 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
444 ((and (> (length message-atom) 4) ;; XDND protocol. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
445 (equal "Xdnd" (substring message-atom 0 4))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
446 (x-dnd-handle-xdnd event frame window message-atom format data)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
447 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
448 (t (error "Unknown DND atom: %s" message-atom))))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
449 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
450 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
451 ;;; Old KDE protocol. Only dropping of files. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
452 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
453 (defun x-dnd-handle-old-kde (event frame window message format data) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
454 "Open the files in a KDE 1.x drop." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
455 (let ((values (x-window-property "DndSelection" frame nil 0 t))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
456 (x-dnd-handle-uri-list window 'private |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
457 (replace-regexp-in-string "\0$" "" values)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
458 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
459 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
460 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
461 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
462 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
463 ;;; XDND protocol. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
464 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
465 (defvar x-dnd-xdnd-to-action |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
466 '(("XdndActionPrivate" . private) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
467 ("XdndActionCopy" . copy) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
468 ("XdndActionMove" . move) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
469 ("XdndActionLink" . link) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
470 ("XdndActionAsk" . ask)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
471 "Mapping from XDND action types to lisp symbols.") |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
472 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
473 (defun x-dnd-init-xdnd-for-frame (frame) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
474 "Set the XdndAware for FRAME to indicate that we do XDND." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
475 (x-change-window-property "XdndAware" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
476 '(5) ;; The version of XDND we support. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
477 frame "ATOM" 32 t)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
478 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
479 (defun x-dnd-get-drop-width-height (frame w accept) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
480 "Return the widht/height to be sent in a XDndStatus message. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
481 FRAME is the frame and W is the window where the drop happened. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
482 If ACCEPT is nil return 0 (empty rectangle), |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
483 otherwise if W is a window, return its widht/height, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
484 otherwise return the frame width/height." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
485 (if accept |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
486 (if (windowp w) ;; w is not a window if dropping on the menu bar, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
487 ;; scroll bar or tool bar. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
488 (let ((edges (window-inside-pixel-edges w))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
489 (cons |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
490 (- (nth 2 edges) (nth 0 edges)) ;; right - left |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
491 (- (nth 3 edges) (nth 1 edges)))) ;; bottom - top |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
492 (cons (frame-pixel-width frame) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
493 (frame-pixel-height frame))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
494 0)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
495 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
496 (defun x-dnd-get-drop-x-y (frame w) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
497 "Return the x/y coordinates to be sent in a XDndStatus message. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
498 Coordinates are required to be absolute. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
499 FRAME is the frame and W is the window where the drop happened. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
500 If W is a window, return its absolute corrdinates, |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
501 otherwise return the frame coordinates." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
502 (let* ((frame-left (frame-parameter frame 'left)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
503 ;; If the frame is outside the display, frame-left looks like |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
504 ;; '(0 -16). Extract the -16. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
505 (frame-real-left (if (consp frame-left) (car (cdr frame-left)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
506 frame-left)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
507 (frame-top (frame-parameter frame 'top)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
508 (frame-real-top (if (consp frame-top) (car (cdr frame-top)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
509 frame-top))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
510 (if (windowp w) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
511 (let ((edges (window-inside-pixel-edges w))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
512 (cons |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
513 (+ frame-real-left (nth 0 edges)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
514 (+ frame-real-top (nth 1 edges)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
515 (cons frame-real-left frame-real-top)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
516 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
517 (defun x-dnd-handle-xdnd (event frame window message format data) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
518 "Receive one XDND event (client message) and send the appropriate reply. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
519 EVENT is the client message. FRAME is where the mouse is now. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
520 WINDOW is the window within FRAME where the mouse is now. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
521 FORMAT is 32 (not used). MESSAGE is the data part of an XClientMessageEvent." |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
522 (cond ((equal "XdndEnter" message) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
523 (let ((version (ash (car (aref data 1)) -8)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
524 (more-than-3 (cdr (aref data 1))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
525 (dnd-source (aref data 0))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
526 (x-dnd-save-state |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
527 window nil nil |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
528 (if (> more-than-3 0) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
529 (x-window-property "XdndTypeList" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
530 frame "AnyPropertyType" |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
531 dnd-source nil t) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
532 (vector (x-get-atom-name (aref data 2)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
533 (x-get-atom-name (aref data 3)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
534 (x-get-atom-name (aref data 4))))))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
535 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
536 ((equal "XdndPosition" message) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
537 (let* ((x (car (aref data 2))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
538 (y (cdr (aref data 2))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
539 (action (x-get-atom-name (aref data 4))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
540 (dnd-source (aref data 0)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
541 (dnd-time (aref data 3)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
542 (action-type (x-dnd-maybe-call-test-function |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
543 window |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
544 (cdr (assoc action x-dnd-xdnd-to-action)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
545 (reply-action (car (rassoc (car action-type) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
546 x-dnd-xdnd-to-action))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
547 (accept ;; 1 = accept, 0 = reject |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
548 (if (and reply-action action-type) 1 0)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
549 (list-to-send |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
550 (list (string-to-number |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
551 (frame-parameter frame 'outer-window-id)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
552 accept ;; 1 = Accept, 0 = reject. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
553 (x-dnd-get-drop-x-y frame window) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
554 (x-dnd-get-drop-width-height |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
555 frame window (eq accept 1)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
556 (or reply-action 0) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
557 ))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
558 (x-send-client-message |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
559 frame dnd-source frame "XdndStatus" 32 list-to-send) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
560 )) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
561 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
562 ((equal "XdndLeave" message) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
563 (x-dnd-forget-drop window)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
564 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
565 ((equal "XdndDrop" message) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
566 (if (windowp window) (select-window window)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
567 (let* ((dnd-source (aref data 0)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
568 (value (and (x-dnd-current-type window) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
569 ;; Get selection with target DELETE if move. |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
570 (x-get-selection-internal |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
571 'XdndSelection |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
572 (intern (x-dnd-current-type window))))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
573 success action ret-action) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
574 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
575 (setq action (if value |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
576 (condition-case info |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
577 (x-dnd-drop-data event frame window value |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
578 (x-dnd-current-type window)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
579 (error |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
580 (message "Error: %s" info) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
581 nil)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
582 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
583 (setq success (if action 1 0)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
584 (setq ret-action |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
585 (if (eq success 1) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
586 (or (car (rassoc action x-dnd-xdnd-to-action)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
587 "XdndActionPrivate") |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
588 0)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
589 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
590 (x-send-client-message |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
591 frame dnd-source frame "XdndFinished" 32 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
592 (list (string-to-number (frame-parameter frame 'outer-window-id)) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
593 success ;; 1 = Success, 0 = Error |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
594 (if success "XdndActionPrivate" 0) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
595 )) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
596 (x-dnd-forget-drop window))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
597 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
598 (t (error "Unknown XDND message %s %s" message data)))) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
599 |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
600 (provide 'x-dnd) |
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
601 |
53797 | 602 ;;; arch-tag: b621fb7e-50da-4323-850b-5fc71ae64621 |
53789
7efe8089eadf
* x-dnd.el: New file for drag and drop.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff
changeset
|
603 ;;; x-dnd.el ends here |