Integration of gmc and nautilus desktop directories.



This patch is the Nautilus side of things to share the same desktop
directory as gmc does and allow the user to switch between the file
managers (shared nfs, different fms running, different contraints,
etc)

We are shipping this in the upcoming Ximian GNOME release, together
with the gmc patches that accompany it (some gmc pieces are already on
cvs).

This patch does:

	* Reload of desktop directory contents every 4 seconds.

	* Recognizes .desktop files and uses the icon specified in the
          .desktop file to display its contents (you can now browse
          /gnome/share/apps or your control center directory and see
          the icons in there).

	* Uses gnome-metadata to get icons for icons on the
          ~/.gnome-desktop directory (only place where gmc ever set
          icons due to the mem-leaky design of imlib)

	* Handles gmc url files in the desktop 

	* Fix the URL handling in Nautilus, I dont think this was ever
          tested.

	* Updates gnome-metadata for icon screen location on location
          change.

	* Updates gnome-metadata for caption for desktop icons.

	* Converts gmc trash directoy from ~/.gnome-desktop/Trash to
          ~/.gnome-desktop/Trash.gmc (gmc will also do this).

	* Ignores gmc meta objects that have a Nautilus equivalent.

	* Deactivates desktop migration code and deactivates the
          default chaning in nautilus (we have a separate app called
          the doorman which should be in the gnome cvs that handles
          configuring the user's desktop).

Miguel.


Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/nautilus/ChangeLog,v
retrieving revision 1.4180.2.48.2.1
diff -u -r1.4180.2.48.2.1 ChangeLog
--- ChangeLog	2001/04/06 20:07:34	1.4180.2.48.2.1
+++ ChangeLog	2001/04/12 17:20:09
@@ -1,3 +1,56 @@
+2001-04-11  Miguel de Icaza  <miguel ximian com>
+
+	* src/file-manager/fm-icon-view.c
+	(get_stored_icon_position_callback): Try to load position
+	information from GNOME metadata as well.
+	(icon_position_changed_callback): Store metadata changes to the
+	desktop as well.
+
+	* src/nautilus-first-time-druid.c
+	(nautilus_first_time_druid_show): Disable GMC transition page, as
+	we now share the desktop directory and the data files.
+	(druid_finished): Remove desktop link to Eazel services.
+
+	* libnautilus-extensions/nautilus-file.c
+	(nautilus_file_can_rename): Do not allow to rename x-gnome-apps. 
+	(nautilus_file_get_name): Return the translated name of a desktop
+	file instead of the file name.  
+	Handle URL files in .gnome-desktop directories. 
+	(is_special_desktop_gmc_file): New function: Returns true if a
+	file should be hidden from the desktop-directory display (for
+	sharing the directory with gmc).
+	(filter_hidden_and_backup_partition_callback): If we are scanning
+	the desktop directory, hide gmc metadata files or legacy files.
+
+	* libnautilus-extensions/nautilus-directory-async.c
+	(activation_uri_gmc_link_read_callback): Handle GMC link files
+	correctly (skip the prefix "URL: ")
+
+	* libnautilus-extensions/nautilus-icon-factory.c
+	(nautilus_icon_factory_get_icon_for_file): Load icons from the
+	gnome-metadata for files on the ~/.gnome-desktop directory.
+	(nautilus_icon_factory_get_icon_for_file): Load icons for GNOME
+	.desktop files.
+
+2001-04-10  Miguel de Icaza  <miguel ximian com>
+
+	* libnautilus-extensions/nautilus-file-utilities.c
+	(DESKTOP_DIRECTORY_NAME): Make it .gnome-desktop.
+	(nautilus_get_desktop_directory): Modified to make the nautilus
+	home directory be the normal one.
+
+2001-04-09  Miguel de Icaza  <miguel ximian com>
+
+	* src/file-manager/fm-desktop-icon-view.c: Eliminated all over the
+	place the loading of the desktop_directory directory from the
+	nautilus api call, and instead just load this value once.
+
+2001-04-11  Miguel de Icaza  <miguel ximian com>
+
+	* libnautilus-extensions/nautilus-directory-async.c
+	(activation_uri_gmc_link_read_callback): Handle correctly gmc URL
+	links. 
+
 2001-04-06  Robin * Slomkowski  <rslomkow eazel com>
 
 	* components/music/Makefile.am: added non-x86 files to EXTRA_DISTS
Index: libnautilus-extensions/nautilus-directory-async.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-extensions/nautilus-directory-async.c,v
retrieving revision 1.145
diff -u -r1.145 nautilus-directory-async.c
--- libnautilus-extensions/nautilus-directory-async.c	2001/03/02 18:18:13	1.145
+++ libnautilus-extensions/nautilus-directory-async.c	2001/04/12 17:20:12
@@ -3159,7 +3159,7 @@
 	}
 
 	g_free (file_contents);
-	activation_uri_read_done (directory, uri);
+	activation_uri_read_done (directory, uri ? uri + 5 : NULL);
 	g_free (uri);
 }
 
