summaryrefslogtreecommitdiff
path: root/libnautilus-private
diff options
context:
space:
mode:
authorChristian Neumair <chris@gnome-de.org>2006-01-11 19:33:35 +0000
committerChristian Neumair <cneumair@src.gnome.org>2006-01-11 19:33:35 +0000
commit8f7c1824dc0a226166dc5c199934d6158ca75e62 (patch)
treeda7a238dcaaacc3b3fadb27da1db786c4dd6c946 /libnautilus-private
parent6f55ef202be4a67d530e199071948dca35d49aae (diff)
downloadnautilus-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.c151
-rw-r--r--libnautilus-private/nautilus-mime-actions.h5
-rw-r--r--libnautilus-private/nautilus-program-choosing.c79
-rw-r--r--libnautilus-private/nautilus-program-choosing.h2
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,