hello, I'm writing an extension that automatically adds emblems to
user XDG directories (Documents, Music...)
I've quite finished my work, but something strange happens whenever I
launch nautilus for the first time.
the extension is a nautilus-info-provider that does these things:
1. tests if the file is a directory
2. if so tests if the path is equal to the one provided by
g_get_user_special_dir() for each iser XDG dir
3. if so it selects the correct emblems and adds it to the NautilusFileInfo

This is my problem: when I re-launch nautilus the following things are done:
1. the desktop directory is scanned
2. the home directory is scanned
BUT XDG directories in my home are not passed to my extension: only
other dirs: to make things more clear:
- $HOME/Documents is not passed
- $HOME/source is instead passed
if I move back and forward or reopen the home directory XDG dirs are
not passed again
if I hit REFRESH it works, and emblems are added.

I think this is not the correct behaviour.
BTW I'm using nautilus 2.22.3-0ubuntu2

I will attach the source file: the debug is done appending the name of
the scanned files to /tmp/log since I don't know how to output to
.xsession-errors
please tell me if this works for you, or if it has the same behavior
Thanks!
#include <stdio.h>
#include <libnautilus-extension/nautilus-file-info.h>
#include <libnautilus-extension/nautilus-info-provider.h>

static void xdg_emblems_provider_iface_init (NautilusInfoProviderIface *iface);
static void xdg_emblems_cancel_update(NautilusInfoProvider     *provider, NautilusOperationHandle  *handle);
static NautilusOperationResult xdg_emblems_update_file_info(NautilusInfoProvider *provider, NautilusFileInfo *file, GClosure *update_complete, NautilusOperationHandle **handle);

static GType tpp_type = 0;

static void xdg_emblems_provider_iface_init (NautilusInfoProviderIface *iface)
{
	iface->cancel_update = xdg_emblems_cancel_update;
	iface->update_file_info = xdg_emblems_update_file_info;
}

static NautilusOperationResult xdg_emblems_update_file_info(NautilusInfoProvider *provider, NautilusFileInfo *file, GClosure *update_complete, NautilusOperationHandle **handle)
{	
	NautilusFileInfoIface *file_iface = NAUTILUS_FILE_INFO_GET_IFACE(file);
	
	FILE* f = fopen("/tmp/log","a");
	if (f!=NULL)
	{
		char* name = file_iface->get_name(file);
		fprintf(f, "dir=%s\n", name);
		g_free(name);
		fclose(f);
	}

	if (file_iface->is_directory(file))
	{
		const gchar* doc_dir = g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS);
		const gchar* down_dir = g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD);
		const gchar* music_dir = g_get_user_special_dir(G_USER_DIRECTORY_MUSIC);
		const gchar* videos_dir = g_get_user_special_dir(G_USER_DIRECTORY_VIDEOS);
		const gchar* pictures_dir = g_get_user_special_dir(G_USER_DIRECTORY_PICTURES);
		const gchar* shared_dir = g_get_user_special_dir(G_USER_DIRECTORY_PUBLIC_SHARE);
		const gchar* templates_dir = g_get_user_special_dir(G_USER_DIRECTORY_TEMPLATES);
		
		char* uri = file_iface->get_uri(file);
		const char* dir;
		const char* emblem;
		if (g_str_has_prefix(uri, "file://"))
		{
			dir = uri + 7; //  remove file:// 
			
			if (g_str_equal(dir, doc_dir))
				emblem = "documents";
			else if (g_str_equal(dir, down_dir))
				emblem="web";
			else if (g_str_equal(dir, music_dir))
				emblem="sound";
			else if (g_str_equal(dir, videos_dir))
				emblem="multimedia";
			else if (g_str_equal(dir, pictures_dir))
				emblem="pictures";
			else if (g_str_equal(dir, shared_dir))
				emblem="shared";
			else if (g_str_equal(dir, templates_dir))
				emblem="new";
			else
				emblem=NULL;
			
			if (emblem != NULL)
				file_iface->add_emblem(file, emblem);
			
			g_free(uri);
		}
	}
	return NAUTILUS_OPERATION_COMPLETE;
}

static void xdg_emblems_cancel_update(NautilusInfoProvider  *provider, NautilusOperationHandle  *handle)
{
}

void totem_xdg_emblems_plugin_register_type(GTypeModule  *module)
{	
	const GTypeInfo info = {
		sizeof (GObjectClass),
		(GBaseInitFunc) NULL,
		(GBaseFinalizeFunc) NULL,
		(GClassInitFunc) NULL,
		NULL,
		NULL,
		sizeof (GObject),
		0,
		(GInstanceInitFunc) NULL
	};
	const GInterfaceInfo xdg_emblems_provider_iface_info = {
		(GInterfaceInitFunc)xdg_emblems_provider_iface_init,
		NULL,
		NULL
	};

	tpp_type = g_type_module_register_type (module, G_TYPE_OBJECT,
			"TotemXdgEmblemsInfoPlugin",
			&info, 0);
	g_type_module_add_interface (module,
			tpp_type,
			NAUTILUS_TYPE_INFO_PROVIDER,
			&xdg_emblems_provider_iface_info);
}

void nautilus_module_initialize (GTypeModule  *module)
{
	totem_xdg_emblems_plugin_register_type(module);
}

void nautilus_module_shutdown   (void)
{	
}

void nautilus_module_list_types (const GType **types, int          *num_types)
{
	static GType type_list[1];

	type_list[0] = tpp_type;
	*types = type_list;
	*num_types = G_N_ELEMENTS (type_list);
}

Attachment: Makefile
Description: Binary data

--
nautilus-list mailing list
nautilus-list@gnome.org
http://mail.gnome.org/mailman/listinfo/nautilus-list

Reply via email to