From 4d8f9848a4cf296f0d3401cf0a7f1def07c68405 Mon Sep 17 00:00:00 2001 From: Carlos Soriano Date: Wed, 9 Aug 2017 16:32:09 +0200 Subject: general: Add mime type support for archives Until now archives were managed only if activated from Nautilus itself and if a setting was set. There are two main problems with this. 1- Archives opened in other apps cannot be handled by Nautilus 2- Users cannot use the regular myme type handling for setting Nautilus as the app handling archives, or unsetting it. This patch add support for archives myme types handled by gnome-autoar and removes the UI and setting used in the previous version. --- data/org.gnome.Nautilus.desktop.in | 2 +- src/nautilus-files-view.c | 46 ++++---------------------------------- src/nautilus-files-view.h | 3 +++ src/nautilus-mime-actions.c | 1 + src/nautilus-window-slot.c | 34 +++++++++++++++++++++++++++- 5 files changed, 42 insertions(+), 44 deletions(-) diff --git a/data/org.gnome.Nautilus.desktop.in b/data/org.gnome.Nautilus.desktop.in index db3f9a198..6544b02be 100644 --- a/data/org.gnome.Nautilus.desktop.in +++ b/data/org.gnome.Nautilus.desktop.in @@ -11,7 +11,7 @@ Type=Application DBusActivatable=true StartupNotify=true Categories=GNOME;GTK;Utility;Core;FileManager; -MimeType=inode/directory; +MimeType=inode/directory; application/x-7z-compressed; application/x-7z-compressed-tar; application/x-bzip; application/x-bzip-compressed-tar; application/x-compress; application/x-compressed-tar; application/x-cpio; application/x-gzip; application/x-lha; application/x-lzip; application/x-lzip-compressed-tar; application/x-lzma; application/x-lzma-compressed-tar; application/x-tar; application/x-tarz; application/x-xar; application/x-xz; application/x-xz-compressed-tar; application/zip; application/gzip; application/bzip2; X-GNOME-UsesNotifications=true Actions=new-window; diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index d8d4326f7..2ee7844a3 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -1237,53 +1237,15 @@ nautilus_files_view_activate_files (NautilusFilesView *view, g_list_free (files_to_activate); } -static void +void nautilus_files_view_activate_file (NautilusFilesView *view, NautilusFile *file, NautilusWindowOpenFlags flags) { - NautilusFilesViewPrivate *priv; - char *path; + g_autoptr(GList) files; - priv = nautilus_files_view_get_instance_private (view); - - if (nautilus_mime_file_extracts (file)) - { - GList *files = NULL; - - files = g_list_prepend (files, file); - - if (nautilus_files_view_supports_extract_here (view)) - { - g_autoptr (GFile) location = NULL; - g_autoptr (GFile) parent = NULL; - - location = nautilus_file_get_location (file); - /* Get a parent from a random file. We assume all files has a common parent. - * But don't assume the parent is the view location, since that's not the - * case in list view when expand-folder setting is set - */ - parent = g_file_get_parent (location); - extract_files (view, files, parent); - } - 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), - priv->slot, - file, - path, - flags); - - g_free (path); + files = g_list_append(NULL, file); + nautilus_files_view_activate_files (view, files, flags, FALSE); } static void diff --git a/src/nautilus-files-view.h b/src/nautilus-files-view.h index cc3340ae5..d2c5ce171 100644 --- a/src/nautilus-files-view.h +++ b/src/nautilus-files-view.h @@ -267,6 +267,9 @@ void nautilus_files_view_activate_files (Nautil GList *files, NautilusWindowOpenFlags flags, gboolean confirm_multiple); +void nautilus_files_view_activate_file (NautilusFilesView *view, + NautilusFile *file, + NautilusWindowOpenFlags flags); void nautilus_files_view_preview_files (NautilusFilesView *view, GList *files, GArray *locations); diff --git a/src/nautilus-mime-actions.c b/src/nautilus-mime-actions.c index ab69c6007..b9c3891e9 100644 --- a/src/nautilus-mime-actions.c +++ b/src/nautilus-mime-actions.c @@ -385,6 +385,7 @@ nautilus_mime_get_default_application_for_file (NautilusFile *file) if (!nautilus_mime_actions_check_if_required_attributes_ready (file)) { + G_BREAKPOINT(); return NULL; } diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c index 765be41fb..50fbb625d 100644 --- a/src/nautilus-window-slot.c +++ b/src/nautilus-window-slot.c @@ -118,6 +118,7 @@ typedef struct guint location_change_distance; char *pending_scroll_to; GList *pending_selection; + NautilusFile *pending_file_to_activate; NautilusFile *determine_view_file; GCancellable *mount_cancellable; GError *mount_error; @@ -985,6 +986,7 @@ static gboolean setup_view (NautilusWindowSlot *self, static void load_new_location (NautilusWindowSlot *slot, GFile *location, GList *selection, + NautilusFile *file_to_activate, gboolean tell_current_content_view, gboolean tell_new_content_view); @@ -1580,10 +1582,18 @@ handle_regular_file_if_needed (NautilusWindowSlot *self, } g_clear_object (&priv->pending_location); + g_clear_object (&priv->pending_file_to_activate); g_free (priv->pending_scroll_to); priv->pending_location = nautilus_file_get_parent_location (file); - priv->pending_selection = g_list_prepend (NULL, nautilus_file_ref (file)); + if (nautilus_file_is_archive (file)) + { + priv->pending_file_to_activate = nautilus_file_ref (file); + } + else + { + priv->pending_selection = g_list_prepend (NULL, nautilus_file_ref (file)); + } priv->determine_view_file = nautilus_file_ref (parent_file); priv->pending_scroll_to = nautilus_file_get_uri (file); @@ -1777,6 +1787,7 @@ setup_view (NautilusWindowSlot *self, load_new_location (self, priv->pending_location, priv->pending_selection, + priv->pending_file_to_activate, FALSE, TRUE); @@ -1792,6 +1803,7 @@ setup_view (NautilusWindowSlot *self, load_new_location (self, old_location, selection, + NULL, FALSE, TRUE); nautilus_file_list_free (selection); @@ -1815,6 +1827,7 @@ static void load_new_location (NautilusWindowSlot *self, GFile *location, GList *selection, + NautilusFile *file_to_activate, gboolean tell_current_content_view, gboolean tell_new_content_view) { @@ -1845,6 +1858,22 @@ load_new_location (NautilusWindowSlot *self, if (view) { nautilus_view_set_selection (view, selection); + if (file_to_activate != NULL) + { + GAppInfo *app_info; + const gchar *app_id; + + g_return_if_fail (NAUTILUS_IS_FILES_VIEW (view)); + app_info = nautilus_mime_get_default_application_for_file (file_to_activate); + app_id = g_app_info_get_id (app_info); + g_print ("App id %s\n", app_id); + + if (g_strcmp0 (app_id, "org.gnome.Nautilus") == 0) + { + nautilus_files_view_activate_file (NAUTILUS_FILES_VIEW (view), + file_to_activate, 0); + } + } } nautilus_profile_end (NULL); @@ -1882,6 +1911,7 @@ free_location_change (NautilusWindowSlot *self) priv = nautilus_window_slot_get_instance_private (self); g_clear_object (&priv->pending_location); + g_clear_object (&priv->pending_file_to_activate); nautilus_file_list_free (priv->pending_selection); priv->pending_selection = NULL; @@ -2769,6 +2799,7 @@ nautilus_window_slot_dispose (GObject *object) nautilus_window_slot_set_viewed_file (self, NULL); g_clear_object (&priv->location); + g_clear_object (&priv->pending_file_to_activate); nautilus_file_list_free (priv->pending_selection); priv->pending_selection = NULL; @@ -3066,6 +3097,7 @@ nautilus_window_slot_stop_loading (NautilusWindowSlot *self) load_new_location (self, location, selection, + NULL, TRUE, FALSE); nautilus_file_list_free (selection); -- cgit v1.2.1