From eb6a30500dac5443c9ec4f486ec47189e7cc7686 Mon Sep 17 00:00:00 2001 From: Dave Camp Date: Thu, 22 Jul 2004 03:57:44 +0000 Subject: [PATCH] Merged the nautilus-new-mime branch. 2004-07-21 Dave Camp * Merged the nautilus-new-mime branch. --- ChangeLog | 121 ++ libnautilus-private/Makefile.am | 4 +- libnautilus-private/nautilus-mime-actions.c | 1779 +---------------- libnautilus-private/nautilus-mime-actions.h | 52 +- .../nautilus-program-choosing.c | 538 +---- .../nautilus-program-choosing.h | 17 - src/file-manager/fm-bonobo-provider.c | 5 +- src/file-manager/fm-directory-view.c | 613 +++--- src/file-manager/fm-properties-window.c | 32 + .../nautilus-directory-view-ui.xml | 14 +- src/nautilus-applicable-views.c | 7 +- src/nautilus-information-panel.c | 6 +- src/nautilus-navigation-window.c | 47 - src/nautilus-shell-ui.xml | 4 - src/nautilus-window-manage-views.c | 3 +- src/nautilus-window-menus.c | 9 - src/nautilus-window.c | 46 +- test/Makefile.am | 4 - test/test-nautilus-mime-actions.c | 74 +- 19 files changed, 601 insertions(+), 2774 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8c855483c..27fde079a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,124 @@ +2004-07-21 Dave Camp + + * Merged the nautilus-new-mime branch. + +2004-07-21 Dave Camp + + * src/file-manager/fm-properties-window.c: (should_show_open_with), + (create_open_with_page), (create_properties_window): Show + the Open With tab in the properties window. + +2004-07-19 Dave Camp + + * libnautilus-private/nautilus-mime-actions.c: + (nautilus_mime_get_default_application_for_file_internal): + * src/file-manager/fm-directory-view.c: (application_selected_cb), + (choose_program), (file_is_launchable): Use the new eel + open with dialog. + +Mon Jul 19 12:52:04 2004 Jonathan Blandford + + * src/file-manager/fm-directory-view.c + (get_default_executable_text_file_action): default to ASK + +2004-07-12 Dave Camp + + * libnautilus-private/nautilus-mime-actions.c: + (nautilus_mime_actions_get_open_with_file_attributes), + (nautilus_mime_actions_check_if_open_with_attributes_ready), + (nautilus_mime_get_default_application_for_file_internal), + (get_open_with_mime_applications), + (nautilus_mime_get_open_with_applications_for_file): + * libnautilus-private/nautilus-program-choosing.c: + (nautilus_launch_show_file): + * src/file-manager/fm-directory-view.c: + (add_application_to_bonobo_menu), + (get_default_executable_text_file_action), + (get_executable_text_file_action), (can_use_component_for_file), + (get_activation_action), (reset_bonobo_open_with_menu), + (real_update_menus), (fm_directory_view_notify_selection_changed), + (activate_callback): + * src/file-manager/nautilus-directory-view-ui.xml: + + MIME overhaul, part 2. + + Show the application that will be executed in the Open menu + item. If there are < 4 applications, show them in the main + context menu, otherwise show them in the Open With menu. + +2004-07-09 Dave Camp + + + * test/Makefile.am (noinst_PROGRAMS): + * libnautilus-private/Makefile.am: + * libnautilus-private/nautilus-mime-actions.c: + (nautilus_mime_get_applications_for_file), + (application_supports_uri_scheme_strcmp_style), + (nautilus_mime_has_any_applications_for_file), + (nautilus_mime_set_default_application_for_file), + (gnome_vfs_mime_application_has_id), + (gnome_vfs_mime_id_matches_application), + (gnome_vfs_mime_application_has_id_not_in_list): + * libnautilus-private/nautilus-mime-actions.h: + * libnautilus-private/nautilus-program-choosing.c: + (application_cannot_open_location), (nautilus_launch_show_file), + (nautilus_launch_application): + * libnautilus-private/nautilus-program-choosing.h: + * libnautilus-private/nautilus-view-query.c: (is_known_mime_type), + (nautilus_view_query_check_if_minimum_attributes_ready), + (nautilus_view_query_check_if_full_attributes_ready), + (nautilus_view_query_get_popup_file_attributes), + (nautilus_view_query_check_if_popup_attributes_ready), + (nautilus_view_query_get_default_component_sort_conditions), + (nautilus_view_query_get_default_component_for_file_internal), + (nautilus_view_query_get_default_component_for_file), + (nautilus_view_query_get_fallback_component_for_file), + (nautilus_view_query_get_components_for_file_extended), + (nautilus_view_query_get_components_for_file), + (nautilus_view_query_has_any_components_for_file_extended), + (nautilus_view_query_has_any_components_for_file), + (mime_get_components_for_uri_scheme), + (nautilus_view_query_has_any_components_for_uri_scheme), + (nautilus_view_query_set_default_component_for_file), + (extract_prefix_add_suffix), (mime_type_get_supertype), + (get_explicit_content_view_iids_from_metafile), + (make_bonobo_activation_query_for_explicit_content_view_iids), + (make_bonobo_activation_query_with_known_mime_type), + (make_bonobo_activation_query_with_uri_scheme_only), + (mime_type_list_to_hash_table), (free_key), + (mime_type_hash_table_destroy), (server_has_content_requirements), + (server_matches_content_requirements), + (nautilus_do_component_query), (strv_length), (strv_concat), + (nautilus_view_query_get_popup_components_for_file), + (nautilus_view_query_get_property_components_for_file), + (has_server_info_in_list), (server_info_list_intersection), + (nautilus_view_query_get_property_components_for_files), + (nautilus_view_query_get_popup_components_for_files): + * libnautilus-private/nautilus-view-query.h: + * src/file-manager/fm-directory-view.c: (choose_program), + (open_with_other_program), (other_application_callback), + (can_use_component_for_file), (activate_callback): + * src/nautilus-applicable-views.c: (got_file_info_callback): + * src/nautilus-information-panel.c: (open_with_callback), + (nautilus_information_panel_update_buttons): + * src/nautilus-navigation-window.c: (load_view_as_menu): + * src/nautilus-shell-ui.xml: + * src/nautilus-window-manage-views.c: + (nautilus_window_set_content_view): + * src/nautilus-window-menus.c: + (nautilus_window_initialize_menus_part_1): + * src/nautilus-window.c: (refresh_stored_viewers), + (nautilus_window_set_viewed_file): MIME overhaul, part 1. + Separated gnome-vfs application mime mapping from view querying, + put them in different files. + + Got rid of the short list/all application distinction. + + Got rid of "View As...", all appropriate views are shown. + + Only ever show folders in nautilus - everything else should be + opened in an app. + 2004-07-16 Alexander Larsson * data/Makefile.am: diff --git a/libnautilus-private/Makefile.am b/libnautilus-private/Makefile.am index 20fe391d3..52062cfc9 100644 --- a/libnautilus-private/Makefile.am +++ b/libnautilus-private/Makefile.am @@ -153,8 +153,6 @@ libnautilus_private_la_SOURCES = \ nautilus-module.h \ nautilus-monitor.c \ nautilus-monitor.h \ - nautilus-program-chooser.c \ - nautilus-program-chooser.h \ nautilus-program-choosing.c \ nautilus-program-choosing.h \ nautilus-recent.h \ @@ -189,6 +187,8 @@ libnautilus_private_la_SOURCES = \ nautilus-vfs-file.h \ nautilus-view-identifier.c \ nautilus-view-identifier.h \ + nautilus-view-query.c \ + nautilus-view-query.h \ $(NULL) $(lib_LTLIBRARIES): $(dependency_static_libs) diff --git a/libnautilus-private/nautilus-mime-actions.c b/libnautilus-private/nautilus-mime-actions.c index ed918af14..5decb4e0e 100644 --- a/libnautilus-private/nautilus-mime-actions.c +++ b/libnautilus-private/nautilus-mime-actions.c @@ -41,31 +41,8 @@ static int gnome_vfs_mime_id_matches_application (const char GnomeVFSMimeApplication *application); static gboolean gnome_vfs_mime_application_has_id_not_in_list (GnomeVFSMimeApplication *application, GList *ids); -static gboolean string_not_in_list (const char *str, - GList *list); -static char *mime_type_get_supertype (const char *mime_type); -static GList *get_explicit_content_view_iids_from_metafile (NautilusFile *file); -static gboolean server_has_content_requirements (Bonobo_ServerInfo *server); static gboolean application_supports_uri_scheme (gpointer data, gpointer uri_scheme); -static GList *nautilus_do_component_query (const char *mime_type, - const char *uri_scheme, - GList *content_mime_types, - gboolean ignore_content_mime_types, - GList *explicit_iids, - char **extra_sort_criteria, - char *extra_requirements, - gboolean must_be_view); -static GList *str_list_difference (GList *a, - GList *b); -static char **strv_concat (char **a, - char **b); - -static gboolean -is_known_mime_type (const char *mime_type) -{ - return eel_strcasecmp (mime_type, GNOME_VFS_MIME_TYPE_UNKNOWN) != 0; -} static gboolean nautilus_mime_actions_check_if_minimum_attributes_ready (NautilusFile *file) @@ -79,19 +56,6 @@ nautilus_mime_actions_check_if_minimum_attributes_ready (NautilusFile *file) return ready; } -static gboolean -nautilus_mime_actions_check_if_full_attributes_ready (NautilusFile *file) -{ - NautilusFileAttributes attributes; - gboolean ready; - - attributes = nautilus_mime_actions_get_full_file_attributes (); - ready = nautilus_file_check_if_ready (file, attributes); - - return ready; -} - - NautilusFileAttributes nautilus_mime_actions_get_minimum_file_attributes (void) { @@ -102,6 +66,26 @@ nautilus_mime_actions_get_minimum_file_attributes (void) NAUTILUS_FILE_ATTRIBUTE_SLOW_MIME_TYPE; } +static NautilusFileAttributes +nautilus_mime_actions_get_open_with_file_attributes (void) +{ + return NAUTILUS_FILE_ATTRIBUTE_VOLUMES | + NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI | + NAUTILUS_FILE_ATTRIBUTE_METADATA | + NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE; +} + +static gboolean +nautilus_mime_actions_check_if_open_with_attributes_ready (NautilusFile *file) +{ + NautilusFileAttributes attributes; + gboolean ready; + + attributes = nautilus_mime_actions_get_open_with_file_attributes (); + ready = nautilus_file_check_if_ready (file, attributes); + + return ready; +} NautilusFileAttributes nautilus_mime_actions_get_full_file_attributes (void) @@ -110,81 +94,6 @@ nautilus_mime_actions_get_full_file_attributes (void) NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES; } - - -GnomeVFSMimeActionType -nautilus_mime_get_default_action_type_for_file (NautilusFile *file) -{ - char *mime_type; - char *action_type_string; - GnomeVFSMimeActionType action_type; - - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { - return GNOME_VFS_MIME_ACTION_TYPE_NONE; - } - - action_type_string = nautilus_file_get_metadata - (file, NAUTILUS_METADATA_KEY_DEFAULT_ACTION_TYPE, NULL); - - if (action_type_string == NULL) { - mime_type = nautilus_file_get_mime_type (file); - action_type = gnome_vfs_mime_get_default_action_type (mime_type); - g_free (mime_type); - } else { - if (g_ascii_strcasecmp (action_type_string, "application") == 0) { - action_type = GNOME_VFS_MIME_ACTION_TYPE_APPLICATION; - } else if (g_ascii_strcasecmp (action_type_string, "component") == 0) { - action_type = GNOME_VFS_MIME_ACTION_TYPE_COMPONENT; - } else { - action_type = GNOME_VFS_MIME_ACTION_TYPE_NONE; - } - g_free (action_type_string); - } - - return action_type; -} - -GnomeVFSMimeAction * -nautilus_mime_get_default_action_for_file (NautilusFile *file) -{ - GnomeVFSMimeAction *action; - - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { - return NULL; - } - - action = g_new0 (GnomeVFSMimeAction, 1); - - action->action_type = nautilus_mime_get_default_action_type_for_file (file); - - switch (action->action_type) { - case GNOME_VFS_MIME_ACTION_TYPE_APPLICATION: - action->action.application = - nautilus_mime_get_default_application_for_file (file); - if (action->action.application == NULL) { - g_free (action); - action = NULL; - } - break; - case GNOME_VFS_MIME_ACTION_TYPE_COMPONENT: - action->action.component = - nautilus_mime_get_default_component_for_file (file); - if (action->action.component == NULL) { - g_free (action); - action = NULL; - } - case GNOME_VFS_MIME_ACTION_TYPE_NONE: - g_free (action); - action = NULL; - break; - default: - g_assert_not_reached (); - } - - return action; -} - - static GnomeVFSMimeApplication * nautilus_mime_get_default_application_for_file_internal (NautilusFile *file, gboolean *user_chosen) @@ -194,7 +103,7 @@ nautilus_mime_get_default_application_for_file_internal (NautilusFile *file, char *default_application_string; gboolean used_user_chosen_info; - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { + if (!nautilus_mime_actions_check_if_open_with_attributes_ready (file)) { return NULL; } @@ -209,6 +118,17 @@ nautilus_mime_get_default_application_for_file_internal (NautilusFile *file, if (default_application_string == NULL) { mime_type = nautilus_file_get_mime_type (file); result = gnome_vfs_mime_get_default_application (mime_type); + + if (result == NULL) { + GList *all_applications; + + all_applications = nautilus_mime_get_open_with_applications_for_file (file); + if (all_applications) { + result = gnome_vfs_mime_application_copy (all_applications->data); + gnome_vfs_mime_application_list_free (all_applications); + } + } + g_free (mime_type); used_user_chosen_info = FALSE; } else { @@ -230,299 +150,6 @@ nautilus_mime_get_default_application_for_file (NautilusFile *file) return nautilus_mime_get_default_application_for_file_internal (file, NULL); } -gboolean -nautilus_mime_is_default_application_for_file_user_chosen (NautilusFile *file) -{ - GnomeVFSMimeApplication *application; - gboolean user_chosen; - - application = nautilus_mime_get_default_application_for_file_internal (file, &user_chosen); - - /* Doesn't count as user chosen if the user-specified data is bogus and doesn't - * result in an actual application. - */ - if (application == NULL) { - return FALSE; - } - - gnome_vfs_mime_application_free (application); - - return user_chosen; -} - - -static char ** -nautilus_mime_get_default_component_sort_conditions (NautilusFile *file, char *default_component_string) -{ - char **sort_conditions; - char *supertype; - char *mime_type; - GList *short_list; - GList *p; - char *prev; - - sort_conditions = g_new0 (char *, 5); - - mime_type = nautilus_file_get_mime_type (file); - - supertype = mime_type_get_supertype (mime_type); - - /* prefer the exact right IID */ - if (default_component_string != NULL) { - sort_conditions[0] = g_strconcat ("iid == '", default_component_string, "'", NULL); - } else { - sort_conditions[0] = g_strdup ("true"); - } - - /* Prefer something from the short list */ - - short_list = nautilus_mime_get_short_list_components_for_file (file); - if (short_list != NULL) { - sort_conditions[1] = g_strdup ("prefer_by_list_order (iid, ['"); - - for (p = short_list; p != NULL; p = p->next) { - prev = sort_conditions[1]; - - if (p->next != NULL) { - sort_conditions[1] = g_strconcat (prev, ((Bonobo_ServerInfo *) (p->data))->iid, - "','", NULL); - } else { - sort_conditions[1] = g_strconcat (prev, ((Bonobo_ServerInfo *) (p->data))->iid, - "'])", NULL); - } - g_free (prev); - } - } else { - sort_conditions[1] = g_strdup ("true"); - } - - gnome_vfs_mime_component_list_free (short_list); - - /* Prefer something that matches the exact type to something - that matches the supertype */ - if (is_known_mime_type (mime_type)) { - sort_conditions[2] = g_strconcat ("bonobo:supported_mime_types.has ('",mime_type,"')", NULL); - } else { - sort_conditions[2] = g_strdup ("true"); - } - - /* Prefer something that matches the supertype to something that matches `*' */ - if (is_known_mime_type (mime_type) && supertype != NULL) { - sort_conditions[3] = g_strconcat ("bonobo:supported_mime_types.has ('",supertype,"')", NULL); - } else { - sort_conditions[3] = g_strdup ("true"); - } - - sort_conditions[4] = NULL; - - g_free (mime_type); - g_free (supertype); - - return sort_conditions; -} - -static Bonobo_ServerInfo * -nautilus_mime_get_default_component_for_file_internal (NautilusFile *file, - gboolean fallback, - gboolean *user_chosen) -{ - GList *info_list; - Bonobo_ServerInfo *mime_default; - char *default_component_string; - char *mime_type; - char *uri_scheme; - GList *item_mime_types; - GList *explicit_iids; - Bonobo_ServerInfo *server; - char **sort_conditions; - char *extra_requirements; - gboolean used_user_chosen_info; - gboolean metadata_default; - - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { - return NULL; - } - - used_user_chosen_info = TRUE; - - info_list = NULL; - - mime_type = nautilus_file_get_mime_type (file); - - uri_scheme = nautilus_file_get_uri_scheme (file); - - explicit_iids = get_explicit_content_view_iids_from_metafile (file); - - if (!nautilus_mime_actions_check_if_full_attributes_ready (file) || - !nautilus_file_get_directory_item_mime_types (file, &item_mime_types)) { - item_mime_types = NULL; - } - - default_component_string = NULL; - if (!fallback) { - default_component_string = nautilus_file_get_metadata - (file, NAUTILUS_METADATA_KEY_DEFAULT_COMPONENT, NULL); - } - - if (default_component_string == NULL) { - metadata_default = FALSE; - - if (is_known_mime_type (mime_type)) { - mime_default = gnome_vfs_mime_get_default_component (mime_type); - if (mime_default != NULL) { - default_component_string = g_strdup (mime_default->iid); - if (default_component_string != NULL) { - /* Default component chosen based only on type. */ - used_user_chosen_info = FALSE; - } - CORBA_free (mime_default); - } - } - } else { - metadata_default = TRUE; - } - - sort_conditions = nautilus_mime_get_default_component_sort_conditions (file, default_component_string); - - /* If the default is specified in the per-uri metadata, - respect the setting regardless of content type requirements */ - if (metadata_default) { - extra_requirements = g_strconcat ("iid == '", default_component_string, "'", NULL); - info_list = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, TRUE, - explicit_iids, sort_conditions, extra_requirements, TRUE); - g_free (extra_requirements); - } - - if (info_list == NULL) { - info_list = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, FALSE, - explicit_iids, sort_conditions, NULL, TRUE); - } - - if (info_list != NULL) { - server = Bonobo_ServerInfo_duplicate (info_list->data); - gnome_vfs_mime_component_list_free (info_list); - - if (default_component_string != NULL && strcmp (server->iid, default_component_string) == 0) { - used_user_chosen_info = TRUE; /* Default component chosen based on user-stored . */ - } - } else { - server = NULL; - } - - eel_g_list_free_deep (item_mime_types); - eel_g_list_free_deep (explicit_iids); - g_strfreev (sort_conditions); - - g_free (uri_scheme); - g_free (mime_type); - g_free (default_component_string); - - if (user_chosen != NULL) { - *user_chosen = used_user_chosen_info; - } - - return server; -} - - -Bonobo_ServerInfo * -nautilus_mime_get_default_component_for_file (NautilusFile *file) -{ - return nautilus_mime_get_default_component_for_file_internal (file, FALSE, NULL); -} - -Bonobo_ServerInfo * -nautilus_mime_get_default_fallback_component_for_file (NautilusFile *file) -{ - return nautilus_mime_get_default_component_for_file_internal (file, TRUE, NULL); -} - - -gboolean -nautilus_mime_is_default_component_for_file_user_chosen (NautilusFile *file) -{ - Bonobo_ServerInfo *component; - gboolean user_chosen; - - component = nautilus_mime_get_default_component_for_file_internal (file, FALSE, &user_chosen); - - /* Doesn't count as user chosen if the user-specified data is bogus and doesn't - * result in an actual component. - */ - if (component == NULL) { - return FALSE; - } - - CORBA_free (component); - - return user_chosen; -} - -GList * -nautilus_mime_get_short_list_applications_for_file (NautilusFile *file) -{ - char *mime_type; - char *uri_scheme; - GList *result; - GList *removed; - GList *metadata_application_add_ids; - GList *metadata_application_remove_ids; - GList *p; - GnomeVFSMimeApplication *application; - - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { - return NULL; - } - - mime_type = nautilus_file_get_mime_type (file); - result = gnome_vfs_mime_get_short_list_applications (mime_type); - g_free (mime_type); - - /* First remove applications that cannot support this location */ - uri_scheme = nautilus_file_get_uri_scheme (file); - g_assert (uri_scheme != NULL); - result = eel_g_list_partition (result, application_supports_uri_scheme, - uri_scheme, &removed); - gnome_vfs_mime_application_list_free (removed); - g_free (uri_scheme); - - metadata_application_add_ids = nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_SHORT_LIST_APPLICATION_ADD, - NAUTILUS_METADATA_SUBKEY_APPLICATION_ID); - metadata_application_remove_ids = nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_SHORT_LIST_APPLICATION_REMOVE, - NAUTILUS_METADATA_SUBKEY_APPLICATION_ID); - - - result = eel_g_list_partition (result, (EelPredicateFunction) gnome_vfs_mime_application_has_id_not_in_list, - metadata_application_remove_ids, &removed); - - gnome_vfs_mime_application_list_free (removed); - - result = g_list_reverse (result); - for (p = metadata_application_add_ids; p != NULL; p = p->next) { - if (g_list_find_custom (result, - p->data, - (GCompareFunc) gnome_vfs_mime_application_has_id) == NULL && - g_list_find_custom (metadata_application_remove_ids, - p->data, - (GCompareFunc) strcmp) == NULL) { - application = gnome_vfs_application_registry_get_mime_application (p->data); - if (application != NULL) { - result = g_list_prepend (result, application); - } - } - } - result = g_list_reverse (result); - - eel_g_list_free_deep (metadata_application_add_ids); - eel_g_list_free_deep (metadata_application_remove_ids); - - return result; -} - static GList * get_open_with_mime_applications (NautilusFile *file) { @@ -533,13 +160,13 @@ get_open_with_mime_applications (NautilusFile *file) guessed_mime_type = nautilus_file_get_guessed_mime_type (file); mime_type = nautilus_file_get_mime_type (file); - result = gnome_vfs_mime_get_short_list_applications (mime_type); + result = gnome_vfs_mime_get_all_applications (mime_type); if (strcmp (guessed_mime_type, mime_type) != 0) { GList *result_2; GList *l; - result_2 = gnome_vfs_mime_get_short_list_applications (guessed_mime_type); + result_2 = gnome_vfs_mime_get_all_applications (guessed_mime_type); for (l = result_2; l != NULL; l = l->next) { if (!g_list_find_custom (result, ((GnomeVFSMimeApplication*)l->data)->id, @@ -557,7 +184,7 @@ get_open_with_mime_applications (NautilusFile *file) } /* Get a list of applications for the Open With menu. This is - * different than nautilus_mime_get_short_list_applications_for_file() + * different than nautilus_mime_get_applications_for_file() * because this function will merge the lists of the fast and slow * mime types for the file */ GList * @@ -571,7 +198,7 @@ nautilus_mime_get_open_with_applications_for_file (NautilusFile *file) GList *p; GnomeVFSMimeApplication *application; - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { + if (!nautilus_mime_actions_check_if_open_with_attributes_ready (file)) { return NULL; } @@ -622,128 +249,8 @@ nautilus_mime_get_open_with_applications_for_file (NautilusFile *file) return result; } -static char * -build_joined_string (GList *list, const char *prefix, const char *separator, const char *suffix) -{ - GString *string; - GList *node; - char *result; - - string = g_string_new (prefix); - if (list != NULL) { - g_string_append (string, list->data); - for (node = list->next; node != NULL; node = node->next) { - g_string_append (string, separator); - g_string_append (string, node->data); - } - } - g_string_append (string, suffix); - - result = string->str; - g_string_free (string, FALSE); - return result; -} - GList * -nautilus_mime_get_short_list_components_for_file (NautilusFile *file) -{ - char *mime_type; - char *uri_scheme; - GList *item_mime_types; - GList *servers; - GList *iids; - GList *result; - GList *removed; - GList *metadata_component_add_ids; - GList *metadata_component_remove_ids; - GList *p; - Bonobo_ServerInfo *component; - GList *explicit_iids; - char *extra_sort_conditions[2]; - char *extra_requirements; - - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { - return NULL; - } - - uri_scheme = nautilus_file_get_uri_scheme (file); - - explicit_iids = get_explicit_content_view_iids_from_metafile (file); - - if (!nautilus_mime_actions_check_if_full_attributes_ready (file) || - !nautilus_file_get_directory_item_mime_types (file, &item_mime_types)) { - item_mime_types = NULL; - } - - metadata_component_add_ids = nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_SHORT_LIST_COMPONENT_ADD, - NAUTILUS_METADATA_SUBKEY_COMPONENT_IID); - metadata_component_remove_ids = nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_SHORT_LIST_COMPONENT_REMOVE, - NAUTILUS_METADATA_SUBKEY_COMPONENT_IID); - - mime_type = nautilus_file_get_mime_type (file); - servers = gnome_vfs_mime_get_short_list_components (mime_type); - iids = NULL; - - for (p = servers; p != NULL; p = p->next) { - component = (Bonobo_ServerInfo *) p->data; - - iids = g_list_prepend (iids, component->iid); - } - - iids = eel_g_list_partition - (iids, (EelPredicateFunction) string_not_in_list, - metadata_component_remove_ids, &removed); - - g_list_free (removed); - - for (p = metadata_component_add_ids; p != NULL; p = p->next) { - if (g_list_find_custom (iids, - p->data, - (GCompareFunc) strcmp) == NULL && - g_list_find_custom (metadata_component_remove_ids, - p->data, - (GCompareFunc) strcmp) == NULL) { - iids = g_list_prepend (iids, p->data); - } - } - - /* By copying the iids using g_list_prepend, we've reversed - * the short list order. We need to use the order to determine - * the first available component, so reverse it now to - * maintain original ordering. - */ - - if (iids == NULL) { - result = NULL; - } else { - iids = g_list_reverse (iids); - extra_sort_conditions[0] = build_joined_string (iids, "prefer_by_list_order (iid, ['", "','", "'])"); - extra_sort_conditions[1] = NULL; - extra_requirements = build_joined_string (iids, "has (['", "','", "'], iid)"); - result = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, FALSE, - explicit_iids, extra_sort_conditions, extra_requirements, TRUE); - g_free (extra_requirements); - g_free (extra_sort_conditions[0]); - } - - eel_g_list_free_deep (item_mime_types); - eel_g_list_free_deep (explicit_iids); - eel_g_list_free_deep (metadata_component_add_ids); - eel_g_list_free_deep (metadata_component_remove_ids); - gnome_vfs_mime_component_list_free (servers); - g_list_free (iids); - g_free (uri_scheme); - g_free (mime_type); - - return result; -} - -GList * -nautilus_mime_get_all_applications_for_file (NautilusFile *file) +nautilus_mime_get_applications_for_file (NautilusFile *file) { char *mime_type; GList *result; @@ -797,7 +304,7 @@ nautilus_mime_has_any_applications_for_file (NautilusFile *file) char *uri_scheme; gboolean result; - all_applications_for_mime_type = nautilus_mime_get_all_applications_for_file (file); + all_applications_for_mime_type = nautilus_mime_get_applications_for_file (file); uri_scheme = nautilus_file_get_uri_scheme (file); application_that_can_access_uri = g_list_find_custom @@ -812,364 +319,6 @@ nautilus_mime_has_any_applications_for_file (NautilusFile *file) return result; } -gboolean -nautilus_mime_has_any_applications_for_file_type (NautilusFile *file) -{ - GList *applications; - gboolean result; - - applications = nautilus_mime_get_all_applications_for_file (file); - - result = applications != NULL; - gnome_vfs_mime_application_list_free (applications); - - return result; -} - -gboolean -nautilus_mime_actions_file_needs_full_file_attributes (NautilusFile *file) -{ - char *mime_type; - char *uri_scheme; - GList *info_list; - GList *explicit_iids; - GList *p; - gboolean needs_full_attributes; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - FALSE); - - if (!nautilus_file_is_directory (file)) { - return FALSE; - } - - uri_scheme = nautilus_file_get_uri_scheme (file); - - mime_type = nautilus_file_get_mime_type (file); - - explicit_iids = get_explicit_content_view_iids_from_metafile (file); - - info_list = nautilus_do_component_query (mime_type, uri_scheme, NULL, TRUE, - explicit_iids, NULL, NULL, TRUE); - - needs_full_attributes = FALSE; - - for (p = info_list; p != NULL; p = p->next) { - needs_full_attributes |= server_has_content_requirements ((Bonobo_ServerInfo *) (p->data)); - } - - gnome_vfs_mime_component_list_free (info_list); - eel_g_list_free_deep (explicit_iids); - g_free (uri_scheme); - g_free (mime_type); - - return needs_full_attributes; -} - - -GList * -nautilus_mime_get_all_components_for_file_extended (NautilusFile *file, - char *extra_reqs) -{ - char *mime_type; - char *uri_scheme; - GList *item_mime_types; - GList *info_list; - GList *explicit_iids; - - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { - return NULL; - } - - uri_scheme = nautilus_file_get_uri_scheme (file); - - mime_type = nautilus_file_get_mime_type (file); - explicit_iids = get_explicit_content_view_iids_from_metafile (file); - - if (!nautilus_mime_actions_check_if_full_attributes_ready (file) || - !nautilus_file_get_directory_item_mime_types (file, &item_mime_types)) { - item_mime_types = NULL; - } - - info_list = nautilus_do_component_query (mime_type, uri_scheme, - item_mime_types, FALSE, - explicit_iids, NULL, - extra_reqs, TRUE); - - eel_g_list_free_deep (explicit_iids); - eel_g_list_free_deep (item_mime_types); - - g_free (uri_scheme); - g_free (mime_type); - - return info_list; -} - -static NautilusFileAttributes -nautilus_mime_actions_get_popup_file_attributes (void) -{ - return NAUTILUS_FILE_ATTRIBUTE_VOLUMES | - NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI | - NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE; -} - -static gboolean -nautilus_mime_actions_check_if_popup_attributes_ready (NautilusFile *file) -{ - NautilusFileAttributes attributes; - gboolean ready; - - attributes = nautilus_mime_actions_get_popup_file_attributes (); - ready = nautilus_file_check_if_ready (file, attributes); - - return ready; -} - -GList * -nautilus_mime_get_popup_components_for_file (NautilusFile *file) -{ - char *mime_type; - char *uri_scheme; - char *extra_reqs; - GList *item_mime_types; - GList *info_list; - - if (!nautilus_mime_actions_check_if_popup_attributes_ready (file)) { - return NULL; - } - - uri_scheme = nautilus_file_get_uri_scheme (file); - - mime_type = nautilus_file_get_mime_type (file); - - if (!nautilus_mime_actions_check_if_full_attributes_ready (file) || - !nautilus_file_get_directory_item_mime_types (file, &item_mime_types)) { - item_mime_types = NULL; - } - - extra_reqs = "repo_ids.has ('IDL:Bonobo/Listener:1.0') AND (nautilus:context_menu_handler == true) AND nautilus:can_handle_multiple_files.defined()"; - - info_list = nautilus_do_component_query (mime_type, uri_scheme, - item_mime_types, FALSE, - NULL, NULL, - extra_reqs, FALSE); - - eel_g_list_free_deep (item_mime_types); - - g_free (uri_scheme); - g_free (mime_type); - - return info_list; -} - -static gboolean -has_server_info_in_list (GList *list, Bonobo_ServerInfo *info) -{ - for (; list; list = list->next) { - Bonobo_ServerInfo *tmp_info = list->data; - - if (strcmp (tmp_info->iid, info->iid) == 0) { - return TRUE; - } - } - - return FALSE; -} - -static GList * -server_info_list_intersection (GList *a, GList *b) -{ - GList *result = NULL; - - if (a == NULL || b == NULL) { - return NULL; - } - - while (b) { - Bonobo_ServerInfo *info; - - info = (Bonobo_ServerInfo *)b->data; - - if (has_server_info_in_list (a, info)) { - result = g_list_prepend (result, - Bonobo_ServerInfo_duplicate (info)); - - } - - b = b->next; - } - - return g_list_reverse (result); -} - -GList * -nautilus_mime_get_property_components_for_file (NautilusFile *file) -{ - char *mime_type; - char *uri_scheme; - char *extra_reqs; - GList *item_mime_types; - GList *info_list; - - if (!nautilus_mime_actions_check_if_minimum_attributes_ready (file)) { - return NULL; - } - - uri_scheme = nautilus_file_get_uri_scheme (file); - - mime_type = nautilus_file_get_mime_type (file); - - if (!nautilus_mime_actions_check_if_full_attributes_ready (file) || - !nautilus_file_get_directory_item_mime_types (file, &item_mime_types -)) { - item_mime_types = NULL; - } - - extra_reqs = "repo_ids.has ('IDL:Bonobo/Control:1.0') AND nautilus:property_page_name.defined()"; - - info_list = nautilus_do_component_query (mime_type, uri_scheme, - item_mime_types, FALSE, - NULL, NULL, - extra_reqs, FALSE); - - eel_g_list_free_deep (item_mime_types); - - g_free (uri_scheme); - g_free (mime_type); - - return info_list; -} - -GList * -nautilus_mime_get_property_components_for_files (GList *files) -{ - GList *result, *l; - - result = NULL; - - for (l = files; l; l = l->next) { - GList *components, *new_result; - - components = nautilus_mime_get_property_components_for_file (l->data); - if (result != NULL) { - new_result = server_info_list_intersection (result, - components); - gnome_vfs_mime_component_list_free (result); - gnome_vfs_mime_component_list_free (components); - result = new_result; - } else { - result = components;; - } - - - } - - return result; -} - -GList * -nautilus_mime_get_popup_components_for_files (GList *files) -{ - GList *result, *l; - - result = NULL; - - for (l = files; l; l = l->next) { - GList *components, *new_result; - - components = nautilus_mime_get_popup_components_for_file (l->data); - if (result != NULL) { - new_result = server_info_list_intersection (result, - components); - gnome_vfs_mime_component_list_free (result); - gnome_vfs_mime_component_list_free (components); - result = new_result; - } else { - result = components;; - } - - - } - - return result; -} - -GList * -nautilus_mime_get_all_components_for_file (NautilusFile *file) -{ - return nautilus_mime_get_all_components_for_file_extended (file, NULL); -} - -gboolean -nautilus_mime_has_any_components_for_file_extended (NautilusFile *file, - char *extra_reqs) -{ - GList *list; - gboolean result; - - list = nautilus_mime_get_all_components_for_file_extended (file, - extra_reqs); - result = list != NULL; - gnome_vfs_mime_component_list_free (list); - - return result; -} - -gboolean -nautilus_mime_has_any_components_for_file (NautilusFile *file) -{ - return nautilus_mime_has_any_components_for_file_extended (file, NULL); -} - -static GList * -mime_get_all_components_for_uri_scheme (const char *uri_scheme) -{ - g_return_val_if_fail (eel_strlen (uri_scheme) > 0, NULL); - - return nautilus_do_component_query - (NULL, uri_scheme, NULL, TRUE, - NULL, NULL, NULL, TRUE); -} - -gboolean -nautilus_mime_has_any_components_for_uri_scheme (const char *uri_scheme) -{ - GList *list; - gboolean result; - - g_return_val_if_fail (eel_strlen (uri_scheme) > 0, FALSE); - - list = mime_get_all_components_for_uri_scheme (uri_scheme); - result = list != NULL; - gnome_vfs_mime_component_list_free (list); - - return result; -} - -GnomeVFSResult -nautilus_mime_set_default_action_type_for_file (NautilusFile *file, - GnomeVFSMimeActionType action_type) -{ - const char *action_string; - - switch (action_type) { - case GNOME_VFS_MIME_ACTION_TYPE_APPLICATION: - action_string = "application"; - break; - case GNOME_VFS_MIME_ACTION_TYPE_COMPONENT: - action_string = "component"; - break; - case GNOME_VFS_MIME_ACTION_TYPE_NONE: - default: - action_string = "none"; - } - - nautilus_file_set_metadata - (file, NAUTILUS_METADATA_KEY_DEFAULT_ACTION_TYPE, NULL, action_string); - - return GNOME_VFS_OK; -} - GnomeVFSResult nautilus_mime_set_default_application_for_file (NautilusFile *file, const char *application_id) @@ -1179,301 +328,6 @@ nautilus_mime_set_default_application_for_file (NautilusFile *file, nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_DEFAULT_APPLICATION, NULL, application_id); - - /* If there's no default action type, set it to match this. */ - if (application_id != NULL && - nautilus_mime_get_default_action_type_for_file (file) == GNOME_VFS_MIME_ACTION_TYPE_NONE) { - return nautilus_mime_set_default_action_type_for_file (file, GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); - } - - return GNOME_VFS_OK; -} - -GnomeVFSResult -nautilus_mime_set_default_component_for_file (NautilusFile *file, - const char *component_iid) -{ - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - nautilus_file_set_metadata - (file, NAUTILUS_METADATA_KEY_DEFAULT_COMPONENT, NULL, component_iid); - - /* If there's no default action type, set it to match this. */ - if (component_iid != NULL && - nautilus_mime_get_default_action_type_for_file (file) == GNOME_VFS_MIME_ACTION_TYPE_NONE) { - return nautilus_mime_set_default_action_type_for_file (file, GNOME_VFS_MIME_ACTION_TYPE_COMPONENT); - } - - return GNOME_VFS_OK; -} - -GnomeVFSResult -nautilus_mime_set_short_list_applications_for_file (NautilusFile *file, - GList *applications) -{ - GList *add_list; - GList *remove_list; - GList *normal_short_list; - GList *normal_short_list_ids; - GList *p; - char *mime_type; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - /* get per-mime short list */ - - mime_type = nautilus_file_get_mime_type (file); - normal_short_list = gnome_vfs_mime_get_short_list_applications (mime_type); - g_free (mime_type); - - normal_short_list_ids = NULL; - for (p = normal_short_list; p != NULL; p = p->next) { - normal_short_list_ids = g_list_prepend (normal_short_list_ids, ((GnomeVFSMimeApplication *) p->data)->id); - } - - /* compute delta */ - - add_list = str_list_difference (applications, normal_short_list_ids); - remove_list = str_list_difference (normal_short_list_ids, applications); - - gnome_vfs_mime_application_list_free (normal_short_list); - g_list_free (normal_short_list_ids); - - nautilus_file_set_metadata_list - (file, - NAUTILUS_METADATA_KEY_SHORT_LIST_APPLICATION_ADD, - NAUTILUS_METADATA_SUBKEY_APPLICATION_ID, - add_list); - nautilus_file_set_metadata_list - (file, - NAUTILUS_METADATA_KEY_SHORT_LIST_APPLICATION_REMOVE, - NAUTILUS_METADATA_SUBKEY_APPLICATION_ID, - remove_list); - - eel_g_list_free_deep (add_list); - eel_g_list_free_deep (remove_list); - - return GNOME_VFS_OK; -} - -GnomeVFSResult -nautilus_mime_set_short_list_components_for_file (NautilusFile *file, - GList *components) -{ - GList *add_list; - GList *remove_list; - GList *normal_short_list; - GList *normal_short_list_ids; - GList *p; - char *mime_type; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - /* get per-mime short list */ - - mime_type = nautilus_file_get_mime_type (file); - normal_short_list = gnome_vfs_mime_get_short_list_components (mime_type); - g_free (mime_type); - - normal_short_list_ids = NULL; - for (p = normal_short_list; p != NULL; p = p->next) { - normal_short_list_ids = g_list_prepend (normal_short_list_ids, ((Bonobo_ServerInfo *) p->data)->iid); - } - - /* compute delta */ - - add_list = str_list_difference (components, normal_short_list_ids); - remove_list = str_list_difference (normal_short_list_ids, components); - - gnome_vfs_mime_component_list_free (normal_short_list); - g_list_free (normal_short_list_ids); - - nautilus_file_set_metadata_list - (file, - NAUTILUS_METADATA_KEY_SHORT_LIST_COMPONENT_ADD, - NAUTILUS_METADATA_SUBKEY_COMPONENT_IID, - add_list); - nautilus_file_set_metadata_list - (file, - NAUTILUS_METADATA_KEY_SHORT_LIST_COMPONENT_REMOVE, - NAUTILUS_METADATA_SUBKEY_COMPONENT_IID, - remove_list); - - eel_g_list_free_deep (add_list); - eel_g_list_free_deep (remove_list); - - return GNOME_VFS_OK; -} - -GnomeVFSResult -nautilus_mime_add_application_to_short_list_for_file (NautilusFile *file, - const char *application_id) -{ - GList *old_list, *new_list; - GnomeVFSResult result; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - result = GNOME_VFS_OK; - - old_list = nautilus_mime_get_short_list_applications_for_file (file); - - if (!gnome_vfs_mime_id_in_application_list (application_id, old_list)) { - new_list = g_list_append (gnome_vfs_mime_id_list_from_application_list (old_list), - g_strdup (application_id)); - result = nautilus_mime_set_short_list_applications_for_file (file, new_list); - eel_g_list_free_deep (new_list); - } - - gnome_vfs_mime_application_list_free (old_list); - - return result; -} - -GnomeVFSResult -nautilus_mime_remove_application_from_short_list_for_file (NautilusFile *file, - const char *application_id) -{ - GList *old_list, *new_list; - gboolean was_in_list; - GnomeVFSResult result; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - old_list = nautilus_mime_get_short_list_applications_for_file (file); - old_list = gnome_vfs_mime_remove_application_from_list - (old_list, application_id, &was_in_list); - - if (!was_in_list) { - result = GNOME_VFS_OK; - } else { - new_list = gnome_vfs_mime_id_list_from_application_list (old_list); - result = nautilus_mime_set_short_list_applications_for_file (file, new_list); - eel_g_list_free_deep (new_list); - } - - gnome_vfs_mime_application_list_free (old_list); - - return result; -} - -GnomeVFSResult -nautilus_mime_add_component_to_short_list_for_file (NautilusFile *file, - const char *iid) -{ - GList *old_list, *new_list; - GnomeVFSResult result; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - old_list = nautilus_mime_get_short_list_components_for_file (file); - - if (gnome_vfs_mime_id_in_component_list (iid, old_list)) { - result = GNOME_VFS_OK; - } else { - new_list = g_list_append (gnome_vfs_mime_id_list_from_component_list (old_list), - g_strdup (iid)); - result = nautilus_mime_set_short_list_components_for_file (file, new_list); - eel_g_list_free_deep (new_list); - } - - gnome_vfs_mime_component_list_free (old_list); - - return result; -} - -GnomeVFSResult -nautilus_mime_remove_component_from_short_list_for_file (NautilusFile *file, - const char *iid) -{ - GList *old_list, *new_list; - gboolean was_in_list; - GnomeVFSResult result; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - old_list = nautilus_mime_get_short_list_components_for_file (file); - old_list = gnome_vfs_mime_remove_component_from_list - (old_list, iid, &was_in_list); - - if (!was_in_list) { - result = GNOME_VFS_OK; - } else { - new_list = gnome_vfs_mime_id_list_from_component_list (old_list); - result = nautilus_mime_set_short_list_components_for_file (file, new_list); - eel_g_list_free_deep (new_list); - } - - gnome_vfs_mime_component_list_free (old_list); - - return result; -} - -GnomeVFSResult -nautilus_mime_extend_all_applications_for_file (NautilusFile *file, - GList *applications) -{ - GList *metadata_application_ids; - GList *extras; - GList *final_applications; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - metadata_application_ids = nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_EXPLICIT_APPLICATION, - NAUTILUS_METADATA_SUBKEY_APPLICATION_ID); - - extras = str_list_difference (applications, metadata_application_ids); - - final_applications = g_list_concat (g_list_copy (metadata_application_ids), extras); - - nautilus_file_set_metadata_list - (file, - NAUTILUS_METADATA_KEY_EXPLICIT_APPLICATION, - NAUTILUS_METADATA_SUBKEY_APPLICATION_ID, - final_applications); - - eel_g_list_free_deep (metadata_application_ids); - eel_g_list_free_deep (extras); - g_list_free (final_applications); - - return GNOME_VFS_OK; -} - -GnomeVFSResult -nautilus_mime_remove_from_all_applications_for_file (NautilusFile *file, - GList *applications) -{ - GList *metadata_application_ids; - GList *final_applications; - - g_return_val_if_fail (nautilus_mime_actions_check_if_minimum_attributes_ready (file), - GNOME_VFS_ERROR_GENERIC); - - metadata_application_ids = nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_EXPLICIT_APPLICATION, - NAUTILUS_METADATA_SUBKEY_APPLICATION_ID); - - final_applications = str_list_difference (metadata_application_ids, applications); - - nautilus_file_set_metadata_list - (file, - NAUTILUS_METADATA_KEY_EXPLICIT_APPLICATION, - NAUTILUS_METADATA_SUBKEY_APPLICATION_ID, - final_applications); - - eel_g_list_free_deep (metadata_application_ids); - eel_g_list_free_deep (final_applications); return GNOME_VFS_OK; } @@ -1500,563 +354,6 @@ gnome_vfs_mime_application_has_id_not_in_list (GnomeVFSMimeApplication *applicat (GCompareFunc) gnome_vfs_mime_id_matches_application) == NULL; } -static gboolean -string_not_in_list (const char *str, - GList *list) -{ - return g_list_find_custom (list, (gpointer) str, (GCompareFunc) strcmp) == NULL; -} - -static char * -extract_prefix_add_suffix (const char *string, - const char *separator, - const char *suffix) -{ - const char *separator_position; - int prefix_length; - char *result; - - separator_position = strstr (string, separator); - prefix_length = separator_position == NULL - ? (int) strlen (string) - : separator_position - string; - - result = g_malloc (prefix_length + strlen(suffix) + 1); - - strncpy (result, string, prefix_length); - result[prefix_length] = '\0'; - - strcat (result, suffix); - - return result; -} - -static char * -mime_type_get_supertype (const char *mime_type) -{ - if (mime_type == NULL || mime_type == '\0') { - return g_strdup (mime_type); - } - return extract_prefix_add_suffix (mime_type, "/", "/*"); -} - - -/* - * The following routine uses metadata associated with the current url - * to add content view components specified in the metadata. The - * content views are specified in the string as elements inside the appropriate element. - */ - -static GList * -get_explicit_content_view_iids_from_metafile (NautilusFile *file) -{ - if (file != NULL) { - return nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_EXPLICIT_COMPONENT, - NAUTILUS_METADATA_SUBKEY_COMPONENT_IID); - } else { - return NULL; - } -} - -static char * -make_bonobo_activation_query_for_explicit_content_view_iids (GList *view_iids) -{ - GList *p; - char *iid; - char *query; - char *old_query; - - query = NULL; - - for (p = view_iids; p != NULL; p = p->next) { - iid = (char *) p->data; - if (query != NULL) { - old_query = query; - query = g_strconcat (query, " OR ", NULL); - g_free (old_query); - } else { - query = g_strdup ("("); - } - - old_query = query; - query = g_strdup_printf ("%s iid=='%s'", old_query, iid); - g_free (old_query); - } - - - if (query != NULL) { - old_query = query; - query = g_strconcat (old_query, ")", NULL); - g_free (old_query); - } else { - query = g_strdup ("false"); - } - - return query; -} - -static char * -make_bonobo_activation_query_with_known_mime_type (const char *mime_type, - const char *uri_scheme, - GList *explicit_iids, - const char *extra_requirements, - gboolean must_be_view) -{ - char *mime_supertype; - char *result; - char *explicit_iid_query; - const char *view_as_name_logic; - - mime_supertype = mime_type_get_supertype (mime_type); - - explicit_iid_query = make_bonobo_activation_query_for_explicit_content_view_iids (explicit_iids); - - if (must_be_view) { - view_as_name_logic = "nautilus:view_as_name.defined ()"; - } else { - view_as_name_logic = "true"; - } - - result = g_strdup_printf - ( - - - - /* Check that the component either has a specific - * MIME type or URI scheme. If neither is specified, - * then we don't trust that to mean "all MIME types - * and all schemes". For that, you have to do a - * wildcard for the MIME type or for the scheme. - */ - "(bonobo:supported_mime_types.defined ()" - "OR bonobo:supported_uri_schemes.defined ()" - "OR bonobo:additional_uri_schemes.defined ())" - - /* One of two possibilties */ - - /* FIXME bugzilla.gnome.org 42542: this comment is not very clear. */ - /* 1 The mime type and URI scheme match the supported - attributes. */ - - "AND (" - - /* Check that the supported MIME types include the - * URI's MIME type or its supertype. - */ - "((NOT bonobo:supported_mime_types.defined ()" - "OR bonobo:supported_mime_types.has ('%s')" - "OR bonobo:supported_mime_types.has ('%s')" - "OR bonobo:supported_mime_types.has ('*/*'))" - - /* Check that the supported URI schemes include the - * URI's scheme. - */ - "AND (NOT bonobo:supported_uri_schemes.defined ()" - "OR bonobo:supported_uri_schemes.has ('%s')" - "OR bonobo:supported_uri_schemes.has ('*')))" - - /* 2 OR The additional URI schemes include this URI's - scheme; if that is the case, this view applies - whether or not the mime type is supported. */ - - "OR (bonobo:additional_uri_schemes.has ('%s')" - "OR bonobo:additional_uri_schemes.has ('*')))" - - /* Check that the component makes it clear that it's - * intended for Nautilus by providing a "view_as" - * name. We could instead support a default, but - * that would make components that are untested with - * Nautilus appear. */ - "AND %s)" - - - /* Also select iids that were specifically requested - for this location, even if they do not otherwise - meet the requirements. */ - "OR %s)" - - /* Make it possible to add extra requirements */ - " AND (%s)" - - /* The MIME type, MIME supertype, and URI scheme for - * the %s above. - */ - , mime_type, mime_supertype, uri_scheme, uri_scheme, - - /* The explicit metafile iid query for the %s above. */ - view_as_name_logic, explicit_iid_query - - /* extra requirements */ - , extra_requirements != NULL ? extra_requirements : "true"); - - if (must_be_view) { - char *str; - - - /* Check if the component has the interfaces we need. - * We can work with either a Nautilus View, or - * with a Bonobo Control or Embeddable that supports - * one of the three persistence interfaces: - * PersistStream, ProgressiveDataSink, or - * PersistFile. - */ - str = g_strdup_printf ("(((repo_ids.has_all (['IDL:Bonobo/Control:1.0'," - "'IDL:Nautilus/View:1.0'])" - "OR (repo_ids.has_one (['IDL:Bonobo/Control:1.0'," - "'IDL:Bonobo/Embeddable:1.0'])" - "AND repo_ids.has_one (['IDL:Bonobo/PersistStream:1.0'," - "'IDL:Bonobo/ProgressiveDataSink:1.0'," - "'IDL:Bonobo/PersistFile:1.0']))) " - "AND %s", result); - g_free (result); - result = str; - } else { - char *str; - str = g_strdup_printf ("((%s", result); - g_free (result); - result = str; - } - - g_free (mime_supertype); - g_free (explicit_iid_query); - return result; -} - -static char * -make_bonobo_activation_query_with_uri_scheme_only (const char *uri_scheme, - GList *explicit_iids, - const char *extra_requirements, - gboolean must_be_view) -{ - char *result; - char *explicit_iid_query; - const char *view_as_name_logic; - - explicit_iid_query = make_bonobo_activation_query_for_explicit_content_view_iids (explicit_iids); - - if (must_be_view) { - view_as_name_logic = "nautilus:view_as_name.defined ()"; - } else { - view_as_name_logic = "true"; - } - - result = g_strdup_printf - ( - - /* Check if the component supports this particular - * URI scheme. - */ - "(((bonobo:supported_uri_schemes.has ('%s')" - "OR bonobo:supported_uri_schemes.has ('*'))" - - /* Check that the component doesn't require - * particular MIME types. Note that even saying you support "all" - */ - "AND (NOT bonobo:supported_mime_types.defined ()))" - - /* FIXME bugzilla.gnome.org 42542: improve the comment explaining this. */ - - /* This attribute allows uri schemes to be supported - even for unsupported mime types or no mime type. */ - "OR (bonobo:additional_uri_schemes.has ('%s')" - "OR bonobo:additional_uri_schemes.has ('*')))" - - /* Check that the component makes it clear that it's - * intended for Nautilus by providing a "view_as" - * name. We could instead support a default, but - * that would make components that are untested with - * Nautilus appear. */ - "AND %s)" - - /* Also select iids that were specifically requested - for this location, even if they do not otherwise - meet the requirements. */ - - "OR %s)" - - /* Make it possible to add extra requirements */ - " AND (%s)" - - /* The URI scheme for the %s above. */ - , uri_scheme, uri_scheme, view_as_name_logic - - /* The explicit metafile iid query for the %s above. */ - , explicit_iid_query, - extra_requirements != NULL ? extra_requirements : "true"); - - - if (must_be_view) { - char *str; - - - /* Check if the component has the interfaces we need. - * We can work with either a Nautilus View, or - * with a Bonobo Control or Embeddable that supports - * one of the three persistence interfaces: - * PersistStream, ProgressiveDataSink, or - * PersistFile. - */ - str = g_strdup_printf ("(((repo_ids.has_all (['IDL:Bonobo/Control:1.0'," - "'IDL:Nautilus/View:1.0'])" - "OR (repo_ids.has_one (['IDL:Bonobo/Control:1.0'," - "'IDL:Bonobo/Embeddable:1.0'])" - "AND repo_ids.has_one (['IDL:Bonobo/PersistStream:1.0'," - "'IDL:Bonobo/ProgressiveDataSink:1.0'," - "'IDL:Bonobo/PersistFile:1.0']))) " - "AND %s", result); - g_free (result); - result = str; - } else { - char *str; - str = g_strdup_printf ("((%s", result); - g_free (result); - result = str; - } - - - g_free (explicit_iid_query); - - return result; -} - - - -static GHashTable * -mime_type_list_to_hash_table (GList *types) -{ - GHashTable *result; - GList *p; - char *mime_type; - - result = g_hash_table_new (g_str_hash, g_str_equal); - - for (p = types; p != NULL; p = p->next) { - if (p->data != NULL) { - mime_type = (char *) (p->data); - - if (g_hash_table_lookup (result, mime_type) == NULL) { -#ifdef DEBUG_MJS - printf ("XXX content mime type: %s\n", mime_type); -#endif - g_hash_table_insert (result, g_strdup (mime_type), mime_type); - } - } - } - - return result; -} - -static void -free_key (gpointer key, - gpointer value, - gpointer user_data) -{ - g_free (key); -} - -static void -mime_type_hash_table_destroy (GHashTable *table) -{ - g_hash_table_foreach (table, free_key, NULL); - g_hash_table_destroy (table); -} - - - -static gboolean -server_has_content_requirements (Bonobo_ServerInfo *server) -{ - Bonobo_ActivationProperty *prop; - - prop = bonobo_server_info_prop_find (server, "nautilus:required_directory_content_mime_types"); - - if (prop == NULL || prop->v._d != Bonobo_ACTIVATION_P_STRINGV) { - return FALSE; - } else { - return TRUE; - } -} - -static gboolean -server_matches_content_requirements (Bonobo_ServerInfo *server, - GHashTable *type_table, - GList *explicit_iids) -{ - Bonobo_ActivationProperty *prop; - Bonobo_StringList types; - guint i; - - /* Components explicitly requested in the metafile are not capability tested. */ - if (g_list_find_custom (explicit_iids, (gpointer) server->iid, (GCompareFunc) strcmp) != NULL) { - return TRUE; - } - - if (!server_has_content_requirements (server)) { - return TRUE; - } else { - prop = bonobo_server_info_prop_find (server, "nautilus:required_directory_content_mime_types"); - - types = prop->v._u.value_stringv; - - for (i = 0; i < types._length; i++) { - if (g_hash_table_lookup (type_table, types._buffer[i]) != NULL) { - return TRUE; - } - } - } - - return FALSE; -} - - -/* FIXME: do we actually need this it would seem to me that the - * test_only attribute handles this - */ -static char *nautilus_sort_criteria[] = { - /* Prefer anything else over the loser view. */ - "iid != 'OAFIID:Nautilus_Content_Loser'", - /* Prefer anything else over the sample view. */ - "iid != 'OAFIID:Nautilus_Sample_Content_View'", - /* Sort alphabetically */ - "name", - NULL -}; - -static GList * -nautilus_do_component_query (const char *mime_type, - const char *uri_scheme, - GList *item_mime_types, - gboolean ignore_content_mime_types, - GList *explicit_iids, - char **extra_sort_criteria, - char *extra_requirements, - gboolean must_be_view) -{ - Bonobo_ServerInfoList *bonobo_activation_result; - char *query; - GList *retval; - char **all_sort_criteria; - CORBA_Environment ev; - - bonobo_activation_result = NULL; - query = NULL; - - if (is_known_mime_type (mime_type)) { - query = make_bonobo_activation_query_with_known_mime_type (mime_type, uri_scheme, explicit_iids, extra_requirements, must_be_view); - } else { - query = make_bonobo_activation_query_with_uri_scheme_only (uri_scheme, explicit_iids, extra_requirements, must_be_view); - } - - all_sort_criteria = strv_concat (extra_sort_criteria, nautilus_sort_criteria); - - CORBA_exception_init (&ev); - - bonobo_activation_result = bonobo_activation_query (query, all_sort_criteria, &ev); - - g_free (all_sort_criteria); - g_free (query); - - retval = NULL; - - if (ev._major == CORBA_NO_EXCEPTION && bonobo_activation_result != NULL && bonobo_activation_result->_length > 0) { - GHashTable *content_types; - guint i; - - content_types = mime_type_list_to_hash_table (item_mime_types); - - for (i = 0; i < bonobo_activation_result->_length; i++) { - Bonobo_ServerInfo *server; - - server = &bonobo_activation_result->_buffer[i]; - - if (ignore_content_mime_types || - server_matches_content_requirements (server, content_types, explicit_iids)) { - if (server->iid != NULL) { - retval = g_list_prepend - (retval, - Bonobo_ServerInfo_duplicate (server)); - } - } - } - - mime_type_hash_table_destroy (content_types); - } - - CORBA_free (bonobo_activation_result); - - CORBA_exception_free (&ev); - - return g_list_reverse (retval); -} - - -static GList * -str_list_difference (GList *a, - GList *b) -{ - GList *p; - GList *retval; - - retval = NULL; - - for (p = a; p != NULL; p = p->next) { - if (g_list_find_custom (b, p->data, (GCompareFunc) strcmp) == NULL) { - retval = g_list_prepend (retval, g_strdup (p->data)); - } - } - - retval = g_list_reverse (retval); - return retval; -} - - -static int -strv_length (char **a) -{ - int i; - - for (i = 0; a != NULL && a[i] != NULL; i++) { - } - - return i; -} - -static char ** -strv_concat (char **a, - char **b) -{ - int a_length; - int b_length; - int i; - int j; - - char **result; - - a_length = strv_length (a); - b_length = strv_length (b); - - result = g_new0 (char *, a_length + b_length + 1); - - j = 0; - - for (i = 0; a != NULL && a[i] != NULL; i++) { - result[j] = a[i]; - j++; - } - - for (i = 0; b != NULL && b[i] != NULL; i++) { - result[j] = b[i]; - j++; - } - - result[j] = NULL; - - return result; -} - static gboolean application_supports_uri_scheme (gpointer data, gpointer uri_scheme) diff --git a/libnautilus-private/nautilus-mime-actions.h b/libnautilus-private/nautilus-mime-actions.h index 81c16a040..75ec57b45 100644 --- a/libnautilus-private/nautilus-mime-actions.h +++ b/libnautilus-private/nautilus-mime-actions.h @@ -32,57 +32,15 @@ NautilusFileAttributes nautilus_mime_actions_get_minimum_file_attributes (void); NautilusFileAttributes nautilus_mime_actions_get_full_file_attributes (void); -gboolean nautilus_mime_actions_file_needs_full_file_attributes (NautilusFile *file); -GnomeVFSMimeActionType nautilus_mime_get_default_action_type_for_file (NautilusFile *file); -GnomeVFSMimeAction * nautilus_mime_get_default_action_for_file (NautilusFile *file); + GnomeVFSMimeApplication *nautilus_mime_get_default_application_for_file (NautilusFile *file); -gboolean nautilus_mime_is_default_application_for_file_user_chosen (NautilusFile *file); -Bonobo_ServerInfo * nautilus_mime_get_default_component_for_file (NautilusFile *file); -Bonobo_ServerInfo * nautilus_mime_get_default_fallback_component_for_file (NautilusFile *file); -gboolean nautilus_mime_is_default_component_for_file_user_chosen (NautilusFile *file); -GList * nautilus_mime_get_short_list_applications_for_file (NautilusFile *file); GList * nautilus_mime_get_open_with_applications_for_file (NautilusFile *file); -GList * nautilus_mime_get_short_list_components_for_file (NautilusFile *file); -GList * nautilus_mime_get_all_applications_for_file (NautilusFile *file); -GList * nautilus_mime_get_all_components_for_file (NautilusFile *file); -GList * nautilus_mime_get_all_components_for_file_extended (NautilusFile *file, char *extra_requirements); -GList * nautilus_mime_get_popup_components_for_file (NautilusFile *file); -GList * nautilus_mime_get_popup_components_for_files (GList *files); -GList * nautilus_mime_get_property_components_for_file (NautilusFile *file); -GList * nautilus_mime_get_property_components_for_files (GList *files); - gboolean nautilus_mime_has_any_components_for_file (NautilusFile *file); - gboolean nautilus_mime_has_any_components_for_file_extended (NautilusFile *file, char *extra_requirements); +GList * nautilus_mime_get_applications_for_file (NautilusFile *file); + + gboolean nautilus_mime_has_any_applications_for_file (NautilusFile *file); -gboolean nautilus_mime_has_any_applications_for_file_type (NautilusFile *file); -GnomeVFSResult nautilus_mime_set_default_action_type_for_file (NautilusFile *file, - GnomeVFSMimeActionType action_type); + GnomeVFSResult nautilus_mime_set_default_application_for_file (NautilusFile *file, const char *application_id); -GnomeVFSResult nautilus_mime_set_default_component_for_file (NautilusFile *file, - const char *component_iid); -/* Stored as delta to current user level */ -GnomeVFSResult nautilus_mime_set_short_list_applications_for_file (NautilusFile *file, - GList *components); -GnomeVFSResult nautilus_mime_add_application_to_short_list_for_file (NautilusFile *file, - const char *application_id); -GnomeVFSResult nautilus_mime_remove_application_from_short_list_for_file (NautilusFile *file, - const char *application_id); -GnomeVFSResult nautilus_mime_set_short_list_components_for_file (NautilusFile *file, - GList *components); -GnomeVFSResult nautilus_mime_add_component_to_short_list_for_file (NautilusFile *file, - const char *iid); -GnomeVFSResult nautilus_mime_remove_component_from_short_list_for_file (NautilusFile *file, - const char *iid); - -/* No way to override system list; can only add. */ -GnomeVFSResult nautilus_mime_extend_all_applications_for_file (NautilusFile *file, - GList *applications); -/* Only "user" entries may be removed. */ -GnomeVFSResult nautilus_mime_remove_from_all_applications_for_file (NautilusFile *file, - GList *applications); -gboolean nautilus_mime_has_any_components_for_uri_scheme (const char *uri_scheme); - - -/* No way to add to all components; oafinfo database assumed trusted in this regard. */ #endif /* NAUTILUS_MIME_ACTIONS_H */ diff --git a/libnautilus-private/nautilus-program-choosing.c b/libnautilus-private/nautilus-program-choosing.c index 29ea1f52f..d48ea7cdf 100644 --- a/libnautilus-private/nautilus-program-choosing.c +++ b/libnautilus-private/nautilus-program-choosing.c @@ -27,7 +27,6 @@ #include "nautilus-program-choosing.h" #include "nautilus-mime-actions.h" -#include "nautilus-program-chooser.h" #include "nautilus-global-preferences.h" #include "nautilus-icon-factory.h" #include @@ -63,22 +62,6 @@ #include #endif -typedef struct { - NautilusFile *file; - GtkWindow *parent_window; - NautilusApplicationChoiceCallback callback; - gpointer callback_data; -} ChooseApplicationCallbackData; - -typedef struct { - NautilusFile *file; - GtkWindow *parent_window; - NautilusComponentChoiceCallback callback; - gpointer callback_data; -} ChooseComponentCallbackData; - -static GHashTable *choose_application_hash_table, *choose_component_hash_table; - extern char **environ; /* Cut and paste from gdkspawn-x11.c */ @@ -119,429 +102,6 @@ my_gdk_spawn_make_environment_for_screen (GdkScreen *screen, } -static guint -choose_application_hash (gconstpointer p) -{ - const ChooseApplicationCallbackData *data; - - data = p; - return GPOINTER_TO_UINT (data->file) - ^ GPOINTER_TO_UINT (data->callback) - ^ GPOINTER_TO_UINT (data->callback_data); -} - -static gboolean -choose_application_equal (gconstpointer a, - gconstpointer b) -{ - const ChooseApplicationCallbackData *data_a, *data_b; - - data_a = a; - data_b = a; - return data_a->file == data_b->file - && data_a->callback == data_b->callback - && data_a->callback_data == data_b->callback_data; -} - -static void -choose_application_destroy (ChooseApplicationCallbackData *choose_data) -{ - nautilus_file_unref (choose_data->file); - if (choose_data->parent_window != NULL) { - g_object_unref (choose_data->parent_window); - } - g_free (choose_data); -} - -static guint -choose_component_hash (gconstpointer p) -{ - const ChooseApplicationCallbackData *data; - - data = p; - return GPOINTER_TO_UINT (data->file) - ^ GPOINTER_TO_UINT (data->callback) - ^ GPOINTER_TO_UINT (data->callback_data); -} - -static gboolean -choose_component_equal (gconstpointer a, - gconstpointer b) -{ - const ChooseApplicationCallbackData *data_a, *data_b; - - data_a = a; - data_b = a; - return data_a->file == data_b->file - && data_a->callback == data_b->callback - && data_a->callback_data == data_b->callback_data; -} - -static void -choose_component_destroy (ChooseComponentCallbackData *choose_data) -{ - nautilus_file_unref (choose_data->file); - if (choose_data->parent_window != NULL) { - g_object_unref (choose_data->parent_window); - } - g_free (choose_data); -} - -/** - * set_up_program_chooser: - * - * Create but don't yet run a program-choosing dialog. - * The caller should run the dialog and destroy it. - * - * @file: Which NautilusFile programs are being chosen for. - * @type: Which type of program is being chosen. - * @parent: Optional window to parent the dialog on. - * - * Return value: The program-choosing dialog, ready to be run. - */ -static GtkWidget * -set_up_program_chooser (NautilusFile *file, - GnomeVFSMimeActionType type, - GtkWindow *parent) -{ - GtkWidget *dialog; - - g_assert (NAUTILUS_IS_FILE (file)); - - dialog = nautilus_program_chooser_new (type, file); - if (parent != NULL) { - gtk_window_set_transient_for (GTK_WINDOW (dialog), parent); - } - - return dialog; -} - -/** - * nautilus_choose_component_for_file: - * - * Lets user choose a component with which to view a given file. - * - * @file: The NautilusFile to be viewed. - * @parent_window: If supplied, the component-choosing dialog is parented - * on this window. - * @callback: Callback called when choice has been made. - * @callback_data: Parameter passed back when callback is called. - */ - -static void -choose_component_callback (NautilusFile *file, - gpointer callback_data) -{ - ChooseComponentCallbackData *choose_data; - NautilusViewIdentifier *identifier; - GtkWidget *dialog; - - choose_data = callback_data; - - /* Remove from the hash table. */ - g_assert (g_hash_table_lookup (choose_component_hash_table, - choose_data) == choose_data); - g_hash_table_remove (choose_component_hash_table, - choose_data); - - /* The API uses a callback so we can do this non-modally in the future, - * but for now we just use a modal dialog. - */ - - identifier = NULL; - dialog = NULL; - if (nautilus_mime_has_any_components_for_file_extended (file, - "NOT nautilus:property_page_name.defined()")) { - dialog = set_up_program_chooser (file, GNOME_VFS_MIME_ACTION_TYPE_COMPONENT, - choose_data->parent_window); - if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { - identifier = nautilus_program_chooser_get_component (NAUTILUS_PROGRAM_CHOOSER (dialog)); - } - } else { - nautilus_program_chooser_show_no_choices_message (GNOME_VFS_MIME_ACTION_TYPE_COMPONENT, - file, - choose_data->parent_window); - } - - /* Call callback even if identifier is NULL, so caller can - * free callback_data if necessary and present some cancel UI - * if desired. - */ - (* choose_data->callback) (identifier, choose_data->callback_data); - - if (dialog != NULL) { - /* Destroy only after callback, since view identifier will - * be destroyed too. - */ - gtk_widget_destroy (GTK_WIDGET (dialog)); - } - - choose_component_destroy (choose_data); -} - -void -nautilus_choose_component_for_file (NautilusFile *file, - GtkWindow *parent_window, - NautilusComponentChoiceCallback callback, - gpointer callback_data) -{ - ChooseComponentCallbackData *choose_data; - NautilusFileAttributes attributes; - - g_return_if_fail (NAUTILUS_IS_FILE (file)); - g_return_if_fail (parent_window == NULL || GTK_IS_WINDOW (parent_window)); - g_return_if_fail (callback != NULL); - - /* Grab refs to the objects so they will still be around at - * callback time. - */ - nautilus_file_ref (file); - if (parent_window != NULL) { - g_object_ref (parent_window); - } - - /* Create data to pass through. */ - choose_data = g_new (ChooseComponentCallbackData, 1); - choose_data->file = file; - choose_data->parent_window = parent_window; - choose_data->callback = callback; - choose_data->callback_data = callback_data; - - /* Put pending entry into choose hash table. */ - if (choose_component_hash_table == NULL) { - choose_component_hash_table = eel_g_hash_table_new_free_at_exit - (choose_component_hash, - choose_component_equal, - "choose component"); - } - g_hash_table_insert (choose_component_hash_table, - choose_data, choose_data); - - /* Do the rest of the work when the attributes are ready. */ - attributes = nautilus_mime_actions_get_full_file_attributes (); - nautilus_file_call_when_ready (file, - attributes, - choose_component_callback, - choose_data); -} - -void -nautilus_cancel_choose_component_for_file (NautilusFile *file, - NautilusComponentChoiceCallback callback, - gpointer callback_data) -{ - ChooseComponentCallbackData search_criteria; - ChooseComponentCallbackData *choose_data; - - if (choose_component_hash_table == NULL) { - return; - } - - /* Search for an existing choose in progress. */ - search_criteria.file = file; - search_criteria.callback = callback; - search_criteria.callback_data = callback_data; - choose_data = g_hash_table_lookup (choose_component_hash_table, - &search_criteria); - if (choose_data == NULL) { - return; - } - - /* Stop it. */ - g_hash_table_remove (choose_component_hash_table, - choose_data); - nautilus_file_cancel_call_when_ready (file, - choose_component_callback, - choose_data); - choose_component_destroy (choose_data); -} - - -static void -dialog_response (GtkDialog *dialog, - int response_id, - ChooseApplicationCallbackData *choose_data) -{ - GnomeVFSMimeApplication *application; - - application = NULL; - - switch (response_id) { - case GTK_RESPONSE_OK: - application = nautilus_program_chooser_get_application (NAUTILUS_PROGRAM_CHOOSER (dialog)); - break; - - default: - break; - } - - (* choose_data->callback) (application, choose_data->callback_data); - - if (dialog != NULL) { - /* Destroy only after callback, since view identifier - * will be destroyed too. - */ - gtk_widget_destroy (GTK_WIDGET (dialog)); - } - - choose_application_destroy (choose_data); -} - -/** - * nautilus_choose_application_for_file: - * - * Lets user choose an application with which to open a given file. - * - * @file: The NautilusFile to be viewed. - * @parent_window: If supplied, the application-choosing dialog is parented - * on this window. - * @callback: Callback called when choice has been made. - * @callback_data: Parameter passed back when callback is called. - */ - -static void -choose_application_callback (NautilusFile *file, - gpointer callback_data) -{ - ChooseApplicationCallbackData *choose_data; - GtkWidget *dialog; - GnomeVFSMimeApplication *application; - - choose_data = callback_data; - - /* Remove from the hash table. */ - g_assert (g_hash_table_lookup (choose_application_hash_table, - choose_data) == choose_data); - g_hash_table_remove (choose_application_hash_table, - choose_data); - - /* The API uses a callback so we can do this non-modally in the future, - * but for now we just use a modal dialog. - */ - application = NULL; - dialog = NULL; - - if (nautilus_mime_has_any_applications_for_file_type (file)) { - dialog = set_up_program_chooser (file, GNOME_VFS_MIME_ACTION_TYPE_APPLICATION, - choose_data->parent_window); - g_signal_connect (G_OBJECT (dialog), "response", - G_CALLBACK (dialog_response), choose_data); - gtk_widget_show (dialog); - } else { - nautilus_program_chooser_show_no_choices_message (GNOME_VFS_MIME_ACTION_TYPE_APPLICATION, - file, - choose_data->parent_window); - - /* Call callback even if identifier is NULL, so caller can - * free callback_data if necessary and present some cancel - * UI if desired. - */ - (* choose_data->callback) (application, choose_data->callback_data); - - choose_application_destroy (choose_data); - } -} - -void -nautilus_choose_application_for_file (NautilusFile *file, - GtkWindow *parent_window, - NautilusApplicationChoiceCallback callback, - gpointer callback_data) -{ - ChooseApplicationCallbackData *choose_data; - NautilusFileAttributes attributes; - - g_return_if_fail (NAUTILUS_IS_FILE (file)); - g_return_if_fail (parent_window == NULL || GTK_IS_WINDOW (parent_window)); - g_return_if_fail (callback != NULL); - - /* Grab refs to the objects so they will still be around at - * callback time. - */ - nautilus_file_ref (file); - if (parent_window != NULL) { - g_object_ref (parent_window); - } - - /* Create data to pass through. */ - choose_data = g_new (ChooseApplicationCallbackData, 1); - choose_data->file = file; - choose_data->parent_window = parent_window; - choose_data->callback = callback; - choose_data->callback_data = callback_data; - - /* Put pending entry into choose hash table. */ - if (choose_application_hash_table == NULL) { - choose_application_hash_table = eel_g_hash_table_new_free_at_exit - (choose_application_hash, - choose_application_equal, - "choose application"); - } - g_hash_table_insert (choose_application_hash_table, - choose_data, choose_data); - - /* Do the rest of the work when the attributes are ready. */ - attributes = nautilus_mime_actions_get_full_file_attributes (); - nautilus_file_call_when_ready (file, - attributes, - choose_application_callback, - choose_data); -} - - -typedef struct { - NautilusFile *file; - GtkWindow *parent_window; -} LaunchParameters; - -static LaunchParameters * -launch_parameters_new (NautilusFile *file, - GtkWindow *parent_window) -{ - LaunchParameters *launch_parameters; - - launch_parameters = g_new0 (LaunchParameters, 1); - nautilus_file_ref (file); - launch_parameters->file = file; - g_object_ref (parent_window); - launch_parameters->parent_window = parent_window; - - return launch_parameters; -} - -static void -launch_parameters_free (LaunchParameters *launch_parameters) -{ - g_assert (launch_parameters != NULL); - - nautilus_file_unref (launch_parameters->file); - g_object_unref (launch_parameters->parent_window); - - g_free (launch_parameters); -} - -static void -launch_application_callback (GnomeVFSMimeApplication *application, - gpointer callback_data) -{ - LaunchParameters *launch_parameters; - - g_assert (callback_data != NULL); - - launch_parameters = (LaunchParameters *) callback_data; - - if (application != NULL) { - g_assert (NAUTILUS_IS_FILE (launch_parameters->file)); - - nautilus_launch_application (application, - launch_parameters->file, - launch_parameters->parent_window); - } - - launch_parameters_free (launch_parameters); - -} - /** * application_cannot_open_location * @@ -562,6 +122,7 @@ application_cannot_open_location (GnomeVFSMimeApplication *application, const char *uri_scheme, GtkWindow *parent_window) { +#if NEW_MIME_COMPLETE GtkDialog *message_dialog; LaunchParameters *launch_parameters; char *prompt; @@ -625,6 +186,7 @@ application_cannot_open_location (GnomeVFSMimeApplication *application, } g_free (file_name); +#endif } #ifdef HAVE_STARTUP_NOTIFICATION @@ -872,8 +434,7 @@ void nautilus_launch_show_file (NautilusFile *file, GtkWindow *parent_window) { GnomeVFSResult result; - GnomeVFSMimeAction *action; - GnomeVFSMimeActionType action_type; + GnomeVFSMimeApplication *application; GdkScreen *screen; char **envp; char *uri, *uri_scheme; @@ -889,6 +450,8 @@ void nautilus_launch_show_file (NautilusFile *file, startup_notify = FALSE; #endif + g_return_if_fail (!nautilus_file_needs_slow_mime_type (file)); + uri = NULL; if (nautilus_file_is_nautilus_link (file)) { uri = nautilus_file_get_activation_uri (file); @@ -898,10 +461,7 @@ void nautilus_launch_show_file (NautilusFile *file, uri = nautilus_file_get_uri (file); } - action = nautilus_mime_get_default_action_for_file (file); - - action_type = (action) ? action->action_type : - GNOME_VFS_MIME_ACTION_TYPE_NONE; + application = nautilus_mime_get_default_application_for_file (file); screen = gtk_window_get_screen (parent_window); envp = my_gdk_spawn_make_environment_for_screen (screen, NULL); @@ -912,10 +472,12 @@ void nautilus_launch_show_file (NautilusFile *file, sn_error_trap_pop); /* Only initiate notification if application supports it. */ - if (action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { - startup_notify = gnome_vfs_application_registry_get_bool_value (action->action.application->id, + if (application) { + startup_notify = gnome_vfs_application_registry_get_bool_value (application->id, GNOME_VFS_APPLICATION_REGISTRY_STARTUP_NOTIFY, NULL); + } else { + startup_notify = FALSE; } if (startup_notify == TRUE) { @@ -954,7 +516,7 @@ void nautilus_launch_show_file (NautilusFile *file, timestamp = slowly_and_stupidly_obtain_timestamp (sn_display); - binary_name = action->action.application->command; + binary_name = application->command; sn_launcher_context_set_binary_name (sn_context, binary_name); @@ -1016,9 +578,11 @@ void nautilus_launch_show_file (NautilusFile *file, case GNOME_VFS_ERROR_NO_DEFAULT: case GNOME_VFS_ERROR_NO_HANDLER: +#if NEW_MIME_COMPLETE nautilus_program_chooser_show_no_choices_message (action_type, file, parent_window); break; +#endif case GNOME_VFS_ERROR_LAUNCH: /* TODO: These strings suck pretty badly, but we're in string-freeze, @@ -1066,8 +630,11 @@ void nautilus_launch_show_file (NautilusFile *file, break; case GNOME_VFS_OK: default: +#if NEW_MIME_COMPLETE nautilus_program_chooser_show_invalid_message (action_type, file, parent_window); +#endif + break; } @@ -1082,80 +649,13 @@ void nautilus_launch_show_file (NautilusFile *file, g_free (uri_for_display); - if (action != NULL) - gnome_vfs_mime_action_free (action); + if (application != NULL) + gnome_vfs_mime_application_free (application); g_strfreev (envp); g_free (uri); } -/** - * nautilus_launch_action: - * - * Forks off a process to launch the action with a given file - * as a parameter. Provide parent window for error dialogs. - * - * @action: the action to launch - * @file: the file whose location should be passed as a parameter. - * @parent_window: window to use as parent for error dialogs. - */ -void nautilus_launch_action (GnomeVFSMimeAction *action, - NautilusFile *file, - GtkWindow *parent_window) -{ - GdkScreen *screen; - GnomeVFSResult result; - GList uris; - char *uri; - char **envp; - - switch (action->action_type) { - case GNOME_VFS_MIME_ACTION_TYPE_APPLICATION: - - nautilus_launch_application (action->action.application, file, parent_window); - - break; - - case GNOME_VFS_MIME_ACTION_TYPE_COMPONENT: - - 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.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); - - result = gnome_vfs_mime_action_launch_with_env (action, &uris, envp); - - switch (result) { - case GNOME_VFS_OK: - break; - - default: - nautilus_program_chooser_show_invalid_message - (action->action_type, file, parent_window); - } - - g_strfreev (envp); - g_free (uri); - - break; - - default: - nautilus_program_chooser_show_invalid_message - (action->action_type, file, parent_window); - } -} - /** * nautilus_launch_application: * @@ -1293,9 +793,11 @@ nautilus_launch_application (GnomeVFSMimeApplication *application, break; default: +#if NEW_MIME_COMPLETE nautilus_program_chooser_show_invalid_message (GNOME_VFS_MIME_ACTION_TYPE_APPLICATION, file, parent_window); +#endif break; } diff --git a/libnautilus-private/nautilus-program-choosing.h b/libnautilus-private/nautilus-program-choosing.h index 84ef475f4..5c3c0a1e1 100644 --- a/libnautilus-private/nautilus-program-choosing.h +++ b/libnautilus-private/nautilus-program-choosing.h @@ -39,23 +39,6 @@ typedef void (*NautilusApplicationChoiceCallback) (GnomeVFSMimeApplication *app typedef void (*NautilusComponentChoiceCallback) (NautilusViewIdentifier *identifier, gpointer callback_data); -void nautilus_choose_application_for_file (NautilusFile *file, - GtkWindow *parent_window, - NautilusApplicationChoiceCallback callback, - gpointer callback_data); -void nautilus_cancel_choose_application_for_file (NautilusFile *file, - NautilusComponentChoiceCallback callback, - gpointer callback_data); -void nautilus_choose_component_for_file (NautilusFile *file, - GtkWindow *parent_window, - NautilusComponentChoiceCallback callback, - gpointer callback_data); -void nautilus_cancel_choose_component_for_file (NautilusFile *file, - NautilusComponentChoiceCallback callback, - gpointer callback_data); -void nautilus_launch_action (GnomeVFSMimeAction *action, - NautilusFile *file, - GtkWindow *parent_window); void nautilus_launch_application (GnomeVFSMimeApplication *application, NautilusFile *file, GtkWindow *parent_window); diff --git a/src/file-manager/fm-bonobo-provider.c b/src/file-manager/fm-bonobo-provider.c index ecd56f94e..af55a8d52 100644 --- a/src/file-manager/fm-bonobo-provider.c +++ b/src/file-manager/fm-bonobo-provider.c @@ -53,6 +53,7 @@ #include #include #include +#include typedef struct { char *id; @@ -340,7 +341,7 @@ fm_bonobo_provider_get_file_items (NautilusMenuProvider *provider, GList *items; GList *l; - components = nautilus_mime_get_popup_components_for_files (selection); + components = nautilus_view_query_get_popup_components_for_files (selection); items = NULL; for (l = components; l; l = l->next) { @@ -511,7 +512,7 @@ fm_bonobo_provider_get_pages (NautilusPropertyPageProvider *provider, GList *pages; /* find all the property pages for this file */ - all_components = nautilus_mime_get_property_components_for_files + all_components = nautilus_view_query_get_property_components_for_files (files); /* filter out property pages that don't support multiple files */ diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index fd3a4c601..897d7023f 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -154,8 +155,10 @@ #define FM_DIRECTORY_VIEW_MENU_PATH_DELETE "/menu/Edit/Dangerous File Items Placeholder/Delete" #define FM_DIRECTORY_VIEW_MENU_PATH_EMPTY_TRASH "/menu/File/Global File Items Placeholder/Empty Trash" #define FM_DIRECTORY_VIEW_MENU_PATH_CREATE_LINK "/menu/Edit/File Items Placeholder/Create Link" -#define FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_PLACEHOLDER "/menu/File/Open Placeholder/Open With/Applications Placeholder" -#define FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION "/menu/File/Open Placeholder/Open With/OtherApplication" +#define FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER "/menu/File/Open Placeholder/Open With/Applications Placeholder" +#define FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_PLACEHOLDER "/menu/File/Open Placeholder/Applications Placeholder" +#define FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION_PLACEHOLDER "/menu/File/Open Placeholder/OtherApplicationPlaceholder" +#define FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION "/menu/File/Open Placeholder/OtherApplicationPlaceholder/OtherApplication" #define FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_PLACEHOLDER "/menu/File/Open Placeholder/Scripts/Scripts Placeholder" #define FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_SEPARATOR "/menu/File/Open Placeholder/Scripts/After Scripts" #define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_PLACEHOLDER "/menu/File/New Items Placeholder/New Documents/New Documents Placeholder" @@ -176,7 +179,12 @@ #define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_PLACEHOLDER "/popups/background/Before Zoom Items/New Documents/New Documents Placeholder" #define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_SEPARATOR "/popups/background/Before Zoom Items/New Documents/After New Documents" -#define FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER "/popups/selection/Open Placeholder/Open With/Applications Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER "/popups/selection/Open Placeholder/Open With/Applications Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER "/popups/selection/Open Placeholder/Applications Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_PLACEHOLDER "/popups/selection/Open Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_OTHER_APPLICATION_PLACEHOLDER "/popups/selection/Open Placeholder/OtherApplicationPlaceholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_OTHER_APPLICATION "/popups/selection/Open Placeholder/OtherApplicationPlaceholder/OtherApplication" + #define FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_PLACEHOLDER "/popups/selection/Open Placeholder/Scripts/Scripts Placeholder" #define FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_SEPARATOR "/popups/selection/Open Placeholder/Scripts/After Scripts" #define FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_WITH "/popups/selection/Open Placeholder/Open With" @@ -273,10 +281,14 @@ struct FMDirectoryViewDetails }; typedef enum { + ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE, + ACTIVATION_ACTION_LAUNCH_APPLICATION_FROM_COMMAND, + ACTIVATION_ACTION_ASK, ACTIVATION_ACTION_LAUNCH, ACTIVATION_ACTION_LAUNCH_IN_TERMINAL, - ACTIVATION_ACTION_DISPLAY, - ACTIVATION_ACTION_DO_NOTHING + ACTIVATION_ACTION_OPEN_IN_VIEW, + ACTIVATION_ACTION_OPEN_IN_APPLICATION, + ACTIVATION_ACTION_DO_NOTHING, } ActivationAction; typedef struct { @@ -396,12 +408,6 @@ typedef struct { FMDirectoryView *directory_view; } ApplicationLaunchParameters; -typedef struct { - NautilusViewIdentifier *identifier; - char *uri; - FMDirectoryView *directory_view; -} ViewerLaunchParameters; - typedef struct { NautilusFile *file; FMDirectoryView *directory_view; @@ -439,30 +445,6 @@ application_launch_parameters_free (ApplicationLaunchParameters *parameters) g_free (parameters); } -static ViewerLaunchParameters * -viewer_launch_parameters_new (NautilusViewIdentifier *identifier, - const char *uri, - FMDirectoryView *directory_view) -{ - ViewerLaunchParameters *result; - - result = g_new0 (ViewerLaunchParameters, 1); - result->identifier = nautilus_view_identifier_copy (identifier); - g_object_ref (directory_view); - result->directory_view = directory_view; - result->uri = g_strdup (uri); - - return result; -} - -static void -viewer_launch_parameters_free (ViewerLaunchParameters *parameters) -{ - nautilus_view_identifier_free (parameters->identifier); - g_object_unref (parameters->directory_view); - g_free (parameters->uri); - g_free (parameters); -} static ScriptLaunchParameters * script_launch_parameters_new (NautilusFile *file, @@ -665,6 +647,7 @@ fm_directory_view_launch_application (GnomeVFSMimeApplication *application, g_free (uri); } +#if NEW_MIME_COMPLETE static void fm_directory_view_chose_application_callback (GnomeVFSMimeApplication *application, gpointer callback_data) @@ -685,6 +668,7 @@ fm_directory_view_chose_application_callback (GnomeVFSMimeApplication *applicati application_launch_parameters_free (launch_parameters); } +#endif static void open_location (FMDirectoryView *directory_view, @@ -713,98 +697,67 @@ open_location (FMDirectoryView *directory_view, } static void -switch_location_and_view (NautilusViewIdentifier *identifier, - const char *new_uri, - FMDirectoryView *directory_view) +application_selected_cb (EelOpenWithDialog *dialog, + GnomeVFSMimeApplication *app, + gpointer user_data) { + FMDirectoryView *view; NautilusFile *file; - g_assert (FM_IS_DIRECTORY_VIEW (directory_view)); - g_assert (identifier != NULL); - g_assert (new_uri != NULL); + view = FM_DIRECTORY_VIEW (user_data); + + file = g_object_get_data (G_OBJECT (dialog), "directory-view:file"); - /* User has explicitly chosen a viewer other than the default, so - * make it the default and then switch locations. - */ - /* FIXME bugzilla.gnome.org 41053: We might want an atomic operation - * for switching location and viewer together, so we don't have to - * rely on metadata for holding the default location. - */ - file = nautilus_file_get (new_uri); - nautilus_mime_set_default_component_for_file (file, identifier->iid); - nautilus_file_unref (file); - - open_location (directory_view, new_uri, Nautilus_ViewFrame_OPEN_ACCORDING_TO_MODE, 0); -} - -static void -fm_directory_view_chose_component_callback (NautilusViewIdentifier *identifier, - gpointer callback_data) -{ - ViewerLaunchParameters *launch_parameters; - - g_assert (callback_data != NULL); - - launch_parameters = (ViewerLaunchParameters *)callback_data; - g_assert (launch_parameters->identifier == NULL); - - if (identifier != NULL) { - switch_location_and_view (identifier, /* NOT the (empty) identifier in launch_parameters */ - launch_parameters->uri, - launch_parameters->directory_view); - } - - viewer_launch_parameters_free (launch_parameters); + fm_directory_view_launch_application (app, file, view); } static void choose_program (FMDirectoryView *view, - NautilusFile *file, - GnomeVFSMimeActionType type) + NautilusFile *file) { + GtkWidget *dialog; char *uri; + char *mime_type; g_assert (FM_IS_DIRECTORY_VIEW (view)); g_assert (NAUTILUS_IS_FILE (file)); - g_assert (type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT || - type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); nautilus_file_ref (file); uri = nautilus_file_get_uri (file); + mime_type = nautilus_file_get_mime_type (file); - if (type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT) { - nautilus_choose_component_for_file - (file, - fm_directory_view_get_containing_window (view), - fm_directory_view_chose_component_callback, - viewer_launch_parameters_new - (NULL, uri, view)); - } else { - nautilus_choose_application_for_file - (file, - fm_directory_view_get_containing_window (view), - fm_directory_view_chose_application_callback, - application_launch_parameters_new - (NULL, file, view)); - } + dialog = eel_open_with_dialog_new (uri, mime_type); + g_object_set_data_full (G_OBJECT (dialog), + "directory-view:file", + g_object_ref (file), + (GDestroyNotify)g_object_unref); + + gtk_window_set_screen (GTK_WINDOW (dialog), + gtk_widget_get_screen (GTK_WIDGET (view))); + gtk_widget_show (dialog); - g_free (uri); + g_signal_connect_object (dialog, + "application_selected", + G_CALLBACK (application_selected_cb), + view, + 0); + + g_free (uri); + g_free (mime_type); nautilus_file_unref (file); } static void -open_with_other_program (FMDirectoryView *view, GnomeVFSMimeActionType action_type) +open_with_other_program (FMDirectoryView *view) { GList *selection; g_assert (FM_IS_DIRECTORY_VIEW (view)); - g_assert (action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION || - action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT); selection = fm_directory_view_get_selection (view); if (selection_contains_one_item_in_menu_callback (view, selection)) { - choose_program (view, NAUTILUS_FILE (selection->data), action_type); + choose_program (view, NAUTILUS_FILE (selection->data)); } nautilus_file_list_free (selection); @@ -815,8 +768,7 @@ other_application_callback (BonoboUIComponent *component, gpointer callback_data { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); - open_with_other_program (FM_DIRECTORY_VIEW (callback_data), - GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); + open_with_other_program (FM_DIRECTORY_VIEW (callback_data)); } static void @@ -3720,48 +3672,186 @@ static void add_application_to_bonobo_menu (FMDirectoryView *directory_view, GnomeVFSMimeApplication *application, NautilusFile *file, - int index) + int index, + const char *menu_placeholder, + const char *popup_placeholder) { ApplicationLaunchParameters *launch_parameters; char *tip; + char *label; launch_parameters = application_launch_parameters_new (application, file, directory_view); + label = g_strdup_printf (_("Open with \"%s\""), application->name); tip = g_strdup_printf (_("Use \"%s\" to open the selected item"), application->name); add_numbered_menu_item (directory_view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_PLACEHOLDER, - application->name, + menu_placeholder, + label, tip, index, NULL, bonobo_launch_application_callback, launch_parameters, (GDestroyNotify) application_launch_parameters_free); + + /* Use same launch parameters and no DestroyNotify for popup item, which has same * lifetime as the item in the File menu in the menu bar. */ add_numbered_menu_item (directory_view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER, - application->name, + popup_placeholder, + label, tip, index, NULL, bonobo_launch_application_callback, launch_parameters, NULL); + g_free (label); g_free (tip); } + +static ActivationAction +get_default_executable_text_file_action (void) +{ + int preferences_value; + + preferences_value = eel_preferences_get_enum + (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_executable_text_file_action (FMDirectoryView *view, 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 = eel_preferences_get_enum + (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 or Display?"), + _("Run in _Terminal"), RESPONSE_RUN_IN_TERMINAL, + _("_Display"), RESPONSE_DISPLAY, + fm_directory_view_get_containing_window (view)); + gtk_dialog_add_button (dialog, GTK_STOCK_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_object_destroy (GTK_OBJECT (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 gboolean +can_use_component_for_file (NautilusFile *file) +{ + return (nautilus_file_is_directory (file) || + NAUTILUS_IS_DESKTOP_ICON_FILE (file)); +} + +static ActivationAction +get_activation_action (NautilusFile *file) +{ + ActivationAction action; + char *activation_uri; + + 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 (eel_str_has_prefix (activation_uri, NAUTILUS_DESKTOP_COMMAND_SPECIFIER)) { + action = ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE; + } else if (eel_str_has_prefix (activation_uri, NAUTILUS_COMMAND_SPECIFIER)) { + action = ACTIVATION_ACTION_LAUNCH_APPLICATION_FROM_COMMAND; + } else if (file_is_launchable (file)) { + char *executable_path; + + action = ACTIVATION_ACTION_LAUNCH; + + executable_path = gnome_vfs_get_local_path_from_uri (activation_uri); + 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 (can_use_component_for_file (file)) { + action = ACTIVATION_ACTION_OPEN_IN_VIEW; + } else { + action = ACTIVATION_ACTION_OPEN_IN_APPLICATION; + } + } + return action; +} + static void reset_bonobo_open_with_menu (FMDirectoryView *view, GList *selection) { GList *applications, *node; NautilusFile *file; - gboolean sensitive; - gboolean any_applications; - gboolean any_viewers; + gboolean submenu_visible; char *uri; + int num_applications; int index; /* Clear any previous inserted items in the applications and viewers placeholders */ @@ -3769,43 +3859,87 @@ reset_bonobo_open_with_menu (FMDirectoryView *view, GList *selection) (view->details->ui, FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_PLACEHOLDER); nautilus_bonobo_remove_menu_items_and_commands (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER); + nautilus_bonobo_remove_menu_items_and_commands + (view->details->ui, FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER); + nautilus_bonobo_remove_menu_items_and_commands + (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER); + num_applications = 0; + /* This menu is only displayed when there's one selected item. */ if (!eel_g_list_exactly_one_item (selection)) { - sensitive = FALSE; - } else { - sensitive = TRUE; - any_applications = FALSE; - any_viewers = FALSE; + submenu_visible = FALSE; + } else { + GnomeVFSMimeApplication *default_app; + ActivationAction action; file = NAUTILUS_FILE (selection->data); uri = nautilus_file_get_uri (file); - + + action = get_activation_action (file); + if (action == ACTIVATION_ACTION_OPEN_IN_APPLICATION) { + default_app = nautilus_mime_get_default_application_for_file (file); + } else { + default_app = NULL; + } + applications = nautilus_mime_get_open_with_applications_for_file (NAUTILUS_FILE (selection->data)); + + num_applications = g_list_length (applications); + + + for (node = applications, index = 0; node != NULL; node = node->next, index++) { - any_applications = TRUE; - add_application_to_bonobo_menu (view, node->data, file, index); + GnomeVFSMimeApplication *application; + char *menu_path; + char *popup_path; + + application = node->data; + + if (default_app && !strcmp (default_app->id, application->id)) { + continue; + } + + if (num_applications > 3) { + menu_path = FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER; + popup_path = FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER; + } else { + menu_path = FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_PLACEHOLDER; + popup_path = FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER; + } + + add_application_to_bonobo_menu (view, + node->data, + file, + index, + menu_path,popup_path); } gnome_vfs_mime_application_list_free (applications); - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_OTHER_APPLICATION, - any_applications ? _("Other _Application...") : _("An _Application...")); - g_free (uri); + + submenu_visible = (num_applications > 3); } - /* It's OK to set the sensitivity of the menu items (rather than the verbs) + /* It's OK to set the visibility of the menu items (rather than the verbs) * here because these are submenu titles, not items with verbs. */ - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_OPEN_WITH, - sensitive); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_WITH, - sensitive); + nautilus_bonobo_set_hidden (view->details->ui, + FM_DIRECTORY_VIEW_MENU_PATH_OPEN_WITH, + !submenu_visible); + nautilus_bonobo_set_hidden (view->details->ui, + FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_WITH, + !submenu_visible); + + + nautilus_bonobo_set_hidden (view->details->ui, + FM_DIRECTORY_VIEW_POPUP_PATH_OTHER_APPLICATION_PLACEHOLDER, + submenu_visible); + + nautilus_bonobo_set_hidden (view->details->ui, + FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION_PLACEHOLDER, + submenu_visible); } static GList * @@ -5727,6 +5861,8 @@ real_update_menus (FMDirectoryView *view) gboolean show_separate_delete_command; gboolean vfolder_directory; gboolean show_open_alternate; + gboolean can_open; + ActivationAction action; EelBackground *background; if (view->details->ui == NULL) { @@ -5766,6 +5902,39 @@ real_update_menus (FMDirectoryView *view) FM_DIRECTORY_VIEW_COMMAND_OPEN, selection_count != 0); + label_with_underscore = NULL; + can_open = TRUE; + if (selection_count == 1) { + NautilusFile *file; + + file = NAUTILUS_FILE (selection->data); + + action = get_activation_action (file); + + if (action == ACTIVATION_ACTION_OPEN_IN_APPLICATION) { + GnomeVFSMimeApplication *app; + + app = nautilus_mime_get_default_application_for_file (file); + if (app) { + label_with_underscore = g_strdup_printf (_("_Open with \"%s\""), + app->name); + gnome_vfs_mime_application_free (app); + } else { + can_open = FALSE; + } + } + } + + nautilus_bonobo_set_label + (view->details->ui, + FM_DIRECTORY_VIEW_COMMAND_OPEN, + label_with_underscore ? label_with_underscore : _("_Open")); + nautilus_bonobo_set_hidden + (view->details->ui, + FM_DIRECTORY_VIEW_COMMAND_OPEN, + !can_open); + g_free (label_with_underscore); + if (nautilus_view_get_window_type (view->details->nautilus_view) == Nautilus_WINDOW_NAVIGATION) { show_open_alternate = TRUE; label_with_underscore = g_strdup_printf (ngettext("Open in New Window", @@ -6100,6 +6269,12 @@ fm_directory_view_notify_selection_changed (FMDirectoryView *view) NULL, NULL); } + + nautilus_file_call_when_ready + (file, + NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI, + NULL, + NULL); } nautilus_file_list_free (selection); } @@ -6118,7 +6293,8 @@ file_is_launchable (NautilusFile *file) return type_can_be_executable && nautilus_file_can_get_permissions (file) && nautilus_file_can_execute (file) - && nautilus_file_is_executable (file); + && nautilus_file_is_executable (file) + && !nautilus_file_is_directory (file); } static void @@ -6171,80 +6347,6 @@ report_broken_symbolic_link (FMDirectoryView *view, NautilusFile *file) g_free (detail); } -static ActivationAction -get_executable_text_file_action (FMDirectoryView *view, 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 = eel_preferences_get_enum - (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_DISPLAY; - 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 or Display?"), - _("Run in _Terminal"), RESPONSE_RUN_IN_TERMINAL, - _("_Display"), RESPONSE_DISPLAY, - fm_directory_view_get_containing_window (view)); - gtk_dialog_add_button (dialog, GTK_STOCK_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_object_destroy (GTK_OBJECT (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_DISPLAY; - default: - return ACTIVATION_ACTION_DO_NOTHING; - } -} - -static gboolean -can_use_component_for_file (FMDirectoryView *view, - NautilusFile *file) -{ - return (nautilus_file_is_directory (file) || - NAUTILUS_IS_DESKTOP_ICON_FILE (file) || - nautilus_view_get_window_type (view->details->nautilus_view) == Nautilus_WINDOW_NAVIGATION); -} - static void activate_weak_notify (gpointer user_data, GObject *object) @@ -6262,6 +6364,7 @@ stop_activate (ActivateParameters *parameters) parameters); } + static void activate_callback (NautilusFile *file, gpointer callback_data) { @@ -6270,7 +6373,6 @@ activate_callback (NautilusFile *file, gpointer callback_data) char *orig_uri, *uri, *file_uri; char *executable_path, *quoted_path, *name; char *old_working_dir; - GnomeVFSMimeActionType action_type; ActivationAction action; GdkScreen *screen; @@ -6289,82 +6391,73 @@ activate_callback (NautilusFile *file, gpointer callback_data) orig_uri = uri = nautilus_file_get_activation_uri (file); - action = ACTIVATION_ACTION_DISPLAY; + action = get_activation_action (file); screen = gtk_widget_get_screen (GTK_WIDGET (view)); - if (eel_str_has_prefix (uri, NAUTILUS_DESKTOP_COMMAND_SPECIFIER)) { + if (action == ACTIVATION_ACTION_ASK) { + /* Special case for executable text files, since it might be + * dangerous & unexpected to launch these. + */ + action = get_executable_text_file_action (view, file); + } + + switch (action) { + case ACTIVATION_ACTION_LAUNCH_DESKTOP_FILE : file_uri = nautilus_file_get_uri (file); nautilus_launch_desktop_file ( screen, file_uri, NULL, fm_directory_view_get_containing_window (view)); g_free (file_uri); - action = ACTIVATION_ACTION_DO_NOTHING; - } else if (eel_str_has_prefix (uri, NAUTILUS_COMMAND_SPECIFIER)) { + break; + case ACTIVATION_ACTION_LAUNCH_APPLICATION_FROM_COMMAND : uri += strlen (NAUTILUS_COMMAND_SPECIFIER); nautilus_launch_application_from_command (screen, NULL, uri, NULL, FALSE); - action = ACTIVATION_ACTION_DO_NOTHING; - } - - if (action != ACTIVATION_ACTION_DO_NOTHING && file_is_launchable (file)) { - + break; + case ACTIVATION_ACTION_LAUNCH : + case ACTIVATION_ACTION_LAUNCH_IN_TERMINAL : old_working_dir = change_to_view_directory (view); - /* Launch executables to activate them. */ - action = ACTIVATION_ACTION_LAUNCH; - executable_path = gnome_vfs_get_local_path_from_uri (uri); - - /* Non-local executables don't get launched. They act like non-executables. */ - if (executable_path == NULL) { - action = ACTIVATION_ACTION_DISPLAY; - } else if (nautilus_file_contains_text (file)) { - /* Special case for executable text files, since it might be - * dangerous & unexpected to launch these. - */ - action = get_executable_text_file_action (view, file); - } - - if (action == ACTIVATION_ACTION_LAUNCH || - action == ACTIVATION_ACTION_LAUNCH_IN_TERMINAL) { - quoted_path = g_shell_quote (executable_path); - name = nautilus_file_get_name (file); - nautilus_launch_application_from_command - (screen, name, quoted_path, NULL, - (action == ACTIVATION_ACTION_LAUNCH_IN_TERMINAL) /* use terminal */ ); - g_free (name); - g_free (quoted_path); - } + quoted_path = g_shell_quote (executable_path); + name = nautilus_file_get_name (file); + nautilus_launch_application_from_command + (screen, name, quoted_path, NULL, + (action == ACTIVATION_ACTION_LAUNCH_IN_TERMINAL) /* use terminal */ ); + g_free (name); + g_free (quoted_path); chdir (old_working_dir); g_free (old_working_dir); g_free (executable_path); - } - - if (action == ACTIVATION_ACTION_DISPLAY) { - action_type = nautilus_mime_get_default_action_type_for_file (file); - if (action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT && - nautilus_mime_has_any_components_for_file (file) && - can_use_component_for_file (view, file)) { - open_location (view, uri, parameters->mode, parameters->flags); - } else { - nautilus_launch_show_file - (file, fm_directory_view_get_containing_window (view)); - - if ((parameters->flags & Nautilus_ViewFrame_OPEN_FLAG_CLOSE_BEHIND) != 0) { - if (nautilus_view_get_window_type (view->details->nautilus_view) == Nautilus_WINDOW_SPATIAL) { - nautilus_view_close_window (view->details->nautilus_view); - } - } - - /* We should not add trash and directory uris.*/ - if ((!nautilus_file_is_in_trash (file)) && - (!nautilus_file_is_directory (file))) { - file_uri = nautilus_file_get_uri (file); - egg_recent_model_add (nautilus_recent_get_model (), file_uri); - g_free (file_uri); + + break; + case ACTIVATION_ACTION_OPEN_IN_VIEW : + open_location (view, uri, parameters->mode, parameters->flags); + break; + case ACTIVATION_ACTION_OPEN_IN_APPLICATION : + nautilus_launch_show_file + (file, fm_directory_view_get_containing_window (view)); + + if ((parameters->flags & Nautilus_ViewFrame_OPEN_FLAG_CLOSE_BEHIND) != 0) { + if (nautilus_view_get_window_type (view->details->nautilus_view) == Nautilus_WINDOW_SPATIAL) { + nautilus_view_close_window (view->details->nautilus_view); } } + + /* We should not add trash and directory uris.*/ + if ((!nautilus_file_is_in_trash (file)) && + (!nautilus_file_is_directory (file))) { + file_uri = nautilus_file_get_uri (file); + egg_recent_model_add (nautilus_recent_get_model (), file_uri); + g_free (file_uri); + } + break; + case ACTIVATION_ACTION_DO_NOTHING : + break; + case ACTIVATION_ACTION_ASK : + g_assert_not_reached (); + break; } nautilus_file_unref (file); diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c index b1031f17b..b05c26473 100644 --- a/src/file-manager/fm-properties-window.c +++ b/src/file-manager/fm-properties-window.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -3264,6 +3265,33 @@ file_changed_callback (NautilusFile *file, gpointer user_data) } } +static gboolean +should_show_open_with (FMPropertiesWindow *window) +{ + return !is_multi_file_window (window); +} + +static void +create_open_with_page (FMPropertiesWindow *window) +{ + GtkWidget *vbox; + char *uri; + char *mime_type; + + uri = nautilus_file_get_uri (get_target_file (window)); + mime_type = nautilus_file_get_mime_type (get_target_file (window)); + + vbox = eel_mime_application_chooser_new (uri, mime_type); + gtk_widget_show (vbox); + + g_free (uri); + g_free (mime_type); + + gtk_notebook_append_page (window->details->notebook, + vbox, gtk_label_new (_("Open With"))); +} + + static FMPropertiesWindow * create_properties_window (StartupData *startup_data) { @@ -3362,6 +3390,10 @@ create_properties_window (StartupData *startup_data) create_permissions_page (window); } + if (should_show_open_with (window)) { + create_open_with_page (window); + } + /* append pages from available views */ append_extension_pages (window); diff --git a/src/file-manager/nautilus-directory-view-ui.xml b/src/file-manager/nautilus-directory-view-ui.xml index 81dd76f0b..27555ee02 100644 --- a/src/file-manager/nautilus-directory-view-ui.xml +++ b/src/file-manager/nautilus-directory-view-ui.xml @@ -37,7 +37,7 @@ _label="_Open Scripts Folder" _tip="Show the folder containing the scripts that appear in this menu"/> + + + + + + + + + + #include #include +#include #include struct NautilusDetermineViewHandle { @@ -111,9 +112,9 @@ got_file_info_callback (NautilusFile *file, || vfs_result_code == GNOME_VFS_ERROR_NOT_SUPPORTED || vfs_result_code == GNOME_VFS_ERROR_INVALID_URI) { if (handle->fallback) { - default_component = nautilus_mime_get_default_fallback_component_for_file (handle->file); + default_component = nautilus_view_query_get_fallback_component_for_file (handle->file); } else { - default_component = nautilus_mime_get_default_component_for_file (handle->file); + default_component = nautilus_view_query_get_default_component_for_file (handle->file); } if (default_component != NULL) { default_id = nautilus_view_identifier_new_from_content_view (default_component); @@ -126,7 +127,7 @@ got_file_info_callback (NautilusFile *file, if (vfs_result_code == GNOME_VFS_OK && default_id == NULL) { /* If the complete list is non-empty, the default shouldn't have been NULL */ - g_assert (!nautilus_mime_has_any_components_for_file (handle->file)); + g_assert (!nautilus_view_query_has_any_components_for_file (handle->file)); result_code = NAUTILUS_DETERMINE_VIEW_NO_HANDLER_FOR_TYPE; } else { result_code = get_view_result_from_gnome_vfs_result (vfs_result_code); diff --git a/src/nautilus-information-panel.c b/src/nautilus-information-panel.c index 5fadaa6d6..da68ba52b 100644 --- a/src/nautilus-information-panel.c +++ b/src/nautilus-information-panel.c @@ -831,6 +831,7 @@ metadata_button_callback (GtkWidget *button, const char *command_str) information_panel = NAUTILUS_INFORMATION_PANEL (g_object_get_data (G_OBJECT (button), "user_data")); } +#if NEW_MIME_COMPLETE static void nautilus_information_panel_chose_application_callback (GnomeVFSMimeApplication *application, gpointer callback_data) @@ -846,10 +847,12 @@ nautilus_information_panel_chose_application_callback (GnomeVFSMimeApplication * nautilus_information_panel_get_window (information_panel)); } } +#endif static void open_with_callback (GtkWidget *button, gpointer ignored) { +#if NEW_MIME_COMPLETE NautilusInformationPanel *information_panel; information_panel = NAUTILUS_INFORMATION_PANEL (g_object_get_data (G_OBJECT (button), "user_data")); @@ -861,6 +864,7 @@ open_with_callback (GtkWidget *button, gpointer ignored) GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (information_panel))), nautilus_information_panel_chose_application_callback, information_panel); +#endif } /* utility routine that allocates the command buttons from the command list */ @@ -1069,7 +1073,7 @@ nautilus_information_panel_update_buttons (NautilusInformationPanel *information if (nautilus_mime_has_any_applications_for_file (information_panel->details->file)) { short_application_list = - nautilus_mime_get_short_list_applications_for_file (information_panel->details->file); + nautilus_mime_get_applications_for_file (information_panel->details->file); add_command_buttons (information_panel, short_application_list); gnome_vfs_mime_application_list_free (short_application_list); } diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index 8db7664a2..c7246c784 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -619,41 +619,6 @@ create_view_as_menu_item (NautilusWindow *window, return menu_item; } -static GtkWidget * -new_gtk_separator (void) -{ - GtkWidget *result; - - result = gtk_menu_item_new (); - gtk_widget_show (result); - gtk_widget_set_sensitive (result, FALSE); - - return result; -} - -static void -view_as_menu_choose_view_callback (GtkWidget *widget, gpointer data) -{ - NautilusWindow *window; - - g_assert (GTK_IS_MENU_ITEM (widget)); - g_assert (NAUTILUS_IS_WINDOW (data)); - - window = NAUTILUS_WINDOW (data); - - /* Set the option menu back to its previous setting (Don't - * leave it on this dialog-producing "View as..." - * setting). If the menu choice causes a content view change, - * this will be updated again later, in - * nautilus_window_load_view_as_menus. Do this right away so - * the user never sees the option menu set to "View as - * Other...". - */ - load_view_as_menu (window); - - nautilus_window_show_view_as_dialog (window); -} - static void load_view_as_menu (NautilusWindow *window) { @@ -692,18 +657,6 @@ load_view_as_menu (NautilusWindow *window) selected_index = index; } - /* Add/Show separator before "View as..." if there are any other viewers in menu. */ - if (window->details->short_list_viewers != NULL) { - gtk_menu_shell_append (GTK_MENU_SHELL (new_menu), new_gtk_separator ()); - } - - /* Add "View as..." extra bonus choice. */ - menu_item = gtk_menu_item_new_with_label (_("View as...")); - g_signal_connect_object (menu_item, "activate", - G_CALLBACK (view_as_menu_choose_view_callback), window, 0); - gtk_widget_show (menu_item); - gtk_menu_shell_append (GTK_MENU_SHELL (new_menu), menu_item); - /* We create and attach a new menu here because adding/removing * items from existing menu screws up the size of the option menu. */ diff --git a/src/nautilus-shell-ui.xml b/src/nautilus-shell-ui.xml index 9922dbc40..059f9a78c 100644 --- a/src/nautilus-shell-ui.xml +++ b/src/nautilus-shell-ui.xml @@ -34,8 +34,6 @@ _tip="Show the contents in less detail"/> - @@ -166,8 +164,6 @@ - - diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c index 5decef6b6..cda503480 100644 --- a/src/nautilus-window-manage-views.c +++ b/src/nautilus-window-manage-views.c @@ -65,6 +65,7 @@ #include #include #include +#include /* FIXME bugzilla.gnome.org 41243: * We should use inheritance instead of these special cases @@ -1628,7 +1629,7 @@ nautilus_window_set_content_view (NautilusWindow *window, end_location_change (window); file = nautilus_file_get (window->details->location); - nautilus_mime_set_default_component_for_file + nautilus_view_query_set_default_component_for_file (file, id->iid); nautilus_file_unref (file); diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c index 90e6c3c62..721fe8c82 100644 --- a/src/nautilus-window-menus.c +++ b/src/nautilus-window-menus.c @@ -474,14 +474,6 @@ view_menu_zoom_normal_callback (BonoboUIComponent *component, nautilus_window_zoom_to_level (NAUTILUS_WINDOW (user_data), 1.0); } -static void -view_menu_view_as_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) -{ - nautilus_window_show_view_as_dialog (NAUTILUS_WINDOW (user_data)); -} - static void preferences_respond_callback (GtkDialog *dialog, gint response_id) @@ -676,7 +668,6 @@ nautilus_window_initialize_menus_part_1 (NautilusWindow *window) BONOBO_UI_VERB ("Zoom In", view_menu_zoom_in_callback), BONOBO_UI_VERB ("Zoom Out", view_menu_zoom_out_callback), BONOBO_UI_VERB ("Zoom Normal", view_menu_zoom_normal_callback), - BONOBO_UI_VERB ("View as", view_menu_view_as_callback), #ifdef ENABLE_PROFILER BONOBO_UI_VERB ("Start Profiling", nautilus_profiler_bonobo_ui_start_callback), diff --git a/src/nautilus-window.c b/src/nautilus-window.c index e4d5bf242..940de6800 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -76,6 +76,7 @@ #include #include #include +#include #include #include #include @@ -996,55 +997,13 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window) g_free (verb_name); } -static void -chose_component_callback (NautilusViewIdentifier *identifier, gpointer callback_data) -{ - NautilusWindow *window; - - window = NAUTILUS_WINDOW (callback_data); - if (identifier != NULL) { - nautilus_window_set_content_view (window, identifier); - } - - /* FIXME bugzilla.gnome.org 41334: There should be some global - * way to signal that the file type associations have changed, - * so that the places that display these lists can react. For - * now, hardwire this case, which is the most obvious one by - * far. - */ - nautilus_window_load_view_as_menus (window); -} - -static void -cancel_chose_component_callback (NautilusWindow *window) -{ - if (window->details->viewed_file != NULL) { - nautilus_cancel_choose_component_for_file (window->details->viewed_file, - chose_component_callback, - window); - } -} - -void -nautilus_window_show_view_as_dialog (NautilusWindow *window) -{ - g_return_if_fail (NAUTILUS_IS_WINDOW (window)); - - /* Call back when the user chose the component. */ - cancel_chose_component_callback (window); - nautilus_choose_component_for_file (window->details->viewed_file, - GTK_WINDOW (window), - chose_component_callback, - window); -} - static void refresh_stored_viewers (NautilusWindow *window) { GList *components, *node, *viewers; NautilusViewIdentifier *identifier; - components = nautilus_mime_get_short_list_components_for_file (window->details->viewed_file); + components = nautilus_view_query_get_components_for_file (window->details->viewed_file); viewers = NULL; for (node = components; node != NULL; node = node->next) { identifier = nautilus_view_identifier_new_from_content_view (node->data); @@ -1399,7 +1358,6 @@ nautilus_window_set_viewed_file (NautilusWindow *window, nautilus_file_ref (file); cancel_view_as_callback (window); - cancel_chose_component_callback (window); if (window->details->viewed_file != NULL) { if (NAUTILUS_IS_SPATIAL_WINDOW (window)) { diff --git a/test/Makefile.am b/test/Makefile.am index 739b213c5..6975b921a 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -15,13 +15,9 @@ LDADD =\ $(NULL) noinst_PROGRAMS =\ - test-nautilus-mime-actions \ - test-nautilus-mime-actions-set \ test-nautilus-wrap-table \ $(NULL) -test_nautilus_mime_actions_SOURCES = test-nautilus-mime-actions.c test.c -test_nautilus_mime_actions_set_SOURCES = test-nautilus-mime-actions-set.c test.c test_nautilus_wrap_table_SOURCES = test-nautilus-wrap-table.c test.c EXTRA_DIST = \ diff --git a/test/test-nautilus-mime-actions.c b/test/test-nautilus-mime-actions.c index 1552f04fd..72cf4d680 100644 --- a/test/test-nautilus-mime-actions.c +++ b/test/test-nautilus-mime-actions.c @@ -76,48 +76,6 @@ print_application (GnomeVFSMimeApplication *application) } } -static void -print_component (Bonobo_ServerInfo *component) -{ - if (component == NULL) { - puts ("(none)"); - } else { - printf ("iid: %s\n", component->iid); - } -} - -static void -print_action (GnomeVFSMimeAction *action) -{ - if (action == NULL) { - puts ("(none)"); - } else { - if (action->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { - puts ("type: application"); - print_application (action->action.application); - } else { - puts ("type: component"); - print_component (action->action.component); - } - } -} - - -static void -print_component_list (GList *components) -{ - GList *p; - - if (components == NULL) { - puts ("(none)"); - } else { - for (p = components; p != NULL; p = p->next) { - print_component (p->data); - puts ("------"); - } - } -} - static void print_application_list (GList *applications) { @@ -145,12 +103,7 @@ main (int argc, char **argv) { const char *uri; GnomeVFSMimeApplication *default_application; - Bonobo_ServerInfo *default_component; - GnomeVFSMimeAction *default_action; - GList *all_components; GList *all_applications; - GList *short_list_components; - GList *short_list_applications; NautilusFile *file; NautilusFileAttributes attributes; @@ -172,41 +125,16 @@ main (int argc, char **argv) gtk_main_iteration (); } - default_action = nautilus_mime_get_default_action_for_file (file); - puts ("Default Action"); - print_action (default_action); - puts (""); - default_application = nautilus_mime_get_default_application_for_file (file); puts("Default Application"); print_application (default_application); puts (""); - - default_component = nautilus_mime_get_default_component_for_file (file); - puts("Default Component"); - print_component (default_component); - puts (""); - short_list_applications = nautilus_mime_get_short_list_applications_for_file (file); - puts("Short List Applications"); - print_application_list (short_list_applications); - puts (""); - - short_list_components = nautilus_mime_get_short_list_components_for_file (file); - puts("Short List Components"); - print_component_list (short_list_components); - puts (""); - - all_applications = nautilus_mime_get_all_applications_for_file (file); + all_applications = nautilus_mime_get_applications_for_file (file); puts("All Applications"); print_application_list (all_applications); puts (""); - all_components = nautilus_mime_get_all_components_for_file (file); - puts("All Components"); - print_component_list (all_components); - puts (""); - return 0; }