forked from AuroraMiddleware/gtk
Use GFile in the DnD signals instead of URIs
The rest of the public API works in terms of GFile, so remove this last remnant of passing URIs around. Signed-off-by: Federico Mena Quintero <federico@gnome.org>
This commit is contained in:
parent
a8f3465181
commit
fc9489f381
@ -91,6 +91,7 @@ VOID:OBJECT,INT,INT
|
||||
VOID:OBJECT,INT,INT,BOXED,UINT,UINT
|
||||
VOID:OBJECT,OBJECT
|
||||
VOID:OBJECT,POINTER
|
||||
VOID:OBJECT,POINTER,INT
|
||||
VOID:OBJECT,STRING
|
||||
VOID:OBJECT,STRING,STRING
|
||||
VOID:OBJECT,UINT
|
||||
@ -99,6 +100,7 @@ VOID:OBJECT,STRING
|
||||
VOID:OBJECT,OBJECT,STRING
|
||||
VOID:OBJECT,OBJECT,OBJECT
|
||||
VOID:OBJECT,OBJECT,BOXED,STRING
|
||||
VOID:OBJECT,OBJECT,POINTER,POINTER
|
||||
VOID:POINTER
|
||||
VOID:POINTER,INT
|
||||
VOID:POINTER,BOOLEAN
|
||||
|
@ -128,7 +128,7 @@ struct _GtkPlacesSidebar {
|
||||
gboolean bookmarks_header_added;
|
||||
|
||||
/* DnD */
|
||||
GList *drag_list;
|
||||
GList *drag_list; /* list of GFile */
|
||||
gboolean drag_data_received;
|
||||
int drag_data_info;
|
||||
gboolean drop_occured;
|
||||
@ -165,14 +165,14 @@ struct _GtkPlacesSidebarClass {
|
||||
const char *secondary);
|
||||
void (* drag_action_requested) (GtkPlacesSidebar *sidebar,
|
||||
GdkDragContext *context,
|
||||
const char *uri,
|
||||
GList *uri_list,
|
||||
GFile *dest_file,
|
||||
GList *source_file_list,
|
||||
int *action);
|
||||
GdkDragAction (* drag_action_ask) (GtkPlacesSidebar *sidebar,
|
||||
GdkDragAction actions);
|
||||
void (* drag_perform_drop) (GtkPlacesSidebar *sidebar,
|
||||
GList *uris,
|
||||
const char *drop_uri,
|
||||
GFile *dest_file,
|
||||
GList *source_file_list,
|
||||
GdkDragAction action);
|
||||
};
|
||||
|
||||
@ -335,14 +335,14 @@ emit_show_error_message (GtkPlacesSidebar *sidebar, const char *primary, const c
|
||||
static void
|
||||
emit_drag_action_requested (GtkPlacesSidebar *sidebar,
|
||||
GdkDragContext *context,
|
||||
const char *uri,
|
||||
GList *uri_list,
|
||||
GFile *dest_file,
|
||||
GList *source_file_list,
|
||||
int *action)
|
||||
{
|
||||
g_signal_emit (sidebar, places_sidebar_signals[DRAG_ACTION_REQUESTED], 0,
|
||||
context,
|
||||
uri,
|
||||
uri_list,
|
||||
dest_file,
|
||||
source_file_list,
|
||||
action);
|
||||
}
|
||||
|
||||
@ -362,13 +362,13 @@ emit_drag_action_ask (GtkPlacesSidebar *sidebar,
|
||||
|
||||
static void
|
||||
emit_drag_perform_drop (GtkPlacesSidebar *sidebar,
|
||||
GList *uris,
|
||||
const char *drop_uri,
|
||||
GFile *dest_file,
|
||||
GList *source_file_list,
|
||||
GdkDragAction action)
|
||||
{
|
||||
g_signal_emit (sidebar, places_sidebar_signals[DRAG_PERFORM_DROP], 0,
|
||||
uris,
|
||||
drop_uri,
|
||||
dest_file,
|
||||
source_file_list,
|
||||
action);
|
||||
}
|
||||
|
||||
@ -1318,7 +1318,7 @@ free_drag_data (GtkPlacesSidebar *sidebar)
|
||||
sidebar->drag_data_received = FALSE;
|
||||
|
||||
if (sidebar->drag_list) {
|
||||
g_list_free_full (sidebar->drag_list, g_free);
|
||||
g_list_free_full (sidebar->drag_list, g_object_unref);
|
||||
sidebar->drag_list = NULL;
|
||||
}
|
||||
}
|
||||
@ -1362,14 +1362,20 @@ drag_motion_callback (GtkTreeView *tree_view,
|
||||
action = 0;
|
||||
if (sidebar->accept_uri_drops) {
|
||||
if (sidebar->drag_list != NULL) {
|
||||
GFile *dest_file;
|
||||
|
||||
gtk_tree_model_get_iter (GTK_TREE_MODEL (sidebar->store),
|
||||
&iter, path);
|
||||
gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store),
|
||||
&iter,
|
||||
PLACES_SIDEBAR_COLUMN_URI, &uri,
|
||||
-1);
|
||||
emit_drag_action_requested (sidebar, context, uri, sidebar->drag_list, &action);
|
||||
|
||||
dest_file = g_file_new_for_uri (uri);
|
||||
g_free (uri);
|
||||
|
||||
emit_drag_action_requested (sidebar, context, dest_file, sidebar->drag_list, &action);
|
||||
g_object_unref (dest_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1401,19 +1407,19 @@ drag_leave_callback (GtkTreeView *tree_view,
|
||||
g_signal_stop_emission_by_name (tree_view, "drag-leave");
|
||||
}
|
||||
|
||||
/* Takes an array of URIs and turns it into a list of string URIs */
|
||||
/* Takes an array of URIs and turns it into a list of GFile */
|
||||
static GList *
|
||||
build_uri_list (const char **uris)
|
||||
build_file_list_from_uris (const char **uris)
|
||||
{
|
||||
GList *result;
|
||||
int i;
|
||||
|
||||
result = NULL;
|
||||
for (i = 0; uris[i]; i++) {
|
||||
char *uri;
|
||||
GFile *file;
|
||||
|
||||
uri = g_strdup (uris[i]);
|
||||
result = g_list_prepend (result, uri);
|
||||
file = g_file_new_for_uri (uris[i]);
|
||||
result = g_list_prepend (result, file);
|
||||
}
|
||||
|
||||
return g_list_reverse (result);
|
||||
@ -1472,7 +1478,7 @@ drag_data_received_callback (GtkWidget *widget,
|
||||
char **uris;
|
||||
|
||||
uris = gtk_selection_data_get_uris (selection_data);
|
||||
sidebar->drag_list = build_uri_list ((const char **) uris);
|
||||
sidebar->drag_list = build_file_list_from_uris ((const char **) uris);
|
||||
g_strfreev (uris);
|
||||
} else {
|
||||
sidebar->drag_list = NULL;
|
||||
@ -1529,8 +1535,7 @@ drag_data_received_callback (GtkWidget *widget,
|
||||
} else {
|
||||
GdkDragAction real_action;
|
||||
char **uris;
|
||||
GList *uri_list;
|
||||
char *drop_uri;
|
||||
GList *source_file_list;
|
||||
|
||||
/* file transfer requested */
|
||||
real_action = gdk_drag_context_get_selected_action (context);
|
||||
@ -1539,19 +1544,24 @@ drag_data_received_callback (GtkWidget *widget,
|
||||
real_action = emit_drag_action_ask (sidebar, gdk_drag_context_get_actions (context));
|
||||
|
||||
if (real_action > 0) {
|
||||
char *uri;
|
||||
GFile *dest_file;
|
||||
|
||||
model = gtk_tree_view_get_model (tree_view);
|
||||
|
||||
gtk_tree_model_get_iter (model, &iter, tree_path);
|
||||
gtk_tree_model_get (model, &iter,
|
||||
PLACES_SIDEBAR_COLUMN_URI, &drop_uri,
|
||||
PLACES_SIDEBAR_COLUMN_URI, &uri,
|
||||
-1);
|
||||
|
||||
dest_file = g_file_new_for_uri (uri);
|
||||
|
||||
switch (info) {
|
||||
case TEXT_URI_LIST:
|
||||
uris = gtk_selection_data_get_uris (selection_data);
|
||||
uri_list = build_uri_list ((const char **) uris);
|
||||
emit_drag_perform_drop (sidebar, uri_list, drop_uri, real_action);
|
||||
g_list_free_full (uri_list, g_free);
|
||||
source_file_list = build_file_list_from_uris ((const char **) uris);
|
||||
emit_drag_perform_drop (sidebar, dest_file, source_file_list, real_action);
|
||||
g_list_free_full (source_file_list, g_object_unref);
|
||||
g_strfreev (uris);
|
||||
success = TRUE;
|
||||
break;
|
||||
@ -1563,7 +1573,8 @@ drag_data_received_callback (GtkWidget *widget,
|
||||
break;
|
||||
}
|
||||
|
||||
g_free (drop_uri);
|
||||
g_free (uri);
|
||||
g_object_unref (dest_file);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3677,8 +3688,8 @@ gtk_places_sidebar_class_init (GtkPlacesSidebarClass *class)
|
||||
* GtkPlacesSidebar::drag-action-requested:
|
||||
* @sidebar: the object which received the signal.
|
||||
* @context: #GdkDragContext with information about the drag operation
|
||||
* @uri: URI of the location that is being hovered for a drop
|
||||
* @uri_list: (element-type utf8) (transfer none): List of URIs that are being dragged
|
||||
* @dest_file: #GFile with the tentative location that is being hovered for a drop
|
||||
* @source_file_list: (element-type GFile) (transfer none): List of #GFile that are being dragged
|
||||
* @action: Location in which to store the drag action here
|
||||
*
|
||||
* When the user starts a drag-and-drop operation and the sidebar needs
|
||||
@ -3686,8 +3697,8 @@ gtk_places_sidebar_class_init (GtkPlacesSidebarClass *class)
|
||||
* sidebar will emit this signal.
|
||||
*
|
||||
* The application can evaluate the @context for customary actions, or
|
||||
* it can check the type of the files indicated by @uri_list against the
|
||||
* possible actions for the destination @uri.
|
||||
* it can check the type of the files indicated by @source_file_list against the
|
||||
* possible actions for the destination @dest_file.
|
||||
*
|
||||
* To enable drag-and-drop operations on the sidebar, use
|
||||
* gtk_places_sidebar_set_accept_uri_drops().
|
||||
@ -3698,10 +3709,10 @@ gtk_places_sidebar_class_init (GtkPlacesSidebarClass *class)
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET (GtkPlacesSidebarClass, drag_action_requested),
|
||||
NULL, NULL,
|
||||
_gtk_marshal_VOID__OBJECT_STRING_POINTER_POINTER,
|
||||
_gtk_marshal_VOID__OBJECT_OBJECT_POINTER_POINTER,
|
||||
G_TYPE_NONE, 4,
|
||||
GDK_TYPE_DRAG_CONTEXT,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_OBJECT,
|
||||
G_TYPE_POINTER, /* FIXME: (GList *) is there something friendlier to language bindings? */
|
||||
G_TYPE_POINTER /* FIXME: (inout int) is there something friendlier to language bindings? */);
|
||||
|
||||
@ -3734,13 +3745,15 @@ gtk_places_sidebar_class_init (GtkPlacesSidebarClass *class)
|
||||
/**
|
||||
* GtkPlacesSidebar::drag-perform-drop:
|
||||
* @sidebar: the object which received the signal.
|
||||
* @uris: (element-type utf8) (transfer none): List of URIs that got dropped.
|
||||
* @drop_uri: Destination URI.
|
||||
* @dest_file: Destination #GFile.
|
||||
* @source_file_list: (element-type GFile) (transfer none): #GList of #GFile that got dropped.
|
||||
* @action: Drop action to perform.
|
||||
*
|
||||
* The places sidebar emits this signal when the user completes a drag-and-drop operation and one
|
||||
* of the sidebar's items is the destination. This item's URI is the @drop_uri, and the @uris
|
||||
* that are dropped into it should be copied/moved/etc. based on the specified @action.
|
||||
* The places sidebar emits this signal when the user completes a
|
||||
* drag-and-drop operation and one of the sidebar's items is the
|
||||
* destination. This item is in the @dest_file, and the
|
||||
* @source_file_list has the list of files that are dropped into it and
|
||||
* which should be copied/moved/etc. based on the specified @action.
|
||||
*
|
||||
* To enable drag-and-drop operations on the sidebar, use
|
||||
* gtk_places_sidebar_set_accept_uri_drops().
|
||||
@ -3753,10 +3766,10 @@ gtk_places_sidebar_class_init (GtkPlacesSidebarClass *class)
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET (GtkPlacesSidebarClass, drag_perform_drop),
|
||||
NULL, NULL,
|
||||
_gtk_marshal_VOID__POINTER_STRING_INT,
|
||||
_gtk_marshal_VOID__OBJECT_POINTER_INT,
|
||||
G_TYPE_NONE, 3,
|
||||
G_TYPE_OBJECT,
|
||||
G_TYPE_POINTER, /* FIXME: (GList *) is there something friendlier to language bindings? */
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_INT);
|
||||
|
||||
properties[PROP_LOCATION] =
|
||||
|
Loading…
Reference in New Issue
Block a user