summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRazvan Chitu <razvan.ch95@gmail.com>2016-08-19 20:07:12 +0300
committerRazvan Chitu <razvan.ch95@gmail.com>2016-08-23 00:36:56 +0300
commit51dbfc977808b996aedf96b819766b8c982adc59 (patch)
tree8fdabef929815804838e3bf7e7c4a18a1431544b
parent9f0c9a9f1243e650d5f023f110151640e91e875b (diff)
downloadnautilus-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.xml5
-rw-r--r--src/nautilus-files-view.c71
-rw-r--r--src/nautilus-global-preferences.h3
-rw-r--r--src/nautilus-mime-actions.c18
-rw-r--r--src/nautilus-mime-actions.h1
-rw-r--r--src/nautilus-preferences-window.c5
-rw-r--r--src/resources/ui/nautilus-preferences-window.ui46
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>