static void real_update_query_editor (NautilusWindowSlot *slot) { GtkWidget *query_editor; NautilusQuery *query; NautilusDirectory *directory; NautilusSearchDirectory *search_directory; directory = nautilus_directory_get (slot->location); if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) { search_directory = NAUTILUS_SEARCH_DIRECTORY (directory); query_editor = nautilus_query_editor_new (nautilus_search_directory_is_saved_search (search_directory), nautilus_search_directory_is_indexed (search_directory)); slot->query_editor = NAUTILUS_QUERY_EDITOR (query_editor); nautilus_window_slot_add_extra_location_widget (slot, query_editor); gtk_widget_show (query_editor); g_signal_connect_object (query_editor, "changed", G_CALLBACK (query_editor_changed_callback), slot, 0); query = nautilus_search_directory_get_query (search_directory); if (query != NULL) { nautilus_query_editor_set_query (NAUTILUS_QUERY_EDITOR (query_editor), query); g_object_unref (query); } else { nautilus_query_editor_set_default_query (NAUTILUS_QUERY_EDITOR (query_editor)); } } nautilus_directory_unref (directory); }
int main (int argc, char **argv) { NautilusDirectory *directory; NautilusQuery *query; client1 = g_new0 (int, 1); client2 = g_new0 (int, 1); gtk_init (&argc, &argv); query = nautilus_query_new (); nautilus_query_set_text (query, "richard hult"); directory = nautilus_directory_get_by_uri ("x-nautilus-search://0/"); nautilus_search_directory_set_query (NAUTILUS_SEARCH_DIRECTORY (directory), query); g_object_unref (query); g_signal_connect (directory, "files-added", G_CALLBACK (files_added), NULL); g_signal_connect (directory, "files-changed", G_CALLBACK (files_changed), NULL); g_signal_connect (directory, "done-loading", G_CALLBACK (done_loading), NULL); nautilus_directory_file_monitor_add (directory, client1, TRUE, NAUTILUS_FILE_ATTRIBUTE_INFO, NULL, NULL); gtk_main (); return 0; }
static void search_monitor_remove (NautilusDirectory *directory, gconstpointer client) { NautilusSearchDirectory *search; SearchMonitor *monitor; GList *list; search = NAUTILUS_SEARCH_DIRECTORY (directory); for (list = search->details->monitor_list; list != NULL; list = list->next) { monitor = list->data; if (monitor->client == client) { search->details->monitor_list = g_list_delete_link (search->details->monitor_list, list); search_monitor_destroy (monitor, search); break; } } if (!search->details->monitor_list) { stop_search (search); } }
static void sync_search_directory (NautilusWindowSlot *slot) { NautilusDirectory *directory; NautilusQuery *query; gchar *text; GFile *location; g_assert (NAUTILUS_IS_FILE (slot->viewed_file)); directory = nautilus_directory_get_for_file (slot->viewed_file); g_assert (NAUTILUS_IS_SEARCH_DIRECTORY (directory)); query = nautilus_query_editor_get_query (slot->query_editor); text = nautilus_query_get_text (query); if (!strlen (text)) { location = nautilus_query_editor_get_location (slot->query_editor); slot->load_with_search = TRUE; nautilus_window_slot_open_location (slot, location, 0); g_object_unref (location); } else { nautilus_search_directory_set_query (NAUTILUS_SEARCH_DIRECTORY (directory), query); nautilus_window_slot_reload (slot); } g_free (text); g_object_unref (query); nautilus_directory_unref (directory); }
static void search_cancel_callback (NautilusDirectory *directory, NautilusDirectoryCallback callback, gpointer callback_data) { NautilusSearchDirectory *search; SearchCallback *search_callback; search = NAUTILUS_SEARCH_DIRECTORY (directory); search_callback = search_callback_find (search, callback, callback_data); if (search_callback) { search->details->callback_list = g_list_remove (search->details->callback_list, search_callback); search_callback_destroy (search_callback); goto done; } /* Check for a pending callback */ search_callback = search_callback_find_pending (search, callback, callback_data); if (search_callback) { search->details->pending_callback_list = g_list_remove (search->details->pending_callback_list, search_callback); search_callback_destroy (search_callback); } done: if (!search->details->callback_list && !search->details->pending_callback_list) { stop_search (search); } }
void nautilus_search_directory_file_update_display_name (NautilusSearchDirectoryFile *search_file) { NautilusFile *file; NautilusSearchDirectory *search_dir; NautilusQuery *query; char *display_name; gboolean changed; display_name = NULL; file = NAUTILUS_FILE (search_file); if (file->details->directory) { search_dir = NAUTILUS_SEARCH_DIRECTORY (file->details->directory); query = nautilus_search_directory_get_query (search_dir); if (query != NULL) { display_name = nautilus_query_to_readable_string (query); g_object_unref (query); } } if (display_name == NULL) { display_name = g_strdup (_("Search")); } changed = nautilus_file_set_display_name (file, display_name, NULL, TRUE); if (changed) { nautilus_file_emit_changed (file); } g_free (display_name); }
static void search_monitor_add (NautilusDirectory *directory, gconstpointer client, gboolean monitor_hidden_files, NautilusFileAttributes file_attributes, NautilusDirectoryCallback callback, gpointer callback_data) { GList *list; SearchMonitor *monitor; NautilusSearchDirectory *search; NautilusFile *file; search = NAUTILUS_SEARCH_DIRECTORY (directory); monitor = g_new0 (SearchMonitor, 1); monitor->monitor_hidden_files = monitor_hidden_files; monitor->monitor_attributes = file_attributes; monitor->client = client; search->details->monitor_list = g_list_prepend (search->details->monitor_list, monitor); if (callback != NULL) { (* callback) (directory, search->details->files, callback_data); } for (list = search->details->files; list != NULL; list = list->next) { file = list->data; /* Add monitors */ nautilus_file_monitor_add (file, monitor, file_attributes); } start_search (search); }
static gboolean search_contains_file (NautilusDirectory *directory, NautilusFile *file) { NautilusSearchDirectory *search; search = NAUTILUS_SEARCH_DIRECTORY (directory); return (g_hash_table_lookup (search->details->files_hash, file) != NULL); }
static GList * search_get_file_list (NautilusDirectory *directory) { NautilusSearchDirectory *search; search = NAUTILUS_SEARCH_DIRECTORY (directory); return nautilus_file_list_copy (search->details->files); }
static gboolean search_are_all_files_seen (NautilusDirectory *directory) { NautilusSearchDirectory *search; search = NAUTILUS_SEARCH_DIRECTORY (directory); return (!search->details->query || search->details->search_ready_and_valid); }
static void search_finalize (GObject *object) { NautilusSearchDirectory *search; search = NAUTILUS_SEARCH_DIRECTORY (object); g_hash_table_destroy (search->details->files_hash); G_OBJECT_CLASS (nautilus_search_directory_parent_class)->finalize (object); }
static void search_call_when_ready (NautilusDirectory *directory, NautilusFileAttributes file_attributes, gboolean wait_for_file_list, NautilusDirectoryCallback callback, gpointer callback_data) { NautilusSearchDirectory *search; SearchCallback *search_callback; 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; } search_callback = g_new0 (SearchCallback, 1); search_callback->search_directory = search; search_callback->callback = callback; search_callback->callback_data = callback_data; search_callback->wait_for_attributes = file_attributes; search_callback->wait_for_file_list = wait_for_file_list; if (wait_for_file_list && !search->details->search_ready_and_valid) { /* Add it to the pending callback list, which will be * processed when the directory has valid data from the new * search and all data and signals from previous searchs is removed. */ search->details->pending_callback_list = g_list_prepend (search->details->pending_callback_list, search_callback); /* We might need to start the search engine */ start_search (search); } else { search_callback->file_list = nautilus_file_list_copy (search->details->files); search_callback->non_ready_hash = file_list_to_hash_table (search->details->files); if (!search_callback->non_ready_hash) { /* If there are no ready files, we invoke the callback with an empty list. */ search_callback_invoke_and_destroy (search_callback); } else { search->details->callback_list = g_list_prepend (search->details->callback_list, search_callback); search_callback_add_file_callbacks (search_callback); } } }
static void real_update_query_editor (NautilusWindowSlot *slot) { NautilusDirectory *directory; NautilusSearchDirectory *search_directory; NautilusQuery *query; GtkWidget *query_editor; g_assert (slot->pane->window != NULL); query_editor = NULL; directory = nautilus_directory_get (slot->location); if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) { search_directory = NAUTILUS_SEARCH_DIRECTORY (directory); if (nautilus_search_directory_is_saved_search (search_directory)) { query_editor = nautilus_query_editor_new (TRUE, nautilus_search_directory_is_indexed (search_directory)); } else { query_editor = nautilus_query_editor_new_with_bar (FALSE, nautilus_search_directory_is_indexed (search_directory), slot->pane->window->details->active_pane->active_slot == slot, NAUTILUS_SEARCH_BAR (slot->pane->search_bar), slot); } } slot->query_editor = NAUTILUS_QUERY_EDITOR (query_editor); if (query_editor != NULL) { g_signal_connect_object (query_editor, "changed", G_CALLBACK (query_editor_changed_callback), slot, 0); query = nautilus_search_directory_get_query (search_directory); if (query != NULL) { nautilus_query_editor_set_query (NAUTILUS_QUERY_EDITOR (query_editor), query); g_object_unref (query); } else { nautilus_query_editor_set_default_query (NAUTILUS_QUERY_EDITOR (query_editor)); } nautilus_window_slot_add_extra_location_widget (slot, query_editor); gtk_widget_show (query_editor); nautilus_query_editor_grab_focus (NAUTILUS_QUERY_EDITOR (query_editor)); } nautilus_directory_unref (directory); }
static NautilusRequestStatus search_directory_file_get_deep_counts (NautilusFile *file, guint *directory_count, guint *file_count, guint *unreadable_directory_count, goffset *total_size) { NautilusSearchDirectory *search_dir; NautilusFile *dir_file; GList *file_list, *l; guint dirs, files; GFileType 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 == G_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 void search_force_reload (NautilusDirectory *directory) { NautilusSearchDirectory *search; search = NAUTILUS_SEARCH_DIRECTORY (directory); if (!search->details->query) { return; } search->details->search_ready_and_valid = FALSE; /* Remove file monitors */ reset_file_list (search); stop_search (search); }
static void search_dispose (GObject *object) { NautilusSearchDirectory *search; GList *list; search = NAUTILUS_SEARCH_DIRECTORY (object); clear_base_model (search); /* Remove search monitors */ if (search->details->monitor_list) { for (list = search->details->monitor_list; list != NULL; list = list->next) { search_monitor_destroy ((SearchMonitor *)list->data, search); } g_list_free (search->details->monitor_list); search->details->monitor_list = NULL; } reset_file_list (search); if (search->details->callback_list) { /* Remove callbacks */ g_list_foreach (search->details->callback_list, (GFunc)search_callback_destroy, NULL); g_list_free (search->details->callback_list); search->details->callback_list = NULL; } if (search->details->pending_callback_list) { g_list_foreach (search->details->pending_callback_list, (GFunc)search_callback_destroy, NULL); g_list_free (search->details->pending_callback_list); search->details->pending_callback_list = NULL; } g_clear_object (&search->details->query); stop_search (search); search_disconnect_engine(search); g_clear_object (&search->details->engine); G_OBJECT_CLASS (nautilus_search_directory_parent_class)->dispose (object); }
static void action_search (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkApplication *application = user_data; const gchar *string, *uri; NautilusQuery *query; NautilusDirectory *directory; gchar *search_uri; NautilusWindow *window; GtkWindow *cur_window; GFile *location; g_variant_get (parameter, "(ss)", &uri, &string); if (strlen (string) == 0 || strlen (uri) == 0) { return; } query = nautilus_query_new (); nautilus_query_set_location (query, uri); nautilus_query_set_text (query, string); search_uri = nautilus_search_directory_generate_new_uri (); location = g_file_new_for_uri (search_uri); g_free (search_uri); directory = nautilus_directory_get (location); nautilus_search_directory_set_query (NAUTILUS_SEARCH_DIRECTORY (directory), query); cur_window = gtk_application_get_active_window (application); window = nautilus_application_create_window (NAUTILUS_APPLICATION (application), cur_window ? gtk_window_get_screen (cur_window) : gdk_screen_get_default ()); nautilus_window_slot_open_location (nautilus_window_get_active_slot (window), location, 0); nautilus_directory_unref (directory); g_object_unref (query); g_object_unref (location); }
static void query_editor_changed_callback (NautilusSearchBar *bar, NautilusQuery *query, gboolean reload, NautilusWindowSlot *slot) { NautilusDirectory *directory; directory = nautilus_directory_get_for_file (slot->viewed_file); g_assert (NAUTILUS_IS_SEARCH_DIRECTORY (directory)); nautilus_search_directory_set_query (NAUTILUS_SEARCH_DIRECTORY (directory), query); if (reload) { nautilus_window_slot_reload (slot); } nautilus_directory_unref (directory); }
static void search_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { NautilusSearchDirectory *search = NAUTILUS_SEARCH_DIRECTORY (object); switch (property_id) { case PROP_BASE_MODEL: g_value_set_object (value, nautilus_search_directory_get_base_model (search)); break; case PROP_QUERY: g_value_take_object (value, nautilus_search_directory_get_query (search)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static gboolean search_directory_file_get_item_count (NautilusFile *file, guint *count, gboolean *count_unreadable) { NautilusSearchDirectory *search_dir; GList *file_list; if (count) { search_dir = NAUTILUS_SEARCH_DIRECTORY (file->details->directory); file_list = nautilus_directory_get_file_list (file->details->directory); *count = g_list_length (file_list); nautilus_file_list_free (file_list); } return TRUE; }
static void search_force_reload (NautilusDirectory *directory) { NautilusSearchDirectory *search; NautilusFile *file; search = NAUTILUS_SEARCH_DIRECTORY (directory); if (!search->details->query) { return; } search->details->search_ready_and_valid = FALSE; /* Remove file monitors */ reset_file_list (search); stop_search (search); file = nautilus_directory_get_corresponding_file (directory); nautilus_file_invalidate_all_attributes (file); nautilus_file_unref (file); }
static void update_query_editor (NautilusWindowSlot *slot) { NautilusDirectory *directory; NautilusSearchDirectory *search_directory; directory = nautilus_directory_get (slot->location); if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) { NautilusQuery *query; search_directory = NAUTILUS_SEARCH_DIRECTORY (directory); query = nautilus_search_directory_get_query (search_directory); if (query != NULL) { nautilus_query_editor_set_query (slot->query_editor, query); g_object_unref (query); } } else { nautilus_query_editor_set_location (slot->query_editor, slot->location); } nautilus_directory_unref (directory); }