GtkFileChooserDefault *impl;
GtkFilePath *path;
gboolean keep_trail;
+ GtkFilePath *original_path;
+ GError *original_error;
};
static void
if (error)
{
- error_changing_folder_dialog (impl, data->path, g_error_copy (error));
- goto out;
+ GtkFilePath *parent_path;
+
+ if (!data->original_path)
+ {
+ data->original_path = gtk_file_path_copy (data->path);
+ data->original_error = g_error_copy (error);
+ }
+
+ /* get parent path and try to change the folder to that */
+ if (gtk_file_system_get_parent (impl->file_system, data->path, &parent_path, NULL) &&
+ parent_path != NULL)
+ {
+ gtk_file_path_free (data->path);
+ data->path = parent_path;
+
+ g_object_unref (handle);
+
+ /* restart the update current folder operation */
+ impl->reload_state = RELOAD_HAS_FOLDER;
+
+ impl->update_current_folder_handle =
+ gtk_file_system_get_info (impl->file_system, data->path,
+ GTK_FILE_INFO_IS_FOLDER,
+ update_current_folder_get_info_cb,
+ data);
+
+ set_busy_cursor (impl, TRUE);
+
+ return;
+ }
+ else
+ {
+ /* error and bail out */
+ error_changing_folder_dialog (impl, data->original_path, data->original_error);
+
+ gtk_file_path_free (data->original_path);
+
+ goto out;
+ }
+ }
+
+ if (data->original_path)
+ {
+ error_changing_folder_dialog (impl, data->original_path, data->original_error);
+
+ gtk_file_path_free (data->original_path);
}
if (!gtk_file_info_get_is_folder (info))
g_object_unref (handle);
}
-struct SaveEntryData
+struct FileExistsData
{
GtkFileChooserDefault *impl;
gboolean file_exists_and_is_not_folder;
{
gboolean parent_is_folder;
gboolean cancelled = handle->cancelled;
- struct SaveEntryData *data = user_data;
+ struct FileExistsData *data = user_data;
if (handle != data->impl->should_respond_get_info_handle)
goto out;
g_object_unref (handle);
}
+static void
+file_exists_get_info_cb (GtkFileSystemHandle *handle,
+ const GtkFileInfo *info,
+ const GError *error,
+ gpointer user_data)
+{
+ gboolean data_ownership_taken = FALSE;
+ gboolean cancelled = handle->cancelled;
+ gboolean file_exists_and_is_not_folder;
+ struct FileExistsData *data = user_data;
+
+ if (handle != data->impl->file_exists_get_info_handle)
+ goto out;
+
+ data->impl->file_exists_get_info_handle = NULL;
+
+ set_busy_cursor (data->impl, FALSE);
+
+ if (cancelled)
+ goto out;
+
+ file_exists_and_is_not_folder = info && !gtk_file_info_get_is_folder (info);
+
+ if (data->impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
+ /* user typed a filename; we are done */
+ g_signal_emit_by_name (data->impl, "response-requested");
+ else if (data->impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
+ && file_exists_and_is_not_folder)
+ {
+ /* Oops, the user typed the name of an existing path which is not
+ * a folder
+ */
+ error_creating_folder_over_existing_file_dialog (data->impl, data->path,
+ g_error_copy (error));
+ }
+ else
+ {
+ /* check that everything up to the last component exists */
+
+ data->file_exists_and_is_not_folder = file_exists_and_is_not_folder;
+ data_ownership_taken = TRUE;
+
+ if (data->impl->should_respond_get_info_handle)
+ gtk_file_system_cancel_operation (data->impl->should_respond_get_info_handle);
+
+ data->impl->should_respond_get_info_handle =
+ gtk_file_system_get_info (data->impl->file_system,
+ data->parent_path,
+ GTK_FILE_INFO_IS_FOLDER,
+ save_entry_get_info_cb,
+ data);
+ set_busy_cursor (data->impl, TRUE);
+ }
+
+out:
+ if (!data_ownership_taken)
+ {
+ g_object_unref (data->impl);
+ gtk_file_path_free (data->path);
+ gtk_file_path_free (data->parent_path);
+ g_free (data);
+ }
+
+ g_object_unref (handle);
+}
+
static void
paste_text_received (GtkClipboard *clipboard,
const gchar *text,
}
else
{
- gboolean file_exists_and_is_not_folder;
-
- file_exists_and_is_not_folder = g_error_matches (error, GTK_FILE_SYSTEM_ERROR, GTK_FILE_SYSTEM_ERROR_NOT_FOLDER);
-
- if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
- retval = TRUE; /* user typed a filename; we are done */
- else if (impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER && file_exists_and_is_not_folder)
- {
- /* Oops, the user typed the name of an existing path which is not a folder */
- error_creating_folder_over_existing_file_dialog (impl, path, error);
- error = NULL; /* as it will be freed below for the general case */
- retval = FALSE;
- }
- else
- {
- GtkFilePath *parent_path;
- struct SaveEntryData *data;
-
- /* check that everything up to the last component exists */
+ struct FileExistsData *data;
- parent_path = gtk_file_path_copy (_gtk_file_chooser_entry_get_current_folder (entry));
+ /* We need to check whether path exists and is not a folder */
- data = g_new0 (struct SaveEntryData, 1);
- data->impl = g_object_ref (impl);
- data->file_exists_and_is_not_folder = file_exists_and_is_not_folder;
- data->parent_path = parent_path; /* Takes ownership */
- data->path = gtk_file_path_copy (path);
+ data = g_new0 (struct FileExistsData, 1);
+ data->impl = g_object_ref (impl);
+ data->path = gtk_file_path_copy (path);
+ data->parent_path = gtk_file_path_copy (_gtk_file_chooser_entry_get_current_folder (entry));
- if (impl->should_respond_get_info_handle)
- gtk_file_system_cancel_operation (impl->should_respond_get_info_handle);
+ if (impl->file_exists_get_info_handle)
+ gtk_file_system_cancel_operation (impl->file_exists_get_info_handle);
- impl->should_respond_get_info_handle =
- gtk_file_system_get_info (impl->file_system, parent_path,
- GTK_FILE_INFO_IS_FOLDER,
- save_entry_get_info_cb,
- data);
- set_busy_cursor (impl, TRUE);
+ impl->file_exists_get_info_handle =
+ gtk_file_system_get_info (impl->file_system, path,
+ GTK_FILE_INFO_IS_FOLDER,
+ file_exists_get_info_cb,
+ data);
- retval = FALSE;
- }
+ set_busy_cursor (impl, TRUE);
+ retval = FALSE;
if (error != NULL)
g_error_free (error);
return GTK_TREE_MODEL (model);
}
-
-#define __GTK_FILE_CHOOSER_DEFAULT_C__
-#include "gtkaliasdef.c"