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