diff options
Diffstat (limited to 'src/fr-window.c')
-rw-r--r-- | src/fr-window.c | 834 |
1 files changed, 295 insertions, 539 deletions
diff --git a/src/fr-window.c b/src/fr-window.c index 9a30f5e..20ca551 100644 --- a/src/fr-window.c +++ b/src/fr-window.c @@ -103,14 +103,12 @@ static GtkTargetEntry folder_tree_targets[] = { { "XdndDirectSave0", 0, 2 } }; - typedef struct { FrBatchActionType type; void * data; GFreeFunc free_func; } FRBatchAction; - typedef struct { guint converting : 1; char *temp_dir; @@ -121,16 +119,15 @@ typedef struct { char *new_file; } FRConvertData; - typedef enum { FR_CLIPBOARD_OP_CUT, FR_CLIPBOARD_OP_COPY } FRClipboardOp; - typedef struct { GList *file_list; char *extract_to_dir; + char *sub_dir; char *base_dir; gboolean skip_older; FrOverwrite overwrite; @@ -140,7 +137,6 @@ typedef struct { gboolean ask_to_open_destination; } ExtractData; - typedef enum { FR_WINDOW_AREA_MENUBAR, FR_WINDOW_AREA_TOOLBAR, @@ -150,7 +146,6 @@ typedef enum { FR_WINDOW_AREA_STATUSBAR, } FrWindowArea; - typedef enum { DIALOG_RESPONSE_NONE = 1, DIALOG_RESPONSE_OPEN_ARCHIVE, @@ -159,10 +154,8 @@ typedef enum { DIALOG_RESPONSE_QUIT } DialogResponse; - /* -- FrClipboardData -- */ - typedef struct { int refs; char *archive_filename; @@ -174,7 +167,6 @@ typedef struct { char *current_dir; } FrClipboardData; - static FrClipboardData* fr_clipboard_data_new (void) { @@ -186,7 +178,6 @@ fr_clipboard_data_new (void) return data; } - static FrClipboardData * fr_clipboard_data_ref (FrClipboardData *clipboard_data) { @@ -194,7 +185,6 @@ fr_clipboard_data_ref (FrClipboardData *clipboard_data) return clipboard_data; } - static void fr_clipboard_data_unref (FrClipboardData *clipboard_data) { @@ -212,7 +202,6 @@ fr_clipboard_data_unref (FrClipboardData *clipboard_data) g_free (clipboard_data); } - static void fr_clipboard_data_set_password (FrClipboardData *clipboard_data, const char *password) @@ -223,7 +212,6 @@ fr_clipboard_data_set_password (FrClipboardData *clipboard_data, clipboard_data->archive_password = g_strdup (password); } - /**/ enum { @@ -327,7 +315,10 @@ struct _FrWindowPrivateData { FrArchive *copy_from_archive; - GtkActionGroup *actions; + GActionGroup *actions; + GtkBuilder *ui_manager; + GtkWidget *menubar_recentmenu; + GtkWidget *toolbar_recentmenu; GtkWidget *file_popup_menu; GtkWidget *folder_popup_menu; @@ -395,12 +386,12 @@ struct _FrWindowPrivateData { GtkWindow *load_error_parent_window; gboolean showing_error_dialog; GtkWindow *error_dialog_parent; -}; + gboolean close_dialog; +}; /* -- fr_window_free_private_data -- */ - static void fr_window_free_batch_data (FrWindow *window) { @@ -422,7 +413,6 @@ fr_window_free_batch_data (FrWindow *window) window->priv->batch_title = NULL; } - static void gh_unref_pixbuf (gpointer key, gpointer value, @@ -431,7 +421,6 @@ gh_unref_pixbuf (gpointer key, g_object_unref (value); } - static void fr_window_clipboard_remove_file_list (FrWindow *window, GList *file_list) @@ -472,7 +461,6 @@ fr_window_clipboard_remove_file_list (FrWindow *window, } } - static void fr_window_history_clear (FrWindow *window) { @@ -484,7 +472,6 @@ fr_window_history_clear (FrWindow *window) window->priv->last_location = NULL; } - static void fr_window_free_open_files (FrWindow *window) { @@ -501,7 +488,6 @@ fr_window_free_open_files (FrWindow *window) window->priv->open_files = NULL; } - static void fr_window_convert_data_free (FrWindow *window, gboolean all) @@ -529,7 +515,6 @@ fr_window_convert_data_free (FrWindow *window, } } - static void fr_window_free_private_data (FrWindow *window) { @@ -560,6 +545,7 @@ fr_window_free_private_data (FrWindow *window) g_free (window->priv->add_default_dir); g_free (window->priv->extract_default_dir); g_free (window->priv->archive_uri); + g_free (window->priv->working_archive); g_free (window->priv->password); g_free (window->priv->password_for_paste); @@ -622,8 +608,13 @@ fr_window_free_private_data (FrWindow *window) if (window->priv->settings_caja) _g_object_unref (window->priv->settings_caja); -} + if (window->priv->ui_manager) + { + g_object_unref (window->priv->ui_manager); + window->priv->ui_manager = NULL; + } +} static void fr_window_finalize (GObject *object) @@ -656,7 +647,6 @@ fr_window_finalize (GObject *object) G_OBJECT_CLASS (parent_class)->finalize (object); } - static gboolean close__step2 (gpointer data) { @@ -664,7 +654,6 @@ close__step2 (gpointer data) return FALSE; } - void fr_window_close (FrWindow *window) { @@ -693,7 +682,6 @@ fr_window_close (FrWindow *window) g_idle_add (close__step2, window); } - static void fr_window_class_init (FrWindowClass *class) { @@ -734,10 +722,8 @@ fr_window_class_init (FrWindowClass *class) gobject_class->finalize = fr_window_finalize; } - static void fr_window_update_paste_command_sensitivity (FrWindow *, GtkClipboard *); - static void clipboard_owner_change_cb (GtkClipboard *clipboard, GdkEvent *event, @@ -746,7 +732,6 @@ clipboard_owner_change_cb (GtkClipboard *clipboard, fr_window_update_paste_command_sensitivity ((FrWindow *) user_data, clipboard); } - static void fr_window_realized (GtkWidget *window, gpointer *data) @@ -760,7 +745,6 @@ fr_window_realized (GtkWidget *window, window); } - static void fr_window_unrealized (GtkWidget *window, gpointer *data) @@ -773,7 +757,6 @@ fr_window_unrealized (GtkWidget *window, window); } - static void fr_window_init (FrWindow *window) { @@ -799,7 +782,6 @@ fr_window_init (FrWindow *window) NULL); } - GType fr_window_get_type (void) { @@ -828,10 +810,8 @@ fr_window_get_type (void) return type; } - /* -- window history -- */ - #if 0 static void fr_window_history_print (FrWindow *window) @@ -847,7 +827,6 @@ fr_window_history_print (FrWindow *window) } #endif - static void fr_window_history_add (FrWindow *window, const char *path) @@ -886,7 +865,6 @@ fr_window_history_add (FrWindow *window, } } - static void fr_window_history_pop (FrWindow *window) { @@ -903,10 +881,8 @@ fr_window_history_pop (FrWindow *window) g_list_free (first); } - /* -- window_update_file_list -- */ - static GPtrArray * fr_window_get_current_dir_list (FrWindow *window) { @@ -926,7 +902,6 @@ fr_window_get_current_dir_list (FrWindow *window) return files; } - static gint sort_by_name (gconstpointer ptr1, gconstpointer ptr2) @@ -944,7 +919,6 @@ sort_by_name (gconstpointer ptr1, return strcmp (fdata1->sort_key, fdata2->sort_key); } - static gint sort_by_size (gconstpointer ptr1, gconstpointer ptr2) @@ -973,7 +947,6 @@ sort_by_size (gconstpointer ptr1, return -1; } - static gint sort_by_type (gconstpointer ptr1, gconstpointer ptr2) @@ -981,7 +954,7 @@ sort_by_type (gconstpointer ptr1, FileData *fdata1 = *((FileData **) ptr1); FileData *fdata2 = *((FileData **) ptr2); int result; - const char *desc1, *desc2; + char *desc1, *desc2; if (file_data_is_dir (fdata1) != file_data_is_dir (fdata2)) { if (file_data_is_dir (fdata1)) @@ -996,13 +969,15 @@ sort_by_type (gconstpointer ptr1, desc2 = g_content_type_get_description (fdata2->content_type); result = strcasecmp (desc1, desc2); + g_free (desc1); + g_free (desc2); + if (result == 0) return sort_by_name (ptr1, ptr2); else return result; } - static gint sort_by_time (gconstpointer ptr1, gconstpointer ptr2) @@ -1027,7 +1002,6 @@ sort_by_time (gconstpointer ptr1, return -1; } - static gint sort_by_path (gconstpointer ptr1, gconstpointer ptr2) @@ -1054,7 +1028,6 @@ sort_by_path (gconstpointer ptr1, return result; } - static guint64 get_dir_size (FrWindow *window, const char *current_dir, @@ -1081,7 +1054,6 @@ get_dir_size (FrWindow *window, return size; } - static gboolean file_data_respects_filter (FrWindow *window, FileData *fdata) @@ -1098,7 +1070,6 @@ file_data_respects_filter (FrWindow *window, return strncasecmp (fdata->name, filter, strlen (filter)) == 0; } - static gboolean compute_file_list_name (FrWindow *window, FileData *fdata, @@ -1157,7 +1128,6 @@ compute_file_list_name (FrWindow *window, return TRUE; } - static void fr_window_compute_list_names (FrWindow *window, GPtrArray *files) @@ -1198,7 +1168,6 @@ fr_window_compute_list_names (FrWindow *window, g_hash_table_destroy (names_hash); } - static gboolean fr_window_dir_exists_in_archive (FrWindow *window, const char *dir_name) @@ -1233,7 +1202,6 @@ fr_window_dir_exists_in_archive (FrWindow *window, return FALSE; } - static char * get_parent_dir (const char *current_dir) { @@ -1261,10 +1229,8 @@ get_parent_dir (const char *current_dir) return retval; } - static void fr_window_update_statusbar_list_info (FrWindow *window); - static GdkPixbuf * get_mime_type_icon (const char *mime_type) { @@ -1287,7 +1253,6 @@ get_mime_type_icon (const char *mime_type) return pixbuf; } - static GdkPixbuf * get_icon (FileData *fdata) { @@ -1301,7 +1266,6 @@ get_icon (FileData *fdata) return get_mime_type_icon (content_type); } - static GdkPixbuf * get_emblem (FileData *fdata) { @@ -1311,7 +1275,6 @@ get_emblem (FileData *fdata) return get_mime_type_icon ("emblem-nowrite"); } - static int get_column_from_sort_method (FrWindowSortMethod sort_method) { @@ -1328,7 +1291,6 @@ get_column_from_sort_method (FrWindowSortMethod sort_method) return COLUMN_NAME; } - static int get_sort_method_from_column (int column_id) { @@ -1345,7 +1307,6 @@ get_sort_method_from_column (int column_id) return FR_WINDOW_SORT_BY_NAME; } - static void add_selected_from_list_view (GtkTreeModel *model, GtkTreePath *path, @@ -1361,7 +1322,6 @@ add_selected_from_list_view (GtkTreeModel *model, *list = g_list_prepend (*list, fdata); } - static void add_selected_from_tree_view (GtkTreeModel *model, GtkTreePath *path, @@ -1377,7 +1337,6 @@ add_selected_from_tree_view (GtkTreeModel *model, *list = g_list_prepend (*list, dir_path); } - static void add_selected_fd (GtkTreeModel *model, GtkTreePath *path, @@ -1394,7 +1353,6 @@ add_selected_fd (GtkTreeModel *model, *list = g_list_prepend (*list, fdata); } - static GList * get_selection_as_fd (FrWindow *window) { @@ -1412,7 +1370,6 @@ get_selection_as_fd (FrWindow *window) return list; } - static void fr_window_update_statusbar_list_info (FrWindow *window) { @@ -1488,7 +1445,6 @@ fr_window_update_statusbar_list_info (FrWindow *window) g_free (info); } - static void fr_window_populate_file_list (FrWindow *window, GPtrArray *files) @@ -1560,7 +1516,7 @@ fr_window_populate_file_list (FrWindow *window, char *utf8_path; char *s_size; char *s_time; - const char *desc; + char *desc; utf8_path = g_filename_display_name (fdata->path); @@ -1583,6 +1539,7 @@ fr_window_populate_file_list (FrWindow *window, g_free (utf8_path); g_free (s_size); g_free (s_time); + g_free (desc); } g_free (utf8_name); if (icon != NULL) @@ -1599,7 +1556,6 @@ fr_window_populate_file_list (FrWindow *window, fr_window_stop_activity_mode (window); } - static int path_compare (gconstpointer a, gconstpointer b) @@ -1610,7 +1566,6 @@ path_compare (gconstpointer a, return strcmp (path_a, path_b); } - static gboolean get_tree_iter_from_path (FrWindow *window, const char *path, @@ -1647,19 +1602,17 @@ get_tree_iter_from_path (FrWindow *window, return result; } - static void set_sensitive (FrWindow *window, - const char *action_name, - gboolean sensitive) + const char *id, + gboolean sensitive) { - GtkAction *action; + GtkWidget *widget; - action = gtk_action_group_get_action (window->priv->actions, action_name); - g_object_set (action, "sensitive", sensitive, NULL); + widget = (GtkWidget *)gtk_builder_get_object (window->priv->ui_manager, id); + g_object_set (widget, "sensitive", sensitive, NULL); } - static void fr_window_update_current_location (FrWindow *window) { @@ -1676,10 +1629,10 @@ fr_window_update_current_location (FrWindow *window) gtk_entry_set_text (GTK_ENTRY (window->priv->location_entry), window->priv->archive_present? current_dir: ""); - set_sensitive (window, "GoBack", window->priv->archive_present && (current_dir != NULL) && (window->priv->history_current != NULL) && (window->priv->history_current->next != NULL)); - set_sensitive (window, "GoForward", window->priv->archive_present && (current_dir != NULL) && (window->priv->history_current != NULL) && (window->priv->history_current->prev != NULL)); - set_sensitive (window, "GoUp", window->priv->archive_present && (current_dir != NULL) && (strcmp (current_dir, "/") != 0)); - set_sensitive (window, "GoHome", window->priv->archive_present); + set_sensitive (window, "tool_goback_item", window->priv->archive_present && (current_dir != NULL) && (window->priv->history_current != NULL) && (window->priv->history_current->next != NULL)); + set_sensitive (window, "tool_gonext_item", window->priv->archive_present && (current_dir != NULL) && (window->priv->history_current != NULL) && (window->priv->history_current->prev != NULL)); + set_sensitive (window, "tool_goup_item", window->priv->archive_present && (current_dir != NULL) && (strcmp (current_dir, "/") != 0)); + set_sensitive (window, "tool_gohome_item", window->priv->archive_present); gtk_widget_set_sensitive (window->priv->location_entry, window->priv->archive_present); gtk_widget_set_sensitive (window->priv->location_label, window->priv->archive_present); gtk_widget_set_sensitive (window->priv->filter_entry, window->priv->archive_present); @@ -1703,7 +1656,6 @@ fr_window_update_current_location (FrWindow *window) g_free (path); } - static void fr_window_update_dir_tree (FrWindow *window) { @@ -1833,7 +1785,6 @@ fr_window_update_dir_tree (FrWindow *window) fr_window_update_current_location (window); } - static void fr_window_update_filter_bar_visibility (FrWindow *window) { @@ -1846,7 +1797,6 @@ fr_window_update_filter_bar_visibility (FrWindow *window) gtk_widget_show (window->priv->filter_bar); } - static void fr_window_update_file_list (FrWindow *window, gboolean update_view) @@ -1926,14 +1876,12 @@ fr_window_update_file_list (FrWindow *window, g_ptr_array_free (files, TRUE); } - void fr_window_update_list_order (FrWindow *window) { gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (window->priv->list_store), get_column_from_sort_method (window->priv->sort_method), window->priv->sort_type); } - static void fr_window_update_title (FrWindow *window) { @@ -1954,7 +1902,6 @@ fr_window_update_title (FrWindow *window) } } - static void check_whether_has_a_dir (GtkTreeModel *model, GtkTreePath *path, @@ -1971,7 +1918,6 @@ check_whether_has_a_dir (GtkTreeModel *model, *has_a_dir = TRUE; } - static gboolean selection_has_a_dir (FrWindow *window) { @@ -1992,19 +1938,17 @@ selection_has_a_dir (FrWindow *window) return has_a_dir; } - static void set_active (FrWindow *window, const char *action_name, gboolean is_active) { - GtkAction *action; + GAction *action; - action = gtk_action_group_get_action (window->priv->actions, action_name); - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), is_active); + action = g_action_map_lookup_action (G_ACTION_MAP (window->priv->actions), action_name); + g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (is_active)); } - static void fr_window_update_paste_command_sensitivity (FrWindow *window, GtkClipboard *clipboard) @@ -2024,10 +1968,11 @@ fr_window_update_paste_command_sensitivity (FrWindow *window, ro = ! no_archive && window->archive->read_only; compr_file = ! no_archive && window->archive->is_compressed_file; - set_sensitive (window, "Paste", ! no_archive && ! ro && ! running && ! compr_file && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT) && gtk_clipboard_wait_is_target_available (clipboard, FR_SPECIAL_URI_LIST)); + set_sensitive (window, "paste_item", ! no_archive && ! ro && ! running && ! compr_file && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT) && gtk_clipboard_wait_is_target_available (clipboard, FR_SPECIAL_URI_LIST)); + set_sensitive (window, "popup_paste_item", ! no_archive && ! ro && ! running && ! compr_file && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT) && gtk_clipboard_wait_is_target_available (clipboard, FR_SPECIAL_URI_LIST)); + set_sensitive (window, "popup_paste_item1", ! no_archive && ! ro && ! running && ! compr_file && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT) && gtk_clipboard_wait_is_target_available (clipboard, FR_SPECIAL_URI_LIST)); } - static void fr_window_update_sensitivity (FrWindow *window) { @@ -2054,36 +1999,44 @@ fr_window_update_sensitivity (FrWindow *window) one_file_selected = n_selected == 1; dir_selected = selection_has_a_dir (window); - set_sensitive (window, "AddFiles", ! no_archive && ! ro && ! running && ! compr_file); - set_sensitive (window, "AddFiles_Toolbar", ! no_archive && ! ro && ! running && ! compr_file); - set_sensitive (window, "AddFolder", ! no_archive && ! ro && ! running && ! compr_file); - set_sensitive (window, "AddFolder_Toolbar", ! no_archive && ! ro && ! running && ! compr_file); - set_sensitive (window, "Copy", ! no_archive && ! ro && ! running && ! compr_file && sel_not_null && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT)); - set_sensitive (window, "Cut", ! no_archive && ! ro && ! running && ! compr_file && sel_not_null && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT)); - set_sensitive (window, "Delete", ! no_archive && ! ro && ! window->priv->archive_new && ! running && ! compr_file); - set_sensitive (window, "DeselectAll", ! no_archive && sel_not_null); - set_sensitive (window, "Extract", file_op); - set_sensitive (window, "Extract_Toolbar", file_op); - set_sensitive (window, "Find", ! no_archive); - set_sensitive (window, "LastOutput", ((window->archive != NULL) + set_sensitive (window, "add_files_item", ! no_archive && ! ro && ! running && ! compr_file); + set_sensitive (window, "tool_add_files_item", ! no_archive && ! ro && ! running && ! compr_file); + set_sensitive (window, "add_folder_item", ! no_archive && ! ro && ! running && ! compr_file); + set_sensitive (window, "tool_add_folder_item", ! no_archive && ! ro && ! running && ! compr_file); + set_sensitive (window, "copy_item", ! no_archive && ! ro && ! running && ! compr_file && sel_not_null && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT)); + set_sensitive (window, "popup_copy_item", ! no_archive && ! ro && ! running && ! compr_file && sel_not_null && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT)); + set_sensitive (window, "popup_copy_item1", ! no_archive && ! ro && ! running && ! compr_file && sel_not_null && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT)); + set_sensitive (window, "cut_item", ! no_archive && ! ro && ! running && ! compr_file && sel_not_null && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT)); + set_sensitive (window, "popup_cut_item", ! no_archive && ! ro && ! running && ! compr_file && sel_not_null && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT)); + set_sensitive (window, "popup_cut_item1", ! no_archive && ! ro && ! running && ! compr_file && sel_not_null && (window->priv->list_mode != FR_WINDOW_LIST_MODE_FLAT)); + set_sensitive (window, "delete_item", ! no_archive && ! ro && ! window->priv->archive_new && ! running && ! compr_file); + set_sensitive (window, "popup_delete_item", ! no_archive && ! ro && ! window->priv->archive_new && ! running && ! compr_file); + set_sensitive (window, "popup_delete_item1", ! no_archive && ! ro && ! window->priv->archive_new && ! running && ! compr_file); + set_sensitive (window, "deselect_all_item", ! no_archive && sel_not_null); + set_sensitive (window, "extract_item", file_op); + set_sensitive (window, "tool_extract_item", file_op); + set_sensitive (window, "find_item", ! no_archive); + set_sensitive (window, "last_output_item", ((window->archive != NULL) && (window->archive->process != NULL) && (window->archive->process->out.raw != NULL))); - set_sensitive (window, "New", ! running); - set_sensitive (window, "Open", ! running); - set_sensitive (window, "Open_Toolbar", ! running); - set_sensitive (window, "OpenSelection", file_op && sel_not_null && ! dir_selected); - set_sensitive (window, "OpenFolder", file_op && one_file_selected && dir_selected); - set_sensitive (window, "Password", ! running && (window->priv->asked_for_password || (! no_archive && window->archive->command->propPassword))); - set_sensitive (window, "Properties", file_op); - set_sensitive (window, "Close", !running || window->priv->stoppable); - set_sensitive (window, "Reload", ! (no_archive || running)); - set_sensitive (window, "Rename", ! no_archive && ! ro && ! running && ! compr_file && one_file_selected); - set_sensitive (window, "SaveAs", ! no_archive && ! compr_file && ! running); - set_sensitive (window, "SelectAll", ! no_archive); - set_sensitive (window, "Stop", running && window->priv->stoppable); - set_sensitive (window, "TestArchive", ! no_archive && ! running && window->archive->command->propTest); - set_sensitive (window, "ViewSelection", file_op && one_file_selected && ! dir_selected); - set_sensitive (window, "ViewSelection_Toolbar", file_op && one_file_selected && ! dir_selected); + set_sensitive (window, "new_item", ! running); + set_sensitive (window, "tool_new_item", ! running); + set_sensitive (window, "open_item", ! running); + set_sensitive (window, "popup_open_select_item", file_op && sel_not_null && ! dir_selected); + set_sensitive (window, "popup_open_item1", file_op && one_file_selected && dir_selected); + set_sensitive (window, "password_item", ! running && (window->priv->asked_for_password || (! no_archive && window->archive->command->propPassword))); + set_sensitive (window, "properties_item", file_op); + set_sensitive (window, "close_item", !running || window->priv->stoppable); + set_sensitive (window, "reload_item", ! (no_archive || running)); + set_sensitive (window, "rename_item", ! no_archive && ! ro && ! running && ! compr_file && one_file_selected); + set_sensitive (window, "popup_rename_item", ! no_archive && ! ro && ! running && ! compr_file && one_file_selected); + set_sensitive (window, "popup_rename_item1", ! no_archive && ! ro && ! running && ! compr_file && one_file_selected); + set_sensitive (window, "open_saveas_item", ! no_archive && ! compr_file && ! running); + set_sensitive (window, "select_all_item", ! no_archive); + set_sensitive (window, "stop_item", running && window->priv->stoppable); + set_sensitive (window, "tool_stop_item", running && window->priv->stoppable); + set_sensitive (window, "test_integrity_item", ! no_archive && ! running && window->archive->command->propTest); + set_sensitive (window, "popup_open_item", file_op && one_file_selected && ! dir_selected); if (window->priv->progress_dialog != NULL) gtk_dialog_set_response_sensitive (GTK_DIALOG (window->priv->progress_dialog), @@ -2092,18 +2045,17 @@ fr_window_update_sensitivity (FrWindow *window) fr_window_update_paste_command_sensitivity (window, NULL); - set_sensitive (window, "SelectAll", (window->priv->current_view_length > 0) && (window->priv->current_view_length != n_selected)); - set_sensitive (window, "DeselectAll", n_selected > 0); - set_sensitive (window, "OpenRecent", ! running); - set_sensitive (window, "OpenRecent_Toolbar", ! running); + set_sensitive (window, "select_all_item", (window->priv->current_view_length > 0) && (window->priv->current_view_length != n_selected)); + set_sensitive (window, "deselect_all_item", n_selected > 0); + set_sensitive (window, "open_recent_item", ! running); + set_sensitive (window, "tool_open_recent_item", ! running); - set_sensitive (window, "ViewFolders", (window->priv->list_mode == FR_WINDOW_LIST_MODE_AS_DIR)); + set_sensitive (window, "view_folder_item", (window->priv->list_mode == FR_WINDOW_LIST_MODE_AS_DIR)); - set_sensitive (window, "ViewAllFiles", ! window->priv->filter_mode); - set_sensitive (window, "ViewAsFolder", ! window->priv->filter_mode); + set_sensitive (window, "view_all_files_item", ! window->priv->filter_mode); + set_sensitive (window, "view_as_folder_item", ! window->priv->filter_mode); } - static gboolean location_entry_key_press_event_cb (GtkWidget *widget, GdkEventKey *event, @@ -2119,7 +2071,6 @@ location_entry_key_press_event_cb (GtkWidget *widget, return FALSE; } - static gboolean real_close_progress_dialog (gpointer data) { @@ -2136,7 +2087,6 @@ real_close_progress_dialog (gpointer data) return FALSE; } - static void close_suspend_process(FrWindow *window) { if (window->archive->process != NULL) @@ -2176,21 +2126,19 @@ close_progress_dialog (FrWindow *window, close_suspend_process(window); } - static gboolean progress_dialog_delete_event (GtkWidget *caller, GdkEvent *event, FrWindow *window) { if (window->priv->stoppable) { - activate_action_stop (NULL, window); + activate_action_stop (NULL, NULL, window); close_progress_dialog (window, TRUE); } return TRUE; } - static void open_folder (GtkWindow *parent, const char *folder) @@ -2223,7 +2171,6 @@ open_folder (GtkWindow *parent, } } - static void fr_window_view_extraction_destination_folder (FrWindow *window) { @@ -2277,7 +2224,7 @@ progress_dialog_response (GtkDialog *dialog, switch (response_id) { case GTK_RESPONSE_CANCEL: if (window->priv->stoppable) { - activate_action_stop (NULL, window); + activate_action_stop (NULL, NULL, window); close_progress_dialog (window, TRUE); } break; @@ -2310,7 +2257,6 @@ progress_dialog_response (GtkDialog *dialog, } } - static char* get_action_description (FrAction action, const char *uri) @@ -2376,7 +2322,6 @@ get_action_description (FrAction action, return message; } - static void progress_dialog_update_action_description (FrWindow *window) { @@ -2407,22 +2352,21 @@ progress_dialog_update_action_description (FrWindow *window) g_free (description); } - static gboolean fr_window_working_archive_cb (FrCommand *command, const char *archive_filename, FrWindow *window) { g_free (window->priv->working_archive); - window->priv->working_archive = NULL; if (archive_filename != NULL) window->priv->working_archive = g_strdup (archive_filename); + else + window->priv->working_archive = NULL; progress_dialog_update_action_description (window); return TRUE; } - static gboolean fr_window_message_cb (FrCommand *command, const char *msg, @@ -2479,7 +2423,6 @@ fr_window_message_cb (FrCommand *command, return TRUE; } - static GtkWidget* dialog_add_button_with_icon_name (GtkDialog *dialog, const gchar *button_text, @@ -2500,7 +2443,6 @@ dialog_add_button_with_icon_name (GtkDialog *dialog, return button; } - static void create_the_progress_dialog (FrWindow *window) { @@ -2626,7 +2568,6 @@ create_the_progress_dialog (FrWindow *window) window); } - static gboolean display_progress_dialog (gpointer data) { @@ -2651,7 +2592,6 @@ display_progress_dialog (gpointer data) return FALSE; } - static void open_progress_dialog (FrWindow *window, gboolean open_now) @@ -2691,7 +2631,6 @@ open_progress_dialog (FrWindow *window, window); } - static gboolean fr_window_progress_cb (FrArchive *archive, double fraction, @@ -2743,7 +2682,6 @@ fr_window_progress_cb (FrArchive *archive, return TRUE; } - static void open_progress_dialog_with_open_destination (FrWindow *window) { @@ -2769,8 +2707,11 @@ open_progress_dialog_with_open_destination (FrWindow *window) display_progress_dialog (window); fr_window_progress_cb (NULL, 1.0, window); fr_window_message_cb (NULL, _("Extraction completed successfully"), window); -} + if (window->priv->close_dialog) + close_progress_dialog (window, TRUE); + +} static void open_progress_dialog_with_open_archive (FrWindow *window) @@ -2796,7 +2737,6 @@ open_progress_dialog_with_open_archive (FrWindow *window) fr_window_message_cb (NULL, _("Archive created successfully"), window); } - void fr_window_push_message (FrWindow *window, const char *msg) @@ -2809,7 +2749,6 @@ fr_window_push_message (FrWindow *window, msg); } - void fr_window_pop_message (FrWindow *window) { @@ -2820,7 +2759,6 @@ fr_window_pop_message (FrWindow *window) gtk_label_set_text (GTK_LABEL (window->priv->pd_message), ""); } - static void action_started (FrArchive *archive, FrAction action, @@ -2855,7 +2793,6 @@ action_started (FrArchive *archive, } } - static void fr_window_add_to_recent_list (FrWindow *window, char *uri) @@ -2875,13 +2812,13 @@ fr_window_add_to_recent_list (FrWindow *window, recent_data->app_exec = "engrampa"; gtk_recent_manager_add_full (gtk_recent_manager_get_default (), uri, recent_data); + g_free (recent_data->mime_type); g_free (recent_data); } else gtk_recent_manager_add_item (gtk_recent_manager_get_default (), uri); } - static void fr_window_remove_from_recent_list (FrWindow *window, char *filename) @@ -2890,7 +2827,6 @@ fr_window_remove_from_recent_list (FrWindow *window, gtk_recent_manager_remove_item (gtk_recent_manager_get_default (), filename, NULL); } - static void error_dialog_response_cb (GtkDialog *dialog, gint arg1, @@ -2910,7 +2846,6 @@ error_dialog_response_cb (GtkDialog *dialog, gtk_widget_destroy (GTK_WIDGET (window)); } - static void fr_window_show_error_dialog (FrWindow *window, GtkWidget *dialog, @@ -2949,14 +2884,12 @@ fr_window_show_error_dialog (FrWindow *window, window->priv->error_dialog_parent = dialog_parent; } - void fr_window_destroy_with_error_dialog (FrWindow *window) { window->priv->destroy_with_error_dialog = TRUE; } - static gboolean handle_errors (FrWindow *window, FrArchive *archive, @@ -3085,7 +3018,6 @@ handle_errors (FrWindow *window, return TRUE; } - static void convert__action_performed (FrArchive *archive, FrAction action, @@ -3119,10 +3051,8 @@ convert__action_performed (FrArchive *archive, fr_window_update_statusbar_list_info (window); } - static void fr_window_exec_next_batch_action (FrWindow *window); - static void action_performed (FrArchive *archive, FrAction action, @@ -3312,13 +3242,10 @@ action_performed (FrArchive *archive, } } - /* -- selections -- */ - #undef DEBUG_GET_DIR_LIST_FROM_PATH - static GList * get_dir_list_from_path (FrWindow *window, char *path) @@ -3366,7 +3293,6 @@ get_dir_list_from_path (FrWindow *window, return g_list_reverse (list); } - static GList * get_dir_list_from_file_data (FrWindow *window, FileData *fdata) @@ -3383,7 +3309,6 @@ get_dir_list_from_file_data (FrWindow *window, return list; } - GList * fr_window_get_file_list_selection (FrWindow *window, gboolean recursive, @@ -3425,7 +3350,6 @@ fr_window_get_file_list_selection (FrWindow *window, return g_list_reverse (list); } - GList * fr_window_get_folder_tree_selection (FrWindow *window, gboolean recursive, @@ -3463,7 +3387,6 @@ fr_window_get_folder_tree_selection (FrWindow *window, return g_list_reverse (list); } - GList * fr_window_get_file_list_from_path_list (FrWindow *window, GList *path_list, @@ -3522,7 +3445,6 @@ fr_window_get_file_list_from_path_list (FrWindow *window, return g_list_reverse (list); } - GList * fr_window_get_file_list_pattern (FrWindow *window, const char *pattern) @@ -3554,7 +3476,6 @@ fr_window_get_file_list_pattern (FrWindow *window, return g_list_reverse (list); } - static GList * fr_window_get_file_list (FrWindow *window) { @@ -3572,17 +3493,14 @@ fr_window_get_file_list (FrWindow *window) return g_list_reverse (list); } - int fr_window_get_n_selected_files (FrWindow *window) { return gtk_tree_selection_count_selected_rows (gtk_tree_view_get_selection (GTK_TREE_VIEW (window->priv->list_view))); } - /**/ - static int dir_tree_button_press_cb (GtkWidget *widget, GdkEventButton *event, @@ -3603,7 +3521,7 @@ dir_tree_button_press_cb (GtkWidget *widget, GtkTreeIter iter; if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (window->priv->tree_view), - event->x, event->y, + (int) event->x, (int) event->y, &path, NULL, NULL, NULL)) { if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (window->priv->tree_store), &iter, path)) { @@ -3637,7 +3555,6 @@ dir_tree_button_press_cb (GtkWidget *widget, return FALSE; } - static FileData * fr_window_get_selected_item_from_file_list (FrWindow *window) { @@ -3665,7 +3582,6 @@ fr_window_get_selected_item_from_file_list (FrWindow *window) return fdata; } - static char * fr_window_get_selected_folder_in_tree_view (FrWindow *window) { @@ -3690,7 +3606,6 @@ fr_window_get_selected_folder_in_tree_view (FrWindow *window) return path; } - void fr_window_current_folder_activated (FrWindow *window, gboolean from_sidebar) @@ -3722,7 +3637,6 @@ fr_window_current_folder_activated (FrWindow *window, g_free (dir_path); } - static gboolean row_activated_cb (GtkTreeView *tree_view, GtkTreePath *path, @@ -3760,7 +3674,6 @@ row_activated_cb (GtkTreeView *tree_view, return FALSE; } - static int file_button_press_cb (GtkWidget *widget, GdkEventButton *event, @@ -3787,7 +3700,7 @@ file_button_press_cb (GtkWidget *widget, int n_selected; if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (window->priv->list_view), - event->x, event->y, + (int) event->x, (int) event->y, &path, NULL, NULL, NULL)) { if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (window->priv->list_store), &iter, path)) { @@ -3817,7 +3730,7 @@ file_button_press_cb (GtkWidget *widget, GtkTreePath *path = NULL; if (! gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (window->priv->list_view), - event->x, event->y, + (int) event->x, (int) event->y, &path, NULL, NULL, NULL)) { gtk_tree_selection_unselect_all (selection); } @@ -3848,7 +3761,6 @@ file_button_press_cb (GtkWidget *widget, return FALSE; } - static int file_button_release_cb (GtkWidget *widget, GdkEventButton *event, @@ -3873,7 +3785,7 @@ file_button_release_cb (GtkWidget *widget, GtkTreePath *path = NULL; if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (window->priv->list_view), - event->x, event->y, + (int) event->x, (int) event->y, &path, NULL, NULL, NULL)) { if ((gtk_tree_path_compare (window->priv->path_clicked, path) == 0) @@ -3901,7 +3813,6 @@ file_button_release_cb (GtkWidget *widget, return FALSE; } - static gboolean file_motion_notify_callback (GtkWidget *widget, GdkEventMotion *event, @@ -3922,7 +3833,7 @@ file_motion_notify_callback (GtkWidget *widget, last_hover_path = window->priv->list_hover_path; gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), - event->x, event->y, + (int) event->x, (int) event->y, &window->priv->list_hover_path, NULL, NULL, NULL); @@ -3960,7 +3871,6 @@ file_motion_notify_callback (GtkWidget *widget, return FALSE; } - static gboolean file_leave_notify_callback (GtkWidget *widget, GdkEventCrossing *event, @@ -3984,10 +3894,8 @@ file_leave_notify_callback (GtkWidget *widget, return FALSE; } - /* -- drag and drop -- */ - static GList * get_uri_list_from_selection_data (char *uri_list) { @@ -4006,7 +3914,6 @@ get_uri_list_from_selection_data (char *uri_list) return g_list_reverse (list); } - static gboolean fr_window_drag_motion (GtkWidget *widget, GdkDragContext *context, @@ -4027,10 +3934,8 @@ fr_window_drag_motion (GtkWidget *widget, return TRUE; } - static void fr_window_paste_from_clipboard_data (FrWindow *window, FrClipboardData *data); - static FrClipboardData* get_clipboard_data_from_selection_data (FrWindow *window, const char *data) @@ -4060,7 +3965,6 @@ get_clipboard_data_from_selection_data (FrWindow *window, return clipboard_data; } - static void fr_window_drag_data_received (GtkWidget *widget, GdkDragContext *context, @@ -4229,7 +4133,6 @@ fr_window_drag_data_received (GtkWidget *widget, debug (DEBUG_INFO, "::DragDataReceived <--\n"); } - static gboolean file_list_drag_begin (GtkWidget *widget, GdkDragContext *context, @@ -4257,7 +4160,6 @@ file_list_drag_begin (GtkWidget *widget, return TRUE; } - static void file_list_drag_end (GtkWidget *widget, GdkDragContext *context, @@ -4280,6 +4182,7 @@ file_list_drag_end (GtkWidget *widget, fr_window_archive_extract (window, window->priv->drag_file_list, window->priv->drag_destination_folder, + NULL, window->priv->drag_base_dir, FALSE, FR_OVERWRITE_ASK, @@ -4292,7 +4195,6 @@ file_list_drag_end (GtkWidget *widget, debug (DEBUG_INFO, "::DragEnd <--\n"); } - /* The following three functions taken from bugzilla * (http://bugzilla.mate.org/attachment.cgi?id=49362&action=view) * Author: Christian Neumair @@ -4321,7 +4223,6 @@ get_xds_atom_value (GdkDragContext *context) return ret; } - static gboolean context_offers_target (GdkDragContext *context, GdkAtom target) @@ -4329,7 +4230,6 @@ context_offers_target (GdkDragContext *context, return (g_list_find (gdk_drag_context_list_targets (context), target) != NULL); } - static gboolean caja_xds_dnd_is_valid_xds_context (GdkDragContext *context) { @@ -4349,7 +4249,6 @@ caja_xds_dnd_is_valid_xds_context (GdkDragContext *context) return ret; } - static char * get_selection_data_from_clipboard_data (FrWindow *window, FrClipboardData *data) @@ -4380,7 +4279,6 @@ get_selection_data_from_clipboard_data (FrWindow *window, return g_string_free (list, FALSE); } - static gboolean fr_window_folder_tree_drag_data_get (GtkWidget *widget, GdkDragContext *context, @@ -4463,7 +4361,6 @@ fr_window_folder_tree_drag_data_get (GtkWidget *widget, return TRUE; } - gboolean fr_window_file_list_drag_data_get (FrWindow *window, GdkDragContext *context, @@ -4543,10 +4440,8 @@ fr_window_file_list_drag_data_get (FrWindow *window, return TRUE; } - /* -- window_new -- */ - static void fr_window_deactivate_filter (FrWindow *window) { @@ -4564,7 +4459,6 @@ fr_window_deactivate_filter (FrWindow *window) fr_window_update_current_location (window); } - static gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event, @@ -4593,7 +4487,7 @@ key_press_cb (GtkWidget *widget, switch (event->keyval) { case GDK_KEY_Escape: - activate_action_stop (NULL, window); + activate_action_stop (NULL, NULL, window); if (window->priv->filter_mode) fr_window_deactivate_filter (window); retval = TRUE; @@ -4657,7 +4551,6 @@ key_press_cb (GtkWidget *widget, return retval; } - static gboolean dir_tree_selection_changed_cb (GtkTreeSelection *selection, gpointer user_data) @@ -4679,7 +4572,6 @@ dir_tree_selection_changed_cb (GtkTreeSelection *selection, return FALSE; } - static gboolean selection_changed_cb (GtkTreeSelection *selection, gpointer user_data) @@ -4692,7 +4584,6 @@ selection_changed_cb (GtkTreeSelection *selection, return FALSE; } - static void fr_window_delete_event_cb (GtkWidget *caller, GdkEvent *event, @@ -4701,7 +4592,6 @@ fr_window_delete_event_cb (GtkWidget *caller, fr_window_close (window); } - static gboolean is_single_click_policy (FrWindow *window) { @@ -4718,7 +4608,6 @@ is_single_click_policy (FrWindow *window) return result; } - static void filename_cell_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer, @@ -4757,7 +4646,6 @@ filename_cell_data_func (GtkTreeViewColumn *column, g_free (text); } - static void add_dir_tree_columns (FrWindow *window, GtkTreeView *treeview) @@ -4802,7 +4690,6 @@ add_dir_tree_columns (FrWindow *window, gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); } - static void add_file_list_columns (FrWindow *window, GtkTreeView *treeview) @@ -4894,7 +4781,6 @@ add_file_list_columns (FrWindow *window, } } - static int name_column_sort_func (GtkTreeModel *model, GtkTreeIter *a, @@ -4909,7 +4795,6 @@ name_column_sort_func (GtkTreeModel *model, return sort_by_name (&fdata1, &fdata2); } - static int size_column_sort_func (GtkTreeModel *model, GtkTreeIter *a, @@ -4924,7 +4809,6 @@ size_column_sort_func (GtkTreeModel *model, return sort_by_size (&fdata1, &fdata2); } - static int type_column_sort_func (GtkTreeModel *model, GtkTreeIter *a, @@ -4939,7 +4823,6 @@ type_column_sort_func (GtkTreeModel *model, return sort_by_type (&fdata1, &fdata2); } - static int time_column_sort_func (GtkTreeModel *model, GtkTreeIter *a, @@ -4954,7 +4837,6 @@ time_column_sort_func (GtkTreeModel *model, return sort_by_time (&fdata1, &fdata2); } - static int path_column_sort_func (GtkTreeModel *model, GtkTreeIter *a, @@ -4969,7 +4851,6 @@ path_column_sort_func (GtkTreeModel *model, return sort_by_path (&fdata1, &fdata2); } - static int no_sort_column_sort_func (GtkTreeModel *model, GtkTreeIter *a, @@ -4979,7 +4860,6 @@ no_sort_column_sort_func (GtkTreeModel *model, return -1; } - static void sort_column_changed_cb (GtkTreeSortable *sortable, gpointer user_data) @@ -4995,12 +4875,8 @@ sort_column_changed_cb (GtkTreeSortable *sortable, window->priv->sort_method = get_sort_method_from_column (column_id); window->priv->sort_type = order; - - /*set_active (window, get_action_from_sort_method (window->priv->sort_method), TRUE); - set_active (window, "SortReverseOrder", (window->priv->sort_type == GTK_SORT_DESCENDING));*/ } - static gboolean fr_window_show_cb (GtkWidget *widget, FrWindow *window) @@ -5018,10 +4894,8 @@ fr_window_show_cb (GtkWidget *widget, return TRUE; } - /* preferences changes notification callbacks */ - static void pref_history_len_changed (GSettings *settings, const char *key, @@ -5029,29 +4903,22 @@ pref_history_len_changed (GSettings *settings, { FrWindow *window = user_data; int limit; - GtkAction *action; limit = g_settings_get_int (settings, PREF_UI_HISTORY_LEN); - action = gtk_action_group_get_action (window->priv->actions, "OpenRecent"); - gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (action), limit); - - action = gtk_action_group_get_action (window->priv->actions, "OpenRecent_Toolbar"); - gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (action), limit); + gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (window->priv->menubar_recentmenu), limit); + gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (window->priv->toolbar_recentmenu), limit); } - static void pref_view_toolbar_changed (GSettings *settings, const char *key, gpointer user_data) { FrWindow *window = user_data; - fr_window_set_toolbar_visibility (window, g_settings_get_boolean (settings, key)); } - static void pref_view_statusbar_changed (GSettings *settings, const char *key, @@ -5062,7 +4929,6 @@ pref_view_statusbar_changed (GSettings *settings, fr_window_set_statusbar_visibility (window, g_settings_get_boolean (settings, key)); } - static void pref_view_folders_changed (GSettings *settings, const char *key, @@ -5073,7 +4939,6 @@ pref_view_folders_changed (GSettings *settings, fr_window_set_folders_visibility (window, g_settings_get_boolean (settings, key)); } - static void pref_show_field_changed (GSettings *settings, const char *key, @@ -5084,7 +4949,6 @@ pref_show_field_changed (GSettings *settings, fr_window_update_columns_visibility (window); } - static void pref_click_policy_changed (GSettings *settings, const char *key, @@ -5102,7 +4966,6 @@ pref_click_policy_changed (GSettings *settings, gdk_display_flush (display); } - static void pref_use_mime_icons_changed (GSettings *settings, const char *key, @@ -5122,7 +4985,6 @@ pref_use_mime_icons_changed (GSettings *settings, fr_window_update_dir_tree (window); } - static void theme_changed_cb (GtkIconTheme *theme, FrWindow *window) { @@ -5140,14 +5002,14 @@ theme_changed_cb (GtkIconTheme *theme, FrWindow *window) fr_window_update_dir_tree (window); } - static gboolean fr_window_stoppable_cb (FrCommand *command, gboolean stoppable, FrWindow *window) { window->priv->stoppable = stoppable; - set_sensitive (window, "Stop", stoppable); + set_sensitive (window, "stop_item", stoppable); + set_sensitive (window, "tool_stop_item", stoppable); if (window->priv->progress_dialog != NULL) gtk_dialog_set_response_sensitive (GTK_DIALOG (window->priv->progress_dialog), GTK_RESPONSE_OK, @@ -5155,7 +5017,6 @@ fr_window_stoppable_cb (FrCommand *command, return TRUE; } - static gboolean fr_window_fake_load (FrArchive *archive, gpointer data) @@ -5205,18 +5066,13 @@ fr_window_fake_load (FrArchive *archive, #endif } - static void menu_item_select_cb (GtkMenuItem *proxy, - FrWindow *window) + FrWindow *window) { - GtkAction *action; char *message; - action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (proxy)); - g_return_if_fail (action != NULL); - - g_object_get (G_OBJECT (action), "tooltip", &message, NULL); + message = gtk_widget_get_tooltip_text (GTK_WIDGET (proxy)); if (message) { gtk_statusbar_push (GTK_STATUSBAR (window->priv->statusbar), window->priv->help_message_cid, message); @@ -5224,69 +5080,26 @@ menu_item_select_cb (GtkMenuItem *proxy, } } - static void menu_item_deselect_cb (GtkMenuItem *proxy, - FrWindow *window) + FrWindow *window) { gtk_statusbar_pop (GTK_STATUSBAR (window->priv->statusbar), window->priv->help_message_cid); } - static void -disconnect_proxy_cb (GtkUIManager *manager, - GtkAction *action, - GtkWidget *proxy, - FrWindow *window) -{ - if (GTK_IS_MENU_ITEM (proxy)) { - g_signal_handlers_disconnect_by_func - (proxy, G_CALLBACK (menu_item_select_cb), window); - g_signal_handlers_disconnect_by_func - (proxy, G_CALLBACK (menu_item_deselect_cb), window); - } -} - - -static void -connect_proxy_cb (GtkUIManager *manager, - GtkAction *action, - GtkWidget *proxy, - FrWindow *window) -{ - if (GTK_IS_MENU_ITEM (proxy)) { - g_signal_connect (proxy, "select", - G_CALLBACK (menu_item_select_cb), window); - g_signal_connect (proxy, "deselect", - G_CALLBACK (menu_item_deselect_cb), window); - } -} - - -static void -view_as_radio_action (GtkAction *action, - GtkRadioAction *current, - gpointer data) -{ - FrWindow *window = data; - fr_window_set_list_mode (window, gtk_radio_action_get_current_value (current)); -} - - -static void -sort_by_radio_action (GtkAction *action, - GtkRadioAction *current, - gpointer data) +view_all_files_selected_toggled (GtkMenuItem *menuitem, + gpointer data) { FrWindow *window = data; - window->priv->sort_method = gtk_radio_action_get_current_value (current); - window->priv->sort_type = GTK_SORT_ASCENDING; - fr_window_update_list_order (window); + if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem))) + fr_window_set_list_mode (window, FR_WINDOW_LIST_MODE_FLAT); + else + fr_window_set_list_mode (window, FR_WINDOW_LIST_MODE_AS_DIR); } - static void recent_chooser_item_activated_cb (GtkRecentChooser *chooser, FrWindow *window) @@ -5300,35 +5113,36 @@ recent_chooser_item_activated_cb (GtkRecentChooser *chooser, } } - -static void -fr_window_init_recent_chooser (FrWindow *window, - GtkRecentChooser *chooser) +static GtkWidget * +fr_window_create_recent_chooser (FrWindow *window) { - GtkRecentFilter *filter; - int i; + GtkRecentManager *manager; + GtkRecentFilter *filter; + GtkWidget *menu; + int i; - g_return_if_fail (chooser != NULL); + manager = gtk_recent_manager_get_default (); + menu = gtk_recent_chooser_menu_new_for_manager (manager); filter = gtk_recent_filter_new (); gtk_recent_filter_set_name (filter, _("All archives")); for (i = 0; open_type[i] != -1; i++) gtk_recent_filter_add_mime_type (filter, mime_type_desc[open_type[i]].mime_type); gtk_recent_filter_add_application (filter, "Engrampa"); - gtk_recent_chooser_add_filter (chooser, filter); + gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu), filter); - gtk_recent_chooser_set_local_only (chooser, FALSE); - gtk_recent_chooser_set_limit (chooser, g_settings_get_int (window->priv->settings_ui, PREF_UI_HISTORY_LEN)); - gtk_recent_chooser_set_show_not_found (chooser, TRUE); - gtk_recent_chooser_set_sort_type (chooser, GTK_RECENT_SORT_MRU); + gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER (menu), FALSE); + gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (menu), g_settings_get_int (window->priv->settings_ui, PREF_UI_HISTORY_LEN)); + gtk_recent_chooser_set_show_not_found (GTK_RECENT_CHOOSER (menu), TRUE); + gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu), GTK_RECENT_SORT_MRU); - g_signal_connect (G_OBJECT (chooser), + g_signal_connect (G_OBJECT (menu), "item_activated", G_CALLBACK (recent_chooser_item_activated_cb), window); + return menu; } - static void close_sidepane_button_clicked_cb (GtkButton *button, FrWindow *window) @@ -5336,7 +5150,6 @@ close_sidepane_button_clicked_cb (GtkButton *button, fr_window_set_folders_visibility (window, FALSE); } - static void fr_window_activate_filter (FrWindow *window) { @@ -5356,7 +5169,6 @@ fr_window_activate_filter (FrWindow *window) fr_window_update_current_location (window); } - static void filter_entry_activate_cb (GtkEntry *entry, FrWindow *window) @@ -5364,7 +5176,6 @@ filter_entry_activate_cb (GtkEntry *entry, fr_window_activate_filter (window); } - static void filter_entry_icon_release_cb (GtkEntry *entry, GtkEntryIconPosition icon_pos, @@ -5377,7 +5188,6 @@ filter_entry_icon_release_cb (GtkEntry *entry, fr_window_deactivate_filter (window); } - static void fr_window_attach (FrWindow *window, GtkWidget *child, @@ -5426,19 +5236,6 @@ fr_window_attach (FrWindow *window, 1, 1); } - -static void -set_action_important (GtkUIManager *ui, - const char *action_name) -{ - GtkAction *action; - - action = gtk_ui_manager_get_action (ui, action_name); - g_object_set (action, "is_important", TRUE, NULL); - g_object_unref (action); -} - - static void fr_window_construct (FrWindow *window) { @@ -5454,10 +5251,13 @@ fr_window_construct (FrWindow *window) GtkWidget *sidepane_title_box; GtkWidget *sidepane_title_label; GtkWidget *close_sidepane_button; + GtkWidget *menu_radio_files; + GtkWidget *menuitem; GtkTreeSelection *selection; - GtkActionGroup *actions; - GtkAction *action; - GtkUIManager *ui; + GActionGroup *actions; + GSimpleAction *action; + GtkAccelGroup *accel_group; + GtkBuilder *ui; GError *error = NULL; GSettingsSchemaSource *schema_source; GSettingsSchema *caja_schema; @@ -5844,101 +5644,85 @@ fr_window_construct (FrWindow *window) /* Build the menu and the toolbar. */ - ui = gtk_ui_manager_new (); + window->priv->ui_manager = ui = gtk_builder_new (); - window->priv->actions = actions = gtk_action_group_new ("Actions"); - - /* open recent toolbar item action */ - - action = g_object_new (GTK_TYPE_RECENT_ACTION, - "name", "OpenRecent", - /* Translators: this is the label for the "open recent file" sub-menu. */ - "label", _("Open _Recent"), - "tooltip", _("Open a recently used archive"), - "stock-id", "gtk-open", - NULL); - fr_window_init_recent_chooser (window, GTK_RECENT_CHOOSER (action)); - gtk_action_group_add_action (actions, action); - g_object_unref (action); - - /* open recent toolbar item action */ - - action = g_object_new (GTK_TYPE_RECENT_ACTION, - "name", "OpenRecent_Toolbar", - "label", _("Open"), - "tooltip", _("Open a recently used archive"), - "stock-id", "gtk-open", - "is-important", TRUE, - NULL); - fr_window_init_recent_chooser (window, GTK_RECENT_CHOOSER (action)); - g_signal_connect (action, - "activate", - G_CALLBACK (activate_action_open), - window); - gtk_action_group_add_action (actions, action); - g_object_unref (action); + window->priv->actions = actions = (GActionGroup*)g_simple_action_group_new (); /* other actions */ + g_action_map_add_action_entries (G_ACTION_MAP (actions), + action_entries, G_N_ELEMENTS (action_entries), + window); - gtk_action_group_set_translation_domain (actions, NULL); - gtk_action_group_add_actions (actions, - action_entries, - n_action_entries, - window); - gtk_action_group_add_toggle_actions (actions, - action_toggle_entries, - n_action_toggle_entries, - window); - gtk_action_group_add_radio_actions (actions, - view_as_entries, - n_view_as_entries, - window->priv->list_mode, - G_CALLBACK (view_as_radio_action), - window); - gtk_action_group_add_radio_actions (actions, - sort_by_entries, - n_sort_by_entries, - window->priv->sort_type, - G_CALLBACK (sort_by_radio_action), - window); - - g_signal_connect (ui, "connect_proxy", - G_CALLBACK (connect_proxy_cb), window); - g_signal_connect (ui, "disconnect_proxy", - G_CALLBACK (disconnect_proxy_cb), window); - - gtk_ui_manager_insert_action_group (ui, actions, 0); - gtk_window_add_accel_group (GTK_WINDOW (window), - gtk_ui_manager_get_accel_group (ui)); + accel_group = gtk_accel_group_new (); + gtk_widget_insert_action_group (GTK_WIDGET (window), "win", actions); + gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); /* Add a hidden short cut Ctrl-Q for power users */ - gtk_accel_group_connect (gtk_ui_manager_get_accel_group (ui), + gtk_accel_group_connect (accel_group, GDK_KEY_q, GDK_CONTROL_MASK, 0, g_cclosure_new_swap (G_CALLBACK (fr_window_close), window, NULL)); - - if (! gtk_ui_manager_add_ui_from_resource (ui, ENGRAMPA_RESOURCE_UI_PATH G_DIR_SEPARATOR_S "menus-toolbars.ui", &error)) { + if (! gtk_builder_add_from_resource (ui, ENGRAMPA_RESOURCE_UI_PATH G_DIR_SEPARATOR_S "menus-toolbars.ui", &error)) { g_message ("building menus failed: %s", error->message); g_error_free (error); } + /*Add shortcut keys*/ + for (gulong i = 0; i < G_N_ELEMENTS (menu_keybindings); i++) + { + menuitem = (GtkWidget*)gtk_builder_get_object (ui, menu_keybindings[i].widget_id); + gtk_widget_add_accelerator (menuitem, "activate", accel_group, + menu_keybindings[i].keyval, + menu_keybindings[i].modifier, + GTK_ACCEL_VISIBLE); + } - menubar = gtk_ui_manager_get_widget (ui, "/MenuBar"); + gtk_builder_add_callback_symbols (ui, + "menu_item_select_cb", G_CALLBACK (menu_item_select_cb), + "menu_item_deselect_cb", G_CALLBACK (menu_item_deselect_cb), + NULL); + gtk_builder_connect_signals (ui, window); + /* open recent toolbar item action */ + + window->priv->menubar_recentmenu = fr_window_create_recent_chooser (window); + menuitem = (GtkWidget *)gtk_builder_get_object (ui, "open_recent_item"); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), window->priv->menubar_recentmenu); + + /* open recent toolbar item action */ + menuitem = (GtkWidget *)gtk_builder_get_object (ui, "tool_open_recent_item"); + window->priv->toolbar_recentmenu = fr_window_create_recent_chooser (window); + gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (menuitem), window->priv->toolbar_recentmenu); + + if (window->priv->list_mode == FR_WINDOW_LIST_MODE_FLAT) + action = g_simple_action_new_stateful ("ViewAllFiles", G_VARIANT_TYPE ("s"), g_variant_new_string ("files")); + else + action = g_simple_action_new_stateful ("ViewAllFiles", G_VARIANT_TYPE ("s"), g_variant_new_string ("folder")); + + g_action_map_add_action (G_ACTION_MAP (actions), G_ACTION (action)); + g_object_unref (action); + + menubar = (GtkWidget *)gtk_builder_get_object (ui, "engrampamenubar"); fr_window_attach (FR_WINDOW (window), menubar, FR_WINDOW_AREA_MENUBAR); gtk_widget_show (menubar); - window->priv->toolbar = toolbar = gtk_ui_manager_get_widget (ui, "/ToolBar"); + window->priv->toolbar = toolbar = (GtkWidget *)gtk_builder_get_object (ui, "engrampatoolbar"); gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), TRUE); gtk_style_context_add_class (gtk_widget_get_style_context (toolbar), GTK_STYLE_CLASS_PRIMARY_TOOLBAR); - set_action_important (ui, "/ToolBar/Extract_Toolbar"); /* location bar */ - window->priv->location_bar = gtk_ui_manager_get_widget (ui, "/LocationBar"); + window->priv->location_bar = (GtkWidget *)gtk_builder_get_object (ui, "locationbar"); gtk_toolbar_set_show_arrow (GTK_TOOLBAR (window->priv->location_bar), FALSE); gtk_toolbar_set_style (GTK_TOOLBAR (window->priv->location_bar), GTK_TOOLBAR_BOTH_HORIZ); gtk_style_context_add_class (gtk_widget_get_style_context (window->priv->location_bar), GTK_STYLE_CLASS_TOOLBAR); - set_action_important (ui, "/LocationBar/GoBack"); + init_engramp_menu_popup (window, ui); + + /* file list mode */ + menu_radio_files = (GtkWidget *)gtk_builder_get_object (ui, "view_all_files_item"); + g_signal_connect (G_OBJECT (menu_radio_files), + "toggled", + G_CALLBACK (view_all_files_selected_toggled), + window); /* current location */ location_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); @@ -5951,6 +5735,8 @@ fr_window_construct (FrWindow *window) gtk_entry_set_icon_from_icon_name (GTK_ENTRY (window->priv->location_entry), GTK_ENTRY_ICON_PRIMARY, "folder"); + gtk_label_set_mnemonic_widget (GTK_LABEL (window->priv->location_label), + window->priv->location_entry); gtk_box_pack_start (GTK_BOX (location_box), window->priv->location_entry, TRUE, TRUE, 5); @@ -5988,9 +5774,9 @@ fr_window_construct (FrWindow *window) else gtk_widget_hide (toolbar); - window->priv->file_popup_menu = gtk_ui_manager_get_widget (ui, "/FilePopupMenu"); - window->priv->folder_popup_menu = gtk_ui_manager_get_widget (ui, "/FolderPopupMenu"); - window->priv->sidebar_folder_popup_menu = gtk_ui_manager_get_widget (ui, "/SidebarFolderPopupMenu"); + window->priv->file_popup_menu = (GtkWidget *)gtk_builder_get_object (ui, "FilePopupMenu"); + window->priv->folder_popup_menu = (GtkWidget *)gtk_builder_get_object (ui, "FolderPopupMenu"); + window->priv->sidebar_folder_popup_menu = (GtkWidget *)gtk_builder_get_object (ui, "SidebarFolderPopupMenu"); /* Create the statusbar. */ @@ -6088,7 +5874,6 @@ fr_window_construct (FrWindow *window) gtk_widget_grab_focus (window->priv->list_view); } - GtkWidget * fr_window_new (void) { @@ -6100,7 +5885,6 @@ fr_window_new (void) return window; } - static void fr_window_set_archive_uri (FrWindow *window, const char *uri) @@ -6110,7 +5894,6 @@ fr_window_set_archive_uri (FrWindow *window, window->priv->archive_uri = g_strdup (uri); } - gboolean fr_window_archive_new (FrWindow *window, const char *uri) @@ -6141,7 +5924,6 @@ fr_window_archive_new (FrWindow *window, return TRUE; } - FrWindow * fr_window_archive_open (FrWindow *current_window, const char *uri, @@ -6171,7 +5953,6 @@ fr_window_archive_open (FrWindow *current_window, return window; } - void fr_window_archive_close (FrWindow *window) { @@ -6199,7 +5980,6 @@ fr_window_archive_close (FrWindow *window) fr_window_update_statusbar_list_info (window); } - const char * fr_window_get_archive_uri (FrWindow *window) { @@ -6208,7 +5988,6 @@ fr_window_get_archive_uri (FrWindow *window) return window->priv->archive_uri; } - const char * fr_window_get_paste_archive_uri (FrWindow *window) { @@ -6220,7 +5999,6 @@ fr_window_get_paste_archive_uri (FrWindow *window) return NULL; } - gboolean fr_window_archive_is_present (FrWindow *window) { @@ -6229,7 +6007,6 @@ fr_window_archive_is_present (FrWindow *window) return window->priv->archive_present; } - typedef struct { char *uri; char *password; @@ -6237,7 +6014,6 @@ typedef struct { guint volume_size; } SaveAsData; - static SaveAsData * save_as_data_new (const char *uri, const char *password, @@ -6257,7 +6033,6 @@ save_as_data_new (const char *uri, return sdata; } - static void save_as_data_free (SaveAsData *sdata) { @@ -6268,7 +6043,6 @@ save_as_data_free (SaveAsData *sdata) g_free (sdata); } - void fr_window_archive_save_as (FrWindow *window, const char *uri, @@ -6356,14 +6130,13 @@ fr_window_archive_save_as (FrWindow *window, NULL, window->priv->convert_data.temp_dir, NULL, - TRUE, FALSE, + TRUE, FALSE, window->priv->password); fr_process_start (window->archive->process); } - void fr_window_archive_reload (FrWindow *window) { @@ -6377,10 +6150,8 @@ fr_window_archive_reload (FrWindow *window) fr_archive_reload (window->archive, window->priv->password); } - /**/ - void fr_window_archive_add_files (FrWindow *window, GList *file_list, /* GFile list */ @@ -6429,7 +6200,6 @@ fr_window_archive_add_files (FrWindow *window, g_object_unref (base); } - void fr_window_archive_add_with_wildcard (FrWindow *window, const char *include_files, @@ -6454,7 +6224,6 @@ fr_window_archive_add_with_wildcard (FrWindow *window, window->priv->volume_size); } - void fr_window_archive_add_directory (FrWindow *window, const char *directory, @@ -6473,7 +6242,6 @@ fr_window_archive_add_directory (FrWindow *window, window->priv->volume_size); } - void fr_window_archive_add_items (FrWindow *window, GList *item_list, @@ -6492,7 +6260,6 @@ fr_window_archive_add_items (FrWindow *window, window->priv->volume_size); } - void fr_window_archive_add_dropped_items (FrWindow *window, GList *item_list, @@ -6509,25 +6276,43 @@ fr_window_archive_add_dropped_items (FrWindow *window, window->priv->volume_size); } +static void +remove_data_free (GList *rdata) +{ + g_list_free_full(rdata, g_free); +} void fr_window_archive_remove (FrWindow *window, GList *file_list) { + char *password; + GList *remove_list; + fr_window_clipboard_remove_file_list (window, file_list); fr_process_clear (window->archive->process); - fr_archive_remove (window->archive, file_list, window->priv->compression); + + remove_list = g_list_copy_deep (file_list, (GCopyFunc) g_strdup, NULL); + fr_window_set_current_batch_action (window, + FR_BATCH_ACTION_DELETE, + remove_list, + (GFreeFunc) remove_data_free); + + password = window->priv->password; + if (password != NULL && password[0] != '\0') + g_object_set (window->archive->command, "password", password, NULL); + + fr_archive_remove (window->archive, remove_list, window->priv->compression); fr_process_start (window->archive->process); } - /* -- window_archive_extract -- */ - static ExtractData* extract_data_new (GList *file_list, const char *extract_to_dir, + const char *sub_dir, const char *base_dir, gboolean skip_older, FrOverwrite overwrite, @@ -6536,11 +6321,21 @@ extract_data_new (GList *file_list, gboolean ask_to_open_destination) { ExtractData *edata; + int i = 1; edata = g_new0 (ExtractData, 1); edata->file_list = path_list_dup (file_list); - if (extract_to_dir != NULL) + if (sub_dir != NULL) + edata->sub_dir = g_strdup (sub_dir); + if (extract_to_dir != NULL && sub_dir == NULL) { edata->extract_to_dir = g_strdup (extract_to_dir); + } else if (extract_to_dir != NULL && sub_dir != NULL) { + edata->extract_to_dir = g_build_filename (extract_to_dir, sub_dir, NULL); + while (uri_exists (edata->extract_to_dir) && uri_is_file (edata->extract_to_dir)) { + g_free (edata->extract_to_dir); + edata->extract_to_dir = g_strdup_printf ("%s/%s_%d", extract_to_dir, sub_dir, i++); + } + } edata->skip_older = skip_older; edata->overwrite = overwrite; edata->junk_paths = junk_paths; @@ -6552,13 +6347,13 @@ extract_data_new (GList *file_list, return edata; } - static ExtractData* extract_to_data_new (const char *extract_to_dir) { return extract_data_new (NULL, extract_to_dir, NULL, + NULL, FALSE, TRUE, FALSE, @@ -6566,7 +6361,6 @@ extract_to_data_new (const char *extract_to_dir) FALSE); } - static void extract_data_free (ExtractData *edata) { @@ -6574,12 +6368,12 @@ extract_data_free (ExtractData *edata) path_list_free (edata->file_list); g_free (edata->extract_to_dir); + g_free (edata->sub_dir); g_free (edata->base_dir); g_free (edata); } - static gboolean archive_is_encrypted (FrWindow *window, GList *file_list) @@ -6625,11 +6419,38 @@ archive_is_encrypted (FrWindow *window, return encrypted; } +static gboolean +archive_extract_check_disk_space_full (GPtrArray *files, + const char *extract_to_dir) +{ + guint64 freespace; + guint64 archive_size = 0; + guint i; + + freespace = get_dest_free_space (g_filename_from_uri (extract_to_dir, NULL, NULL)); + + for (i = 0; i <files->len; i++) + { + FileData *fdata = g_ptr_array_index (files, i); + archive_size += fdata->size; + } + /* When the decompressed target file is less than 100MB, + 2 * (target file size) needs to disk space + and when it is greater than 100MB, + 100MB + (target file size) needs to disk space */ + + if (archive_size <= 1024 * 1024 * 100) + archive_size = archive_size * 2; + else + archive_size += 1024 * 1024 * 100; + + return freespace < archive_size * 2; +} void fr_window_archive_extract_here (FrWindow *window, gboolean skip_older, - gboolean overwrite, + FrOverwrite overwrite, gboolean junk_paths) { ExtractData *edata; @@ -6637,6 +6458,7 @@ fr_window_archive_extract_here (FrWindow *window, edata = extract_data_new (NULL, NULL, NULL, + NULL, skip_older, overwrite, junk_paths, @@ -6665,10 +6487,8 @@ fr_window_archive_extract_here (FrWindow *window, } } - /* -- fr_window_archive_extract -- */ - typedef struct { FrWindow *window; ExtractData *edata; @@ -6676,12 +6496,10 @@ typedef struct { gboolean extract_all; } OverwriteData; - #define _FR_RESPONSE_OVERWRITE_YES_ALL 100 #define _FR_RESPONSE_OVERWRITE_YES 101 #define _FR_RESPONSE_OVERWRITE_NO 102 - static void _fr_window_archive_extract_from_edata (FrWindow *window, ExtractData *edata) @@ -6700,10 +6518,8 @@ _fr_window_archive_extract_from_edata (FrWindow *window, fr_process_start (window->archive->process); } - static void _fr_window_ask_overwrite_dialog (OverwriteData *odata); - static void overwrite_dialog_response_cb (GtkDialog *dialog, int response_id, @@ -6752,7 +6568,6 @@ overwrite_dialog_response_cb (GtkDialog *dialog, _fr_window_ask_overwrite_dialog (odata); } - static void _fr_window_ask_overwrite_dialog (OverwriteData *odata) { @@ -6855,11 +6670,11 @@ _fr_window_ask_overwrite_dialog (OverwriteData *odata) g_free (odata); } - void fr_window_archive_extract (FrWindow *window, GList *file_list, const char *extract_to_dir, + const char *sub_dir, const char *base_dir, gboolean skip_older, FrOverwrite overwrite, @@ -6872,6 +6687,7 @@ fr_window_archive_extract (FrWindow *window, edata = extract_data_new (file_list, extract_to_dir, + sub_dir, base_dir, skip_older, overwrite, @@ -6884,6 +6700,20 @@ fr_window_archive_extract (FrWindow *window, edata, (GFreeFunc) extract_data_free); + if (archive_extract_check_disk_space_full (window->archive->command->files, extract_to_dir)) + { + GtkWidget *d; + + d = _gtk_error_dialog_new (GTK_WINDOW (window), + GTK_DIALOG_MODAL, + NULL, + _("Insufficient remaining disk space"), + NULL); + gtk_dialog_run (GTK_DIALOG (d)); + gtk_widget_destroy(d); + return; + } + if (archive_is_encrypted (window, edata->file_list) && (window->priv->password == NULL)) { dlg_ask_password (window); return; @@ -6978,7 +6808,6 @@ fr_window_archive_extract (FrWindow *window, _fr_window_archive_extract_from_edata (window, edata); } - void fr_window_archive_test (FrWindow *window) { @@ -6989,7 +6818,6 @@ fr_window_archive_test (FrWindow *window) fr_archive_test (window->archive, window->priv->password); } - void fr_window_set_password (FrWindow *window, const char *password) @@ -7028,7 +6856,6 @@ fr_window_get_password (FrWindow *window) return window->priv->password; } - void fr_window_set_encrypt_header (FrWindow *window, gboolean encrypt_header) @@ -7038,14 +6865,12 @@ fr_window_set_encrypt_header (FrWindow *window, window->priv->encrypt_header = encrypt_header; } - gboolean fr_window_get_encrypt_header (FrWindow *window) { return window->priv->encrypt_header; } - void fr_window_set_compression (FrWindow *window, FrCompression compression) @@ -7055,14 +6880,12 @@ fr_window_set_compression (FrWindow *window, window->priv->compression = compression; } - FrCompression fr_window_get_compression (FrWindow *window) { return window->priv->compression; } - void fr_window_set_volume_size (FrWindow *window, guint volume_size) @@ -7072,14 +6895,12 @@ fr_window_set_volume_size (FrWindow *window, window->priv->volume_size = volume_size; } - guint fr_window_get_volume_size (FrWindow *window) { return window->priv->volume_size; } - void fr_window_go_to_location (FrWindow *window, const char *path, @@ -7112,7 +6933,6 @@ fr_window_go_to_location (FrWindow *window, g_free (dir); } - const char * fr_window_get_current_location (FrWindow *window) { @@ -7124,7 +6944,6 @@ fr_window_get_current_location (FrWindow *window) return (const char*) window->priv->history_current->data; } - void fr_window_go_up_one_level (FrWindow *window) { @@ -7137,7 +6956,6 @@ fr_window_go_up_one_level (FrWindow *window) g_free (parent_dir); } - void fr_window_go_back (FrWindow *window) { @@ -7154,7 +6972,6 @@ fr_window_go_back (FrWindow *window) fr_window_go_to_location (window, window->priv->history_current->data, FALSE); } - void fr_window_go_forward (FrWindow *window) { @@ -7171,7 +6988,6 @@ fr_window_go_forward (FrWindow *window) fr_window_go_to_location (window, window->priv->history_current->data, FALSE); } - void fr_window_set_list_mode (FrWindow *window, FrWindowListMode list_mode) @@ -7192,14 +7008,12 @@ fr_window_set_list_mode (FrWindow *window, fr_window_update_current_location (window); } - GtkTreeModel * fr_window_get_list_store (FrWindow *window) { return GTK_TREE_MODEL (window->priv->list_store); } - void fr_window_find (FrWindow *window) { @@ -7208,30 +7022,18 @@ fr_window_find (FrWindow *window) gtk_widget_grab_focus (window->priv->filter_entry); } - void fr_window_select_all (FrWindow *window) { gtk_tree_selection_select_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (window->priv->list_view))); } - void fr_window_unselect_all (FrWindow *window) { gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (window->priv->list_view))); } - -void -fr_window_set_sort_type (FrWindow *window, - GtkSortType sort_type) -{ - window->priv->sort_type = sort_type; - fr_window_update_list_order (window); -} - - void fr_window_stop (FrWindow *window) { @@ -7245,10 +7047,8 @@ fr_window_stop (FrWindow *window) fr_window_convert_data_free (window, TRUE); } - /* -- start/stop activity mode -- */ - static int activity_cb (gpointer data) { @@ -7262,7 +7062,6 @@ activity_cb (gpointer data) return TRUE; } - void fr_window_start_activity_mode (FrWindow *window) { @@ -7277,7 +7076,6 @@ fr_window_start_activity_mode (FrWindow *window) fr_window_update_sensitivity (window); } - void fr_window_stop_activity_mode (FrWindow *window) { @@ -7310,7 +7108,6 @@ fr_window_stop_activity_mode (FrWindow *window) } } - static gboolean last_output_window__unrealize_cb (GtkWidget *widget, gpointer data) @@ -7319,7 +7116,6 @@ last_output_window__unrealize_cb (GtkWidget *widget, return FALSE; } - static void fr_window_view_last_output_print(GtkTextBuffer *text_buffer, GtkTextIter *iter, @@ -7357,7 +7153,9 @@ fr_window_view_last_output (FrWindow *window, dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (window), - GTK_DIALOG_DESTROY_WITH_PARENT, + /* Make this dialog modal, otherwise with most WMs + * the focus can’t be regained without the mouse. */ + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, "gtk-close", GTK_RESPONSE_CLOSE, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); @@ -7380,7 +7178,9 @@ fr_window_view_last_output (FrWindow *window, text_view = gtk_text_view_new_with_buffer (text_buffer); g_object_unref (text_buffer); gtk_text_view_set_editable (GTK_TEXT_VIEW (text_view), FALSE); - gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text_view), FALSE); + /* Although this isn’t an editable text area, we do want the + * cursor for accessibility purposes. */ + gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text_view), TRUE); /**/ @@ -7413,16 +7213,18 @@ fr_window_view_last_output (FrWindow *window, fr_window_view_last_output_print(text_buffer, &iter, window->archive->process->out.raw); /* Show STDERR of process */ fr_window_view_last_output_print(text_buffer, &iter, window->archive->process->err.raw); + /* place the cursor at the start */ + gtk_text_buffer_get_iter_at_offset (text_buffer, &iter, 0); + gtk_text_buffer_place_cursor(text_buffer, &iter); /**/ pref_util_restore_window_geometry (GTK_WINDOW (dialog), LAST_OUTPUT_DIALOG_NAME); + gtk_widget_grab_focus (text_view); } - /* -- fr_window_rename_selection -- */ - typedef struct { char *path_to_rename; char *old_name; @@ -7433,7 +7235,6 @@ typedef struct { char *original_path; } RenameData; - static RenameData* rename_data_new (const char *path_to_rename, const char *old_name, @@ -7461,7 +7262,6 @@ rename_data_new (const char *path_to_rename, return rdata; } - static void rename_data_free (RenameData *rdata) { @@ -7475,7 +7275,6 @@ rename_data_free (RenameData *rdata) g_free (rdata); } - static void rename_selection (FrWindow *window, const char *path_to_rename, @@ -7631,7 +7430,6 @@ rename_selection (FrWindow *window, g_free (tmp_dir); } - static gboolean valid_name (const char *new_name, const char *old_name, @@ -7664,7 +7462,6 @@ valid_name (const char *new_name, return retval; } - static gboolean name_is_present (FrWindow *window, const char *current_dir, @@ -7705,7 +7502,6 @@ name_is_present (FrWindow *window, return retval; } - void fr_window_rename_selection (FrWindow *window, gboolean from_sidebar) @@ -7833,7 +7629,6 @@ fr_window_rename_selection (FrWindow *window, g_free (original_path); } - static void fr_clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_data, @@ -7855,7 +7650,6 @@ fr_clipboard_get (GtkClipboard *clipboard, g_free (data); } - static void fr_clipboard_clear (GtkClipboard *clipboard, gpointer user_data_or_owner) @@ -7868,7 +7662,6 @@ fr_clipboard_clear (GtkClipboard *clipboard, } } - GList * fr_window_get_selection (FrWindow *window, gboolean from_sidebar, @@ -7906,7 +7699,6 @@ fr_window_get_selection (FrWindow *window, return files; } - static void fr_window_copy_or_cut_selection (FrWindow *window, FRClipboardOp op, @@ -7936,7 +7728,6 @@ fr_window_copy_or_cut_selection (FrWindow *window, fr_window_update_sensitivity (window); } - void fr_window_copy_selection (FrWindow *window, gboolean from_sidebar) @@ -7944,7 +7735,6 @@ fr_window_copy_selection (FrWindow *window, fr_window_copy_or_cut_selection (window, FR_CLIPBOARD_OP_COPY, from_sidebar); } - void fr_window_cut_selection (FrWindow *window, gboolean from_sidebar) @@ -7952,7 +7742,6 @@ fr_window_cut_selection (FrWindow *window, fr_window_copy_or_cut_selection (window, FR_CLIPBOARD_OP_CUT, from_sidebar); } - static gboolean always_fake_load (FrArchive *archive, gpointer data) @@ -7960,7 +7749,6 @@ always_fake_load (FrArchive *archive, return TRUE; } - static void add_pasted_files (FrWindow *window, FrClipboardData *data) @@ -8022,7 +7810,6 @@ add_pasted_files (FrWindow *window, fr_process_start (window->archive->process); } - static void copy_from_archive_action_performed_cb (FrArchive *archive, FrAction action, @@ -8088,7 +7875,6 @@ copy_from_archive_action_performed_cb (FrArchive *archive, } } - static void fr_window_paste_from_clipboard_data (FrWindow *window, FrClipboardData *data) @@ -8166,7 +7952,6 @@ fr_window_paste_from_clipboard_data (FrWindow *window, data->archive_password); } - static void fr_window_paste_selection_to (FrWindow *window, const char *current_dir) @@ -8187,7 +7972,6 @@ fr_window_paste_selection_to (FrWindow *window, gtk_selection_data_free (selection_data); } - void fr_window_paste_selection (FrWindow *window, gboolean from_sidebar) @@ -8228,10 +8012,8 @@ fr_window_paste_selection (FrWindow *window, g_free (current_dir); } - /* -- fr_window_open_files -- */ - void fr_window_open_files_with_command (FrWindow *window, GList *file_list, @@ -8253,7 +8035,6 @@ fr_window_open_files_with_command (FrWindow *window, fr_window_open_files_with_application (window, file_list, app); } - void fr_window_open_files_with_application (FrWindow *window, GList *file_list, @@ -8289,7 +8070,6 @@ fr_window_open_files_with_application (FrWindow *window, path_list_free (uris); } - typedef struct { FrWindow *window; GList *file_list; @@ -8297,7 +8077,6 @@ typedef struct { CommandData *cdata; } OpenFilesData; - static OpenFilesData* open_files_data_new (FrWindow *window, GList *file_list, @@ -8331,7 +8110,6 @@ open_files_data_new (FrWindow *window, return odata; } - static void open_files_data_free (OpenFilesData *odata) { @@ -8341,14 +8119,12 @@ open_files_data_free (OpenFilesData *odata) g_free (odata); } - void fr_window_update_dialog_closed (FrWindow *window) { window->priv->update_dialog = NULL; } - gboolean fr_window_update_files (FrWindow *window, GList *file_list) @@ -8386,7 +8162,6 @@ fr_window_update_files (FrWindow *window, return TRUE; } - static void open_file_modified_cb (GFileMonitor *monitor, GFile *monitor_file, @@ -8423,7 +8198,6 @@ open_file_modified_cb (GFileMonitor *monitor, dlg_update_add_file (window->priv->update_dialog, file); } - static void fr_window_monitor_open_file (FrWindow *window, OpenFile *file) @@ -8440,7 +8214,6 @@ fr_window_monitor_open_file (FrWindow *window, g_object_unref (f); } - static void monitor_extracted_files (OpenFilesData *odata) { @@ -8461,7 +8234,6 @@ monitor_extracted_files (OpenFilesData *odata) } } - static gboolean fr_window_open_extracted_files (OpenFilesData *odata) { @@ -8542,7 +8314,6 @@ fr_window_open_extracted_files (OpenFilesData *odata) return result; } - static void fr_window_open_files__extract_done_cb (FrArchive *archive, FrAction action, @@ -8562,7 +8333,6 @@ fr_window_open_files__extract_done_cb (FrArchive *archive, fr_window_open_extracted_files (odata); } - void fr_window_open_files (FrWindow *window, GList *file_list, @@ -8596,10 +8366,8 @@ fr_window_open_files (FrWindow *window, fr_process_start (window->archive->process); } - /**/ - static char* get_default_dir (const char *dir) { @@ -8609,7 +8377,6 @@ get_default_dir (const char *dir) return NULL; } - void fr_window_set_open_default_dir (FrWindow *window, const char *default_dir) @@ -8622,7 +8389,6 @@ fr_window_set_open_default_dir (FrWindow *window, window->priv->open_default_dir = get_default_dir (default_dir); } - const char * fr_window_get_open_default_dir (FrWindow *window) { @@ -8632,7 +8398,6 @@ fr_window_get_open_default_dir (FrWindow *window) return window->priv->open_default_dir; } - void fr_window_set_add_default_dir (FrWindow *window, const char *default_dir) @@ -8645,7 +8410,6 @@ fr_window_set_add_default_dir (FrWindow *window, window->priv->add_default_dir = get_default_dir (default_dir); } - const char * fr_window_get_add_default_dir (FrWindow *window) { @@ -8655,7 +8419,6 @@ fr_window_get_add_default_dir (FrWindow *window) return window->priv->add_default_dir; } - void fr_window_set_extract_default_dir (FrWindow *window, const char *default_dir, @@ -8676,7 +8439,6 @@ fr_window_set_extract_default_dir (FrWindow *window, window->priv->extract_default_dir = get_default_dir (default_dir); } - const char * fr_window_get_extract_default_dir (FrWindow *window) { @@ -8686,7 +8448,6 @@ fr_window_get_extract_default_dir (FrWindow *window) return window->priv->extract_default_dir; } - void fr_window_set_default_dir (FrWindow *window, const char *default_dir, @@ -8702,7 +8463,6 @@ fr_window_set_default_dir (FrWindow *window, fr_window_set_extract_default_dir (window, default_dir, FALSE); } - void fr_window_update_columns_visibility (FrWindow *window) { @@ -8722,7 +8482,6 @@ fr_window_update_columns_visibility (FrWindow *window) gtk_tree_view_column_set_visible (column, g_settings_get_boolean (window->priv->settings_listing, PREF_LISTING_SHOW_PATH)); } - void fr_window_set_toolbar_visibility (FrWindow *window, gboolean visible) @@ -8737,7 +8496,6 @@ fr_window_set_toolbar_visibility (FrWindow *window, set_active (window, "ViewToolbar", visible); } - void fr_window_set_statusbar_visibility (FrWindow *window, gboolean visible) @@ -8752,7 +8510,6 @@ fr_window_set_statusbar_visibility (FrWindow *window, set_active (window, "ViewStatusbar", visible); } - void fr_window_set_folders_visibility (FrWindow *window, gboolean value) @@ -8765,7 +8522,6 @@ fr_window_set_folders_visibility (FrWindow *window, set_active (window, "ViewFolders", window->priv->view_folders); } - void fr_window_use_progress_dialog (FrWindow *window, gboolean value) @@ -8773,13 +8529,10 @@ fr_window_use_progress_dialog (FrWindow *window, window->priv->use_progress_dialog = value; } - /* -- batch mode procedures -- */ - static void fr_window_exec_current_batch_action (FrWindow *window); - static void fr_window_exec_batch_action (FrWindow *window, FRBatchAction *action) @@ -8805,6 +8558,12 @@ fr_window_exec_batch_action (FrWindow *window, fr_window_archive_add_dropped_items (window, (GList*) action->data, FALSE); break; + case FR_BATCH_ACTION_DELETE: + debug (DEBUG_INFO, "[BATCH] DELETE\n"); + + fr_window_archive_remove (window, (GList*) action->data); + break; + case FR_BATCH_ACTION_OPEN: debug (DEBUG_INFO, "[BATCH] OPEN\n"); @@ -8819,6 +8578,7 @@ fr_window_exec_batch_action (FrWindow *window, fr_window_archive_extract (window, edata->file_list, edata->extract_to_dir, + edata->sub_dir, edata->base_dir, edata->skip_older, edata->overwrite, @@ -8831,7 +8591,7 @@ fr_window_exec_batch_action (FrWindow *window, fr_window_archive_extract_here (window, FALSE, - TRUE, + FR_OVERWRITE_NO, FALSE); break; @@ -8845,6 +8605,7 @@ fr_window_exec_batch_action (FrWindow *window, NULL, window->priv->extract_default_dir, NULL, + NULL, FALSE, FR_OVERWRITE_ASK, FALSE, @@ -8925,7 +8686,6 @@ fr_window_exec_batch_action (FrWindow *window, } } - void fr_window_reset_current_batch_action (FrWindow *window) { @@ -8938,7 +8698,6 @@ fr_window_reset_current_batch_action (FrWindow *window) adata->free_func = NULL; } - void fr_window_set_current_batch_action (FrWindow *window, FrBatchActionType action, @@ -8954,14 +8713,12 @@ fr_window_set_current_batch_action (FrWindow *window, adata->free_func = free_func; } - void fr_window_restart_current_batch_action (FrWindow *window) { fr_window_exec_batch_action (window, &window->priv->current_batch_action); } - void fr_window_append_batch_action (FrWindow *window, FrBatchActionType action, @@ -8980,7 +8737,6 @@ fr_window_append_batch_action (FrWindow *window, window->priv->batch_action_list = g_list_append (window->priv->batch_action_list, a_desc); } - static void fr_window_exec_current_batch_action (FrWindow *window) { @@ -8994,7 +8750,6 @@ fr_window_exec_current_batch_action (FrWindow *window) fr_window_exec_batch_action (window, action); } - static void fr_window_exec_next_batch_action (FrWindow *window) { @@ -9005,7 +8760,6 @@ fr_window_exec_next_batch_action (FrWindow *window) fr_window_exec_current_batch_action (window); } - void fr_window_start_batch (FrWindow *window) { @@ -9028,7 +8782,6 @@ fr_window_start_batch (FrWindow *window) fr_window_exec_current_batch_action (window); } - void fr_window_stop_batch (FrWindow *window) { @@ -9052,21 +8805,18 @@ fr_window_stop_batch (FrWindow *window) window->priv->batch_mode = FALSE; } - void fr_window_resume_batch (FrWindow *window) { fr_window_exec_current_batch_action (window); } - gboolean fr_window_is_batch_mode (FrWindow *window) { return window->priv->batch_mode; } - void fr_window_new_batch (FrWindow *window, const char *title) @@ -9077,7 +8827,6 @@ fr_window_new_batch (FrWindow *window, window->priv->batch_title = g_strdup (title); } - void fr_window_set_batch__extract_here (FrWindow *window, const char *filename) @@ -9099,7 +8848,6 @@ fr_window_set_batch__extract_here (FrWindow *window, NULL); } - void fr_window_set_batch__extract (FrWindow *window, const char *filename, @@ -9128,7 +8876,6 @@ fr_window_set_batch__extract (FrWindow *window, NULL); } - void fr_window_set_batch__add (FrWindow *window, const char *archive, @@ -9155,3 +8902,12 @@ fr_window_set_batch__add (FrWindow *window, NULL, NULL); } + +void +fr_window_set_close_dialog (FrWindow *window, + gboolean state) +{ + g_return_if_fail (window != NULL); + + window->priv->close_dialog = state; +} |