[Nautilus-list] Untested patch.



Hello guys,

   I have to go today, but here is my untested patch ported over to
HEAD.  I lost internet at home, and I plan on working fomr home for
the rest of the day.

Miguel.
? cambios
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/nautilus/ChangeLog,v
retrieving revision 1.4490
diff -u -r1.4490 ChangeLog
--- ChangeLog	2001/04/25 03:47:04	1.4490
+++ ChangeLog	2001/04/25 23:23:57
@@ -1,3 +1,77 @@
+2001-04-19  Miguel de Icaza  <miguel ximian com>
+
+	* libnautilus-extensions/nautilus-file.c (nautilus_file_get_name):
+	Only return name when we actually loaded the name from the desktop
+	entry.
+
+	* libnautilus-extensions/nautilus-icon-factory.c
+	(nautilus_icon_factory_get_icon_for_file): Compute file_path from
+	file_uri, it was missing in this code path.
+
+2001-04-16  Miguel de Icaza  <miguel ximian com>
+
+	* libnautilus-extensions/nautilus-file.c
+	(is_special_desktop_gmc_file): Use strcmp not strncmp here. 
+
+	* src/nautilus-window.c (nautilus_window_realize): Use gnome-logo
+	here. 
+
+	* src/file-manager/fm-directory-view.c (activate_callback): Launch
+	desktop entries here. 
+
+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-24  Dan Mueth  <dan eazel com>
 
 	Left-justifying the labels in the help sidebar.
Index: libnautilus-extensions/nautilus-directory-async.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-extensions/nautilus-directory-async.c,v
retrieving revision 1.151
diff -u -r1.151 nautilus-directory-async.c
--- libnautilus-extensions/nautilus-directory-async.c	2001/04/20 21:24:54	1.151
+++ libnautilus-extensions/nautilus-directory-async.c	2001/04/25 23:23:59
@@ -2787,7 +2787,7 @@
 	}
 
 	g_free (file_contents);
-	activation_uri_read_done (directory, uri);
+	activation_uri_read_done (directory, uri ? uri + 5 : NULL);
 	g_free (uri);
 
 	nautilus_directory_unref (directory);
