diff --git a/uppsrc/CtrlCore/GtkDnD.cpp b/uppsrc/CtrlCore/GtkDnD.cpp index 65d5409e6..08c357dcc 100644 --- a/uppsrc/CtrlCore/GtkDnD.cpp +++ b/uppsrc/CtrlCore/GtkDnD.cpp @@ -197,24 +197,24 @@ void Ctrl::DndTargets(GdkDragContext *context) for(GList *list = gdk_drag_context_list_targets(context); list; list = g_list_next (list)) { String g = gdk_atom_name((GdkAtom)list->data); if(text_targets.Find(g) >= 0) { - dnd_targets.Add("text"); + dnd_targets.FindAdd("text"); if(dnd_text_target.IsEmpty()) dnd_text_target = g; } else if(image_targets.Find(g) >= 0) { - dnd_targets.Add("image"); + dnd_targets.FindAdd("image"); if(dnd_image_target.IsEmpty()) dnd_image_target = g; } else if(files_targets.Find(g) >= 0) { - dnd_targets.Add("files"); + dnd_targets.FindAdd("files"); if(dnd_files_target.IsEmpty()) dnd_files_target = g; } else - dnd_targets.Add(g); + dnd_targets.FindAdd(g); } } @@ -222,7 +222,6 @@ void Ctrl::GtkDragDataReceived(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, guint info, guint time, gpointer user_data) { - LLOG("GtkDragDataReceived " << dnd_data_fmt); dnd_data_wait = false; if(dnd_data_fmt == "text") { guchar *s = gtk_selection_data_get_text(data); @@ -230,13 +229,29 @@ void Ctrl::GtkDragDataReceived(GtkWidget *widget, GdkDragContext *context, dnd_data = (const char *)s; g_free(s); } + else // seems gtk_selection_data_get_text sometime does not work as expected + if(findarg(ToUpper(gdk_atom_name(gtk_selection_data_get_data_type(data))), "TEXT", "UTF8_STRING") >= 0) + dnd_data = GtkDataGet(data); } else if(dnd_data_fmt == "image") dnd_data = ImageClipFromPixbufUnref(gtk_selection_data_get_pixbuf(data)); else - if(dnd_data_fmt == "files") - dnd_data = FilesClipFromUrisFree(gtk_selection_data_get_uris(data)); + if(dnd_data_fmt == "files") { + gchar **uris = gtk_selection_data_get_uris(data); + if(uris) + dnd_data = FilesClipFromUrisFree(uris); + else { + dnd_data.Clear(); + String s = GtkDataGet(data); + StringStream ss(s); + while(!ss.IsEof()) { + String l = ss.GetLine(); + if(l.StartsWith("file://")) + dnd_data << l << "\n"; + } + } + } else dnd_data = GtkDataGet(data); }