Index: libnautilus-extensions/nautilus-file-utilities.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-extensions/nautilus-file-utilities.c,v
retrieving revision 1.90.2.1
diff -u -r1.90.2.1 nautilus-file-utilities.c
--- libnautilus-extensions/nautilus-file-utilities.c	2001/03/10 02:24:15	1.90.2.1
+++ libnautilus-extensions/nautilus-file-utilities.c	2001/04/12 17:20:13
@@ -50,7 +50,7 @@
 #define NAUTILUS_USER_DIRECTORY_NAME ".nautilus"
 #define DEFAULT_NAUTILUS_DIRECTORY_MODE (0755)
 
-#define DESKTOP_DIRECTORY_NAME "desktop"
+#define DESKTOP_DIRECTORY_NAME ".gnome-desktop"
 #define DEFAULT_DESKTOP_DIRECTORY_MODE (0755)
 
 #define NAUTILUS_USER_MAIN_DIRECTORY_NAME "Nautilus"
@@ -930,7 +930,7 @@
 	char *desktop_directory, *user_directory;
 
 	user_directory = nautilus_get_user_directory ();
-	desktop_directory = nautilus_make_path (user_directory, DESKTOP_DIRECTORY_NAME);
+	desktop_directory = nautilus_make_path (g_get_home_dir (), DESKTOP_DIRECTORY_NAME);
 	g_free (user_directory);
 
 	if (!g_file_exists (desktop_directory)) {
Index: libnautilus-extensions/nautilus-file.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-extensions/nautilus-file.c,v
retrieving revision 1.229
diff -u -r1.229 nautilus-file.c
--- libnautilus-extensions/nautilus-file.c	2001/03/03 01:46:59	1.229
+++ libnautilus-extensions/nautilus-file.c	2001/04/12 17:20:14
@@ -40,6 +40,7 @@
 #include "nautilus-trash-directory.h"
 #include "nautilus-trash-file.h"
 #include "nautilus-vfs-file.h"
+#include "nautilus-metadata.h"
 #include <ctype.h>
 #include <gnome-xml/parser.h>
 #include <grp.h>
@@ -48,6 +49,7 @@
 #include <libgnome/gnome-i18n.h>
 #include <libgnome/gnome-mime-info.h>
 #include <libgnome/gnome-mime.h>
+#include <libgnome/gnome-dentry.h>
 #include <libgnomevfs/gnome-vfs-file-info.h>
 #include <libgnomevfs/gnome-vfs-mime-handlers.h>
 #include <libgnomevfs/gnome-vfs-mime-info.h>
@@ -732,6 +734,9 @@
 		return FALSE;
 	}
 
+	if (nautilus_file_is_mime_type (file, "application/x-gnome-app-info"))
+		return FALSE;
+	
 	can_rename = TRUE;
 	uri = nautilus_file_get_uri (file);
 	path = gnome_vfs_get_local_path_from_uri (uri);
@@ -941,6 +946,26 @@
 	g_return_if_fail (new_name != NULL);
 	g_return_if_fail (callback != NULL);
 
+	if (nautilus_file_is_local && nautilus_file_is_gmc_url (file)){
+		char *uri, *path;
+
+		uri = nautilus_file_get_uri (file);
+		path = gnome_vfs_get_local_path_from_uri (uri);
+
+		if (path){
+			gnome_metadata_set (path, "icon-caption", strlen (new_name)+1, new_name);
+		}
+
+		g_free (path);
+		g_free (uri);
+
+		(*callback) (file, GNOME_VFS_OK, callback_data);
+			
+		nautilus_file_changed (file);
+		
+		return;
+	}
+	
 	 /* Make return an error for incoming names containing path separators. */
 	 if (strstr (new_name, "/") != NULL) {
 		(* callback) (file, GNOME_VFS_ERROR_NOT_PERMITTED, callback_data);
@@ -1848,6 +1873,72 @@
 } NautilusFileFilterOptions;
 
 static gboolean