Index: libnautilus-extensions/nautilus-file-utilities.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-extensions/nautilus-file-utilities.c,v
retrieving revision 1.96
diff -u -r1.96 nautilus-file-utilities.c
--- libnautilus-extensions/nautilus-file-utilities.c	2001/04/20 00:58:58	1.96
+++ libnautilus-extensions/nautilus-file-utilities.c	2001/04/25 23:24:00
@@ -40,7 +40,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"
@@ -137,14 +137,12 @@
 char *
 nautilus_get_desktop_directory (void)
 {
-	char *desktop_directory, *user_directory;
+	char *desktop_directory;
 
 	if (nautilus_preferences_get_boolean (NAUTILUS_PREFERENCES_DESKTOP_IS_HOME_DIR)) {
 		desktop_directory = strdup (g_get_home_dir());
 	} else {
-		user_directory = nautilus_get_user_directory ();
-		desktop_directory = nautilus_make_path (user_directory, DESKTOP_DIRECTORY_NAME);
-		g_free (user_directory);
+		desktop_directory = nautilus_make_path (g_get_home_dir (), DESKTOP_DIRECTORY_NAME);
 	}
 
 	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.241
diff -u -r1.241 nautilus-file.c
--- libnautilus-extensions/nautilus-file.c	2001/04/23 13:55:25	1.241
+++ libnautilus-extensions/nautilus-file.c	2001/04/25 23:24:00
@@ -36,6 +36,7 @@
 #include "nautilus-trash-directory.h"
 #include "nautilus-trash-file.h"
 #include "nautilus-vfs-file.h"
+#include "nautilus-metadata.h"
 #include "nautilus-file-utilities.h"
 #include <ctype.h>
 #include <eel/eel-glib-extensions.h>
@@ -49,6 +50,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>
@@ -76,6 +78,7 @@
 
 
 typedef struct {
+
 	NautilusFile *file;
 	GnomeVFSAsyncHandle *handle;
 	NautilusFileOperationCallback callback;
@@ -737,6 +740,10 @@
 		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,11 +948,30 @@
 	Operation *op;
 	GnomeVFSFileInfo *partial_file_info;
 	GnomeVFSURI *vfs_uri;
+	char *uri, *path;
 
 	g_return_if_fail (NAUTILUS_IS_FILE (file));
 	g_return_if_fail (new_name != NULL);
 	g_return_if_fail (callback != NULL);
 
+	if (nautilus_file_is_local (file) && nautilus_file_is_gmc_url (file)) {
+		uri = nautilus_file_get_uri (file);
+		path = gnome_vfs_get_local_path_from_uri (uri);
+
+		if (path != NULL) {
+			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);
@@ -1872,6 +1898,76 @@
 } NautilusFileFilterOptions;
 
 static gboolean
+is_special_desktop_gmc_file (NautilusFile *file)
+{
+	static char *home_dir;
+	static int home_dir_len;
+	char buffer [1024];
+	char *uri, *path;
+	int s;
+
+	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.
+		 */
+		uri = nautilus_file_get_uri (file);
+		path = gnome_vfs_get_local_path_from_uri (uri);
+		if (path != NULL){
+			s = readlink (path, buffer, sizeof (buffer)-1);
+			g_free (path);
+		} else {
+			s = -1;
+		}
+		g_free (uri);
+
+		if (s == -1) {
+			return FALSE;
+		}
+
+		buffer [s] = 0;
+		
+		if (home_dir == NULL) {
+			home_dir = g_strdup (g_get_home_dir ());
+			home_dir_len = strlen (home_dir);
+			
+			if (home_dir != NULL && home_dir [home_dir_len-1] == '/') {
+				home_dir [home_dir_len-1] = 0;
+				home_dir_len--;
+			}
+			
+		}
+		if (home_dir != NULL) {
+			if (strcmp (home_dir, buffer) == 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)
 {
@@ -1881,6 +1977,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);
@@ -1971,10 +2071,32 @@
 			    const char *default_metadata,
 			    const char *metadata)
 {
+	char *icon_path;
+	char *local_path;
+	char *local_uri;
+	
 	g_return_if_fail (NAUTILUS_IS_FILE (file));
 	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)) {
+
+			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);
+
+			if (local_path != NULL && icon_path != NULL) {
+				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),
@@ -2086,11 +2208,57 @@
 nautilus_file_get_name (NautilusFile *file)
 {
 	char *name;
-	
+	GnomeDesktopEntry *entry;
+	char *path, *uri;
+	char *caption;
+	int size, res;
+
 	if (file == NULL) {
 		return NULL;
 	}
 	g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+	name = NULL;
+	if (nautilus_file_is_mime_type (file, "application/x-gnome-app-info")) {
+		uri = nautilus_file_get_uri (file);
+		path = gnome_vfs_get_local_path_from_uri (uri);
+
+		if (path != NULL) {
+			entry = gnome_desktop_entry_load (path);
+			if (entry != NULL) {
+				name = g_strdup (entry->name);
+				gnome_desktop_entry_free (entry);
+			}
+		}
+		
+		g_free (path);
+		g_free (uri);
+
+		if (name)
+			return name;
+	}
+
+	/* Desktop directories contain special "URL" files, handle those by using
+	 * the gnome metadata caption
+	 */
+	if (nautilus_file_is_gmc_url (file)) {
+
+		uri = nautilus_file_get_uri (file);
+		path = gnome_vfs_get_local_path_from_uri (uri);
+
+		if (path != NULL) {
+			res = gnome_metadata_get (path, "icon-caption", &size, &caption);
+		} else {
+			res = -1;
+		}
+		
+		g_free (path);
+		g_free (uri);
+
+		if (res == 0 && caption != NULL)
+			return caption;
+	}
+
 	name = gnome_vfs_unescape_string (file->details->relative_uri, "/");
 	if (name != NULL) {
 		return name;
@@ -4241,6 +4409,25 @@
 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.79
diff -u -r1.79 nautilus-file.h
--- libnautilus-extensions/nautilus-file.h	2001/04/05 23:10:00	1.79
+++ libnautilus-extensions/nautilus-file.h	2001/04/25 23:24:00
@@ -136,6 +136,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.208
diff -u -r1.208 nautilus-icon-factory.c
--- libnautilus-extensions/nautilus-icon-factory.c	2001/04/16 18:29:17	1.208
+++ libnautilus-extensions/nautilus-icon-factory.c	2001/04/25 23:24:01
@@ -54,6 +54,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-handlers.h>
 #include <libgnomevfs/gnome-vfs-mime-info.h>
@@ -1379,9 +1380,12 @@
 nautilus_icon_factory_get_icon_for_file (NautilusFile *file, const char *modifier)
 {
 	char *uri, *file_uri, *file_path, *image_uri, *icon_name, *mime_type, *top_left_text;
+	char *directory, *desktop_directory, *buf;
  	gboolean is_local;
- 	int file_size;
+ 	int file_size, size, res;
  	NautilusScalableIcon *scalable_icon;
+	char *directory_uri;
+	GnomeDesktopEntry *entry;
 	
 	if (file == NULL) {
 		return NULL;
@@ -1399,6 +1403,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) {
+		/* 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).
+		 */
+		desktop_directory = nautilus_get_desktop_directory ();
+		directory_uri = nautilus_file_get_parent_uri (file);
+		directory = gnome_vfs_get_local_path_from_uri (directory_uri);
+		if (directory != NULL && strcmp (directory, desktop_directory) == 0) {
+			file_path = gnome_vfs_get_local_path_from_uri (file_uri);
+
+			if (file_path != NULL) {
+				res = gnome_metadata_get (file_path, "icon-filename", &size, &buf);
+			} else {
+				res = -1;
+			}
+
+			if (res == 0 && buf != NULL) {
+				uri = gnome_vfs_get_uri_from_local_path (buf);
+				g_free (buf);
+			}
+			
+			g_free (file_path);
+			file_path = NULL;
+		}
+		g_free (directory);
+		g_free (desktop_directory);
+	}
+	
 	/* also, dont make thumbnails for images in the thumbnails directory */  
 	if (uri == NULL) {		
 		mime_type = nautilus_file_get_mime_type (file);
@@ -1442,6 +1477,22 @@
 				}
 			}
 			g_free (file_path);
+			file_path = NULL;
+		}
+	}
+
+	if (uri == NULL && nautilus_file_is_mime_type (file, "application/x-gnome-app-info")) {
+		file_path = gnome_vfs_get_local_path_from_uri (file_uri);
+		if (file_path != NULL) {
+			entry = gnome_desktop_entry_load (file_path);
+			if (entry != NULL) {
+				if (entry->icon != NULL) {
+					uri = gnome_vfs_get_uri_from_local_path (entry->icon);
+				}
+				gnome_desktop_entry_free (entry);
+			}
+			g_free (file_path);
+			file_path = NULL;
 		}
 	}
 	
Index: libnautilus-extensions/nautilus-volume-monitor.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-extensions/nautilus-volume-monitor.c,v
retrieving revision 1.83
diff -u -r1.83 nautilus-volume-monitor.c
--- libnautilus-extensions/nautilus-volume-monitor.c	2001/04/21 02:45:53	1.83
+++ libnautilus-extensions/nautilus-volume-monitor.c	2001/04/25 23:24:01
@@ -113,7 +113,7 @@
 
 #endif
 
-#define CHECK_STATUS_INTERVAL 2000
+#define CHECK_STATUS_INTERVAL 4000
 
 #define FLOPPY_MOUNT_PATH_PREFIX "/mnt/fd"
 
Index: src/nautilus-application.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-application.c,v
retrieving revision 1.146
diff -u -r1.146 nautilus-application.c
--- src/nautilus-application.c	2001/04/24 00:46:13	1.146
+++ src/nautilus-application.c	2001/04/25 23:24:01
@@ -62,6 +62,7 @@
 #include <libnautilus-extensions/nautilus-undo-manager.h>
 #include <libnautilus-extensions/nautilus-volume-monitor.h>
 #include <liboaf/liboaf.h>
+#include <dirent.h>
 
 #define FACTORY_IID	     "OAFIID:nautilus_factory:bd1e1862-92d7-4391-963e-37583f0daef3"
 #define SEARCH_LIST_VIEW_IID "OAFIID:nautilus_file_manager_search_list_view:b186e381-198e-43cf-9c46-60b6bb35db0b"
@@ -334,6 +335,83 @@
 	return uri_list;
 }
 
+/* Find ~/.gnome-desktop/Trash and rename it to ~/.gnome-desktop/Trash-gmc
+ * Only if it is a directory
+ */
+static void
+migrate_trashcan (void)
+{
+	char *dp, *trash_dir, *dest;
+	struct stat buf;
+
+	dp = nautilus_get_desktop_directory ();
+	trash_dir = g_strconcat (dp, "/", "Trash", NULL);
+	dest = g_strconcat (dp, "/", "Trash.gmc", NULL);
+	
+	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);
+}
+
+static void
+migrate_old_nautilus_files (void)
+{
+	char *new_desktop_dir, *np;
+	char *old_desktop_dir, *op;
+	char *home_dir;
+	char *old_desktop_dir_new_name;
+	struct stat buf;
+	DIR *dir;
+	struct dirent *de;
+	
+	old_desktop_dir = g_strconcat (g_get_home_dir (), "/.nautilus/desktop", NULL);
+	if (stat (old_desktop_dir, &buf) == -1) {
+		g_free (old_desktop_dir);
+		return;
+	}
+	if (!S_ISLNK (buf.st_mode)){
+		dir = opendir (old_desktop_dir);
+		if (!dir){
+			g_free (old_desktop_dir);
+			return;
+		}
+	
+		new_desktop_dir = nautilus_get_desktop_directory ();
+		
+		while ((de = readdir (dir)) != NULL){
+			if (de->d_name [0] == '.'){
+				if (de->d_name [0] == 0)
+					continue;
+				
+				if (de->d_name [1] == '.' && de->d_name [2] == 0)
+					continue;
+			}
+	
+			op = g_strconcat (old_desktop_dir, "/", de->d_name, NULL);
+			np = g_strconcat (new_desktop_dir, "/", de->d_name, NULL);
+	
+			rename (op, np);
+	
+			g_free (op);
+			g_free (np);
+		}
+	}
+
+	/* In case we miss something */
+	old_desktop_dir_new_name = g_strconcat (old_desktop_dir, "-old", NULL);
+	rename (old_desktop_dir, old_desktop_dir_new_name);
+	g_free (old_desktop_dir_new_name);
+
+	close (dir);
+	g_free (old_desktop_dir);
+	g_free (new_desktop_dir);
+}
+
 void
 nautilus_application_startup (NautilusApplication *application,
 			      gboolean kill_shell,
@@ -374,6 +452,8 @@
 		nautilus_first_time_druid_show (application, urls);
 		return;
 	}
