summaryrefslogtreecommitdiff
path: root/libnautilus-private/nautilus-program-choosing.c
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/nautilus-program-choosing.c
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/nautilus-program-choosing.c')
-rw-r--r--libnautilus-private/nautilus-program-choosing.c79
1 files changed, 52 insertions, 27 deletions
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);
}