annotate lisp/x-dnd.el @ 53887:ed7d265e860f

(Voverflow_newline_into_fringe, syms_of_xdisp) (left_bits, right_bits, up_arrow_bits, down_arrow_bits) (continued_bits, continuation_bits, ov_bits, first_line_bits) (last_line_bits, filled_box_cursor_bits, hollow_box_cursor_bits) (bar_cursor_bits, hbar_cursor_bits, zv_bits, hollow_square_bits) (fringe_bitmaps, draw_fringe_bitmap, draw_row_fringe_bitmaps) (draw_window_fringes, compute_fringe_widths, update_window_fringes): Move fringe handling vars and code to new file fringe.c. (handle_display_prop): Handle left-fringe and right-fringe display properties; store user fringe bitmaps in iterator. (move_it_in_display_line_to): Handle cursor in fringe at eob. (clear_garbaged_frames): Set force_flush_display_p if resized. (redisplay_window): Redraw fringe bitmaps if not just_this_one_p. (display_line): Handle cursor in fringe at eob. (display_line): Set row user fringe bitmaps from iterator.
author Kim F. Storm <storm@cua.dk>
date Sun, 08 Feb 2004 23:20:52 +0000
parents cc4faf95fea2
children e83b3b3941cf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
5046818534df Fix typo.
Jan Djärv <jan.h.d@swipnet.se>
parents: 53789
diff changeset
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
1f2fa74fb0aa Resolve CVS conflicts
Miles Bader <miles@gnu.org>
parents: 53796
diff changeset
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