+is_special_desktop_gmc_file (NautilusFile *file)
+{
+	static char *home_dir;
+	static int home_dir_len;
+	char buffer [1024];
+
+	if (!nautilus_file_is_local (file))
+		return FALSE;
+	
+	if (strcmp (file->details->relative_uri, "Trash.gmc") == 0)
+		return TRUE;
+
+	if (nautilus_file_is_symbolic_link (file)){
+		/*
+		 * You would think that
+		 * nautilus_file_get_symbolic_link_target_path would
+		 * be useful here, but you would be wrong.  The
+		 * information kept around by NautilusFile is not
+		 * available right now, and I I have no clue how to
+		 * fix this.  On top of that, inode/device are not
+		 * stored, so it is not possible to see if a link is a
+		 * symlink to the home directory.  sigh.
+		 */
+		char *uri, *path;
+		int s;
+
+		uri = nautilus_file_get_uri (file);
+		path = gnome_vfs_get_local_path_from_uri (uri);
+		s = readlink (path, buffer, sizeof (buffer)-1);
+		g_free (path);
+		g_free (uri);
+
+		if (s == -1)
+			return FALSE;
+
+		buffer [s] = 0;
+		
+		if (!home_dir){
+			home_dir = g_strdup (g_get_home_dir ());
+			home_dir_len = strlen (home_dir);
+			
+			if (home_dir && home_dir [home_dir_len-1] == '/'){
+				home_dir [home_dir_len-1] = 0;
+				home_dir_len--;
+			}
+			
+		}
+		if (home_dir){
+			if (strncmp (home_dir, buffer, home_dir_len) == 0)
+				return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+gboolean
+nautilus_file_is_in_desktop (NautilusFile *file)
+{
+	/*
+	 * This handles visiting other people's desktops, but it can arguably
+	 * be said that this might break and that we should lookup the passwd table.
+	 */
+	return strstr (file->details->directory->details->uri, "/.gnome-desktop") != NULL;
+}
+
+static gboolean
 filter_hidden_and_backup_partition_callback (gpointer data,
 					     gpointer callback_data)
 {
@@ -1857,6 +1948,10 @@
 	file = NAUTILUS_FILE (data);
 	options = (NautilusFileFilterOptions) callback_data;
 
+	if (nautilus_file_is_in_desktop (file) && is_special_desktop_gmc_file (file)){
+			return FALSE;
+	}
+	
 	return nautilus_file_should_show (file, 
 					  options & SHOW_HIDDEN,
 					  options & SHOW_BACKUP);
@@ -1951,6 +2046,25 @@
 	g_return_if_fail (key != NULL);
 	g_return_if_fail (key[0] != '\0');
 
+	if (strcmp (key, NAUTILUS_METADATA_KEY_CUSTOM_ICON) == 0){
+		if (nautilus_file_is_in_desktop (file) &&
+		    nautilus_file_is_local (file)){
+			char *icon_path;
+			char *local_path;
+			char *local_uri;
+
+			local_uri = nautilus_file_get_uri (file);
+			local_path = gnome_vfs_get_local_path_from_uri (local_uri);
+			icon_path = gnome_vfs_get_local_path_from_uri (metadata);
+
+			gnome_metadata_set (local_path, "icon-filename", strlen (icon_path)+1, icon_path);
+
+			g_free (icon_path);
+			g_free (local_path);
+			g_free (local_uri);
+		}
+	}
+	
 	nautilus_directory_set_file_metadata
 		(file->details->directory,
 		 get_metadata_name (file),
@@ -2067,6 +2181,48 @@
 		return NULL;
 	}
 	g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+	if (nautilus_file_is_mime_type (file, "application/x-gnome-app-info")){
+		GnomeDesktopEntry *entry;
+		char *path, *uri;
+		
+		uri = nautilus_file_get_uri (file);
+		path = gnome_vfs_get_local_path_from_uri (uri);
+
+		if (path){
+			entry = gnome_desktop_entry_load (path);
+			if (entry){
+				name = g_strdup (entry->name);
+				gnome_desktop_entry_free (entry);
+			}
+		}
+		
+		g_free (path);
+		g_free (uri);
+
+		return name;
+	}
+
+	/* Desktop directories contain special "URL" files, handle those by using
+	 * the gnome metadata caption
+	 */
+	if (nautilus_file_is_gmc_url (file)){
+		char *path, *uri, *caption;
+		int size, res;
+
+		uri = nautilus_file_get_uri (file);
+		path = gnome_vfs_get_local_path_from_uri (uri);
+
+		if (path)
+			res = gnome_metadata_get (path, "icon-caption", &size, &caption);
+		
+		g_free (path);
+		g_free (uri);
+
+		if (res == 0 && caption)
+			return caption;
+	}
+
 	name = gnome_vfs_unescape_string (file->details->relative_uri, "/");
 	if (name != NULL) {
 		return name;
@@ -4070,6 +4226,24 @@
 nautilus_file_is_nautilus_link (NautilusFile *file)
 {
 	return nautilus_file_is_mime_type (file, "application/x-nautilus-link");
+}
+
+/**
+ * nautilus_file_is_gmc_url
+ * 
+ * Check if this file is a gmc url
+ * @file: NautilusFile representing the file in question.
+ * 
+ * Returns: True if the file is a gmc url
+ * 
+ **/
+gboolean
+nautilus_file_is_gmc_url (NautilusFile *file)
+{
+	if ((strncmp (file->details->relative_uri, "url", 3) == 0) &&
+	    nautilus_file_is_in_desktop (file))
+		return TRUE;
+	return FALSE;
 }
 
 /**
Index: libnautilus-extensions/nautilus-file.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-extensions/nautilus-file.h,v
retrieving revision 1.75
diff -u -r1.75 nautilus-file.h
--- libnautilus-extensions/nautilus-file.h	2001/02/24 01:45:10	1.75
+++ libnautilus-extensions/nautilus-file.h	2001/04/12 17:20:14
@@ -131,6 +131,7 @@
 char *                  nautilus_file_get_symbolic_link_target_path     (NautilusFile                   *file);
 gboolean                nautilus_file_is_broken_symbolic_link           (NautilusFile                   *file);
 gboolean                nautilus_file_is_nautilus_link                  (NautilusFile                   *file);
+gboolean                nautilus_file_is_gmc_url                        (NautilusFile                   *file);
 gboolean                nautilus_file_is_executable                     (NautilusFile                   *file);
 gboolean                nautilus_file_is_directory                      (NautilusFile                   *file);
 gboolean                nautilus_file_is_in_trash                       (NautilusFile                   *file);
Index: libnautilus-extensions/nautilus-icon-factory.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-extensions/nautilus-icon-factory.c,v
retrieving revision 1.199.2.1
diff -u -r1.199.2.1 nautilus-icon-factory.c
--- libnautilus-extensions/nautilus-icon-factory.c	2001/03/08 20:29:44	1.199.2.1
+++ libnautilus-extensions/nautilus-icon-factory.c	2001/04/12 17:20:14
@@ -52,6 +52,7 @@
 #include <gtk/gtksignal.h>
 #include <libgnome/gnome-i18n.h>
 #include <libgnome/gnome-util.h>
+#include <libgnome/gnome-dentry.h>
 #include <libgnomevfs/gnome-vfs-file-info.h>
 #include <libgnomevfs/gnome-vfs-mime-info.h>
 #include <libgnomevfs/gnome-vfs-mime-handlers.h>
@@ -1371,11 +1372,17 @@
  	gboolean is_local;
  	int file_size;
  	NautilusScalableIcon *scalable_icon;
+	gboolean try_gnome_metadata = FALSE;
+	static char *desktop_directory;
 	
 	if (file == NULL) {
 		return NULL;
 	}
 
+	if (!desktop_directory)
+		desktop_directory = nautilus_get_desktop_directory ();
+	
+
 	/* if there is a custom image in the metadata, use that. */
 	uri = nautilus_file_get_metadata (file, NAUTILUS_METADATA_KEY_CUSTOM_ICON, NULL);
 	file_uri = nautilus_file_get_uri (file);
@@ -1386,6 +1393,37 @@
 	   If a thumbnail is required, but does not yet exist,  put an entry on the thumbnail queue so we
 	   eventually make one */
 
+	if (uri == NULL){
+		char *directory, *directory_uri;
+		/*
+		 * Do we have to check the gnome metadata?
+		 *
+		 * Do this only for the ~/.gnome-desktop directory, as it was
+		 * the only place where GMC used it (since everywhere else we could
+		 * not do it because of the imlib leaks).
+		 */
+		directory_uri = nautilus_file_get_parent_uri (file);
+		directory = gnome_vfs_get_local_path_from_uri (directory_uri);
+		if (directory && strcmp (directory, desktop_directory) == 0){
+			char *file_path, *buf;
+			int size, res;
+			
+			file_path = gnome_vfs_get_local_path_from_uri (file_uri);
+
+			if (file_path)
+				res = gnome_metadata_get (file_path, "icon-filename", &size, &buf);
+
+			if (res == 0 && buf){
+				uri = gnome_vfs_get_uri_from_local_path (buf);
+				g_free (buf);
+			}
+			
+			g_free (file_path);
+		}
+		g_free (directory);
+		
+	}
+	
 	/* also, dont make thumbnails for images in the thumbnails directory */  
 	if (uri == NULL) {		
 		mime_type = nautilus_file_get_mime_type (file);
@@ -1430,6 +1468,19 @@
 			}
 			g_free (file_path);
 		}
+	}
+
+	if (uri == NULL && nautilus_file_is_mime_type (file, "application/x-gnome-app-info")){
+		char *file_path = gnome_vfs_get_local_path_from_uri (file_uri);
+		GnomeDesktopEntry *entry;
+
+		entry = gnome_desktop_entry_load (file_path);
+		if (entry){
+			if (entry->icon)
+				uri = gnome_vfs_get_uri_from_local_path (entry->icon);
+			gnome_desktop_entry_free (entry);
+		}
+		g_free (file_path);
 	}
 	
 	/* handle SVG files */
Index: src/nautilus-application.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-application.c,v
retrieving revision 1.134
diff -u -r1.134 nautilus-application.c
--- src/nautilus-application.c	2001/03/01 21:01:02	1.134
+++ src/nautilus-application.c	2001/04/12 17:20:15
@@ -333,6 +333,36 @@
 	return uri_list;
 }
 
+static void
+migrate (char *old, char *new, char *key)
+{
+	int size;
+	char *buf;
+
+}
+
+/*
+ * Find ~/.gnome-desktop/Trash and rename it to ~/.gnome-desktop/Trash-gmc
+ * Only if it is a directory
+ */
+void
+migrate_trashcan (void)
+{
+	char *dp = nautilus_get_desktop_directory ();
+	char *trash_dir = g_strconcat (dp, "/", "Trash", NULL);
+	char *dest = g_strconcat (dp, "/", "Trash.gmc", NULL);
+	struct stat buf;
+	
+	if (stat (trash_dir, &buf) == 0 && S_ISDIR (buf.st_mode)){
+		rename (trash_dir, dest);
+		gnome_metadata_rename (trash_dir, dest);
+	}
+	
+	g_free (dp);
+	g_free (trash_dir);
+	g_free (dest);
+}
+
 void
 nautilus_application_startup (NautilusApplication *application,
 			      gboolean kill_shell,
@@ -373,6 +403,7 @@
 		nautilus_first_time_druid_show (application, start_desktop, urls);
 		return;
 	}
+	migrate_trashcan ();
 	
 	/* initialize the sound machinery */
 	nautilus_sound_initialize ();
Index: src/nautilus-first-time-druid.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-first-time-druid.c,v
retrieving revision 1.87.2.5.2.1
diff -u -r1.87.2.5.2.1 nautilus-first-time-druid.c
--- src/nautilus-first-time-druid.c	2001/04/06 20:07:43	1.87.2.5.2.1
+++ src/nautilus-first-time-druid.c	2001/04/12 17:20:15
@@ -66,7 +66,9 @@
 /* Druid page number enumeration */
 enum {
 	USER_LEVEL_PAGE = 0,
+#if 0
 	GMC_TRANSITION_PAGE,
+#endif
 	LAUNCH_MEDUSA_PAGE,
 	START_CRON_INFORMATION_PAGE,
 	OFFER_UPDATE_PAGE,
@@ -139,10 +141,11 @@
 
 /* GMC transition tool globals */
 static gboolean draw_desktop = TRUE;
+#if 0
 static gboolean add_to_session = TRUE;
 static gboolean transfer_gmc_icons = TRUE;
 static GtkWidget *draw_desktop_checkbox_widget;
-
+#endif
 /* `Launch Medusa' globals */
 static gboolean medusa_is_blocked;
 static NautilusCronStatus cron_status;
@@ -240,25 +243,29 @@
 	} else {
 		signup_uris[1] = NULL;
 	}
-
 
+#if 0
 	/* Do the GMC to Nautilus Transition */
 	nautilus_preferences_set_boolean (NAUTILUS_PREFERENCES_SHOW_DESKTOP, draw_desktop);	
 	nautilus_preferences_set_boolean (NAUTILUS_PREFERENCES_ADD_TO_SESSION, add_to_session);	
 	if (transfer_gmc_icons) {
 		convert_gmc_desktop_icons ();
 	}
+#endif
 
 	/* Do the Medusa config */
 	nautilus_preferences_set_boolean (NAUTILUS_PREFERENCES_USE_FAST_SEARCH, launch_medusa);
 	nautilus_medusa_enable_services (launch_medusa);
 	
 	/* Create default services icon on the desktop */
 	desktop_path = nautilus_get_desktop_directory ();
 	nautilus_link_local_create (desktop_path, _("Eazel Services"), "hand.png", 
 				    "eazel:", NULL, NAUTILUS_LINK_GENERIC);
 	g_free (desktop_path);

 	/* Time to start. Hooray! */
 	nautilus_application_startup (save_application, FALSE, FALSE, draw_desktop, 
 				      FALSE, FALSE, NULL, (signup_uris[0] != NULL) ? signup_uris : NULL);
@@ -267,6 +274,7 @@
 	gtk_widget_destroy (gtk_widget_get_toplevel (druid_page));
 }
 
+
 /* set up an event box to serve as the background */
 
 static GtkWidget *
@@ -290,11 +298,13 @@
 static void
 update_draw_desktop_checkbox_state ()
 {
+#if 0
 	if (current_user_level == NAUTILUS_USER_LEVEL_NOVICE) {
 		gtk_widget_hide (draw_desktop_checkbox_widget);
 	} else {
 		gtk_widget_show (draw_desktop_checkbox_widget);
 	}
+#endif
 }
 
 /* handler for user level buttons changing */
@@ -773,7 +783,7 @@
 		gnome_druid_set_page (druid, GNOME_DRUID_PAGE (pages[START_CRON_INFORMATION_PAGE]));
 	}
 #else