+	migrate_trashcan ();
+	migrate_old_nautilus_files ();
 	
 	/* 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.101
diff -u -r1.101 nautilus-first-time-druid.c
--- src/nautilus-first-time-druid.c	2001/04/24 01:49:47	1.101
+++ src/nautilus-first-time-druid.c	2001/04/25 23:24:02
@@ -65,7 +65,9 @@
 /* Druid page number enumeration */
 enum {
 	USER_LEVEL_PAGE = 0,
+#ifdef TRANSITIONAL_NAUTILUS
 	GMC_TRANSITION_PAGE,
+#endif
 	OFFER_UPDATE_PAGE,
 	UPDATE_FEEDBACK_PAGE,
 	PROXY_CONFIGURATION_PAGE,
@@ -135,9 +137,11 @@
 
 /* GMC transition tool globals */
 static gboolean draw_desktop = TRUE;
+#ifdef TRANSITIONAL_NAUTILUS
 static gboolean add_to_session = TRUE;
 static gboolean transfer_gmc_icons = TRUE;
 static GtkWidget *draw_desktop_checkbox_widget;
+#endif
 
 static int current_user_level;
 
@@ -245,7 +249,7 @@
 		signup_uris[1] = NULL;
 	}
 
-
+#ifdef TRANSITIONAL_NAUTILUS
 	/* 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);	
@@ -256,12 +260,14 @@
 		 */
 		gtk_idle_add (convert_gmc_desktop_icons, NULL);
 	}
