[file-roller] fixed dnd from the folder tree
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [file-roller] fixed dnd from the folder tree
- Date: Sun, 27 Oct 2013 12:28:06 +0000 (UTC)
commit 2a64f638ece9a7c8a72ff298dbf36b71ee673413
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sun Oct 27 13:10:49 2013 +0100
fixed dnd from the folder tree
src/dlg-ask-password.c | 1 +
src/fr-window.c | 226 +++++++++++++++++++++++++++++++-----------------
src/fr-window.h | 2 +
src/glib-utils.c | 3 +
4 files changed, 154 insertions(+), 78 deletions(-)
---
diff --git a/src/dlg-ask-password.c b/src/dlg-ask-password.c
index a307ce4..132e353 100644
--- a/src/dlg-ask-password.c
+++ b/src/dlg-ask-password.c
@@ -80,6 +80,7 @@ ask_password__response_cb (GtkWidget *dialog,
break;
default:
+ fr_window_dnd_extraction_finished (data->window, TRUE);
if (fr_window_is_batch_mode (data->window))
gtk_widget_destroy (GTK_WIDGET (data->window));
else
diff --git a/src/fr-window.c b/src/fr-window.c
index 29b6a6a..78c9fda 100644
--- a/src/fr-window.c
+++ b/src/fr-window.c
@@ -4203,8 +4203,10 @@ fr_window_drag_data_received (GtkWidget *widget,
static gboolean
-file_list_drag_begin (GtkWidget *widget,
+tree_view_drag_begin (GtkWidget *widget,
GdkDragContext *context,
+ GtkTreeModel *tree_model,
+ int filename_column,
gpointer data)
{
FrWindow *window = data;
@@ -4226,13 +4228,13 @@ file_list_drag_begin (GtkWidget *widget,
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
selected_tree_paths = gtk_tree_selection_get_selected_rows (selection, NULL);
- if (gtk_tree_model_get_iter (GTK_TREE_MODEL (window->priv->list_store),
+ if (gtk_tree_model_get_iter (tree_model,
&iter,
(GtkTreePath *) selected_tree_paths->data))
{
- gtk_tree_model_get (GTK_TREE_MODEL (window->priv->list_store),
+ gtk_tree_model_get (tree_model,
&iter,
- TREE_COLUMN_NAME, &xds_filename,
+ filename_column, &xds_filename,
-1);
}
else
@@ -4251,6 +4253,34 @@ file_list_drag_begin (GtkWidget *widget,
}
+static gboolean
+file_list_drag_begin (GtkWidget *widget,
+ GdkDragContext *context,
+ gpointer data)
+{
+ FrWindow *window = data;
+ return tree_view_drag_begin (widget,
+ context,
+ GTK_TREE_MODEL (window->priv->list_store),
+ COLUMN_NAME,
+ data);
+}
+
+
+static gboolean
+folde_tree_drag_begin (GtkWidget *widget,
+ GdkDragContext *context,
+ gpointer data)
+{
+ FrWindow *window = data;
+ return tree_view_drag_begin (widget,
+ context,
+ GTK_TREE_MODEL (window->priv->tree_store),
+ TREE_COLUMN_NAME,
+ data);
+}
+
+
static void
file_list_drag_end (GtkWidget *widget,
GdkDragContext *context,
@@ -4364,6 +4394,70 @@ get_selection_data_from_clipboard_data (FrWindow *window,
}
+/* -- wait_dnd_extraction -- */
+
+
+typedef struct {
+ FrWindow *window;
+ GMainLoop *loop;
+} DndWaitInfo;
+
+
+static gboolean
+extraction_is_finished (gpointer *data)
+{
+ DndWaitInfo *wait_info;
+ wait_info = (DndWaitInfo *) data;
+
+ return wait_info->window->priv->dnd_extract_is_running;
+}
+
+
+static void
+notify_extraction_finished (gpointer *data)
+{
+ DndWaitInfo *wait_info;
+ wait_info = (DndWaitInfo *) data;
+
+ if (g_main_loop_is_running (wait_info->loop))
+ g_main_loop_quit (wait_info->loop);
+}
+
+
+static void
+wait_dnd_extraction (FrWindow *window)
+{
+ window->priv->dnd_extract_is_running = TRUE;
+ window->priv->dnd_extract_finished_with_error = FALSE;
+ fr_window_archive_extract (window,
+ window->priv->drag_file_list,
+ window->priv->drag_destination_folder,
+ window->priv->drag_base_dir,
+ FALSE,
+ FR_OVERWRITE_ASK,
+ FALSE,
+ FALSE);
+
+ DndWaitInfo wait_info = { NULL, NULL };
+ wait_info.loop = g_main_loop_new (NULL, FALSE);
+ wait_info.window = window;
+ g_timeout_add_full (G_PRIORITY_DEFAULT,
+ 500,
+ (GSourceFunc) extraction_is_finished,
+ &wait_info,
+ (GDestroyNotify) notify_extraction_finished);
+
+ gdk_threads_leave ();
+ g_main_loop_run (wait_info.loop);
+ gdk_threads_enter ();
+
+ g_main_loop_unref (wait_info.loop);
+ wait_info.loop = NULL;
+ wait_info.window = NULL;
+ window->priv->dnd_extract_is_running = FALSE;
+}
+
+
static gboolean
fr_window_folder_tree_drag_data_get (GtkWidget *widget,
GdkDragContext *context,
@@ -4377,6 +4471,7 @@ fr_window_folder_tree_drag_data_get (GtkWidget *widget,
char *uri;
GFile *destination;
GFile *destination_folder;
+ char *xds_response;
debug (DEBUG_INFO, "::DragDataGet -->\n");
@@ -4431,19 +4526,29 @@ fr_window_folder_tree_drag_data_get (GtkWidget *widget,
}
if (window->priv->drag_error == NULL) {
+ char *selected_folder;
+
_g_object_unref (window->priv->drag_destination_folder);
g_free (window->priv->drag_base_dir);
_g_string_list_free (window->priv->drag_file_list);
window->priv->drag_destination_folder = g_object_ref (destination_folder);
- window->priv->drag_base_dir = fr_window_get_selected_folder_in_tree_view (window);
+ selected_folder = fr_window_get_selected_folder_in_tree_view (window);
+ window->priv->drag_base_dir = _g_path_remove_level (selected_folder);
window->priv->drag_file_list = file_list;
+
+ wait_dnd_extraction (window);
+
+ g_free (selected_folder);
}
g_object_unref (destination_folder);
/* sends back the response */
- gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data), 8, (guchar *)
((window->priv->drag_error == NULL) ? "S" : "E"), 1);
+ xds_response = ((window->priv->drag_error == NULL && !window->priv->dnd_extract_finished_with_error)
? "S" : "E");
+ gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data), 8, (guchar *)
xds_response, 1);
+
+ window->priv->dnd_extract_finished_with_error = FALSE;
debug (DEBUG_INFO, "::DragDataGet <--\n");
@@ -4451,33 +4556,6 @@ fr_window_folder_tree_drag_data_get (GtkWidget *widget,
}
-typedef struct {
- FrWindow *window;
- GMainLoop *loop;
-} DndWaitInfo;
-
-
-static gboolean
-extraction_is_finished (gpointer *data)
-{
- DndWaitInfo *wait_info;
- wait_info = (DndWaitInfo *) data;
-
- return wait_info->window->priv->dnd_extract_is_running;
-}
-
-
-static void
-notify_extraction_finished (gpointer *data)
-{
- DndWaitInfo *wait_info;
- wait_info = (DndWaitInfo *) data;
-
- if (g_main_loop_is_running (wait_info->loop))
- g_main_loop_quit (wait_info->loop);
-}
-
-
gboolean
fr_window_file_list_drag_data_get (FrWindow *window,
GdkDragContext *context,
@@ -4550,34 +4628,7 @@ fr_window_file_list_drag_data_get (FrWindow *window,
window->priv->drag_base_dir = g_strdup (fr_window_get_current_location (window));
window->priv->drag_file_list = fr_window_get_file_list_from_path_list (window, path_list,
NULL);
- window->priv->dnd_extract_is_running = TRUE;
- window->priv->dnd_extract_finished_with_error = FALSE;
- fr_window_archive_extract (window,
- window->priv->drag_file_list,
- window->priv->drag_destination_folder,
- window->priv->drag_base_dir,
- FALSE,
- FR_OVERWRITE_ASK,
- FALSE,
- FALSE);
-
- DndWaitInfo wait_info = { NULL, NULL };
- wait_info.loop = g_main_loop_new (NULL, FALSE);
- wait_info.window = window;
- g_timeout_add_full (G_PRIORITY_DEFAULT,
- 500,
- (GSourceFunc) extraction_is_finished,
- &wait_info,
- (GDestroyNotify) notify_extraction_finished);
-
- gdk_threads_leave ();
- g_main_loop_run (wait_info.loop);
- gdk_threads_enter ();
-
- g_main_loop_unref (wait_info.loop);
- wait_info.loop = NULL;
- wait_info.window = NULL;
- window->priv->dnd_extract_is_running = FALSE;
+ wait_dnd_extraction (window);
}
g_object_unref (destination_folder);
@@ -5738,7 +5789,7 @@ fr_window_construct (FrWindow *window)
g_signal_connect (G_OBJECT (window->priv->tree_view),
"drag_begin",
- G_CALLBACK (file_list_drag_begin),
+ G_CALLBACK (folde_tree_drag_begin),
window);
g_signal_connect (G_OBJECT (window->priv->tree_view),
"drag_end",
@@ -6564,11 +6615,8 @@ archive_extraction_ready_cb (GObject *source_object,
fr_archive_operation_finish (FR_ARCHIVE (source_object), result, &error);
_archive_operation_completed (window, FR_ACTION_EXTRACTING_FILES, error);
-
- if (window->priv->dnd_extract_is_running == TRUE) {
- window->priv->dnd_extract_is_running = FALSE;
- window->priv->dnd_extract_finished_with_error = error != NULL;
- }
+ if ((error == NULL) || (error->code != FR_ERROR_ASK_PASSWORD))
+ fr_window_dnd_extraction_finished (window, error != NULL);
if ((error == NULL) && ask_to_open_destination) {
window->priv->quit_with_progress_dialog = window->priv->batch_mode;
@@ -6620,6 +6668,19 @@ _fr_window_archive_extract_from_edata (FrWindow *window,
static void _fr_window_ask_overwrite_dialog (OverwriteData *odata);
+/* remove the file from the list to extract */
+static void
+overwrite_data_skip_current (OverwriteData *odata)
+{
+ GList *next = odata->current_file->next;
+
+ odata->edata->file_list = g_list_remove_link (odata->edata->file_list, odata->current_file);
+ _g_string_list_free (odata->current_file);
+ odata->current_file = next;
+ odata->extract_all = FALSE;
+}
+
+
static void
overwrite_dialog_response_cb (GtkDialog *dialog,
int response_id,
@@ -6638,15 +6699,7 @@ overwrite_dialog_response_cb (GtkDialog *dialog,
break;
case _FR_RESPONSE_OVERWRITE_NO:
- {
- /* remove the file from the list to extract */
- GList *next = odata->current_file->next;
-
- odata->edata->file_list = g_list_remove_link (odata->edata->file_list,
odata->current_file);
- _g_string_list_free (odata->current_file);
- odata->current_file = next;
- odata->extract_all = FALSE;
- }
+ overwrite_data_skip_current (odata);
break;
case GTK_RESPONSE_DELETE_EVENT:
@@ -6755,8 +6808,11 @@ _fr_window_ask_overwrite_dialog (OverwriteData *odata)
return;
}
- else
- perform_extraction = FALSE;
+ else {
+ overwrite_data_skip_current (odata);
+ _fr_window_ask_overwrite_dialog (odata);
+ return;
+ }
}
if (odata->edata->file_list == NULL)
@@ -6787,6 +6843,7 @@ _fr_window_ask_overwrite_dialog (OverwriteData *odata)
fr_window_show_error_dialog (odata->window, d, GTK_WINDOW (odata->window), _("Extraction not
performed"));
fr_window_stop_batch (odata->window);
+ fr_window_dnd_extraction_finished (odata->window, TRUE);
}
g_free (odata);
@@ -6911,6 +6968,7 @@ fr_window_archive_extract (FrWindow *window,
g_clear_error (&error);
fr_window_show_error_dialog (window, d, GTK_WINDOW (window), details);
fr_window_stop_batch (window);
+ fr_window_dnd_extraction_finished (window, TRUE);
g_free (details);
@@ -6931,6 +6989,7 @@ fr_window_archive_extract (FrWindow *window,
gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK);
fr_window_show_error_dialog (window, d, GTK_WINDOW (window), _("Extraction not performed"));
fr_window_stop_batch (window);
+ fr_window_dnd_extraction_finished (window, TRUE);
return;
}
@@ -9801,3 +9860,14 @@ fr_window_set_batch__add (FrWindow *window,
NULL,
NULL);
}
+
+
+void
+fr_window_dnd_extraction_finished (FrWindow *window,
+ gboolean error)
+{
+ if (window->priv->dnd_extract_is_running == TRUE) {
+ window->priv->dnd_extract_is_running = FALSE;
+ window->priv->dnd_extract_finished_with_error = TRUE;
+ }
+}
diff --git a/src/fr-window.h b/src/fr-window.h
index daa6af7..16c54f8 100644
--- a/src/fr-window.h
+++ b/src/fr-window.h
@@ -319,5 +319,7 @@ gboolean fr_window_file_list_drag_data_get (FrWindow *window
GtkSelectionData *selection_data,
GList *path_list);
void fr_window_update_dialog_closed (FrWindow *window);
+void fr_window_dnd_extraction_finished (FrWindow *window,
+ gboolean error);
#endif /* FR_WINDOW_H */
diff --git a/src/glib-utils.c b/src/glib-utils.c
index f63824e..89255c4 100644
--- a/src/glib-utils.c
+++ b/src/glib-utils.c
@@ -1036,6 +1036,9 @@ sanitize_filename (const char *file_name)
size_t prefix_len;
char const *p;
+ if (file_name == NULL)
+ return NULL;
+
prefix_len = 0;
for (p = file_name; *p; ) {
if (ISDOT (p[0]) && ISDOT (p[1]) && (ISSLASH (p[2]) || !p[2]))
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]