-	gnome_druid_set_page (druid, GNOME_DRUID_PAGE (pages[GMC_TRANSITION_PAGE]));
+	gnome_druid_set_page (druid, GNOME_DRUID_PAGE (pages[USER_LEVEL_PAGE]));
 #endif
 
 	return TRUE;
@@ -885,6 +895,7 @@
 	return TRUE;
 }
 
+#if 0
 /* set up the "GMC to Nautilus Transition" page */
 static void
 set_up_gmc_transition_page (NautilusDruidPageEazel *page)
@@ -936,7 +947,7 @@
 	
 	gtk_widget_show_all (main_box);
 }
-
+#endif
 
 static gboolean
 medusa_value_changed (GtkWidget *checkbox, gboolean *value)
@@ -1226,14 +1237,15 @@
 	/* set up the user level page */
 	set_page_title (NAUTILUS_DRUID_PAGE_EAZEL (pages[USER_LEVEL_PAGE]), _("Choose Your User Level"));
 	set_up_user_level_page (NAUTILUS_DRUID_PAGE_EAZEL (pages[USER_LEVEL_PAGE]));
-				
+
+#if 0
 	/* set up the GMC transition page */
 	set_page_title (NAUTILUS_DRUID_PAGE_EAZEL (pages[GMC_TRANSITION_PAGE]), _("GMC to Nautilus Transition"));
 	set_up_gmc_transition_page (NAUTILUS_DRUID_PAGE_EAZEL (pages[GMC_TRANSITION_PAGE]));
 	gtk_signal_connect (GTK_OBJECT (pages[GMC_TRANSITION_PAGE]), "next",
 			    GTK_SIGNAL_FUNC (next_gmc_transition_page_callback),
 			    druid);