+#endif
 
 	/* Arrange to create default services icon on the desktop. Do this
 	 * at idle time for the same reason as when converting gmc icons
 	 */
 	gtk_idle_add (create_services_link_callback, NULL);
	
 	/* Time to start. Hooray! */
 	nautilus_application_startup (save_application, FALSE, FALSE, draw_desktop, 
 				      FALSE, FALSE, NULL, (signup_uris[0] != NULL) ? signup_uris : NULL);
@@ -270,6 +276,7 @@
 	gtk_widget_destroy (gtk_widget_get_toplevel (druid_page));
 }
 
+
 /* set up an event box to serve as the background */
 
 static GtkWidget *
@@ -293,11 +300,13 @@
 static void
 update_draw_desktop_checkbox_state (void)
 {
+#ifdef TRANSITIONAL_NAUTILUS
 	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 */
@@ -889,6 +898,7 @@
 	return TRUE;
 }
 
+#ifdef TRANSITIONAL_NAUTILUS
 /* set up the "GMC to Nautilus Transition" page */
 static void
 set_up_gmc_transition_page (NautilusDruidPageEazel *page)
@@ -929,7 +939,7 @@
 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), transfer_gmc_icons);	
 	gtk_signal_connect (GTK_OBJECT (checkbox), "toggled", GTK_SIGNAL_FUNC (transition_value_changed), &transfer_gmc_icons);
 
