[nautilus] Support metadata for the virtual desktop icons



commit b8995fce159472dac07666dfb4d7e3ff1412403a
Author: Alexander Larsson <alexl redhat com>
Date:   Mon Jun 29 14:38:40 2009 +0200

    Support metadata for the virtual desktop icons

 .../nautilus-desktop-directory-file.c              |  154 +++++++++++++++++++-
 .../nautilus-desktop-directory-file.h              |   12 ++-
 libnautilus-private/nautilus-desktop-icon-file.c   |   25 +++
 libnautilus-private/nautilus-global-preferences.c  |    2 +
 4 files changed, 191 insertions(+), 2 deletions(-)
---
diff --git a/libnautilus-private/nautilus-desktop-directory-file.c b/libnautilus-private/nautilus-desktop-directory-file.c
index a0cce28..ac541f8 100644
--- a/libnautilus-private/nautilus-desktop-directory-file.c
+++ b/libnautilus-private/nautilus-desktop-directory-file.c
@@ -33,11 +33,15 @@
 #include "nautilus-file-utilities.h"
 #include <eel/eel-glib-extensions.h>
 #include <eel/eel-gtk-macros.h>
+#include <gconf/gconf-client.h>
+#include <gconf/gconf-value.h>
 #include "nautilus-desktop-directory.h"
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <string.h>
 
+#define NAUTILUS_DESKTOP_METADATA_GCONF_PATH "/apps/nautilus/desktop-metadata"
+
 struct NautilusDesktopDirectoryFileDetails {
 	NautilusDesktopDirectory *desktop_directory;
 
@@ -448,6 +452,150 @@ monitor_destroy (gpointer data)
 	g_free (monitor);
 }
 