-
+#endif
 	/* set up the `Launch Medusa' page */
 	set_page_title (NAUTILUS_DRUID_PAGE_EAZEL (pages[LAUNCH_MEDUSA_PAGE]), _("Fast Searches"));
 	set_up_medusa_page (NAUTILUS_DRUID_PAGE_EAZEL (pages[LAUNCH_MEDUSA_PAGE]));
Index: src/nautilus-first-time-druid.h
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-first-time-druid.h,v
retrieving revision 1.3
diff -u -r1.3 nautilus-first-time-druid.h
--- src/nautilus-first-time-druid.h	2000/11/07 19:26:37	1.3
+++ src/nautilus-first-time-druid.h	2001/04/12 17:20:15
@@ -35,5 +35,4 @@
 GtkWidget *nautilus_first_time_druid_show (NautilusApplication *application,
 					   gboolean manage_desktop,
 					   const char *urls[]);
-
 #endif /* NAUTILUS_FIRST_TIME_DRUID_H */
Index: src/file-manager/fm-desktop-icon-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-desktop-icon-view.c,v
retrieving revision 1.122
diff -u -r1.122 fm-desktop-icon-view.c
--- src/file-manager/fm-desktop-icon-view.c	2001/02/23 23:54:35	1.122
+++ src/file-manager/fm-desktop-icon-view.c	2001/04/12 17:20:15
@@ -21,6 +21,7 @@
 
    Authors: Mike Engber <engber eazel com>
    	    Gene Z. Ragan <gzr eazel com>
