summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-02-03 13:19:26 +0000
committerMatthias Clasen <mclasen@redhat.com>2023-02-03 13:19:26 +0000
commit50998b0ee963cbe38967af6018737608500ec286 (patch)
treea00ad578bce2e9067d7f3f5fd763215c0d97a0d0
parentc2f5b64b5d25a2d5a511c0b1eb1ce587eab37b3e (diff)
parent92612c2265131e864dbd87cff32c72e66ab5bf02 (diff)
downloadgtk+-50998b0ee963cbe38967af6018737608500ec286.tar.gz
Merge branch 'drag-icon-robustness' into 'main'
dragicon: Handle files without info See merge request GNOME/gtk!5460
-rw-r--r--gdk/filetransferportal.c50
-rw-r--r--gtk/gtkdragicon.c3
2 files changed, 48 insertions, 5 deletions
diff --git a/gdk/filetransferportal.c b/gdk/filetransferportal.c
index 2904941e39..467f8f7d67 100644
--- a/gdk/filetransferportal.c
+++ b/gdk/filetransferportal.c
@@ -26,6 +26,7 @@
#include "gdkcontentformats.h"
#include "gdkcontentserializer.h"
#include "gdkcontentdeserializer.h"
+#include "gdkdebugprivate.h"
#include <gio/gio.h>
@@ -213,6 +214,8 @@ file_transfer_portal_register_files (const char **files,
afd->len = g_strv_length ((char **)files);
afd->start = 0;
+ GDK_DEBUG (DND, "file transfer portal: registering %d files", afd->len);
+
g_variant_builder_init (&options, G_VARIANT_TYPE_VARDICT);
g_variant_builder_add (&options, "{sv}", "writable", g_variant_new_boolean (writable));
g_variant_builder_add (&options, "{sv}", "autostop", g_variant_new_boolean (TRUE));
@@ -348,9 +351,8 @@ portal_ready (GObject *object,
static void
portal_file_serializer (GdkContentSerializer *serializer)
{
- GFile *file;
- const GValue *value;
GPtrArray *files;
+ const GValue *value;
files = g_ptr_array_new_with_free_func (g_free);
@@ -358,9 +360,24 @@ portal_file_serializer (GdkContentSerializer *serializer)
if (G_VALUE_HOLDS (value, G_TYPE_FILE))
{
+ GFile *file;
+
file = g_value_get_object (gdk_content_serializer_get_value (serializer));
- if (file)
- g_ptr_array_add (files, g_file_get_path (file));
+
+ if (file && g_file_peek_path (file))
+ {
+ GDK_DEBUG (DND, "file transfer portal: Adding %s", g_file_peek_path (file));
+ g_ptr_array_add (files, g_file_get_path (file));
+ }
+#ifdef G_ENABLE_DEBUG
+ else if (GDK_DEBUG_CHECK (DND))
+ {
+ char *uri = g_file_get_uri (file);
+ gdk_debug_message ("file transfer portal: %s has no path, dropping\n", uri);
+ g_free (uri);
+ }
+#endif
+
g_ptr_array_add (files, NULL);
}
else if (G_VALUE_HOLDS (value, GDK_TYPE_FILE_LIST))
@@ -368,7 +385,21 @@ portal_file_serializer (GdkContentSerializer *serializer)
GSList *l;
for (l = g_value_get_boxed (value); l; l = l->next)
- g_ptr_array_add (files, g_file_get_path (l->data));
+ {
+ GFile *file = l->data;
+
+ if (file && g_file_peek_path (file))
+ {
+ GDK_DEBUG (DND, "file transfer portal: Adding %s", g_file_peek_path (file));
+ g_ptr_array_add (files, g_file_get_path (file));
+ }
+ else
+ {
+ char *uri = g_file_get_uri (file);
+ gdk_debug_message ("file transfer portal: %s has no path, dropping", uri);
+ g_free (uri);
+ }
+ }
g_ptr_array_add (files, NULL);
}
@@ -395,6 +426,15 @@ portal_finish (GObject *object,
return;
}
+#ifdef G_ENABLE_DEBUG
+ if (GDK_DEBUG_CHECK (DND))
+ {
+ char *s = g_strjoinv (", ", files);
+ gdk_debug_message ("file transfer portal: Receiving files: %s", s);
+ g_free (s);
+ }
+#endif
+
value = gdk_content_deserializer_get_value (deserializer);
if (G_VALUE_HOLDS (value, G_TYPE_FILE))
{
diff --git a/gtk/gtkdragicon.c b/gtk/gtkdragicon.c
index 67d2b4b0d1..3d684ecfbc 100644
--- a/gtk/gtkdragicon.c
+++ b/gtk/gtkdragicon.c
@@ -555,6 +555,9 @@ gtk_drag_icon_create_widget_for_value (const GValue *value)
GtkWidget *image;
info = g_file_query_info (G_FILE (g_value_get_object (value)), "standard::icon", 0, NULL, NULL);
+ if (!info)
+ return NULL;
+
image = gtk_image_new_from_gicon (g_file_info_get_icon (info));
gtk_widget_add_css_class (image, "large-icons");
g_object_unref (info);