diff options
Diffstat (limited to 'src/nautilus-mime-actions.c')
-rw-r--r-- | src/nautilus-mime-actions.c | 3910 |
1 files changed, 2063 insertions, 1847 deletions
diff --git a/src/nautilus-mime-actions.c b/src/nautilus-mime-actions.c index 1e06b7890..893070d69 100644 --- a/src/nautilus-mime-actions.c +++ b/src/nautilus-mime-actions.c @@ -1,24 +1,23 @@ - /* nautilus-mime-actions.c - uri-specific versions of mime action functions - - Copyright (C) 2000, 2001 Eazel, Inc. - - The Gnome Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Authors: Maciej Stachowiak <mjs@eazel.com> -*/ + * + * Copyright (C) 2000, 2001 Eazel, Inc. + * + * The Gnome Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * The Gnome Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * see <http://www.gnu.org/licenses/>. + * + * Authors: Maciej Stachowiak <mjs@eazel.com> + */ #include <config.h> @@ -47,187 +46,173 @@ #define DEBUG_FLAG NAUTILUS_DEBUG_MIME #include "nautilus-debug.h" -typedef enum { - ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE, - ACTIVATION_ACTION_ASK, - ACTIVATION_ACTION_LAUNCH, - ACTIVATION_ACTION_LAUNCH_IN_TERMINAL, - ACTIVATION_ACTION_OPEN_IN_VIEW, - ACTIVATION_ACTION_OPEN_IN_APPLICATION, - ACTIVATION_ACTION_EXTRACT, - ACTIVATION_ACTION_DO_NOTHING, +typedef enum +{ + ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE, + ACTIVATION_ACTION_ASK, + ACTIVATION_ACTION_LAUNCH, + ACTIVATION_ACTION_LAUNCH_IN_TERMINAL, + ACTIVATION_ACTION_OPEN_IN_VIEW, + ACTIVATION_ACTION_OPEN_IN_APPLICATION, + ACTIVATION_ACTION_EXTRACT, + ACTIVATION_ACTION_DO_NOTHING, } ActivationAction; -typedef struct { - NautilusFile *file; - char *uri; +typedef struct +{ + NautilusFile *file; + char *uri; } LaunchLocation; -typedef struct { - GAppInfo *application; - GList *uris; +typedef struct +{ + GAppInfo *application; + GList *uris; } ApplicationLaunchParameters; -typedef struct { - NautilusWindowSlot *slot; - gpointer window; - GtkWindow *parent_window; - GCancellable *cancellable; - GList *locations; - GList *mountables; - GList *start_mountables; - GList *not_mounted; - NautilusWindowOpenFlags flags; - char *timed_wait_prompt; - gboolean timed_wait_active; - NautilusFileListHandle *files_handle; - gboolean tried_mounting; - char *activation_directory; - gboolean user_confirmation; +typedef struct +{ + NautilusWindowSlot *slot; + gpointer window; + GtkWindow *parent_window; + GCancellable *cancellable; + GList *locations; + GList *mountables; + GList *start_mountables; + GList *not_mounted; + NautilusWindowOpenFlags flags; + char *timed_wait_prompt; + gboolean timed_wait_active; + NautilusFileListHandle *files_handle; + gboolean tried_mounting; + char *activation_directory; + gboolean user_confirmation; } ActivateParameters; -struct { - char *name; - char *mimetypes[20]; -} mimetype_groups[] = { - { - N_("Anything"), - { NULL } - }, - { - N_("Files"), - { "application/octet-stream", - "text/plain", - NULL - } - }, - { - N_("Folders"), - { "inode/directory", - NULL - } - }, - { N_("Documents"), - { "application/rtf", - "application/msword", - "application/vnd.sun.xml.writer", - "application/vnd.sun.xml.writer.global", - "application/vnd.sun.xml.writer.template", - "application/vnd.oasis.opendocument.text", - "application/vnd.oasis.opendocument.text-template", - "application/x-abiword", - "application/x-applix-word", - "application/x-mswrite", - "application/docbook+xml", - "application/x-kword", - "application/x-kword-crypt", - "application/x-lyx", - NULL - } - }, - { N_("Illustration"), - { "application/illustrator", - "application/vnd.corel-draw", - "application/vnd.stardivision.draw", - "application/vnd.oasis.opendocument.graphics", - "application/x-dia-diagram", - "application/x-karbon", - "application/x-killustrator", - "application/x-kivio", - "application/x-kontour", - "application/x-wpg", - NULL - } - }, - { N_("Music"), - { "application/ogg", - "audio/x-vorbis+ogg", - "audio/ac3", - "audio/basic", - "audio/midi", - "audio/x-flac", - "audio/mp4", - "audio/mpeg", - "audio/x-mpeg", - "audio/x-ms-asx", - "audio/x-pn-realaudio", - NULL - } - }, - { N_("PDF / PostScript"), - { "application/pdf", - "application/postscript", - "application/x-dvi", - "image/x-eps", - NULL - } - }, - { N_("Picture"), - { "application/vnd.oasis.opendocument.image", - "application/x-krita", - "image/bmp", - "image/cgm", - "image/gif", - "image/jpeg", - "image/jpeg2000", - "image/png", - "image/svg+xml", - "image/tiff", - "image/x-compressed-xcf", - "image/x-pcx", - "image/x-photo-cd", - "image/x-psd", - "image/x-tga", - "image/x-xcf", - NULL - } - }, - { N_("Presentation"), - { "application/vnd.ms-powerpoint", - "application/vnd.sun.xml.impress", - "application/vnd.oasis.opendocument.presentation", - "application/x-magicpoint", - "application/x-kpresenter", - NULL - } - }, - { N_("Spreadsheet"), - { "application/vnd.lotus-1-2-3", - "application/vnd.ms-excel", - "application/vnd.stardivision.calc", - "application/vnd.sun.xml.calc", - "application/vnd.oasis.opendocument.spreadsheet", - "application/x-applix-spreadsheet", - "application/x-gnumeric", - "application/x-kspread", - "application/x-kspread-crypt", - "application/x-quattropro", - "application/x-sc", - "application/x-siag", - NULL - } - }, - { N_("Text File"), - { "text/plain", - NULL - } - }, - { N_("Video"), - { "video/mp4", - "video/3gpp", - "video/mpeg", - "video/quicktime", - "video/vivo", - "video/x-avi", - "video/x-mng", - "video/x-ms-asf", - "video/x-ms-wmv", - "video/x-msvideo", - "video/x-nsv", - "video/x-real-video", - NULL - } - } +struct +{ + char *name; + char *mimetypes[20]; +} mimetype_groups[] = +{ + { + N_("Anything"), + { NULL } +}, + { + N_("Files"), + { "application/octet-stream", + "text/plain", + NULL} +}, + { + N_("Folders"), + { "inode/directory", + NULL} +}, + { N_("Documents"), + { "application/rtf", + "application/msword", + "application/vnd.sun.xml.writer", + "application/vnd.sun.xml.writer.global", + "application/vnd.sun.xml.writer.template", + "application/vnd.oasis.opendocument.text", + "application/vnd.oasis.opendocument.text-template", + "application/x-abiword", + "application/x-applix-word", + "application/x-mswrite", + "application/docbook+xml", + "application/x-kword", + "application/x-kword-crypt", + "application/x-lyx", + NULL}}, + { N_("Illustration"), + { "application/illustrator", + "application/vnd.corel-draw", + "application/vnd.stardivision.draw", + "application/vnd.oasis.opendocument.graphics", + "application/x-dia-diagram", + "application/x-karbon", + "application/x-killustrator", + "application/x-kivio", + "application/x-kontour", + "application/x-wpg", + NULL}}, + { N_("Music"), + { "application/ogg", + "audio/x-vorbis+ogg", + "audio/ac3", + "audio/basic", + "audio/midi", + "audio/x-flac", + "audio/mp4", + "audio/mpeg", + "audio/x-mpeg", + "audio/x-ms-asx", + "audio/x-pn-realaudio", + NULL}}, + { N_("PDF / PostScript"), + { "application/pdf", + "application/postscript", + "application/x-dvi", + "image/x-eps", + NULL}}, + { N_("Picture"), + { "application/vnd.oasis.opendocument.image", + "application/x-krita", + "image/bmp", + "image/cgm", + "image/gif", + "image/jpeg", + "image/jpeg2000", + "image/png", + "image/svg+xml", + "image/tiff", + "image/x-compressed-xcf", + "image/x-pcx", + "image/x-photo-cd", + "image/x-psd", + "image/x-tga", + "image/x-xcf", + NULL}}, + { N_("Presentation"), + { "application/vnd.ms-powerpoint", + "application/vnd.sun.xml.impress", + "application/vnd.oasis.opendocument.presentation", + "application/x-magicpoint", + "application/x-kpresenter", + NULL}}, + { N_("Spreadsheet"), + { "application/vnd.lotus-1-2-3", + "application/vnd.ms-excel", + "application/vnd.stardivision.calc", + "application/vnd.sun.xml.calc", + "application/vnd.oasis.opendocument.spreadsheet", + "application/x-applix-spreadsheet", + "application/x-gnumeric", + "application/x-kspread", + "application/x-kspread-crypt", + "application/x-quattropro", + "application/x-sc", + "application/x-siag", + NULL}}, + { N_("Text File"), + { "text/plain", + NULL}}, + { N_("Video"), + { "video/mp4", + "video/3gpp", + "video/mpeg", + "video/quicktime", + "video/vivo", + "video/x-avi", + "video/x-mng", + "video/x-ms-asf", + "video/x-ms-wmv", + "video/x-msvideo", + "video/x-nsv", + "video/x-real-video", + NULL}} }; /* Number of seconds until cancel dialog shows up */ @@ -248,533 +233,598 @@ struct { */ #define MAX_URI_IN_DIALOG_LENGTH 60 -static void cancel_activate_callback (gpointer callback_data); -static void activate_activation_uris_ready_callback (GList *files, - gpointer callback_data); -static void activation_mount_mountables (ActivateParameters *parameters); -static void activation_start_mountables (ActivateParameters *parameters); -static void activate_callback (GList *files, - gpointer callback_data); -static void activation_mount_not_mounted (ActivateParameters *parameters); +static void cancel_activate_callback (gpointer callback_data); +static void activate_activation_uris_ready_callback (GList *files, + gpointer callback_data); +static void activation_mount_mountables (ActivateParameters *parameters); +static void activation_start_mountables (ActivateParameters *parameters); +static void activate_callback (GList *files, + gpointer callback_data); +static void activation_mount_not_mounted (ActivateParameters *parameters); static void launch_location_free (LaunchLocation *location) { - nautilus_file_unref (location->file); - g_free (location->uri); - g_free (location); + nautilus_file_unref (location->file); + g_free (location->uri); + g_free (location); } static void launch_location_list_free (GList *list) { - g_list_foreach (list, (GFunc)launch_location_free, NULL); - g_list_free (list); + g_list_foreach (list, (GFunc) launch_location_free, NULL); + g_list_free (list); } static GList * get_file_list_for_launch_locations (GList *locations) { - GList *files, *l; - LaunchLocation *location; + GList *files, *l; + LaunchLocation *location; - files = NULL; - for (l = locations; l != NULL; l = l->next) { - location = l->data; + files = NULL; + for (l = locations; l != NULL; l = l->next) + { + location = l->data; - files = g_list_prepend (files, - nautilus_file_ref (location->file)); - } - return g_list_reverse (files); + files = g_list_prepend (files, + nautilus_file_ref (location->file)); + } + return g_list_reverse (files); } static LaunchLocation * launch_location_from_file (NautilusFile *file) { - LaunchLocation *location; - location = g_new (LaunchLocation, 1); - location->file = nautilus_file_ref (file); - location->uri = nautilus_file_get_uri (file); - - return location; + LaunchLocation *location; + location = g_new (LaunchLocation, 1); + location->file = nautilus_file_ref (file); + location->uri = nautilus_file_get_uri (file); + + return location; } static void launch_location_update_from_file (LaunchLocation *location, - NautilusFile *file) + NautilusFile *file) { - nautilus_file_unref (location->file); - g_free (location->uri); - location->file = nautilus_file_ref (file); - location->uri = nautilus_file_get_uri (file); + nautilus_file_unref (location->file); + g_free (location->uri); + location->file = nautilus_file_ref (file); + location->uri = nautilus_file_get_uri (file); } static void launch_location_update_from_uri (LaunchLocation *location, - const char *uri) + const char *uri) { - nautilus_file_unref (location->file); - g_free (location->uri); - location->file = nautilus_file_get_by_uri (uri); - location->uri = g_strdup (uri); + nautilus_file_unref (location->file); + g_free (location->uri); + location->file = nautilus_file_get_by_uri (uri); + location->uri = g_strdup (uri); } static LaunchLocation * -find_launch_location_for_file (GList *list, - NautilusFile *file) +find_launch_location_for_file (GList *list, + NautilusFile *file) { - LaunchLocation *location; - GList *l; + LaunchLocation *location; + GList *l; - for (l = list; l != NULL; l = l->next) { - location = l->data; + for (l = list; l != NULL; l = l->next) + { + location = l->data; - if (location->file == file) { - return location; - } - } - return NULL; + if (location->file == file) + { + return location; + } + } + return NULL; } static GList * launch_locations_from_file_list (GList *list) { - GList *new; + GList *new; - new = NULL; - while (list) { - new = g_list_prepend (new, - launch_location_from_file (list->data)); - list = list->next; - } - new = g_list_reverse (new); - return new; + new = NULL; + while (list) + { + new = g_list_prepend (new, + launch_location_from_file (list->data)); + list = list->next; + } + new = g_list_reverse (new); + return new; } static ApplicationLaunchParameters * application_launch_parameters_new (GAppInfo *application, - GList *uris) + GList *uris) { - ApplicationLaunchParameters *result; + ApplicationLaunchParameters *result; - result = g_new0 (ApplicationLaunchParameters, 1); - result->application = g_object_ref (application); - result->uris = g_list_copy_deep (uris, (GCopyFunc) g_strdup, NULL); + result = g_new0 (ApplicationLaunchParameters, 1); + result->application = g_object_ref (application); + result->uris = g_list_copy_deep (uris, (GCopyFunc) g_strdup, NULL); - return result; + return result; } static void application_launch_parameters_free (ApplicationLaunchParameters *parameters) { - g_object_unref (parameters->application); - g_list_free_full (parameters->uris, g_free); + g_object_unref (parameters->application); + g_list_free_full (parameters->uris, g_free); - g_free (parameters); + g_free (parameters); } static gboolean nautilus_mime_actions_check_if_required_attributes_ready (NautilusFile *file) { - NautilusFileAttributes attributes; - gboolean ready; + NautilusFileAttributes attributes; + gboolean ready; - attributes = nautilus_mime_actions_get_required_file_attributes (); - ready = nautilus_file_check_if_ready (file, attributes); + attributes = nautilus_mime_actions_get_required_file_attributes (); + ready = nautilus_file_check_if_ready (file, attributes); - return ready; + return ready; } -NautilusFileAttributes +NautilusFileAttributes nautilus_mime_actions_get_required_file_attributes (void) { - return NAUTILUS_FILE_ATTRIBUTE_INFO | - NAUTILUS_FILE_ATTRIBUTE_LINK_INFO; + return NAUTILUS_FILE_ATTRIBUTE_INFO | + NAUTILUS_FILE_ATTRIBUTE_LINK_INFO; } GAppInfo * nautilus_mime_get_default_application_for_file (NautilusFile *file) { - GAppInfo *app; - char *mime_type; - char *uri_scheme; + GAppInfo *app; + char *mime_type; + char *uri_scheme; - if (!nautilus_mime_actions_check_if_required_attributes_ready (file)) { - return NULL; - } + if (!nautilus_mime_actions_check_if_required_attributes_ready (file)) + { + return NULL; + } - mime_type = nautilus_file_get_mime_type (file); - app = g_app_info_get_default_for_type (mime_type, - !nautilus_file_is_local_or_fuse (file)); - g_free (mime_type); + mime_type = nautilus_file_get_mime_type (file); + app = g_app_info_get_default_for_type (mime_type, + !nautilus_file_is_local_or_fuse (file)); + g_free (mime_type); + + if (app == NULL) + { + uri_scheme = nautilus_file_get_uri_scheme (file); + if (uri_scheme != NULL) + { + app = g_app_info_get_default_for_uri_scheme (uri_scheme); + g_free (uri_scheme); + } + } - if (app == NULL) { - uri_scheme = nautilus_file_get_uri_scheme (file); - if (uri_scheme != NULL) { - app = g_app_info_get_default_for_uri_scheme (uri_scheme); - g_free (uri_scheme); - } - } - - return app; + return app; } static int file_compare_by_mime_type (NautilusFile *file_a, - NautilusFile *file_b) -{ - char *mime_type_a, *mime_type_b; - int ret; - - mime_type_a = nautilus_file_get_mime_type (file_a); - mime_type_b = nautilus_file_get_mime_type (file_b); - - ret = strcmp (mime_type_a, mime_type_b); - - g_free (mime_type_a); - g_free (mime_type_b); - - return ret; + NautilusFile *file_b) +{ + char *mime_type_a, *mime_type_b; + int ret; + + mime_type_a = nautilus_file_get_mime_type (file_a); + mime_type_b = nautilus_file_get_mime_type (file_b); + + ret = strcmp (mime_type_a, mime_type_b); + + g_free (mime_type_a); + g_free (mime_type_b); + + return ret; } static int file_compare_by_parent_uri (NautilusFile *file_a, - NautilusFile *file_b) { - char *parent_uri_a, *parent_uri_b; - int ret; + NautilusFile *file_b) +{ + char *parent_uri_a, *parent_uri_b; + int ret; - parent_uri_a = nautilus_file_get_parent_uri (file_a); - parent_uri_b = nautilus_file_get_parent_uri (file_b); + parent_uri_a = nautilus_file_get_parent_uri (file_a); + parent_uri_b = nautilus_file_get_parent_uri (file_b); - ret = strcmp (parent_uri_a, parent_uri_b); + ret = strcmp (parent_uri_a, parent_uri_b); - g_free (parent_uri_a); - g_free (parent_uri_b); + g_free (parent_uri_a); + g_free (parent_uri_b); - return ret; + return ret; } GAppInfo * nautilus_mime_get_default_application_for_files (GList *files) { - GList *l, *sorted_files; - NautilusFile *file; - GAppInfo *app, *one_app; + GList *l, *sorted_files; + NautilusFile *file; + GAppInfo *app, *one_app; - g_assert (files != NULL); + g_assert (files != NULL); - sorted_files = g_list_sort (g_list_copy (files), (GCompareFunc) file_compare_by_mime_type); + sorted_files = g_list_sort (g_list_copy (files), (GCompareFunc) file_compare_by_mime_type); - app = NULL; - for (l = sorted_files; l != NULL; l = l->next) { - file = l->data; + app = NULL; + for (l = sorted_files; l != NULL; l = l->next) + { + file = l->data; - if (l->prev && - file_compare_by_mime_type (file, l->prev->data) == 0 && - file_compare_by_parent_uri (file, l->prev->data) == 0) { - continue; - } + if (l->prev && + file_compare_by_mime_type (file, l->prev->data) == 0 && + file_compare_by_parent_uri (file, l->prev->data) == 0) + { + continue; + } - one_app = nautilus_mime_get_default_application_for_file (file); - if (one_app == NULL || (app != NULL && !g_app_info_equal (app, one_app))) { - if (app) { - g_object_unref (app); - } - if (one_app) { - g_object_unref (one_app); - } - app = NULL; - break; - } + one_app = nautilus_mime_get_default_application_for_file (file); + if (one_app == NULL || (app != NULL && !g_app_info_equal (app, one_app))) + { + if (app) + { + g_object_unref (app); + } + if (one_app) + { + g_object_unref (one_app); + } + app = NULL; + break; + } - if (app == NULL) { - app = one_app; - } else { - g_object_unref (one_app); - } - } + if (app == NULL) + { + app = one_app; + } + else + { + g_object_unref (one_app); + } + } - g_list_free (sorted_files); + g_list_free (sorted_files); - return app; + return app; } static void -trash_or_delete_files (GtkWindow *parent_window, - const GList *files, - gboolean delete_if_all_already_in_trash) -{ - GList *locations; - const GList *node; - - locations = NULL; - for (node = files; node != NULL; node = node->next) { - locations = g_list_prepend (locations, - nautilus_file_get_location ((NautilusFile *) node->data)); - } - - locations = g_list_reverse (locations); - - nautilus_file_operations_trash_or_delete (locations, - parent_window, - NULL, NULL); - g_list_free_full (locations, g_object_unref); +trash_or_delete_files (GtkWindow *parent_window, + const GList *files, + gboolean delete_if_all_already_in_trash) +{ + GList *locations; + const GList *node; + + locations = NULL; + for (node = files; node != NULL; node = node->next) + { + locations = g_list_prepend (locations, + nautilus_file_get_location ((NautilusFile *) node->data)); + } + + locations = g_list_reverse (locations); + + nautilus_file_operations_trash_or_delete (locations, + parent_window, + NULL, NULL); + g_list_free_full (locations, g_object_unref); } static void -report_broken_symbolic_link (GtkWindow *parent_window, NautilusFile *file) -{ - char *target_path; - char *display_name; - char *prompt; - char *detail; - GtkDialog *dialog; - GList file_as_list; - int response; - gboolean can_trash; - - g_assert (nautilus_file_is_broken_symbolic_link (file)); - - display_name = nautilus_file_get_display_name (file); - can_trash = nautilus_file_can_trash (file) && !nautilus_file_is_in_trash (file); - - if (can_trash) { - prompt = g_strdup_printf (_("The link ā%sā is broken. Move it to Trash?"), display_name); - } else { - prompt = g_strdup_printf (_("The link ā%sā is broken."), display_name); - } - g_free (display_name); - - target_path = nautilus_file_get_symbolic_link_target_path (file); - if (target_path == NULL) { - detail = g_strdup (_("This link cannot be used because it has no target.")); - } else { - detail = g_strdup_printf (_("This link cannot be used because its target " - "ā%sā doesn't exist."), target_path); - } - - if (!can_trash) { - eel_run_simple_dialog (GTK_WIDGET (parent_window), FALSE, GTK_MESSAGE_WARNING, - prompt, detail, _("_Cancel"), NULL); - goto out; - } - - dialog = eel_show_yes_no_dialog (prompt, detail, _("Mo_ve to Trash"), _("_Cancel"), - parent_window); - - gtk_dialog_set_default_response (dialog, GTK_RESPONSE_CANCEL); - - /* Make this modal to avoid problems with reffing the view & file - * to keep them around in case the view changes, which would then - * cause the old view not to be destroyed, which would cause its - * merged Bonobo items not to be un-merged. Maybe we need to unmerge - * explicitly when disconnecting views instead of relying on the - * unmerge in Destroy. But since BonoboUIHandler is probably going - * to change wildly, I don't want to mess with this now. - */ - - response = gtk_dialog_run (dialog); - gtk_widget_destroy (GTK_WIDGET (dialog)); - - if (response == GTK_RESPONSE_YES) { - file_as_list.data = file; - file_as_list.next = NULL; - file_as_list.prev = NULL; - trash_or_delete_files (parent_window, &file_as_list, TRUE); - } +report_broken_symbolic_link (GtkWindow *parent_window, + NautilusFile *file) +{ + char *target_path; + char *display_name; + char *prompt; + char *detail; + GtkDialog *dialog; + GList file_as_list; + int response; + gboolean can_trash; + + g_assert (nautilus_file_is_broken_symbolic_link (file)); + + display_name = nautilus_file_get_display_name (file); + can_trash = nautilus_file_can_trash (file) && !nautilus_file_is_in_trash (file); + + if (can_trash) + { + prompt = g_strdup_printf (_("The link ā%sā is broken. Move it to Trash?"), display_name); + } + else + { + prompt = g_strdup_printf (_("The link ā%sā is broken."), display_name); + } + g_free (display_name); + + target_path = nautilus_file_get_symbolic_link_target_path (file); + if (target_path == NULL) + { + detail = g_strdup (_("This link cannot be used because it has no target.")); + } + else + { + detail = g_strdup_printf (_("This link cannot be used because its target " + "ā%sā doesn't exist."), target_path); + } + + if (!can_trash) + { + eel_run_simple_dialog (GTK_WIDGET (parent_window), FALSE, GTK_MESSAGE_WARNING, + prompt, detail, _("_Cancel"), NULL); + goto out; + } + + dialog = eel_show_yes_no_dialog (prompt, detail, _("Mo_ve to Trash"), _("_Cancel"), + parent_window); + + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_CANCEL); + + /* Make this modal to avoid problems with reffing the view & file + * to keep them around in case the view changes, which would then + * cause the old view not to be destroyed, which would cause its + * merged Bonobo items not to be un-merged. Maybe we need to unmerge + * explicitly when disconnecting views instead of relying on the + * unmerge in Destroy. But since BonoboUIHandler is probably going + * to change wildly, I don't want to mess with this now. + */ + + response = gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + + if (response == GTK_RESPONSE_YES) + { + file_as_list.data = file; + file_as_list.next = NULL; + file_as_list.prev = NULL; + trash_or_delete_files (parent_window, &file_as_list, TRUE); + } out: - g_free (prompt); - g_free (target_path); - g_free (detail); + g_free (prompt); + g_free (target_path); + g_free (detail); } static ActivationAction -get_executable_text_file_action (GtkWindow *parent_window, NautilusFile *file) -{ - GtkDialog *dialog; - char *file_name; - char *prompt; - char *detail; - int preferences_value; - int response; - - g_assert (nautilus_file_contains_text (file)); - - preferences_value = g_settings_get_enum (nautilus_preferences, - NAUTILUS_PREFERENCES_EXECUTABLE_TEXT_ACTIVATION); - switch (preferences_value) { - case NAUTILUS_EXECUTABLE_TEXT_LAUNCH: - return ACTIVATION_ACTION_LAUNCH; - case NAUTILUS_EXECUTABLE_TEXT_DISPLAY: - return ACTIVATION_ACTION_OPEN_IN_APPLICATION; - case NAUTILUS_EXECUTABLE_TEXT_ASK: - break; - default: - /* Complain non-fatally, since preference data can't be trusted */ - g_warning ("Unknown value %d for NAUTILUS_PREFERENCES_EXECUTABLE_TEXT_ACTIVATION", - preferences_value); - - } - - - file_name = nautilus_file_get_display_name (file); - prompt = g_strdup_printf (_("Do you want to run ā%sā, or display its contents?"), - file_name); - detail = g_strdup_printf (_("ā%sā is an executable text file."), - file_name); - g_free (file_name); - - dialog = eel_create_question_dialog (prompt, - detail, - _("Run in _Terminal"), RESPONSE_RUN_IN_TERMINAL, - _("_Display"), RESPONSE_DISPLAY, - parent_window); - gtk_dialog_add_button (dialog, _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_dialog_add_button (dialog, _("_Run"), RESPONSE_RUN); - gtk_dialog_set_default_response (dialog, GTK_RESPONSE_CANCEL); - gtk_widget_show (GTK_WIDGET (dialog)); - - g_free (prompt); - g_free (detail); - - response = gtk_dialog_run (dialog); - gtk_widget_destroy (GTK_WIDGET (dialog)); - - switch (response) { - case RESPONSE_RUN: - return ACTIVATION_ACTION_LAUNCH; - case RESPONSE_RUN_IN_TERMINAL: - return ACTIVATION_ACTION_LAUNCH_IN_TERMINAL; - case RESPONSE_DISPLAY: - return ACTIVATION_ACTION_OPEN_IN_APPLICATION; - default: - return ACTIVATION_ACTION_DO_NOTHING; - } +get_executable_text_file_action (GtkWindow *parent_window, + NautilusFile *file) +{ + GtkDialog *dialog; + char *file_name; + char *prompt; + char *detail; + int preferences_value; + int response; + + g_assert (nautilus_file_contains_text (file)); + + preferences_value = g_settings_get_enum (nautilus_preferences, + NAUTILUS_PREFERENCES_EXECUTABLE_TEXT_ACTIVATION); + switch (preferences_value) + { + case NAUTILUS_EXECUTABLE_TEXT_LAUNCH: + { + return ACTIVATION_ACTION_LAUNCH; + } + + case NAUTILUS_EXECUTABLE_TEXT_DISPLAY: + { + return ACTIVATION_ACTION_OPEN_IN_APPLICATION; + } + + case NAUTILUS_EXECUTABLE_TEXT_ASK: + { + } + break; + + default: + /* Complain non-fatally, since preference data can't be trusted */ + g_warning ("Unknown value %d for NAUTILUS_PREFERENCES_EXECUTABLE_TEXT_ACTIVATION", + preferences_value); + } + + + file_name = nautilus_file_get_display_name (file); + prompt = g_strdup_printf (_("Do you want to run ā%sā, or display its contents?"), + file_name); + detail = g_strdup_printf (_("ā%sā is an executable text file."), + file_name); + g_free (file_name); + + dialog = eel_create_question_dialog (prompt, + detail, + _("Run in _Terminal"), RESPONSE_RUN_IN_TERMINAL, + _("_Display"), RESPONSE_DISPLAY, + parent_window); + gtk_dialog_add_button (dialog, _("_Cancel"), GTK_RESPONSE_CANCEL); + gtk_dialog_add_button (dialog, _("_Run"), RESPONSE_RUN); + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_CANCEL); + gtk_widget_show (GTK_WIDGET (dialog)); + + g_free (prompt); + g_free (detail); + + response = gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + + switch (response) + { + case RESPONSE_RUN: + { + return ACTIVATION_ACTION_LAUNCH; + } + + case RESPONSE_RUN_IN_TERMINAL: + { + return ACTIVATION_ACTION_LAUNCH_IN_TERMINAL; + } + + case RESPONSE_DISPLAY: + { + return ACTIVATION_ACTION_OPEN_IN_APPLICATION; + } + + default: + return ACTIVATION_ACTION_DO_NOTHING; + } } static ActivationAction get_default_executable_text_file_action (void) { - int preferences_value; - - preferences_value = g_settings_get_enum (nautilus_preferences, - NAUTILUS_PREFERENCES_EXECUTABLE_TEXT_ACTIVATION); - switch (preferences_value) { - case NAUTILUS_EXECUTABLE_TEXT_LAUNCH: - return ACTIVATION_ACTION_LAUNCH; - case NAUTILUS_EXECUTABLE_TEXT_DISPLAY: - return ACTIVATION_ACTION_OPEN_IN_APPLICATION; - case NAUTILUS_EXECUTABLE_TEXT_ASK: - default: - return ACTIVATION_ACTION_ASK; - } + int preferences_value; + + preferences_value = g_settings_get_enum (nautilus_preferences, + NAUTILUS_PREFERENCES_EXECUTABLE_TEXT_ACTIVATION); + switch (preferences_value) + { + case NAUTILUS_EXECUTABLE_TEXT_LAUNCH: + { + return ACTIVATION_ACTION_LAUNCH; + } + + case NAUTILUS_EXECUTABLE_TEXT_DISPLAY: + { + return ACTIVATION_ACTION_OPEN_IN_APPLICATION; + } + + case NAUTILUS_EXECUTABLE_TEXT_ASK: + default: + return ACTIVATION_ACTION_ASK; + } } static ActivationAction 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); + 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; + } + + activation_uri = nautilus_file_get_activation_uri (file); + if (activation_uri == NULL) + { + activation_uri = nautilus_file_get_uri (file); + } + + action = ACTIVATION_ACTION_DO_NOTHING; + if (nautilus_file_is_launchable (file)) + { + char *executable_path; + + action = ACTIVATION_ACTION_LAUNCH; + + executable_path = g_filename_from_uri (activation_uri, NULL, NULL); + if (!executable_path) + { + action = ACTIVATION_ACTION_DO_NOTHING; + } + else if (nautilus_file_contains_text (file)) + { + action = get_default_executable_text_file_action (); + } + g_free (executable_path); + } - if (can_extract && nautilus_file_is_archive (file)) { - return ACTIVATION_ACTION_EXTRACT; + if (action == ACTIVATION_ACTION_DO_NOTHING) + { + if (nautilus_file_opens_in_view (file)) + { + action = ACTIVATION_ACTION_OPEN_IN_VIEW; } + else + { + action = ACTIVATION_ACTION_OPEN_IN_APPLICATION; + } + } + g_free (activation_uri); - if (nautilus_file_is_nautilus_link (file)) { - return ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE; - } - - activation_uri = nautilus_file_get_activation_uri (file); - if (activation_uri == NULL) { - activation_uri = nautilus_file_get_uri (file); - } - - action = ACTIVATION_ACTION_DO_NOTHING; - if (nautilus_file_is_launchable (file)) { - char *executable_path; - - action = ACTIVATION_ACTION_LAUNCH; - - executable_path = g_filename_from_uri (activation_uri, NULL, NULL); - if (!executable_path) { - action = ACTIVATION_ACTION_DO_NOTHING; - } else if (nautilus_file_contains_text (file)) { - action = get_default_executable_text_file_action (); - } - g_free (executable_path); - } - - if (action == ACTIVATION_ACTION_DO_NOTHING) { - if (nautilus_file_opens_in_view (file)) { - action = ACTIVATION_ACTION_OPEN_IN_VIEW; - } else { - action = ACTIVATION_ACTION_OPEN_IN_APPLICATION; - } - } - g_free (activation_uri); - - return action; + return action; } gboolean nautilus_mime_file_extracts (NautilusFile *file) { - return get_activation_action (file) == ACTIVATION_ACTION_EXTRACT; + return get_activation_action (file) == ACTIVATION_ACTION_EXTRACT; } gboolean nautilus_mime_file_launches (NautilusFile *file) { - ActivationAction activation_action; + ActivationAction activation_action; - activation_action = get_activation_action (file); + activation_action = get_activation_action (file); - return (activation_action == ACTIVATION_ACTION_LAUNCH); + return (activation_action == ACTIVATION_ACTION_LAUNCH); } gboolean nautilus_mime_file_opens_in_external_app (NautilusFile *file) { - ActivationAction activation_action; - - activation_action = get_activation_action (file); - - return (activation_action == ACTIVATION_ACTION_OPEN_IN_APPLICATION); + ActivationAction activation_action; + + activation_action = get_activation_action (file); + + return (activation_action == ACTIVATION_ACTION_OPEN_IN_APPLICATION); } static unsigned int mime_application_hash (GAppInfo *app) { - const char *id; + const char *id; - id = g_app_info_get_id (app); + id = g_app_info_get_id (app); - if (id == NULL) { - return GPOINTER_TO_UINT(app); - } + if (id == NULL) + { + return GPOINTER_TO_UINT (app); + } - return g_str_hash (id); + return g_str_hash (id); } static void -list_to_parameters_foreach (GAppInfo *application, - GList *uris, - GList **ret) +list_to_parameters_foreach (GAppInfo *application, + GList *uris, + GList **ret) { - ApplicationLaunchParameters *parameters; + ApplicationLaunchParameters *parameters; - uris = g_list_reverse (uris); + uris = g_list_reverse (uris); - parameters = application_launch_parameters_new - (application, uris); - *ret = g_list_prepend (*ret, parameters); + parameters = application_launch_parameters_new + (application, uris); + *ret = g_list_prepend (*ret, parameters); } @@ -787,1533 +837,1699 @@ list_to_parameters_foreach (GAppInfo *application, * * @files: Files to use for construction. * @unhandled_files: Files without any default application will be put here. - * + * * Return value: Newly allocated list of ApplicationLaunchParameters. **/ static GList * -make_activation_parameters (GList *uris, - GList **unhandled_uris) -{ - GList *ret, *l, *app_uris; - NautilusFile *file; - GAppInfo *app, *old_app; - GHashTable *app_table; - char *uri; - - ret = NULL; - *unhandled_uris = NULL; - - app_table = g_hash_table_new_full - ((GHashFunc) mime_application_hash, - (GEqualFunc) g_app_info_equal, - (GDestroyNotify) g_object_unref, - (GDestroyNotify) g_list_free); - - for (l = uris; l != NULL; l = l->next) { - uri = l->data; - file = nautilus_file_get_by_uri (uri); - - app = nautilus_mime_get_default_application_for_file (file); - if (app != NULL) { - app_uris = NULL; - - if (g_hash_table_lookup_extended (app_table, app, - (gpointer *) &old_app, - (gpointer *) &app_uris)) { - g_hash_table_steal (app_table, old_app); - - app_uris = g_list_prepend (app_uris, uri); - - g_object_unref (app); - app = old_app; - } else { - app_uris = g_list_prepend (NULL, uri); - } - - g_hash_table_insert (app_table, app, app_uris); - } else { - *unhandled_uris = g_list_prepend (*unhandled_uris, uri); - } - nautilus_file_unref (file); - } +make_activation_parameters (GList *uris, + GList **unhandled_uris) +{ + GList *ret, *l, *app_uris; + NautilusFile *file; + GAppInfo *app, *old_app; + GHashTable *app_table; + char *uri; + + ret = NULL; + *unhandled_uris = NULL; + + app_table = g_hash_table_new_full + ((GHashFunc) mime_application_hash, + (GEqualFunc) g_app_info_equal, + (GDestroyNotify) g_object_unref, + (GDestroyNotify) g_list_free); + + for (l = uris; l != NULL; l = l->next) + { + uri = l->data; + file = nautilus_file_get_by_uri (uri); + + app = nautilus_mime_get_default_application_for_file (file); + if (app != NULL) + { + app_uris = NULL; + + if (g_hash_table_lookup_extended (app_table, app, + (gpointer *) &old_app, + (gpointer *) &app_uris)) + { + g_hash_table_steal (app_table, old_app); + + app_uris = g_list_prepend (app_uris, uri); + + g_object_unref (app); + app = old_app; + } + else + { + app_uris = g_list_prepend (NULL, uri); + } + + g_hash_table_insert (app_table, app, app_uris); + } + else + { + *unhandled_uris = g_list_prepend (*unhandled_uris, uri); + } + nautilus_file_unref (file); + } - g_hash_table_foreach (app_table, - (GHFunc) list_to_parameters_foreach, - &ret); + g_hash_table_foreach (app_table, + (GHFunc) list_to_parameters_foreach, + &ret); - g_hash_table_destroy (app_table); + g_hash_table_destroy (app_table); - *unhandled_uris = g_list_reverse (*unhandled_uris); + *unhandled_uris = g_list_reverse (*unhandled_uris); - return g_list_reverse (ret); + return g_list_reverse (ret); } static gboolean file_was_cancelled (NautilusFile *file) { - GError *error; - - error = nautilus_file_get_file_info_error (file); - return - error != NULL && - error->domain == G_IO_ERROR && - error->code == G_IO_ERROR_CANCELLED; + GError *error; + + error = nautilus_file_get_file_info_error (file); + return + error != NULL && + error->domain == G_IO_ERROR && + error->code == G_IO_ERROR_CANCELLED; } static gboolean file_was_not_mounted (NautilusFile *file) { - GError *error; - - error = nautilus_file_get_file_info_error (file); - return - error != NULL && - error->domain == G_IO_ERROR && - error->code == G_IO_ERROR_NOT_MOUNTED; + GError *error; + + error = nautilus_file_get_file_info_error (file); + return + error != NULL && + error->domain == G_IO_ERROR && + error->code == G_IO_ERROR_NOT_MOUNTED; } static void activation_parameters_free (ActivateParameters *parameters) { - if (parameters->timed_wait_active) { - eel_timed_wait_stop (cancel_activate_callback, parameters); - } - - if (parameters->slot) { - g_object_remove_weak_pointer (G_OBJECT (parameters->slot), (gpointer *)¶meters->slot); - } - if (parameters->parent_window) { - g_object_remove_weak_pointer (G_OBJECT (parameters->parent_window), (gpointer *)¶meters->parent_window); - } - g_object_unref (parameters->cancellable); - launch_location_list_free (parameters->locations); - nautilus_file_list_free (parameters->mountables); - nautilus_file_list_free (parameters->start_mountables); - nautilus_file_list_free (parameters->not_mounted); - g_free (parameters->activation_directory); - g_free (parameters->timed_wait_prompt); - g_assert (parameters->files_handle == NULL); - g_free (parameters); + if (parameters->timed_wait_active) + { + eel_timed_wait_stop (cancel_activate_callback, parameters); + } + + if (parameters->slot) + { + g_object_remove_weak_pointer (G_OBJECT (parameters->slot), (gpointer *) ¶meters->slot); + } + if (parameters->parent_window) + { + g_object_remove_weak_pointer (G_OBJECT (parameters->parent_window), (gpointer *) ¶meters->parent_window); + } + g_object_unref (parameters->cancellable); + launch_location_list_free (parameters->locations); + nautilus_file_list_free (parameters->mountables); + nautilus_file_list_free (parameters->start_mountables); + nautilus_file_list_free (parameters->not_mounted); + g_free (parameters->activation_directory); + g_free (parameters->timed_wait_prompt); + g_assert (parameters->files_handle == NULL); + g_free (parameters); } static void cancel_activate_callback (gpointer callback_data) { - ActivateParameters *parameters = callback_data; + ActivateParameters *parameters = callback_data; - parameters->timed_wait_active = FALSE; - - g_cancellable_cancel (parameters->cancellable); + parameters->timed_wait_active = FALSE; - if (parameters->files_handle) { - nautilus_file_list_cancel_call_when_ready (parameters->files_handle); - parameters->files_handle = NULL; - activation_parameters_free (parameters); - } + g_cancellable_cancel (parameters->cancellable); + + if (parameters->files_handle) + { + nautilus_file_list_cancel_call_when_ready (parameters->files_handle); + parameters->files_handle = NULL; + activation_parameters_free (parameters); + } } static void activation_start_timed_cancel (ActivateParameters *parameters) { - parameters->timed_wait_active = TRUE; - eel_timed_wait_start_with_duration - (DELAY_UNTIL_CANCEL_MSECS, - cancel_activate_callback, - parameters, - parameters->timed_wait_prompt, - parameters->parent_window); + parameters->timed_wait_active = TRUE; + eel_timed_wait_start_with_duration + (DELAY_UNTIL_CANCEL_MSECS, + cancel_activate_callback, + parameters, + parameters->timed_wait_prompt, + parameters->parent_window); } static void pause_activation_timed_cancel (ActivateParameters *parameters) { - if (parameters->timed_wait_active) { - eel_timed_wait_stop (cancel_activate_callback, parameters); - parameters->timed_wait_active = FALSE; - } + if (parameters->timed_wait_active) + { + eel_timed_wait_stop (cancel_activate_callback, parameters); + parameters->timed_wait_active = FALSE; + } } static void unpause_activation_timed_cancel (ActivateParameters *parameters) { - if (!parameters->timed_wait_active) { - activation_start_timed_cancel (parameters); - } + if (!parameters->timed_wait_active) + { + activation_start_timed_cancel (parameters); + } } static void -activate_mount_op_active (GtkMountOperation *operation, - GParamSpec *pspec, - ActivateParameters *parameters) +activate_mount_op_active (GtkMountOperation *operation, + GParamSpec *pspec, + ActivateParameters *parameters) { - gboolean is_active; + gboolean is_active; - g_object_get (operation, "is-showing", &is_active, NULL); + g_object_get (operation, "is-showing", &is_active, NULL); - if (is_active) { - pause_activation_timed_cancel (parameters); - } else { - unpause_activation_timed_cancel (parameters); - } + if (is_active) + { + pause_activation_timed_cancel (parameters); + } + else + { + unpause_activation_timed_cancel (parameters); + } } static gboolean confirm_multiple_windows (GtkWindow *parent_window, - int count, - gboolean use_tabs) -{ - GtkDialog *dialog; - char *prompt; - char *detail; - int response; - - if (count <= SILENT_WINDOW_OPEN_LIMIT) { - return TRUE; - } - - prompt = _("Are you sure you want to open all files?"); - if (use_tabs) { - detail = g_strdup_printf (ngettext("This will open %d separate tab.", - "This will open %d separate tabs.", count), count); - } else { - detail = g_strdup_printf (ngettext("This will open %d separate window.", - "This will open %d separate windows.", count), count); - } - dialog = eel_show_yes_no_dialog (prompt, detail, - _("_OK"), _("_Cancel"), - parent_window); - g_free (detail); - - response = gtk_dialog_run (dialog); - gtk_widget_destroy (GTK_WIDGET (dialog)); - - return response == GTK_RESPONSE_YES; -} - -typedef struct { - NautilusWindowSlot *slot; - GtkWindow *parent_window; - NautilusFile *file; - GList *files; - NautilusWindowOpenFlags flags; - char *activation_directory; - gboolean user_confirmation; - char *uri; - GDBusProxy *proxy; - GtkWidget *dialog; + int count, + gboolean use_tabs) +{ + GtkDialog *dialog; + char *prompt; + char *detail; + int response; + + if (count <= SILENT_WINDOW_OPEN_LIMIT) + { + return TRUE; + } + + prompt = _("Are you sure you want to open all files?"); + if (use_tabs) + { + detail = g_strdup_printf (ngettext ("This will open %d separate tab.", + "This will open %d separate tabs.", count), count); + } + else + { + detail = g_strdup_printf (ngettext ("This will open %d separate window.", + "This will open %d separate windows.", count), count); + } + dialog = eel_show_yes_no_dialog (prompt, detail, + _("_OK"), _("_Cancel"), + parent_window); + g_free (detail); + + response = gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + + return response == GTK_RESPONSE_YES; +} + +typedef struct +{ + NautilusWindowSlot *slot; + GtkWindow *parent_window; + NautilusFile *file; + GList *files; + NautilusWindowOpenFlags flags; + char *activation_directory; + gboolean user_confirmation; + char *uri; + GDBusProxy *proxy; + GtkWidget *dialog; } ActivateParametersInstall; static void activate_parameters_install_free (ActivateParametersInstall *parameters_install) { - if (parameters_install->slot) { - g_object_remove_weak_pointer (G_OBJECT (parameters_install->slot), (gpointer *)¶meters_install->slot); - } - if (parameters_install->parent_window) { - g_object_remove_weak_pointer (G_OBJECT (parameters_install->parent_window), (gpointer *)¶meters_install->parent_window); - } + if (parameters_install->slot) + { + g_object_remove_weak_pointer (G_OBJECT (parameters_install->slot), (gpointer *) ¶meters_install->slot); + } + if (parameters_install->parent_window) + { + g_object_remove_weak_pointer (G_OBJECT (parameters_install->parent_window), (gpointer *) ¶meters_install->parent_window); + } - if (parameters_install->proxy != NULL) { - g_object_unref (parameters_install->proxy); - } + if (parameters_install->proxy != NULL) + { + g_object_unref (parameters_install->proxy); + } - nautilus_file_unref (parameters_install->file); - nautilus_file_list_free (parameters_install->files); - g_free (parameters_install->activation_directory); - g_free (parameters_install->uri); - g_free (parameters_install); + nautilus_file_unref (parameters_install->file); + nautilus_file_list_free (parameters_install->files); + g_free (parameters_install->activation_directory); + g_free (parameters_install->uri); + g_free (parameters_install); } static char * -get_application_no_mime_type_handler_message (NautilusFile *file, char *uri) +get_application_no_mime_type_handler_message (NautilusFile *file, + char *uri) { - char *uri_for_display; - char *name; - char *error_message; + char *uri_for_display; + char *name; + char *error_message; - name = nautilus_file_get_display_name (file); + name = nautilus_file_get_display_name (file); - /* Truncate the URI so it doesn't get insanely wide. Note that even - * though the dialog uses wrapped text, if the URI doesn't contain - * white space then the text-wrapping code is too stupid to wrap it. - */ - uri_for_display = eel_str_middle_truncate (name, MAX_URI_IN_DIALOG_LENGTH); - error_message = g_strdup_printf (_("Could not display ā%sā."), uri_for_display); - g_free (uri_for_display); - g_free (name); + /* Truncate the URI so it doesn't get insanely wide. Note that even + * though the dialog uses wrapped text, if the URI doesn't contain + * white space then the text-wrapping code is too stupid to wrap it. + */ + uri_for_display = eel_str_middle_truncate (name, MAX_URI_IN_DIALOG_LENGTH); + error_message = g_strdup_printf (_("Could not display ā%sā."), uri_for_display); + g_free (uri_for_display); + g_free (name); - return error_message; + return error_message; } static void open_with_response_cb (GtkDialog *dialog, - gint response_id, - gpointer user_data) -{ - GtkWindow *parent_window; - NautilusFile *file; - GList files; - GAppInfo *info; - ActivateParametersInstall *parameters = user_data; - - if (response_id != GTK_RESPONSE_OK) { - gtk_widget_destroy (GTK_WIDGET (dialog)); - return; - } + gint response_id, + gpointer user_data) +{ + GtkWindow *parent_window; + NautilusFile *file; + GList files; + GAppInfo *info; + ActivateParametersInstall *parameters = user_data; + + if (response_id != GTK_RESPONSE_OK) + { + gtk_widget_destroy (GTK_WIDGET (dialog)); + return; + } - parent_window = parameters->parent_window; - file = g_object_get_data (G_OBJECT (dialog), "mime-action:file"); - info = gtk_app_chooser_get_app_info (GTK_APP_CHOOSER (dialog)); + parent_window = parameters->parent_window; + file = g_object_get_data (G_OBJECT (dialog), "mime-action:file"); + info = gtk_app_chooser_get_app_info (GTK_APP_CHOOSER (dialog)); - gtk_widget_destroy (GTK_WIDGET (dialog)); + gtk_widget_destroy (GTK_WIDGET (dialog)); - g_signal_emit_by_name (nautilus_signaller_get_current (), "mime-data-changed"); + g_signal_emit_by_name (nautilus_signaller_get_current (), "mime-data-changed"); - files.next = NULL; - files.prev = NULL; - files.data = file; - nautilus_launch_application (info, &files, parent_window); + files.next = NULL; + files.prev = NULL; + files.data = file; + nautilus_launch_application (info, &files, parent_window); - g_object_unref (info); + g_object_unref (info); - activate_parameters_install_free (parameters); + activate_parameters_install_free (parameters); } static void -choose_program (GtkDialog *message_dialog, int response, gpointer callback_data) -{ - GtkWidget *dialog; - NautilusFile *file; - GFile *location; - ActivateParametersInstall *parameters = callback_data; - - if (response != GTK_RESPONSE_ACCEPT){ - gtk_widget_destroy (GTK_WIDGET (message_dialog)); - activate_parameters_install_free (parameters); - return; - } +choose_program (GtkDialog *message_dialog, + int response, + gpointer callback_data) +{ + GtkWidget *dialog; + NautilusFile *file; + GFile *location; + ActivateParametersInstall *parameters = callback_data; + + if (response != GTK_RESPONSE_ACCEPT) + { + gtk_widget_destroy (GTK_WIDGET (message_dialog)); + activate_parameters_install_free (parameters); + return; + } - file = g_object_get_data (G_OBJECT (message_dialog), "mime-action:file"); + file = g_object_get_data (G_OBJECT (message_dialog), "mime-action:file"); - g_assert (NAUTILUS_IS_FILE (file)); + g_assert (NAUTILUS_IS_FILE (file)); - location = nautilus_file_get_location (file); - nautilus_file_ref (file); + location = nautilus_file_get_location (file); + nautilus_file_ref (file); - /* Destroy the message dialog after ref:ing the file */ - gtk_widget_destroy (GTK_WIDGET (message_dialog)); + /* Destroy the message dialog after ref:ing the file */ + gtk_widget_destroy (GTK_WIDGET (message_dialog)); - dialog = gtk_app_chooser_dialog_new (parameters->parent_window, - GTK_DIALOG_MODAL, - location); - g_object_set_data_full (G_OBJECT (dialog), - "mime-action:file", - nautilus_file_ref (file), - (GDestroyNotify)nautilus_file_unref); + dialog = gtk_app_chooser_dialog_new (parameters->parent_window, + GTK_DIALOG_MODAL, + location); + g_object_set_data_full (G_OBJECT (dialog), + "mime-action:file", + nautilus_file_ref (file), + (GDestroyNotify) nautilus_file_unref); - gtk_widget_show (dialog); + gtk_widget_show (dialog); - g_signal_connect (dialog, - "response", - G_CALLBACK (open_with_response_cb), - parameters); + g_signal_connect (dialog, + "response", + G_CALLBACK (open_with_response_cb), + parameters); - g_object_unref (location); - nautilus_file_unref (file); + g_object_unref (location); + nautilus_file_unref (file); } static void show_unhandled_type_error (ActivateParametersInstall *parameters) { - GtkWidget *dialog; - - char *mime_type = nautilus_file_get_mime_type (parameters->file); - char *error_message = get_application_no_mime_type_handler_message (parameters->file, parameters->uri); - if (g_content_type_is_unknown (mime_type)) { - dialog = gtk_message_dialog_new (parameters->parent_window, - GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - 0, - "%s", error_message); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - _("The file is of an unknown type")); - } else { - char *text; - text = g_strdup_printf (_("There is no application installed for ā%sā files"), g_content_type_get_description (mime_type)); - - dialog = gtk_message_dialog_new (parameters->parent_window, - GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - 0, - "%s", error_message); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - "%s", text); + GtkWidget *dialog; + + char *mime_type = nautilus_file_get_mime_type (parameters->file); + char *error_message = get_application_no_mime_type_handler_message (parameters->file, parameters->uri); + if (g_content_type_is_unknown (mime_type)) + { + dialog = gtk_message_dialog_new (parameters->parent_window, + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + 0, + "%s", error_message); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("The file is of an unknown type")); + } + else + { + char *text; + text = g_strdup_printf (_("There is no application installed for ā%sā files"), g_content_type_get_description (mime_type)); + + dialog = gtk_message_dialog_new (parameters->parent_window, + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + 0, + "%s", error_message); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", text); + + g_free (text); + } - g_free (text); - } + gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Select Application"), GTK_RESPONSE_ACCEPT); - gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Select Application"), GTK_RESPONSE_ACCEPT); + gtk_dialog_add_button (GTK_DIALOG (dialog), _("_OK"), GTK_RESPONSE_OK); - gtk_dialog_add_button (GTK_DIALOG (dialog), _("_OK"), GTK_RESPONSE_OK); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + g_object_set_data_full (G_OBJECT (dialog), + "mime-action:file", + nautilus_file_ref (parameters->file), + (GDestroyNotify) nautilus_file_unref); - g_object_set_data_full (G_OBJECT (dialog), - "mime-action:file", - nautilus_file_ref (parameters->file), - (GDestroyNotify)nautilus_file_unref); + gtk_widget_show (GTK_WIDGET (dialog)); - gtk_widget_show (GTK_WIDGET (dialog)); - - g_signal_connect (dialog, "response", - G_CALLBACK (choose_program), parameters); + g_signal_connect (dialog, "response", + G_CALLBACK (choose_program), parameters); - g_free (error_message); - g_free (mime_type); + g_free (error_message); + g_free (mime_type); } static void search_for_application_dbus_call_notify_cb (GDBusProxy *proxy, - GAsyncResult *result, - gpointer user_data) -{ - ActivateParametersInstall *parameters_install = user_data; - GVariant *variant; - GError *error = NULL; - - variant = g_dbus_proxy_call_finish (proxy, result, &error); - if (variant == NULL) { - if (!g_dbus_error_is_remote_error (error) || - g_strcmp0 (g_dbus_error_get_remote_error (error), "org.freedesktop.PackageKit.Modify.Failed") == 0) { - char *message; - - message = g_strdup_printf ("%s\n%s", - _("There was an internal error trying to search for applications:"), - error->message); - eel_show_error_dialog (_("Unable to search for application"), message, - parameters_install->parent_window); - g_free (message); - } else { - g_warning ("Error while trying to search for applications: %s", - error->message); - } - - g_error_free (error); - activate_parameters_install_free (parameters_install); - return; - } - - g_variant_unref (variant); - - /* activate the file again */ - nautilus_mime_activate_files (parameters_install->parent_window, - parameters_install->slot, - parameters_install->files, - parameters_install->activation_directory, - parameters_install->flags, - parameters_install->user_confirmation); - - activate_parameters_install_free (parameters_install); + GAsyncResult *result, + gpointer user_data) +{ + ActivateParametersInstall *parameters_install = user_data; + GVariant *variant; + GError *error = NULL; + + variant = g_dbus_proxy_call_finish (proxy, result, &error); + if (variant == NULL) + { + if (!g_dbus_error_is_remote_error (error) || + g_strcmp0 (g_dbus_error_get_remote_error (error), "org.freedesktop.PackageKit.Modify.Failed") == 0) + { + char *message; + + message = g_strdup_printf ("%s\n%s", + _("There was an internal error trying to search for applications:"), + error->message); + eel_show_error_dialog (_("Unable to search for application"), message, + parameters_install->parent_window); + g_free (message); + } + else + { + g_warning ("Error while trying to search for applications: %s", + error->message); + } + + g_error_free (error); + activate_parameters_install_free (parameters_install); + return; + } + + g_variant_unref (variant); + + /* activate the file again */ + nautilus_mime_activate_files (parameters_install->parent_window, + parameters_install->slot, + parameters_install->files, + parameters_install->activation_directory, + parameters_install->flags, + parameters_install->user_confirmation); + + activate_parameters_install_free (parameters_install); } static void -search_for_application_mime_type (ActivateParametersInstall *parameters_install, const gchar *mime_type) +search_for_application_mime_type (ActivateParametersInstall *parameters_install, + const gchar *mime_type) { - GdkWindow *window; - guint xid = 0; - const char *mime_types[2]; + GdkWindow *window; + guint xid = 0; + const char *mime_types[2]; - g_assert (parameters_install->proxy != NULL); + g_assert (parameters_install->proxy != NULL); - /* get XID from parent window */ - window = gtk_widget_get_window (GTK_WIDGET (parameters_install->parent_window)); - if (window != NULL) { - xid = GDK_WINDOW_XID (window); - } + /* get XID from parent window */ + window = gtk_widget_get_window (GTK_WIDGET (parameters_install->parent_window)); + if (window != NULL) + { + xid = GDK_WINDOW_XID (window); + } - mime_types[0] = mime_type; - mime_types[1] = NULL; + mime_types[0] = mime_type; + mime_types[1] = NULL; - g_dbus_proxy_call (parameters_install->proxy, - "InstallMimeTypes", - g_variant_new ("(u^ass)", - xid, - mime_types, - "hide-confirm-search"), - G_DBUS_CALL_FLAGS_NONE, - G_MAXINT /* no timeout */, - NULL /* cancellable */, - (GAsyncReadyCallback) search_for_application_dbus_call_notify_cb, - parameters_install); + g_dbus_proxy_call (parameters_install->proxy, + "InstallMimeTypes", + g_variant_new ("(u^ass)", + xid, + mime_types, + "hide-confirm-search"), + G_DBUS_CALL_FLAGS_NONE, + G_MAXINT /* no timeout */, + NULL /* cancellable */, + (GAsyncReadyCallback) search_for_application_dbus_call_notify_cb, + parameters_install); - DEBUG ("InstallMimeType method invoked for %s", mime_type); + DEBUG ("InstallMimeType method invoked for %s", mime_type); } static void -application_unhandled_file_install (GtkDialog *dialog, - gint response_id, +application_unhandled_file_install (GtkDialog *dialog, + gint response_id, ActivateParametersInstall *parameters_install) { - char *mime_type; + char *mime_type; - gtk_widget_destroy (GTK_WIDGET (dialog)); - parameters_install->dialog = NULL; + gtk_widget_destroy (GTK_WIDGET (dialog)); + parameters_install->dialog = NULL; - if (response_id == GTK_RESPONSE_YES) { - mime_type = nautilus_file_get_mime_type (parameters_install->file); - search_for_application_mime_type (parameters_install, mime_type); - g_free (mime_type); - } else { - /* free as we're not going to get the async dbus callback */ - activate_parameters_install_free (parameters_install); - } + if (response_id == GTK_RESPONSE_YES) + { + mime_type = nautilus_file_get_mime_type (parameters_install->file); + search_for_application_mime_type (parameters_install, mime_type); + g_free (mime_type); + } + else + { + /* free as we're not going to get the async dbus callback */ + activate_parameters_install_free (parameters_install); + } } static gboolean delete_cb (GtkDialog *dialog) { - gtk_dialog_response (dialog, GTK_RESPONSE_DELETE_EVENT); - return TRUE; + gtk_dialog_response (dialog, GTK_RESPONSE_DELETE_EVENT); + return TRUE; } static void -pk_proxy_appeared_cb (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - ActivateParametersInstall *parameters_install = user_data; - char *mime_type, *name_owner; - char *error_message; - GtkWidget *dialog; - GDBusProxy *proxy; - GError *error = NULL; - - proxy = g_dbus_proxy_new_for_bus_finish (res, &error); - name_owner = g_dbus_proxy_get_name_owner (proxy); - - if (error != NULL || name_owner == NULL) { - g_warning ("Couldn't call Modify on the PackageKit interface: %s", - error != NULL ? error->message : "no owner for PackageKit"); - g_clear_error (&error); - - /* show an unhelpful dialog */ - show_unhandled_type_error (parameters_install); - - return; - } - - g_free (name_owner); - - mime_type = nautilus_file_get_mime_type (parameters_install->file); - error_message = get_application_no_mime_type_handler_message (parameters_install->file, - parameters_install->uri); - /* use a custom dialog to prompt the user to install new software */ - dialog = gtk_message_dialog_new (parameters_install->parent_window, 0, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_YES_NO, - "%s", error_message); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - _("There is no application installed for ā%sā files.\n" - "Do you want to search for an application to open this file?"), - g_content_type_get_description (mime_type)); - gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); - - parameters_install->dialog = dialog; - parameters_install->proxy = proxy; - - g_signal_connect (dialog, "response", - G_CALLBACK (application_unhandled_file_install), - parameters_install); - g_signal_connect (dialog, "delete-event", - G_CALLBACK (delete_cb), NULL); - gtk_widget_show_all (dialog); - g_free (mime_type); +pk_proxy_appeared_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + ActivateParametersInstall *parameters_install = user_data; + char *mime_type, *name_owner; + char *error_message; + GtkWidget *dialog; + GDBusProxy *proxy; + GError *error = NULL; + + proxy = g_dbus_proxy_new_for_bus_finish (res, &error); + name_owner = g_dbus_proxy_get_name_owner (proxy); + + if (error != NULL || name_owner == NULL) + { + g_warning ("Couldn't call Modify on the PackageKit interface: %s", + error != NULL ? error->message : "no owner for PackageKit"); + g_clear_error (&error); + + /* show an unhelpful dialog */ + show_unhandled_type_error (parameters_install); + + return; + } + + g_free (name_owner); + + mime_type = nautilus_file_get_mime_type (parameters_install->file); + error_message = get_application_no_mime_type_handler_message (parameters_install->file, + parameters_install->uri); + /* use a custom dialog to prompt the user to install new software */ + dialog = gtk_message_dialog_new (parameters_install->parent_window, 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_YES_NO, + "%s", error_message); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("There is no application installed for ā%sā files.\n" + "Do you want to search for an application to open this file?"), + g_content_type_get_description (mime_type)); + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + + parameters_install->dialog = dialog; + parameters_install->proxy = proxy; + + g_signal_connect (dialog, "response", + G_CALLBACK (application_unhandled_file_install), + parameters_install); + g_signal_connect (dialog, "delete-event", + G_CALLBACK (delete_cb), NULL); + gtk_widget_show_all (dialog); + g_free (mime_type); } static void -application_unhandled_uri (ActivateParameters *parameters, char *uri) -{ - gboolean show_install_mime; - char *mime_type; - NautilusFile *file; - ActivateParametersInstall *parameters_install; - - file = nautilus_file_get_by_uri (uri); - - mime_type = nautilus_file_get_mime_type (file); - - /* copy the parts of parameters we are interested in as the orignal will be unref'd */ - parameters_install = g_new0 (ActivateParametersInstall, 1); - parameters_install->slot = parameters->slot; - g_object_add_weak_pointer (G_OBJECT (parameters_install->slot), (gpointer *)¶meters_install->slot); - if (parameters->parent_window) { - parameters_install->parent_window = parameters->parent_window; - g_object_add_weak_pointer (G_OBJECT (parameters_install->parent_window), (gpointer *)¶meters_install->parent_window); - } - parameters_install->activation_directory = g_strdup (parameters->activation_directory); - parameters_install->file = file; - parameters_install->files = get_file_list_for_launch_locations (parameters->locations); - parameters_install->flags = parameters->flags; - parameters_install->user_confirmation = parameters->user_confirmation; - parameters_install->uri = g_strdup(uri); +application_unhandled_uri (ActivateParameters *parameters, + char *uri) +{ + gboolean show_install_mime; + char *mime_type; + NautilusFile *file; + ActivateParametersInstall *parameters_install; + + file = nautilus_file_get_by_uri (uri); + + mime_type = nautilus_file_get_mime_type (file); + + /* copy the parts of parameters we are interested in as the orignal will be unref'd */ + parameters_install = g_new0 (ActivateParametersInstall, 1); + parameters_install->slot = parameters->slot; + g_object_add_weak_pointer (G_OBJECT (parameters_install->slot), (gpointer *) ¶meters_install->slot); + if (parameters->parent_window) + { + parameters_install->parent_window = parameters->parent_window; + g_object_add_weak_pointer (G_OBJECT (parameters_install->parent_window), (gpointer *) ¶meters_install->parent_window); + } + parameters_install->activation_directory = g_strdup (parameters->activation_directory); + parameters_install->file = file; + parameters_install->files = get_file_list_for_launch_locations (parameters->locations); + parameters_install->flags = parameters->flags; + parameters_install->user_confirmation = parameters->user_confirmation; + parameters_install->uri = g_strdup (uri); #ifdef ENABLE_PACKAGEKIT - /* allow an admin to disable the PackageKit search functionality */ - show_install_mime = g_settings_get_boolean (nautilus_preferences, NAUTILUS_PREFERENCES_INSTALL_MIME_ACTIVATION); + /* allow an admin to disable the PackageKit search functionality */ + show_install_mime = g_settings_get_boolean (nautilus_preferences, NAUTILUS_PREFERENCES_INSTALL_MIME_ACTIVATION); #else - /* we have no install functionality */ - show_install_mime = FALSE; + /* we have no install functionality */ + show_install_mime = FALSE; #endif - /* There is no use trying to look for handlers of application/octet-stream */ - if (g_content_type_is_unknown (mime_type)) { - show_install_mime = FALSE; - } + /* There is no use trying to look for handlers of application/octet-stream */ + if (g_content_type_is_unknown (mime_type)) + { + show_install_mime = FALSE; + } - g_free (mime_type); + g_free (mime_type); - if (!show_install_mime) { - goto out; - } + if (!show_install_mime) + { + goto out; + } - g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - "org.freedesktop.PackageKit", - "/org/freedesktop/PackageKit", - "org.freedesktop.PackageKit.Modify", - NULL, - pk_proxy_appeared_cb, - parameters_install); + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.PackageKit", + "/org/freedesktop/PackageKit", + "org.freedesktop.PackageKit.Modify", + NULL, + pk_proxy_appeared_cb, + parameters_install); - return; + return; out: - /* show an unhelpful dialog */ - show_unhandled_type_error (parameters_install); + /* show an unhelpful dialog */ + show_unhandled_type_error (parameters_install); } -typedef struct { - GtkWindow *parent_window; - NautilusFile *file; +typedef struct +{ + GtkWindow *parent_window; + NautilusFile *file; } ActivateParametersDesktop; static void activate_parameters_desktop_free (ActivateParametersDesktop *parameters_desktop) { - if (parameters_desktop->parent_window) { - g_object_remove_weak_pointer (G_OBJECT (parameters_desktop->parent_window), (gpointer *)¶meters_desktop->parent_window); - } - nautilus_file_unref (parameters_desktop->file); - g_free (parameters_desktop); + if (parameters_desktop->parent_window) + { + g_object_remove_weak_pointer (G_OBJECT (parameters_desktop->parent_window), (gpointer *) ¶meters_desktop->parent_window); + } + nautilus_file_unref (parameters_desktop->file); + g_free (parameters_desktop); } static void -untrusted_launcher_response_callback (GtkDialog *dialog, - int response_id, - ActivateParametersDesktop *parameters) -{ - GdkScreen *screen; - char *uri; - GFile *file; - - switch (response_id) { - case RESPONSE_RUN: - screen = gtk_widget_get_screen (GTK_WIDGET (parameters->parent_window)); - uri = nautilus_file_get_uri (parameters->file); - DEBUG ("Launching untrusted launcher %s", uri); - nautilus_launch_desktop_file (screen, uri, NULL, - parameters->parent_window); - g_free (uri); - break; - case RESPONSE_MARK_TRUSTED: - file = nautilus_file_get_location (parameters->file); - nautilus_file_mark_desktop_file_trusted (file, - parameters->parent_window, - TRUE, - NULL, NULL); - g_object_unref (file); - break; - default: - /* Just destroy dialog */ - break; - } - - gtk_widget_destroy (GTK_WIDGET (dialog)); - activate_parameters_desktop_free (parameters); +untrusted_launcher_response_callback (GtkDialog *dialog, + int response_id, + ActivateParametersDesktop *parameters) +{ + GdkScreen *screen; + char *uri; + GFile *file; + + switch (response_id) + { + case RESPONSE_RUN: + { + screen = gtk_widget_get_screen (GTK_WIDGET (parameters->parent_window)); + uri = nautilus_file_get_uri (parameters->file); + DEBUG ("Launching untrusted launcher %s", uri); + nautilus_launch_desktop_file (screen, uri, NULL, + parameters->parent_window); + g_free (uri); + } + break; + + case RESPONSE_MARK_TRUSTED: + { + file = nautilus_file_get_location (parameters->file); + nautilus_file_mark_desktop_file_trusted (file, + parameters->parent_window, + TRUE, + NULL, NULL); + g_object_unref (file); + } + break; + + default: + { + /* Just destroy dialog */ + } + break; + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + activate_parameters_desktop_free (parameters); } static void activate_desktop_file (ActivateParameters *parameters, - NautilusFile *file) -{ - ActivateParametersDesktop *parameters_desktop; - char *primary, *secondary, *display_name; - GtkWidget *dialog; - GdkScreen *screen; - char *uri; - - screen = gtk_widget_get_screen (GTK_WIDGET (parameters->parent_window)); - - if (!nautilus_file_is_trusted_link (file)) { - /* copy the parts of parameters we are interested in as the orignal will be freed */ - parameters_desktop = g_new0 (ActivateParametersDesktop, 1); - if (parameters->parent_window) { - parameters_desktop->parent_window = parameters->parent_window; - g_object_add_weak_pointer (G_OBJECT (parameters_desktop->parent_window), (gpointer *)¶meters_desktop->parent_window); - } - parameters_desktop->file = nautilus_file_ref (file); - - primary = _("Untrusted application launcher"); - display_name = nautilus_file_get_display_name (file); - secondary = - g_strdup_printf (_("The application launcher ā%sā has not been marked as trusted. " - "If you do not know the source of this file, launching it may be unsafe." - ), - display_name); - - dialog = gtk_message_dialog_new (parameters->parent_window, - 0, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_NONE, - NULL); - g_object_set (dialog, - "text", primary, - "secondary-text", secondary, - NULL); - gtk_dialog_add_button (GTK_DIALOG (dialog), - _("_Launch Anyway"), RESPONSE_RUN); - if (nautilus_file_can_set_permissions (file)) { - gtk_dialog_add_button (GTK_DIALOG (dialog), - _("Mark as _Trusted"), RESPONSE_MARK_TRUSTED); - } - gtk_dialog_add_button (GTK_DIALOG (dialog), - _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); - - g_signal_connect (dialog, "response", - G_CALLBACK (untrusted_launcher_response_callback), - parameters_desktop); - gtk_widget_show (dialog); - - g_free (display_name); - g_free (secondary); - return; - } - - uri = nautilus_file_get_uri (file); - DEBUG ("Launching trusted launcher %s", uri); - nautilus_launch_desktop_file (screen, uri, NULL, - parameters->parent_window); - g_free (uri); + NautilusFile *file) +{ + ActivateParametersDesktop *parameters_desktop; + char *primary, *secondary, *display_name; + GtkWidget *dialog; + GdkScreen *screen; + char *uri; + + screen = gtk_widget_get_screen (GTK_WIDGET (parameters->parent_window)); + + if (!nautilus_file_is_trusted_link (file)) + { + /* copy the parts of parameters we are interested in as the orignal will be freed */ + parameters_desktop = g_new0 (ActivateParametersDesktop, 1); + if (parameters->parent_window) + { + parameters_desktop->parent_window = parameters->parent_window; + g_object_add_weak_pointer (G_OBJECT (parameters_desktop->parent_window), (gpointer *) ¶meters_desktop->parent_window); + } + parameters_desktop->file = nautilus_file_ref (file); + + primary = _("Untrusted application launcher"); + display_name = nautilus_file_get_display_name (file); + secondary = + g_strdup_printf (_("The application launcher ā%sā has not been marked as trusted. " + "If you do not know the source of this file, launching it may be unsafe." + ), + display_name); + + dialog = gtk_message_dialog_new (parameters->parent_window, + 0, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_NONE, + NULL); + g_object_set (dialog, + "text", primary, + "secondary-text", secondary, + NULL); + gtk_dialog_add_button (GTK_DIALOG (dialog), + _("_Launch Anyway"), RESPONSE_RUN); + if (nautilus_file_can_set_permissions (file)) + { + gtk_dialog_add_button (GTK_DIALOG (dialog), + _("Mark as _Trusted"), RESPONSE_MARK_TRUSTED); + } + gtk_dialog_add_button (GTK_DIALOG (dialog), + _("_Cancel"), GTK_RESPONSE_CANCEL); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); + + g_signal_connect (dialog, "response", + G_CALLBACK (untrusted_launcher_response_callback), + parameters_desktop); + gtk_widget_show (dialog); + + g_free (display_name); + g_free (secondary); + return; + } + + uri = nautilus_file_get_uri (file); + DEBUG ("Launching trusted launcher %s", uri); + nautilus_launch_desktop_file (screen, uri, NULL, + parameters->parent_window); + g_free (uri); } static void activate_files (ActivateParameters *parameters) { - NautilusWindow *window; - NautilusWindowOpenFlags flags; - NautilusFile *file; - GList *launch_desktop_files; - GList *launch_files; - GList *launch_in_terminal_files; - GList *open_in_app_uris; - GList *open_in_app_parameters; - GList *unhandled_open_in_app_uris; - ApplicationLaunchParameters *one_parameters; - GList *open_in_view_files; - GList *l; - int count; - char *uri; - char *executable_path, *quoted_path; - char *old_working_dir; - ActivationAction action; - GdkScreen *screen; - LaunchLocation *location; - gint num_apps; - gint num_unhandled; - gint num_files; - gboolean open_files; - - screen = gtk_widget_get_screen (GTK_WIDGET (parameters->parent_window)); - - launch_desktop_files = NULL; - launch_files = NULL; - launch_in_terminal_files = NULL; - open_in_app_uris = NULL; - open_in_view_files = NULL; - - for (l = parameters->locations; l != NULL; l = l->next) { - location = l->data; - file = location->file; - - if (file_was_cancelled (file)) { - continue; - } - - action = get_activation_action (file); - if (action == ACTIVATION_ACTION_ASK) { - /* Special case for executable text files, since it might be - * dangerous & unexpected to launch these. - */ - pause_activation_timed_cancel (parameters); - action = get_executable_text_file_action (parameters->parent_window, file); - unpause_activation_timed_cancel (parameters); - } - - switch (action) { - case ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE : - launch_desktop_files = g_list_prepend (launch_desktop_files, file); - break; - case ACTIVATION_ACTION_LAUNCH : - launch_files = g_list_prepend (launch_files, file); - break; - case ACTIVATION_ACTION_LAUNCH_IN_TERMINAL : - launch_in_terminal_files = g_list_prepend (launch_in_terminal_files, file); - break; - case ACTIVATION_ACTION_OPEN_IN_VIEW : - open_in_view_files = g_list_prepend (open_in_view_files, file); - break; - case ACTIVATION_ACTION_OPEN_IN_APPLICATION : - open_in_app_uris = g_list_prepend (open_in_app_uris, location->uri); - 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; - } - } - - launch_desktop_files = g_list_reverse (launch_desktop_files); - for (l = launch_desktop_files; l != NULL; l = l->next) { - file = NAUTILUS_FILE (l->data); - - activate_desktop_file (parameters, file); - } - - old_working_dir = NULL; - if (parameters->activation_directory && - (launch_files != NULL || launch_in_terminal_files != NULL)) { - old_working_dir = g_get_current_dir (); - g_chdir (parameters->activation_directory); - - } - - launch_files = g_list_reverse (launch_files); - for (l = launch_files; l != NULL; l = l->next) { - file = NAUTILUS_FILE (l->data); - - uri = nautilus_file_get_activation_uri (file); - executable_path = g_filename_from_uri (uri, NULL, NULL); - quoted_path = g_shell_quote (executable_path); - - DEBUG ("Launching file path %s", quoted_path); - - nautilus_launch_application_from_command (screen, quoted_path, FALSE, NULL); - g_free (quoted_path); - g_free (executable_path); - g_free (uri); - - } - - launch_in_terminal_files = g_list_reverse (launch_in_terminal_files); - for (l = launch_in_terminal_files; l != NULL; l = l->next) { - file = NAUTILUS_FILE (l->data); - - uri = nautilus_file_get_activation_uri (file); - executable_path = g_filename_from_uri (uri, NULL, NULL); - quoted_path = g_shell_quote (executable_path); - - DEBUG ("Launching in terminal file quoted path %s", quoted_path); - - nautilus_launch_application_from_command (screen, quoted_path, TRUE, NULL); - - g_free (quoted_path); - g_free (executable_path); - g_free (uri); - } - - if (old_working_dir != NULL) { - g_chdir (old_working_dir); - g_free (old_working_dir); - } - - open_in_view_files = g_list_reverse (open_in_view_files); - count = g_list_length (open_in_view_files); - - flags = parameters->flags; - if (count > 1) { - if ((parameters->flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) == 0) { - flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB; - flags |= NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE; - } else { - flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW; - } - } - - if (parameters->slot != NULL && - (!parameters->user_confirmation || - confirm_multiple_windows (parameters->parent_window, count, - (flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) != 0))) { - - if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) != 0 && - g_settings_get_enum (nautilus_preferences, NAUTILUS_PREFERENCES_NEW_TAB_POSITION) == - NAUTILUS_NEW_TAB_POSITION_AFTER_CURRENT_TAB) { - /* When inserting N tabs after the current one, - * we first open tab N, then tab N-1, ..., then tab 0. - * Each of them is appended to the current tab, i.e. - * prepended to the list of tabs to open. - */ - open_in_view_files = g_list_reverse (open_in_view_files); - } - - - for (l = open_in_view_files; l != NULL; l = l->next) { - GFile *f; - /* The ui should ask for navigation or object windows - * depending on what the current one is */ - file = NAUTILUS_FILE (l->data); - - uri = nautilus_file_get_activation_uri (file); - f = g_file_new_for_uri (uri); - /* FIXME: we need to pass the parent_window, but we only use it for the current active window, - * which nautilus-application should take care of. However is not working and creating regressions - * in some cases. Until we figure out what's going on, continue to use the parameters->slot - * to make splicit the window we want to use for activating the files */ - nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()), - f, flags, NULL, NULL, parameters->slot); - g_object_unref (f); - g_free (uri); - } - } - - open_in_app_parameters = NULL; - unhandled_open_in_app_uris = NULL; - - if (open_in_app_uris != NULL) { - open_in_app_uris = g_list_reverse (open_in_app_uris); - - open_in_app_parameters = make_activation_parameters - (open_in_app_uris, &unhandled_open_in_app_uris); - } - - num_apps = g_list_length (open_in_app_parameters); - num_unhandled = g_list_length (unhandled_open_in_app_uris); - num_files = g_list_length (open_in_app_uris); - open_files = TRUE; - - if (open_in_app_uris != NULL && - (!parameters->user_confirmation || - num_files + num_unhandled > SILENT_OPEN_LIMIT) && - num_apps > 1) { - GtkDialog *dialog; - char *prompt; - char *detail; - int response; - - pause_activation_timed_cancel (parameters); - - prompt = _("Are you sure you want to open all files?"); - detail = g_strdup_printf (ngettext ("This will open %d separate application.", - "This will open %d separate applications.", num_apps), num_apps); - dialog = eel_show_yes_no_dialog (prompt, detail, - _("_OK"), _("_Cancel"), - parameters->parent_window); - g_free (detail); - - response = gtk_dialog_run (dialog); - gtk_widget_destroy (GTK_WIDGET (dialog)); - - unpause_activation_timed_cancel (parameters); - - if (response != GTK_RESPONSE_YES) { - open_files = FALSE; - } - } - - if (open_files) { - for (l = open_in_app_parameters; l != NULL; l = l->next) { - one_parameters = l->data; - - nautilus_launch_application_by_uri (one_parameters->application, - one_parameters->uris, - parameters->parent_window); - application_launch_parameters_free (one_parameters); - } - - for (l = unhandled_open_in_app_uris; l != NULL; l = l->next) { - uri = l->data; - - /* this does not block */ - application_unhandled_uri (parameters, uri); - } - } - - window = NULL; - if (parameters->slot != NULL) { - window = nautilus_window_slot_get_window (parameters->slot); - } - - if (open_in_app_parameters != NULL || - unhandled_open_in_app_uris != NULL) { - if ((parameters->flags & NAUTILUS_WINDOW_OPEN_FLAG_CLOSE_BEHIND) != 0 && - window != NULL) { - nautilus_window_close (window); - } - } - - g_list_free (launch_desktop_files); - g_list_free (launch_files); - g_list_free (launch_in_terminal_files); - g_list_free (open_in_view_files); - g_list_free (open_in_app_uris); - g_list_free (open_in_app_parameters); - g_list_free (unhandled_open_in_app_uris); - - activation_parameters_free (parameters); -} - -static void -activation_mount_not_mounted_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - ActivateParameters *parameters = user_data; - GError *error; - NautilusFile *file; - LaunchLocation *loc; - - file = parameters->not_mounted->data; - - error = NULL; - if (!g_file_mount_enclosing_volume_finish (G_FILE (source_object), res, &error)) { - if (error->domain != G_IO_ERROR || - (error->code != G_IO_ERROR_CANCELLED && - error->code != G_IO_ERROR_FAILED_HANDLED && - error->code != G_IO_ERROR_ALREADY_MOUNTED)) { - eel_show_error_dialog (_("Unable to access location"), error->message, parameters->parent_window); - } - - if (error->domain != G_IO_ERROR || - error->code != G_IO_ERROR_ALREADY_MOUNTED) { - loc = find_launch_location_for_file (parameters->locations, - file); - if (loc) { - parameters->locations = - g_list_remove (parameters->locations, loc); - launch_location_free (loc); - } - } - - g_error_free (error); - } - - parameters->not_mounted = g_list_delete_link (parameters->not_mounted, - parameters->not_mounted); - nautilus_file_unref (file); - - activation_mount_not_mounted (parameters); + NautilusWindow *window; + NautilusWindowOpenFlags flags; + NautilusFile *file; + GList *launch_desktop_files; + GList *launch_files; + GList *launch_in_terminal_files; + GList *open_in_app_uris; + GList *open_in_app_parameters; + GList *unhandled_open_in_app_uris; + ApplicationLaunchParameters *one_parameters; + GList *open_in_view_files; + GList *l; + int count; + char *uri; + char *executable_path, *quoted_path; + char *old_working_dir; + ActivationAction action; + GdkScreen *screen; + LaunchLocation *location; + gint num_apps; + gint num_unhandled; + gint num_files; + gboolean open_files; + + screen = gtk_widget_get_screen (GTK_WIDGET (parameters->parent_window)); + + launch_desktop_files = NULL; + launch_files = NULL; + launch_in_terminal_files = NULL; + open_in_app_uris = NULL; + open_in_view_files = NULL; + + for (l = parameters->locations; l != NULL; l = l->next) + { + location = l->data; + file = location->file; + + if (file_was_cancelled (file)) + { + continue; + } + + action = get_activation_action (file); + if (action == ACTIVATION_ACTION_ASK) + { + /* Special case for executable text files, since it might be + * dangerous & unexpected to launch these. + */ + pause_activation_timed_cancel (parameters); + action = get_executable_text_file_action (parameters->parent_window, file); + unpause_activation_timed_cancel (parameters); + } + + switch (action) + { + case ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE: + { + launch_desktop_files = g_list_prepend (launch_desktop_files, file); + } + break; + + case ACTIVATION_ACTION_LAUNCH: + { + launch_files = g_list_prepend (launch_files, file); + } + break; + + case ACTIVATION_ACTION_LAUNCH_IN_TERMINAL: + { + launch_in_terminal_files = g_list_prepend (launch_in_terminal_files, file); + } + break; + + case ACTIVATION_ACTION_OPEN_IN_VIEW: + { + open_in_view_files = g_list_prepend (open_in_view_files, file); + } + break; + + case ACTIVATION_ACTION_OPEN_IN_APPLICATION: + { + open_in_app_uris = g_list_prepend (open_in_app_uris, location->uri); + } + 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; + } + } + + launch_desktop_files = g_list_reverse (launch_desktop_files); + for (l = launch_desktop_files; l != NULL; l = l->next) + { + file = NAUTILUS_FILE (l->data); + + activate_desktop_file (parameters, file); + } + + old_working_dir = NULL; + if (parameters->activation_directory && + (launch_files != NULL || launch_in_terminal_files != NULL)) + { + old_working_dir = g_get_current_dir (); + g_chdir (parameters->activation_directory); + } + + launch_files = g_list_reverse (launch_files); + for (l = launch_files; l != NULL; l = l->next) + { + file = NAUTILUS_FILE (l->data); + + uri = nautilus_file_get_activation_uri (file); + executable_path = g_filename_from_uri (uri, NULL, NULL); + quoted_path = g_shell_quote (executable_path); + + DEBUG ("Launching file path %s", quoted_path); + + nautilus_launch_application_from_command (screen, quoted_path, FALSE, NULL); + g_free (quoted_path); + g_free (executable_path); + g_free (uri); + } + + launch_in_terminal_files = g_list_reverse (launch_in_terminal_files); + for (l = launch_in_terminal_files; l != NULL; l = l->next) + { + file = NAUTILUS_FILE (l->data); + + uri = nautilus_file_get_activation_uri (file); + executable_path = g_filename_from_uri (uri, NULL, NULL); + quoted_path = g_shell_quote (executable_path); + + DEBUG ("Launching in terminal file quoted path %s", quoted_path); + + nautilus_launch_application_from_command (screen, quoted_path, TRUE, NULL); + + g_free (quoted_path); + g_free (executable_path); + g_free (uri); + } + + if (old_working_dir != NULL) + { + g_chdir (old_working_dir); + g_free (old_working_dir); + } + + open_in_view_files = g_list_reverse (open_in_view_files); + count = g_list_length (open_in_view_files); + + flags = parameters->flags; + if (count > 1) + { + if ((parameters->flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) == 0) + { + flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB; + flags |= NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE; + } + else + { + flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW; + } + } + + if (parameters->slot != NULL && + (!parameters->user_confirmation || + confirm_multiple_windows (parameters->parent_window, count, + (flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) != 0))) + { + if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) != 0 && + g_settings_get_enum (nautilus_preferences, NAUTILUS_PREFERENCES_NEW_TAB_POSITION) == + NAUTILUS_NEW_TAB_POSITION_AFTER_CURRENT_TAB) + { + /* When inserting N tabs after the current one, + * we first open tab N, then tab N-1, ..., then tab 0. + * Each of them is appended to the current tab, i.e. + * prepended to the list of tabs to open. + */ + open_in_view_files = g_list_reverse (open_in_view_files); + } + + + for (l = open_in_view_files; l != NULL; l = l->next) + { + GFile *f; + /* The ui should ask for navigation or object windows + * depending on what the current one is */ + file = NAUTILUS_FILE (l->data); + + uri = nautilus_file_get_activation_uri (file); + f = g_file_new_for_uri (uri); + /* FIXME: we need to pass the parent_window, but we only use it for the current active window, + * which nautilus-application should take care of. However is not working and creating regressions + * in some cases. Until we figure out what's going on, continue to use the parameters->slot + * to make splicit the window we want to use for activating the files */ + nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()), + f, flags, NULL, NULL, parameters->slot); + g_object_unref (f); + g_free (uri); + } + } + + open_in_app_parameters = NULL; + unhandled_open_in_app_uris = NULL; + + if (open_in_app_uris != NULL) + { + open_in_app_uris = g_list_reverse (open_in_app_uris); + + open_in_app_parameters = make_activation_parameters + (open_in_app_uris, &unhandled_open_in_app_uris); + } + + num_apps = g_list_length (open_in_app_parameters); + num_unhandled = g_list_length (unhandled_open_in_app_uris); + num_files = g_list_length (open_in_app_uris); + open_files = TRUE; + + if (open_in_app_uris != NULL && + (!parameters->user_confirmation || + num_files + num_unhandled > SILENT_OPEN_LIMIT) && + num_apps > 1) + { + GtkDialog *dialog; + char *prompt; + char *detail; + int response; + + pause_activation_timed_cancel (parameters); + + prompt = _("Are you sure you want to open all files?"); + detail = g_strdup_printf (ngettext ("This will open %d separate application.", + "This will open %d separate applications.", num_apps), num_apps); + dialog = eel_show_yes_no_dialog (prompt, detail, + _("_OK"), _("_Cancel"), + parameters->parent_window); + g_free (detail); + + response = gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + + unpause_activation_timed_cancel (parameters); + + if (response != GTK_RESPONSE_YES) + { + open_files = FALSE; + } + } + + if (open_files) + { + for (l = open_in_app_parameters; l != NULL; l = l->next) + { + one_parameters = l->data; + + nautilus_launch_application_by_uri (one_parameters->application, + one_parameters->uris, + parameters->parent_window); + application_launch_parameters_free (one_parameters); + } + + for (l = unhandled_open_in_app_uris; l != NULL; l = l->next) + { + uri = l->data; + + /* this does not block */ + application_unhandled_uri (parameters, uri); + } + } + + window = NULL; + if (parameters->slot != NULL) + { + window = nautilus_window_slot_get_window (parameters->slot); + } + + if (open_in_app_parameters != NULL || + unhandled_open_in_app_uris != NULL) + { + if ((parameters->flags & NAUTILUS_WINDOW_OPEN_FLAG_CLOSE_BEHIND) != 0 && + window != NULL) + { + nautilus_window_close (window); + } + } + + g_list_free (launch_desktop_files); + g_list_free (launch_files); + g_list_free (launch_in_terminal_files); + g_list_free (open_in_view_files); + g_list_free (open_in_app_uris); + g_list_free (open_in_app_parameters); + g_list_free (unhandled_open_in_app_uris); + + activation_parameters_free (parameters); +} + +static void +activation_mount_not_mounted_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + ActivateParameters *parameters = user_data; + GError *error; + NautilusFile *file; + LaunchLocation *loc; + + file = parameters->not_mounted->data; + + error = NULL; + if (!g_file_mount_enclosing_volume_finish (G_FILE (source_object), res, &error)) + { + if (error->domain != G_IO_ERROR || + (error->code != G_IO_ERROR_CANCELLED && + error->code != G_IO_ERROR_FAILED_HANDLED && + error->code != G_IO_ERROR_ALREADY_MOUNTED)) + { + eel_show_error_dialog (_("Unable to access location"), error->message, parameters->parent_window); + } + + if (error->domain != G_IO_ERROR || + error->code != G_IO_ERROR_ALREADY_MOUNTED) + { + loc = find_launch_location_for_file (parameters->locations, + file); + if (loc) + { + parameters->locations = + g_list_remove (parameters->locations, loc); + launch_location_free (loc); + } + } + + g_error_free (error); + } + + parameters->not_mounted = g_list_delete_link (parameters->not_mounted, + parameters->not_mounted); + nautilus_file_unref (file); + + activation_mount_not_mounted (parameters); } static void activation_mount_not_mounted (ActivateParameters *parameters) { - NautilusFile *file; - GFile *location; - LaunchLocation *loc; - GMountOperation *mount_op; - GList *l, *next, *files; - - if (parameters->not_mounted != NULL) { - file = parameters->not_mounted->data; - mount_op = gtk_mount_operation_new (parameters->parent_window); - g_mount_operation_set_password_save (mount_op, G_PASSWORD_SAVE_FOR_SESSION); - g_signal_connect (mount_op, "notify::is-showing", - G_CALLBACK (activate_mount_op_active), parameters); - location = nautilus_file_get_location (file); - g_file_mount_enclosing_volume (location, 0, mount_op, parameters->cancellable, - activation_mount_not_mounted_callback, parameters); - g_object_unref (location); - /* unref mount_op here - g_file_mount_enclosing_volume() does ref for itself */ - g_object_unref (mount_op); - return; - } - - parameters->tried_mounting = TRUE; - - if (parameters->locations == NULL) { - activation_parameters_free (parameters); - return; - } - - /* once the mount is finished, refresh all attributes */ - /* - fixes new windows not appearing after successful mount */ - for (l = parameters->locations; l != NULL; l = next) { - loc = l->data; - next = l->next; - nautilus_file_invalidate_all_attributes (loc->file); - } - - files = get_file_list_for_launch_locations (parameters->locations); - nautilus_file_list_call_when_ready - (files, - nautilus_mime_actions_get_required_file_attributes (), - ¶meters->files_handle, - activate_callback, parameters); - nautilus_file_list_free (files); + NautilusFile *file; + GFile *location; + LaunchLocation *loc; + GMountOperation *mount_op; + GList *l, *next, *files; + + if (parameters->not_mounted != NULL) + { + file = parameters->not_mounted->data; + mount_op = gtk_mount_operation_new (parameters->parent_window); + g_mount_operation_set_password_save (mount_op, G_PASSWORD_SAVE_FOR_SESSION); + g_signal_connect (mount_op, "notify::is-showing", + G_CALLBACK (activate_mount_op_active), parameters); + location = nautilus_file_get_location (file); + g_file_mount_enclosing_volume (location, 0, mount_op, parameters->cancellable, + activation_mount_not_mounted_callback, parameters); + g_object_unref (location); + /* unref mount_op here - g_file_mount_enclosing_volume() does ref for itself */ + g_object_unref (mount_op); + return; + } + + parameters->tried_mounting = TRUE; + + if (parameters->locations == NULL) + { + activation_parameters_free (parameters); + return; + } + + /* once the mount is finished, refresh all attributes */ + /* - fixes new windows not appearing after successful mount */ + for (l = parameters->locations; l != NULL; l = next) + { + loc = l->data; + next = l->next; + nautilus_file_invalidate_all_attributes (loc->file); + } + + files = get_file_list_for_launch_locations (parameters->locations); + nautilus_file_list_call_when_ready + (files, + nautilus_mime_actions_get_required_file_attributes (), + ¶meters->files_handle, + activate_callback, parameters); + nautilus_file_list_free (files); } static void -activate_callback (GList *files, gpointer callback_data) -{ - ActivateParameters *parameters = callback_data; - GList *l, *next; - NautilusFile *file; - LaunchLocation *location; - - parameters->files_handle = NULL; - - for (l = parameters->locations; l != NULL; l = next) { - location = l->data; - file = location->file; - next = l->next; - - if (file_was_cancelled (file)) { - launch_location_free (location); - parameters->locations = g_list_delete_link (parameters->locations, l); - continue; - } - - if (file_was_not_mounted (file)) { - if (parameters->tried_mounting) { - launch_location_free (location); - parameters->locations = g_list_delete_link (parameters->locations, l); - } else { - parameters->not_mounted = g_list_prepend (parameters->not_mounted, - nautilus_file_ref (file)); - } - continue; - } - } - - - if (parameters->not_mounted != NULL) { - activation_mount_not_mounted (parameters); - } else { - activate_files (parameters); - } +activate_callback (GList *files, + gpointer callback_data) +{ + ActivateParameters *parameters = callback_data; + GList *l, *next; + NautilusFile *file; + LaunchLocation *location; + + parameters->files_handle = NULL; + + for (l = parameters->locations; l != NULL; l = next) + { + location = l->data; + file = location->file; + next = l->next; + + if (file_was_cancelled (file)) + { + launch_location_free (location); + parameters->locations = g_list_delete_link (parameters->locations, l); + continue; + } + + if (file_was_not_mounted (file)) + { + if (parameters->tried_mounting) + { + launch_location_free (location); + parameters->locations = g_list_delete_link (parameters->locations, l); + } + else + { + parameters->not_mounted = g_list_prepend (parameters->not_mounted, + nautilus_file_ref (file)); + } + continue; + } + } + + + if (parameters->not_mounted != NULL) + { + activation_mount_not_mounted (parameters); + } + else + { + activate_files (parameters); + } } static void -activate_activation_uris_ready_callback (GList *files_ignore, - gpointer callback_data) -{ - ActivateParameters *parameters = callback_data; - GList *l, *next, *files; - NautilusFile *file; - LaunchLocation *location; - - parameters->files_handle = NULL; - - for (l = parameters->locations; l != NULL; l = next) { - location = l->data; - file = location->file; - next = l->next; - - if (file_was_cancelled (file)) { - launch_location_free (location); - parameters->locations = g_list_delete_link (parameters->locations, l); - continue; - } - - if (nautilus_file_is_broken_symbolic_link (file)) { - launch_location_free (location); - parameters->locations = g_list_delete_link (parameters->locations, l); - pause_activation_timed_cancel (parameters); - report_broken_symbolic_link (parameters->parent_window, file); - unpause_activation_timed_cancel (parameters); - continue; - } - - if (nautilus_file_get_file_type (file) == G_FILE_TYPE_MOUNTABLE && - !nautilus_file_has_activation_uri (file)) { - /* Don't launch these... There is nothing we - can do */ - launch_location_free (location); - parameters->locations = g_list_delete_link (parameters->locations, l); - continue; - } - - } - - if (parameters->locations == NULL) { - activation_parameters_free (parameters); - return; - } - - /* Convert the files to the actual activation uri files */ - for (l = parameters->locations; l != NULL; l = l->next) { - char *uri; - location = l->data; - - /* We want the file for the activation URI since we care - * about the attributes for that, not for the original file. - */ - uri = nautilus_file_get_activation_uri (location->file); - if (uri != NULL) { - launch_location_update_from_uri (location, uri); - } - g_free (uri); - } - - - /* get the parameters for the actual files */ - files = get_file_list_for_launch_locations (parameters->locations); - nautilus_file_list_call_when_ready - (files, - nautilus_mime_actions_get_required_file_attributes (), - ¶meters->files_handle, - activate_callback, parameters); - nautilus_file_list_free (files); +activate_activation_uris_ready_callback (GList *files_ignore, + gpointer callback_data) +{ + ActivateParameters *parameters = callback_data; + GList *l, *next, *files; + NautilusFile *file; + LaunchLocation *location; + + parameters->files_handle = NULL; + + for (l = parameters->locations; l != NULL; l = next) + { + location = l->data; + file = location->file; + next = l->next; + + if (file_was_cancelled (file)) + { + launch_location_free (location); + parameters->locations = g_list_delete_link (parameters->locations, l); + continue; + } + + if (nautilus_file_is_broken_symbolic_link (file)) + { + launch_location_free (location); + parameters->locations = g_list_delete_link (parameters->locations, l); + pause_activation_timed_cancel (parameters); + report_broken_symbolic_link (parameters->parent_window, file); + unpause_activation_timed_cancel (parameters); + continue; + } + + if (nautilus_file_get_file_type (file) == G_FILE_TYPE_MOUNTABLE && + !nautilus_file_has_activation_uri (file)) + { + /* Don't launch these... There is nothing we + * can do */ + launch_location_free (location); + parameters->locations = g_list_delete_link (parameters->locations, l); + continue; + } + } + + if (parameters->locations == NULL) + { + activation_parameters_free (parameters); + return; + } + + /* Convert the files to the actual activation uri files */ + for (l = parameters->locations; l != NULL; l = l->next) + { + char *uri; + location = l->data; + + /* We want the file for the activation URI since we care + * about the attributes for that, not for the original file. + */ + uri = nautilus_file_get_activation_uri (location->file); + if (uri != NULL) + { + launch_location_update_from_uri (location, uri); + } + g_free (uri); + } + + + /* get the parameters for the actual files */ + files = get_file_list_for_launch_locations (parameters->locations); + nautilus_file_list_call_when_ready + (files, + nautilus_mime_actions_get_required_file_attributes (), + ¶meters->files_handle, + activate_callback, parameters); + nautilus_file_list_free (files); } static void activation_get_activation_uris (ActivateParameters *parameters) { - GList *l, *files; - NautilusFile *file; - LaunchLocation *location; - - /* link target info might be stale, re-read it */ - for (l = parameters->locations; l != NULL; l = l->next) { - location = l->data; - file = location->file; - - if (file_was_cancelled (file)) { - launch_location_free (location); - parameters->locations = g_list_delete_link (parameters->locations, l); - continue; - } - } + GList *l, *files; + NautilusFile *file; + LaunchLocation *location; + + /* link target info might be stale, re-read it */ + for (l = parameters->locations; l != NULL; l = l->next) + { + location = l->data; + file = location->file; + + if (file_was_cancelled (file)) + { + launch_location_free (location); + parameters->locations = g_list_delete_link (parameters->locations, l); + continue; + } + } - if (parameters->locations == NULL) { - activation_parameters_free (parameters); - return; - } + if (parameters->locations == NULL) + { + activation_parameters_free (parameters); + return; + } - files = get_file_list_for_launch_locations (parameters->locations); - nautilus_file_list_call_when_ready - (files, nautilus_mime_actions_get_required_file_attributes (), - ¶meters->files_handle, - activate_activation_uris_ready_callback, parameters); - nautilus_file_list_free (files); + files = get_file_list_for_launch_locations (parameters->locations); + nautilus_file_list_call_when_ready + (files, nautilus_mime_actions_get_required_file_attributes (), + ¶meters->files_handle, + activate_activation_uris_ready_callback, parameters); + nautilus_file_list_free (files); } static void -activation_mountable_mounted (NautilusFile *file, - GFile *result_location, - GError *error, - gpointer callback_data) -{ - ActivateParameters *parameters = callback_data; - NautilusFile *target_file; - LaunchLocation *location; - - /* Remove from list of files that have to be mounted */ - parameters->mountables = g_list_remove (parameters->mountables, file); - nautilus_file_unref (file); - - - if (error == NULL) { - /* Replace file with the result of the mount */ - target_file = nautilus_file_get (result_location); - - location = find_launch_location_for_file (parameters->locations, - file); - if (location) { - launch_location_update_from_file (location, target_file); - } - nautilus_file_unref (target_file); - } else { - /* Remove failed file */ - - if (error->domain != G_IO_ERROR || - (error->code != G_IO_ERROR_FAILED_HANDLED && - error->code != G_IO_ERROR_ALREADY_MOUNTED)) { - location = find_launch_location_for_file (parameters->locations, - file); - if (location) { - parameters->locations = - g_list_remove (parameters->locations, - location); - launch_location_free (location); - } - } - - if (error->domain != G_IO_ERROR || - (error->code != G_IO_ERROR_CANCELLED && - error->code != G_IO_ERROR_FAILED_HANDLED && - error->code != G_IO_ERROR_ALREADY_MOUNTED)) { - eel_show_error_dialog (_("Unable to access location"), - error->message, parameters->parent_window); - } - - if (error->code == G_IO_ERROR_CANCELLED) { - activation_parameters_free (parameters); - return; - } - } - - /* Mount more mountables */ - activation_mount_mountables (parameters); +activation_mountable_mounted (NautilusFile *file, + GFile *result_location, + GError *error, + gpointer callback_data) +{ + ActivateParameters *parameters = callback_data; + NautilusFile *target_file; + LaunchLocation *location; + + /* Remove from list of files that have to be mounted */ + parameters->mountables = g_list_remove (parameters->mountables, file); + nautilus_file_unref (file); + + + if (error == NULL) + { + /* Replace file with the result of the mount */ + target_file = nautilus_file_get (result_location); + + location = find_launch_location_for_file (parameters->locations, + file); + if (location) + { + launch_location_update_from_file (location, target_file); + } + nautilus_file_unref (target_file); + } + else + { + /* Remove failed file */ + + if (error->domain != G_IO_ERROR || + (error->code != G_IO_ERROR_FAILED_HANDLED && + error->code != G_IO_ERROR_ALREADY_MOUNTED)) + { + location = find_launch_location_for_file (parameters->locations, + file); + if (location) + { + parameters->locations = + g_list_remove (parameters->locations, + location); + launch_location_free (location); + } + } + + if (error->domain != G_IO_ERROR || + (error->code != G_IO_ERROR_CANCELLED && + error->code != G_IO_ERROR_FAILED_HANDLED && + error->code != G_IO_ERROR_ALREADY_MOUNTED)) + { + eel_show_error_dialog (_("Unable to access location"), + error->message, parameters->parent_window); + } + + if (error->code == G_IO_ERROR_CANCELLED) + { + activation_parameters_free (parameters); + return; + } + } + + /* Mount more mountables */ + activation_mount_mountables (parameters); } static void activation_mount_mountables (ActivateParameters *parameters) { - NautilusFile *file; - GMountOperation *mount_op; - - if (parameters->mountables != NULL) { - file = parameters->mountables->data; - mount_op = gtk_mount_operation_new (parameters->parent_window); - g_mount_operation_set_password_save (mount_op, G_PASSWORD_SAVE_FOR_SESSION); - g_signal_connect (mount_op, "notify::is-showing", - G_CALLBACK (activate_mount_op_active), parameters); - nautilus_file_mount (file, - mount_op, - parameters->cancellable, - activation_mountable_mounted, - parameters); - g_object_unref (mount_op); - return; - } + NautilusFile *file; + GMountOperation *mount_op; + + if (parameters->mountables != NULL) + { + file = parameters->mountables->data; + mount_op = gtk_mount_operation_new (parameters->parent_window); + g_mount_operation_set_password_save (mount_op, G_PASSWORD_SAVE_FOR_SESSION); + g_signal_connect (mount_op, "notify::is-showing", + G_CALLBACK (activate_mount_op_active), parameters); + nautilus_file_mount (file, + mount_op, + parameters->cancellable, + activation_mountable_mounted, + parameters); + g_object_unref (mount_op); + return; + } - if (parameters->mountables == NULL && parameters->start_mountables == NULL) - activation_get_activation_uris (parameters); + if (parameters->mountables == NULL && parameters->start_mountables == NULL) + { + activation_get_activation_uris (parameters); + } } static void -activation_mountable_started (NautilusFile *file, - GFile *gfile_of_file, - GError *error, - gpointer callback_data) -{ - ActivateParameters *parameters = callback_data; - LaunchLocation *location; - - /* Remove from list of files that have to be mounted */ - parameters->start_mountables = g_list_remove (parameters->start_mountables, file); - nautilus_file_unref (file); - - if (error == NULL) { - /* Remove file */ - location = find_launch_location_for_file (parameters->locations, file); - if (location != NULL) { - parameters->locations = g_list_remove (parameters->locations, location); - launch_location_free (location); - } - - } else { - /* Remove failed file */ - if (error->domain != G_IO_ERROR || - (error->code != G_IO_ERROR_FAILED_HANDLED)) { - location = find_launch_location_for_file (parameters->locations, - file); - if (location) { - parameters->locations = - g_list_remove (parameters->locations, - location); - launch_location_free (location); - } - } - - if (error->domain != G_IO_ERROR || - (error->code != G_IO_ERROR_CANCELLED && - error->code != G_IO_ERROR_FAILED_HANDLED)) { - eel_show_error_dialog (_("Unable to start location"), - error->message, NULL); - } - - if (error->code == G_IO_ERROR_CANCELLED) { - activation_parameters_free (parameters); - return; - } - } - - /* Start more mountables */ - activation_start_mountables (parameters); +activation_mountable_started (NautilusFile *file, + GFile *gfile_of_file, + GError *error, + gpointer callback_data) +{ + ActivateParameters *parameters = callback_data; + LaunchLocation *location; + + /* Remove from list of files that have to be mounted */ + parameters->start_mountables = g_list_remove (parameters->start_mountables, file); + nautilus_file_unref (file); + + if (error == NULL) + { + /* Remove file */ + location = find_launch_location_for_file (parameters->locations, file); + if (location != NULL) + { + parameters->locations = g_list_remove (parameters->locations, location); + launch_location_free (location); + } + } + else + { + /* Remove failed file */ + if (error->domain != G_IO_ERROR || + (error->code != G_IO_ERROR_FAILED_HANDLED)) + { + location = find_launch_location_for_file (parameters->locations, + file); + if (location) + { + parameters->locations = + g_list_remove (parameters->locations, + location); + launch_location_free (location); + } + } + + if (error->domain != G_IO_ERROR || + (error->code != G_IO_ERROR_CANCELLED && + error->code != G_IO_ERROR_FAILED_HANDLED)) + { + eel_show_error_dialog (_("Unable to start location"), + error->message, NULL); + } + + if (error->code == G_IO_ERROR_CANCELLED) + { + activation_parameters_free (parameters); + return; + } + } + + /* Start more mountables */ + activation_start_mountables (parameters); } static void activation_start_mountables (ActivateParameters *parameters) { - NautilusFile *file; - GMountOperation *start_op; - - if (parameters->start_mountables != NULL) { - file = parameters->start_mountables->data; - start_op = gtk_mount_operation_new (parameters->parent_window); - g_signal_connect (start_op, "notify::is-showing", - G_CALLBACK (activate_mount_op_active), parameters); - nautilus_file_start (file, - start_op, - parameters->cancellable, - activation_mountable_started, - parameters); - g_object_unref (start_op); - return; - } + NautilusFile *file; + GMountOperation *start_op; + + if (parameters->start_mountables != NULL) + { + file = parameters->start_mountables->data; + start_op = gtk_mount_operation_new (parameters->parent_window); + g_signal_connect (start_op, "notify::is-showing", + G_CALLBACK (activate_mount_op_active), parameters); + nautilus_file_start (file, + start_op, + parameters->cancellable, + activation_mountable_started, + parameters); + g_object_unref (start_op); + return; + } - if (parameters->mountables == NULL && parameters->start_mountables == NULL) - activation_get_activation_uris (parameters); + if (parameters->mountables == NULL && parameters->start_mountables == NULL) + { + activation_get_activation_uris (parameters); + } } /** * nautilus_mime_activate_files: - * + * * Activate a list of files. Each one might launch with an application or * with a component. This is normally called only by subclasses. * @view: FMDirectoryView in question. * @files: A GList of NautilusFiles to activate. - * + * **/ void -nautilus_mime_activate_files (GtkWindow *parent_window, - NautilusWindowSlot *slot, - GList *files, - const char *launch_directory, - NautilusWindowOpenFlags flags, - gboolean user_confirmation) -{ - ActivateParameters *parameters; - char *file_name; - int file_count; - GList *l, *next; - NautilusFile *file; - LaunchLocation *location; - - if (files == NULL) { - return; - } - - DEBUG_FILES (files, "Calling activate_files() with files:"); - - parameters = g_new0 (ActivateParameters, 1); - parameters->slot = slot; - g_object_add_weak_pointer (G_OBJECT (parameters->slot), (gpointer *)¶meters->slot); - if (parent_window) { - parameters->parent_window = parent_window; - g_object_add_weak_pointer (G_OBJECT (parameters->parent_window), (gpointer *)¶meters->parent_window); - } - parameters->cancellable = g_cancellable_new (); - parameters->activation_directory = g_strdup (launch_directory); - parameters->locations = launch_locations_from_file_list (files); - parameters->flags = flags; - parameters->user_confirmation = user_confirmation; - - file_count = g_list_length (files); - if (file_count == 1) { - file_name = nautilus_file_get_display_name (files->data); - parameters->timed_wait_prompt = g_strdup_printf (_("Opening ā%sā."), file_name); - g_free (file_name); - } else { - parameters->timed_wait_prompt = g_strdup_printf (ngettext ("Opening %d item.", - "Opening %d items.", - file_count), - file_count); - } - - - for (l = parameters->locations; l != NULL; l = next) { - location = l->data; - file = location->file; - next = l->next; - - if (nautilus_file_can_mount (file)) { - parameters->mountables = g_list_prepend (parameters->mountables, - nautilus_file_ref (file)); - } - - if (nautilus_file_can_start (file)) { - parameters->start_mountables = g_list_prepend (parameters->start_mountables, - nautilus_file_ref (file)); - } - } - - activation_start_timed_cancel (parameters); - if (parameters->mountables != NULL) - activation_mount_mountables (parameters); - if (parameters->start_mountables != NULL) - activation_start_mountables (parameters); - if (parameters->mountables == NULL && parameters->start_mountables == NULL) - activation_get_activation_uris (parameters); +nautilus_mime_activate_files (GtkWindow *parent_window, + NautilusWindowSlot *slot, + GList *files, + const char *launch_directory, + NautilusWindowOpenFlags flags, + gboolean user_confirmation) +{ + ActivateParameters *parameters; + char *file_name; + int file_count; + GList *l, *next; + NautilusFile *file; + LaunchLocation *location; + + if (files == NULL) + { + return; + } + + DEBUG_FILES (files, "Calling activate_files() with files:"); + + parameters = g_new0 (ActivateParameters, 1); + parameters->slot = slot; + g_object_add_weak_pointer (G_OBJECT (parameters->slot), (gpointer *) ¶meters->slot); + if (parent_window) + { + parameters->parent_window = parent_window; + g_object_add_weak_pointer (G_OBJECT (parameters->parent_window), (gpointer *) ¶meters->parent_window); + } + parameters->cancellable = g_cancellable_new (); + parameters->activation_directory = g_strdup (launch_directory); + parameters->locations = launch_locations_from_file_list (files); + parameters->flags = flags; + parameters->user_confirmation = user_confirmation; + + file_count = g_list_length (files); + if (file_count == 1) + { + file_name = nautilus_file_get_display_name (files->data); + parameters->timed_wait_prompt = g_strdup_printf (_("Opening ā%sā."), file_name); + g_free (file_name); + } + else + { + parameters->timed_wait_prompt = g_strdup_printf (ngettext ("Opening %d item.", + "Opening %d items.", + file_count), + file_count); + } + + + for (l = parameters->locations; l != NULL; l = next) + { + location = l->data; + file = location->file; + next = l->next; + + if (nautilus_file_can_mount (file)) + { + parameters->mountables = g_list_prepend (parameters->mountables, + nautilus_file_ref (file)); + } + + if (nautilus_file_can_start (file)) + { + parameters->start_mountables = g_list_prepend (parameters->start_mountables, + nautilus_file_ref (file)); + } + } + + activation_start_timed_cancel (parameters); + if (parameters->mountables != NULL) + { + activation_mount_mountables (parameters); + } + if (parameters->start_mountables != NULL) + { + activation_start_mountables (parameters); + } + if (parameters->mountables == NULL && parameters->start_mountables == NULL) + { + activation_get_activation_uris (parameters); + } } /** * nautilus_mime_activate_file: - * + * * Activate a file in this view. This might involve switching the displayed * location for the current window, or launching an application. * @view: FMDirectoryView in question. * @file: A NautilusFile representing the file in this view to activate. * @use_new_window: Should this item be opened in a new window? - * + * **/ void -nautilus_mime_activate_file (GtkWindow *parent_window, - NautilusWindowSlot *slot, - NautilusFile *file, - const char *launch_directory, - NautilusWindowOpenFlags flags) +nautilus_mime_activate_file (GtkWindow *parent_window, + NautilusWindowSlot *slot, + NautilusFile *file, + const char *launch_directory, + NautilusWindowOpenFlags flags) { - GList *files; + GList *files; - g_return_if_fail (NAUTILUS_IS_FILE (file)); + g_return_if_fail (NAUTILUS_IS_FILE (file)); - files = g_list_prepend (NULL, file); - nautilus_mime_activate_files (parent_window, slot, files, launch_directory, flags, FALSE); - g_list_free (files); + files = g_list_prepend (NULL, file); + nautilus_mime_activate_files (parent_window, slot, files, launch_directory, flags, FALSE); + g_list_free (files); } gint nautilus_mime_types_get_number_of_groups (void) { - return G_N_ELEMENTS (mimetype_groups); + return G_N_ELEMENTS (mimetype_groups); } -const gchar* +const gchar * nautilus_mime_types_group_get_name (gint group_index) { - g_return_val_if_fail (group_index < G_N_ELEMENTS (mimetype_groups), NULL); + g_return_val_if_fail (group_index < G_N_ELEMENTS (mimetype_groups), NULL); - return gettext (mimetype_groups[group_index].name); + return gettext (mimetype_groups[group_index].name); } -GList* +GList * nautilus_mime_types_group_get_mimetypes (gint group_index) { - GList *mimetypes; - gint i; + GList *mimetypes; + gint i; - g_return_val_if_fail (group_index < G_N_ELEMENTS (mimetype_groups), NULL); + g_return_val_if_fail (group_index < G_N_ELEMENTS (mimetype_groups), NULL); - mimetypes = NULL; + mimetypes = NULL; - /* Setup the new mimetypes set */ - for (i = 0; mimetype_groups[group_index].mimetypes[i]; i++) - { - mimetypes = g_list_append (mimetypes, mimetype_groups[group_index].mimetypes[i]); - } + /* Setup the new mimetypes set */ + for (i = 0; mimetype_groups[group_index].mimetypes[i]; i++) + { + mimetypes = g_list_append (mimetypes, mimetype_groups[group_index].mimetypes[i]); + } - return mimetypes; + return mimetypes; } |