+	    Miguel de Icaza <miguel ximian com>
 */
 
 #include <config.h>
@@ -30,6 +31,7 @@
 #include <dirent.h>
 #include <fcntl.h>
 #include <bonobo/bonobo-ui-util.h>
+#include <gtk/gtkmain.h>
 #include <gdk/gdkx.h>
 #include <gtk/gtkcheckmenuitem.h>
 #include <libgnome/gnome-dentry.h>
@@ -70,10 +72,20 @@
 
 #define DESKTOP_BACKGROUND_POPUP_PATH_DISKS	"/popups/background/Before Zoom Items/Volume Items/Disks"
 
+static char *desktop_directory;
+static time_t desktop_dir_modify_time;
+
 struct FMDesktopIconViewDetails
 {
 	BonoboUIComponent *ui;
 	GList *mount_black_list;
+
+	/*
+	 * For the desktop rescanning
+	 */
+	gint reload_desktop_timeout;
+	gint delayed_init_signal;
+	gboolean pending_rescan;
 };
 
 typedef struct {
@@ -134,6 +146,11 @@
 
 	icon_view = FM_DESKTOP_ICON_VIEW (object);
 
+	/*
+	 * Remove hack of love timeout
+	 */
+	gtk_timeout_remove (icon_view->details->reload_desktop_timeout);
+	
 	/* Delete all of the link files. */
 	delete_all_mount_links ();
 	
@@ -294,7 +311,7 @@
 create_mount_link (FMDesktopIconView *icon_view,
 		   const NautilusVolume *volume)
 {
-	char *desktop_path, *target_uri, *volume_name;
+	char *target_uri, *volume_name;
 	const char *icon_name;
 
 	if (volume_in_black_list (icon_view, volume)) {
@@ -322,15 +339,13 @@
 		break;	
 	}
 
-	desktop_path = nautilus_get_desktop_directory ();
 	target_uri =  nautilus_volume_monitor_get_target_uri (volume);
 	
-	volume_name = create_unique_volume_name (desktop_path, volume);
+	volume_name = create_unique_volume_name (desktop_directory, volume);
 	
 	/* Create link */
-	nautilus_link_local_create (desktop_path, volume_name, icon_name, target_uri, NULL, NAUTILUS_LINK_MOUNT);
+	nautilus_link_local_create (desktop_directory, volume_name, icon_name, target_uri, NULL, NAUTILUS_LINK_MOUNT);
 				    
-	g_free (desktop_path);
 	g_free (target_uri);
 	g_free (volume_name);
 }
@@ -354,7 +369,74 @@
 	update_home_link_and_delete_copies ();
 }
 
+static gint
+do_desktop_rescan (gpointer data)
+{
+	FMDesktopIconView *desktop_icon_view = FM_DESKTOP_ICON_VIEW (data);
+	struct stat buf;
+
+	if (desktop_icon_view->details->pending_rescan)
+		return TRUE;
+	
+	if (stat (desktop_directory, &buf) == -1){
+		return TRUE;
+	}
+
+	if (buf.st_ctime == desktop_dir_modify_time)
+		return TRUE;
+
+	desktop_icon_view->details->pending_rescan = TRUE;
+
+	nautilus_directory_force_reload (
+		fm_directory_view_get_model (
+			FM_DIRECTORY_VIEW (desktop_icon_view)));
+	return TRUE;
+}
+
 static void