+static char *
+get_metadata_gconf_path (const char *name,
+			const char *key)
+{
+	return g_build_filename (NAUTILUS_DESKTOP_METADATA_GCONF_PATH, name, key, NULL);
+}
+
+void
+nautilus_desktop_set_metadata_string (NautilusFile *file,
+				      const char *name,
+				      const char *key,
+				      const char *string)
+{
+	GConfClient *client;
+	char *gconf_key;
+
+	client = gconf_client_get_default ();
+	gconf_key = get_metadata_gconf_path (name, key);
+
+	if (string) {
+		gconf_client_set_string (client, gconf_key, string, NULL);
+	} else {
+		gconf_client_unset (client, gconf_key, NULL);
+	}
+
+	g_free (gconf_key);
+	g_object_unref (client);
+
+	if (nautilus_desktop_update_metadata_from_gconf (file, name)) {
+		nautilus_file_changed (file);
+	}
+}
+
+void
+nautilus_desktop_set_metadata_stringv (NautilusFile *file,
+				       const char *name,
+				       const char *key,
+				       char **stringv)
+{
+	GConfClient *client;
+	char *gconf_key;
+	GSList *list;
+	int i;
+
+	client = gconf_client_get_default ();
+	gconf_key = get_metadata_gconf_path (name, key);
+
+	list = NULL;
+	for (i = 0; stringv[i] != NULL; i++) {
+		list = g_slist_prepend (list, stringv[i]);
+	}
+	list = g_slist_reverse (list);
+
+	gconf_client_set_list (client, gconf_key,
+			       GCONF_VALUE_STRING,
+			       list, NULL);
+
+	g_slist_free (list);
+	g_free (gconf_key);
+	g_object_unref (client);
+
+	if (nautilus_desktop_update_metadata_from_gconf (file, name)) {
+		nautilus_file_changed (file);
+	}
+}
+
+gboolean
+nautilus_desktop_update_metadata_from_gconf (NautilusFile *file,
+					     const char *name)
+{
+	GConfClient *client;
+	GSList *entries, *l;
+	char *dir;
+	const char *key;
+	GConfEntry *entry;
+	GConfValue *value;
+	GFileInfo *info;
+	gboolean changed;
+	char *gio_key;
+	GSList *value_list;
+	char **strv;
+	int i;
+
+	client = gconf_client_get_default ();
+
+	dir = get_metadata_gconf_path (name, NULL);
+	entries = gconf_client_all_entries (client, dir, NULL);
+	g_free (dir);
+
+	info = g_file_info_new ();
+
+	for (l = entries; l != NULL; l = l->next) {
+		entry = l->data;
+
+		key = gconf_entry_get_key (entry);
+		value = gconf_entry_get_value (entry);
+
+		key = strrchr (key, '/') + 1;
+
+		gio_key = g_strconcat ("metadata::", key, NULL);
+		if (value->type == GCONF_VALUE_STRING) {
+			g_file_info_set_attribute_string (info, gio_key,
+							  gconf_value_get_string (value));
+		} else if (value->type == GCONF_VALUE_LIST &&
+			   gconf_value_get_list_type (value) == GCONF_VALUE_STRING) {
+			value_list = gconf_value_get_list (value);
+			strv = g_new (char *, g_slist_length (value_list) + 1);
+			for (i = 0; value_list != NULL; i++, value_list = value_list->next) {
+				strv[i] = l->data;
+			}
+			strv[i] = NULL;
+			g_file_info_set_attribute_stringv (info, gio_key, strv);
+			g_free (strv);
+		}
+
+		g_free (gio_key);
+
+		gconf_entry_unref (entry);
+	}
+
+	changed = nautilus_file_update_metadata_from_info (file, info);
+
+	g_object_unref (info);
+	g_object_unref (client);
+
+	return changed;
+}
+
+static void
+nautilus_desktop_directory_file_set_metadata (NautilusFile           *file,
+					      const char             *key,
+					      const char             *value)
+{
+	nautilus_desktop_set_metadata_string (file, "directory", key, value);
+}
+
+static void
+nautilus_desktop_directory_file_set_metadata_as_list (NautilusFile           *file,
+						      const char             *key,
+						      char                  **value)
+{
+	nautilus_desktop_set_metadata_stringv (file, "directory", key, value);
+}
+
 static void
 nautilus_desktop_directory_file_init (gpointer object, gpointer klass)
 {
@@ -473,7 +621,9 @@ nautilus_desktop_directory_file_init (gpointer object, gpointer klass)
 	nautilus_directory_unref (real_dir);
 	
 	desktop_file->details->real_dir_file = real_dir_file;
-	
+
+	nautilus_desktop_update_metadata_from_gconf (NAUTILUS_FILE (desktop_file), "directory");
+
 	g_signal_connect_object (real_dir_file, "changed",
 				 G_CALLBACK (real_file_changed_callback), desktop_file, 0);
 }
@@ -542,4 +692,6 @@ nautilus_desktop_directory_file_class_init (gpointer klass)
 	file_class->get_deep_counts = desktop_directory_file_get_deep_counts;
 	file_class->get_date = desktop_directory_file_get_date;
 	file_class->get_where_string = desktop_directory_file_get_where_string;
+	file_class->set_metadata = nautilus_desktop_directory_file_set_metadata;
+	file_class->set_metadata_as_list = nautilus_desktop_directory_file_set_metadata_as_list;
 }
diff --git a/libnautilus-private/nautilus-desktop-directory-file.h b/libnautilus-private/nautilus-desktop-directory-file.h
index b31a14b..20d4b74 100644
--- a/libnautilus-private/nautilus-desktop-directory-file.h
+++ b/libnautilus-private/nautilus-desktop-directory-file.h
@@ -51,6 +51,16 @@ typedef struct {
 	NautilusFileClass parent_slot;
 } NautilusDesktopDirectoryFileClass;
 