-#if 0
+#ifdef TRANSITIONAL_NAUTILUS
 	/* This option is currently disabled, per bugzilla.eazel.com 7557 */
 
 	checkbox = gtk_check_button_new_with_label (_("Launch Nautilus when GNOME starts up."));
@@ -940,7 +950,7 @@
 	
 	gtk_widget_show_all (main_box);
 }
-
+#endif
 
 
 /* handle the "back" signal from the finish page to skip the feedback page */
@@ -1108,10 +1118,12 @@
 	/* 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]));
-				
+
+#ifdef TRANSITIONAL_NAUTILUS
 	/* 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]));
+#endif
 
 	/* set up the update page */
 	set_page_title (NAUTILUS_DRUID_PAGE_EAZEL (pages[OFFER_UPDATE_PAGE]), _("Checking Your Internet Connection"));
Index: src/nautilus-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-window.c,v
retrieving revision 1.327
diff -u -r1.327 nautilus-window.c
--- src/nautilus-window.c	2001/04/24 18:29:58	1.327
+++ src/nautilus-window.c	2001/04/25 23:24:02
@@ -1048,7 +1048,7 @@
 	}
 
 	/* Set the maxi icon */
-	filename = gnome_pixmap_file ("nautilus-launch-icon.png");
+	filename = gnome_pixmap_file ("gnome-logo.png");
 	if (filename != NULL) {
 		gnome_window_icon_set_from_file (GTK_WINDOW (widget),
 						 filename);
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.132
diff -u -r1.132 fm-desktop-icon-view.c
--- src/file-manager/fm-desktop-icon-view.c	2001/04/23 20:38:45	1.132
+++ src/file-manager/fm-desktop-icon-view.c	2001/04/25 23:24:02
@@ -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>
@@ -28,6 +29,7 @@
 
 #include <X11/Xatom.h>
 #include <bonobo/bonobo-ui-util.h>
+#include <gtk/gtkmain.h>
 #include <ctype.h>
 #include <dirent.h>
 #include <eel/eel-glib-extensions.h>
@@ -73,10 +75,22 @@
 
 #define DESKTOP_BACKGROUND_POPUP_PATH_DISKS	"/popups/background/Before Zoom Items/Volume Items/Disks"
 
+/* Timeout to check the desktop directory for updates */
+#define RESCAN_TIMEOUT 4000
+
+static char *desktop_directory;
+static time_t desktop_dir_modify_time;
+
 struct FMDesktopIconViewDetails
 {
 	BonoboUIComponent *ui;
 	GList *mount_black_list;
+
+	/* For the desktop rescanning
+	 */
+	guint reload_desktop_timeout;
+	guint delayed_init_signal;
+	gboolean pending_rescan;
 };
 
 typedef struct {
@@ -217,6 +231,10 @@
 				  desktop_icon_view_property_filter,
 				  icon_view);
 
+	/* Remove desktop rescan timeout 
+	 */
+	gtk_timeout_remove (icon_view->details->reload_desktop_timeout);
+	
 	/* Delete all of the link files. */
 	delete_all_mount_links ();
 	
@@ -322,7 +340,7 @@
 
 
 static char *
-create_unique_volume_name (const char *desktop_path, const NautilusVolume *volume)
+create_unique_volume_name (const NautilusVolume *volume)
 {
 	GnomeVFSURI *uri;
 	char *uri_path, *new_name;
@@ -338,7 +356,7 @@
 			
 	volume_name = nautilus_volume_monitor_get_volume_name (volume);	
 		
-	uri_path = g_strdup_printf ("%s/%s",desktop_path, volume_name);		
+	uri_path = g_strdup_printf ("%s/%s",desktop_directory, volume_name);		
 	uri = gnome_vfs_uri_new (uri_path);
 	
 	/* Check for existing filename and create a unique name. */
@@ -351,7 +369,7 @@
 		g_free (new_name);
 		new_name = g_strdup_printf ("%s (%d)", volume_name, index);
 		
-		uri_path = g_strdup_printf ("%s/%s", desktop_path, new_name);
+		uri_path = g_strdup_printf ("%s/%s", desktop_directory, new_name);
 		uri = gnome_vfs_uri_new (uri_path);		
 	}
 	
@@ -377,7 +395,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)) {
@@ -429,15 +447,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 (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);
 }