+done_loading (GtkObject *DirectoryView, FMDesktopIconView *desktop_icon_view)
+{
+	struct stat buf;
+
+	desktop_icon_view->details->pending_rescan = FALSE;
+	if (stat (desktop_directory, &buf) == -1)
+		return;
+
+	desktop_dir_modify_time = buf.st_ctime;
+}
+
+#define RESCAN_TIMEOUT 4000
+
+/*
+ * This funcion is used because the NautilusDirectory
+ * model does not exist always in the desktop_icon_view,
+ * so we want until it has been instantiated
+ */
+static void
+delayed_init (FMDesktopIconView *desktop_icon_view)
+{
+	/*
+	 * Keep track of the load time
+	 */
+	gtk_signal_connect (
+		GTK_OBJECT (fm_directory_view_get_model (
+			FM_DIRECTORY_VIEW (desktop_icon_view))),
+		"done_loading",
+		GTK_SIGNAL_FUNC (done_loading), desktop_icon_view);
+
+	/*
+	 * Hack of Love.  No abstractions, just plain working code.
+	 */
+	desktop_icon_view->details->reload_desktop_timeout =
+		gtk_timeout_add (RESCAN_TIMEOUT, do_desktop_rescan, desktop_icon_view);
+
+	gtk_signal_disconnect (
+		GTK_OBJECT (desktop_icon_view),
+		desktop_icon_view->details->delayed_init_signal);
+	desktop_icon_view->details->delayed_init_signal = -1;
+}
+
+static void
 fm_desktop_icon_view_initialize (FMDesktopIconView *desktop_icon_view)
 {
 	GList *list;
@@ -362,11 +444,19 @@
 	GtkAllocation *allocation;
 	GtkAdjustment *hadj, *vadj;
 
+	if (!desktop_directory)
+		desktop_directory = nautilus_get_desktop_directory ();
+
 	icon_container = get_icon_container (desktop_icon_view);
 
 	/* Set up details */
 	desktop_icon_view->details = g_new0 (FMDesktopIconViewDetails, 1);	
 
+	desktop_icon_view->details->delayed_init_signal = gtk_signal_connect (
+		GTK_OBJECT (desktop_icon_view),
+		"begin_loading",
+		GTK_SIGNAL_FUNC (delayed_init), desktop_icon_view);
+	
 	nautilus_icon_container_set_is_fixed_size (icon_container, TRUE);
 	
 	/* Set up default mount black list */
@@ -581,16 +671,14 @@
 						   gboolean state,
 						   gpointer callback_data)
 {
-	char *desktop_path, *path;
+	char *path;
 
-	desktop_path = nautilus_get_desktop_directory ();
-	path = nautilus_make_path (desktop_path, TRASH_LINK_NAME);
+	path = nautilus_make_path (desktop_directory, TRASH_LINK_NAME);
 
 	/* Change the XML file to have a new icon. */
 	nautilus_link_local_set_icon (path, state ? "trash-empty.png" : "trash-full.png");
 
 	g_free (path);
-	g_free (desktop_path);
 }
 
 static void
@@ -625,7 +713,7 @@
 			   NautilusVolume *volume, 
 			   FMDesktopIconView *icon_view)
 {
-	char *link_path, *desktop_path, *volume_name;
+	char *link_path, *volume_name;
 
 	g_assert (volume != NULL);
 	
@@ -634,12 +722,10 @@
 		return;
 	}
 	
-	desktop_path = nautilus_get_desktop_directory ();
-	link_path = nautilus_make_path (desktop_path, volume_name);
+	link_path = nautilus_make_path (desktop_directory, volume_name);
 	unlink_and_notify (link_path);
 
 	g_free (volume_name);
-	g_free (desktop_path);
 	g_free (link_path);
 }
 
@@ -648,7 +734,6 @@
 			   	 int x, int y, FMDirectoryView *view)
 {
 	const GList *element;
-	char *desktop_path;	
 	GnomeDesktopEntry *entry;
 	int index;
 	GdkPoint point;
@@ -657,18 +742,15 @@
 		return;
 	}
 	
-	desktop_path = nautilus_get_desktop_directory ();
 	point.x = x;
 	point.y = y;
 	
 	/* Iterate through all of the URIs in the list */
 	for (element = item_uris, index = 0; element != NULL; element = element->next, index++) {
 		entry = gnome_desktop_entry_load ((char *)element->data);
-		nautilus_link_local_create_from_gnome_entry (entry, desktop_path, &point);
+		nautilus_link_local_create_from_gnome_entry (entry, desktop_directory, &point);
 		gnome_desktop_entry_free (entry);
 	}
-	
-	g_free (desktop_path);
 }
 
 static gboolean
