32 #include "drag_and_drop.h"
34 static void dnd_data_received(GtkWidget *window, GdkDragContext *drag_context,
35 gint x, gint y, GtkSelectionData *data, guint info, guint time,
36 gboolean discard_data_files, gboolean discard_audio_files,
37 gboolean single_file_mode,
ui_state *ui);
39 static void dnd_data_received_data_files(GtkWidget *window,
40 GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info,
43 dnd_data_received(window, drag_context, x, y, data, info, time, FALSE, TRUE, TRUE, ui);
46 static void dnd_data_received_batch_mode_audio_files(GtkWidget *window,
47 GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info,
50 dnd_data_received(window, drag_context, x, y, data, info, time, TRUE, FALSE, FALSE, ui);
53 static void dnd_data_received_single_mode_audio_files(GtkWidget *window,
54 GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info,
57 dnd_data_received(window, drag_context, x, y, data, info, time, TRUE, FALSE, TRUE, ui);
60 static void dnd_data_received_single_mode_audio_and_data_files(GtkWidget *window,
61 GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info,
64 dnd_data_received(window, drag_context, x, y, data, info, time, FALSE, FALSE, TRUE, ui);
67 void dnd_add_drag_data_received_to_widget(GtkWidget *widget, drop_type type,
ui_state *ui)
69 gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_ALL, drop_types, 3,
70 GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
74 case DND_SINGLE_MODE_AUDIO_FILE:
75 g_signal_connect(G_OBJECT(widget),
"drag-data-received",
76 G_CALLBACK(dnd_data_received_single_mode_audio_files), ui);
78 case DND_BATCH_MODE_AUDIO_FILES:
79 g_signal_connect(G_OBJECT(widget),
"drag-data-received",
80 G_CALLBACK(dnd_data_received_batch_mode_audio_files), ui);
83 g_signal_connect(G_OBJECT(widget),
"drag-data-received",
84 G_CALLBACK(dnd_data_received_data_files), ui);
86 case DND_SINGLE_MODE_AUDIO_FILE_AND_DATA_FILES:
87 g_signal_connect(G_OBJECT(widget),
"drag-data-received",
88 G_CALLBACK(dnd_data_received_single_mode_audio_and_data_files), ui);
95 static void dnd_data_received(GtkWidget *window, GdkDragContext *drag_context,
96 gint x, gint y, GtkSelectionData *data, guint info, guint time,
97 gboolean discard_data_files, gboolean discard_audio_files,
98 gboolean single_file_mode,
ui_state *ui)
100 gchar **drop_filenames = gtk_selection_data_get_uris(data);
101 if (drop_filenames == NULL)
103 const gchar *received_data = (gchar *)gtk_selection_data_get_text(data);
104 if (received_data == NULL)
109 drop_filenames = g_strsplit(received_data,
"\n", 0);
112 GSList *filenames = NULL;
114 gint current_index = 0;
115 gchar *current_filename = drop_filenames[current_index];
116 while (current_filename != NULL)
118 gchar *filename = NULL;
119 if (strstr(current_filename,
"file:") == current_filename)
121 filename = g_filename_from_uri(current_filename, NULL, NULL);
125 filename = g_strdup(current_filename);
132 gchar *ext = strrchr(filename,
'.');
133 GString *ext_str = g_string_new(ext);
134 g_string_ascii_up(ext_str);
135 if ((strstr(ext_str->str,
".MP3") != NULL) ||
136 (strstr(ext_str->str,
".OGG") != NULL))
138 filenames = g_slist_append(filenames, filename);
140 else if (!discard_data_files)
144 g_string_free(ext_str, FALSE);
148 filenames = g_slist_append(filenames, filename);
156 current_filename = drop_filenames[current_index];
158 g_strfreev(drop_filenames);
160 if (filenames == NULL)
165 if (g_slist_length(filenames) == 0)
167 g_slist_free(filenames);
171 if (discard_audio_files)
173 g_slist_foreach(filenames, (GFunc)g_free, NULL);
174 g_slist_free(filenames);
179 if (single_file_mode)
181 GSList *last_filename = g_slist_last(filenames);
184 g_slist_foreach(filenames, (GFunc)g_free, NULL);
185 g_slist_free(filenames);
189 import_files_to_batch_and_free(filenames, ui);