-GType   nautilus_desktop_directory_file_get_type (void);
+GType    nautilus_desktop_directory_file_get_type    (void);
+gboolean nautilus_desktop_update_metadata_from_gconf (NautilusFile  *file,
+						      const char    *name);
+void     nautilus_desktop_set_metadata_string        (NautilusFile  *file,
+						      const char    *name,
+						      const char    *key,
+						      const char    *string);
+void     nautilus_desktop_set_metadata_stringv       (NautilusFile  *file,
+						      const char    *name,
+						      const char    *key,
+						      char         **stringv);
 
 #endif /* NAUTILUS_DESKTOP_DIRECTORY_FILE_H */
diff --git a/libnautilus-private/nautilus-desktop-icon-file.c b/libnautilus-private/nautilus-desktop-icon-file.c
index d3322d3..b5b09db 100644
--- a/libnautilus-private/nautilus-desktop-icon-file.c
+++ b/libnautilus-private/nautilus-desktop-icon-file.c
@@ -26,6 +26,7 @@
 #include <config.h>
 #include "nautilus-desktop-icon-file.h"
 
+#include "nautilus-desktop-directory-file.h"
 #include "nautilus-directory-notify.h"
 #include "nautilus-directory-private.h"
 #include "nautilus-file-attributes.h"
@@ -282,6 +283,8 @@ nautilus_desktop_icon_file_new (NautilusDesktopLink *link)
 
 	update_info_from_link (icon_file);
 
+	nautilus_desktop_update_metadata_from_gconf (file, file->details->name);
+
 	nautilus_directory_add_file (directory, file);
 
 	list.data = file;
@@ -333,7 +336,27 @@ nautilus_desktop_icon_file_eject (NautilusFile *file)
 	}
 }
 
+static void
+nautilus_desktop_icon_file_set_metadata (NautilusFile           *file,
+					 const char             *key,
+					 const char             *value)
+{
+	NautilusDesktopIconFile *desktop_file;
+	
+	desktop_file = NAUTILUS_DESKTOP_ICON_FILE (file);
+	nautilus_desktop_set_metadata_string (file, file->details->name, key, value);
+}
 
+static void
+nautilus_desktop_icon_file_set_metadata_as_list (NautilusFile           *file,
+						 const char             *key,
+						 char                  **value)
+{
+	NautilusDesktopIconFile *desktop_file;
+	
+	desktop_file = NAUTILUS_DESKTOP_ICON_FILE (file);
+	nautilus_desktop_set_metadata_stringv (file, file->details->name, key, value);
+}
 
 static void
 nautilus_desktop_icon_file_class_init (NautilusDesktopIconFileClass *klass)
@@ -355,6 +378,8 @@ nautilus_desktop_icon_file_class_init (NautilusDesktopIconFileClass *klass)
 	file_class->get_deep_counts = desktop_icon_file_get_deep_counts;
 	file_class->get_date = desktop_icon_file_get_date;
 	file_class->get_where_string = desktop_icon_file_get_where_string;
+	file_class->set_metadata = nautilus_desktop_icon_file_set_metadata;
+	file_class->set_metadata_as_list = nautilus_desktop_icon_file_set_metadata_as_list;
 	file_class->unmount = nautilus_desktop_icon_file_unmount;
 	file_class->eject = nautilus_desktop_icon_file_eject;
 
diff --git a/libnautilus-private/nautilus-global-preferences.c b/libnautilus-private/nautilus-global-preferences.c
index b018655..1ea83dc 100644
--- a/libnautilus-private/nautilus-global-preferences.c
+++ b/libnautilus-private/nautilus-global-preferences.c
@@ -845,4 +845,6 @@ nautilus_global_preferences_init (void)
 				 GCONF_CLIENT_PRELOAD_ONELEVEL);
 	eel_gconf_preload_cache ("/apps/nautilus/icon_view",
 				 GCONF_CLIENT_PRELOAD_ONELEVEL);
+	eel_gconf_preload_cache ("/apps/nautilus/desktop-metadata",
+				 GCONF_CLIENT_PRELOAD_RECURSIVE);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]