@@ -678,22 +760,19 @@
 {
 	DIR *dir;
 	gboolean found_link;
-	char *desktop_path;
 	struct dirent *dir_entry;
 	char *link_path;
 
-	desktop_path = nautilus_get_desktop_directory ();
-
-	dir = opendir (desktop_path);
+	dir = opendir (desktop_directory);
 	if (dir == NULL) {
-		g_free (desktop_path);
+		g_free (desktop_directory);
 		return FALSE;
 	}
 
 	found_link = FALSE;
 
 	while ((dir_entry = readdir (dir)) != NULL) {
-		link_path = nautilus_make_path (desktop_path, dir_entry->d_name);
+		link_path = nautilus_make_path (desktop_directory, dir_entry->d_name);
 		if ((* is_link_function) (link_path)) {
 			if (strcmp (dir_entry->d_name, link_name) == 0) {
 				nautilus_link_local_set_link_uri (link_path, link_target_uri);
@@ -707,8 +786,6 @@
 	
 	closedir (dir);
 
-	g_free (desktop_path);
-	
 	return found_link;
 }
 
@@ -720,10 +797,8 @@
 static void
 update_home_link_and_delete_copies (void)
 {
-	char *desktop_path, *home_link_name, *home_uri;
+	char *home_link_name, *home_uri;
 
-	desktop_path = nautilus_get_desktop_directory ();
-
 	/* Note to translators: If it's hard to compose a good home
 	 * icon name from the user name, you can use a string without
 	 * an "%s" here, in which case the home icon name will not
@@ -739,7 +814,7 @@
 	if (!update_link_and_delete_copies (nautilus_link_local_is_home_link,
 					    home_link_name,
 					    home_uri)) {
-		nautilus_link_local_create (desktop_path,
+		nautilus_link_local_create (desktop_directory,
 					    home_link_name,
 					    "temp-home.png", 
 					    home_uri,
@@ -747,7 +822,6 @@
 					    NAUTILUS_LINK_HOME);
 	}
 	
-	g_free (desktop_path);
 	g_free (home_link_name);
 	g_free (home_uri);
 }
@@ -755,7 +829,6 @@
 static void
 update_trash_link_and_delete_copies (void)
 {
-	char *desktop_path;
 
 	/* Check for trash link */
 	if (update_link_and_delete_copies (nautilus_link_local_is_trash_link,
@@ -764,15 +837,12 @@
 		return;
 	}
 
-	desktop_path = nautilus_get_desktop_directory ();
-	nautilus_link_local_create (desktop_path,
+	nautilus_link_local_create (desktop_directory,
 				    TRASH_LINK_NAME,
 				    "trash-empty.png", 
 				    NAUTILUS_TRASH_URI,
 				    NULL,
 				    NAUTILUS_LINK_TRASH);				    				    
-	g_free (desktop_path);
-	
 	/* Make sure link represents current trash state */
 	fm_desktop_icon_view_trash_state_changed_callback (nautilus_trash_monitor_get (),
 						   	   nautilus_trash_monitor_is_empty (),
Index: src/file-manager/fm-icon-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-icon-view.c,v
retrieving revision 1.186
diff -u -r1.186 fm-icon-view.c
--- src/file-manager/fm-icon-view.c	2001/03/05 08:14:59	1.186
+++ src/file-manager/fm-icon-view.c	2001/04/12 17:20:16
@@ -276,6 +276,34 @@
 		 &position->x, &position->y) == 2;
 	g_free (position_string);
 
+	/*
+	 * If it is the desktop directory, maybe gnome metadata has information about it
+	 */
+
+	if (!position_good){
+		if (nautilus_file_is_local (file) && nautilus_file_is_in_desktop (file)){
+			char *path, *uri;
+			int res, size;
+			char *buf;
+
+			uri = nautilus_file_get_uri (file);
+			path = gnome_vfs_get_local_path_from_uri (uri);
+
+			if (path){
+				res = gnome_metadata_get (path, "icon-position", &size, &buf);
+
+				if (res == 0){
+					if (sscanf (buf, "%d%d", &position->x, &position->y) == 2){
+						position_good = TRUE;
+					}
+					g_free (buf);
+				}
+			}
+			g_free (path);
+			g_free (uri);
+		}
+	}
+	
 	/* Get the scale of the icon from the metadata. */
 	scale_string = nautilus_file_get_metadata
 		(file, NAUTILUS_METADATA_KEY_ICON_SCALE, "1");
@@ -1610,6 +1638,24 @@
 			(file, NAUTILUS_METADATA_KEY_ICON_POSITION, 
 			 NULL, position_string);
 		g_free (position_string);
+
+		if (nautilus_file_is_local (file) && nautilus_file_is_in_desktop (file)){
+			char *uri, *path;
+			
+			uri = nautilus_file_get_uri (file);
+			path = gnome_vfs_get_local_path_from_uri (uri);
+
+			if (path){
+				char buf [128];
+
+				g_snprintf (buf, sizeof (buf), "%d %d", position->x, position->y);
+
+				gnome_metadata_set (path, "icon-position", strlen (buf)+1, buf);
+			}
+
+			g_free (uri);
+			g_free (path);
+		}
 	}
 
 	/* FIXME bugzilla.eazel.com 662: 

_______________________________________________
gnome-hackers mailing list
gnome-hackers gnome org
http://mail.gnome.org/mailman/listinfo/gnome-hackers




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