@@ -461,7 +477,72 @@
 	update_home_link_and_delete_copies ();
 }
 
+static gint
+do_desktop_rescan (gpointer data)
+{
+	FMDesktopIconView *desktop_icon_view;
+	struct stat buf;
+
+	desktop_icon_view = FM_DESKTOP_ICON_VIEW (data);
+	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;
+}
+
+/* This function 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);
+
+	/* Monitor desktop directory */
+	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;
@@ -469,11 +550,20 @@
 	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 */
@@ -698,16 +788,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
@@ -742,7 +830,7 @@
 			   NautilusVolume *volume, 
 			   FMDesktopIconView *icon_view)
 {
-	char *link_path, *desktop_path, *volume_name;
+	char *link_path, *volume_name;
 
 	g_assert (volume != NULL);
 	
@@ -751,12 +839,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);
 }
 
@@ -766,7 +852,7 @@
 {
 	const GList *element;
 	GList *uri_list;
-	char *desktop_path, *local_path;
+	char *local_path;
 	GnomeDesktopEntry *entry;
 	int index;
 	GdkPoint point;
@@ -778,7 +864,6 @@
 		return;
 	}
 	
-	desktop_path = nautilus_get_desktop_directory ();
 	point.x = x;
 	point.y = y;
 		
@@ -806,7 +891,7 @@
 		if (local_path != NULL) {
 			entry = gnome_desktop_entry_load (local_path);		
 			if (entry != NULL) {
-				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);
 				made_entry_link = TRUE;
 			}
@@ -826,14 +911,13 @@
 							
 			if (linkname != NULL) {
 				linkname++;
-				nautilus_link_local_create (desktop_path, linkname, "gnome-http-url.png", uri,
+				nautilus_link_local_create (desktop_directory, linkname, "gnome-http-url.png", uri,
 							    &point, NAUTILUS_LINK_GENERIC);
 			}
 			g_free (stripped_uri);
 		}						
 	}
 	
-	g_free (desktop_path);
 	gnome_uri_list_free_strings (uri_list);
 }
 
@@ -854,22 +938,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 (!found_link &&
 			     (link_name == NULL || strcmp (dir_entry->d_name, link_name) == 0)) {
@@ -884,8 +965,6 @@
 	
 	closedir (dir);
 
-	g_free (desktop_path);
-	
 	return found_link;
 }
 
@@ -897,10 +976,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
@@ -916,7 +993,7 @@
 	if (!update_link_and_delete_copies (nautilus_link_local_is_home_link,
 					    NULL,
 					    home_uri)) {
-		nautilus_link_local_create (desktop_path,
+		nautilus_link_local_create (desktop_directory,
 					    home_link_name,
 					    "temp-home.png", 
 					    home_uri,
@@ -924,7 +1001,6 @@
 					    NAUTILUS_LINK_HOME);
 	}
 	
-	g_free (desktop_path);
 	g_free (home_link_name);
 	g_free (home_uri);
 }
