summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarin Adler <darin@src.gnome.org>2000-08-17 21:57:13 +0000
committerDarin Adler <darin@src.gnome.org>2000-08-17 21:57:13 +0000
commit56d7a0273d5dc121cbb752e5fe82bdd9a85a4039 (patch)
tree9a43d101f4019e71dd773c46117aeb94aa036094
parent7c94dde4e4e348b0b4fcea4954fe2c2dda4e0542 (diff)
downloadnautilus-56d7a0273d5dc121cbb752e5fe82bdd9a85a4039.tar.gz
Remove extra parameters now that the initial files callback is gone. It
* components/tree/nautilus-tree-model.c: (nautilus_tree_model_monitor_node): * libnautilus-extensions/nautilus-directory-async.c: (nautilus_directory_monitor_add_internal): * libnautilus-extensions/nautilus-directory-background.c: (nautilus_connect_background_to_directory_metadata): * libnautilus-extensions/nautilus-directory-private.h: * libnautilus-extensions/nautilus-directory.c: (nautilus_directory_file_monitor_add), (nautilus_self_check_directory): * libnautilus-extensions/nautilus-directory.h: * libnautilus-extensions/nautilus-file.c: (nautilus_file_monitor_add): * libnautilus-extensions/nautilus-trash-directory.c: (trash_file_monitor_add): * libnautilus-extensions/nautilus-vfs-directory.c: (vfs_file_monitor_add): * src/file-manager/fm-directory-view.c: (finish_loading_uri): * src/file-manager/nautilus-trash-monitor.c: (nautilus_trash_metadata_ready_callback): Remove extra parameters now that the initial files callback is gone. It turns out emitting another files_added signal works just fine. If it wasn't for the search list view, I could also merge the "file_added" and "files_changed" signals easily. Both of these changes would simplify the work on the virtual trash directory. * libnautilus-extensions/nautilus-link.h: * libnautilus-extensions/nautilus-link.c: Get rid of NAUTILUS_LINK constant, which looked like a link type, but was really an unrelated implementation detail. * libnautilus-extensions/nautilus-icon-container.c: (sort_icons), (resort), (lay_down_icons_tblr), (finish_adding_new_icons): Removed the file-manager-specific stuff Gene added for the desktop. I fight the continuing battle to keep NautilusIconContainer a general icon container, and not just for the Nautilus icon view. The drag code is still an exception to this that needs to be fixed some day (for NautilusList too). * src/file-manager/fm-desktop-icon-view.c: (fm_desktop_icon_view_initialize), (get_local_path), (get_sort_category), (desktop_icons_compare_callback): Rewrote sorting code from NautilusIconContainer and moved it here where it belongs.
-rw-r--r--ChangeLog48
-rw-r--r--components/tree/nautilus-tree-model.c4
-rw-r--r--libnautilus-extensions/nautilus-directory-async.c4
-rw-r--r--libnautilus-extensions/nautilus-directory-background.c13
-rw-r--r--libnautilus-extensions/nautilus-directory-private.h4
-rw-r--r--libnautilus-extensions/nautilus-directory.c26
-rw-r--r--libnautilus-extensions/nautilus-directory.h8
-rw-r--r--libnautilus-extensions/nautilus-file.c3
-rw-r--r--libnautilus-extensions/nautilus-icon-container.c139
-rw-r--r--libnautilus-extensions/nautilus-link.c6
-rw-r--r--libnautilus-extensions/nautilus-link.h1
-rw-r--r--libnautilus-extensions/nautilus-trash-directory.c33
-rw-r--r--libnautilus-extensions/nautilus-vfs-directory.c8
-rw-r--r--libnautilus-private/nautilus-directory-async.c4
-rw-r--r--libnautilus-private/nautilus-directory-background.c13
-rw-r--r--libnautilus-private/nautilus-directory-private.h4
-rw-r--r--libnautilus-private/nautilus-directory.c26
-rw-r--r--libnautilus-private/nautilus-directory.h8
-rw-r--r--libnautilus-private/nautilus-file.c3
-rw-r--r--libnautilus-private/nautilus-icon-container.c139
-rw-r--r--libnautilus-private/nautilus-link.c6
-rw-r--r--libnautilus-private/nautilus-link.h1
-rw-r--r--libnautilus-private/nautilus-trash-directory.c33
-rw-r--r--libnautilus-private/nautilus-vfs-directory.c8
-rw-r--r--src/file-manager/fm-desktop-icon-view.c145
-rw-r--r--src/file-manager/fm-directory-view.c7
-rw-r--r--src/file-manager/nautilus-trash-monitor.c12
27 files changed, 286 insertions, 420 deletions
diff --git a/ChangeLog b/ChangeLog
index 5d7c86b6f..1a69ca066 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+2000-08-17 Darin Adler <darin@eazel.com>
+
+ * components/tree/nautilus-tree-model.c:
+ (nautilus_tree_model_monitor_node):
+ * libnautilus-extensions/nautilus-directory-async.c:
+ (nautilus_directory_monitor_add_internal):
+ * libnautilus-extensions/nautilus-directory-background.c:
+ (nautilus_connect_background_to_directory_metadata):
+ * libnautilus-extensions/nautilus-directory-private.h:
+ * libnautilus-extensions/nautilus-directory.c:
+ (nautilus_directory_file_monitor_add),
+ (nautilus_self_check_directory):
+ * libnautilus-extensions/nautilus-directory.h:
+ * libnautilus-extensions/nautilus-file.c:
+ (nautilus_file_monitor_add):
+ * libnautilus-extensions/nautilus-trash-directory.c:
+ (trash_file_monitor_add):
+ * libnautilus-extensions/nautilus-vfs-directory.c:
+ (vfs_file_monitor_add):
+ * src/file-manager/fm-directory-view.c: (finish_loading_uri):
+ * src/file-manager/nautilus-trash-monitor.c:
+ (nautilus_trash_metadata_ready_callback):
+ Remove extra parameters now that the initial files callback is
+ gone. It turns out emitting another files_added signal works just
+ fine. If it wasn't for the search list view, I could also merge
+ the "file_added" and "files_changed" signals easily. Both of these
+ changes would simplify the work on the virtual trash directory.
+
+ * libnautilus-extensions/nautilus-link.h:
+ * libnautilus-extensions/nautilus-link.c:
+ Get rid of NAUTILUS_LINK constant, which looked like a link type,
+ but was really an unrelated implementation detail.
+
+ * libnautilus-extensions/nautilus-icon-container.c: (sort_icons),
+ (resort), (lay_down_icons_tblr), (finish_adding_new_icons):
+ Removed the file-manager-specific stuff Gene added for the desktop.
+ I fight the continuing battle to keep NautilusIconContainer a
+ general icon container, and not just for the Nautilus icon view.
+ The drag code is still an exception to this that needs to be fixed
+ some day (for NautilusList too).
+
+ * src/file-manager/fm-desktop-icon-view.c:
+ (fm_desktop_icon_view_initialize),
+ (get_local_path), (get_sort_category),
+ (desktop_icons_compare_callback):
+ Rewrote sorting code from NautilusIconContainer and moved it
+ here where it belongs.
+
2000-08-17 John Sullivan <sullivan@eazel.com>
Work on bug 1750 ("Reveal in New Window" feature for search results)
diff --git a/components/tree/nautilus-tree-model.c b/components/tree/nautilus-tree-model.c
index e38f29083..8c9496896 100644
--- a/components/tree/nautilus-tree-model.c
+++ b/components/tree/nautilus-tree-model.c
@@ -331,9 +331,7 @@ nautilus_tree_model_monitor_node (NautilusTreeModel *model,
model,
monitor_attributes,
FALSE,
- TRUE,
- (NautilusDirectoryCallback) nautilus_tree_model_directory_files_added_callback,
- model);
+ TRUE);
g_list_free (monitor_attributes);
diff --git a/libnautilus-extensions/nautilus-directory-async.c b/libnautilus-extensions/nautilus-directory-async.c
index 6f5c6f32a..ca9619f59 100644
--- a/libnautilus-extensions/nautilus-directory-async.c
+++ b/libnautilus-extensions/nautilus-directory-async.c
@@ -768,9 +768,7 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory,
NautilusFile *file,
gconstpointer client,
GList *file_attributes,
- gboolean monitor_metadata,
- NautilusDirectoryCallback callback,
- gpointer callback_data)
+ gboolean monitor_metadata)
{
Monitor *monitor;
diff --git a/libnautilus-extensions/nautilus-directory-background.c b/libnautilus-extensions/nautilus-directory-background.c
index d92bc97b5..0fa7618b0 100644
--- a/libnautilus-extensions/nautilus-directory-background.c
+++ b/libnautilus-extensions/nautilus-directory-background.c
@@ -709,13 +709,20 @@ nautilus_connect_background_to_directory_metadata (GtkWidget *widget,
background);
/* arrange to receive directory metadata */
+ /* FIXME: This says we want to monitor the file
+ * metadata, and it has the side effect of monitoring
+ * the file list. We want to monitor the directory
+ * metadata, which would not mean monitoring the file
+ * list. This may require a change to the
+ * NautilusDirectory API.
+ */
nautilus_directory_file_monitor_add (directory,
background,
- NULL, TRUE, FALSE,
- NULL, NULL);
+ NULL, TRUE, FALSE);
/* arrange for notification when the theme changes */
- nautilus_preferences_add_callback (NAUTILUS_PREFERENCES_THEME, nautilus_directory_background_theme_changed, background);
+ nautilus_preferences_add_callback (NAUTILUS_PREFERENCES_THEME,
+ nautilus_directory_background_theme_changed, background);
}
diff --git a/libnautilus-extensions/nautilus-directory-private.h b/libnautilus-extensions/nautilus-directory-private.h
index 77ac9bf0d..65d6aca4a 100644
--- a/libnautilus-extensions/nautilus-directory-private.h
+++ b/libnautilus-extensions/nautilus-directory-private.h
@@ -116,9 +116,7 @@ void nautilus_directory_monitor_add_internal (NautilusDirecto
NautilusFile *file,
gconstpointer client,
GList *attributes,
- gboolean monitor_metadata,
- NautilusDirectoryCallback callback,
- gpointer callback_data);
+ gboolean monitor_metadata);
void nautilus_directory_monitor_remove_internal (NautilusDirectory *directory,
NautilusFile *file,
gconstpointer client);
diff --git a/libnautilus-extensions/nautilus-directory.c b/libnautilus-extensions/nautilus-directory.c
index 153fa8da7..94996af6e 100644
--- a/libnautilus-extensions/nautilus-directory.c
+++ b/libnautilus-extensions/nautilus-directory.c
@@ -944,9 +944,7 @@ nautilus_directory_file_monitor_add (NautilusDirectory *directory,
gconstpointer client,
GList *file_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback callback,
- gpointer callback_data)
+ gboolean force_reload)
{
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
g_return_if_fail (client != NULL);
@@ -955,8 +953,7 @@ nautilus_directory_file_monitor_add (NautilusDirectory *directory,
(NAUTILUS_DIRECTORY_CLASS, directory,
file_monitor_add, (directory, client,
file_attributes, monitor_metadata,
- force_reload,
- callback, callback_data));
+ force_reload));
}
void
@@ -988,21 +985,10 @@ nautilus_directory_is_not_empty (NautilusDirectory *directory)
#include "nautilus-file-attributes.h"
static int data_dummy;
-static guint file_count;
static gboolean got_metadata_flag;
static gboolean got_files_flag;
static void
-get_files_callback (NautilusDirectory *directory, GList *files, gpointer callback_data)
-{
- g_assert (NAUTILUS_IS_DIRECTORY (directory));
- g_assert (files != NULL);
- g_assert (callback_data == &data_dummy);
-
- file_count += g_list_length (files);
-}
-
-static void
got_metadata_callback (NautilusDirectory *directory, GList *files, gpointer callback_data)
{
g_assert (NAUTILUS_IS_DIRECTORY (directory));
@@ -1039,11 +1025,9 @@ nautilus_self_check_directory (void)
NAUTILUS_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 1);
- file_count = 0;
nautilus_directory_file_monitor_add
- (directory, &file_count,
- NULL, FALSE, FALSE,
- get_files_callback, &data_dummy);
+ (directory, &data_dummy,
+ NULL, FALSE, FALSE);
got_metadata_flag = FALSE;
nautilus_directory_call_when_ready (directory, NULL, TRUE,
@@ -1080,7 +1064,7 @@ nautilus_self_check_directory (void)
NAUTILUS_CHECK_BOOLEAN_RESULT (nautilus_directory_get ("file:///etc////") == directory, TRUE);
nautilus_directory_unref (directory);
- nautilus_directory_file_monitor_remove (directory, &file_count);
+ nautilus_directory_file_monitor_remove (directory, &data_dummy);
nautilus_directory_unref (directory);
diff --git a/libnautilus-extensions/nautilus-directory.h b/libnautilus-extensions/nautilus-directory.h
index 95fb68589..03c2dabd7 100644
--- a/libnautilus-extensions/nautilus-directory.h
+++ b/libnautilus-extensions/nautilus-directory.h
@@ -122,9 +122,7 @@ typedef struct
gconstpointer client,
GList *monitor_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback initial_files_callback,
- gpointer callback_data);
+ gboolean force_reload);
void (* file_monitor_remove) (NautilusDirectory *directory,
gconstpointer client);
gboolean (* are_all_files_seen) (NautilusDirectory *directory);
@@ -206,9 +204,7 @@ void nautilus_directory_file_monitor_add (NautilusDirectory
gconstpointer client,
GList *monitor_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback initial_files_callback,
- gpointer callback_data);
+ gboolean force_reload);
void nautilus_directory_file_monitor_remove (NautilusDirectory *directory,
gconstpointer client);
diff --git a/libnautilus-extensions/nautilus-file.c b/libnautilus-extensions/nautilus-file.c
index fd20a77a8..e040ab39f 100644
--- a/libnautilus-extensions/nautilus-file.c
+++ b/libnautilus-extensions/nautilus-file.c
@@ -1551,8 +1551,7 @@ nautilus_file_monitor_add (NautilusFile *file,
nautilus_directory_monitor_add_internal
(file->details->directory, file,
client,
- attributes, monitor_metadata,
- NULL, NULL);
+ attributes, monitor_metadata);
}
void
diff --git a/libnautilus-extensions/nautilus-icon-container.c b/libnautilus-extensions/nautilus-icon-container.c
index 840734de3..6bae28f10 100644
--- a/libnautilus-extensions/nautilus-icon-container.c
+++ b/libnautilus-extensions/nautilus-icon-container.c
@@ -26,20 +26,7 @@
#include <config.h>
#include "nautilus-icon-container.h"
-#include <ctype.h>
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <libgnomevfs/gnome-vfs-uri.h>
-#include <gdk/gdkkeysyms.h>
-#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkmain.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-
#include "nautilus-background.h"
-#include "nautilus-file.h"
#include "nautilus-font-factory.h"
#include "nautilus-gdk-pixbuf-extensions.h"
#include "nautilus-glib-extensions.h"
@@ -47,11 +34,19 @@
#include "nautilus-gnome-extensions.h"
#include "nautilus-gtk-extensions.h"
#include "nautilus-gtk-macros.h"
+#include "nautilus-icon-private.h"
#include "nautilus-icon-text-item.h"
#include "nautilus-lib-self-check-functions.h"
-#include "nautilus-link.h"
#include "nautilus-theme.h"
-#include "nautilus-icon-private.h"
+#include <ctype.h>
+#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtkmain.h>
+#include <gtk/gtksignal.h>
+#include <libgnomeui/gnome-canvas-rect-ellipse.h>
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
/* Interval for updating the rubberband selection, in milliseconds. */
#define RUBBERBAND_TIMEOUT_INTERVAL 10
@@ -129,7 +124,9 @@ static void icon_get_bounding_box (NautilusIcon *icon,
int *x2_return,
int *y2_return);
-NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusIconContainer, nautilus_icon_container, GNOME_TYPE_CANVAS)
+NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusIconContainer,
+ nautilus_icon_container,
+ GNOME_TYPE_CANVAS)
/* The NautilusIconContainer signals. */
enum {
@@ -542,11 +539,18 @@ compare_icons (gconstpointer a, gconstpointer b)
}
static void
-resort (NautilusIconContainer *container)
+sort_icons (NautilusIconContainer *container,
+ GList **icons)
{
sort_hack_container = container;
- container->details->icons = g_list_sort
- (container->details->icons, compare_icons);
+ *icons = g_list_sort
+ (*icons, compare_icons);
+}
+
+static void
+resort (NautilusIconContainer *container)
+{
+ sort_icons (container, &container->details->icons);
}
/* Given an icon's bounds, compute the width of the space it should be
@@ -669,95 +673,6 @@ lay_down_icons_horizontal (NautilusIconContainer *container,
}
}
-static int
-desktop_icons_sort (gconstpointer a, gconstpointer b)
-{
- const NautilusIcon *icon_a, *icon_b;
- char *uri_a, *uri_b;
- const char *path_a, *path_b;
- GnomeVFSURI *vfs_uri_a, *vfs_uri_b;
- NautilusFile *file_a, *file_b;
- char *link_type;
-
- icon_a = a;
- icon_b = b;
-
- uri_a = nautilus_icon_container_get_icon_uri (sort_hack_container, (NautilusIcon *)icon_a);
- uri_b = nautilus_icon_container_get_icon_uri (sort_hack_container, (NautilusIcon *)icon_b);
- if (uri_a == NULL || uri_b == NULL) {
- return 0;
- }
-
- file_a = nautilus_file_get (uri_a);
- g_assert (file_a);
- file_b = nautilus_file_get (uri_b);
- g_assert (file_b);
-
- /* Non link files go in the middle */
- if (!nautilus_file_is_nautilus_link (file_a)) {
- nautilus_file_unref (file_a);
- nautilus_file_unref (file_b);
- g_free (uri_a);
- g_free (uri_b);
- return 0;
- }
-
- if (!nautilus_file_is_nautilus_link (file_b)) {
- nautilus_file_unref (file_a);
- nautilus_file_unref (file_b);
- g_free (uri_a);
- g_free (uri_b);
- return 0;
- }
-
- /* Get uris */
- vfs_uri_a = gnome_vfs_uri_new (uri_a);
- g_assert (vfs_uri_a);
- vfs_uri_b = gnome_vfs_uri_new (uri_b);
- g_assert (vfs_uri_b);
-
- /* Get paths */
- path_a = gnome_vfs_uri_get_path (vfs_uri_a);
- g_assert (path_a);
- path_b = gnome_vfs_uri_get_path (vfs_uri_b);
- g_assert (path_b);
-
- /* Done with NautilusFiles and uris */
- nautilus_file_unref (file_a);
- nautilus_file_unref (file_b);
- g_free (uri_a);
- g_free (uri_b);
-
- /* Home directory goes first */
- link_type = nautilus_link_get_link_type (path_a);
- if (link_type) {
- if (strcmp (link_type, NAUTILUS_LINK_HOME) == 0) {
- gnome_vfs_uri_unref (vfs_uri_a);
- gnome_vfs_uri_unref (vfs_uri_b);
- g_free (link_type);
- return -1;
- }
- g_free (link_type);
- }
-
- link_type = nautilus_link_get_link_type (path_b);
- if (link_type) {
- if (strcmp (link_type, NAUTILUS_LINK_HOME) == 0) {
- gnome_vfs_uri_unref (vfs_uri_a);
- gnome_vfs_uri_unref (vfs_uri_b);
- g_free (link_type);
- return 1;
- }
- g_free (link_type);
- }
-
- /* If we get here, we don't care */
- gnome_vfs_uri_unref (vfs_uri_a);
- gnome_vfs_uri_unref (vfs_uri_b);
-
- return 0;
-}
-
/* Search for available space at location */
static gboolean
find_open_grid_space (NautilusIcon *icon, int **icon_grid, int num_rows,
@@ -905,10 +820,6 @@ lay_down_icons_tblr (NautilusIconContainer *container, GList *icons)
int num_rows, num_columns;
int row, column;
- /* Sort the icons according to our desktop rules */
- sort_hack_container = container;
- icons = g_list_sort (icons, desktop_icons_sort);
-
/* Get container dimensions */
width = GTK_WIDGET (container)->allocation.width;
height = GTK_WIDGET (container)->allocation.height;
@@ -920,7 +831,7 @@ lay_down_icons_tblr (NautilusIconContainer *container, GList *icons)
total = g_list_length (container->details->icons);
new_length = g_list_length (icons);
placed = total - new_length;
- if (placed > 0) {
+ if (placed > 0) {
/* Add only placed icons in list */
for (p = container->details->icons; p != NULL; p = p->next) {
icon = p->data;
@@ -3373,7 +3284,7 @@ finish_adding_new_icons (NautilusIconContainer *container)
if (no_position_icons != NULL) {
g_assert (!container->details->auto_layout);
- no_position_icons = g_list_reverse (no_position_icons);
+ sort_icons (container, &no_position_icons);
get_all_icon_bounds (container, NULL, NULL, NULL, &bottom);
lay_down_icons (container, no_position_icons, bottom + ICON_PAD_BOTTOM);
g_list_free (no_position_icons);
diff --git a/libnautilus-extensions/nautilus-link.c b/libnautilus-extensions/nautilus-link.c
index a596cf28f..c16f656f5 100644
--- a/libnautilus-extensions/nautilus-link.c
+++ b/libnautilus-extensions/nautilus-link.c
@@ -70,7 +70,7 @@ nautilus_link_create (const char *directory_path,
/* Add mime magic string so that the mime sniffer can recognize us.
* Note: The value of the tag identfies what type of link this. */
- xmlSetProp (root_node, NAUTILUS_LINK, NAUTILUS_LINK_GENERIC);
+ xmlSetProp (root_node, "NAUTILUS_LINK", NAUTILUS_LINK_GENERIC);
/* Add link and custom icon tags */
xmlSetProp (root_node, "CUSTOM_ICON", image);
@@ -146,7 +146,7 @@ nautilus_link_set_type (const char *path, const char *type)
}
xmlSetProp (xmlDocGetRootElement (document),
- NAUTILUS_LINK,
+ "NAUTILUS_LINK",
type);
xmlSaveFile (path, document);
xmlFreeDoc (document);
@@ -350,7 +350,7 @@ nautilus_link_get_link_type (const char *path)
{
/* FIXME: This interface requires sync. I/O. */
return nautilus_link_get_root_property
- (path, NAUTILUS_LINK);
+ (path, "NAUTILUS_LINK");
}
/* FIXME: Caller has to know to pass in a file with a NUL character at
diff --git a/libnautilus-extensions/nautilus-link.h b/libnautilus-extensions/nautilus-link.h
index e4f5ef61b..0d9bf0a37 100644
--- a/libnautilus-extensions/nautilus-link.h
+++ b/libnautilus-extensions/nautilus-link.h
@@ -29,7 +29,6 @@
#include "nautilus-file.h"
/* Link types */
-#define NAUTILUS_LINK "NAUTILUS_LINK"
#define NAUTILUS_LINK_GENERIC "Generic Link"
#define NAUTILUS_LINK_TRASH "Trash Link"
#define NAUTILUS_LINK_MOUNT "Mount Link"
diff --git a/libnautilus-extensions/nautilus-trash-directory.c b/libnautilus-extensions/nautilus-trash-directory.c
index 47ce7b412..ffa04cece 100644
--- a/libnautilus-extensions/nautilus-trash-directory.c
+++ b/libnautilus-extensions/nautilus-trash-directory.c
@@ -289,35 +289,17 @@ trash_cancel_callback (NautilusDirectory *directory,
trash_callback_destroy (trash_callback);
}
-/* Add the files that are passed to make one large list. */
-static void
-trash_files_callback (NautilusDirectory *directory,
- GList *files,
- gpointer callback_data)
-{
- GList **merged_file_list;
-
- g_assert (NAUTILUS_IS_DIRECTORY (directory));
- g_assert (callback_data != NULL);
-
- merged_file_list = callback_data;
- *merged_file_list = g_list_concat
- (*merged_file_list, nautilus_file_list_copy (files));
-}
-
/* Create a monitor on each of the directories in the list. */
static void
trash_file_monitor_add (NautilusDirectory *directory,
gconstpointer client,
GList *file_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback callback,
- gpointer callback_data)
+ gboolean force_reload)
{
NautilusTrashDirectory *trash;
gpointer unique_client;
- GList *p, *merged_file_list;
+ GList *p;
trash = NAUTILUS_TRASH_DIRECTORY (directory);
@@ -333,20 +315,11 @@ trash_file_monitor_add (NautilusDirectory *directory,
}
/* Call through to the real directory add calls. */
- merged_file_list = NULL;
for (p = trash->details->directories; p != NULL; p = p->next) {
nautilus_directory_file_monitor_add
(p->data, unique_client,
- file_attributes, monitor_metadata, force_reload,
- callback == NULL ? NULL : trash_files_callback,
- &merged_file_list);
- }
-
- /* Now do the callback, with the total list. */
- if (callback != NULL) {
- (* callback) (directory, merged_file_list, callback_data);
+ file_attributes, monitor_metadata, force_reload);
}
- nautilus_file_list_free (merged_file_list);
}
/* Remove the monitor from each of the directories in the list. */
diff --git a/libnautilus-extensions/nautilus-vfs-directory.c b/libnautilus-extensions/nautilus-vfs-directory.c
index fe434c352..e698ef339 100644
--- a/libnautilus-extensions/nautilus-vfs-directory.c
+++ b/libnautilus-extensions/nautilus-vfs-directory.c
@@ -106,9 +106,7 @@ vfs_file_monitor_add (NautilusDirectory *directory,
gconstpointer client,
GList *file_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback callback,
- gpointer callback_data)
+ gboolean force_reload)
{
g_assert (NAUTILUS_IS_VFS_DIRECTORY (directory));
g_assert (client != NULL);
@@ -120,9 +118,7 @@ vfs_file_monitor_add (NautilusDirectory *directory,
nautilus_directory_monitor_add_internal
(directory, NULL,
client,
- file_attributes, monitor_metadata,
- force_reload ? NULL : callback,
- callback_data);
+ file_attributes, monitor_metadata);
}
static void
diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c
index 6f5c6f32a..ca9619f59 100644
--- a/libnautilus-private/nautilus-directory-async.c
+++ b/libnautilus-private/nautilus-directory-async.c
@@ -768,9 +768,7 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory,
NautilusFile *file,
gconstpointer client,
GList *file_attributes,
- gboolean monitor_metadata,
- NautilusDirectoryCallback callback,
- gpointer callback_data)
+ gboolean monitor_metadata)
{
Monitor *monitor;
diff --git a/libnautilus-private/nautilus-directory-background.c b/libnautilus-private/nautilus-directory-background.c
index d92bc97b5..0fa7618b0 100644
--- a/libnautilus-private/nautilus-directory-background.c
+++ b/libnautilus-private/nautilus-directory-background.c
@@ -709,13 +709,20 @@ nautilus_connect_background_to_directory_metadata (GtkWidget *widget,
background);
/* arrange to receive directory metadata */
+ /* FIXME: This says we want to monitor the file
+ * metadata, and it has the side effect of monitoring
+ * the file list. We want to monitor the directory
+ * metadata, which would not mean monitoring the file
+ * list. This may require a change to the
+ * NautilusDirectory API.
+ */
nautilus_directory_file_monitor_add (directory,
background,
- NULL, TRUE, FALSE,
- NULL, NULL);
+ NULL, TRUE, FALSE);
/* arrange for notification when the theme changes */
- nautilus_preferences_add_callback (NAUTILUS_PREFERENCES_THEME, nautilus_directory_background_theme_changed, background);
+ nautilus_preferences_add_callback (NAUTILUS_PREFERENCES_THEME,
+ nautilus_directory_background_theme_changed, background);
}
diff --git a/libnautilus-private/nautilus-directory-private.h b/libnautilus-private/nautilus-directory-private.h
index 77ac9bf0d..65d6aca4a 100644
--- a/libnautilus-private/nautilus-directory-private.h
+++ b/libnautilus-private/nautilus-directory-private.h
@@ -116,9 +116,7 @@ void nautilus_directory_monitor_add_internal (NautilusDirecto
NautilusFile *file,
gconstpointer client,
GList *attributes,
- gboolean monitor_metadata,
- NautilusDirectoryCallback callback,
- gpointer callback_data);
+ gboolean monitor_metadata);
void nautilus_directory_monitor_remove_internal (NautilusDirectory *directory,
NautilusFile *file,
gconstpointer client);
diff --git a/libnautilus-private/nautilus-directory.c b/libnautilus-private/nautilus-directory.c
index 153fa8da7..94996af6e 100644
--- a/libnautilus-private/nautilus-directory.c
+++ b/libnautilus-private/nautilus-directory.c
@@ -944,9 +944,7 @@ nautilus_directory_file_monitor_add (NautilusDirectory *directory,
gconstpointer client,
GList *file_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback callback,
- gpointer callback_data)
+ gboolean force_reload)
{
g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory));
g_return_if_fail (client != NULL);
@@ -955,8 +953,7 @@ nautilus_directory_file_monitor_add (NautilusDirectory *directory,
(NAUTILUS_DIRECTORY_CLASS, directory,
file_monitor_add, (directory, client,
file_attributes, monitor_metadata,
- force_reload,
- callback, callback_data));
+ force_reload));
}
void
@@ -988,21 +985,10 @@ nautilus_directory_is_not_empty (NautilusDirectory *directory)
#include "nautilus-file-attributes.h"
static int data_dummy;
-static guint file_count;
static gboolean got_metadata_flag;
static gboolean got_files_flag;
static void
-get_files_callback (NautilusDirectory *directory, GList *files, gpointer callback_data)
-{
- g_assert (NAUTILUS_IS_DIRECTORY (directory));
- g_assert (files != NULL);
- g_assert (callback_data == &data_dummy);
-
- file_count += g_list_length (files);
-}
-
-static void
got_metadata_callback (NautilusDirectory *directory, GList *files, gpointer callback_data)
{
g_assert (NAUTILUS_IS_DIRECTORY (directory));
@@ -1039,11 +1025,9 @@ nautilus_self_check_directory (void)
NAUTILUS_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 1);
- file_count = 0;
nautilus_directory_file_monitor_add
- (directory, &file_count,
- NULL, FALSE, FALSE,
- get_files_callback, &data_dummy);
+ (directory, &data_dummy,
+ NULL, FALSE, FALSE);
got_metadata_flag = FALSE;
nautilus_directory_call_when_ready (directory, NULL, TRUE,
@@ -1080,7 +1064,7 @@ nautilus_self_check_directory (void)
NAUTILUS_CHECK_BOOLEAN_RESULT (nautilus_directory_get ("file:///etc////") == directory, TRUE);
nautilus_directory_unref (directory);
- nautilus_directory_file_monitor_remove (directory, &file_count);
+ nautilus_directory_file_monitor_remove (directory, &data_dummy);
nautilus_directory_unref (directory);
diff --git a/libnautilus-private/nautilus-directory.h b/libnautilus-private/nautilus-directory.h
index 95fb68589..03c2dabd7 100644
--- a/libnautilus-private/nautilus-directory.h
+++ b/libnautilus-private/nautilus-directory.h
@@ -122,9 +122,7 @@ typedef struct
gconstpointer client,
GList *monitor_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback initial_files_callback,
- gpointer callback_data);
+ gboolean force_reload);
void (* file_monitor_remove) (NautilusDirectory *directory,
gconstpointer client);
gboolean (* are_all_files_seen) (NautilusDirectory *directory);
@@ -206,9 +204,7 @@ void nautilus_directory_file_monitor_add (NautilusDirectory
gconstpointer client,
GList *monitor_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback initial_files_callback,
- gpointer callback_data);
+ gboolean force_reload);
void nautilus_directory_file_monitor_remove (NautilusDirectory *directory,
gconstpointer client);
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index fd20a77a8..e040ab39f 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -1551,8 +1551,7 @@ nautilus_file_monitor_add (NautilusFile *file,
nautilus_directory_monitor_add_internal
(file->details->directory, file,
client,
- attributes, monitor_metadata,
- NULL, NULL);
+ attributes, monitor_metadata);
}
void
diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c
index 840734de3..6bae28f10 100644
--- a/libnautilus-private/nautilus-icon-container.c
+++ b/libnautilus-private/nautilus-icon-container.c
@@ -26,20 +26,7 @@
#include <config.h>
#include "nautilus-icon-container.h"
-#include <ctype.h>
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <libgnomevfs/gnome-vfs-uri.h>
-#include <gdk/gdkkeysyms.h>
-#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkmain.h>
-#include <libgnomeui/gnome-canvas-rect-ellipse.h>
-
#include "nautilus-background.h"
-#include "nautilus-file.h"
#include "nautilus-font-factory.h"
#include "nautilus-gdk-pixbuf-extensions.h"
#include "nautilus-glib-extensions.h"
@@ -47,11 +34,19 @@
#include "nautilus-gnome-extensions.h"
#include "nautilus-gtk-extensions.h"
#include "nautilus-gtk-macros.h"
+#include "nautilus-icon-private.h"
#include "nautilus-icon-text-item.h"
#include "nautilus-lib-self-check-functions.h"
-#include "nautilus-link.h"
#include "nautilus-theme.h"
-#include "nautilus-icon-private.h"
+#include <ctype.h>
+#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtkmain.h>
+#include <gtk/gtksignal.h>
+#include <libgnomeui/gnome-canvas-rect-ellipse.h>
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
/* Interval for updating the rubberband selection, in milliseconds. */
#define RUBBERBAND_TIMEOUT_INTERVAL 10
@@ -129,7 +124,9 @@ static void icon_get_bounding_box (NautilusIcon *icon,
int *x2_return,
int *y2_return);
-NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusIconContainer, nautilus_icon_container, GNOME_TYPE_CANVAS)
+NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusIconContainer,
+ nautilus_icon_container,
+ GNOME_TYPE_CANVAS)
/* The NautilusIconContainer signals. */
enum {
@@ -542,11 +539,18 @@ compare_icons (gconstpointer a, gconstpointer b)
}
static void
-resort (NautilusIconContainer *container)
+sort_icons (NautilusIconContainer *container,
+ GList **icons)
{
sort_hack_container = container;
- container->details->icons = g_list_sort
- (container->details->icons, compare_icons);
+ *icons = g_list_sort
+ (*icons, compare_icons);
+}
+
+static void
+resort (NautilusIconContainer *container)
+{
+ sort_icons (container, &container->details->icons);
}
/* Given an icon's bounds, compute the width of the space it should be
@@ -669,95 +673,6 @@ lay_down_icons_horizontal (NautilusIconContainer *container,
}
}
-static int
-desktop_icons_sort (gconstpointer a, gconstpointer b)
-{
- const NautilusIcon *icon_a, *icon_b;
- char *uri_a, *uri_b;
- const char *path_a, *path_b;
- GnomeVFSURI *vfs_uri_a, *vfs_uri_b;
- NautilusFile *file_a, *file_b;
- char *link_type;
-
- icon_a = a;
- icon_b = b;
-
- uri_a = nautilus_icon_container_get_icon_uri (sort_hack_container, (NautilusIcon *)icon_a);
- uri_b = nautilus_icon_container_get_icon_uri (sort_hack_container, (NautilusIcon *)icon_b);
- if (uri_a == NULL || uri_b == NULL) {
- return 0;
- }
-
- file_a = nautilus_file_get (uri_a);
- g_assert (file_a);
- file_b = nautilus_file_get (uri_b);
- g_assert (file_b);
-
- /* Non link files go in the middle */
- if (!nautilus_file_is_nautilus_link (file_a)) {
- nautilus_file_unref (file_a);
- nautilus_file_unref (file_b);
- g_free (uri_a);
- g_free (uri_b);
- return 0;
- }
-
- if (!nautilus_file_is_nautilus_link (file_b)) {
- nautilus_file_unref (file_a);
- nautilus_file_unref (file_b);
- g_free (uri_a);
- g_free (uri_b);
- return 0;
- }
-
- /* Get uris */
- vfs_uri_a = gnome_vfs_uri_new (uri_a);
- g_assert (vfs_uri_a);
- vfs_uri_b = gnome_vfs_uri_new (uri_b);
- g_assert (vfs_uri_b);
-
- /* Get paths */
- path_a = gnome_vfs_uri_get_path (vfs_uri_a);
- g_assert (path_a);
- path_b = gnome_vfs_uri_get_path (vfs_uri_b);
- g_assert (path_b);
-
- /* Done with NautilusFiles and uris */
- nautilus_file_unref (file_a);
- nautilus_file_unref (file_b);
- g_free (uri_a);
- g_free (uri_b);
-
- /* Home directory goes first */
- link_type = nautilus_link_get_link_type (path_a);
- if (link_type) {
- if (strcmp (link_type, NAUTILUS_LINK_HOME) == 0) {
- gnome_vfs_uri_unref (vfs_uri_a);
- gnome_vfs_uri_unref (vfs_uri_b);
- g_free (link_type);
- return -1;
- }
- g_free (link_type);
- }
-
- link_type = nautilus_link_get_link_type (path_b);
- if (link_type) {
- if (strcmp (link_type, NAUTILUS_LINK_HOME) == 0) {
- gnome_vfs_uri_unref (vfs_uri_a);
- gnome_vfs_uri_unref (vfs_uri_b);
- g_free (link_type);
- return 1;
- }
- g_free (link_type);
- }
-
- /* If we get here, we don't care */
- gnome_vfs_uri_unref (vfs_uri_a);
- gnome_vfs_uri_unref (vfs_uri_b);
-
- return 0;
-}
-
/* Search for available space at location */
static gboolean
find_open_grid_space (NautilusIcon *icon, int **icon_grid, int num_rows,
@@ -905,10 +820,6 @@ lay_down_icons_tblr (NautilusIconContainer *container, GList *icons)
int num_rows, num_columns;
int row, column;
- /* Sort the icons according to our desktop rules */
- sort_hack_container = container;
- icons = g_list_sort (icons, desktop_icons_sort);
-
/* Get container dimensions */
width = GTK_WIDGET (container)->allocation.width;
height = GTK_WIDGET (container)->allocation.height;
@@ -920,7 +831,7 @@ lay_down_icons_tblr (NautilusIconContainer *container, GList *icons)
total = g_list_length (container->details->icons);
new_length = g_list_length (icons);
placed = total - new_length;
- if (placed > 0) {
+ if (placed > 0) {
/* Add only placed icons in list */
for (p = container->details->icons; p != NULL; p = p->next) {
icon = p->data;
@@ -3373,7 +3284,7 @@ finish_adding_new_icons (NautilusIconContainer *container)
if (no_position_icons != NULL) {
g_assert (!container->details->auto_layout);
- no_position_icons = g_list_reverse (no_position_icons);
+ sort_icons (container, &no_position_icons);
get_all_icon_bounds (container, NULL, NULL, NULL, &bottom);
lay_down_icons (container, no_position_icons, bottom + ICON_PAD_BOTTOM);
g_list_free (no_position_icons);
diff --git a/libnautilus-private/nautilus-link.c b/libnautilus-private/nautilus-link.c
index a596cf28f..c16f656f5 100644
--- a/libnautilus-private/nautilus-link.c
+++ b/libnautilus-private/nautilus-link.c
@@ -70,7 +70,7 @@ nautilus_link_create (const char *directory_path,
/* Add mime magic string so that the mime sniffer can recognize us.
* Note: The value of the tag identfies what type of link this. */
- xmlSetProp (root_node, NAUTILUS_LINK, NAUTILUS_LINK_GENERIC);
+ xmlSetProp (root_node, "NAUTILUS_LINK", NAUTILUS_LINK_GENERIC);
/* Add link and custom icon tags */
xmlSetProp (root_node, "CUSTOM_ICON", image);
@@ -146,7 +146,7 @@ nautilus_link_set_type (const char *path, const char *type)
}
xmlSetProp (xmlDocGetRootElement (document),
- NAUTILUS_LINK,
+ "NAUTILUS_LINK",
type);
xmlSaveFile (path, document);
xmlFreeDoc (document);
@@ -350,7 +350,7 @@ nautilus_link_get_link_type (const char *path)
{
/* FIXME: This interface requires sync. I/O. */
return nautilus_link_get_root_property
- (path, NAUTILUS_LINK);
+ (path, "NAUTILUS_LINK");
}
/* FIXME: Caller has to know to pass in a file with a NUL character at
diff --git a/libnautilus-private/nautilus-link.h b/libnautilus-private/nautilus-link.h
index e4f5ef61b..0d9bf0a37 100644
--- a/libnautilus-private/nautilus-link.h
+++ b/libnautilus-private/nautilus-link.h
@@ -29,7 +29,6 @@
#include "nautilus-file.h"
/* Link types */
-#define NAUTILUS_LINK "NAUTILUS_LINK"
#define NAUTILUS_LINK_GENERIC "Generic Link"
#define NAUTILUS_LINK_TRASH "Trash Link"
#define NAUTILUS_LINK_MOUNT "Mount Link"
diff --git a/libnautilus-private/nautilus-trash-directory.c b/libnautilus-private/nautilus-trash-directory.c
index 47ce7b412..ffa04cece 100644
--- a/libnautilus-private/nautilus-trash-directory.c
+++ b/libnautilus-private/nautilus-trash-directory.c
@@ -289,35 +289,17 @@ trash_cancel_callback (NautilusDirectory *directory,
trash_callback_destroy (trash_callback);
}
-/* Add the files that are passed to make one large list. */
-static void
-trash_files_callback (NautilusDirectory *directory,
- GList *files,
- gpointer callback_data)
-{
- GList **merged_file_list;
-
- g_assert (NAUTILUS_IS_DIRECTORY (directory));
- g_assert (callback_data != NULL);
-
- merged_file_list = callback_data;
- *merged_file_list = g_list_concat
- (*merged_file_list, nautilus_file_list_copy (files));
-}
-
/* Create a monitor on each of the directories in the list. */
static void
trash_file_monitor_add (NautilusDirectory *directory,
gconstpointer client,
GList *file_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback callback,
- gpointer callback_data)
+ gboolean force_reload)
{
NautilusTrashDirectory *trash;
gpointer unique_client;
- GList *p, *merged_file_list;
+ GList *p;
trash = NAUTILUS_TRASH_DIRECTORY (directory);
@@ -333,20 +315,11 @@ trash_file_monitor_add (NautilusDirectory *directory,
}
/* Call through to the real directory add calls. */
- merged_file_list = NULL;
for (p = trash->details->directories; p != NULL; p = p->next) {
nautilus_directory_file_monitor_add
(p->data, unique_client,
- file_attributes, monitor_metadata, force_reload,
- callback == NULL ? NULL : trash_files_callback,
- &merged_file_list);
- }
-
- /* Now do the callback, with the total list. */
- if (callback != NULL) {
- (* callback) (directory, merged_file_list, callback_data);
+ file_attributes, monitor_metadata, force_reload);
}
- nautilus_file_list_free (merged_file_list);
}
/* Remove the monitor from each of the directories in the list. */
diff --git a/libnautilus-private/nautilus-vfs-directory.c b/libnautilus-private/nautilus-vfs-directory.c
index fe434c352..e698ef339 100644
--- a/libnautilus-private/nautilus-vfs-directory.c
+++ b/libnautilus-private/nautilus-vfs-directory.c
@@ -106,9 +106,7 @@ vfs_file_monitor_add (NautilusDirectory *directory,
gconstpointer client,
GList *file_attributes,
gboolean monitor_metadata,
- gboolean force_reload,
- NautilusDirectoryCallback callback,
- gpointer callback_data)
+ gboolean force_reload)
{
g_assert (NAUTILUS_IS_VFS_DIRECTORY (directory));
g_assert (client != NULL);
@@ -120,9 +118,7 @@ vfs_file_monitor_add (NautilusDirectory *directory,
nautilus_directory_monitor_add_internal
(directory, NULL,
client,
- file_attributes, monitor_metadata,
- force_reload ? NULL : callback,
- callback_data);
+ file_attributes, monitor_metadata);
}
static void
diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c
index 0d002d75a..03b1eb594 100644
--- a/src/file-manager/fm-desktop-icon-view.c
+++ b/src/file-manager/fm-desktop-icon-view.c
@@ -72,17 +72,21 @@ static gboolean fm_desktop_icon_view_get_directory_auto_layout (FMIco
static void fm_desktop_icon_view_set_directory_auto_layout (FMIconView *icon_view,
NautilusDirectory *directory,
gboolean auto_layout);
-static void fm_desktop_icon_view_trash_state_changed_callback (NautilusTrashMonitor *trash,
- gboolean state,
- gpointer callback_data);
-
-static void mount_unmount_removable (GtkCheckMenuItem *item,
- FMDesktopIconView *icon_view);
-static void place_home_directory (FMDesktopIconView *icon_view);
-static void remove_old_mount_links (void);
-
+static void fm_desktop_icon_view_trash_state_changed_callback (NautilusTrashMonitor *trash,
+ gboolean state,
+ gpointer callback_data);
+static void mount_unmount_removable (GtkCheckMenuItem *item,
+ FMDesktopIconView *icon_view);
+static void place_home_directory (FMDesktopIconView *icon_view);
+static void remove_old_mount_links (void);
+static int desktop_icons_compare_callback (NautilusIconContainer *container,
+ NautilusFile *file_a,
+ NautilusFile *file_b,
+ FMDesktopIconView *icon_view);
-NAUTILUS_DEFINE_CLASS_BOILERPLATE (FMDesktopIconView, fm_desktop_icon_view, FM_TYPE_ICON_VIEW);
+NAUTILUS_DEFINE_CLASS_BOILERPLATE (FMDesktopIconView,
+ fm_desktop_icon_view,
+ FM_TYPE_ICON_VIEW)
static NautilusIconContainer *
get_icon_container (FMDesktopIconView *icon_view)
@@ -110,7 +114,6 @@ fm_desktop_icon_view_destroy (GtkObject *object)
NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object));
}
-
static void
fm_desktop_icon_view_initialize_class (FMDesktopIconViewClass *klass)
{
@@ -175,7 +178,8 @@ fm_desktop_icon_view_handle_middle_click (NautilusIconContainer *icon_container,
static void
fm_desktop_icon_view_discover_trash_callback (GnomeVFSAsyncHandle *handle,
- GList *results, gpointer data)
+ GList *results,
+ gpointer callback_data)
{
#if 0
/* Debug code only for now.
@@ -229,7 +233,8 @@ fm_desktop_icon_view_initialize (FMDesktopIconView *desktop_icon_view)
nautilus_gtk_adjustment_set_value (vadj, 0);
/* Set our default layout mode */
- nautilus_icon_container_set_layout_mode (icon_container, NAUTILUS_ICON_LAYOUT_T_B_L_R);
+ nautilus_icon_container_set_layout_mode (icon_container,
+ NAUTILUS_ICON_LAYOUT_T_B_L_R);
/* Check for and clean up any old mount links that may have been left behind */
remove_old_mount_links ();
@@ -241,8 +246,12 @@ fm_desktop_icon_view_initialize (FMDesktopIconView *desktop_icon_view)
"middle_click",
GTK_SIGNAL_FUNC (fm_desktop_icon_view_handle_middle_click),
desktop_icon_view);
+ gtk_signal_connect (GTK_OBJECT (icon_container),
+ "compare_icons",
+ GTK_SIGNAL_FUNC (desktop_icons_compare_callback),
+ desktop_icon_view);
- gtk_signal_connect (GTK_OBJECT(nautilus_trash_monitor_get ()),
+ gtk_signal_connect (GTK_OBJECT (nautilus_trash_monitor_get ()),
"trash_state_changed",
fm_desktop_icon_view_trash_state_changed_callback,
desktop_icon_view);
@@ -335,37 +344,46 @@ fm_desktop_icon_view_create_background_context_menu_items (FMDirectoryView *view
}
static char *
-fm_desktop_icon_view_get_directory_sort_by (FMIconView *icon_view, NautilusDirectory *directory)
+fm_desktop_icon_view_get_directory_sort_by (FMIconView *icon_view,
+ NautilusDirectory *directory)
{
- return g_strdup("name");
+ return g_strdup ("name");
}
static void
-fm_desktop_icon_view_set_directory_sort_by (FMIconView *icon_view, NautilusDirectory *directory, const char* sort_by)
+fm_desktop_icon_view_set_directory_sort_by (FMIconView *icon_view,
+ NautilusDirectory *directory,
+ const char *sort_by)
{
/* do nothing - the desktop always uses the same sort_by */
}
static gboolean
-fm_desktop_icon_view_get_directory_sort_reversed (FMIconView *icon_view, NautilusDirectory *directory)
+fm_desktop_icon_view_get_directory_sort_reversed (FMIconView *icon_view,
+ NautilusDirectory *directory)
{
return FALSE;
}
static void
-fm_desktop_icon_view_set_directory_sort_reversed (FMIconView *icon_view, NautilusDirectory *directory, gboolean sort_reversed)
+fm_desktop_icon_view_set_directory_sort_reversed (FMIconView *icon_view,
+ NautilusDirectory *directory,
+ gboolean sort_reversed)
{
/* do nothing - the desktop always uses sort_reversed == FALSE */
}
static gboolean
-fm_desktop_icon_view_get_directory_auto_layout (FMIconView *icon_view, NautilusDirectory *directory)
+fm_desktop_icon_view_get_directory_auto_layout (FMIconView *icon_view,
+ NautilusDirectory *directory)
{
return FALSE;
}
static void
-fm_desktop_icon_view_set_directory_auto_layout (FMIconView *icon_view, NautilusDirectory *directory, gboolean auto_layout)
+fm_desktop_icon_view_set_directory_auto_layout (FMIconView *icon_view,
+ NautilusDirectory *directory,
+ gboolean auto_layout)
{
/* do nothing - the desktop always uses auto_layout == FALSE */
}
@@ -373,7 +391,7 @@ fm_desktop_icon_view_set_directory_auto_layout (FMIconView *icon_view, NautilusD
static void
fm_desktop_icon_view_trash_state_changed_callback (NautilusTrashMonitor *trash_monitor,
- gboolean state, gpointer callback_data)
+ gboolean state, gpointer callback_data)
{
char *desktop_directory_path, *path;
@@ -490,4 +508,87 @@ remove_old_mount_links (void)
closedir (current_dir);
}
+static char *
+get_local_path (NautilusFile *file)
+{
+ char *uri, *local_path;
+ uri = nautilus_file_get_uri (file);
+ local_path = nautilus_get_local_path_from_uri (uri);
+ g_free (uri);
+ return local_path;
+}
+
+/* Sort as follows:
+ * 1) home link
+ * 2) mount links
+ * 3) other
+ * 4) trash link
+ */
+
+typedef enum {
+ SORT_HOME_LINK,
+ SORT_MOUNT_LINK,
+ SORT_OTHER,
+ SORT_TRASH_LINK
+} SortCategory;
+
+static SortCategory
+get_sort_category (NautilusFile *file)
+{
+ char *path, *link_type;
+ SortCategory category;
+
+ if (!nautilus_file_is_nautilus_link (file)) {
+ category = SORT_OTHER;
+ } else {
+ path = get_local_path (file);
+ g_return_val_if_fail (path != NULL, SORT_OTHER);
+
+ link_type = nautilus_link_get_link_type (path);
+ if (link_type == NULL) {
+ category = SORT_OTHER;
+ } else if (strcmp (link_type, NAUTILUS_LINK_HOME) == 0) {
+ category = SORT_HOME_LINK;
+ } else if (strcmp (link_type, NAUTILUS_LINK_MOUNT) == 0) {
+ category = SORT_MOUNT_LINK;
+ } else if (strcmp (link_type, NAUTILUS_LINK_TRASH) == 0) {
+ category = SORT_TRASH_LINK;
+ } else {
+ category = SORT_OTHER;
+ }
+
+ g_free (path);
+ g_free (link_type);
+ }
+
+ return category;
+}
+
+static int
+desktop_icons_compare_callback (NautilusIconContainer *container,
+ NautilusFile *file_a,
+ NautilusFile *file_b,
+ FMDesktopIconView *icon_view)
+{
+ SortCategory category_a, category_b;
+
+ category_a = get_sort_category (file_a);
+ category_b = get_sort_category (file_b);
+
+ /* Let the previous handler do the compare. */
+ if (category_a == category_b) {
+ return 0;
+ }
+
+ /* We know the answer, so prevent the other handlers
+ * from overwriting our result.
+ */
+ gtk_signal_emit_stop_by_name (GTK_OBJECT (container),
+ "compare_icons");
+ if (category_a < category_b) {
+ return -1;
+ } else {
+ return +1;
+ }
+}
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index 8effec99d..d1ef95868 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -3405,8 +3405,7 @@ finish_loading_uri (FMDirectoryView *view)
attributes = g_list_prepend (attributes,
NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT);
nautilus_directory_file_monitor_add (view->details->model, view,
- attributes, FALSE, TRUE,
- files_added_callback, view);
+ attributes, FALSE, TRUE);
g_list_free (attributes);
/* Attach a handler to get any further files that show up as we
@@ -3417,12 +3416,12 @@ finish_loading_uri (FMDirectoryView *view)
view->details->files_added_handler_id = gtk_signal_connect
(GTK_OBJECT (view->details->model),
"files_added",
- GTK_SIGNAL_FUNC (files_added_callback),
+ files_added_callback,
view);
view->details->files_changed_handler_id = gtk_signal_connect
(GTK_OBJECT (view->details->model),
"files_changed",
- GTK_SIGNAL_FUNC (files_changed_callback),
+ files_changed_callback,
view);
}
diff --git a/src/file-manager/nautilus-trash-monitor.c b/src/file-manager/nautilus-trash-monitor.c
index d156493cc..e07255ca8 100644
--- a/src/file-manager/nautilus-trash-monitor.c
+++ b/src/file-manager/nautilus-trash-monitor.c
@@ -111,17 +111,15 @@ nautilus_trash_metadata_ready_callback (NautilusDirectory *directory, GList *fil
g_assert (trash_monitor->details->trash_directory == directory);
nautilus_directory_file_monitor_add (directory, trash_monitor,
- NULL, FALSE, TRUE,
- nautilus_trash_files_changed_callback,
- trash_monitor);
+ NULL, FALSE, TRUE);
/* Make sure we get notified about changes */
gtk_signal_connect (GTK_OBJECT (trash_monitor->details->trash_directory),
- "files_added", GTK_SIGNAL_FUNC (nautilus_trash_files_changed_callback),
- trash_monitor);
+ "files_added", GTK_SIGNAL_FUNC (nautilus_trash_files_changed_callback),
+ trash_monitor);
gtk_signal_connect (GTK_OBJECT (trash_monitor->details->trash_directory),
- "files_changed", GTK_SIGNAL_FUNC (nautilus_trash_files_changed_callback),
- trash_monitor);
+ "files_changed", GTK_SIGNAL_FUNC (nautilus_trash_files_changed_callback),
+ trash_monitor);
}
static void