diff options
author | Christian Neumair <chris@gnome-de.org> | 2006-01-11 19:33:35 +0000 |
---|---|---|
committer | Christian Neumair <cneumair@src.gnome.org> | 2006-01-11 19:33:35 +0000 |
commit | 8f7c1824dc0a226166dc5c199934d6158ca75e62 (patch) | |
tree | da7a238dcaaacc3b3fadb27da1db786c4dd6c946 /libnautilus-private | |
parent | 6f55ef202be4a67d530e199071948dca35d49aae (diff) | |
download | nautilus-8f7c1824dc0a226166dc5c199934d6158ca75e62.tar.gz |
Add file list helpers for getting associated applications.
2006-01-11 Christian Neumair <chris@gnome-de.org>
* libnautilus-private/nautilus-mime-actions.c:
(nautilus_mime_get_default_application_for_files),
(intersect_application_lists),
(nautilus_mime_get_open_with_applications_for_files),
(nautilus_mime_has_any_applications_for_files):
* libnautilus-private/nautilus-mime-actions.h:
Add file list helpers for getting associated applications.
* libnautilus-private/nautilus-program-choosing.c:
* libnautilus-private/nautilus-program-choosing.h:
(nautilus_launch_application):
Allow to pass multiple files per application launch.
* src/nautilus-information-panel.c:
(command_button_callback):
Port to new API.
* src/file-manager/fm-directory-view.c:
(application_launch_parameters_new),
(application_launch_parameters_free),
(fm_directory_view_launch_application),
(fm_directory_view_chose_application_callback),
(application_selected_cb),
(open_with_launch_application_callback),
(add_application_to_open_with_menu), (reset_open_with_menu),
(real_update_menus), (list_to_parameters_foreach),
(mime_application_hash),
(fm_directory_view_make_activation_parameters),
(activate_callback):
Support activation of multiple files at once, correctly figure out
their associated applications. Fixes #105653.
* src/file-manager/fm-directory-view.c:
(activate_callback):
ref/unref the view before/after operating on it. Fixes #326231.
Diffstat (limited to 'libnautilus-private')
-rw-r--r-- | libnautilus-private/nautilus-mime-actions.c | 151 | ||||
-rw-r--r-- | libnautilus-private/nautilus-mime-actions.h | 5 | ||||
-rw-r--r-- | libnautilus-private/nautilus-program-choosing.c | 79 | ||||
-rw-r--r-- | libnautilus-private/nautilus-program-choosing.h | 2 |
4 files changed, 209 insertions, 28 deletions
diff --git a/libnautilus-private/nautilus-mime-actions.c b/libnautilus-private/nautilus-mime-actions.c index 723c78e76..3915ec035 100644 --- a/libnautilus-private/nautilus-mime-actions.c +++ b/libnautilus-private/nautilus-mime-actions.c @@ -233,3 +233,154 @@ nautilus_mime_has_any_applications_for_file (NautilusFile *file) return result; } + +GnomeVFSMimeApplication * +nautilus_mime_get_default_application_for_files (GList *files) +{ + GList *l; + NautilusFile *file; + GnomeVFSMimeApplication *app, *one_app; + + g_assert (files != NULL); + + app = NULL; + for (l = files; l != NULL; l = l->next) { + file = l->data; + + one_app = nautilus_mime_get_default_application_for_file (file); + if (one_app == NULL || (app != NULL && !gnome_vfs_mime_application_equal (app, one_app))) { + gnome_vfs_mime_application_free (app); + gnome_vfs_mime_application_free (one_app); + app = NULL; + break; + } + + if (app == NULL) { + app = one_app; + } else { + gnome_vfs_mime_application_free (one_app); + } + } + + return app; +} + +/* returns an intersection of two mime application lists, + * and returns a new list, freeing a, b and all applications + * that are not in the intersection set. + * The lists are assumed to be pre-sorted by their IDs */ +static GList * +intersect_application_lists (GList *a, + GList *b) +{ + GList *l, *m; + GList *ret; + GnomeVFSMimeApplication *a_app, *b_app; + int cmp; + + ret = NULL; + + l = a; + m = b; + + while (l != NULL && m != NULL) { + a_app = (GnomeVFSMimeApplication *) l->data; + b_app = (GnomeVFSMimeApplication *) m->data; + + cmp = strcmp (a_app->id, b_app->id); + if (cmp > 0) { + gnome_vfs_mime_application_free (b_app); + m = m->next; + } else if (cmp < 0) { + gnome_vfs_mime_application_free (a_app); + l = l->next; + } else { + gnome_vfs_mime_application_free (b_app); + ret = g_list_prepend (ret, a_app); + l = l->next; + m = m->next; + } + } + + g_list_foreach (l, (GFunc) gnome_vfs_mime_application_free, NULL); + g_list_foreach (m, (GFunc) gnome_vfs_mime_application_free, NULL); + + g_list_free (a); + g_list_free (b); + + return g_list_reverse (ret); +} + +GList * +nautilus_mime_get_open_with_applications_for_files (GList *files) +{ + GList *l; + NautilusFile *file; + GList *one_ret, *ret; + + g_assert (files != NULL); + + ret = NULL; + for (l = files; l != NULL; l = l->next) { + file = l->data; + + one_ret = nautilus_mime_get_open_with_applications_for_file (file); + if (ret != NULL) { + ret = intersect_application_lists (ret, one_ret); + } else { + ret = one_ret; + } + + if (ret == NULL) { + break; + } + } + + return ret; +} + +GList * +nautilus_mime_get_applications_for_files (GList *files) +{ + GList *l; + NautilusFile *file; + GList *one_ret, *ret; + + g_assert (files != NULL); + + ret = NULL; + for (l = files; l != NULL; l = l->next) { + file = l->data; + + one_ret = nautilus_mime_get_applications_for_file (file); + if (ret != NULL) { + ret = intersect_application_lists (ret, one_ret); + } else { + ret = one_ret; + } + + if (ret == NULL) { + break; + } + } + + return ret; +} + +gboolean +nautilus_mime_has_any_applications_for_files (GList *files) +{ + GList *l; + NautilusFile *file; + + g_assert (files != NULL); + + for (l = files; l != NULL; l = l->next) { + file = NAUTILUS_FILE (l->data); + if (!nautilus_mime_has_any_applications_for_file (file)) { + return FALSE; + } + } + + return TRUE; +} diff --git a/libnautilus-private/nautilus-mime-actions.h b/libnautilus-private/nautilus-mime-actions.h index f1035f387..d108bf7b7 100644 --- a/libnautilus-private/nautilus-mime-actions.h +++ b/libnautilus-private/nautilus-mime-actions.h @@ -36,6 +36,11 @@ GnomeVFSMimeApplication *nautilus_mime_get_default_application_for_file (Nautil GList * nautilus_mime_get_open_with_applications_for_file (NautilusFile *file); GList * nautilus_mime_get_applications_for_file (NautilusFile *file); +GnomeVFSMimeApplication *nautilus_mime_get_default_application_for_files (GList *files); +GList * nautilus_mime_get_open_with_applications_for_files (GList *files); +GList * nautilus_mime_get_applications_for_files (GList *file); + gboolean nautilus_mime_has_any_applications_for_file (NautilusFile *file); +gboolean nautilus_mime_has_any_applications_for_files (GList *files); #endif /* NAUTILUS_MIME_ACTIONS_H */ diff --git a/libnautilus-private/nautilus-program-choosing.c b/libnautilus-private/nautilus-program-choosing.c index 98782877b..fbe7e1c8b 100644 --- a/libnautilus-private/nautilus-program-choosing.c +++ b/libnautilus-private/nautilus-program-choosing.c @@ -664,18 +664,19 @@ void nautilus_launch_show_file (NautilusFile *file, * parameter. Provide a parent window for error dialogs. * * @application: The application to be launched. - * @file: The file whose location should be passed as a parameter to the application + * @files: The files whose locations should be passed as a parameter to the application. * @parent_window: A window to use as the parent for any error dialogs. */ void nautilus_launch_application (GnomeVFSMimeApplication *application, - NautilusFile *file, + GList *files, GtkWindow *parent_window) { GdkScreen *screen; char *uri; char *uri_scheme; - GList uris; + GList *uris, *l; + NautilusFile *file; char **envp; GnomeVFSResult result; #ifdef HAVE_STARTUP_NOTIFICATION @@ -683,19 +684,26 @@ nautilus_launch_application (GnomeVFSMimeApplication *application, SnDisplay *sn_display; #endif - uri = NULL; - if (nautilus_file_is_nautilus_link (file)) { - uri = nautilus_file_get_activation_uri (file); - } - - if (uri == NULL) { - uri = nautilus_file_get_uri (file); + g_assert (files != NULL); + + uris = NULL; + for (l = files; l != NULL; l = l->next) { + file = NAUTILUS_FILE (l->data); + + uri = NULL; + + if (nautilus_file_is_nautilus_link (file)) { + uri = nautilus_file_get_activation_uri (file); + } + + if (uri == NULL) { + uri = nautilus_file_get_uri (file); + } + + uris = g_list_prepend (uris, uri); } + uris = g_list_reverse (uris); - uris.next = NULL; - uris.prev = NULL; - uris.data = uri; - screen = gtk_window_get_screen (parent_window); envp = my_gdk_spawn_make_environment_for_screen (screen, NULL); @@ -709,27 +717,44 @@ nautilus_launch_application (GnomeVFSMimeApplication *application, if (gnome_vfs_mime_application_supports_startup_notification (application)) { char *name; + char *description; char *icon; + int files_count; + + file = NAUTILUS_FILE (files->data); sn_context = sn_launcher_context_new (sn_display, screen ? gdk_screen_get_number (screen) : DefaultScreen (gdk_display)); - - name = nautilus_file_get_display_name (file); - if (name != NULL) { - char *description; - - sn_launcher_context_set_name (sn_context, name); - + + files_count = g_list_length (files); + if (files_count == 1) { + name = nautilus_file_get_display_name (file); description = g_strdup_printf (_("Opening %s"), name); - - sn_launcher_context_set_description (sn_context, description); + } else { + name = NULL; + description = g_strdup_printf (ngettext ("Opening %d Item", + "Opening %d Items", + files_count), + files_count); + } + if (name != NULL) { + sn_launcher_context_set_name (sn_context, name); g_free (name); + } + + if (description != NULL) { + sn_launcher_context_set_description (sn_context, description); g_free (description); } icon = nautilus_icon_factory_get_icon_for_file (file, FALSE); + + if (icon == NULL) { + icon = g_strdup (gnome_vfs_mime_application_get_icon (application)); + } + if (icon != NULL) { sn_launcher_context_set_icon_name (sn_context, icon); g_free (icon); @@ -761,7 +786,7 @@ nautilus_launch_application (GnomeVFSMimeApplication *application, } #endif /* HAVE_STARTUP_NOTIFICATION */ - result = gnome_vfs_mime_application_launch_with_env (application, &uris, envp); + result = gnome_vfs_mime_application_launch_with_env (application, uris, envp); #ifdef HAVE_STARTUP_NOTIFICATION if (sn_context != NULL) { @@ -783,7 +808,7 @@ nautilus_launch_application (GnomeVFSMimeApplication *application, break; case GNOME_VFS_ERROR_NOT_SUPPORTED: - uri_scheme = nautilus_file_get_uri_scheme (file); + uri_scheme = nautilus_file_get_uri_scheme (NAUTILUS_FILE (files->data)); application_cannot_open_location (application, file, uri_scheme, @@ -800,8 +825,8 @@ nautilus_launch_application (GnomeVFSMimeApplication *application, #endif break; } - - g_free (uri); + + eel_g_list_free_deep (uris); g_strfreev (envp); } diff --git a/libnautilus-private/nautilus-program-choosing.h b/libnautilus-private/nautilus-program-choosing.h index 48d5c3249..002073eb6 100644 --- a/libnautilus-private/nautilus-program-choosing.h +++ b/libnautilus-private/nautilus-program-choosing.h @@ -37,7 +37,7 @@ typedef void (*NautilusApplicationChoiceCallback) (GnomeVFSMimeApplication *app gpointer callback_data); void nautilus_launch_application (GnomeVFSMimeApplication *application, - NautilusFile *file, + GList *files, GtkWindow *parent_window); void nautilus_launch_application_from_command (GdkScreen *screen, const char *name, |