@@ -932,7 +1008,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,
@@ -941,15 +1016,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", 
 				    EEL_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-directory-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-directory-view.c,v
retrieving revision 1.444
diff -u -r1.444 fm-directory-view.c
--- src/file-manager/fm-directory-view.c	2001/04/23 20:38:45	1.444
+++ src/file-manager/fm-directory-view.c	2001/04/25 23:24:03
@@ -52,6 +52,7 @@
 #include <libgnomeui/gnome-geometry.h>
 #include <libgnomeui/gnome-uidefs.h>
 #include <libgnomevfs/gnome-vfs-async-ops.h>
+#include <libgnomevfs/gnome-vfs-mime.h>
 #include <libgnomevfs/gnome-vfs-file-info.h>
 #include <libgnomevfs/gnome-vfs-mime-handlers.h>
 #include <libgnomevfs/gnome-vfs-result.h>
@@ -4393,6 +4394,7 @@
 	FMDirectoryView *view;
 	char *uri, *command, *executable_path, *quoted_path, *name;
 	GnomeVFSMimeApplication *application;
+	GnomeDesktopEntry *entry;
 	ActivationAction action;
 	gboolean need_to_continue_monitoring_file_for_activation;
 	
@@ -4439,6 +4441,25 @@
 		}
 	}
 
+	if (action != ACTIVATION_ACTION_DO_NOTHING &&
+	    (strcmp (gnome_vfs_mime_type_from_name_or_default (uri, ""),
+		     "application/x-gnome-app-info") == 0)) {
+
+		executable_path = gnome_vfs_get_local_path_from_uri (uri);
+		if (executable_path) {
+			entry = gnome_desktop_entry_load (executable_path);
+
+			if (entry) {
+				gnome_desktop_entry_launch (entry);
+			}
+
+			gnome_desktop_entry_free (entry);
+		}
+		
+		g_free (executable_path);
+		action = ACTIVATION_ACTION_DO_NOTHING;
+	}
+	
 	if (action != ACTIVATION_ACTION_DO_NOTHING && file_is_launchable (file)) {
 
 		action = ACTIVATION_ACTION_LAUNCH;
Index: src/file-manager/fm-icon-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-icon-view.c,v
retrieving revision 1.201
diff -u -r1.201 fm-icon-view.c
--- src/file-manager/fm-icon-view.c	2001/04/19 18:37:54	1.201
+++ src/file-manager/fm-icon-view.c	2001/04/25 23:24:04
@@ -269,6 +269,9 @@
 	char *position_string, *scale_string;
 	gboolean position_good, scale_good;
 	char *locale;
+	char *path, *uri;
+	int res, size;
+	char *buf;
 
 	g_assert (NAUTILUS_IS_ICON_CONTAINER (container));
 	g_assert (NAUTILUS_IS_FILE (file));
@@ -291,6 +294,28 @@
 		 &position->x, &position->y) == 2;
 	g_free (position_string);
 
+	/* If it is the desktop directory, maybe the gnome-libs metadata has information about it */
+
+	if (!position_good) {
+		if (nautilus_file_is_local (file) && nautilus_file_is_in_desktop (file)) {
+			uri = nautilus_file_get_uri (file);
+			path = gnome_vfs_get_local_path_from_uri (uri);
+
+			if (path != NULL) {
+				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");
@@ -1780,6 +1805,8 @@
 	char *position_string;
 	char *scale_string, *scale_string_x, *scale_string_y;
 	char *locale;
+	char *uri, *path;
+	char buf [128];
 
 	g_assert (FM_IS_ICON_VIEW (icon_view));
 	g_assert (container == get_icon_container (icon_view));
@@ -1814,6 +1841,20 @@
 			(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)) {
+			uri = nautilus_file_get_uri (file);
+			path = gnome_vfs_get_local_path_from_uri (uri);
+
+			if (path != NULL) {
+				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: 





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