diff --git a/nautilus-2.22.0-treeview-xds-dnd-2.patch b/nautilus-2.22.0-treeview-xds-dnd-2.patch new file mode 100644 index 0000000..0b3fc62 --- /dev/null +++ b/nautilus-2.22.0-treeview-xds-dnd-2.patch @@ -0,0 +1,227 @@ +diff -up nautilus-2.25.1/libnautilus-private/nautilus-tree-view-drag-dest.c.orig nautilus-2.25.1/libnautilus-private/nautilus-tree-view-drag-dest.c +--- nautilus-2.25.1/libnautilus-private/nautilus-tree-view-drag-dest.c.orig 2008-10-06 11:54:32.000000000 +0200 ++++ nautilus-2.25.1/libnautilus-private/nautilus-tree-view-drag-dest.c 2008-12-04 11:35:04.174034560 +0100 +@@ -21,6 +21,7 @@ + * Boston, MA 02111-1307, USA. + * + * Author: Dave Camp ++ * XDS support: Benedikt Meurer (adapted by Amos Brocco ) + */ + + /* nautilus-tree-view-drag-dest.c: Handles drag and drop for treeviews which +@@ -33,9 +34,13 @@ + #include + #include + #include "nautilus-file-dnd.h" ++#include "nautilus-file-changes-queue.h" + #include "nautilus-icon-dnd.h" + #include "nautilus-link.h" + #include "nautilus-marshal.h" ++#include "nautilus-debug-log.h" ++#include ++#include + + #define AUTO_SCROLL_MARGIN 20 + +@@ -54,6 +59,8 @@ struct _NautilusTreeViewDragDestDetails + guint highlight_id; + guint scroll_id; + guint expand_id; ++ ++ char *direct_save_uri; + }; + + enum { +@@ -80,7 +87,8 @@ static const GtkTargetEntry drag_types [ + /* prefer "_NETSCAPE_URL" over "text/uri-list" to satisfy web browsers. */ + { NAUTILUS_ICON_DND_NETSCAPE_URL_TYPE, 0, NAUTILUS_ICON_DND_NETSCAPE_URL }, + { NAUTILUS_ICON_DND_URI_LIST_TYPE, 0, NAUTILUS_ICON_DND_URI_LIST }, +- { NAUTILUS_ICON_DND_KEYWORD_TYPE, 0, NAUTILUS_ICON_DND_KEYWORD } ++ { NAUTILUS_ICON_DND_KEYWORD_TYPE, 0, NAUTILUS_ICON_DND_KEYWORD }, ++ { NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, 0, NAUTILUS_ICON_DND_XDNDDIRECTSAVE }, /* XDS Protocol Type */ + }; + + +@@ -244,6 +252,12 @@ get_drag_data (NautilusTreeViewDragDest + target = gtk_drag_dest_find_target (GTK_WIDGET (dest->details->tree_view), + context, + NULL); ++ if (target == gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE) && ++ !dest->details->drop_occurred) { ++ dest->details->drag_type = NAUTILUS_ICON_DND_XDNDDIRECTSAVE; ++ dest->details->have_drag_data = TRUE; ++ return; ++ } + + gtk_drag_get_data (GTK_WIDGET (dest->details->tree_view), + context, target, time); +@@ -263,6 +277,9 @@ free_drag_data (NautilusTreeViewDragDest + nautilus_drag_destroy_selection_list (dest->details->drag_list); + dest->details->drag_list = NULL; + } ++ ++ g_free (dest->details->direct_save_uri); ++ dest->details->direct_save_uri = NULL; + } + + static char * +@@ -407,6 +424,7 @@ get_drop_action (NautilusTreeViewDragDes + return context->suggested_action; + + case NAUTILUS_ICON_DND_TEXT: ++ case NAUTILUS_ICON_DND_XDNDDIRECTSAVE: + return GDK_ACTION_COPY; + + case NAUTILUS_ICON_DND_KEYWORD: +@@ -717,6 +735,35 @@ receive_dropped_keyword (NautilusTreeVie + g_free (drop_target_uri); + } + ++static void ++receive_xds (NautilusTreeViewDragDest *dest, ++ GdkDragContext *context, ++ int x, int y) ++{ ++ GFile *location; ++ ++ /* Indicate that we don't provide "F" fallback */ ++ if (G_UNLIKELY (dest->details->drag_data->format == 8 ++ && dest->details->drag_data->length == 1 ++ && dest->details->drag_data->data[0] == 'F')) { ++ gdk_property_change (GDK_DRAWABLE (context->source_window), ++ gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE), ++ gdk_atom_intern ("text/plain", FALSE), 8, ++ GDK_PROP_MODE_REPLACE, (const guchar *) "", 0); ++ } else if (G_LIKELY (dest->details->drag_data->format == 8 ++ && dest->details->drag_data->length == 1 ++ && dest->details->drag_data->data[0] == 'S')) { ++ g_assert (dest->details->direct_save_uri != NULL); ++ location = g_file_new_for_uri (dest->details->direct_save_uri); ++ ++ nautilus_file_changes_queue_file_added (location); ++ nautilus_file_changes_consume_changes (TRUE); ++ ++ g_object_unref (location); ++ } ++} ++ ++ + static gboolean + drag_data_received_callback (GtkWidget *widget, + GdkDragContext *context, +@@ -766,6 +813,10 @@ drag_data_received_callback (GtkWidget * + receive_dropped_keyword (dest, context, x, y); + success = TRUE; + break; ++ case NAUTILUS_ICON_DND_XDNDDIRECTSAVE: ++ receive_xds (dest, context, x, y); ++ success = TRUE; ++ break; + } + + dest->details->drop_occurred = FALSE; +@@ -781,6 +832,79 @@ drag_data_received_callback (GtkWidget * + return TRUE; + } + ++static char * ++get_direct_save_filename (GdkDragContext *context) ++{ ++ guchar *prop_text; ++ gint prop_len; ++ ++ if (!gdk_property_get (context->source_window, gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE), ++ gdk_atom_intern ("text/plain", FALSE), 0, 1024, FALSE, NULL, NULL, ++ &prop_len, &prop_text) && prop_text != NULL) { ++ return NULL; ++ } ++ ++ /* Zero-terminate the string */ ++ prop_text = g_realloc (prop_text, prop_len + 1); ++ prop_text[prop_len] = '\0'; ++ ++ /* Verify that the file name provided by the source is valid */ ++ if (*prop_text == '\0' || ++ strchr ((const gchar *) prop_text, G_DIR_SEPARATOR) != NULL) { ++ nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER, ++ "Invalid filename provided by XDS drag site"); ++ g_free (prop_text); ++ return NULL; ++ } ++ ++ return prop_text; ++} ++ ++static gboolean ++set_direct_save_uri (NautilusTreeViewDragDest *dest, ++ GdkDragContext *context, ++ int x, int y) ++{ ++ GFile *base, *child; ++ char *drop_uri; ++ char *filename, *uri; ++ ++ g_assert (dest->details->direct_save_uri == NULL); ++ ++ uri = NULL; ++ ++ drop_uri = get_drop_target_uri_at_pos (dest, x, y); ++ if (drop_uri != NULL) { ++ filename = get_direct_save_filename (context); ++ if (filename != NULL) { ++ /* Resolve relative path */ ++ base = g_file_new_for_uri (drop_uri); ++ child = g_file_get_child (base, filename); ++ uri = g_file_get_uri (child); ++ ++ g_object_unref (base); ++ g_object_unref (child); ++ ++ /* Change the property */ ++ gdk_property_change (GDK_DRAWABLE (context->source_window), ++ gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE), ++ gdk_atom_intern ("text/plain", FALSE), 8, ++ GDK_PROP_MODE_REPLACE, (const guchar *) uri, ++ strlen (uri)); ++ ++ dest->details->direct_save_uri = uri; ++ } else { ++ nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER, ++ "Invalid filename provided by XDS drag site"); ++ } ++ } else { ++ nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER, ++ "Could not retrieve XDS drop destination"); ++ } ++ ++ return uri != NULL; ++} ++ + static gboolean + drag_drop_callback (GtkWidget *widget, + GdkDragContext *context, +@@ -790,8 +914,24 @@ drag_drop_callback (GtkWidget *widget, + gpointer data) + { + NautilusTreeViewDragDest *dest; ++ guint info; ++ GdkAtom target; + + dest = NAUTILUS_TREE_VIEW_DRAG_DEST (data); ++ ++ target = gtk_drag_dest_find_target (GTK_WIDGET (dest->details->tree_view), ++ context, ++ NULL); ++ if (target == GDK_NONE) { ++ return FALSE; ++ } ++ ++ info = dest->details->drag_type; ++ ++ if (info == NAUTILUS_ICON_DND_XDNDDIRECTSAVE && ++ !set_direct_save_uri (dest, context, x, y)) { ++ return FALSE; ++ } + + dest->details->drop_occurred = TRUE; + diff --git a/nautilus-2.22.0-treeview-xds-dnd.patch b/nautilus-2.22.0-treeview-xds-dnd.patch deleted file mode 100644 index f6d7d72..0000000 --- a/nautilus-2.22.0-treeview-xds-dnd.patch +++ /dev/null @@ -1,228 +0,0 @@ -Index: libnautilus-private/nautilus-tree-view-drag-dest.c -=================================================================== ---- libnautilus-private/nautilus-tree-view-drag-dest.c (Revision 14599) -+++ libnautilus-private/nautilus-tree-view-drag-dest.c (Arbeitskopie) -@@ -21,6 +21,7 @@ - * Boston, MA 02111-1307, USA. - * - * Author: Dave Camp -+ * XDS support: Benedikt Meurer (adapted by Amos Brocco ) - */ - - /* nautilus-tree-view-drag-dest.c: Handles drag and drop for treeviews which -@@ -34,9 +35,13 @@ - #include - #include - #include "nautilus-file-dnd.h" -+#include "nautilus-file-changes-queue.h" - #include "nautilus-icon-dnd.h" - #include "nautilus-link.h" - #include "nautilus-marshal.h" -+#include "nautilus-debug-log.h" -+#include -+#include - - #define AUTO_SCROLL_MARGIN 20 - -@@ -55,6 +60,8 @@ struct _NautilusTreeViewDragDestDetails - guint highlight_id; - guint scroll_id; - guint expand_id; -+ -+ char *direct_save_uri; - }; - - enum { -@@ -81,7 +88,8 @@ static const GtkTargetEntry drag_types [ - /* prefer "_NETSCAPE_URL" over "text/uri-list" to satisfy web browsers. */ - { NAUTILUS_ICON_DND_NETSCAPE_URL_TYPE, 0, NAUTILUS_ICON_DND_NETSCAPE_URL }, - { NAUTILUS_ICON_DND_URI_LIST_TYPE, 0, NAUTILUS_ICON_DND_URI_LIST }, -- { NAUTILUS_ICON_DND_KEYWORD_TYPE, 0, NAUTILUS_ICON_DND_KEYWORD } -+ { NAUTILUS_ICON_DND_KEYWORD_TYPE, 0, NAUTILUS_ICON_DND_KEYWORD }, -+ { NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, 0, NAUTILUS_ICON_DND_XDNDDIRECTSAVE }, /* XDS Protocol Type */ - }; - - -@@ -245,6 +253,12 @@ get_drag_data (NautilusTreeViewDragDest - target = gtk_drag_dest_find_target (GTK_WIDGET (dest->details->tree_view), - context, - NULL); -+ if (target == gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE) && -+ !dest->details->drop_occurred) { -+ dest->details->drag_type = NAUTILUS_ICON_DND_XDNDDIRECTSAVE; -+ dest->details->have_drag_data = TRUE; -+ return; -+ } - - gtk_drag_get_data (GTK_WIDGET (dest->details->tree_view), - context, target, time); -@@ -264,6 +278,9 @@ free_drag_data (NautilusTreeViewDragDest - nautilus_drag_destroy_selection_list (dest->details->drag_list); - dest->details->drag_list = NULL; - } -+ -+ g_free (dest->details->direct_save_uri); -+ dest->details->direct_save_uri = NULL; - } - - static char * -@@ -408,6 +425,7 @@ get_drop_action (NautilusTreeViewDragDes - return context->suggested_action; - - case NAUTILUS_ICON_DND_TEXT: -+ case NAUTILUS_ICON_DND_XDNDDIRECTSAVE: - return GDK_ACTION_COPY; - - case NAUTILUS_ICON_DND_KEYWORD: -@@ -718,6 +736,35 @@ receive_dropped_keyword (NautilusTreeVie - g_free (drop_target_uri); - } - -+static void -+receive_xds (NautilusTreeViewDragDest *dest, -+ GdkDragContext *context, -+ int x, int y) -+{ -+ GFile *location; -+ -+ /* Indicate that we don't provide "F" fallback */ -+ if (G_UNLIKELY (dest->details->drag_data->format == 8 -+ && dest->details->drag_data->length == 1 -+ && dest->details->drag_data->data[0] == 'F')) { -+ gdk_property_change (GDK_DRAWABLE (context->source_window), -+ gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE), -+ gdk_atom_intern ("text/plain", FALSE), 8, -+ GDK_PROP_MODE_REPLACE, (const guchar *) "", 0); -+ } else if (G_LIKELY (dest->details->drag_data->format == 8 -+ && dest->details->drag_data->length == 1 -+ && dest->details->drag_data->data[0] == 'S')) { -+ g_assert (dest->details->direct_save_uri != NULL); -+ location = g_file_new_for_uri (dest->details->direct_save_uri); -+ -+ nautilus_file_changes_queue_file_added (location); -+ nautilus_file_changes_consume_changes (TRUE); -+ -+ g_object_unref (location); -+ } -+} -+ -+ - static gboolean - drag_data_received_callback (GtkWidget *widget, - GdkDragContext *context, -@@ -767,6 +814,10 @@ drag_data_received_callback (GtkWidget * - receive_dropped_keyword (dest, context, x, y); - success = TRUE; - break; -+ case NAUTILUS_ICON_DND_XDNDDIRECTSAVE: -+ receive_xds (dest, context, x, y); -+ success = TRUE; -+ break; - } - - dest->details->drop_occurred = FALSE; -@@ -782,6 +833,79 @@ drag_data_received_callback (GtkWidget * - return TRUE; - } - -+static char * -+get_direct_save_filename (GdkDragContext *context) -+{ -+ guchar *prop_text; -+ gint prop_len; -+ -+ if (!gdk_property_get (context->source_window, gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE), -+ gdk_atom_intern ("text/plain", FALSE), 0, 1024, FALSE, NULL, NULL, -+ &prop_len, &prop_text) && prop_text != NULL) { -+ return NULL; -+ } -+ -+ /* Zero-terminate the string */ -+ prop_text = g_realloc (prop_text, prop_len + 1); -+ prop_text[prop_len] = '\0'; -+ -+ /* Verify that the file name provided by the source is valid */ -+ if (*prop_text == '\0' || -+ strchr ((const gchar *) prop_text, G_DIR_SEPARATOR) != NULL) { -+ nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER, -+ "Invalid filename provided by XDS drag site"); -+ g_free (prop_text); -+ return NULL; -+ } -+ -+ return prop_text; -+} -+ -+static gboolean -+set_direct_save_uri (NautilusTreeViewDragDest *dest, -+ GdkDragContext *context, -+ int x, int y) -+{ -+ GFile *base, *child; -+ char *drop_uri; -+ char *filename, *uri; -+ -+ g_assert (dest->details->direct_save_uri == NULL); -+ -+ uri = NULL; -+ -+ drop_uri = get_drop_target_uri_at_pos (dest, x, y); -+ if (drop_uri != NULL) { -+ filename = get_direct_save_filename (context); -+ if (filename != NULL) { -+ /* Resolve relative path */ -+ base = g_file_new_for_uri (drop_uri); -+ child = g_file_get_child (base, filename); -+ uri = g_file_get_uri (child); -+ -+ g_object_unref (base); -+ g_object_unref (child); -+ -+ /* Change the property */ -+ gdk_property_change (GDK_DRAWABLE (context->source_window), -+ gdk_atom_intern (NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, FALSE), -+ gdk_atom_intern ("text/plain", FALSE), 8, -+ GDK_PROP_MODE_REPLACE, (const guchar *) uri, -+ strlen (uri)); -+ -+ dest->details->direct_save_uri = uri; -+ } else { -+ nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER, -+ "Invalid filename provided by XDS drag site"); -+ } -+ } else { -+ nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER, -+ "Could not retrieve XDS drop destination"); -+ } -+ -+ return uri != NULL; -+} -+ - static gboolean - drag_drop_callback (GtkWidget *widget, - GdkDragContext *context, -@@ -791,8 +915,24 @@ drag_drop_callback (GtkWidget *widget, - gpointer data) - { - NautilusTreeViewDragDest *dest; -+ guint info; -+ GdkAtom target; - - dest = NAUTILUS_TREE_VIEW_DRAG_DEST (data); -+ -+ target = gtk_drag_dest_find_target (GTK_WIDGET (dest->details->tree_view), -+ context, -+ NULL); -+ if (target == GDK_NONE) { -+ return FALSE; -+ } -+ -+ info = dest->details->drag_type; -+ -+ if (info == NAUTILUS_ICON_DND_XDNDDIRECTSAVE && -+ !set_direct_save_uri (dest, context, x, y)) { -+ return FALSE; -+ } - - dest->details->drop_occurred = TRUE; - diff --git a/nautilus.spec b/nautilus.spec index 8d45a71..0a84c52 100644 --- a/nautilus.spec +++ b/nautilus.spec @@ -19,7 +19,7 @@ Name: nautilus Summary: File manager for GNOME Version: 2.25.1 -Release: 1%{?dist} +Release: 2%{?dist} License: GPLv2+ Group: User Interface/Desktops Source: http://download.gnome.org/sources/%{name}/2.24/%{name}-%{version}.tar.bz2 @@ -94,7 +94,7 @@ Patch7: rtl-fix.patch Patch10: nautilus-gvfs-desktop-key-2.patch # http://bugzilla.gnome.org/show_bug.cgi?id=171655 -Patch15: nautilus-2.22.0-treeview-xds-dnd.patch +Patch15: nautilus-2.22.0-treeview-xds-dnd-2.patch # http://bugzilla.gnome.org/show_bug.cgi?id=519743 Patch17: nautilus-filetype-symlink-fix.patch @@ -135,7 +135,7 @@ for developing nautilus extensions. %patch7 -p1 -b .rtl-fix # %patch8 -p1 -b .hide-white-screen %patch10 -p1 -b .gvfs-desktop-key -%patch15 -p0 -b .xds +%patch15 -p1 -b .xds %patch17 -p0 -b .symlink %build @@ -265,6 +265,9 @@ fi %changelog +* Thu Dec 4 2008 Tomas Bzatek - 2.25.1-2 +- Rediff the XDS patch + * Tue Dec 2 2008 Tomas Bzatek - 2.25.1-1 - Update to 2.25.1