updated on Thu Jan 26 16:09:46 UTC 2012
[aur-mirror.git] / nautilus-xds-patch / nautilus_xds.patch
blob47d0f0fc5828ed49d887cc2ceb6a5325d780d5eb
1 Index: libnautilus-private/nautilus-tree-view-drag-dest.c
2 ===================================================================
3 --- libnautilus-private/nautilus-tree-view-drag-dest.c (Revision 14599)
4 +++ libnautilus-private/nautilus-tree-view-drag-dest.c (Arbeitskopie)
5 @@ -21,6 +21,7 @@
6 * Boston, MA 02111-1307, USA.
7 *
8 * Author: Dave Camp <dave@ximian.com>
9 + * XDS support: Benedikt Meurer <benny@xfce.org> (adapted by Amos Brocco <amos.brocco@unifr.ch>)
12 /* nautilus-tree-view-drag-dest.c: Handles drag and drop for treeviews which
13 @@ -34,9 +35,13 @@
14 #include <gtk/gtk.h>
15 #include <libgnome/gnome-macros.h>
16 #include "nautilus-file-dnd.h"
17 +#include "nautilus-file-changes-queue.h"
18 #include "nautilus-icon-dnd.h"
19 #include "nautilus-link.h"
20 #include "nautilus-marshal.h"
21 +#include "nautilus-debug-log.h"
22 +#include <stdio.h>
23 +#include <string.h>
25 #define AUTO_SCROLL_MARGIN 20
27 @@ -55,6 +60,8 @@ struct _NautilusTreeViewDragDestDetails
28 guint highlight_id;
29 guint scroll_id;
30 guint expand_id;
32 + char *direct_save_uri;
35 enum {
36 @@ -81,7 +88,8 @@ static const GtkTargetEntry drag_types [
37 /* prefer "_NETSCAPE_URL" over "text/uri-list" to satisfy web browsers. */
38 { NAUTILUS_ICON_DND_NETSCAPE_URL_TYPE, 0, NAUTILUS_ICON_DND_NETSCAPE_URL },
39 { NAUTILUS_ICON_DND_URI_LIST_TYPE, 0, NAUTILUS_ICON_DND_URI_LIST },
40 - { NAUTILUS_ICON_DND_KEYWORD_TYPE, 0, NAUTILUS_ICON_DND_KEYWORD }
41 + { NAUTILUS_ICON_DND_KEYWORD_TYPE, 0, NAUTILUS_ICON_DND_KEYWORD },
42 + { NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, 0, NAUTILUS_ICON_DND_XDNDDIRECTSAVE }, /* XDS Protocol Type */
46 @@ -245,6 +253,12 @@ get_drag_data (NautilusTreeViewDragDest
47 target = gtk_drag_dest_find_target (GTK_WIDGET (dest->details->tree_view),
48 context,
49 NULL);
50 + if (target == gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE) &&
51 + !dest->details->drop_occurred) {
52 + dest->details->drag_type = NAUTILUS_ICON_DND_XDNDDIRECTSAVE;
53 + dest->details->have_drag_data = TRUE;
54 + return;
55 + }
57 gtk_drag_get_data (GTK_WIDGET (dest->details->tree_view),
58 context, target, time);
59 @@ -264,6 +278,9 @@ free_drag_data (NautilusTreeViewDragDest
60 nautilus_drag_destroy_selection_list (dest->details->drag_list);
61 dest->details->drag_list = NULL;
64 + g_free (dest->details->direct_save_uri);
65 + dest->details->direct_save_uri = NULL;
68 static char *
69 @@ -408,6 +425,7 @@ get_drop_action (NautilusTreeViewDragDes
70 return context->suggested_action;
72 case NAUTILUS_ICON_DND_TEXT:
73 + case NAUTILUS_ICON_DND_XDNDDIRECTSAVE:
74 return GDK_ACTION_COPY;
76 case NAUTILUS_ICON_DND_KEYWORD:
77 @@ -718,6 +736,35 @@ receive_dropped_keyword (NautilusTreeVie
78 g_free (drop_target_uri);
81 +static void
82 +receive_xds (NautilusTreeViewDragDest *dest,
83 + GdkDragContext *context,
84 + int x, int y)
86 + GFile *location;
88 + /* Indicate that we don't provide "F" fallback */
89 + if (G_UNLIKELY (dest->details->drag_data->format == 8
90 + && dest->details->drag_data->length == 1
91 + && dest->details->drag_data->data[0] == 'F')) {
92 + gdk_property_change (GDK_DRAWABLE (context->source_window),
93 + gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE),
94 + gdk_atom_intern ("text/plain", FALSE), 8,
95 + GDK_PROP_MODE_REPLACE, (const guchar *) "", 0);
96 + } else if (G_LIKELY (dest->details->drag_data->format == 8
97 + && dest->details->drag_data->length == 1
98 + && dest->details->drag_data->data[0] == 'S')) {
99 + g_assert (dest->details->direct_save_uri != NULL);
100 + location = g_file_new_for_uri (dest->details->direct_save_uri);
102 + nautilus_file_changes_queue_file_added (location);
103 + nautilus_file_changes_consume_changes (TRUE);
105 + g_object_unref (location);
110 static gboolean
111 drag_data_received_callback (GtkWidget *widget,
112 GdkDragContext *context,
113 @@ -767,6 +814,10 @@ drag_data_received_callback (GtkWidget *
114 receive_dropped_keyword (dest, context, x, y);
115 success = TRUE;
116 break;
117 + case NAUTILUS_ICON_DND_XDNDDIRECTSAVE:
118 + receive_xds (dest, context, x, y);
119 + success = TRUE;
120 + break;
123 dest->details->drop_occurred = FALSE;
124 @@ -782,6 +833,79 @@ drag_data_received_callback (GtkWidget *
125 return TRUE;
128 +static char *
129 +get_direct_save_filename (GdkDragContext *context)
131 + guchar *prop_text;
132 + gint prop_len;
134 + if (!gdk_property_get (context->source_window, gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE),
135 + gdk_atom_intern ("text/plain", FALSE), 0, 1024, FALSE, NULL, NULL,
136 + &prop_len, &prop_text) && prop_text != NULL) {
137 + return NULL;
140 + /* Zero-terminate the string */
141 + prop_text = g_realloc (prop_text, prop_len + 1);
142 + prop_text[prop_len] = '\0';
144 + /* Verify that the file name provided by the source is valid */
145 + if (*prop_text == '\0' ||
146 + strchr ((const gchar *) prop_text, G_DIR_SEPARATOR) != NULL) {
147 + nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER,
148 + "Invalid filename provided by XDS drag site");
149 + g_free (prop_text);
150 + return NULL;
153 + return prop_text;
156 +static gboolean
157 +set_direct_save_uri (NautilusTreeViewDragDest *dest,
158 + GdkDragContext *context,
159 + int x, int y)
161 + GFile *base, *child;
162 + char *drop_uri;
163 + char *filename, *uri;
165 + g_assert (dest->details->direct_save_uri == NULL);
167 + uri = NULL;
169 + drop_uri = get_drop_target_uri_at_pos (dest, x, y);
170 + if (drop_uri != NULL) {
171 + filename = get_direct_save_filename (context);
172 + if (filename != NULL) {
173 + /* Resolve relative path */
174 + base = g_file_new_for_uri (drop_uri);
175 + child = g_file_get_child (base, filename);
176 + uri = g_file_get_uri (child);
178 + g_object_unref (base);
179 + g_object_unref (child);
181 + /* Change the property */
182 + gdk_property_change (GDK_DRAWABLE (context->source_window),
183 + gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE),
184 + gdk_atom_intern ("text/plain", FALSE), 8,
185 + GDK_PROP_MODE_REPLACE, (const guchar *) uri,
186 + strlen (uri));
188 + dest->details->direct_save_uri = uri;
189 + } else {
190 + nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER,
191 + "Invalid filename provided by XDS drag site");
193 + } else {
194 + nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER,
195 + "Could not retrieve XDS drop destination");
198 + return uri != NULL;
201 static gboolean
202 drag_drop_callback (GtkWidget *widget,
203 GdkDragContext *context,
204 @@ -791,8 +915,24 @@ drag_drop_callback (GtkWidget *widget,
205 gpointer data)
207 NautilusTreeViewDragDest *dest;
208 + guint info;
209 + GdkAtom target;
211 dest = NAUTILUS_TREE_VIEW_DRAG_DEST (data);
213 + target = gtk_drag_dest_find_target (GTK_WIDGET (dest->details->tree_view),
214 + context,
215 + NULL);
216 + if (target == GDK_NONE) {
217 + return FALSE;
220 + info = dest->details->drag_type;
222 + if (info == NAUTILUS_ICON_DND_XDNDDIRECTSAVE &&
223 + !set_direct_save_uri (dest, context, x, y)) {
224 + return FALSE;
227 dest->details->drop_occurred = TRUE;