+/* callback used to set data to clipboard */
+static void
+copy_file_get_cb (GtkClipboard *clipboard,
+ GtkSelectionData *selection_data,
+ guint info,
+ gpointer data)
+{
+ GSList *selected_files = data;
+
+ if (selected_files)
+ {
+ gint num_files = g_slist_length (selected_files);
+ gchar **uris;
+ gint i;
+ GSList *l;
+
+ uris = g_new (gchar *, num_files + 1);
+ uris[num_files] = NULL; /* null terminator */
+
+ i = 0;
+
+ for (l = selected_files; l; l = l->next)
+ {
+ GFile *file = (GFile *) l->data;
+
+ if (info == SELECTION_URI)
+ uris[i] = g_file_get_uri (file);
+ else /* if (info == SELECTION_TEXT) - let this be the fallback */
+ uris[i] = g_file_get_parse_name (file);
+
+ i++;
+ }
+
+ if (info == SELECTION_URI)
+ gtk_selection_data_set_uris (selection_data, uris);
+ else /* if (info == SELECTION_TEXT) - let this be the fallback */
+ {
+ char *str = g_strjoinv (" ", uris);
+ gtk_selection_data_set_text (selection_data, str, -1);
+ g_free (str);
+ }
+
+ g_strfreev (uris);
+ }
+}
+
+/* callback used to clear the clipboard data */
+static void
+copy_file_clear_cb (GtkClipboard *clipboard,
+ gpointer data)
+{
+ GSList *selected_files = data;
+
+ g_slist_foreach (selected_files, (GFunc) g_object_unref, NULL);
+ g_slist_free (selected_files);
+}
+
+/* Callback used when the "Copy file’s location" menu item is activated */
+static void
+copy_file_location_cb (GtkMenuItem *item,
+ GtkFileChooserDefault *impl)
+{
+ GSList *selected_files = NULL;
+
+ selected_files = search_get_selected_files (impl);
+
+ if (selected_files)
+ {
+ GtkClipboard *clipboard;
+ GtkTargetList *target_list;
+ GtkTargetEntry *targets;
+ int n_targets;
+
+ clipboard = gtk_widget_get_clipboard (GTK_WIDGET (impl), GDK_SELECTION_CLIPBOARD);
+
+ target_list = gtk_target_list_new (NULL, 0);
+ gtk_target_list_add_text_targets (target_list, SELECTION_TEXT);
+ gtk_target_list_add_uri_targets (target_list, SELECTION_URI);
+
+ targets = gtk_target_table_new_from_list (target_list, &n_targets);
+ gtk_target_list_unref (target_list);
+
+ gtk_clipboard_set_with_data (clipboard, targets, n_targets,
+ copy_file_get_cb,
+ copy_file_clear_cb,
+ selected_files);
+
+ gtk_target_table_free (targets, n_targets);
+ }
+}
+
+/* Callback used when the "Visit this file" menu item is activated */
+static void
+visit_file_cb (GtkMenuItem *item,
+ GtkFileChooserDefault *impl)
+{
+ GSList *files;
+
+ files = search_get_selected_files (impl);
+
+ /* Sigh, just use the first one */
+ if (files)
+ {
+ GFile *file = files->data;
+
+ gtk_file_chooser_default_select_file (GTK_FILE_CHOOSER (impl), file, NULL); /* NULL-GError */
+ }
+
+ g_slist_foreach (files, (GFunc) g_object_unref, NULL);
+ g_slist_free (files);
+}
+
+/* callback used when the "Show Hidden Files" menu item is toggled */