diff options
author | Maciej Stachowiak <mstachow@src.gnome.org> | 2000-10-18 21:57:19 +0000 |
---|---|---|
committer | Maciej Stachowiak <mstachow@src.gnome.org> | 2000-10-18 21:57:19 +0000 |
commit | 6179da4f6ff128650c7b244213fd8f5f10e1df27 (patch) | |
tree | 742850118b3e9e32645925b99fe6b9d3a1250f40 | |
parent | e5483a3a3c4bff78a57b7621f1b3832949426948 (diff) | |
download | nautilus-6179da4f6ff128650c7b244213fd8f5f10e1df27.tar.gz |
Fixed bugzilla.eazel.com bugs 2222, 3177, 3468, 3650, 3788
(some vestiges of wait_until_ready remain in the farther reaches
of the UI).
* libnautilus-extensions/nautilus-mime-actions.h,
libnautilus-extensions/nautilus-mime-actions.c
(nautilus_mime_actions_check_if_required_attributes_ready,
nautilus_mime_actions_get_required_file_attributes,
nautilus_mime_actions_wait_for_required_file_attributes): New
functions to help with monitoring or waiting for required
attributes for the nautilus mime API.
(nautilus_mime_get_default_action_type_for_file,
nautilus_mime_get_default_action_for_file,
nautilus_mime_get_default_application_for_file_internal,
nautilus_mime_get_default_application_for_file,
nautilus_mime_is_default_application_for_file_user_chosen,
nautilus_mime_get_default_component_for_file_internal,
nautilus_mime_get_default_component_for_file,
nautilus_mime_is_default_component_for_file_user_chosen,
nautilus_mime_get_short_list_applications_for_file,
nautilus_mime_get_short_list_components_for_file,
nautilus_mime_get_short_list_methods_for_file,
nautilus_mime_get_all_applications_for_file,
nautilus_mime_has_any_applications_for_file,
nautilus_mime_get_all_components_for_file,
nautilus_mime_has_any_components_for_file,
nautilus_mime_set_default_action_type_for_file,
nautilus_mime_set_default_application_for_file,
nautilus_mime_set_default_component_for_file,
nautilus_mime_set_short_list_applications_for_file,
nautilus_mime_set_short_list_components_for_file,
nautilus_mime_add_application_to_short_list_for_file,
nautilus_mime_remove_application_from_short_list_for_file,
nautilus_mime_add_component_to_short_list_for_file,
nautilus_mime_remove_component_from_short_list_for_file,
nautilus_mime_extend_all_applications_for_file,
nautilus_mime_remove_from_all_applications_for_file,
mime_type_get_supertype): Don't `nautilus_file_wait_until_ready'
for the required attributes; instead assert (Well, return_if_fail)
that they are available using
`nautilus_file_check_if_ready'. Also, use
`nautilus_file_get_uri_scheme' where possible.
* libnautilus-extensions/nautilus-directory-async.c
(mime_list_callback): Correct some coding mistakes.
* libnautilus-extensions/nautilus-wait-until-ready.h,
libnautilus-extensions/nautilus-directory.c: Remove
`nautilus_directory_wait_until_ready'.
* libnautilus-extensions/nautilus-file.h,
libnautilus-extensions/nautilus-file.c
(nautilus_file_get_uri_scheme): new convenience function.
* libnautilus-extensions/nautilus-program-chooser.c:
(repopulate_program_list, is_application_default_for_file,
is_component_default_for_file,
is_component_in_short_list_for_file,
is_application_in_short_list_for_file,
program_file_pair_is_default_for_file,
program_file_pair_is_in_short_list_for_file,
add_to_short_list_for_file, remove_from_short_list_for_file,
remove_default_for_item, set_default_for_item): wait_until_ready
for required file attributes.
* libnautilus-extensions/nautilus-program-choosing.c:
(any_programs_available_for_file): wait_until_ready for required
file attributes.
* src/file-manager/fm-directory-view.c: (switch_location_and_view,
create_open_with_gtk_menu, reset_bonobo_open_with_menu,
activate_callback): Wait for the right file attributes.
* src/nautilus-applicable-views.c: (got_file_info_callback),
(nautilus_navigation_info_new): Wait for the right file
attributes. (no wait_until_ready).
* src/nautilus-sidebar.c: (nautilus_sidebar_destroy,
nautilus_sidebar_update_buttons, nautilus_sidebar_update_all),
nautilus_sidebar_set_uri): Monitor the file the sidebar is
displaying, and update when it's attributes change.
* src/nautilus-window-manage-views.c
(nautilus_window_set_content_view): Wait for the right file
attributes. (no wait_until_ready).
* src/nautilus-window.c: (nautilus_window_destroy,
view_menu_choose_view_callback, view_menu_vfs_method_callback,
nautilus_window_real_load_content_view_menu,
nautilus_window_load_content_view_menu): Wait for the right
attributes. (no wait_until_ready in this chain).
* test/test-nautilus-mime-actions-set.c (main): Wait for the right attributes.
* test/test-nautilus-mime-actions.c (main): Wait for the right attributes.
30 files changed, 900 insertions, 717 deletions
@@ -1,3 +1,100 @@ +2000-10-17 Maciej Stachowiak <mjs@eazel.com> + + Fixed bugzilla.eazel.com bugs 2222, 3177, 3468, 3650, 3788 + (some vestiges of wait_until_ready remain in the farther reaches + of the UI). + + * libnautilus-extensions/nautilus-mime-actions.h, + libnautilus-extensions/nautilus-mime-actions.c + (nautilus_mime_actions_check_if_required_attributes_ready, + nautilus_mime_actions_get_required_file_attributes, + nautilus_mime_actions_wait_for_required_file_attributes): New + functions to help with monitoring or waiting for required + attributes for the nautilus mime API. + (nautilus_mime_get_default_action_type_for_file, + nautilus_mime_get_default_action_for_file, + nautilus_mime_get_default_application_for_file_internal, + nautilus_mime_get_default_application_for_file, + nautilus_mime_is_default_application_for_file_user_chosen, + nautilus_mime_get_default_component_for_file_internal, + nautilus_mime_get_default_component_for_file, + nautilus_mime_is_default_component_for_file_user_chosen, + nautilus_mime_get_short_list_applications_for_file, + nautilus_mime_get_short_list_components_for_file, + nautilus_mime_get_short_list_methods_for_file, + nautilus_mime_get_all_applications_for_file, + nautilus_mime_has_any_applications_for_file, + nautilus_mime_get_all_components_for_file, + nautilus_mime_has_any_components_for_file, + nautilus_mime_set_default_action_type_for_file, + nautilus_mime_set_default_application_for_file, + nautilus_mime_set_default_component_for_file, + nautilus_mime_set_short_list_applications_for_file, + nautilus_mime_set_short_list_components_for_file, + nautilus_mime_add_application_to_short_list_for_file, + nautilus_mime_remove_application_from_short_list_for_file, + nautilus_mime_add_component_to_short_list_for_file, + nautilus_mime_remove_component_from_short_list_for_file, + nautilus_mime_extend_all_applications_for_file, + nautilus_mime_remove_from_all_applications_for_file, + mime_type_get_supertype): Don't `nautilus_file_wait_until_ready' + for the required attributes; instead assert (Well, return_if_fail) + that they are available using + `nautilus_file_check_if_ready'. Also, use + `nautilus_file_get_uri_scheme' where possible. + + * libnautilus-extensions/nautilus-directory-async.c + (mime_list_callback): Correct some coding mistakes. + + * libnautilus-extensions/nautilus-wait-until-ready.h, + libnautilus-extensions/nautilus-directory.c: Remove + `nautilus_directory_wait_until_ready'. + + * libnautilus-extensions/nautilus-file.h, + libnautilus-extensions/nautilus-file.c + (nautilus_file_get_uri_scheme): new convenience function. + + * libnautilus-extensions/nautilus-program-chooser.c: + (repopulate_program_list, is_application_default_for_file, + is_component_default_for_file, + is_component_in_short_list_for_file, + is_application_in_short_list_for_file, + program_file_pair_is_default_for_file, + program_file_pair_is_in_short_list_for_file, + add_to_short_list_for_file, remove_from_short_list_for_file, + remove_default_for_item, set_default_for_item): wait_until_ready + for required file attributes. + + * libnautilus-extensions/nautilus-program-choosing.c: + (any_programs_available_for_file): wait_until_ready for required + file attributes. + + * src/file-manager/fm-directory-view.c: (switch_location_and_view, + create_open_with_gtk_menu, reset_bonobo_open_with_menu, + activate_callback): Wait for the right file attributes. + + * src/nautilus-applicable-views.c: (got_file_info_callback), + (nautilus_navigation_info_new): Wait for the right file + attributes. (no wait_until_ready). + + * src/nautilus-sidebar.c: (nautilus_sidebar_destroy, + nautilus_sidebar_update_buttons, nautilus_sidebar_update_all), + nautilus_sidebar_set_uri): Monitor the file the sidebar is + displaying, and update when it's attributes change. + + * src/nautilus-window-manage-views.c + (nautilus_window_set_content_view): Wait for the right file + attributes. (no wait_until_ready). + + * src/nautilus-window.c: (nautilus_window_destroy, + view_menu_choose_view_callback, view_menu_vfs_method_callback, + nautilus_window_real_load_content_view_menu, + nautilus_window_load_content_view_menu): Wait for the right + attributes. (no wait_until_ready in this chain). + + * test/test-nautilus-mime-actions-set.c (main): Wait for the right attributes. + * test/test-nautilus-mime-actions.c (main): Wait for the right attributes. + 2000-10-18 Darin Adler <darin@eazel.com> * components/notes/nautilus-notes.c: (make_notes_view): diff --git a/libnautilus-extensions/nautilus-directory-async.c b/libnautilus-extensions/nautilus-directory-async.c index eef169ab4..045ca697e 100644 --- a/libnautilus-extensions/nautilus-directory-async.c +++ b/libnautilus-extensions/nautilus-directory-async.c @@ -2443,8 +2443,10 @@ mime_list_callback (GnomeVFSAsyncHandle *handle, file->details->directory_count_failed = TRUE; nautilus_g_list_free_deep (file->details->mime_list); file->details->mime_list = NULL; + file->details->mime_list_status = NAUTILUS_REQUEST_NOT_STARTED; } else { file->details->got_mime_list = TRUE; + file->details->mime_list_status = NAUTILUS_REQUEST_DONE; } g_free (directory->details->mime_list_uri); diff --git a/libnautilus-extensions/nautilus-directory.c b/libnautilus-extensions/nautilus-directory.c index be028c644..904a8f229 100644 --- a/libnautilus-extensions/nautilus-directory.c +++ b/libnautilus-extensions/nautilus-directory.c @@ -1180,41 +1180,6 @@ nautilus_directory_call_when_ready (NautilusDirectory *directory, callback, callback_data)); } -typedef struct { - gboolean done; - GList *files_return; -} WaitUntilReadyCallbackData; - -static void -wait_until_ready_callback (NautilusDirectory *directory, - GList *files, - gpointer callback_data) -{ - WaitUntilReadyCallbackData *data; - - data = callback_data; - data->done = TRUE; - data->files_return = nautilus_file_list_copy (files); -} - -GList * -nautilus_directory_wait_until_ready (NautilusDirectory *directory, - GList *file_attributes) -{ - WaitUntilReadyCallbackData data; - - data.done = FALSE; - data.files_return = NULL; - - nautilus_directory_call_when_ready - (directory, file_attributes, - wait_until_ready_callback, &data); - while (!data.done) { - gtk_main_iteration (); - } - - return data.files_return; -} void nautilus_directory_cancel_callback (NautilusDirectory *directory, diff --git a/libnautilus-extensions/nautilus-file.c b/libnautilus-extensions/nautilus-file.c index 28435c20d..69da59daf 100644 --- a/libnautilus-extensions/nautilus-file.c +++ b/libnautilus-extensions/nautilus-file.c @@ -1819,6 +1819,33 @@ nautilus_file_get_uri (NautilusFile *file) NULL); } + + + +char * +nautilus_file_get_uri_scheme (NautilusFile *file) +{ + char *colon; + + g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL); + + if (file->details->directory == NULL || + file->details->directory->details->uri == NULL) { + return NULL; + } + + colon = strchr (file->details->directory->details->uri, ':'); + + if (colon == NULL) { + return NULL; + } + + return g_strndup (file->details->directory->details->uri, + colon - file->details->directory->details->uri); +} + + + /** * nautilus_file_get_date_as_string: * @@ -4289,3 +4316,4 @@ nautilus_self_check_file (void) } #endif /* !NAUTILUS_OMIT_SELF_CHECK */ + diff --git a/libnautilus-extensions/nautilus-file.h b/libnautilus-extensions/nautilus-file.h index a2d625d00..f22fb55e8 100644 --- a/libnautilus-extensions/nautilus-file.h +++ b/libnautilus-extensions/nautilus-file.h @@ -115,6 +115,7 @@ gboolean nautilus_file_check_if_ready (NautilusFile *file, /* Basic attributes for file objects. */ char * nautilus_file_get_name (NautilusFile *file); char * nautilus_file_get_uri (NautilusFile *file); +char * nautilus_file_get_uri_scheme (NautilusFile *file); char * nautilus_file_get_parent_uri (NautilusFile *file); char * nautilus_file_get_parent_uri_for_display (NautilusFile *file); GnomeVFSFileSize nautilus_file_get_size (NautilusFile *file); diff --git a/libnautilus-extensions/nautilus-mime-actions.c b/libnautilus-extensions/nautilus-mime-actions.c index 125647a2a..983f2da21 100644 --- a/libnautilus-extensions/nautilus-mime-actions.c +++ b/libnautilus-extensions/nautilus-mime-actions.c @@ -51,7 +51,6 @@ static char *extract_prefix_add_suffix (const char const char *separator, const char *suffix); static char *mime_type_get_supertype (const char *mime_type); -static char *uri_string_get_scheme (const char *uri_string); static GList *get_explicit_content_view_iids_from_metafile (NautilusFile *file); static char *make_oaf_query_for_explicit_content_view_iids (GList *view_iids); static char *make_oaf_query_with_known_mime_type (const char *mime_type, @@ -96,22 +95,25 @@ is_known_mime_type (const char *mime_type) return TRUE; } -static void -nautilus_file_wait_for_metadata (NautilusFile *file) + + +static gboolean +nautilus_mime_actions_check_if_required_attributes_ready (NautilusFile *file) { GList *attributes; + gboolean ready; - attributes = NULL; - attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_METADATA); - attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_SLOW_MIME_TYPE); - nautilus_file_wait_until_ready (file, attributes); + attributes = nautilus_mime_actions_get_required_file_attributes (); + ready = nautilus_file_check_if_ready (file, attributes); g_list_free (attributes); + + return ready; } -static void -nautilus_file_wait_for_mime_action_attributes (NautilusFile *file) +GList * +nautilus_mime_actions_get_required_file_attributes () { GList *attributes; @@ -119,21 +121,33 @@ nautilus_file_wait_for_mime_action_attributes (NautilusFile *file) attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_METADATA); attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_SLOW_MIME_TYPE); attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES); - nautilus_file_wait_until_ready (file, attributes); - g_list_free (attributes); + + return attributes; } +void +nautilus_mime_actions_wait_for_required_file_attributes (NautilusFile *file) +{ + GList *attributes; + + attributes = nautilus_mime_actions_get_required_file_attributes (); + + nautilus_file_wait_until_ready (file, attributes); + + g_list_free (attributes); +} GnomeVFSMimeActionType -nautilus_mime_get_default_action_type_for_uri (NautilusFile *file) +nautilus_mime_get_default_action_type_for_file (NautilusFile *file) { char *mime_type; char *action_type_string; GnomeVFSMimeActionType action_type; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_MIME_ACTION_TYPE_NONE); action_type_string = nautilus_file_get_metadata (file, NAUTILUS_METADATA_KEY_DEFAULT_ACTION_TYPE, NULL); @@ -155,18 +169,21 @@ nautilus_mime_get_default_action_type_for_uri (NautilusFile *file) } GnomeVFSMimeAction * -nautilus_mime_get_default_action_for_uri (NautilusFile *file) +nautilus_mime_get_default_action_for_file (NautilusFile *file) { GnomeVFSMimeAction *action; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + action = g_new0 (GnomeVFSMimeAction, 1); - action->action_type = nautilus_mime_get_default_action_type_for_uri (file); + 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_uri (file); + nautilus_mime_get_default_application_for_file (file); if (action->action.application == NULL) { g_free (action); action = NULL; @@ -174,7 +191,7 @@ nautilus_mime_get_default_action_for_uri (NautilusFile *file) break; case GNOME_VFS_MIME_ACTION_TYPE_COMPONENT: action->action.component = - nautilus_mime_get_default_component_for_uri (file); + nautilus_mime_get_default_component_for_file (file); if (action->action.component == NULL) { g_free (action); action = NULL; @@ -192,7 +209,7 @@ nautilus_mime_get_default_action_for_uri (NautilusFile *file) static GnomeVFSMimeApplication * -nautilus_mime_get_default_application_for_uri_internal (NautilusFile *file, +nautilus_mime_get_default_application_for_file_internal (NautilusFile *file, gboolean *user_chosen) { char *mime_type; @@ -200,9 +217,11 @@ nautilus_mime_get_default_application_for_uri_internal (NautilusFile *file, char *default_application_string; gboolean used_user_chosen_info; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + used_user_chosen_info = TRUE; - nautilus_file_wait_for_metadata (file); default_application_string = nautilus_file_get_metadata (file, NAUTILUS_METADATA_KEY_DEFAULT_APPLICATION, NULL); @@ -223,18 +242,18 @@ nautilus_mime_get_default_application_for_uri_internal (NautilusFile *file, } GnomeVFSMimeApplication * -nautilus_mime_get_default_application_for_uri (NautilusFile *file) +nautilus_mime_get_default_application_for_file (NautilusFile *file) { - return nautilus_mime_get_default_application_for_uri_internal (file, NULL); + return nautilus_mime_get_default_application_for_file_internal (file, NULL); } gboolean -nautilus_mime_is_default_application_for_uri_user_chosen (NautilusFile *file) +nautilus_mime_is_default_application_for_file_user_chosen (NautilusFile *file) { GnomeVFSMimeApplication *application; gboolean user_chosen; - application = nautilus_mime_get_default_application_for_uri_internal (file, &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. @@ -250,13 +269,12 @@ nautilus_mime_is_default_application_for_uri_user_chosen (NautilusFile *fil static OAF_ServerInfo * -nautilus_mime_get_default_component_for_uri_internal (NautilusFile *file, +nautilus_mime_get_default_component_for_file_internal (NautilusFile *file, gboolean *user_chosen) { GList *info_list; OAF_ServerInfo *mime_default; char *default_component_string; - char *uri; char *mime_type; char *uri_scheme; GList *item_mime_types; @@ -270,19 +288,17 @@ nautilus_mime_get_default_component_for_uri_internal (NautilusFile *file, GList *p; char *prev; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + used_user_chosen_info = TRUE; CORBA_exception_init (&ev); mime_type = nautilus_file_get_slow_mime_type (file); - uri = nautilus_file_get_uri (file); - - uri_scheme = uri_string_get_scheme (uri); + uri_scheme = nautilus_file_get_uri_scheme (file); - g_free (uri); - - nautilus_file_wait_for_mime_action_attributes (file); explicit_iids = get_explicit_content_view_iids_from_metafile (file); nautilus_file_get_directory_item_mime_types (file, &item_mime_types); @@ -318,7 +334,7 @@ nautilus_mime_get_default_component_for_uri_internal (NautilusFile *file, /* Prefer something from the short list */ - short_list = nautilus_mime_get_short_list_components_for_uri (file); + short_list = nautilus_mime_get_short_list_components_for_file (file); if (short_list != NULL) { sort_conditions[1] = g_strdup ("has (['"); @@ -394,18 +410,18 @@ nautilus_mime_get_default_component_for_uri_internal (NautilusFile *file, OAF_ServerInfo * -nautilus_mime_get_default_component_for_uri (NautilusFile *file) +nautilus_mime_get_default_component_for_file (NautilusFile *file) { - return nautilus_mime_get_default_component_for_uri_internal (file, NULL); + return nautilus_mime_get_default_component_for_file_internal (file, NULL); } gboolean -nautilus_mime_is_default_component_for_uri_user_chosen (NautilusFile *file) +nautilus_mime_is_default_component_for_file_user_chosen (NautilusFile *file) { OAF_ServerInfo *component; gboolean user_chosen; - component = nautilus_mime_get_default_component_for_uri_internal (file, &user_chosen); + component = nautilus_mime_get_default_component_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 component. @@ -421,7 +437,7 @@ nautilus_mime_is_default_component_for_uri_user_chosen (NautilusFile *file) GList * -nautilus_mime_get_short_list_applications_for_uri (NautilusFile *file) +nautilus_mime_get_short_list_applications_for_file (NautilusFile *file) { char *mime_type; GList *result; @@ -432,9 +448,11 @@ nautilus_mime_get_short_list_applications_for_uri (NautilusFile *file) GnomeVFSMimeApplication *application; CORBA_Environment ev; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + CORBA_exception_init (&ev); - nautilus_file_wait_for_metadata (file); metadata_application_add_ids = nautilus_file_get_metadata_list (file, NAUTILUS_METADATA_KEY_SHORT_LIST_APPLICATION_ADD, @@ -474,9 +492,8 @@ nautilus_mime_get_short_list_applications_for_uri (NautilusFile *file) } GList * -nautilus_mime_get_short_list_components_for_uri (NautilusFile *file) +nautilus_mime_get_short_list_components_for_file (NautilusFile *file) { - char *uri; char *mime_type; char *uri_scheme; GList *item_mime_types; @@ -493,15 +510,13 @@ nautilus_mime_get_short_list_components_for_uri (NautilusFile *file) char *extra_requirements; char *prev; - CORBA_exception_init (&ev); - - uri = nautilus_file_get_uri (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); - uri_scheme = uri_string_get_scheme (uri); + CORBA_exception_init (&ev); - g_free (uri); + uri_scheme = nautilus_file_get_uri_scheme (file); - nautilus_file_wait_for_mime_action_attributes (file); explicit_iids = get_explicit_content_view_iids_from_metafile (file); nautilus_file_get_directory_item_mime_types (file, &item_mime_types); @@ -574,12 +589,14 @@ nautilus_mime_get_short_list_components_for_uri (NautilusFile *file) /* FIXME: we should disable this for 1.0 I think */ char * -nautilus_mime_get_short_list_methods_for_uri (NautilusFile *file) +nautilus_mime_get_short_list_methods_for_file (NautilusFile *file) { char *mime_type; const char *method; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + mime_type = nautilus_file_get_slow_mime_type (file); method = gnome_vfs_mime_get_value (mime_type, "vfs-method"); g_free (mime_type); @@ -587,7 +604,7 @@ nautilus_mime_get_short_list_methods_for_uri (NautilusFile *file) } GList * -nautilus_mime_get_all_applications_for_uri (NautilusFile *file) +nautilus_mime_get_all_applications_for_file (NautilusFile *file) { char *mime_type; GList *result; @@ -595,7 +612,9 @@ nautilus_mime_get_all_applications_for_uri (NautilusFile *file) GList *p; GnomeVFSMimeApplication *application; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + metadata_application_ids = nautilus_file_get_metadata_list (file, NAUTILUS_METADATA_KEY_EXPLICIT_APPLICATION, @@ -622,12 +641,12 @@ nautilus_mime_get_all_applications_for_uri (NautilusFile *file) } gboolean -nautilus_mime_has_any_applications_for_uri (NautilusFile *file) +nautilus_mime_has_any_applications_for_file (NautilusFile *file) { GList *list; gboolean result; - list = nautilus_mime_get_all_applications_for_uri (file); + list = nautilus_mime_get_all_applications_for_file (file); result = list != NULL; gnome_vfs_mime_application_list_free (list); @@ -635,9 +654,8 @@ nautilus_mime_has_any_applications_for_uri (NautilusFile *file) } GList * -nautilus_mime_get_all_components_for_uri (NautilusFile *file) +nautilus_mime_get_all_components_for_file (NautilusFile *file) { - char *uri; char *mime_type; char *uri_scheme; GList *item_mime_types; @@ -645,13 +663,12 @@ nautilus_mime_get_all_components_for_uri (NautilusFile *file) GList *explicit_iids; CORBA_Environment ev; - CORBA_exception_init (&ev); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); - uri = nautilus_file_get_uri (file); - uri_scheme = uri_string_get_scheme (uri); - g_free (uri); + CORBA_exception_init (&ev); - nautilus_file_wait_for_mime_action_attributes (file); + uri_scheme = nautilus_file_get_uri_scheme (file); mime_type = nautilus_file_get_slow_mime_type (file); explicit_iids = get_explicit_content_view_iids_from_metafile (file); @@ -667,12 +684,12 @@ nautilus_mime_get_all_components_for_uri (NautilusFile *file) } gboolean -nautilus_mime_has_any_components_for_uri (NautilusFile *file) +nautilus_mime_has_any_components_for_file (NautilusFile *file) { GList *list; gboolean result; - list = nautilus_mime_get_all_components_for_uri (file); + list = nautilus_mime_get_all_components_for_file (file); result = list != NULL; gnome_vfs_mime_component_list_free (list); @@ -680,8 +697,8 @@ nautilus_mime_has_any_components_for_uri (NautilusFile *file) } GnomeVFSResult -nautilus_mime_set_default_action_type_for_uri (NautilusFile *file, - GnomeVFSMimeActionType action_type) +nautilus_mime_set_default_action_type_for_file (NautilusFile *file, + GnomeVFSMimeActionType action_type) { const char *action_string; @@ -697,7 +714,6 @@ nautilus_mime_set_default_action_type_for_uri (NautilusFile *file, action_string = "none"; } - nautilus_file_wait_for_metadata (file); nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_DEFAULT_ACTION_TYPE, NULL, action_string); @@ -705,42 +721,46 @@ nautilus_mime_set_default_action_type_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_set_default_application_for_uri (NautilusFile *file, - const char *application_id) +nautilus_mime_set_default_application_for_file (NautilusFile *file, + const char *application_id) { - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); + 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_uri (file) == GNOME_VFS_MIME_ACTION_TYPE_NONE) { - return nautilus_mime_set_default_action_type_for_uri (file, GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); + 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_uri (NautilusFile *file, - const char *component_iid) +nautilus_mime_set_default_component_for_file (NautilusFile *file, + const char *component_iid) { - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_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_uri (file) == GNOME_VFS_MIME_ACTION_TYPE_NONE) { - return nautilus_mime_set_default_action_type_for_uri (file, GNOME_VFS_MIME_ACTION_TYPE_COMPONENT); + 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_uri (NautilusFile *file, - GList *applications) +nautilus_mime_set_short_list_applications_for_file (NautilusFile *file, + GList *applications) { GList *add_list; GList *remove_list; @@ -749,6 +769,9 @@ nautilus_mime_set_short_list_applications_for_uri (NautilusFile *file, GList *p; char *mime_type; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); + /* get per-mime short list */ mime_type = nautilus_file_get_slow_mime_type (file); @@ -765,7 +788,6 @@ nautilus_mime_set_short_list_applications_for_uri (NautilusFile *file, add_list = str_list_difference (applications, normal_short_list_ids); remove_list = str_list_difference (normal_short_list_ids, applications); - nautilus_file_wait_for_metadata (file); nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_SHORT_LIST_APPLICATION_ADD, @@ -785,8 +807,8 @@ nautilus_mime_set_short_list_applications_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, - GList *components) +nautilus_mime_set_short_list_components_for_file (NautilusFile *file, + GList *components) { GList *add_list; GList *remove_list; @@ -795,8 +817,10 @@ nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, GList *p; char *mime_type; - /* get per-mime short list */ + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); + /* get per-mime short list */ mime_type = nautilus_file_get_slow_mime_type (file); normal_short_list = gnome_vfs_mime_get_short_list_components (mime_type); g_free (mime_type); @@ -811,7 +835,6 @@ nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, add_list = str_list_difference (components, normal_short_list_ids); remove_list = str_list_difference (normal_short_list_ids, components); - nautilus_file_wait_for_metadata (file); nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_SHORT_LIST_COMPONENT_ADD, @@ -831,20 +854,23 @@ nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_add_application_to_short_list_for_uri (NautilusFile *file, - const char *application_id) +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_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); + result = GNOME_VFS_OK; - old_list = nautilus_mime_get_short_list_applications_for_uri (file); + 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_uri (file, new_list); + result = nautilus_mime_set_short_list_applications_for_file (file, new_list); nautilus_g_list_free_deep (new_list); } @@ -854,14 +880,17 @@ nautilus_mime_add_application_to_short_list_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_remove_application_from_short_list_for_uri (NautilusFile *file, - const char *application_id) +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; - old_list = nautilus_mime_get_short_list_applications_for_uri (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_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); @@ -869,7 +898,7 @@ nautilus_mime_remove_application_from_short_list_for_uri (NautilusFile *fil 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_uri (file, new_list); + result = nautilus_mime_set_short_list_applications_for_file (file, new_list); nautilus_g_list_free_deep (new_list); } @@ -879,20 +908,23 @@ nautilus_mime_remove_application_from_short_list_for_uri (NautilusFile *fil } GnomeVFSResult -nautilus_mime_add_component_to_short_list_for_uri (NautilusFile *file, - const char *iid) +nautilus_mime_add_component_to_short_list_for_file (NautilusFile *file, + const char *iid) { GList *old_list, *new_list; GnomeVFSResult result; - old_list = nautilus_mime_get_short_list_components_for_uri (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_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_uri (file, new_list); + result = nautilus_mime_set_short_list_components_for_file (file, new_list); nautilus_g_list_free_deep (new_list); } @@ -902,14 +934,17 @@ nautilus_mime_add_component_to_short_list_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_remove_component_from_short_list_for_uri (NautilusFile *file, - const char *iid) +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; - old_list = nautilus_mime_get_short_list_components_for_uri (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_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); @@ -917,7 +952,7 @@ nautilus_mime_remove_component_from_short_list_for_uri (NautilusFile *file, 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_uri (file, new_list); + result = nautilus_mime_set_short_list_components_for_file (file, new_list); nautilus_g_list_free_deep (new_list); } @@ -927,14 +962,15 @@ nautilus_mime_remove_component_from_short_list_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_extend_all_applications_for_uri (NautilusFile *file, - GList *applications) +nautilus_mime_extend_all_applications_for_file (NautilusFile *file, + GList *applications) { GList *metadata_application_ids; GList *extras; GList *final_applications; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); metadata_application_ids = nautilus_file_get_metadata_list (file, @@ -955,13 +991,14 @@ nautilus_mime_extend_all_applications_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_remove_from_all_applications_for_uri (NautilusFile *file, - GList *applications) +nautilus_mime_remove_from_all_applications_for_file (NautilusFile *file, + GList *applications) { GList *metadata_application_ids; GList *final_applications; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); metadata_application_ids = nautilus_file_get_metadata_list (file, @@ -1041,13 +1078,6 @@ mime_type_get_supertype (const char *mime_type) return extract_prefix_add_suffix (mime_type, "/", "/*"); } -static char * -uri_string_get_scheme (const char *uri_string) -{ - return extract_prefix_add_suffix (uri_string, ":", ""); -} - - /* * The following routine uses metadata associated with the current url diff --git a/libnautilus-extensions/nautilus-mime-actions.h b/libnautilus-extensions/nautilus-mime-actions.h index b24a6c14f..fd76cd161 100644 --- a/libnautilus-extensions/nautilus-mime-actions.h +++ b/libnautilus-extensions/nautilus-mime-actions.h @@ -30,46 +30,50 @@ #include <libnautilus-extensions/nautilus-file.h> +GList *nautilus_mime_actions_get_required_file_attributes (void); -GnomeVFSMimeActionType nautilus_mime_get_default_action_type_for_uri (NautilusFile *file); -GnomeVFSMimeAction * nautilus_mime_get_default_action_for_uri (NautilusFile *file); -GnomeVFSMimeApplication *nautilus_mime_get_default_application_for_uri (NautilusFile *file); -gboolean nautilus_mime_is_default_application_for_uri_user_chosen (NautilusFile *file); -OAF_ServerInfo * nautilus_mime_get_default_component_for_uri (NautilusFile *file); -gboolean nautilus_mime_is_default_component_for_uri_user_chosen (NautilusFile *file); -GList * nautilus_mime_get_short_list_applications_for_uri (NautilusFile *file); -GList * nautilus_mime_get_short_list_components_for_uri (NautilusFile *file); -gchar * nautilus_mime_get_short_list_methods_for_uri (NautilusFile *file); -GList * nautilus_mime_get_all_applications_for_uri (NautilusFile *file); -GList * nautilus_mime_get_all_components_for_uri (NautilusFile *file); -gboolean nautilus_mime_has_any_components_for_uri (NautilusFile *file); -gboolean nautilus_mime_has_any_applications_for_uri (NautilusFile *file); -GnomeVFSResult nautilus_mime_set_default_action_type_for_uri (NautilusFile *file, - GnomeVFSMimeActionType action_type); -GnomeVFSResult nautilus_mime_set_default_application_for_uri (NautilusFile *file, - const char *application_id); -GnomeVFSResult nautilus_mime_set_default_component_for_uri (NautilusFile *file, - const char *component_iid); +void nautilus_mime_actions_wait_for_required_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); +OAF_ServerInfo * nautilus_mime_get_default_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_short_list_components_for_file (NautilusFile *file); +gchar * nautilus_mime_get_short_list_methods_for_file (NautilusFile *file); +GList * nautilus_mime_get_all_applications_for_file (NautilusFile *file); +GList * nautilus_mime_get_all_components_for_file (NautilusFile *file); +gboolean nautilus_mime_has_any_components_for_file (NautilusFile *file); +gboolean nautilus_mime_has_any_applications_for_file (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_uri (NautilusFile *file, - GList *components); -GnomeVFSResult nautilus_mime_add_application_to_short_list_for_uri (NautilusFile *file, - const char *application_id); -GnomeVFSResult nautilus_mime_remove_application_from_short_list_for_uri (NautilusFile *file, - const char *application_id); -GnomeVFSResult nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, - GList *components); -GnomeVFSResult nautilus_mime_add_component_to_short_list_for_uri (NautilusFile *file, - const char *iid); -GnomeVFSResult nautilus_mime_remove_component_from_short_list_for_uri (NautilusFile *file, - const char *iid); +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_uri (NautilusFile *file, - GList *applications); +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_uri (NautilusFile *file, - GList *applications); +GnomeVFSResult nautilus_mime_remove_from_all_applications_for_file (NautilusFile *file, + GList *applications); /* No way to add to all components; oafinfo database assumed trusted in this regard. */ diff --git a/libnautilus-extensions/nautilus-program-chooser.c b/libnautilus-extensions/nautilus-program-chooser.c index f00b1db67..3458c78e0 100644 --- a/libnautilus-extensions/nautilus-program-chooser.c +++ b/libnautilus-extensions/nautilus-program-chooser.c @@ -310,23 +310,22 @@ repopulate_program_list (GnomeDialog *program_chooser, GtkCList *clist) { char **text; - char *uri; GList *programs, *program; ProgramFilePair *pair; int new_row; GnomeVFSMimeActionType type; + nautilus_mime_actions_wait_for_required_file_attributes (file); + type = nautilus_program_chooser_get_type (program_chooser); g_assert (type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT || type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); - - uri = nautilus_file_get_uri (file); - g_free (uri); + programs = type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT - ? nautilus_mime_get_all_components_for_uri (file) - : nautilus_mime_get_all_applications_for_uri (file); + ? nautilus_mime_get_all_components_for_file (file) + : nautilus_mime_get_all_applications_for_file (file); gtk_clist_clear (clist); @@ -481,19 +480,16 @@ is_component_default_for_type (NautilusViewIdentifier *identifier, const char *m } static gboolean -is_application_default_for_uri (GnomeVFSMimeApplication *application, const char *uri) +is_application_default_for_file (GnomeVFSMimeApplication *application, + NautilusFile *file) { GnomeVFSMimeApplication *default_application; gboolean result; - NautilusFile *file; g_assert (application != NULL); - file = nautilus_file_get (uri); - - default_application = nautilus_mime_get_default_application_for_uri (file); + default_application = nautilus_mime_get_default_application_for_file (file); result = (default_application != NULL && strcmp (default_application->id, application->id) == 0); - nautilus_file_unref (file); gnome_vfs_mime_application_free (default_application); @@ -501,21 +497,18 @@ is_application_default_for_uri (GnomeVFSMimeApplication *application, const char } static gboolean -is_component_default_for_uri (NautilusViewIdentifier *identifier, const char *uri) +is_component_default_for_file (NautilusViewIdentifier *identifier, NautilusFile *file) { OAF_ServerInfo *default_component; gboolean result; - NautilusFile *file; g_assert (identifier != NULL); - file = nautilus_file_get (uri); + nautilus_mime_actions_wait_for_required_file_attributes (file); - default_component = nautilus_mime_get_default_component_for_uri (file); + default_component = nautilus_mime_get_default_component_for_file (file); result = (default_component != NULL && strcmp (default_component->iid, identifier->iid) == 0); - nautilus_file_unref (file); - CORBA_free (default_component); return result; @@ -538,23 +531,19 @@ is_component_in_short_list (NautilusViewIdentifier *identifier, const char *mime } static gboolean -is_component_in_short_list_for_uri (NautilusViewIdentifier *identifier, const char *uri) +is_component_in_short_list_for_file (NautilusViewIdentifier *identifier, + NautilusFile *file) { GList *list; gboolean result; - NautilusFile *file; - - file = nautilus_file_get (uri); - list = nautilus_mime_get_short_list_components_for_uri (file); + list = nautilus_mime_get_short_list_components_for_file (file); result = g_list_find_custom (list, identifier, (GCompareFunc)compare_component_with_view) != NULL; gnome_vfs_mime_component_list_free (list); - nautilus_file_unref (file); - return result; } @@ -575,24 +564,17 @@ is_application_in_short_list (GnomeVFSMimeApplication *application, const char * } static gboolean -is_application_in_short_list_for_uri (GnomeVFSMimeApplication *application, const char *uri) +is_application_in_short_list_for_file (GnomeVFSMimeApplication *application, NautilusFile *file) { GList *list; gboolean result; - NautilusFile *file; - - file = nautilus_file_get (uri); - - list = nautilus_mime_get_short_list_applications_for_uri (file); + list = nautilus_mime_get_short_list_applications_for_file (file); result = g_list_find_custom (list, application, (GCompareFunc)compare_mime_applications) != NULL; gnome_vfs_mime_application_list_free (list); - - - nautilus_file_unref (file); return result; } @@ -626,26 +608,23 @@ program_file_pair_is_default_for_file_type (ProgramFilePair *pair) static gboolean program_file_pair_is_default_for_file (ProgramFilePair *pair) { - char *uri; gboolean result; g_assert (pair != NULL); g_assert (NAUTILUS_IS_FILE (pair->file)); - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); - if (pair->action_type != nautilus_mime_get_default_action_type_for_uri (pair->file)) { + if (pair->action_type != nautilus_mime_get_default_action_type_for_file (pair->file)) { return FALSE; } if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT) { - result = is_component_default_for_uri (pair->view_identifier, uri); + result = is_component_default_for_file (pair->view_identifier, pair->file); } else { - result = is_application_default_for_uri (pair->application, uri); + result = is_application_default_for_file (pair->application, pair->file); } - g_free (uri); - return result; } @@ -674,22 +653,19 @@ program_file_pair_is_in_short_list_for_file_type (ProgramFilePair *pair) static gboolean program_file_pair_is_in_short_list_for_file (ProgramFilePair *pair) { - char *uri; gboolean result; g_assert (pair != NULL); g_assert (NAUTILUS_IS_FILE (pair->file)); - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT) { - result = is_component_in_short_list_for_uri (pair->view_identifier, uri); + result = is_component_in_short_list_for_file (pair->view_identifier, pair->file); } else { - result = is_application_in_short_list_for_uri (pair->application, uri); + result = is_application_in_short_list_for_file (pair->application, pair->file); } - g_free (uri); - return result; } @@ -799,33 +775,25 @@ pack_radio_button (GtkBox *box, const char *label_text, GtkRadioButton *group) static void add_to_short_list_for_file (ProgramFilePair *pair) { - char *uri; - - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { - nautilus_mime_add_application_to_short_list_for_uri (pair->file, pair->application->id); + nautilus_mime_add_application_to_short_list_for_file (pair->file, pair->application->id); } else { - nautilus_mime_add_component_to_short_list_for_uri (pair->file, pair->view_identifier->iid); + nautilus_mime_add_component_to_short_list_for_file (pair->file, pair->view_identifier->iid); } - - g_free (uri); } static void remove_from_short_list_for_file (ProgramFilePair *pair) { - char *uri; - - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { - nautilus_mime_remove_application_from_short_list_for_uri (pair->file, pair->application->id); + nautilus_mime_remove_application_from_short_list_for_file (pair->file, pair->application->id); } else { - nautilus_mime_remove_component_from_short_list_for_uri (pair->file, pair->view_identifier->iid); + nautilus_mime_remove_component_from_short_list_for_file (pair->file, pair->view_identifier->iid); } - - g_free (uri); } static void @@ -883,31 +851,27 @@ remove_default_for_type (ProgramFilePair *pair) static void remove_default_for_item (ProgramFilePair *pair) { - char *uri; + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); - uri = nautilus_file_get_uri (pair->file); - if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { /* If the default is just falling through to the default for this type, * don't do anything here. */ - if (nautilus_mime_is_default_application_for_uri_user_chosen (pair->file)) { - if (is_application_default_for_uri (pair->application, uri)) { - nautilus_mime_set_default_application_for_uri (pair->file, NULL); + if (nautilus_mime_is_default_application_for_file_user_chosen (pair->file)) { + if (is_application_default_for_file (pair->application, pair->file)) { + nautilus_mime_set_default_application_for_file (pair->file, NULL); } } } else { /* If the default is just falling through to the default for this type, * don't do anything here. */ - if (nautilus_mime_is_default_component_for_uri_user_chosen (pair->file)) { - if (is_component_default_for_uri (pair->view_identifier, uri)) { - nautilus_mime_set_default_component_for_uri (pair->file, NULL); + if (nautilus_mime_is_default_component_for_file_user_chosen (pair->file)) { + if (is_component_default_for_file (pair->view_identifier, pair->file)) { + nautilus_mime_set_default_component_for_file (pair->file, NULL); } } } - - g_free (uri); } static void @@ -931,21 +895,15 @@ set_default_for_type (ProgramFilePair *pair) static void set_default_for_item (ProgramFilePair *pair) { - char *uri; - - uri = nautilus_file_get_uri (pair->file); - - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { - nautilus_mime_set_default_application_for_uri (pair->file, pair->application->id); + nautilus_mime_set_default_application_for_file (pair->file, pair->application->id); } else { - nautilus_mime_set_default_component_for_uri (pair->file, pair->view_identifier->iid); + nautilus_mime_set_default_component_for_file (pair->file, pair->view_identifier->iid); } - nautilus_mime_set_default_action_type_for_uri (pair->file, pair->action_type); - - g_free (uri); + nautilus_mime_set_default_action_type_for_file (pair->file, pair->action_type); } static void diff --git a/libnautilus-extensions/nautilus-program-choosing.c b/libnautilus-extensions/nautilus-program-choosing.c index d3c4f3ddc..b3acd1ab4 100644 --- a/libnautilus-extensions/nautilus-program-choosing.c +++ b/libnautilus-extensions/nautilus-program-choosing.c @@ -40,19 +40,16 @@ static gboolean any_programs_available_for_file (GnomeVFSMimeActionType action_type, NautilusFile *file) { gboolean result; - char *uri; - - uri = nautilus_file_get_uri (file); + + nautilus_mime_actions_wait_for_required_file_attributes (file); if (action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT) { - result = nautilus_mime_has_any_components_for_uri (file); + result = nautilus_mime_has_any_components_for_file (file); } else { g_assert (action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); - result = nautilus_mime_has_any_applications_for_uri (file); + result = nautilus_mime_has_any_applications_for_file (file); } - g_free (uri); - return result; } diff --git a/libnautilus-extensions/nautilus-wait-until-ready.h b/libnautilus-extensions/nautilus-wait-until-ready.h index 640e6c6b1..61ae49254 100644 --- a/libnautilus-extensions/nautilus-wait-until-ready.h +++ b/libnautilus-extensions/nautilus-wait-until-ready.h @@ -33,9 +33,5 @@ * is deprecated! Do not use these calls in new code! */ -GList * nautilus_directory_wait_until_ready (NautilusDirectory *directory, - GList *file_attributes); - - void nautilus_file_wait_until_ready (NautilusFile *file, GList *attributes); diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index eef169ab4..045ca697e 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -2443,8 +2443,10 @@ mime_list_callback (GnomeVFSAsyncHandle *handle, file->details->directory_count_failed = TRUE; nautilus_g_list_free_deep (file->details->mime_list); file->details->mime_list = NULL; + file->details->mime_list_status = NAUTILUS_REQUEST_NOT_STARTED; } else { file->details->got_mime_list = TRUE; + file->details->mime_list_status = NAUTILUS_REQUEST_DONE; } g_free (directory->details->mime_list_uri); diff --git a/libnautilus-private/nautilus-directory.c b/libnautilus-private/nautilus-directory.c index be028c644..904a8f229 100644 --- a/libnautilus-private/nautilus-directory.c +++ b/libnautilus-private/nautilus-directory.c @@ -1180,41 +1180,6 @@ nautilus_directory_call_when_ready (NautilusDirectory *directory, callback, callback_data)); } -typedef struct { - gboolean done; - GList *files_return; -} WaitUntilReadyCallbackData; - -static void -wait_until_ready_callback (NautilusDirectory *directory, - GList *files, - gpointer callback_data) -{ - WaitUntilReadyCallbackData *data; - - data = callback_data; - data->done = TRUE; - data->files_return = nautilus_file_list_copy (files); -} - -GList * -nautilus_directory_wait_until_ready (NautilusDirectory *directory, - GList *file_attributes) -{ - WaitUntilReadyCallbackData data; - - data.done = FALSE; - data.files_return = NULL; - - nautilus_directory_call_when_ready - (directory, file_attributes, - wait_until_ready_callback, &data); - while (!data.done) { - gtk_main_iteration (); - } - - return data.files_return; -} void nautilus_directory_cancel_callback (NautilusDirectory *directory, diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c index 28435c20d..69da59daf 100644 --- a/libnautilus-private/nautilus-file.c +++ b/libnautilus-private/nautilus-file.c @@ -1819,6 +1819,33 @@ nautilus_file_get_uri (NautilusFile *file) NULL); } + + + +char * +nautilus_file_get_uri_scheme (NautilusFile *file) +{ + char *colon; + + g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL); + + if (file->details->directory == NULL || + file->details->directory->details->uri == NULL) { + return NULL; + } + + colon = strchr (file->details->directory->details->uri, ':'); + + if (colon == NULL) { + return NULL; + } + + return g_strndup (file->details->directory->details->uri, + colon - file->details->directory->details->uri); +} + + + /** * nautilus_file_get_date_as_string: * @@ -4289,3 +4316,4 @@ nautilus_self_check_file (void) } #endif /* !NAUTILUS_OMIT_SELF_CHECK */ + diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h index a2d625d00..f22fb55e8 100644 --- a/libnautilus-private/nautilus-file.h +++ b/libnautilus-private/nautilus-file.h @@ -115,6 +115,7 @@ gboolean nautilus_file_check_if_ready (NautilusFile *file, /* Basic attributes for file objects. */ char * nautilus_file_get_name (NautilusFile *file); char * nautilus_file_get_uri (NautilusFile *file); +char * nautilus_file_get_uri_scheme (NautilusFile *file); char * nautilus_file_get_parent_uri (NautilusFile *file); char * nautilus_file_get_parent_uri_for_display (NautilusFile *file); GnomeVFSFileSize nautilus_file_get_size (NautilusFile *file); diff --git a/libnautilus-private/nautilus-mime-actions.c b/libnautilus-private/nautilus-mime-actions.c index 125647a2a..983f2da21 100644 --- a/libnautilus-private/nautilus-mime-actions.c +++ b/libnautilus-private/nautilus-mime-actions.c @@ -51,7 +51,6 @@ static char *extract_prefix_add_suffix (const char const char *separator, const char *suffix); static char *mime_type_get_supertype (const char *mime_type); -static char *uri_string_get_scheme (const char *uri_string); static GList *get_explicit_content_view_iids_from_metafile (NautilusFile *file); static char *make_oaf_query_for_explicit_content_view_iids (GList *view_iids); static char *make_oaf_query_with_known_mime_type (const char *mime_type, @@ -96,22 +95,25 @@ is_known_mime_type (const char *mime_type) return TRUE; } -static void -nautilus_file_wait_for_metadata (NautilusFile *file) + + +static gboolean +nautilus_mime_actions_check_if_required_attributes_ready (NautilusFile *file) { GList *attributes; + gboolean ready; - attributes = NULL; - attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_METADATA); - attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_SLOW_MIME_TYPE); - nautilus_file_wait_until_ready (file, attributes); + attributes = nautilus_mime_actions_get_required_file_attributes (); + ready = nautilus_file_check_if_ready (file, attributes); g_list_free (attributes); + + return ready; } -static void -nautilus_file_wait_for_mime_action_attributes (NautilusFile *file) +GList * +nautilus_mime_actions_get_required_file_attributes () { GList *attributes; @@ -119,21 +121,33 @@ nautilus_file_wait_for_mime_action_attributes (NautilusFile *file) attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_METADATA); attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_SLOW_MIME_TYPE); attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES); - nautilus_file_wait_until_ready (file, attributes); - g_list_free (attributes); + + return attributes; } +void +nautilus_mime_actions_wait_for_required_file_attributes (NautilusFile *file) +{ + GList *attributes; + + attributes = nautilus_mime_actions_get_required_file_attributes (); + + nautilus_file_wait_until_ready (file, attributes); + + g_list_free (attributes); +} GnomeVFSMimeActionType -nautilus_mime_get_default_action_type_for_uri (NautilusFile *file) +nautilus_mime_get_default_action_type_for_file (NautilusFile *file) { char *mime_type; char *action_type_string; GnomeVFSMimeActionType action_type; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_MIME_ACTION_TYPE_NONE); action_type_string = nautilus_file_get_metadata (file, NAUTILUS_METADATA_KEY_DEFAULT_ACTION_TYPE, NULL); @@ -155,18 +169,21 @@ nautilus_mime_get_default_action_type_for_uri (NautilusFile *file) } GnomeVFSMimeAction * -nautilus_mime_get_default_action_for_uri (NautilusFile *file) +nautilus_mime_get_default_action_for_file (NautilusFile *file) { GnomeVFSMimeAction *action; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + action = g_new0 (GnomeVFSMimeAction, 1); - action->action_type = nautilus_mime_get_default_action_type_for_uri (file); + 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_uri (file); + nautilus_mime_get_default_application_for_file (file); if (action->action.application == NULL) { g_free (action); action = NULL; @@ -174,7 +191,7 @@ nautilus_mime_get_default_action_for_uri (NautilusFile *file) break; case GNOME_VFS_MIME_ACTION_TYPE_COMPONENT: action->action.component = - nautilus_mime_get_default_component_for_uri (file); + nautilus_mime_get_default_component_for_file (file); if (action->action.component == NULL) { g_free (action); action = NULL; @@ -192,7 +209,7 @@ nautilus_mime_get_default_action_for_uri (NautilusFile *file) static GnomeVFSMimeApplication * -nautilus_mime_get_default_application_for_uri_internal (NautilusFile *file, +nautilus_mime_get_default_application_for_file_internal (NautilusFile *file, gboolean *user_chosen) { char *mime_type; @@ -200,9 +217,11 @@ nautilus_mime_get_default_application_for_uri_internal (NautilusFile *file, char *default_application_string; gboolean used_user_chosen_info; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + used_user_chosen_info = TRUE; - nautilus_file_wait_for_metadata (file); default_application_string = nautilus_file_get_metadata (file, NAUTILUS_METADATA_KEY_DEFAULT_APPLICATION, NULL); @@ -223,18 +242,18 @@ nautilus_mime_get_default_application_for_uri_internal (NautilusFile *file, } GnomeVFSMimeApplication * -nautilus_mime_get_default_application_for_uri (NautilusFile *file) +nautilus_mime_get_default_application_for_file (NautilusFile *file) { - return nautilus_mime_get_default_application_for_uri_internal (file, NULL); + return nautilus_mime_get_default_application_for_file_internal (file, NULL); } gboolean -nautilus_mime_is_default_application_for_uri_user_chosen (NautilusFile *file) +nautilus_mime_is_default_application_for_file_user_chosen (NautilusFile *file) { GnomeVFSMimeApplication *application; gboolean user_chosen; - application = nautilus_mime_get_default_application_for_uri_internal (file, &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. @@ -250,13 +269,12 @@ nautilus_mime_is_default_application_for_uri_user_chosen (NautilusFile *fil static OAF_ServerInfo * -nautilus_mime_get_default_component_for_uri_internal (NautilusFile *file, +nautilus_mime_get_default_component_for_file_internal (NautilusFile *file, gboolean *user_chosen) { GList *info_list; OAF_ServerInfo *mime_default; char *default_component_string; - char *uri; char *mime_type; char *uri_scheme; GList *item_mime_types; @@ -270,19 +288,17 @@ nautilus_mime_get_default_component_for_uri_internal (NautilusFile *file, GList *p; char *prev; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + used_user_chosen_info = TRUE; CORBA_exception_init (&ev); mime_type = nautilus_file_get_slow_mime_type (file); - uri = nautilus_file_get_uri (file); - - uri_scheme = uri_string_get_scheme (uri); + uri_scheme = nautilus_file_get_uri_scheme (file); - g_free (uri); - - nautilus_file_wait_for_mime_action_attributes (file); explicit_iids = get_explicit_content_view_iids_from_metafile (file); nautilus_file_get_directory_item_mime_types (file, &item_mime_types); @@ -318,7 +334,7 @@ nautilus_mime_get_default_component_for_uri_internal (NautilusFile *file, /* Prefer something from the short list */ - short_list = nautilus_mime_get_short_list_components_for_uri (file); + short_list = nautilus_mime_get_short_list_components_for_file (file); if (short_list != NULL) { sort_conditions[1] = g_strdup ("has (['"); @@ -394,18 +410,18 @@ nautilus_mime_get_default_component_for_uri_internal (NautilusFile *file, OAF_ServerInfo * -nautilus_mime_get_default_component_for_uri (NautilusFile *file) +nautilus_mime_get_default_component_for_file (NautilusFile *file) { - return nautilus_mime_get_default_component_for_uri_internal (file, NULL); + return nautilus_mime_get_default_component_for_file_internal (file, NULL); } gboolean -nautilus_mime_is_default_component_for_uri_user_chosen (NautilusFile *file) +nautilus_mime_is_default_component_for_file_user_chosen (NautilusFile *file) { OAF_ServerInfo *component; gboolean user_chosen; - component = nautilus_mime_get_default_component_for_uri_internal (file, &user_chosen); + component = nautilus_mime_get_default_component_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 component. @@ -421,7 +437,7 @@ nautilus_mime_is_default_component_for_uri_user_chosen (NautilusFile *file) GList * -nautilus_mime_get_short_list_applications_for_uri (NautilusFile *file) +nautilus_mime_get_short_list_applications_for_file (NautilusFile *file) { char *mime_type; GList *result; @@ -432,9 +448,11 @@ nautilus_mime_get_short_list_applications_for_uri (NautilusFile *file) GnomeVFSMimeApplication *application; CORBA_Environment ev; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + CORBA_exception_init (&ev); - nautilus_file_wait_for_metadata (file); metadata_application_add_ids = nautilus_file_get_metadata_list (file, NAUTILUS_METADATA_KEY_SHORT_LIST_APPLICATION_ADD, @@ -474,9 +492,8 @@ nautilus_mime_get_short_list_applications_for_uri (NautilusFile *file) } GList * -nautilus_mime_get_short_list_components_for_uri (NautilusFile *file) +nautilus_mime_get_short_list_components_for_file (NautilusFile *file) { - char *uri; char *mime_type; char *uri_scheme; GList *item_mime_types; @@ -493,15 +510,13 @@ nautilus_mime_get_short_list_components_for_uri (NautilusFile *file) char *extra_requirements; char *prev; - CORBA_exception_init (&ev); - - uri = nautilus_file_get_uri (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); - uri_scheme = uri_string_get_scheme (uri); + CORBA_exception_init (&ev); - g_free (uri); + uri_scheme = nautilus_file_get_uri_scheme (file); - nautilus_file_wait_for_mime_action_attributes (file); explicit_iids = get_explicit_content_view_iids_from_metafile (file); nautilus_file_get_directory_item_mime_types (file, &item_mime_types); @@ -574,12 +589,14 @@ nautilus_mime_get_short_list_components_for_uri (NautilusFile *file) /* FIXME: we should disable this for 1.0 I think */ char * -nautilus_mime_get_short_list_methods_for_uri (NautilusFile *file) +nautilus_mime_get_short_list_methods_for_file (NautilusFile *file) { char *mime_type; const char *method; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + mime_type = nautilus_file_get_slow_mime_type (file); method = gnome_vfs_mime_get_value (mime_type, "vfs-method"); g_free (mime_type); @@ -587,7 +604,7 @@ nautilus_mime_get_short_list_methods_for_uri (NautilusFile *file) } GList * -nautilus_mime_get_all_applications_for_uri (NautilusFile *file) +nautilus_mime_get_all_applications_for_file (NautilusFile *file) { char *mime_type; GList *result; @@ -595,7 +612,9 @@ nautilus_mime_get_all_applications_for_uri (NautilusFile *file) GList *p; GnomeVFSMimeApplication *application; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); + metadata_application_ids = nautilus_file_get_metadata_list (file, NAUTILUS_METADATA_KEY_EXPLICIT_APPLICATION, @@ -622,12 +641,12 @@ nautilus_mime_get_all_applications_for_uri (NautilusFile *file) } gboolean -nautilus_mime_has_any_applications_for_uri (NautilusFile *file) +nautilus_mime_has_any_applications_for_file (NautilusFile *file) { GList *list; gboolean result; - list = nautilus_mime_get_all_applications_for_uri (file); + list = nautilus_mime_get_all_applications_for_file (file); result = list != NULL; gnome_vfs_mime_application_list_free (list); @@ -635,9 +654,8 @@ nautilus_mime_has_any_applications_for_uri (NautilusFile *file) } GList * -nautilus_mime_get_all_components_for_uri (NautilusFile *file) +nautilus_mime_get_all_components_for_file (NautilusFile *file) { - char *uri; char *mime_type; char *uri_scheme; GList *item_mime_types; @@ -645,13 +663,12 @@ nautilus_mime_get_all_components_for_uri (NautilusFile *file) GList *explicit_iids; CORBA_Environment ev; - CORBA_exception_init (&ev); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + NULL); - uri = nautilus_file_get_uri (file); - uri_scheme = uri_string_get_scheme (uri); - g_free (uri); + CORBA_exception_init (&ev); - nautilus_file_wait_for_mime_action_attributes (file); + uri_scheme = nautilus_file_get_uri_scheme (file); mime_type = nautilus_file_get_slow_mime_type (file); explicit_iids = get_explicit_content_view_iids_from_metafile (file); @@ -667,12 +684,12 @@ nautilus_mime_get_all_components_for_uri (NautilusFile *file) } gboolean -nautilus_mime_has_any_components_for_uri (NautilusFile *file) +nautilus_mime_has_any_components_for_file (NautilusFile *file) { GList *list; gboolean result; - list = nautilus_mime_get_all_components_for_uri (file); + list = nautilus_mime_get_all_components_for_file (file); result = list != NULL; gnome_vfs_mime_component_list_free (list); @@ -680,8 +697,8 @@ nautilus_mime_has_any_components_for_uri (NautilusFile *file) } GnomeVFSResult -nautilus_mime_set_default_action_type_for_uri (NautilusFile *file, - GnomeVFSMimeActionType action_type) +nautilus_mime_set_default_action_type_for_file (NautilusFile *file, + GnomeVFSMimeActionType action_type) { const char *action_string; @@ -697,7 +714,6 @@ nautilus_mime_set_default_action_type_for_uri (NautilusFile *file, action_string = "none"; } - nautilus_file_wait_for_metadata (file); nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_DEFAULT_ACTION_TYPE, NULL, action_string); @@ -705,42 +721,46 @@ nautilus_mime_set_default_action_type_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_set_default_application_for_uri (NautilusFile *file, - const char *application_id) +nautilus_mime_set_default_application_for_file (NautilusFile *file, + const char *application_id) { - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); + 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_uri (file) == GNOME_VFS_MIME_ACTION_TYPE_NONE) { - return nautilus_mime_set_default_action_type_for_uri (file, GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); + 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_uri (NautilusFile *file, - const char *component_iid) +nautilus_mime_set_default_component_for_file (NautilusFile *file, + const char *component_iid) { - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_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_uri (file) == GNOME_VFS_MIME_ACTION_TYPE_NONE) { - return nautilus_mime_set_default_action_type_for_uri (file, GNOME_VFS_MIME_ACTION_TYPE_COMPONENT); + 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_uri (NautilusFile *file, - GList *applications) +nautilus_mime_set_short_list_applications_for_file (NautilusFile *file, + GList *applications) { GList *add_list; GList *remove_list; @@ -749,6 +769,9 @@ nautilus_mime_set_short_list_applications_for_uri (NautilusFile *file, GList *p; char *mime_type; + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); + /* get per-mime short list */ mime_type = nautilus_file_get_slow_mime_type (file); @@ -765,7 +788,6 @@ nautilus_mime_set_short_list_applications_for_uri (NautilusFile *file, add_list = str_list_difference (applications, normal_short_list_ids); remove_list = str_list_difference (normal_short_list_ids, applications); - nautilus_file_wait_for_metadata (file); nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_SHORT_LIST_APPLICATION_ADD, @@ -785,8 +807,8 @@ nautilus_mime_set_short_list_applications_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, - GList *components) +nautilus_mime_set_short_list_components_for_file (NautilusFile *file, + GList *components) { GList *add_list; GList *remove_list; @@ -795,8 +817,10 @@ nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, GList *p; char *mime_type; - /* get per-mime short list */ + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); + /* get per-mime short list */ mime_type = nautilus_file_get_slow_mime_type (file); normal_short_list = gnome_vfs_mime_get_short_list_components (mime_type); g_free (mime_type); @@ -811,7 +835,6 @@ nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, add_list = str_list_difference (components, normal_short_list_ids); remove_list = str_list_difference (normal_short_list_ids, components); - nautilus_file_wait_for_metadata (file); nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_SHORT_LIST_COMPONENT_ADD, @@ -831,20 +854,23 @@ nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_add_application_to_short_list_for_uri (NautilusFile *file, - const char *application_id) +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_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); + result = GNOME_VFS_OK; - old_list = nautilus_mime_get_short_list_applications_for_uri (file); + 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_uri (file, new_list); + result = nautilus_mime_set_short_list_applications_for_file (file, new_list); nautilus_g_list_free_deep (new_list); } @@ -854,14 +880,17 @@ nautilus_mime_add_application_to_short_list_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_remove_application_from_short_list_for_uri (NautilusFile *file, - const char *application_id) +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; - old_list = nautilus_mime_get_short_list_applications_for_uri (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_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); @@ -869,7 +898,7 @@ nautilus_mime_remove_application_from_short_list_for_uri (NautilusFile *fil 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_uri (file, new_list); + result = nautilus_mime_set_short_list_applications_for_file (file, new_list); nautilus_g_list_free_deep (new_list); } @@ -879,20 +908,23 @@ nautilus_mime_remove_application_from_short_list_for_uri (NautilusFile *fil } GnomeVFSResult -nautilus_mime_add_component_to_short_list_for_uri (NautilusFile *file, - const char *iid) +nautilus_mime_add_component_to_short_list_for_file (NautilusFile *file, + const char *iid) { GList *old_list, *new_list; GnomeVFSResult result; - old_list = nautilus_mime_get_short_list_components_for_uri (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_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_uri (file, new_list); + result = nautilus_mime_set_short_list_components_for_file (file, new_list); nautilus_g_list_free_deep (new_list); } @@ -902,14 +934,17 @@ nautilus_mime_add_component_to_short_list_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_remove_component_from_short_list_for_uri (NautilusFile *file, - const char *iid) +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; - old_list = nautilus_mime_get_short_list_components_for_uri (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_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); @@ -917,7 +952,7 @@ nautilus_mime_remove_component_from_short_list_for_uri (NautilusFile *file, 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_uri (file, new_list); + result = nautilus_mime_set_short_list_components_for_file (file, new_list); nautilus_g_list_free_deep (new_list); } @@ -927,14 +962,15 @@ nautilus_mime_remove_component_from_short_list_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_extend_all_applications_for_uri (NautilusFile *file, - GList *applications) +nautilus_mime_extend_all_applications_for_file (NautilusFile *file, + GList *applications) { GList *metadata_application_ids; GList *extras; GList *final_applications; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); metadata_application_ids = nautilus_file_get_metadata_list (file, @@ -955,13 +991,14 @@ nautilus_mime_extend_all_applications_for_uri (NautilusFile *file, } GnomeVFSResult -nautilus_mime_remove_from_all_applications_for_uri (NautilusFile *file, - GList *applications) +nautilus_mime_remove_from_all_applications_for_file (NautilusFile *file, + GList *applications) { GList *metadata_application_ids; GList *final_applications; - nautilus_file_wait_for_metadata (file); + g_return_val_if_fail (nautilus_mime_actions_check_if_required_attributes_ready (file), + GNOME_VFS_ERROR_GENERIC); metadata_application_ids = nautilus_file_get_metadata_list (file, @@ -1041,13 +1078,6 @@ mime_type_get_supertype (const char *mime_type) return extract_prefix_add_suffix (mime_type, "/", "/*"); } -static char * -uri_string_get_scheme (const char *uri_string) -{ - return extract_prefix_add_suffix (uri_string, ":", ""); -} - - /* * The following routine uses metadata associated with the current url diff --git a/libnautilus-private/nautilus-mime-actions.h b/libnautilus-private/nautilus-mime-actions.h index b24a6c14f..fd76cd161 100644 --- a/libnautilus-private/nautilus-mime-actions.h +++ b/libnautilus-private/nautilus-mime-actions.h @@ -30,46 +30,50 @@ #include <libnautilus-extensions/nautilus-file.h> +GList *nautilus_mime_actions_get_required_file_attributes (void); -GnomeVFSMimeActionType nautilus_mime_get_default_action_type_for_uri (NautilusFile *file); -GnomeVFSMimeAction * nautilus_mime_get_default_action_for_uri (NautilusFile *file); -GnomeVFSMimeApplication *nautilus_mime_get_default_application_for_uri (NautilusFile *file); -gboolean nautilus_mime_is_default_application_for_uri_user_chosen (NautilusFile *file); -OAF_ServerInfo * nautilus_mime_get_default_component_for_uri (NautilusFile *file); -gboolean nautilus_mime_is_default_component_for_uri_user_chosen (NautilusFile *file); -GList * nautilus_mime_get_short_list_applications_for_uri (NautilusFile *file); -GList * nautilus_mime_get_short_list_components_for_uri (NautilusFile *file); -gchar * nautilus_mime_get_short_list_methods_for_uri (NautilusFile *file); -GList * nautilus_mime_get_all_applications_for_uri (NautilusFile *file); -GList * nautilus_mime_get_all_components_for_uri (NautilusFile *file); -gboolean nautilus_mime_has_any_components_for_uri (NautilusFile *file); -gboolean nautilus_mime_has_any_applications_for_uri (NautilusFile *file); -GnomeVFSResult nautilus_mime_set_default_action_type_for_uri (NautilusFile *file, - GnomeVFSMimeActionType action_type); -GnomeVFSResult nautilus_mime_set_default_application_for_uri (NautilusFile *file, - const char *application_id); -GnomeVFSResult nautilus_mime_set_default_component_for_uri (NautilusFile *file, - const char *component_iid); +void nautilus_mime_actions_wait_for_required_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); +OAF_ServerInfo * nautilus_mime_get_default_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_short_list_components_for_file (NautilusFile *file); +gchar * nautilus_mime_get_short_list_methods_for_file (NautilusFile *file); +GList * nautilus_mime_get_all_applications_for_file (NautilusFile *file); +GList * nautilus_mime_get_all_components_for_file (NautilusFile *file); +gboolean nautilus_mime_has_any_components_for_file (NautilusFile *file); +gboolean nautilus_mime_has_any_applications_for_file (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_uri (NautilusFile *file, - GList *components); -GnomeVFSResult nautilus_mime_add_application_to_short_list_for_uri (NautilusFile *file, - const char *application_id); -GnomeVFSResult nautilus_mime_remove_application_from_short_list_for_uri (NautilusFile *file, - const char *application_id); -GnomeVFSResult nautilus_mime_set_short_list_components_for_uri (NautilusFile *file, - GList *components); -GnomeVFSResult nautilus_mime_add_component_to_short_list_for_uri (NautilusFile *file, - const char *iid); -GnomeVFSResult nautilus_mime_remove_component_from_short_list_for_uri (NautilusFile *file, - const char *iid); +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_uri (NautilusFile *file, - GList *applications); +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_uri (NautilusFile *file, - GList *applications); +GnomeVFSResult nautilus_mime_remove_from_all_applications_for_file (NautilusFile *file, + GList *applications); /* No way to add to all components; oafinfo database assumed trusted in this regard. */ diff --git a/libnautilus-private/nautilus-program-chooser.c b/libnautilus-private/nautilus-program-chooser.c index f00b1db67..3458c78e0 100644 --- a/libnautilus-private/nautilus-program-chooser.c +++ b/libnautilus-private/nautilus-program-chooser.c @@ -310,23 +310,22 @@ repopulate_program_list (GnomeDialog *program_chooser, GtkCList *clist) { char **text; - char *uri; GList *programs, *program; ProgramFilePair *pair; int new_row; GnomeVFSMimeActionType type; + nautilus_mime_actions_wait_for_required_file_attributes (file); + type = nautilus_program_chooser_get_type (program_chooser); g_assert (type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT || type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); - - uri = nautilus_file_get_uri (file); - g_free (uri); + programs = type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT - ? nautilus_mime_get_all_components_for_uri (file) - : nautilus_mime_get_all_applications_for_uri (file); + ? nautilus_mime_get_all_components_for_file (file) + : nautilus_mime_get_all_applications_for_file (file); gtk_clist_clear (clist); @@ -481,19 +480,16 @@ is_component_default_for_type (NautilusViewIdentifier *identifier, const char *m } static gboolean -is_application_default_for_uri (GnomeVFSMimeApplication *application, const char *uri) +is_application_default_for_file (GnomeVFSMimeApplication *application, + NautilusFile *file) { GnomeVFSMimeApplication *default_application; gboolean result; - NautilusFile *file; g_assert (application != NULL); - file = nautilus_file_get (uri); - - default_application = nautilus_mime_get_default_application_for_uri (file); + default_application = nautilus_mime_get_default_application_for_file (file); result = (default_application != NULL && strcmp (default_application->id, application->id) == 0); - nautilus_file_unref (file); gnome_vfs_mime_application_free (default_application); @@ -501,21 +497,18 @@ is_application_default_for_uri (GnomeVFSMimeApplication *application, const char } static gboolean -is_component_default_for_uri (NautilusViewIdentifier *identifier, const char *uri) +is_component_default_for_file (NautilusViewIdentifier *identifier, NautilusFile *file) { OAF_ServerInfo *default_component; gboolean result; - NautilusFile *file; g_assert (identifier != NULL); - file = nautilus_file_get (uri); + nautilus_mime_actions_wait_for_required_file_attributes (file); - default_component = nautilus_mime_get_default_component_for_uri (file); + default_component = nautilus_mime_get_default_component_for_file (file); result = (default_component != NULL && strcmp (default_component->iid, identifier->iid) == 0); - nautilus_file_unref (file); - CORBA_free (default_component); return result; @@ -538,23 +531,19 @@ is_component_in_short_list (NautilusViewIdentifier *identifier, const char *mime } static gboolean -is_component_in_short_list_for_uri (NautilusViewIdentifier *identifier, const char *uri) +is_component_in_short_list_for_file (NautilusViewIdentifier *identifier, + NautilusFile *file) { GList *list; gboolean result; - NautilusFile *file; - - file = nautilus_file_get (uri); - list = nautilus_mime_get_short_list_components_for_uri (file); + list = nautilus_mime_get_short_list_components_for_file (file); result = g_list_find_custom (list, identifier, (GCompareFunc)compare_component_with_view) != NULL; gnome_vfs_mime_component_list_free (list); - nautilus_file_unref (file); - return result; } @@ -575,24 +564,17 @@ is_application_in_short_list (GnomeVFSMimeApplication *application, const char * } static gboolean -is_application_in_short_list_for_uri (GnomeVFSMimeApplication *application, const char *uri) +is_application_in_short_list_for_file (GnomeVFSMimeApplication *application, NautilusFile *file) { GList *list; gboolean result; - NautilusFile *file; - - file = nautilus_file_get (uri); - - list = nautilus_mime_get_short_list_applications_for_uri (file); + list = nautilus_mime_get_short_list_applications_for_file (file); result = g_list_find_custom (list, application, (GCompareFunc)compare_mime_applications) != NULL; gnome_vfs_mime_application_list_free (list); - - - nautilus_file_unref (file); return result; } @@ -626,26 +608,23 @@ program_file_pair_is_default_for_file_type (ProgramFilePair *pair) static gboolean program_file_pair_is_default_for_file (ProgramFilePair *pair) { - char *uri; gboolean result; g_assert (pair != NULL); g_assert (NAUTILUS_IS_FILE (pair->file)); - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); - if (pair->action_type != nautilus_mime_get_default_action_type_for_uri (pair->file)) { + if (pair->action_type != nautilus_mime_get_default_action_type_for_file (pair->file)) { return FALSE; } if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT) { - result = is_component_default_for_uri (pair->view_identifier, uri); + result = is_component_default_for_file (pair->view_identifier, pair->file); } else { - result = is_application_default_for_uri (pair->application, uri); + result = is_application_default_for_file (pair->application, pair->file); } - g_free (uri); - return result; } @@ -674,22 +653,19 @@ program_file_pair_is_in_short_list_for_file_type (ProgramFilePair *pair) static gboolean program_file_pair_is_in_short_list_for_file (ProgramFilePair *pair) { - char *uri; gboolean result; g_assert (pair != NULL); g_assert (NAUTILUS_IS_FILE (pair->file)); - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT) { - result = is_component_in_short_list_for_uri (pair->view_identifier, uri); + result = is_component_in_short_list_for_file (pair->view_identifier, pair->file); } else { - result = is_application_in_short_list_for_uri (pair->application, uri); + result = is_application_in_short_list_for_file (pair->application, pair->file); } - g_free (uri); - return result; } @@ -799,33 +775,25 @@ pack_radio_button (GtkBox *box, const char *label_text, GtkRadioButton *group) static void add_to_short_list_for_file (ProgramFilePair *pair) { - char *uri; - - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { - nautilus_mime_add_application_to_short_list_for_uri (pair->file, pair->application->id); + nautilus_mime_add_application_to_short_list_for_file (pair->file, pair->application->id); } else { - nautilus_mime_add_component_to_short_list_for_uri (pair->file, pair->view_identifier->iid); + nautilus_mime_add_component_to_short_list_for_file (pair->file, pair->view_identifier->iid); } - - g_free (uri); } static void remove_from_short_list_for_file (ProgramFilePair *pair) { - char *uri; - - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { - nautilus_mime_remove_application_from_short_list_for_uri (pair->file, pair->application->id); + nautilus_mime_remove_application_from_short_list_for_file (pair->file, pair->application->id); } else { - nautilus_mime_remove_component_from_short_list_for_uri (pair->file, pair->view_identifier->iid); + nautilus_mime_remove_component_from_short_list_for_file (pair->file, pair->view_identifier->iid); } - - g_free (uri); } static void @@ -883,31 +851,27 @@ remove_default_for_type (ProgramFilePair *pair) static void remove_default_for_item (ProgramFilePair *pair) { - char *uri; + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); - uri = nautilus_file_get_uri (pair->file); - if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { /* If the default is just falling through to the default for this type, * don't do anything here. */ - if (nautilus_mime_is_default_application_for_uri_user_chosen (pair->file)) { - if (is_application_default_for_uri (pair->application, uri)) { - nautilus_mime_set_default_application_for_uri (pair->file, NULL); + if (nautilus_mime_is_default_application_for_file_user_chosen (pair->file)) { + if (is_application_default_for_file (pair->application, pair->file)) { + nautilus_mime_set_default_application_for_file (pair->file, NULL); } } } else { /* If the default is just falling through to the default for this type, * don't do anything here. */ - if (nautilus_mime_is_default_component_for_uri_user_chosen (pair->file)) { - if (is_component_default_for_uri (pair->view_identifier, uri)) { - nautilus_mime_set_default_component_for_uri (pair->file, NULL); + if (nautilus_mime_is_default_component_for_file_user_chosen (pair->file)) { + if (is_component_default_for_file (pair->view_identifier, pair->file)) { + nautilus_mime_set_default_component_for_file (pair->file, NULL); } } } - - g_free (uri); } static void @@ -931,21 +895,15 @@ set_default_for_type (ProgramFilePair *pair) static void set_default_for_item (ProgramFilePair *pair) { - char *uri; - - uri = nautilus_file_get_uri (pair->file); - - uri = nautilus_file_get_uri (pair->file); + nautilus_mime_actions_wait_for_required_file_attributes (pair->file); if (pair->action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION) { - nautilus_mime_set_default_application_for_uri (pair->file, pair->application->id); + nautilus_mime_set_default_application_for_file (pair->file, pair->application->id); } else { - nautilus_mime_set_default_component_for_uri (pair->file, pair->view_identifier->iid); + nautilus_mime_set_default_component_for_file (pair->file, pair->view_identifier->iid); } - nautilus_mime_set_default_action_type_for_uri (pair->file, pair->action_type); - - g_free (uri); + nautilus_mime_set_default_action_type_for_file (pair->file, pair->action_type); } static void diff --git a/libnautilus-private/nautilus-program-choosing.c b/libnautilus-private/nautilus-program-choosing.c index d3c4f3ddc..b3acd1ab4 100644 --- a/libnautilus-private/nautilus-program-choosing.c +++ b/libnautilus-private/nautilus-program-choosing.c @@ -40,19 +40,16 @@ static gboolean any_programs_available_for_file (GnomeVFSMimeActionType action_type, NautilusFile *file) { gboolean result; - char *uri; - - uri = nautilus_file_get_uri (file); + + nautilus_mime_actions_wait_for_required_file_attributes (file); if (action_type == GNOME_VFS_MIME_ACTION_TYPE_COMPONENT) { - result = nautilus_mime_has_any_components_for_uri (file); + result = nautilus_mime_has_any_components_for_file (file); } else { g_assert (action_type == GNOME_VFS_MIME_ACTION_TYPE_APPLICATION); - result = nautilus_mime_has_any_applications_for_uri (file); + result = nautilus_mime_has_any_applications_for_file (file); } - g_free (uri); - return result; } diff --git a/libnautilus-private/nautilus-wait-until-ready.h b/libnautilus-private/nautilus-wait-until-ready.h index 640e6c6b1..61ae49254 100644 --- a/libnautilus-private/nautilus-wait-until-ready.h +++ b/libnautilus-private/nautilus-wait-until-ready.h @@ -33,9 +33,5 @@ * is deprecated! Do not use these calls in new code! */ -GList * nautilus_directory_wait_until_ready (NautilusDirectory *directory, - GList *file_attributes); - - void nautilus_file_wait_until_ready (NautilusFile *file, GList *attributes); diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index bc5a83cab..0b52effeb 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -573,6 +573,8 @@ switch_location_and_view (NautilusViewIdentifier *identifier, file = nautilus_file_get (new_uri); + nautilus_mime_actions_wait_for_required_file_attributes (file); + /* User has explicitly chosen a viewer other than the default, so * make it the default and then switch locations. */ @@ -580,7 +582,7 @@ switch_location_and_view (NautilusViewIdentifier *identifier, * for switching location and viewer together, so we don't have to * rely on metadata for holding the default location. */ - nautilus_mime_set_default_component_for_uri (file, identifier->iid); + nautilus_mime_set_default_component_for_file (file, identifier->iid); nautilus_file_unref (file); @@ -2921,7 +2923,9 @@ create_open_with_gtk_menu (FMDirectoryView *view, GList *files) if (nautilus_g_list_exactly_one_item (files)) { uri = nautilus_file_get_uri (NAUTILUS_FILE (files->data)); - applications = nautilus_mime_get_short_list_applications_for_uri (NAUTILUS_FILE (files->data)); + nautilus_mime_actions_wait_for_required_file_attributes (NAUTILUS_FILE (files->data)); + + applications = nautilus_mime_get_short_list_applications_for_file (NAUTILUS_FILE (files->data)); for (node = applications; node != NULL; node = node->next) { add_application_to_gtk_menu (view, open_with_menu, node->data, uri); } @@ -2936,7 +2940,7 @@ create_open_with_gtk_menu (FMDirectoryView *view, GList *files) nautilus_gtk_menu_append_separator (open_with_menu); - components = nautilus_mime_get_short_list_components_for_uri (NAUTILUS_FILE (files->data)); + components = nautilus_mime_get_short_list_components_for_file (NAUTILUS_FILE (files->data)); for (node = components; node != NULL; node = node->next) { add_component_to_gtk_menu (view, open_with_menu, node->data, uri); } @@ -3187,7 +3191,9 @@ reset_bonobo_open_with_menu (FMDirectoryView *view, GList *selection) if (nautilus_g_list_exactly_one_item (selection)) { uri = nautilus_file_get_uri (NAUTILUS_FILE (selection->data)); - applications = nautilus_mime_get_short_list_applications_for_uri (NAUTILUS_FILE (selection->data)); + nautilus_mime_actions_wait_for_required_file_attributes (NAUTILUS_FILE (selection->data)); + + applications = nautilus_mime_get_short_list_applications_for_file (NAUTILUS_FILE (selection->data)); for (node = applications, index = 0; node != NULL; node = node->next, index++) { add_application_to_bonobo_menu (view, node->data, uri, index); @@ -3195,7 +3201,7 @@ reset_bonobo_open_with_menu (FMDirectoryView *view, GList *selection) gnome_vfs_mime_application_list_free (applications); - components = nautilus_mime_get_short_list_components_for_uri (NAUTILUS_FILE (selection->data)); + components = nautilus_mime_get_short_list_components_for_file (NAUTILUS_FILE (selection->data)); for (node = components, index = 0; node != NULL; node = node->next, index++) { add_component_to_bonobo_menu (view, node->data, uri, index); @@ -3573,8 +3579,10 @@ activate_callback (NautilusFile *file, gpointer callback_data) } if (!performed_special_handling) { - action_type = nautilus_mime_get_default_action_type_for_uri (file); - application = nautilus_mime_get_default_application_for_uri (file); + nautilus_mime_actions_wait_for_required_file_attributes (file); + + action_type = nautilus_mime_get_default_action_type_for_file (file); + application = nautilus_mime_get_default_application_for_file (file); /* We need to check for the case of having * GNOME_VFS_MIME_ACTION_TYPE_APPLICATION as the diff --git a/src/nautilus-applicable-views.c b/src/nautilus-applicable-views.c index 3592faa19..3f2074677 100644 --- a/src/nautilus-applicable-views.c +++ b/src/nautilus-applicable-views.c @@ -116,7 +116,7 @@ got_file_info_callback (NautilusFile *file, goto out; } - default_component = nautilus_mime_get_default_component_for_uri (navinfo->file); + default_component = nautilus_mime_get_default_component_for_file (navinfo->file); if (default_component != NULL) { default_id = nautilus_view_identifier_new_from_content_view (default_component); CORBA_free (default_component); @@ -134,7 +134,7 @@ got_file_info_callback (NautilusFile *file, /* Map GnomeVFSResult to one of the types that Nautilus knows how to handle. */ 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_uri (navinfo->file)); + g_assert (!nautilus_mime_has_any_components_for_file (navinfo->file)); result_code = NAUTILUS_NAVIGATION_RESULT_NO_HANDLER_FOR_TYPE; } @@ -179,9 +179,7 @@ nautilus_navigation_info_new (const char *location, info->file = nautilus_file_get (location); /* Arrange for all the file attributes we will need. */ - attributes = NULL; - attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_SLOW_MIME_TYPE); - attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_METADATA); + attributes = nautilus_mime_actions_get_required_file_attributes (); nautilus_file_call_when_ready (info->file, diff --git a/src/nautilus-information-panel.c b/src/nautilus-information-panel.c index 30e1cad37..f124304d2 100644 --- a/src/nautilus-information-panel.c +++ b/src/nautilus-information-panel.c @@ -77,10 +77,11 @@ struct NautilusSidebarDetails { GtkVBox *button_box; gboolean has_buttons; char *uri; + NautilusFile *file; + guint file_changed_connection; char *default_background_color; char *default_background_image; int selected_index; - NautilusFile *file; gboolean background_connected; int old_width; }; @@ -285,7 +286,12 @@ nautilus_sidebar_destroy (GtkObject *object) gtk_object_unref (GTK_OBJECT (sidebar->details->notebook)); - nautilus_file_unref (sidebar->details->file); + if (sidebar->details->file != NULL) { + gtk_signal_disconnect (GTK_OBJECT (sidebar->details->file), + sidebar->details->file_changed_connection); + nautilus_file_monitor_remove (sidebar->details->file, sidebar); + nautilus_file_unref (sidebar->details->file); + } g_free (sidebar->details->uri); g_free (sidebar->details->default_background_color); @@ -297,6 +303,7 @@ nautilus_sidebar_destroy (GtkObject *object) nautilus_sidebar_theme_changed, sidebar); + NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); } @@ -714,10 +721,6 @@ receive_dropped_keyword (NautilusSidebar *sidebar, int x, int y, GtkSelectionData *selection_data) { - /* FIXME bugzilla.eazel.com 866: Can't expect to read the - * keywords list instantly here. We might need to read the - * metafile first. - */ nautilus_drag_file_receive_dropped_keyword (sidebar->details->file, selection_data->data); /* regenerate the display */ @@ -1150,10 +1153,6 @@ open_with_callback (GtkWidget *button, gpointer ignored) sidebar = NAUTILUS_SIDEBAR (gtk_object_get_user_data (GTK_OBJECT (button))); - /* FIXME bugzilla.eazel.com 866: Can't expect to put this - * window up instantly. We might need to read the metafile - * first. - */ g_return_if_fail (sidebar->details->file != NULL); nautilus_choose_application_for_file @@ -1271,7 +1270,7 @@ add_buttons_from_metadata (NautilusSidebar *sidebar, const char *button_data) * * Update the list of program-launching buttons based on the current uri. */ -void +static void nautilus_sidebar_update_buttons (NautilusSidebar *sidebar) { char *button_data; @@ -1290,7 +1289,7 @@ nautilus_sidebar_update_buttons (NautilusSidebar *sidebar) NAUTILUS_METADATA_KEY_SIDEBAR_BUTTONS, NULL); if (button_data) { - add_buttons_from_metadata(sidebar, button_data); + add_buttons_from_metadata (sidebar, button_data); g_free(button_data); } @@ -1298,9 +1297,9 @@ nautilus_sidebar_update_buttons (NautilusSidebar *sidebar) * unless there aren't any applications at all in complete list. */ - if (nautilus_mime_has_any_applications_for_uri (sidebar->details->file)) { + if (nautilus_mime_has_any_applications_for_file (sidebar->details->file)) { short_application_list = - nautilus_mime_get_short_list_applications_for_uri (sidebar->details->file); + nautilus_mime_get_short_list_applications_for_file (sidebar->details->file); add_command_buttons (sidebar, short_application_list); gnome_vfs_mime_application_list_free (short_application_list); @@ -1314,7 +1313,7 @@ nautilus_sidebar_update_buttons (NautilusSidebar *sidebar) } } -void +static void nautilus_sidebar_update_appearance (NautilusSidebar *sidebar) { NautilusBackground *background; @@ -1388,6 +1387,25 @@ nautilus_sidebar_update_appearance (NautilusSidebar *sidebar) sidebar); } + +static void +nautilus_sidebar_update_all (NautilusSidebar *sidebar) +{ + GList *attributes; + gboolean ready; + + attributes = nautilus_mime_actions_get_required_file_attributes (); + ready = nautilus_file_check_if_ready (sidebar->details->file, attributes); + g_list_free (attributes); + + if (ready) { + nautilus_sidebar_update_appearance (sidebar); + + /* set up the command buttons */ + nautilus_sidebar_update_buttons (sidebar); + } +} + /* here is the key routine that populates the sidebar with the appropriate information when the uri changes */ void @@ -1396,6 +1414,7 @@ nautilus_sidebar_set_uri (NautilusSidebar *sidebar, const char* initial_title) { NautilusFile *file; + GList *attributes; g_return_if_fail (NAUTILUS_IS_SIDEBAR (sidebar)); g_return_if_fail (new_uri != NULL); @@ -1409,22 +1428,36 @@ nautilus_sidebar_set_uri (NautilusSidebar *sidebar, g_free (sidebar->details->uri); sidebar->details->uri = g_strdup (new_uri); - /* FIXME: we should monitor this file's metadata, and avoid - doing any metadata getting until it's ready. */ + if (sidebar->details->file != NULL) { + gtk_signal_disconnect (GTK_OBJECT (sidebar->details->file), + sidebar->details->file_changed_connection); + + nautilus_file_monitor_remove (sidebar->details->file, sidebar); + } + file = nautilus_file_get (sidebar->details->uri); + nautilus_file_unref (sidebar->details->file); + sidebar->details->file = file; - - nautilus_sidebar_update_appearance (sidebar); + + sidebar->details->file_changed_connection = + gtk_signal_connect_object (GTK_OBJECT (sidebar->details->file), + "changed", + nautilus_sidebar_update_all, + GTK_OBJECT (sidebar)); + + attributes = nautilus_mime_actions_get_required_file_attributes (); + nautilus_file_monitor_add (sidebar->details->file, sidebar, attributes); + g_list_free (attributes); + + nautilus_sidebar_update_all (sidebar); /* tell the title widget about it */ nautilus_sidebar_title_set_file (sidebar->details->title, sidebar->details->file, initial_title); - - /* set up the command buttons */ - nautilus_sidebar_update_buttons (sidebar); } void diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index b081b88ef..f6aaa71c5 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -120,6 +120,8 @@ static void nautilus_window_realize (GtkWidget *widget static void update_sidebar_panels_from_preferences (NautilusWindow *window); static void sidebar_panels_changed_callback (gpointer user_data); static void nautilus_window_show (GtkWidget *widget); +static void nautilus_window_real_load_content_view_menu (NautilusFile *file, + gpointer callback_data); NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusWindow, nautilus_window, @@ -550,6 +552,11 @@ nautilus_window_destroy (GtkObject *object) bonobo_object_unref (BONOBO_OBJECT (window->details->shell_ui)); } + /* Cancel the callback for the View As menu update, if any */ + nautilus_file_cancel_call_when_ready (window->details->viewed_file, + nautilus_window_real_load_content_view_menu, + window); + /* Let go of the file for the current location */ nautilus_file_unref (window->details->viewed_file); @@ -871,7 +878,6 @@ static void view_menu_choose_view_callback (GtkWidget *widget, gpointer data) { NautilusWindow *window; - NautilusFile *file; g_return_if_fail (GTK_IS_MENU_ITEM (widget)); g_return_if_fail (NAUTILUS_IS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window"))); @@ -886,19 +892,10 @@ view_menu_choose_view_callback (GtkWidget *widget, gpointer data) */ nautilus_window_synch_content_view_menu (window); - /* FIXME bugzilla.eazel.com 866: Can't expect to put this - * window up instantly. We might need to read the metafile - * first. - */ - file = nautilus_file_get (window->location); - g_return_if_fail (NAUTILUS_IS_FILE (file)); - - nautilus_choose_component_for_file (file, + nautilus_choose_component_for_file (window->details->viewed_file, GTK_WINDOW (window), chose_component_callback, window); - - nautilus_file_unref (file); } static void @@ -912,17 +909,18 @@ view_menu_vfs_method_callback (GtkWidget *widget, gpointer data) g_return_if_fail (NAUTILUS_IS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window"))); window = NAUTILUS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window")); - method = (char *)(gtk_object_get_data (GTK_OBJECT (widget), "method")); + method = (char *) (gtk_object_get_data (GTK_OBJECT (widget), "method")); g_return_if_fail (method); - new_location = g_strdup_printf("%s#%s:/",window->location,method); - nautilus_window_goto_uri(window, new_location); - g_free(new_location); + new_location = g_strdup_printf ("%s#%s:/",window->location,method); + nautilus_window_goto_uri (window, new_location); + g_free (new_location); } -void -nautilus_window_load_content_view_menu (NautilusWindow *window) +static void +nautilus_window_real_load_content_view_menu (NautilusFile *file, + gpointer callback_data) { GList *components; char *method; @@ -930,16 +928,16 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) GtkWidget *new_menu; GtkWidget *menu_item; char *label; - NautilusFile *file; + NautilusWindow *window; + + window = NAUTILUS_WINDOW (callback_data); - g_return_if_fail (NAUTILUS_IS_WINDOW (window)); g_return_if_fail (GTK_IS_OPTION_MENU (window->view_as_option_menu)); new_menu = gtk_menu_new (); - - file = nautilus_file_get (window->location); + /* Add a menu item for each view in the preferred list for this location. */ - components = nautilus_mime_get_short_list_components_for_uri (file); + components = nautilus_mime_get_short_list_components_for_file (window->details->viewed_file); for (p = components; p != NULL; p = p->next) { menu_item = create_content_view_menu_item (window, nautilus_view_identifier_new_from_content_view (p->data)); @@ -952,7 +950,7 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) * one way trip if you choose one of these view menu items, but * it's better than nothing. */ - method = nautilus_mime_get_short_list_methods_for_uri (file); + method = nautilus_mime_get_short_list_methods_for_file (window->details->viewed_file); /* FIXME bugzilla.eazel.com 2466: Name of the function is plural, but it returns only * one item. That must be fixed. */ @@ -995,12 +993,26 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) new_menu); - nautilus_file_unref (file); - nautilus_window_synch_content_view_menu (window); } void +nautilus_window_load_content_view_menu (NautilusWindow *window) +{ + GList *attributes; + + g_return_if_fail (NAUTILUS_IS_WINDOW (window)); + + attributes = nautilus_mime_actions_get_required_file_attributes (); + + /* FIXME: need to cancel this when appropriate... */ + nautilus_file_call_when_ready (window->details->viewed_file, attributes, + nautilus_window_real_load_content_view_menu, window); + + g_list_free (attributes); +} + +void nautilus_window_add_sidebar_panel (NautilusWindow *window, NautilusViewFrame *sidebar_panel) { diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c index b081b88ef..f6aaa71c5 100644 --- a/src/nautilus-object-window.c +++ b/src/nautilus-object-window.c @@ -120,6 +120,8 @@ static void nautilus_window_realize (GtkWidget *widget static void update_sidebar_panels_from_preferences (NautilusWindow *window); static void sidebar_panels_changed_callback (gpointer user_data); static void nautilus_window_show (GtkWidget *widget); +static void nautilus_window_real_load_content_view_menu (NautilusFile *file, + gpointer callback_data); NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusWindow, nautilus_window, @@ -550,6 +552,11 @@ nautilus_window_destroy (GtkObject *object) bonobo_object_unref (BONOBO_OBJECT (window->details->shell_ui)); } + /* Cancel the callback for the View As menu update, if any */ + nautilus_file_cancel_call_when_ready (window->details->viewed_file, + nautilus_window_real_load_content_view_menu, + window); + /* Let go of the file for the current location */ nautilus_file_unref (window->details->viewed_file); @@ -871,7 +878,6 @@ static void view_menu_choose_view_callback (GtkWidget *widget, gpointer data) { NautilusWindow *window; - NautilusFile *file; g_return_if_fail (GTK_IS_MENU_ITEM (widget)); g_return_if_fail (NAUTILUS_IS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window"))); @@ -886,19 +892,10 @@ view_menu_choose_view_callback (GtkWidget *widget, gpointer data) */ nautilus_window_synch_content_view_menu (window); - /* FIXME bugzilla.eazel.com 866: Can't expect to put this - * window up instantly. We might need to read the metafile - * first. - */ - file = nautilus_file_get (window->location); - g_return_if_fail (NAUTILUS_IS_FILE (file)); - - nautilus_choose_component_for_file (file, + nautilus_choose_component_for_file (window->details->viewed_file, GTK_WINDOW (window), chose_component_callback, window); - - nautilus_file_unref (file); } static void @@ -912,17 +909,18 @@ view_menu_vfs_method_callback (GtkWidget *widget, gpointer data) g_return_if_fail (NAUTILUS_IS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window"))); window = NAUTILUS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window")); - method = (char *)(gtk_object_get_data (GTK_OBJECT (widget), "method")); + method = (char *) (gtk_object_get_data (GTK_OBJECT (widget), "method")); g_return_if_fail (method); - new_location = g_strdup_printf("%s#%s:/",window->location,method); - nautilus_window_goto_uri(window, new_location); - g_free(new_location); + new_location = g_strdup_printf ("%s#%s:/",window->location,method); + nautilus_window_goto_uri (window, new_location); + g_free (new_location); } -void -nautilus_window_load_content_view_menu (NautilusWindow *window) +static void +nautilus_window_real_load_content_view_menu (NautilusFile *file, + gpointer callback_data) { GList *components; char *method; @@ -930,16 +928,16 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) GtkWidget *new_menu; GtkWidget *menu_item; char *label; - NautilusFile *file; + NautilusWindow *window; + + window = NAUTILUS_WINDOW (callback_data); - g_return_if_fail (NAUTILUS_IS_WINDOW (window)); g_return_if_fail (GTK_IS_OPTION_MENU (window->view_as_option_menu)); new_menu = gtk_menu_new (); - - file = nautilus_file_get (window->location); + /* Add a menu item for each view in the preferred list for this location. */ - components = nautilus_mime_get_short_list_components_for_uri (file); + components = nautilus_mime_get_short_list_components_for_file (window->details->viewed_file); for (p = components; p != NULL; p = p->next) { menu_item = create_content_view_menu_item (window, nautilus_view_identifier_new_from_content_view (p->data)); @@ -952,7 +950,7 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) * one way trip if you choose one of these view menu items, but * it's better than nothing. */ - method = nautilus_mime_get_short_list_methods_for_uri (file); + method = nautilus_mime_get_short_list_methods_for_file (window->details->viewed_file); /* FIXME bugzilla.eazel.com 2466: Name of the function is plural, but it returns only * one item. That must be fixed. */ @@ -995,12 +993,26 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) new_menu); - nautilus_file_unref (file); - nautilus_window_synch_content_view_menu (window); } void +nautilus_window_load_content_view_menu (NautilusWindow *window) +{ + GList *attributes; + + g_return_if_fail (NAUTILUS_IS_WINDOW (window)); + + attributes = nautilus_mime_actions_get_required_file_attributes (); + + /* FIXME: need to cancel this when appropriate... */ + nautilus_file_call_when_ready (window->details->viewed_file, attributes, + nautilus_window_real_load_content_view_menu, window); + + g_list_free (attributes); +} + +void nautilus_window_add_sidebar_panel (NautilusWindow *window, NautilusViewFrame *sidebar_panel) { diff --git a/src/nautilus-sidebar.c b/src/nautilus-sidebar.c index 30e1cad37..f124304d2 100644 --- a/src/nautilus-sidebar.c +++ b/src/nautilus-sidebar.c @@ -77,10 +77,11 @@ struct NautilusSidebarDetails { GtkVBox *button_box; gboolean has_buttons; char *uri; + NautilusFile *file; + guint file_changed_connection; char *default_background_color; char *default_background_image; int selected_index; - NautilusFile *file; gboolean background_connected; int old_width; }; @@ -285,7 +286,12 @@ nautilus_sidebar_destroy (GtkObject *object) gtk_object_unref (GTK_OBJECT (sidebar->details->notebook)); - nautilus_file_unref (sidebar->details->file); + if (sidebar->details->file != NULL) { + gtk_signal_disconnect (GTK_OBJECT (sidebar->details->file), + sidebar->details->file_changed_connection); + nautilus_file_monitor_remove (sidebar->details->file, sidebar); + nautilus_file_unref (sidebar->details->file); + } g_free (sidebar->details->uri); g_free (sidebar->details->default_background_color); @@ -297,6 +303,7 @@ nautilus_sidebar_destroy (GtkObject *object) nautilus_sidebar_theme_changed, sidebar); + NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); } @@ -714,10 +721,6 @@ receive_dropped_keyword (NautilusSidebar *sidebar, int x, int y, GtkSelectionData *selection_data) { - /* FIXME bugzilla.eazel.com 866: Can't expect to read the - * keywords list instantly here. We might need to read the - * metafile first. - */ nautilus_drag_file_receive_dropped_keyword (sidebar->details->file, selection_data->data); /* regenerate the display */ @@ -1150,10 +1153,6 @@ open_with_callback (GtkWidget *button, gpointer ignored) sidebar = NAUTILUS_SIDEBAR (gtk_object_get_user_data (GTK_OBJECT (button))); - /* FIXME bugzilla.eazel.com 866: Can't expect to put this - * window up instantly. We might need to read the metafile - * first. - */ g_return_if_fail (sidebar->details->file != NULL); nautilus_choose_application_for_file @@ -1271,7 +1270,7 @@ add_buttons_from_metadata (NautilusSidebar *sidebar, const char *button_data) * * Update the list of program-launching buttons based on the current uri. */ -void +static void nautilus_sidebar_update_buttons (NautilusSidebar *sidebar) { char *button_data; @@ -1290,7 +1289,7 @@ nautilus_sidebar_update_buttons (NautilusSidebar *sidebar) NAUTILUS_METADATA_KEY_SIDEBAR_BUTTONS, NULL); if (button_data) { - add_buttons_from_metadata(sidebar, button_data); + add_buttons_from_metadata (sidebar, button_data); g_free(button_data); } @@ -1298,9 +1297,9 @@ nautilus_sidebar_update_buttons (NautilusSidebar *sidebar) * unless there aren't any applications at all in complete list. */ - if (nautilus_mime_has_any_applications_for_uri (sidebar->details->file)) { + if (nautilus_mime_has_any_applications_for_file (sidebar->details->file)) { short_application_list = - nautilus_mime_get_short_list_applications_for_uri (sidebar->details->file); + nautilus_mime_get_short_list_applications_for_file (sidebar->details->file); add_command_buttons (sidebar, short_application_list); gnome_vfs_mime_application_list_free (short_application_list); @@ -1314,7 +1313,7 @@ nautilus_sidebar_update_buttons (NautilusSidebar *sidebar) } } -void +static void nautilus_sidebar_update_appearance (NautilusSidebar *sidebar) { NautilusBackground *background; @@ -1388,6 +1387,25 @@ nautilus_sidebar_update_appearance (NautilusSidebar *sidebar) sidebar); } + +static void +nautilus_sidebar_update_all (NautilusSidebar *sidebar) +{ + GList *attributes; + gboolean ready; + + attributes = nautilus_mime_actions_get_required_file_attributes (); + ready = nautilus_file_check_if_ready (sidebar->details->file, attributes); + g_list_free (attributes); + + if (ready) { + nautilus_sidebar_update_appearance (sidebar); + + /* set up the command buttons */ + nautilus_sidebar_update_buttons (sidebar); + } +} + /* here is the key routine that populates the sidebar with the appropriate information when the uri changes */ void @@ -1396,6 +1414,7 @@ nautilus_sidebar_set_uri (NautilusSidebar *sidebar, const char* initial_title) { NautilusFile *file; + GList *attributes; g_return_if_fail (NAUTILUS_IS_SIDEBAR (sidebar)); g_return_if_fail (new_uri != NULL); @@ -1409,22 +1428,36 @@ nautilus_sidebar_set_uri (NautilusSidebar *sidebar, g_free (sidebar->details->uri); sidebar->details->uri = g_strdup (new_uri); - /* FIXME: we should monitor this file's metadata, and avoid - doing any metadata getting until it's ready. */ + if (sidebar->details->file != NULL) { + gtk_signal_disconnect (GTK_OBJECT (sidebar->details->file), + sidebar->details->file_changed_connection); + + nautilus_file_monitor_remove (sidebar->details->file, sidebar); + } + file = nautilus_file_get (sidebar->details->uri); + nautilus_file_unref (sidebar->details->file); + sidebar->details->file = file; - - nautilus_sidebar_update_appearance (sidebar); + + sidebar->details->file_changed_connection = + gtk_signal_connect_object (GTK_OBJECT (sidebar->details->file), + "changed", + nautilus_sidebar_update_all, + GTK_OBJECT (sidebar)); + + attributes = nautilus_mime_actions_get_required_file_attributes (); + nautilus_file_monitor_add (sidebar->details->file, sidebar, attributes); + g_list_free (attributes); + + nautilus_sidebar_update_all (sidebar); /* tell the title widget about it */ nautilus_sidebar_title_set_file (sidebar->details->title, sidebar->details->file, initial_title); - - /* set up the command buttons */ - nautilus_sidebar_update_buttons (sidebar); } void diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c index b081b88ef..f6aaa71c5 100644 --- a/src/nautilus-spatial-window.c +++ b/src/nautilus-spatial-window.c @@ -120,6 +120,8 @@ static void nautilus_window_realize (GtkWidget *widget static void update_sidebar_panels_from_preferences (NautilusWindow *window); static void sidebar_panels_changed_callback (gpointer user_data); static void nautilus_window_show (GtkWidget *widget); +static void nautilus_window_real_load_content_view_menu (NautilusFile *file, + gpointer callback_data); NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusWindow, nautilus_window, @@ -550,6 +552,11 @@ nautilus_window_destroy (GtkObject *object) bonobo_object_unref (BONOBO_OBJECT (window->details->shell_ui)); } + /* Cancel the callback for the View As menu update, if any */ + nautilus_file_cancel_call_when_ready (window->details->viewed_file, + nautilus_window_real_load_content_view_menu, + window); + /* Let go of the file for the current location */ nautilus_file_unref (window->details->viewed_file); @@ -871,7 +878,6 @@ static void view_menu_choose_view_callback (GtkWidget *widget, gpointer data) { NautilusWindow *window; - NautilusFile *file; g_return_if_fail (GTK_IS_MENU_ITEM (widget)); g_return_if_fail (NAUTILUS_IS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window"))); @@ -886,19 +892,10 @@ view_menu_choose_view_callback (GtkWidget *widget, gpointer data) */ nautilus_window_synch_content_view_menu (window); - /* FIXME bugzilla.eazel.com 866: Can't expect to put this - * window up instantly. We might need to read the metafile - * first. - */ - file = nautilus_file_get (window->location); - g_return_if_fail (NAUTILUS_IS_FILE (file)); - - nautilus_choose_component_for_file (file, + nautilus_choose_component_for_file (window->details->viewed_file, GTK_WINDOW (window), chose_component_callback, window); - - nautilus_file_unref (file); } static void @@ -912,17 +909,18 @@ view_menu_vfs_method_callback (GtkWidget *widget, gpointer data) g_return_if_fail (NAUTILUS_IS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window"))); window = NAUTILUS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window")); - method = (char *)(gtk_object_get_data (GTK_OBJECT (widget), "method")); + method = (char *) (gtk_object_get_data (GTK_OBJECT (widget), "method")); g_return_if_fail (method); - new_location = g_strdup_printf("%s#%s:/",window->location,method); - nautilus_window_goto_uri(window, new_location); - g_free(new_location); + new_location = g_strdup_printf ("%s#%s:/",window->location,method); + nautilus_window_goto_uri (window, new_location); + g_free (new_location); } -void -nautilus_window_load_content_view_menu (NautilusWindow *window) +static void +nautilus_window_real_load_content_view_menu (NautilusFile *file, + gpointer callback_data) { GList *components; char *method; @@ -930,16 +928,16 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) GtkWidget *new_menu; GtkWidget *menu_item; char *label; - NautilusFile *file; + NautilusWindow *window; + + window = NAUTILUS_WINDOW (callback_data); - g_return_if_fail (NAUTILUS_IS_WINDOW (window)); g_return_if_fail (GTK_IS_OPTION_MENU (window->view_as_option_menu)); new_menu = gtk_menu_new (); - - file = nautilus_file_get (window->location); + /* Add a menu item for each view in the preferred list for this location. */ - components = nautilus_mime_get_short_list_components_for_uri (file); + components = nautilus_mime_get_short_list_components_for_file (window->details->viewed_file); for (p = components; p != NULL; p = p->next) { menu_item = create_content_view_menu_item (window, nautilus_view_identifier_new_from_content_view (p->data)); @@ -952,7 +950,7 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) * one way trip if you choose one of these view menu items, but * it's better than nothing. */ - method = nautilus_mime_get_short_list_methods_for_uri (file); + method = nautilus_mime_get_short_list_methods_for_file (window->details->viewed_file); /* FIXME bugzilla.eazel.com 2466: Name of the function is plural, but it returns only * one item. That must be fixed. */ @@ -995,12 +993,26 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) new_menu); - nautilus_file_unref (file); - nautilus_window_synch_content_view_menu (window); } void +nautilus_window_load_content_view_menu (NautilusWindow *window) +{ + GList *attributes; + + g_return_if_fail (NAUTILUS_IS_WINDOW (window)); + + attributes = nautilus_mime_actions_get_required_file_attributes (); + + /* FIXME: need to cancel this when appropriate... */ + nautilus_file_call_when_ready (window->details->viewed_file, attributes, + nautilus_window_real_load_content_view_menu, window); + + g_list_free (attributes); +} + +void nautilus_window_add_sidebar_panel (NautilusWindow *window, NautilusViewFrame *sidebar_panel) { diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c index 4918d95ae..daa9692cc 100644 --- a/src/nautilus-window-manage-views.c +++ b/src/nautilus-window-manage-views.c @@ -1470,7 +1470,7 @@ nautilus_window_set_content_view (NautilusWindow *window, NautilusViewIdentifier file = nautilus_file_get (window->location); g_assert (file != NULL); - nautilus_mime_set_default_component_for_uri + nautilus_mime_set_default_component_for_file (file, id->iid); nautilus_file_unref (file); diff --git a/src/nautilus-window.c b/src/nautilus-window.c index b081b88ef..f6aaa71c5 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -120,6 +120,8 @@ static void nautilus_window_realize (GtkWidget *widget static void update_sidebar_panels_from_preferences (NautilusWindow *window); static void sidebar_panels_changed_callback (gpointer user_data); static void nautilus_window_show (GtkWidget *widget); +static void nautilus_window_real_load_content_view_menu (NautilusFile *file, + gpointer callback_data); NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusWindow, nautilus_window, @@ -550,6 +552,11 @@ nautilus_window_destroy (GtkObject *object) bonobo_object_unref (BONOBO_OBJECT (window->details->shell_ui)); } + /* Cancel the callback for the View As menu update, if any */ + nautilus_file_cancel_call_when_ready (window->details->viewed_file, + nautilus_window_real_load_content_view_menu, + window); + /* Let go of the file for the current location */ nautilus_file_unref (window->details->viewed_file); @@ -871,7 +878,6 @@ static void view_menu_choose_view_callback (GtkWidget *widget, gpointer data) { NautilusWindow *window; - NautilusFile *file; g_return_if_fail (GTK_IS_MENU_ITEM (widget)); g_return_if_fail (NAUTILUS_IS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window"))); @@ -886,19 +892,10 @@ view_menu_choose_view_callback (GtkWidget *widget, gpointer data) */ nautilus_window_synch_content_view_menu (window); - /* FIXME bugzilla.eazel.com 866: Can't expect to put this - * window up instantly. We might need to read the metafile - * first. - */ - file = nautilus_file_get (window->location); - g_return_if_fail (NAUTILUS_IS_FILE (file)); - - nautilus_choose_component_for_file (file, + nautilus_choose_component_for_file (window->details->viewed_file, GTK_WINDOW (window), chose_component_callback, window); - - nautilus_file_unref (file); } static void @@ -912,17 +909,18 @@ view_menu_vfs_method_callback (GtkWidget *widget, gpointer data) g_return_if_fail (NAUTILUS_IS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window"))); window = NAUTILUS_WINDOW (gtk_object_get_data (GTK_OBJECT (widget), "window")); - method = (char *)(gtk_object_get_data (GTK_OBJECT (widget), "method")); + method = (char *) (gtk_object_get_data (GTK_OBJECT (widget), "method")); g_return_if_fail (method); - new_location = g_strdup_printf("%s#%s:/",window->location,method); - nautilus_window_goto_uri(window, new_location); - g_free(new_location); + new_location = g_strdup_printf ("%s#%s:/",window->location,method); + nautilus_window_goto_uri (window, new_location); + g_free (new_location); } -void -nautilus_window_load_content_view_menu (NautilusWindow *window) +static void +nautilus_window_real_load_content_view_menu (NautilusFile *file, + gpointer callback_data) { GList *components; char *method; @@ -930,16 +928,16 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) GtkWidget *new_menu; GtkWidget *menu_item; char *label; - NautilusFile *file; + NautilusWindow *window; + + window = NAUTILUS_WINDOW (callback_data); - g_return_if_fail (NAUTILUS_IS_WINDOW (window)); g_return_if_fail (GTK_IS_OPTION_MENU (window->view_as_option_menu)); new_menu = gtk_menu_new (); - - file = nautilus_file_get (window->location); + /* Add a menu item for each view in the preferred list for this location. */ - components = nautilus_mime_get_short_list_components_for_uri (file); + components = nautilus_mime_get_short_list_components_for_file (window->details->viewed_file); for (p = components; p != NULL; p = p->next) { menu_item = create_content_view_menu_item (window, nautilus_view_identifier_new_from_content_view (p->data)); @@ -952,7 +950,7 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) * one way trip if you choose one of these view menu items, but * it's better than nothing. */ - method = nautilus_mime_get_short_list_methods_for_uri (file); + method = nautilus_mime_get_short_list_methods_for_file (window->details->viewed_file); /* FIXME bugzilla.eazel.com 2466: Name of the function is plural, but it returns only * one item. That must be fixed. */ @@ -995,12 +993,26 @@ nautilus_window_load_content_view_menu (NautilusWindow *window) new_menu); - nautilus_file_unref (file); - nautilus_window_synch_content_view_menu (window); } void +nautilus_window_load_content_view_menu (NautilusWindow *window) +{ + GList *attributes; + + g_return_if_fail (NAUTILUS_IS_WINDOW (window)); + + attributes = nautilus_mime_actions_get_required_file_attributes (); + + /* FIXME: need to cancel this when appropriate... */ + nautilus_file_call_when_ready (window->details->viewed_file, attributes, + nautilus_window_real_load_content_view_menu, window); + + g_list_free (attributes); +} + +void nautilus_window_add_sidebar_panel (NautilusWindow *window, NautilusViewFrame *sidebar_panel) { diff --git a/test/test-nautilus-mime-actions-set.c b/test/test-nautilus-mime-actions-set.c index 226cb4521..00d6b7671 100644 --- a/test/test-nautilus-mime-actions-set.c +++ b/test/test-nautilus-mime-actions-set.c @@ -119,30 +119,32 @@ main (int argc, char **argv) file = nautilus_file_get (uri); + nautilus_mime_actions_wait_for_required_file_attributes (file); + if (strcmp (field, "default_action_type") == 0) { puts ("default_action_type"); - nautilus_mime_set_default_action_type_for_uri (file, str_to_action_type (value)); + nautilus_mime_set_default_action_type_for_file (file, str_to_action_type (value)); } else if (strcmp (field, "default_application") == 0) { puts ("default_application"); - nautilus_mime_set_default_application_for_uri (file, value); + nautilus_mime_set_default_application_for_file (file, value); } else if (strcmp (field, "default_component") == 0) { puts ("default_component"); - nautilus_mime_set_default_component_for_uri (file, value); + nautilus_mime_set_default_component_for_file (file, value); } else if (strcmp (field, "short_list_applicationss") == 0) { puts ("short_list_applications"); - nautilus_mime_set_short_list_applications_for_uri + nautilus_mime_set_short_list_applications_for_file (file, comma_separated_str_to_str_list (value)); } else if (strcmp (field, "short_list_components") == 0) { puts ("short_list_components"); - nautilus_mime_set_short_list_components_for_uri + nautilus_mime_set_short_list_components_for_file (file, comma_separated_str_to_str_list (value)); } else if (strcmp (field, "add_to_all_applicationss") == 0) { puts ("add_to_all_applications"); - nautilus_mime_extend_all_applications_for_uri + nautilus_mime_extend_all_applications_for_file (file, comma_separated_str_to_str_list (value)); } else if (strcmp (field, "remove_from_all_applications") == 0) { puts ("remove_from_all_applications"); - nautilus_mime_remove_from_all_applications_for_uri + nautilus_mime_remove_from_all_applications_for_file (file, comma_separated_str_to_str_list (value)); } else { diff --git a/test/test-nautilus-mime-actions.c b/test/test-nautilus-mime-actions.c index c8d9edb22..2882be790 100644 --- a/test/test-nautilus-mime-actions.c +++ b/test/test-nautilus-mime-actions.c @@ -130,38 +130,40 @@ main (int argc, char **argv) uri = argv[1]; file = nautilus_file_get (uri); + + nautilus_mime_actions_wait_for_required_file_attributes (file); - default_action = nautilus_mime_get_default_action_for_uri (file); + 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_uri (file); + 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_uri (file); + 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_uri (file); + 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_uri (file); + 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_uri (file); + all_applications = nautilus_mime_get_all_applications_for_file (file); puts("All Applications"); print_application_list (all_applications); puts (""); - all_components = nautilus_mime_get_all_components_for_uri (file); + all_components = nautilus_mime_get_all_components_for_file (file); puts("All Components"); print_component_list (all_components); puts (""); |