diff options
author | Razvan Chitu <razvan.ch95@gmail.com> | 2016-08-19 20:07:12 +0300 |
---|---|---|
committer | Razvan Chitu <razvan.ch95@gmail.com> | 2016-08-23 00:36:56 +0300 |
commit | 51dbfc977808b996aedf96b819766b8c982adc59 (patch) | |
tree | 8fdabef929815804838e3bf7e7c4a18a1431544b | |
parent | 9f0c9a9f1243e650d5f023f110151640e91e875b (diff) | |
download | nautilus-51dbfc977808b996aedf96b819766b8c982adc59.tar.gz |
general: add preference for automatic decompression of archives
Make extraction the default action for activating selected archives and add an
option to open them instead of extracting.
https://bugzilla.gnome.org/show_bug.cgi?id=768646
-rw-r--r-- | data/org.gnome.nautilus.gschema.xml | 5 | ||||
-rw-r--r-- | src/nautilus-files-view.c | 71 | ||||
-rw-r--r-- | src/nautilus-global-preferences.h | 3 | ||||
-rw-r--r-- | src/nautilus-mime-actions.c | 18 | ||||
-rw-r--r-- | src/nautilus-mime-actions.h | 1 | ||||
-rw-r--r-- | src/nautilus-preferences-window.c | 5 | ||||
-rw-r--r-- | src/resources/ui/nautilus-preferences-window.ui | 46 |
7 files changed, 142 insertions, 7 deletions
diff --git a/data/org.gnome.nautilus.gschema.xml b/data/org.gnome.nautilus.gschema.xml index 4be43d249..e89d0d893 100644 --- a/data/org.gnome.nautilus.gschema.xml +++ b/data/org.gnome.nautilus.gschema.xml @@ -103,6 +103,11 @@ <summary>Whether to ask for confirmation when deleting files, or emptying the Trash</summary> <description>If set to true, then Nautilus will ask for confirmation when you attempt to delete files, or empty the Trash.</description> </key> + <key type="b" name="automatic-decompression"> + <default>true</default> + <summary>Whether to extract compressed files instead of opening them in another application</summary> + <description>If set to true, then Nautilus will automatically extract compressed files instead of opening them in another application</description> + </key> <key name="show-directory-item-counts" enum="org.gnome.nautilus.SpeedTradeoff"> <aliases><alias value='local_only' target='local-only'/></aliases> <default>'local-only'</default> diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 40f575a4f..d35b2cdb2 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -311,6 +311,12 @@ static void nautilus_files_view_select_file (NautilusFi static void update_templates_directory (NautilusFilesView *view); +static void extract_files (NautilusFilesView *view, + GList *files, + GFile *destination_directory); +static void extract_files_to_chosen_location (NautilusFilesView *view, + GList *files); + static void nautilus_files_view_check_empty_states (NautilusFilesView *view); static gboolean nautilus_files_view_is_searching (NautilusView *view); @@ -1109,17 +1115,33 @@ nautilus_files_view_activate_files (NautilusFilesView *view, NautilusWindowOpenFlags flags, gboolean confirm_multiple) { + GList *files_to_extract; + GList *files_to_activate; char *path; + files_to_extract = nautilus_file_list_filter (files, + &files_to_activate, + (NautilusFileFilterFunc)nautilus_mime_file_extracts, + NULL); + + if (nautilus_files_view_supports_extract_here (view)) { + extract_files (view, files_to_extract, + nautilus_view_get_location (NAUTILUS_VIEW (view))); + } else { + extract_files_to_chosen_location (view, files_to_extract); + } + path = get_view_directory (view); nautilus_mime_activate_files (nautilus_files_view_get_containing_window (view), view->details->slot, - files, + files_to_activate, path, flags, confirm_multiple); g_free (path); + g_list_free (files_to_extract); + g_list_free (files_to_activate); } static void @@ -1129,6 +1151,23 @@ nautilus_files_view_activate_file (NautilusFilesView *view, { char *path; + if (nautilus_mime_file_extracts (file)) { + GList *files = NULL; + + files = g_list_prepend (files, file); + + if (nautilus_files_view_supports_extract_here (view)) { + extract_files (view, files, + nautilus_view_get_location (NAUTILUS_VIEW (view))); + } else { + extract_files_to_chosen_location (view, files); + } + + g_list_free (files); + + return; + } + path = get_view_directory (view); nautilus_mime_activate_file (nautilus_files_view_get_containing_window (view), view->details->slot, @@ -6333,6 +6372,7 @@ real_update_actions_state (NautilusFilesView *view) gboolean show_detect_media; gboolean settings_show_delete_permanently; gboolean settings_show_create_link; + gboolean settings_automatic_decompression; GDriveStartStopType start_stop_type; view_action_group = view->details->view_action_group; @@ -6375,6 +6415,8 @@ real_update_actions_state (NautilusFilesView *view) NAUTILUS_PREFERENCES_SHOW_DELETE_PERMANENTLY); settings_show_create_link = g_settings_get_boolean (nautilus_preferences, NAUTILUS_PREFERENCES_SHOW_CREATE_LINK); + settings_automatic_decompression = g_settings_get_boolean (nautilus_preferences, + NAUTILUS_PREFERENCES_AUTOMATIC_DECOMPRESSION); /* Right click actions */ /* Selection menu actions */ @@ -6397,11 +6439,16 @@ real_update_actions_state (NautilusFilesView *view) action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group), "extract-here"); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), - can_extract_files && can_extract_here); + can_extract_files && + !settings_automatic_decompression && + can_extract_here); action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group), "extract-to"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), can_extract_files); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + can_extract_files && + (!settings_automatic_decompression || + can_extract_here)); action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group), "open-item-location"); @@ -6658,7 +6705,9 @@ update_selection_menu (NautilusFilesView *view) GList *selection, *l; NautilusFile *file; gint selection_count; - gboolean show_app, show_run; + gboolean show_app; + gboolean show_run; + gboolean show_extract; gboolean item_opens_in_view; gchar *item_label; GAppInfo *app; @@ -6696,11 +6745,15 @@ update_selection_menu (NautilusFilesView *view) g_free (item_label); /* Open With <App> menu item */ - show_app = show_run = item_opens_in_view = selection_count != 0; + show_extract = show_app = show_run = item_opens_in_view = selection_count != 0; for (l = selection; l != NULL; l = l->next) { NautilusFile *file; - file = NAUTILUS_FILE (selection->data); + file = NAUTILUS_FILE (l->data); + + if (!nautilus_mime_file_extracts (file)) { + show_extract = FALSE; + } if (!nautilus_mime_file_opens_in_external_app (file)) { show_app = FALSE; @@ -6714,7 +6767,7 @@ update_selection_menu (NautilusFilesView *view) item_opens_in_view = FALSE; } - if (!show_app && !show_run && !item_opens_in_view) { + if (!show_extract && !show_app && !show_run && !item_opens_in_view) { break; } } @@ -6740,6 +6793,10 @@ update_selection_menu (NautilusFilesView *view) g_object_unref (app); } else if (show_run) { item_label = g_strdup (_("Run")); + } else if (show_extract) { + item_label = nautilus_files_view_supports_extract_here (view) ? + g_strdup (_("Extract Here")) : + g_strdup (_("Extract to…")); } else { item_label = g_strdup (_("Open")); } diff --git a/src/nautilus-global-preferences.h b/src/nautilus-global-preferences.h index ef1f8aabe..bd665e3ae 100644 --- a/src/nautilus-global-preferences.h +++ b/src/nautilus-global-preferences.h @@ -32,6 +32,9 @@ G_BEGIN_DECLS /* Trash options */ #define NAUTILUS_PREFERENCES_CONFIRM_TRASH "confirm-trash" +/* Automatic decompression */ +#define NAUTILUS_PREFERENCES_AUTOMATIC_DECOMPRESSION "automatic-decompression" + /* Display */ #define NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES "show-hidden" diff --git a/src/nautilus-mime-actions.c b/src/nautilus-mime-actions.c index e196dce8b..1e06b7890 100644 --- a/src/nautilus-mime-actions.c +++ b/src/nautilus-mime-actions.c @@ -54,6 +54,7 @@ typedef enum { ACTIVATION_ACTION_LAUNCH_IN_TERMINAL, ACTIVATION_ACTION_OPEN_IN_VIEW, ACTIVATION_ACTION_OPEN_IN_APPLICATION, + ACTIVATION_ACTION_EXTRACT, ACTIVATION_ACTION_DO_NOTHING, } ActivationAction; @@ -677,6 +678,13 @@ get_activation_action (NautilusFile *file) { ActivationAction action; char *activation_uri; + gboolean can_extract; + can_extract = g_settings_get_boolean (nautilus_preferences, + NAUTILUS_PREFERENCES_AUTOMATIC_DECOMPRESSION); + + if (can_extract && nautilus_file_is_archive (file)) { + return ACTIVATION_ACTION_EXTRACT; + } if (nautilus_file_is_nautilus_link (file)) { return ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE; @@ -715,6 +723,12 @@ get_activation_action (NautilusFile *file) } gboolean +nautilus_mime_file_extracts (NautilusFile *file) +{ + return get_activation_action (file) == ACTIVATION_ACTION_EXTRACT; +} + +gboolean nautilus_mime_file_launches (NautilusFile *file) { ActivationAction activation_action; @@ -1565,6 +1579,10 @@ activate_files (ActivateParameters *parameters) break; case ACTIVATION_ACTION_DO_NOTHING : break; + case ACTIVATION_ACTION_EXTRACT : + /* Extraction of files should be handled in the view */ + g_assert_not_reached (); + break; case ACTIVATION_ACTION_ASK : g_assert_not_reached (); break; diff --git a/src/nautilus-mime-actions.h b/src/nautilus-mime-actions.h index f96ca66a7..93475648e 100644 --- a/src/nautilus-mime-actions.h +++ b/src/nautilus-mime-actions.h @@ -37,6 +37,7 @@ GList * nautilus_mime_get_applications_for_file (Nauti GAppInfo * nautilus_mime_get_default_application_for_files (GList *files); +gboolean nautilus_mime_file_extracts (NautilusFile *file); gboolean nautilus_mime_file_opens_in_external_app (NautilusFile *file); gboolean nautilus_mime_file_launches (NautilusFile *file); void nautilus_mime_activate_files (GtkWindow *parent_window, diff --git a/src/nautilus-preferences-window.c b/src/nautilus-preferences-window.c index 5fe783bd3..875b23397 100644 --- a/src/nautilus-preferences-window.c +++ b/src/nautilus-preferences-window.c @@ -58,6 +58,8 @@ "use_tree_view_checkbutton" #define NAUTILUS_PREFERENCES_DIALOG_TRASH_CONFIRM_WIDGET \ "trash_confirm_checkbutton" +#define NAUTILUS_PREFERENCES_DIALOG_AUTOMATIC_DECOMPRESSION_WIDGET \ + "automatic_decompression_checkbutton" /* int enums */ #define NAUTILUS_PREFERENCES_DIALOG_THUMBNAIL_LIMIT_WIDGET \ @@ -432,6 +434,9 @@ static void nautilus_preferences_window_setup(GtkBuilder *builder, bind_builder_bool(builder, nautilus_preferences, NAUTILUS_PREFERENCES_DIALOG_TRASH_CONFIRM_WIDGET, NAUTILUS_PREFERENCES_CONFIRM_TRASH); + bind_builder_bool (builder, nautilus_preferences, + NAUTILUS_PREFERENCES_DIALOG_AUTOMATIC_DECOMPRESSION_WIDGET, + NAUTILUS_PREFERENCES_AUTOMATIC_DECOMPRESSION); bind_builder_bool(builder, nautilus_list_view_preferences, NAUTILUS_PREFERENCES_DIALOG_LIST_VIEW_USE_TREE_WIDGET, NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE); diff --git a/src/resources/ui/nautilus-preferences-window.ui b/src/resources/ui/nautilus-preferences-window.ui index 17c32b25c..96a2be860 100644 --- a/src/resources/ui/nautilus-preferences-window.ui +++ b/src/resources/ui/nautilus-preferences-window.ui @@ -756,6 +756,52 @@ More information will appear when zooming closer.</property> <property name="position">3</property> </packing> </child> + <child> + <object class="GtkBox" id="vbox10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="label17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Compressed Files</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="automatic_decompression_checkbutton"> + <property name="label" translatable="yes">E_xtract the files on open</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> </object> <packing> <property name="position">1</property> |