[gtk/wip/otte/dnd: 20/30] filechooserwidget: Stop using selection data
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/dnd: 20/30] filechooserwidget: Stop using selection data
- Date: Sun, 23 Feb 2020 01:00:44 +0000 (UTC)
commit a19066b17ca80cef34b22abe9ae4170c8a702460
Author: Benjamin Otte <otte redhat com>
Date: Sat Feb 22 17:16:56 2020 +0100
filechooserwidget: Stop using selection data
Use gdk_drop_read_async()
gtk/gtkfilechooserwidget.c | 94 ++++++++++++++++++----------------------------
1 file changed, 37 insertions(+), 57 deletions(-)
---
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 265f5de88d..532ae64e3a 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -1854,35 +1854,28 @@ error_selecting_dragged_file_dialog (GtkFileChooserWidget *impl,
}
static void
-file_list_drag_data_select_uris (GtkFileChooserWidget *impl,
- gchar **uris)
+file_list_drag_data_select_files (GtkFileChooserWidget *impl,
+ GSList *files)
{
- int i;
- char *uri;
GtkFileChooser *chooser = GTK_FILE_CHOOSER (impl);
+ GSList *l;
- for (i = 1; uris[i]; i++)
+ for (l = files; l; l = l->next)
{
- GFile *file;
+ GFile *file = l->data;
GError *error = NULL;
- uri = uris[i];
- file = g_file_new_for_uri (uri);
-
gtk_file_chooser_widget_select_file (chooser, file, &error);
if (error)
error_selecting_dragged_file_dialog (impl, file, error);
-
- g_object_unref (file);
}
}
-struct FileListDragData
+typedef struct
{
GtkFileChooserWidget *impl;
- gchar **uris;
- GFile *file;
-};
+ GSList *files;
+} FileListDragData;
static void
file_list_drag_data_received_get_info_cb (GCancellable *cancellable,
@@ -1891,7 +1884,7 @@ file_list_drag_data_received_get_info_cb (GCancellable *cancellable,
gpointer user_data)
{
gboolean cancelled = g_cancellable_is_cancelled (cancellable);
- struct FileListDragData *data = user_data;
+ FileListDragData *data = user_data;
GtkFileChooser *chooser = GTK_FILE_CHOOSER (data->impl);
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (data->impl);
@@ -1905,27 +1898,26 @@ file_list_drag_data_received_get_info_cb (GCancellable *cancellable,
if ((priv->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
priv->action == GTK_FILE_CHOOSER_ACTION_SAVE) &&
- data->uris[1] == 0 && !error && _gtk_file_info_consider_as_directory (info))
- change_folder_and_display_error (data->impl, data->file, FALSE);
+ data->files->next == NULL && !error && _gtk_file_info_consider_as_directory (info))
+ change_folder_and_display_error (data->impl, data->files->data, FALSE);
else
{
GError *local_error = NULL;
gtk_file_chooser_widget_unselect_all (chooser);
- gtk_file_chooser_widget_select_file (chooser, data->file, &local_error);
+ gtk_file_chooser_widget_select_file (chooser, data->files->data, &local_error);
if (local_error)
- error_selecting_dragged_file_dialog (data->impl, data->file, local_error);
+ error_selecting_dragged_file_dialog (data->impl, data->files->data, local_error);
else
browse_files_center_selected_row (data->impl);
}
if (priv->select_multiple)
- file_list_drag_data_select_uris (data->impl, data->uris);
+ file_list_drag_data_select_files (data->impl, data->files->next);
out:
g_object_unref (data->impl);
- g_strfreev (data->uris);
- g_object_unref (data->file);
+ g_slist_free_full (data->files, g_object_unref);
g_free (data);
g_object_unref (cancellable);
@@ -1938,44 +1930,34 @@ file_list_drag_data_received_cb (GObject *source,
{
GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (user_data);
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
- GtkDropTarget *dest = GTK_DROP_TARGET (source);
- GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest));
- GdkDrop *drop = gtk_drop_target_get_drop (dest);
- GdkDrag *drag = gdk_drop_get_drag (drop);
- gchar **uris;
- char *uri;
- GFile *file;
- GtkSelectionData *selection_data;
-
- selection_data = gtk_drop_target_read_selection_finish (dest, result, NULL);
-
- /* Allow only drags from other widgets; see bug #533891. */
- if (drag && gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (drag)) == widget)
- return;
+ GdkDrop *drop = GDK_DROP (source);
+ GSList *files;
+ const GValue *value;
+ FileListDragData *data;
- /* Parse the text/uri-list string, navigate to the first one */
- uris = gtk_selection_data_get_uris (selection_data);
- if (uris && uris[0])
+ value = gdk_drop_read_value_finish (drop, result, NULL);
+ if (value == NULL)
{
- struct FileListDragData *data;
+ gdk_drop_finish (drop, 0);
+ return;
+ }
- uri = uris[0];
- file = g_file_new_for_uri (uri);
+ files = g_value_get_boxed (value);
- data = g_new0 (struct FileListDragData, 1);
- data->impl = g_object_ref (impl);
- data->uris = uris;
- data->file = file;
+ data = g_new0 (FileListDragData, 1);
+ data->impl = g_object_ref (impl);
+ data->files = g_slist_copy_deep (files, (GCopyFunc) g_object_ref, NULL);
- if (priv->file_list_drag_data_received_cancellable)
- g_cancellable_cancel (priv->file_list_drag_data_received_cancellable);
+ if (priv->file_list_drag_data_received_cancellable)
+ g_cancellable_cancel (priv->file_list_drag_data_received_cancellable);
- priv->file_list_drag_data_received_cancellable =
- _gtk_file_system_get_info (priv->file_system, file,
- "standard::type",
- file_list_drag_data_received_get_info_cb,
+ priv->file_list_drag_data_received_cancellable =
+ _gtk_file_system_get_info (priv->file_system, data->files->data,
+ "standard::type",
+ file_list_drag_data_received_get_info_cb,
data);
- }
+
+ gdk_drop_finish (drop, gdk_drop_get_actions (drop));
}
/* Don't do anything with the drag_drop signal */
@@ -1986,9 +1968,7 @@ file_list_drag_drop_cb (GtkDropTarget *dest,
int y,
GtkFileChooserWidget *impl)
{
- const char *target = g_intern_static_string ("text/uri-list");
-
- gtk_drop_target_read_selection (dest, target, NULL, file_list_drag_data_received_cb, impl);
+ gdk_drop_read_value_async (drop, GDK_TYPE_FILE_LIST, G_PRIORITY_DEFAULT, NULL,
file_list_drag_data_received_cb, impl);
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]