void caja_restore_files_from_trash (GList *files, GtkWindow *parent_window) { CajaFile *file, *original_dir; GHashTable *original_dirs_hash; GList *original_dirs, *unhandled_files; GFile *original_dir_location; GList *locations, *l; char *message, *file_name; original_dirs_hash = caja_trashed_files_get_original_directories (files, &unhandled_files); for (l = unhandled_files; l != NULL; l = l->next) { file = CAJA_FILE (l->data); file_name = caja_file_get_display_name (file); message = g_strdup_printf (_("Could not determine original location of \"%s\" "), file_name); g_free (file_name); eel_show_warning_dialog (message, _("The item cannot be restored from trash"), parent_window); g_free (message); } if (original_dirs_hash != NULL) { original_dirs = g_hash_table_get_keys (original_dirs_hash); for (l = original_dirs; l != NULL; l = l->next) { original_dir = CAJA_FILE (l->data); original_dir_location = caja_file_get_location (original_dir); files = g_hash_table_lookup (original_dirs_hash, original_dir); locations = locations_from_file_list (files); caja_file_operations_move (locations, NULL, original_dir_location, parent_window, NULL, NULL); g_list_free_full (locations, g_object_unref); g_object_unref (original_dir_location); } g_list_free (original_dirs); g_hash_table_destroy (original_dirs_hash); } caja_file_list_unref (unhandled_files); }
static void diff_button_clicked_cb (GtkButton *w, CajaFileConflictDialog *dialog) { CajaFileConflictDialogPrivate *details; details = dialog->details; GError *error; char *command; command = g_find_program_in_path ("meld"); if (command) { char **argv; argv = g_new (char *, 4); argv[0] = command; argv[1] = g_file_get_path (caja_file_get_location (details->source)); argv[2] = g_file_get_path (caja_file_get_location (details->destination)); argv[3] = NULL; error = NULL; if (!g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL /* user_data */, NULL, NULL, NULL, NULL, &error)) { g_warning ("Error opening meld to show differences: %s\n", error->message); g_error_free (error); } g_strfreev (argv); } }
static void xdg_dir_changed (CajaFile *file, XdgDirEntry *dir) { GFile *location, *dir_location; char *path; location = caja_file_get_location (file); dir_location = g_file_new_for_path (dir->path); if (!g_file_equal (location, dir_location)) { path = g_file_get_path (location); if (path) { char *argv[5]; int i; g_free (dir->path); dir->path = path; i = 0; argv[i++] = "xdg-user-dirs-update"; argv[i++] = "--set"; argv[i++] = dir->type; argv[i++] = dir->path; argv[i++] = NULL; /* We do this sync, to avoid possible race-conditions if multiple dirs change at the same time. Its blocking the main thread, but these updates should be very rare and very fast. */ g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, NULL, NULL, NULL, NULL); g_reload_user_special_dirs_cache (); schedule_user_dirs_changed (); desktop_dir_changed (); /* Icon might have changed */ caja_file_invalidate_attributes (file, CAJA_FILE_ATTRIBUTE_INFO); } } g_object_unref (location); g_object_unref (dir_location); }
static GList * locations_from_file_list (GList *file_list) { CajaFile *file; GList *l, *ret; ret = NULL; for (l = file_list; l != NULL; l = l->next) { file = CAJA_FILE (l->data); ret = g_list_prepend (ret, caja_file_get_location (file)); } return g_list_reverse (ret); }