コード例 #1
0
static void
forward_files_changed_cover (NemoDirectory *real_directory,
			     GList *files,
			     gpointer callback_data)
{
	nemo_directory_emit_files_changed (NEMO_DIRECTORY (callback_data), files);
}
コード例 #2
0
static void
monitor_remove_directory (gpointer key,
			  gpointer value,
			  gpointer callback_data)
{
	nemo_directory_file_monitor_remove
		(NEMO_DIRECTORY (callback_data), value);
}
コード例 #3
0
static void
merged_callback_remove_directory_cover (gpointer key,
					gpointer value,
					gpointer callback_data)
{
	merged_callback_remove_directory
		(value, NEMO_DIRECTORY (callback_data));
}
コード例 #4
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static void
call_files_changed_unref_free_list (gpointer key, gpointer value, gpointer user_data)
{
	g_assert (value != NULL);
	g_assert (user_data == NULL);

	call_files_changed_common (NEMO_DIRECTORY (key), value);
	nemo_file_list_free (value);
}
コード例 #5
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static GList *
nemo_directory_moved_internal (GFile *old_location,
				   GFile *new_location)
{
	CollectData collection;
	NemoDirectory *directory;
	GList *node, *affected_files;
	GFile *new_directory_location;
	char *relative_path;

	collection.container = old_location;
	collection.directories = NULL;

	g_hash_table_foreach (directories,
			      collect_directories_by_container,
			      &collection);

	affected_files = NULL;

	for (node = collection.directories; node != NULL; node = node->next) {
		directory = NEMO_DIRECTORY (node->data);
		new_directory_location = NULL;

		if (g_file_equal (directory->details->location, old_location)) {
			new_directory_location = g_object_ref (new_location);
		} else {
			relative_path = g_file_get_relative_path (old_location,
								  directory->details->location);
			if (relative_path != NULL) {
				new_directory_location = g_file_resolve_relative_path (new_location, relative_path);
				g_free (relative_path);
				
			}
		}
		
		if (new_directory_location) {
			change_directory_location (directory, new_directory_location);
			g_object_unref (new_directory_location);
		
			/* Collect affected files. */
			if (directory->details->as_file != NULL) {
				affected_files = g_list_prepend
					(affected_files,
					 nemo_file_ref (directory->details->as_file));
			}
			affected_files = g_list_concat
				(affected_files,
				 nemo_file_list_copy (directory->details->file_list));
		}
		
		nemo_directory_unref (directory);
	}

	g_list_free (collection.directories);

	return affected_files;
}
コード例 #6
0
static void
file_changed (NemoFile *file, NemoSearchDirectory *search)
{
	GList list;

	list.data = file;
	list.next = NULL;

	nemo_directory_emit_files_changed (NEMO_DIRECTORY (search), &list);
}
コード例 #7
0
static void
done_loading_callback (NemoDirectory *real_directory,
		       NemoMergedDirectory *merged)
{
	merged->details->directories_not_done_loading = g_list_remove
		(merged->details->directories_not_done_loading, real_directory);
	if (merged->details->directories_not_done_loading == NULL) {
		nemo_directory_emit_done_loading (NEMO_DIRECTORY (merged));
	}
}
コード例 #8
0
static void
search_engine_hits_added (NemoSearchEngine *engine, GList *hits, 
			  NemoSearchDirectory *search)
{
	GList *hit_list;
	GList *file_list;
	NemoFile *file;
	char *uri;
	SearchMonitor *monitor;
	GList *monitor_list;

	file_list = NULL;

	for (hit_list = hits; hit_list != NULL; hit_list = hit_list->next) {
		uri = hit_list->data;

		if (g_str_has_suffix (uri, NEMO_SAVED_SEARCH_EXTENSION)) {
			/* Never return saved searches themselves as hits */
			continue;
		}
		
		file = nemo_file_get_by_uri (uri);
		
		for (monitor_list = search->details->monitor_list; monitor_list; monitor_list = monitor_list->next) {
			monitor = monitor_list->data;

			/* Add monitors */
			nemo_file_monitor_add (file, monitor, monitor->monitor_attributes);
		}

		g_signal_connect (file, "changed", G_CALLBACK (file_changed), search),

		file_list = g_list_prepend (file_list, file);
	}
	
	search->details->files = g_list_concat (search->details->files, file_list);

	nemo_directory_emit_files_added (NEMO_DIRECTORY (search), file_list);

	file = nemo_directory_get_corresponding_file (NEMO_DIRECTORY (search));
	nemo_file_emit_changed (file);
	nemo_file_unref (file);
}
コード例 #9
0
static void
search_engine_error (NemoSearchEngine *engine, const char *error_message, NemoSearchDirectory *search)
{
	GError *error;

	error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED,
				     error_message);
	nemo_directory_emit_load_error (NEMO_DIRECTORY (search),
					    error);
	g_error_free (error);
}
コード例 #10
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static void
collect_all_directories (gpointer key, gpointer value, gpointer callback_data)
{
	NemoDirectory *directory;
	GList **dirs;

	directory = NEMO_DIRECTORY (value);
	dirs = callback_data;

	*dirs = g_list_prepend (*dirs, nemo_directory_ref (directory));
}
コード例 #11
0
static void
search_callback_invoke_and_destroy (SearchCallback *search_callback)
{
	search_callback->callback (NEMO_DIRECTORY (search_callback->search_directory),
				   search_callback->file_list,
				   search_callback->callback_data);

	search_callback->search_directory->details->callback_list = 
		g_list_remove (search_callback->search_directory->details->callback_list, search_callback);

	search_callback_destroy (search_callback);
}
コード例 #12
0
static void
search_engine_hits_subtracted (NemoSearchEngine *engine, GList *hits, 
			       NemoSearchDirectory *search)
{
	GList *hit_list;
	GList *monitor_list;
	SearchMonitor *monitor;
	GList *file_list;
	char *uri;
	NemoFile *file;

	file_list = NULL;

	for (hit_list = hits; hit_list != NULL; hit_list = hit_list->next) {
		uri = hit_list->data;
		file = nemo_file_get_by_uri (uri);

		for (monitor_list = search->details->monitor_list; monitor_list; 
		     monitor_list = monitor_list->next) {
			monitor = monitor_list->data;
			/* Remove monitors */
			nemo_file_monitor_remove (file, monitor);
		}
		
		g_signal_handlers_disconnect_by_func (file, file_changed, search);

		search->details->files = g_list_remove (search->details->files, file);

		file_list = g_list_prepend (file_list, file);
	}
	
	nemo_directory_emit_files_changed (NEMO_DIRECTORY (search), file_list);

	nemo_file_list_free (file_list);

	file = nemo_directory_get_corresponding_file (NEMO_DIRECTORY (search));
	nemo_file_emit_changed (file);
	nemo_file_unref (file);
}
コード例 #13
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static void
invalidate_one_count (gpointer key, gpointer value, gpointer user_data)
{
	NemoDirectory *directory;

	g_assert (key != NULL);
	g_assert (NEMO_IS_DIRECTORY (value));
	g_assert (user_data == NULL);

	directory = NEMO_DIRECTORY (value);
	
	nemo_directory_invalidate_count_and_mime_list (directory);
}
コード例 #14
0
static void
merged_monitor_destroy (MergedMonitor *monitor)
{
	NemoDesktopDirectory *desktop;

	desktop = monitor->desktop_dir;
	
	/* Call through to the real directory remove calls. */
	nemo_directory_file_monitor_remove (desktop->details->real_directory, monitor);

	nemo_directory_monitor_remove_internal (NEMO_DIRECTORY (desktop), NULL, monitor);
	
	g_free (monitor);
}
コード例 #15
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static void
nemo_directory_finalize (GObject *object)
{
	NemoDirectory *directory;

	directory = NEMO_DIRECTORY (object);

	g_hash_table_remove (directories, directory->details->location);

	nemo_directory_cancel (directory);
	g_assert (directory->details->count_in_progress == NULL);

	if (directory->details->monitor_list != NULL) {
		g_warning ("destroying a NemoDirectory while it's being monitored");
		g_list_free_full (directory->details->monitor_list, g_free);
	}

	if (directory->details->monitor != NULL) {
		nemo_monitor_cancel (directory->details->monitor);
	}

	if (directory->details->dequeue_pending_idle_id != 0) {
		g_source_remove (directory->details->dequeue_pending_idle_id);
	}

	if (directory->details->call_ready_idle_id != 0) {
		g_source_remove (directory->details->call_ready_idle_id);
	}

	if (directory->details->location) {
		g_object_unref (directory->details->location);
	}

	g_assert (directory->details->file_list == NULL);
	g_hash_table_destroy (directory->details->file_hash);

	if (directory->details->hidden_file_hash) {
		g_hash_table_destroy (directory->details->hidden_file_hash);
	}
	
	nemo_file_queue_destroy (directory->details->high_priority_queue);
	nemo_file_queue_destroy (directory->details->low_priority_queue);
	nemo_file_queue_destroy (directory->details->extension_queue);
	g_assert (directory->details->directory_load_in_progress == NULL);
	g_assert (directory->details->count_in_progress == NULL);
	g_assert (directory->details->dequeue_pending_idle_id == 0);
	g_list_free_full (directory->details->pending_file_info, g_object_unref);

	G_OBJECT_CLASS (nemo_directory_parent_class)->finalize (object);
}
コード例 #16
0
static void
monitor_add_directory (gpointer key,
		       gpointer value,
		       gpointer callback_data)
{
	MergedMonitor *monitor;
	
	monitor = value;
	nemo_directory_file_monitor_add
		(NEMO_DIRECTORY (callback_data), monitor,
		 monitor->monitor_hidden_files,
		 monitor->monitor_attributes,
		 forward_files_added_cover, monitor->merged);
}
コード例 #17
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static void
async_state_changed_one (gpointer key, gpointer value, gpointer user_data)
{
	NemoDirectory *directory;

	g_assert (key != NULL);
	g_assert (NEMO_IS_DIRECTORY (value));
	g_assert (user_data == NULL);

	directory = NEMO_DIRECTORY (value);
	
	nemo_directory_async_state_changed (directory);
	emit_change_signals_for_all_files (directory);
}
コード例 #18
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static NemoDirectory *
nemo_directory_new (GFile *location)
{
	NemoDirectory *directory;
	char *uri;

	uri = g_file_get_uri (location);
	
	if (eel_uri_is_desktop (uri)) {
		directory = NEMO_DIRECTORY (g_object_new (NEMO_TYPE_DESKTOP_DIRECTORY, NULL));
	} else if (eel_uri_is_search (uri)) {
		directory = NEMO_DIRECTORY (g_object_new (NEMO_TYPE_SEARCH_DIRECTORY, NULL));
	} else if (g_str_has_suffix (uri, NEMO_SAVED_SEARCH_EXTENSION)) {
		directory = NEMO_DIRECTORY (nemo_search_directory_new_from_saved_search (uri));
	} else {
		directory = NEMO_DIRECTORY (g_object_new (NEMO_TYPE_VFS_DIRECTORY, NULL));
	}

	set_directory_location (directory, location);

	g_free (uri);
	
	return directory;
}
コード例 #19
0
static void
search_engine_finished (NemoSearchEngine *engine, NemoSearchDirectory *search)
{
	search->details->search_finished = TRUE;

	nemo_directory_emit_done_loading (NEMO_DIRECTORY (search));

	/* Add all file callbacks */
	g_list_foreach (search->details->pending_callback_list, 
			(GFunc)search_callback_add_pending_file_callbacks, NULL);
	search->details->callback_list = g_list_concat (search->details->callback_list,
							search->details->pending_callback_list);

	g_list_free (search->details->pending_callback_list);
	search->details->pending_callback_list = NULL;
}
コード例 #20
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
void
emit_change_signals_for_all_files_in_all_directories (void)
{
	GList *dirs, *l;
	NemoDirectory *directory;

	dirs = NULL;
	g_hash_table_foreach (directories,
			      collect_all_directories,
			      &dirs);

	for (l = dirs; l != NULL; l = l->next) {
		directory = NEMO_DIRECTORY (l->data);
		emit_change_signals_for_all_files (directory);
		nemo_directory_unref (directory);
	}

	g_list_free (dirs);
}
コード例 #21
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static void
collect_directories_by_container (gpointer key, gpointer value, gpointer callback_data)
{
	NemoDirectory *directory;
	CollectData *collect_data;
	GFile *location;

	location = (GFile *) key;
	directory = NEMO_DIRECTORY (value);
	collect_data = (CollectData *) callback_data;

	if (g_file_has_prefix (location, collect_data->container) ||
	    g_file_equal (collect_data->container, location)) {
		nemo_directory_ref (directory);
		collect_data->directories =
			g_list_prepend (collect_data->directories,
					directory);
	}
}
コード例 #22
0
static void
merged_callback_check_done (MergedCallback *merged_callback)
{
	/* Check if we are ready. */
	if (merged_callback->non_ready_directories != NULL) {
		return;
	}

	/* Remove from the hash table before sending it. */
	g_hash_table_steal (merged_callback->desktop_dir->details->callbacks, merged_callback);

	/* We are ready, so do the real callback. */
	(* merged_callback->callback) (NEMO_DIRECTORY (merged_callback->desktop_dir),
				       merged_callback->merged_file_list,
				       merged_callback->callback_data);

	/* And we are done. */
	merged_callback_destroy (merged_callback);
}
コード例 #23
0
static GList *
merged_get_file_list (NemoDirectory *directory)
{
	GList *dirs_file_list, *merged_dir_file_list = NULL;
	GList *dir_list;
	GList *cur_node;

	dirs_file_list = NULL;
	dir_list = NEMO_MERGED_DIRECTORY (directory)->details->directories;

	for (cur_node = dir_list; cur_node != NULL; cur_node = cur_node->next) {
		NemoDirectory *cur_dir;

		cur_dir = NEMO_DIRECTORY (cur_node->data);
		dirs_file_list = g_list_concat (dirs_file_list,
						 nemo_directory_get_file_list (cur_dir));
	}

	merged_dir_file_list = NEMO_DIRECTORY_CLASS 
		(nemo_merged_directory_parent_class)->get_file_list (directory);

	return g_list_concat (dirs_file_list, merged_dir_file_list);
}
コード例 #24
0
ファイル: nemo-directory.c プロジェクト: daschuer/nemo
static int
compare_by_uri_cover (gconstpointer a, gconstpointer b)
{
	return compare_by_uri (NEMO_DIRECTORY (a), NEMO_DIRECTORY (b));
}
コード例 #25
0
static void
done_loading_callback (NemoDirectory *real_directory,
		       NemoDesktopDirectory *desktop)
{
     nemo_directory_emit_done_loading (NEMO_DIRECTORY (desktop));
}
コード例 #26
0
static void
desktop_directory_changed_callback (gpointer data)
{
	update_desktop_directory (NEMO_DESKTOP_DIRECTORY (data));
	nemo_directory_force_reload (NEMO_DIRECTORY (data));
}