diff options
-rw-r--r-- | libnautilus-private/nautilus-file.c | 37 | ||||
-rw-r--r-- | libnautilus-private/nautilus-search-directory-file.c | 110 | ||||
-rw-r--r-- | libnautilus-private/nautilus-search-directory.c | 90 | ||||
-rw-r--r-- | libnautilus-private/nautilus-search-engine-beagle.c | 3 | ||||
-rw-r--r-- | src/file-manager/fm-properties-window.c | 9 |
5 files changed, 179 insertions, 70 deletions
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c index 720e8be36..5e23acfaf 100644 --- a/libnautilus-private/nautilus-file.c +++ b/libnautilus-private/nautilus-file.c @@ -76,9 +76,13 @@ #undef NAUTILUS_FILE_DEBUG_REF +#undef NAUTILUS_FILE_DEBUG_REF_VALGRIND -#ifdef NAUTILUS_FILE_DEBUG_REF +#ifdef NAUTILUS_FILE_DEBUG_REF_VALGRIND #include <valgrind/valgrind.h> +#define DEBUG_REF_PRINTF VALGRIND_PRINTF_BACKTRACE +#else +#define DEBUG_REF_PRINTF printf #endif /* Files that start with these characters sort after files that don't. */ @@ -213,8 +217,7 @@ nautilus_file_new_from_relative_uri (NautilusDirectory *directory, file->details->relative_uri = g_strdup (relative_uri); #ifdef NAUTILUS_FILE_DEBUG_REF - if (strcmp (nautilus_file_get_uri (file), "file:///home/andersca/src/gnome/gtk%2B/gtk/gtkbutton.c") == 0) - VALGRIND_PRINTF_BACKTRACE("%10p ref'd", file); + DEBUG_REF_PRINTF("%10p ref'd", file); #endif return file; @@ -322,8 +325,7 @@ nautilus_file_new_from_info (NautilusDirectory *directory, #ifdef NAUTILUS_FILE_DEBUG_REF - if (strcmp (nautilus_file_get_uri (file), "file:///home/andersca/src/gnome/gtk%2B/gtk/gtkbutton.c") == 0) - VALGRIND_PRINTF_BACKTRACE("%10p ref'd", file); + DEBUG_REF_PRINTF("%10p ref'd", file); #endif return file; @@ -407,21 +409,22 @@ nautilus_file_get_internal (const char *uri, gboolean create) file_name = nautilus_directory_get_name_for_self_as_new_file (directory); relative_uri = gnome_vfs_escape_string (file_name); g_free (file_name); - } else if (eel_uri_is_desktop (uri)) { - /* Special case desktop files here. They have no vfs_uri */ - relative_uri_tmp = uri + strlen (EEL_DESKTOP_URI); - while (*relative_uri_tmp == '/') { + } else if (eel_uri_is_desktop (uri) || + eel_uri_is_search (uri)) { + /* Special case virtual methods like desktop and search + files here. They have no vfs_uri. */ + relative_uri_tmp = uri; + /* Skip "method:" */ + while (*relative_uri_tmp != 0 && *relative_uri_tmp != ':') { relative_uri_tmp++; } - relative_uri = strdup (relative_uri_tmp); - } else if (eel_uri_is_search (uri)) { - /* Special case search files as well. */ - relative_uri_tmp = uri + strlen (EEL_SEARCH_URI); + relative_uri_tmp++; + /* Skip initial slashes */ while (*relative_uri_tmp == '/') { relative_uri_tmp++; } relative_uri = strdup (relative_uri_tmp); - } + } } /* Check to see if it's a file that's already known. */ @@ -541,8 +544,7 @@ nautilus_file_ref (NautilusFile *file) g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL); #ifdef NAUTILUS_FILE_DEBUG_REF - if (strcmp (nautilus_file_get_uri (file), "file:///home/andersca/src/gnome/gtk%2B/gtk/gtkbutton.c") == 0) - VALGRIND_PRINTF_BACKTRACE("%10p ref'd", file); + DEBUG_REF_PRINTF("%10p ref'd", file); #endif g_object_ref (file); @@ -559,8 +561,7 @@ nautilus_file_unref (NautilusFile *file) g_return_if_fail (NAUTILUS_IS_FILE (file)); #ifdef NAUTILUS_FILE_DEBUG_REF - if (strcmp (nautilus_file_get_uri (file), "file:///home/andersca/src/gnome/gtk%2B/gtk/gtkbutton.c") == 0) - VALGRIND_PRINTF_BACKTRACE("%10p unref'd", file); + DEBUG_REF_PRINTF("%10p unref'd", file); #endif g_object_unref (file); diff --git a/libnautilus-private/nautilus-search-directory-file.c b/libnautilus-private/nautilus-search-directory-file.c index 1aa9bfa7d..86c077a94 100644 --- a/libnautilus-private/nautilus-search-directory-file.c +++ b/libnautilus-private/nautilus-search-directory-file.c @@ -55,17 +55,15 @@ search_directory_file_monitor_add (NautilusFile *file, gconstpointer client, NautilusFileAttributes attributes) { - nautilus_directory_monitor_add_internal (file->details->directory, - file, client, TRUE, TRUE, - attributes, NULL, NULL); + /* No need for monitoring, we always emit changed when files + are added/removed, and no other metadata changes */ } static void search_directory_file_monitor_remove (NautilusFile *file, gconstpointer client) { - nautilus_directory_monitor_remove_internal (file->details->directory, - file, client); + /* Do nothing here, we don't have any monitors */ } static void @@ -75,10 +73,8 @@ search_directory_file_call_when_ready (NautilusFile *file, gpointer callback_data) { - nautilus_directory_call_when_ready_internal (file->details->directory, - file, file_attributes, - FALSE, NULL, - callback, callback_data); + /* All data for directory-as-file is always uptodate */ + (* callback) (file, callback_data); } static void @@ -94,9 +90,7 @@ static gboolean search_directory_file_check_if_ready (NautilusFile *file, NautilusFileAttributes attributes) { - return nautilus_directory_check_if_ready_internal - (file->details->directory, - file, attributes); + return TRUE; } static GnomeVFSFileType @@ -125,13 +119,103 @@ search_directory_file_get_item_count (NautilusFile *file, return TRUE; } + +static NautilusRequestStatus +search_directory_file_get_deep_counts (NautilusFile *file, + guint *directory_count, + guint *file_count, + guint *unreadable_directory_count, + GnomeVFSFileSize *total_size) +{ + NautilusSearchDirectory *search_dir; + NautilusFile *dir_file; + GList *file_list, *l; + guint dirs, files; + GnomeVFSFileType type; + + search_dir = NAUTILUS_SEARCH_DIRECTORY (file->details->directory); + + file_list = nautilus_directory_get_file_list (file->details->directory); + + dirs = files = 0; + for (l = file_list; l != NULL; l = l->next) { + dir_file = NAUTILUS_FILE (l->data); + type = nautilus_file_get_file_type (dir_file); + if (type == GNOME_VFS_FILE_TYPE_DIRECTORY) { + dirs++; + } else { + files++; + } + } + + if (directory_count != NULL) { + *directory_count = dirs; + } + if (file_count != NULL) { + *file_count = files; + } + if (unreadable_directory_count != NULL) { + *unreadable_directory_count = 0; + } + if (total_size != NULL) { + /* FIXME: Maybe we want to calculate this? */ + *total_size = 0; + } + + nautilus_file_list_free (file_list); + + return NAUTILUS_REQUEST_DONE; +} + +static char * +search_directory_file_get_where_string (NautilusFile *file) +{ + return g_strdup (_("Search")); +} static void nautilus_search_directory_file_init (gpointer object, gpointer klass) { NautilusSearchDirectoryFile *search_file; + NautilusFile *file; + GnomeVFSFileInfo *file_info; search_file = NAUTILUS_SEARCH_DIRECTORY_FILE (object); + file = NAUTILUS_FILE(object); + + file_info = file->details->info = gnome_vfs_file_info_new (); + + file_info->name = g_strdup (_("Search")); + file_info->mime_type = g_strdup ("x-directory/normal"); + file_info->type = GNOME_VFS_FILE_TYPE_DIRECTORY; + file_info->flags = GNOME_VFS_FILE_FLAGS_NONE; + file_info->link_count = 1; + file_info->size = 0; + file_info->permissions = + GNOME_VFS_PERM_OTHER_WRITE | + GNOME_VFS_PERM_GROUP_WRITE | + GNOME_VFS_PERM_USER_READ | + GNOME_VFS_PERM_OTHER_READ | + GNOME_VFS_PERM_GROUP_READ; + + file_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_TYPE | + GNOME_VFS_FILE_INFO_FIELDS_FLAGS | + GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE | + GNOME_VFS_FILE_INFO_FIELDS_SIZE | + GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS | + GNOME_VFS_FILE_INFO_FIELDS_LINK_COUNT; + + file->details->file_info_is_up_to_date = TRUE; + + file->details->display_name = g_strdup (_("Search")); + file->details->custom_icon = NULL; + file->details->activation_uri = NULL; + file->details->got_link_info = TRUE; + file->details->link_info_is_up_to_date = TRUE; + + file->details->directory_count = 0; + file->details->got_directory_count = TRUE; + file->details->directory_count_is_up_to_date = TRUE; } static void @@ -150,4 +234,6 @@ nautilus_search_directory_file_class_init (gpointer klass) file_class->get_file_type = search_directory_file_get_file_type; file_class->check_if_ready = search_directory_file_check_if_ready; file_class->get_item_count = search_directory_file_get_item_count; + file_class->get_deep_counts = search_directory_file_get_deep_counts; + file_class->get_where_string = search_directory_file_get_where_string; } diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c index c17d1009f..953d8affb 100644 --- a/libnautilus-private/nautilus-search-directory.c +++ b/libnautilus-private/nautilus-search-directory.c @@ -39,7 +39,8 @@ struct NautilusSearchDirectoryDetails { NautilusQuery *query; NautilusSearchEngine *engine; - + + gboolean search_running; gboolean search_finished; GList *files; @@ -73,13 +74,12 @@ typedef struct { GNOME_CLASS_BOILERPLATE (NautilusSearchDirectory, nautilus_search_directory, NautilusDirectory, NAUTILUS_TYPE_DIRECTORY) - static void search_engine_hits_added (NautilusSearchEngine *engine, GList *hits, NautilusSearchDirectory *search); static void search_engine_hits_subtracted (NautilusSearchEngine *engine, GList *hits, NautilusSearchDirectory *search); static void search_engine_finished (NautilusSearchEngine *engine, NautilusSearchDirectory *search); static void search_engine_error (NautilusSearchEngine *engine, const char *error, NautilusSearchDirectory *search); static void search_callback_file_ready_callback (NautilusFile *file, gpointer data); - +static void file_changed (NautilusFile *file, NautilusSearchDirectory *search); static void ensure_search_engine (NautilusSearchDirectory *search) @@ -104,6 +104,25 @@ ensure_search_engine (NautilusSearchDirectory *search) static void reset_file_list (NautilusSearchDirectory *search) { + GList *list, *monitor_list; + NautilusFile *file; + SearchMonitor *monitor; + + /* Remove file connections */ + for (list = search->details->files; list != NULL; list = list->next) { + file = list->data; + + /* Disconnect change handler */ + g_signal_handlers_disconnect_by_func (file, file_changed, search); + + /* Remove monitors */ + for (monitor_list = search->details->monitor_list; monitor_list; + monitor_list = monitor_list->next) { + monitor = monitor_list->data; + nautilus_file_monitor_remove (file, monitor); + } + } + nautilus_file_list_free (search->details->files); search->details->files = NULL; } @@ -113,8 +132,11 @@ start_or_stop_search_engine (NautilusSearchDirectory *search, gboolean adding) { if (adding && (search->details->monitor_list || search->details->pending_callback_list) && - search->details->query) { + search->details->query && + !search->details->search_running) { /* We need to start the search engine */ + search->details->search_running = TRUE; + search->details->search_finished = FALSE; ensure_search_engine (search); nautilus_search_engine_set_query (search->details->engine, search->details->query); @@ -123,7 +145,9 @@ start_or_stop_search_engine (NautilusSearchDirectory *search, gboolean adding) nautilus_search_engine_start (search->details->engine); } else if (!adding && !search->details->monitor_list && !search->details->pending_callback_list && - search->details->engine) { + search->details->engine && + search->details->search_running) { + search->details->search_running = FALSE; nautilus_search_engine_stop (search->details->engine); reset_file_list (search); @@ -139,10 +163,7 @@ file_changed (NautilusFile *file, NautilusSearchDirectory *search) list.data = file; list.next = NULL; - if (!g_object_get_data (G_OBJECT (file), "has-tag") || TRUE) - nautilus_directory_emit_files_changed (NAUTILUS_DIRECTORY (search), &list); - - g_object_set_data (G_OBJECT (file), "has-tag", GINT_TO_POINTER (1)); + nautilus_directory_emit_files_changed (NAUTILUS_DIRECTORY (search), &list); } static void @@ -194,7 +215,6 @@ search_monitor_remove_file_monitors (SearchMonitor *monitor, NautilusSearchDirec nautilus_file_monitor_remove (file, monitor); } - } static void @@ -367,7 +387,10 @@ search_call_when_ready (NautilusDirectory *directory, search = NAUTILUS_SEARCH_DIRECTORY (directory); search_callback = search_callback_find (search, callback, callback_data); - + if (search_callback == NULL) { + search_callback = search_callback_find_pending (search, callback, callback_data); + } + if (search_callback) { g_warning ("tried to add a new callback while an old one was pending"); return; @@ -380,7 +403,7 @@ search_call_when_ready (NautilusDirectory *directory, search_callback->wait_for_attributes = file_attributes; search_callback->wait_for_file_list = wait_for_file_list; - if (wait_for_file_list) { + if (wait_for_file_list && !search->details->search_finished) { /* Add it to the pending callback list, which will be * processed when the directory has finished loading */ @@ -526,21 +549,6 @@ search_callback_add_pending_file_callbacks (SearchCallback *callback) } static void -search_remove_file_connections (NautilusSearchDirectory *search) -{ - GList *list; - NautilusFile *file; - - /* Remove file connections */ - for (list = search->details->files; list != NULL; list = list->next) { - file = list->data; - - g_signal_handlers_disconnect_by_func (file, file_changed, search); - } - -} - -static void search_engine_error (NautilusSearchEngine *engine, const char *error_message, NautilusSearchDirectory *search) { nautilus_directory_emit_load_error (NAUTILUS_DIRECTORY (search), @@ -582,17 +590,13 @@ search_force_reload (NautilusDirectory *directory) } /* Remove file monitors */ - g_list_foreach (search->details->monitor_list, - (GFunc)search_monitor_remove_file_monitors, search); - - /* Remove file connections */ - search_remove_file_connections (search); - reset_file_list (search); - - nautilus_search_engine_stop (search->details->engine); - nautilus_search_engine_set_query (search->details->engine, search->details->query); - nautilus_search_engine_start (search->details->engine); + + if (search->details->search_running) { + nautilus_search_engine_stop (search->details->engine); + nautilus_search_engine_set_query (search->details->engine, search->details->query); + nautilus_search_engine_start (search->details->engine); + } } static gboolean @@ -653,7 +657,6 @@ search_dispose (GObject *object) search->details->monitor_list = NULL; } - search_remove_file_connections (search); reset_file_list (search); if (search->details->callback_list) { @@ -672,10 +675,19 @@ search_dispose (GObject *object) } if (search->details->query) { - g_free (search->details->query); + g_object_unref (search->details->query); search->details->query = NULL; } + if (search->details->engine) { + if (search->details->search_running) { + nautilus_search_engine_stop (search->details->engine); + } + + g_object_unref (search->details->engine); + search->details->engine = NULL; + } + G_OBJECT_CLASS (parent_class)->dispose (object); } diff --git a/libnautilus-private/nautilus-search-engine-beagle.c b/libnautilus-private/nautilus-search-engine-beagle.c index fd6576498..4457f3e64 100644 --- a/libnautilus-private/nautilus-search-engine-beagle.c +++ b/libnautilus-private/nautilus-search-engine-beagle.c @@ -54,14 +54,17 @@ finalize (GObject *object) if (beagle->details->current_query) { g_object_unref (beagle->details->current_query); + beagle->details->current_query = NULL; } if (beagle->details->query) { g_object_unref (beagle->details->query); + beagle->details->query = NULL; } if (beagle->details->client) { g_object_unref (beagle->details->client); + beagle->details->client = NULL; } g_free (beagle->details); diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c index b873cf92d..6a921354c 100644 --- a/src/file-manager/fm-properties-window.c +++ b/src/file-manager/fm-properties-window.c @@ -2941,9 +2941,11 @@ create_permissions_page (FMPropertiesWindow *window) file_list = window->details->original_files; - window->details->initial_permissions = get_initial_permissions (window->details->target_files); + window->details->initial_permissions = NULL; if (all_can_get_permissions (file_list)) { + window->details->initial_permissions = get_initial_permissions (window->details->target_files); + if (!all_can_set_permissions (file_list)) { add_prompt_and_separator ( GTK_VBOX (vbox), @@ -3306,6 +3308,11 @@ create_open_with_page (FMPropertiesWindow *window) char *mime_type; uri = nautilus_file_get_uri (get_target_file (window)); + + if (uri == NULL) { + return; + } + mime_type = nautilus_file_get_mime_type (get_target_file (window)); vbox = eel_mime_application_chooser_new (uri, mime_type); |