summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog96
-rw-r--r--libnautilus-extensions/nautilus-directory-async.c198
-rw-r--r--libnautilus-extensions/nautilus-directory-private.h25
-rw-r--r--libnautilus-extensions/nautilus-file-attributes.h9
-rw-r--r--libnautilus-extensions/nautilus-file-operations.c2
-rw-r--r--libnautilus-extensions/nautilus-file.c74
-rw-r--r--libnautilus-extensions/nautilus-icon-factory.c158
-rw-r--r--libnautilus-extensions/nautilus-search-uri.c6
-rw-r--r--libnautilus-private/nautilus-directory-async.c198
-rw-r--r--libnautilus-private/nautilus-directory-private.h25
-rw-r--r--libnautilus-private/nautilus-file-attributes.h9
-rw-r--r--libnautilus-private/nautilus-file-operations.c2
-rw-r--r--libnautilus-private/nautilus-file.c74
-rw-r--r--libnautilus-private/nautilus-icon-factory.c158
-rw-r--r--libnautilus-private/nautilus-search-uri.c6
-rw-r--r--src/file-manager/fm-directory-view.c72
-rw-r--r--src/file-manager/fm-error-reporting.c23
-rw-r--r--src/nautilus-location-bar.c14
-rw-r--r--src/nautilus-location-bar.h5
-rw-r--r--src/nautilus-search-bar-criterion.c2
-rw-r--r--src/nautilus-theme-selector.c54
-rw-r--r--src/nautilus-window-manage-views.c9
22 files changed, 569 insertions, 650 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d61af213..6cdf0ce6f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,99 @@
+2000-12-06 Darin Adler <darin@eazel.com>
+
+ reviewed by: John Sullivan <sullivan@eazel.com>
+
+ Fixed bug 4992 ("New folder" menu item enable state doesn't follow
+ permissions), bug 4965 (Dragging multiple items to location bar
+ crashes Nautilus), and bug 4995 (Rename a file to bad name ->
+ error cites wrong filename).
+
+ Fixed a bug jsh spotted where we were doing the mod. time checks
+ wrong in the icon factory for thumbnails.
+
+ Did some wording fixes after menthos pointed out some problems.
+
+ * libnautilus-extensions/nautilus-icon-factory.c:
+ (get_cache_time): Split out this function to get the mtime of a
+ file so we can check when it changed.
+ (load_specific_icon): Get the time when loading an icon.
+ (scale_icon): Copy the time when making a scaled icon from an
+ existing icon.
+ (remove_icons_if_file_changed): New renamed function uses
+ get_cache_time to check if the icon needs recomputing because of a
+ change in the underlying file.
+ (get_icon_from_cache): Call the new remove_icons_if_file_changed.
+ (load_icon_with_embedded_text): Copy the time when making an icon
+ with text from an existing icon.
+
+ * libnautilus-extensions/nautilus-file-attributes.h: Added
+ ATTRIBUTE_CAPABILITIES (and sorted in alphabetical order).
+ * libnautilus-extensions/nautilus-directory-async.c:
+ (nautilus_directory_set_up_request): Changed the name of this,
+ made it public, and added ATTRIBUTE_CAPABILITIES as another
+ way to ask for the file info.
+ (cancel_loading_attributes),
+ (nautilus_directory_cancel_loading_file_attributes): Set up a
+ request and use it to decide what to cancel.
+ * libnautilus-extensions/nautilus-directory-private.h: Moved the
+ request structure and call into here so it can be used by
+ NautilusFile and NautilusDirectory both.
+ * libnautilus-extensions/nautilus-file.c:
+ (nautilus_file_forget_attributes_internal): Set up a request and
+ use it to decide what to forget.
+ (nautilus_file_forget_all_attributes): Add ATTRIBUTE_CAPABILITIES
+ to the set of things in "all".
+
+ * src/file-manager/fm-directory-view.c:
+ (check_for_directory_hard_limit): Added a FIXME and made some
+ minor wording improvements.
+ (file_changed_callback): Helper to schedule a menu update when
+ the directory's NautilusFile reports a change.
+ (load_directory): Add monitoring of the directory's "capabilities"
+ since they affect whether "New Folder" is allowed. Fixes 4992.
+ (disconnect_handler): Helper for the two functions below.
+ (disconnect_directory_handler): Disconnect a NautilusDirectory
+ handler.
+ (disconnect_directory_as_file_handler): Disconnect a NautilusFile
+ handler.
+ (disconnect_model_handlers): Add code to stop monitoring the
+ directory's "capabilities".
+
+ * src/file-manager/fm-error-reporting.c:
+ (fm_report_error_renaming_file): Got rid of some unneeded "\n"
+ characters. Improved the error message in the "/"-forbidden case
+ with a specific special case message and the proper file name (was
+ using the old file name, not the new one). Fixes 4995.
+ (fm_rename_file): Added quotes to message.
+
+ * src/nautilus-location-bar.h: Removed unused fields.
+ * src/nautilus-location-bar.c: (nautilus_location_bar_get_window):
+ Find the window by looking for an ancestor instead of trying to
+ use gtk_object_get_data (on data no one was setting any
+ more!). Fixes 4965.
+ (nautilus_location_bar_initialize): Got rid of redundant
+ initialization to NULL.
+ (nautilus_location_bar_set_location): Got rid of gratuitous check
+ before calling g_free.
+ (nautilus_location_bar_update_label): Added a localization-related
+ FIXME here.
+
+ * libnautilus-extensions/nautilus-file-operations.c:
+ (handle_xfer_vfs_error): Corrected the "it's" to "its" even though
+ I know that John and Pavel were writing an improved version of the
+ entire message.
+
+ * libnautilus-extensions/nautilus-search-uri.c:
+ (get_translated_criterion), (nautilus_self_check_search_uri): Say
+ "folder" instead of "directory".
+ * src/nautilus-search-bar-criterion.c: Say "folder" instead of
+ "directory".
+ * src/nautilus-theme-selector.c: (add_theme_to_icons): Say
+ "folder" instead of "directory". Other minor wording improvements.
+ (make_theme_description): Minor wording improvement.
+
+ * src/nautilus-window-manage-views.c:
+ (window_set_title_with_timestamp): Added a FIXME.
+
2000-12-06 John Sullivan <sullivan@eazel.com>
reviewed by: Pavel Cisler <pavel@eazel.com>
diff --git a/libnautilus-extensions/nautilus-directory-async.c b/libnautilus-extensions/nautilus-directory-async.c
index c5cd5aa1f..7ee6a7de5 100644
--- a/libnautilus-extensions/nautilus-directory-async.c
+++ b/libnautilus-extensions/nautilus-directory-async.c
@@ -79,18 +79,6 @@ struct ActivationURIReadState {
NautilusReadFileHandle *handle;
};
-/* A request for information about one or more files. */
-typedef struct {
- gboolean metafile;
- gboolean file_list; /* always FALSE if file != NULL */
- gboolean file_info;
- gboolean directory_count;
- gboolean deep_count;
- gboolean mime_list;
- gboolean top_left_text;
- gboolean activation_uri;
-} Request;
-
typedef struct {
NautilusFile *file; /* Which file, NULL means all. */
union {
@@ -993,8 +981,8 @@ remove_monitor (NautilusDirectory *directory,
remove_monitor_link (directory, find_monitor (directory, file, client));
}
-static void
-set_up_request_by_file_attributes (Request *request,
+void
+nautilus_directory_set_up_request (Request *request,
GList *file_attributes)
{
memset (request, 0, sizeof (*request));
@@ -1021,16 +1009,20 @@ set_up_request_by_file_attributes (Request *request,
nautilus_str_compare) != NULL;
request->file_info |= g_list_find_custom
(file_attributes,
+ NAUTILUS_FILE_ATTRIBUTE_CAPABILITIES,
+ nautilus_str_compare) != NULL;
+ request->file_info |= g_list_find_custom
+ (file_attributes,
NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE,
nautilus_str_compare) != NULL;
-
+
if (g_list_find_custom (file_attributes,
NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT,
nautilus_str_compare) != NULL) {
request->top_left_text = TRUE;
request->file_info = TRUE;
}
-
+
if (g_list_find_custom (file_attributes,
NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI,
nautilus_str_compare) != NULL) {
@@ -1038,12 +1030,10 @@ set_up_request_by_file_attributes (Request *request,
request->activation_uri = TRUE;
}
- if (!request->metafile) {
- request->metafile = g_list_find_custom
- (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_METADATA,
- nautilus_str_compare) != NULL;
- }
+ request->metafile |= g_list_find_custom
+ (file_attributes,
+ NAUTILUS_FILE_ATTRIBUTE_METADATA,
+ nautilus_str_compare) != NULL;
/* FIXME bugzilla.eazel.com 2435:
* Some file attributes are really pieces of metadata.
@@ -1056,12 +1046,10 @@ set_up_request_by_file_attributes (Request *request,
* directly (would need some funky char trick to prevent
* namespace collisions).
*/
- if (!request->metafile) {
- request->metafile = g_list_find_custom
- (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
- nautilus_str_compare) != NULL;
- }
+ request->metafile |= g_list_find_custom
+ (file_attributes,
+ NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
+ nautilus_str_compare) != NULL;
}
static gboolean
@@ -1107,7 +1095,7 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory,
monitor = g_new (Monitor, 1);
monitor->file = file;
monitor->client = client;
- set_up_request_by_file_attributes (&monitor->request, file_attributes);
+ nautilus_directory_set_up_request (&monitor->request, file_attributes);
monitor->request.file_list = file == NULL;
directory->details->monitor_list =
@@ -1536,7 +1524,7 @@ nautilus_directory_call_when_ready_internal (NautilusDirectory *directory,
callback.callback.file = file_callback;
}
callback.callback_data = callback_data;
- set_up_request_by_file_attributes (&callback.request, file_attributes);
+ nautilus_directory_set_up_request (&callback.request, file_attributes);
callback.request.file_list = file == NULL && file_attributes != NULL;
/* Handle the NULL case. */
@@ -1570,7 +1558,7 @@ nautilus_directory_check_if_ready_internal (NautilusDirectory *directory,
g_assert (NAUTILUS_IS_DIRECTORY (directory));
- set_up_request_by_file_attributes (&request, file_attributes);
+ nautilus_directory_set_up_request (&request, file_attributes);
return request_is_satisfied (directory, file, &request);
}
@@ -3200,78 +3188,34 @@ cancel_activation_uri_for_file (NautilusDirectory *directory,
static void
cancel_loading_attributes (NautilusDirectory *directory,
- GList *file_attributes)
+ GList *file_attributes)
{
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT,
- nautilus_str_compare) != NULL) {
+ Request request;
+
+ nautilus_directory_set_up_request (&request,
+ file_attributes);
+
+ if (request.directory_count) {
directory_count_cancel (directory);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS,
- nautilus_str_compare) != NULL) {
+ if (request.deep_count) {
deep_count_cancel (directory);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES,
- nautilus_str_compare) != NULL) {
+ if (request.mime_list) {
mime_list_cancel (directory);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT,
- nautilus_str_compare) != NULL) {
- /* clear file info, since applicability of top left
- * text depends on it.
- */
- file_info_cancel (directory);
-
- /* cancel top left text */
+ if (request.top_left_text) {
top_left_cancel (directory);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY,
- nautilus_str_compare) != NULL) {
+ if (request.file_info) {
file_info_cancel (directory);
}
-
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI,
- nautilus_str_compare) != NULL) {
-
- /* clear file info, since applicability of activation
- * URI depends on it
- */
- file_info_cancel (directory);
-
- /* cancel activation URI */
+ if (request.activation_uri) {
file_info_cancel (directory);
}
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_METADATA,
- nautilus_str_compare) != NULL ||
- /* FIXME bugzilla.eazel.com 2435:
- * Some file attributes are really pieces of metadata.
- * This is a confusing/broken design, since other metadata
- * pieces are handled separately from file attributes...
- */
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
- nautilus_str_compare) != NULL) {
- /* FIXME: implement cancelling metadata when we
- implement forgetting metadata */
- }
+ /* FIXME: implement cancelling metadata when we
+ implement forgetting metadata */
}
void
@@ -3279,78 +3223,30 @@ nautilus_directory_cancel_loading_file_attributes (NautilusDirectory *directory,
NautilusFile *file,
GList *file_attributes)
{
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT,
- nautilus_str_compare) != NULL) {
+ Request request;
+
+ nautilus_directory_set_up_request (&request,
+ file_attributes);
+
+ if (request.directory_count) {
cancel_directory_count_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS,
- nautilus_str_compare) != NULL) {
+ if (request.deep_count) {
cancel_deep_counts_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES,
- nautilus_str_compare) != NULL) {
+ if (request.mime_list) {
cancel_mime_list_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT,
- nautilus_str_compare) != NULL) {
- /* clear file info, since applicability of top left
- * text depends on it.
- */
- cancel_file_info_for_file (directory, file);
-
- /* cancel top left text */
+ if (request.top_left_text) {
cancel_top_left_text_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY,
- nautilus_str_compare) != NULL) {
+ if (request.file_info) {
cancel_file_info_for_file (directory, file);
}
-
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI,
- nautilus_str_compare) != NULL) {
-
- /* clear file info, since applicability of activation
- * URI depends on it
- */
- cancel_file_info_for_file (directory, file);
-
- /* cancel activation URI */
+ if (request.activation_uri) {
cancel_activation_uri_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_METADATA,
- nautilus_str_compare) != NULL ||
- /* FIXME bugzilla.eazel.com 2435:
- * Some file attributes are really pieces of metadata.
- * This is a confusing/broken design, since other metadata
- * pieces are handled separately from file attributes...
- */
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
- nautilus_str_compare) != NULL) {
- /* FIXME: implement cancelling metadata when we
- implement forgetting metadata */
- }
-}
-
-
-
+ /* FIXME: implement cancelling metadata when we
+ implement forgetting metadata */
+}
diff --git a/libnautilus-extensions/nautilus-directory-private.h b/libnautilus-extensions/nautilus-directory-private.h
index de9fe9143..85c7635c7 100644
--- a/libnautilus-extensions/nautilus-directory-private.h
+++ b/libnautilus-extensions/nautilus-directory-private.h
@@ -107,6 +107,17 @@ struct NautilusDirectoryDetails
GList *file_operations_in_progress; /* list of FileOperation * */
};
+/* A request for information about one or more files. */
+typedef struct {
+ gboolean activation_uri;
+ gboolean deep_count;
+ gboolean directory_count;
+ gboolean file_info;
+ gboolean file_list; /* always FALSE if file != NULL */
+ gboolean metafile;
+ gboolean mime_list;
+ gboolean top_left_text;
+} Request;
NautilusDirectory *nautilus_directory_get_existing (const char *uri);
@@ -153,7 +164,6 @@ void nautilus_directory_cancel_loading_file_attributes (NautilusD
NautilusFile *file,
GList *file_attributes);
-
/* Calls shared between directory, file, and async. code. */
void nautilus_directory_emit_metadata_changed (NautilusDirectory *directory);
void nautilus_directory_emit_files_added (NautilusDirectory *directory,
@@ -164,10 +174,12 @@ void nautilus_directory_emit_change_signals_deep (NautilusD
GList *changed_files);
void nautilus_directory_emit_done_loading (NautilusDirectory *directory);
void nautilus_directory_emit_load_error (NautilusDirectory *directory,
- GnomeVFSResult error_result);
+ GnomeVFSResult error_result);
NautilusDirectory *nautilus_directory_get_internal (const char *uri,
gboolean create);
-char * nautilus_directory_get_name_for_self_as_new_file (NautilusDirectory *directory);
+char * nautilus_directory_get_name_for_self_as_new_file (NautilusDirectory *directory);
+void nautilus_directory_set_up_request (Request *request,
+ GList *file_attributes);
/* Interface to the file list. */
NautilusFile * nautilus_directory_find_file_by_name (NautilusDirectory *directory,
@@ -183,11 +195,8 @@ GList * nautilus_directory_begin_file_name_change (NautilusD
void nautilus_directory_end_file_name_change (NautilusDirectory *directory,
NautilusFile *file,
GList *node);
-
-
-void nautilus_directory_handle_directory_moved (NautilusDirectory *directory,
- const char *to_uri);
+void nautilus_directory_handle_directory_moved (NautilusDirectory *directory,
+ const char *to_uri);
/* debugging functions */
int nautilus_directory_number_outstanding (void);
-
diff --git a/libnautilus-extensions/nautilus-file-attributes.h b/libnautilus-extensions/nautilus-file-attributes.h
index b73b8f0d3..e4b3a8406 100644
--- a/libnautilus-extensions/nautilus-file-attributes.h
+++ b/libnautilus-extensions/nautilus-file-attributes.h
@@ -30,14 +30,15 @@
*/
#define NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI "activation URI"
+#define NAUTILUS_FILE_ATTRIBUTE_CAPABILITIES "capabilities"
#define NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON "custom icon"
#define NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS "deep counts"
#define NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT "directory item count"
-#define NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE "MIME type"
-#define NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT "top left text"
-#define NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY "is directory"
-#define NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE "file type"
#define NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES "directory item MIME types"
+#define NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE "file type"
+#define NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY "is directory"
#define NAUTILUS_FILE_ATTRIBUTE_METADATA "metadata"
+#define NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE "MIME type"
+#define NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT "top left text"
#endif /* NAUTILUS_FILE_ATTRIBUTES_H */
diff --git a/libnautilus-extensions/nautilus-file-operations.c b/libnautilus-extensions/nautilus-file-operations.c
index 6a25cedfd..408bbc014 100644
--- a/libnautilus-extensions/nautilus-file-operations.c
+++ b/libnautilus-extensions/nautilus-file-operations.c
@@ -536,7 +536,7 @@ handle_xfer_vfs_error (const GnomeVFSXferProgressInfo *progress_info,
"permissions to change it's parent folder.");
} else {
error_string = _("Error while moving.\n"
- "%s cannot be moved because it's parent folder "
+ "%s cannot be moved because its parent folder "
"is read-only.");
}
} else if (progress_info->phase == GNOME_VFS_XFER_PHASE_OPENSOURCE
diff --git a/libnautilus-extensions/nautilus-file.c b/libnautilus-extensions/nautilus-file.c
index 5cd291eb2..04b24dcb2 100644
--- a/libnautilus-extensions/nautilus-file.c
+++ b/libnautilus-extensions/nautilus-file.c
@@ -4329,83 +4329,36 @@ forget_activation_uri (NautilusFile *file)
void
nautilus_file_forget_attributes_internal (NautilusFile *file,
- GList *file_attributes)
+ GList *file_attributes)
{
+ Request request;
+
if (file == NULL) {
return;
}
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT,
- nautilus_str_compare) != NULL) {
+ nautilus_directory_set_up_request (&request, file_attributes);
+
+ if (request.directory_count) {
forget_directory_count (file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS,
- nautilus_str_compare) != NULL) {
+ if (request.deep_count) {
forget_deep_counts (file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES,
- nautilus_str_compare) != NULL) {
+ if (request.mime_list) {
forget_mime_list (file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY,
- nautilus_str_compare) != NULL) {
+ if (request.file_info) {
forget_file_info (file);
}
-
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT,
- nautilus_str_compare) != NULL) {
- /* Forget file info too, since applicability of
- * activation URI depends on it.
- */
- forget_file_info (file);
-
- /* Forget actual activation top left text */
+ if (request.top_left_text) {
forget_top_left_text (file);
}
-
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI,
- nautilus_str_compare) != NULL) {
- /* Forget file info too, since applicability of
- * activation URI depends on it.
- */
- forget_file_info (file);
-
- /* Forget actual activation URI info */
+ if (request.activation_uri) {
forget_activation_uri (file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_METADATA,
- nautilus_str_compare) != NULL ||
- /* FIXME bugzilla.eazel.com 2435:
- * Some file attributes are really pieces of metadata.
- * This is a confusing/broken design, since other metadata
- * pieces are handled separately from file attributes...
- */
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
- nautilus_str_compare) != NULL) {
- /* FIXME: implement forgetting metadata */
-
- /* ?? reload the directory's metafile ?? */
- }
+
+ /* FIXME: implement forgetting metadata */
}
@@ -4439,6 +4392,7 @@ nautilus_file_forget_all_attributes (NautilusFile *file)
GList *attributes;
attributes = g_list_prepend (NULL, NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI);
+ attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_CAPABILITIES);
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON);
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS);
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT);
diff --git a/libnautilus-extensions/nautilus-icon-factory.c b/libnautilus-extensions/nautilus-icon-factory.c
index 88c92b5d0..c40f00316 100644
--- a/libnautilus-extensions/nautilus-icon-factory.c
+++ b/libnautilus-extensions/nautilus-icon-factory.c
@@ -104,32 +104,27 @@ static const char *icon_file_name_suffixes[] =
*/
#define ICON_CACHE_SWEEP_TIMEOUT (10 * 1000)
-/* For now, images are used themselves as thumbnails when they are
- * below this threshold size. Later we might have to have a more
- * complex rule about when to use an image for itself.
+/* Images are used themselves as thumbnails when they are below this
+ * threshold size.
+ */
+/* FIXME: Later we might have to have a more complex rule about when
+ * to use an image for itself.
*/
#define SELF_THUMBNAIL_SIZE_THRESHOLD 16384
-/* extremely large images can eat up hundreds of megabytes of memory, so we
- * shouldn't automatically thumbnail when larges are too large. Eventually,
- * we want this threshold to be user-settable, but for now it's hard-wired.
+/* Extremely large images can eat up hundreds of megabytes of memory, so we
+ * shouldn't automatically thumbnail when larges are too large.
*/
- #define INHIBIT_THUMBNAIL_SIZE_THRESHOLD 1048576
-
-/* This circular doubly-linked list structure is used to keep a list
- * of the most recently used items in the cache.
+/* FIXME: Eventually, we want this threshold to be user-settable, but
+ * for now it's hard-wired.
*/
-typedef struct NautilusCircularList NautilusCircularList;
-struct NautilusCircularList {
- NautilusCircularList *next;
- NautilusCircularList *prev;
-};
-
-/* maximum size for either dimension at the standard zoom level */
-#define MAXIMUM_ICON_SIZE 96
+#define INHIBIT_THUMBNAIL_SIZE_THRESHOLD (1024 * 1024)
+
+/* Maximum size for either dimension at the standard zoom level. */
+#define MAXIMUM_ICON_SIZE 96
/* FIXME bugzilla.eazel.com 1102: Embedded text should use preferences
- * to determine what font it uses.
+ * to determine what font it uses instead of this set of constants.
*/
#define EMBEDDED_TEXT_FONT_FAMILY _("helvetica")
#define EMBEDDED_TEXT_FONT_WEIGHT _("medium")
@@ -139,6 +134,18 @@ struct NautilusCircularList {
#define EMBEDDED_TEXT_LINE_OFFSET 1
#define EMBEDDED_TEXT_EMPTY_LINE_HEIGHT 4
+#define MINIMUM_EMBEDDED_TEXT_RECT_WIDTH 20.0
+#define MINIMUM_EMBEDDED_TEXT_RECT_HEIGHT 20.0
+
+/* This circular doubly-linked list structure is used to keep a list
+ * of the most recently used items in the cache.
+ */
+typedef struct CircularList CircularList;
+struct CircularList {
+ CircularList *next;
+ CircularList *prev;
+};
+
/* The icon factory.
* These are just globals, but they're in an object so we can
* connect signals and have multiple icon factories some day
@@ -173,7 +180,7 @@ typedef struct {
* let them go when we sweep the cache.
*/
GHashTable *icon_cache;
- NautilusCircularList recently_used_dummy_head;
+ CircularList recently_used_dummy_head;
guint recently_used_count;
guint sweep_timer;
} NautilusIconFactory;
@@ -235,7 +242,7 @@ typedef struct {
guint internal_ref_count;
/* Used to decide when to kick icons out of the cache. */
- NautilusCircularList recently_used_node;
+ CircularList recently_used_node;
/* Used to know when to make a new thumbnail. */
time_t cache_time;
@@ -245,9 +252,6 @@ typedef struct {
gboolean scaled;
} CacheIcon;
-#define MINIMUM_EMBEDDED_TEXT_RECT_WIDTH 20.0
-#define MINIMUM_EMBEDDED_TEXT_RECT_HEIGHT 20.0
-
static CacheIcon *fallback_icon;
/* forward declarations */
@@ -316,7 +320,7 @@ static void
check_recently_used_list (void)
{
NautilusIconFactory *factory;
- NautilusCircularList *head, *node, *next;
+ CircularList *head, *node, *next;
guint count;
factory = get_icon_factory ();
@@ -456,7 +460,7 @@ static void
cache_icon_unref (CacheIcon *icon)
{
NautilusIconFactory *factory;
- NautilusCircularList *node;
+ CircularList *node;
factory = get_icon_factory ();
@@ -531,7 +535,7 @@ static void
nautilus_icon_factory_clear (void)
{
NautilusIconFactory *factory;
- NautilusCircularList *head;
+ CircularList *head;
factory = get_icon_factory ();
@@ -1278,7 +1282,7 @@ should_display_image_file_as_itself (NautilusFile *file)
/* key routine to get the scalable icon for a file */
NautilusScalableIcon *
-nautilus_icon_factory_get_icon_for_file (NautilusFile *file, const char* modifier, gboolean anti_aliased)
+nautilus_icon_factory_get_icon_for_file (NautilusFile *file, const char *modifier, gboolean anti_aliased)
{
char *uri, *file_uri, *file_path, *image_uri, *icon_name, *mime_type, *top_left_text;
gboolean is_local;
@@ -1566,6 +1570,41 @@ path_represents_svg_image (const char *path)
return is_svg;
}
+/* Returns GNOME_VFS_ERROR_NOT_SUPPORTED for icons that are not files. */
+static GnomeVFSResult
+get_cache_time (const char *file_uri, time_t *cache_time)
+{
+ GnomeVFSURI *vfs_uri;
+ GnomeVFSFileInfo file_info;
+ GnomeVFSResult result;
+ gboolean is_local;
+
+ /* If there's no specific file, simply return. */
+ if (file_uri == NULL) {
+ return GNOME_VFS_ERROR_NOT_SUPPORTED;
+ }
+
+ /* FIXME bugzilla.eazel.com 2566: if the URI is remote, assume
+ * it's valid to match logic below.
+ */
+ vfs_uri = gnome_vfs_uri_new (file_uri);
+ is_local = gnome_vfs_uri_is_local (vfs_uri);
+ gnome_vfs_uri_unref (vfs_uri);
+ if (!is_local) {
+ return GNOME_VFS_ERROR_NOT_SUPPORTED;
+ }
+
+ /* Gather the info and then compare modification times. */
+ gnome_vfs_file_info_init (&file_info);
+ result = gnome_vfs_get_file_info (file_uri, &file_info, GNOME_VFS_FILE_INFO_DEFAULT);
+ if (result == GNOME_VFS_OK) {
+ *cache_time = file_info.mtime;
+ }
+ gnome_vfs_file_info_clear (&file_info);
+
+ return result;
+}
+
/* This load function returns NULL if the icon is not available at
* this size.
*/
@@ -1617,7 +1656,10 @@ load_specific_icon (NautilusScalableIcon *scalable_icon,
/* Since we got something, we can create a cache icon. */
icon = cache_icon_new (pixbuf, custom, FALSE, &details);
+ get_cache_time (scalable_icon->uri,
+ &icon->cache_time);
gdk_pixbuf_unref (pixbuf);
+
return icon;
}
@@ -1754,6 +1796,7 @@ scale_icon (CacheIcon *icon,
icon->custom,
TRUE,
&scaled_details);
+ scaled_icon->cache_time = icon->cache_time;
gdk_pixbuf_unref (scaled_pixbuf);
return scaled_icon;
}
@@ -1828,10 +1871,10 @@ load_icon_scale_if_necessary (NautilusScalableIcon *scalable_icon,
* bumping the last item off that list if necessary.
*/
static void
-mark_recently_used (NautilusCircularList *node)
+mark_recently_used (CircularList *node)
{
NautilusIconFactory *factory;
- NautilusCircularList *head, *last_node;
+ CircularList *head, *last_node;
check_recently_used_list ();
@@ -1875,46 +1918,32 @@ mark_recently_used (NautilusCircularList *node)
check_recently_used_list ();
}
-/* Utility routine that checks if a cached icon has changed since it
- * was cached. It returns TRUE if the icon is still valid, and
- * removes it from the cache if it's not.
+/* Utility routine that checks if a cached thubmnail-type icon has
+ * changed since it was cached. Returns TRUE after removing the icon
+ * from the cache if the icon has changed.
*/
static gboolean
-cached_icon_still_valid (const char *file_uri, time_t cached_time)
+remove_icons_if_file_changed (const char *file_uri, time_t cached_time)
{
- GnomeVFSURI *vfs_uri;
- GnomeVFSFileInfo file_info;
GnomeVFSResult result;
- gboolean is_local, is_valid;
+ time_t new_time;
- /* If there's no specific file, simply return TRUE. */
- if (file_uri == NULL) {
- return TRUE;
- }
-
- /* FIXME bugzilla.eazel.com 2566: if the URI is remote, assume
- * it's valid to avoid delay of testing. Eventually we'll have
- * to make this async to fix this.
- */
- vfs_uri = gnome_vfs_uri_new (file_uri);
- is_local = gnome_vfs_uri_is_local (vfs_uri);
- gnome_vfs_uri_unref (vfs_uri);
- if (!is_local) {
- return TRUE;
+ /* Get the time from the file. */
+ result = get_cache_time (file_uri, &new_time);
+
+ /* Do nothing for cases where a time doesn't apply. */
+ if (result == GNOME_VFS_ERROR_NOT_SUPPORTED) {
+ return FALSE;
}
-
- /* Gather the info and then compare modification times. */
- gnome_vfs_file_info_init (&file_info);
- result = gnome_vfs_get_file_info (file_uri, &file_info, GNOME_VFS_FILE_INFO_DEFAULT);
- is_valid = result == GNOME_VFS_OK && file_info.mtime <= cached_time;
- gnome_vfs_file_info_clear (&file_info);
- /* if it's not valid, remove it from the cache */
- if (!is_valid) {
- nautilus_icon_factory_remove_by_uri (file_uri);
+ /* Do nothing if the file is still the same as before. */
+ if (result == GNOME_VFS_OK && new_time == cached_time) {
+ return FALSE;
}
-
- return is_valid;
+
+ /* Remove the icon from the cache and inform the caller. */
+ nautilus_icon_factory_remove_by_uri (file_uri);
+ return TRUE;
}
/* Get the icon, handling the caching.
@@ -1962,8 +1991,8 @@ get_icon_from_cache (NautilusScalableIcon *scalable_icon,
}
/* Check if the cached image is good before using it. */
- if (!cached_icon_still_valid (scalable_icon->uri,
- icon->cache_time)) {
+ if (remove_icons_if_file_changed (scalable_icon->uri,
+ icon->cache_time)) {
icon = NULL;
}
}
@@ -2305,6 +2334,7 @@ load_icon_with_embedded_text (NautilusScalableIcon *scalable_icon,
icon_without_text->custom,
icon_without_text->scaled,
&details);
+ icon_with_text->cache_time = icon_without_text->cache_time;
cache_icon_unref (icon_without_text);
gdk_pixbuf_unref (pixbuf_with_text);
diff --git a/libnautilus-extensions/nautilus-search-uri.c b/libnautilus-extensions/nautilus-search-uri.c
index e7af65da3..cadda5d42 100644
--- a/libnautilus-extensions/nautilus-search-uri.c
+++ b/libnautilus-extensions/nautilus-search-uri.c
@@ -241,7 +241,7 @@ static value_criterion_item file_type_options3_table [] = {
N_("applications"),
NULL},
{"directory",
- N_("directories"),
+ N_("folders"),
NULL},
{"music",
N_("music"),
@@ -500,7 +500,7 @@ get_translated_criterion (const GSList *criterion)
return ret_val;
}
- return g_strdup (_("are directories"));
+ return g_strdup (_("are folders"));
}
/**
@@ -724,7 +724,7 @@ nautilus_self_check_search_uri (void)
"smaller than 2000 bytes."));
NAUTILUS_CHECK_STRING_RESULT (nautilus_search_uri_to_human ("search:[][]file_name contains medusa & file_type is directory"),
_("Items with \"medusa\" in the name and are "
- "directories."));
+ "folders."));
/* is_search_uri */
NAUTILUS_CHECK_BOOLEAN_RESULT (nautilus_is_search_uri (""), FALSE);
diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c
index c5cd5aa1f..7ee6a7de5 100644
--- a/libnautilus-private/nautilus-directory-async.c
+++ b/libnautilus-private/nautilus-directory-async.c
@@ -79,18 +79,6 @@ struct ActivationURIReadState {
NautilusReadFileHandle *handle;
};
-/* A request for information about one or more files. */
-typedef struct {
- gboolean metafile;
- gboolean file_list; /* always FALSE if file != NULL */
- gboolean file_info;
- gboolean directory_count;
- gboolean deep_count;
- gboolean mime_list;
- gboolean top_left_text;
- gboolean activation_uri;
-} Request;
-
typedef struct {
NautilusFile *file; /* Which file, NULL means all. */
union {
@@ -993,8 +981,8 @@ remove_monitor (NautilusDirectory *directory,
remove_monitor_link (directory, find_monitor (directory, file, client));
}
-static void
-set_up_request_by_file_attributes (Request *request,
+void
+nautilus_directory_set_up_request (Request *request,
GList *file_attributes)
{
memset (request, 0, sizeof (*request));
@@ -1021,16 +1009,20 @@ set_up_request_by_file_attributes (Request *request,
nautilus_str_compare) != NULL;
request->file_info |= g_list_find_custom
(file_attributes,
+ NAUTILUS_FILE_ATTRIBUTE_CAPABILITIES,
+ nautilus_str_compare) != NULL;
+ request->file_info |= g_list_find_custom
+ (file_attributes,
NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE,
nautilus_str_compare) != NULL;
-
+
if (g_list_find_custom (file_attributes,
NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT,
nautilus_str_compare) != NULL) {
request->top_left_text = TRUE;
request->file_info = TRUE;
}
-
+
if (g_list_find_custom (file_attributes,
NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI,
nautilus_str_compare) != NULL) {
@@ -1038,12 +1030,10 @@ set_up_request_by_file_attributes (Request *request,
request->activation_uri = TRUE;
}
- if (!request->metafile) {
- request->metafile = g_list_find_custom
- (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_METADATA,
- nautilus_str_compare) != NULL;
- }
+ request->metafile |= g_list_find_custom
+ (file_attributes,
+ NAUTILUS_FILE_ATTRIBUTE_METADATA,
+ nautilus_str_compare) != NULL;
/* FIXME bugzilla.eazel.com 2435:
* Some file attributes are really pieces of metadata.
@@ -1056,12 +1046,10 @@ set_up_request_by_file_attributes (Request *request,
* directly (would need some funky char trick to prevent
* namespace collisions).
*/
- if (!request->metafile) {
- request->metafile = g_list_find_custom
- (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
- nautilus_str_compare) != NULL;
- }
+ request->metafile |= g_list_find_custom
+ (file_attributes,
+ NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
+ nautilus_str_compare) != NULL;
}
static gboolean
@@ -1107,7 +1095,7 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory,
monitor = g_new (Monitor, 1);
monitor->file = file;
monitor->client = client;
- set_up_request_by_file_attributes (&monitor->request, file_attributes);
+ nautilus_directory_set_up_request (&monitor->request, file_attributes);
monitor->request.file_list = file == NULL;
directory->details->monitor_list =
@@ -1536,7 +1524,7 @@ nautilus_directory_call_when_ready_internal (NautilusDirectory *directory,
callback.callback.file = file_callback;
}
callback.callback_data = callback_data;
- set_up_request_by_file_attributes (&callback.request, file_attributes);
+ nautilus_directory_set_up_request (&callback.request, file_attributes);
callback.request.file_list = file == NULL && file_attributes != NULL;
/* Handle the NULL case. */
@@ -1570,7 +1558,7 @@ nautilus_directory_check_if_ready_internal (NautilusDirectory *directory,
g_assert (NAUTILUS_IS_DIRECTORY (directory));
- set_up_request_by_file_attributes (&request, file_attributes);
+ nautilus_directory_set_up_request (&request, file_attributes);
return request_is_satisfied (directory, file, &request);
}
@@ -3200,78 +3188,34 @@ cancel_activation_uri_for_file (NautilusDirectory *directory,
static void
cancel_loading_attributes (NautilusDirectory *directory,
- GList *file_attributes)
+ GList *file_attributes)
{
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT,
- nautilus_str_compare) != NULL) {
+ Request request;
+
+ nautilus_directory_set_up_request (&request,
+ file_attributes);
+
+ if (request.directory_count) {
directory_count_cancel (directory);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS,
- nautilus_str_compare) != NULL) {
+ if (request.deep_count) {
deep_count_cancel (directory);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES,
- nautilus_str_compare) != NULL) {
+ if (request.mime_list) {
mime_list_cancel (directory);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT,
- nautilus_str_compare) != NULL) {
- /* clear file info, since applicability of top left
- * text depends on it.
- */
- file_info_cancel (directory);
-
- /* cancel top left text */
+ if (request.top_left_text) {
top_left_cancel (directory);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY,
- nautilus_str_compare) != NULL) {
+ if (request.file_info) {
file_info_cancel (directory);
}
-
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI,
- nautilus_str_compare) != NULL) {
-
- /* clear file info, since applicability of activation
- * URI depends on it
- */
- file_info_cancel (directory);
-
- /* cancel activation URI */
+ if (request.activation_uri) {
file_info_cancel (directory);
}
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_METADATA,
- nautilus_str_compare) != NULL ||
- /* FIXME bugzilla.eazel.com 2435:
- * Some file attributes are really pieces of metadata.
- * This is a confusing/broken design, since other metadata
- * pieces are handled separately from file attributes...
- */
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
- nautilus_str_compare) != NULL) {
- /* FIXME: implement cancelling metadata when we
- implement forgetting metadata */
- }
+ /* FIXME: implement cancelling metadata when we
+ implement forgetting metadata */
}
void
@@ -3279,78 +3223,30 @@ nautilus_directory_cancel_loading_file_attributes (NautilusDirectory *directory,
NautilusFile *file,
GList *file_attributes)
{
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT,
- nautilus_str_compare) != NULL) {
+ Request request;
+
+ nautilus_directory_set_up_request (&request,
+ file_attributes);
+
+ if (request.directory_count) {
cancel_directory_count_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS,
- nautilus_str_compare) != NULL) {
+ if (request.deep_count) {
cancel_deep_counts_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES,
- nautilus_str_compare) != NULL) {
+ if (request.mime_list) {
cancel_mime_list_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT,
- nautilus_str_compare) != NULL) {
- /* clear file info, since applicability of top left
- * text depends on it.
- */
- cancel_file_info_for_file (directory, file);
-
- /* cancel top left text */
+ if (request.top_left_text) {
cancel_top_left_text_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY,
- nautilus_str_compare) != NULL) {
+ if (request.file_info) {
cancel_file_info_for_file (directory, file);
}
-
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI,
- nautilus_str_compare) != NULL) {
-
- /* clear file info, since applicability of activation
- * URI depends on it
- */
- cancel_file_info_for_file (directory, file);
-
- /* cancel activation URI */
+ if (request.activation_uri) {
cancel_activation_uri_for_file (directory, file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_METADATA,
- nautilus_str_compare) != NULL ||
- /* FIXME bugzilla.eazel.com 2435:
- * Some file attributes are really pieces of metadata.
- * This is a confusing/broken design, since other metadata
- * pieces are handled separately from file attributes...
- */
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
- nautilus_str_compare) != NULL) {
- /* FIXME: implement cancelling metadata when we
- implement forgetting metadata */
- }
-}
-
-
-
+ /* FIXME: implement cancelling metadata when we
+ implement forgetting metadata */
+}
diff --git a/libnautilus-private/nautilus-directory-private.h b/libnautilus-private/nautilus-directory-private.h
index de9fe9143..85c7635c7 100644
--- a/libnautilus-private/nautilus-directory-private.h
+++ b/libnautilus-private/nautilus-directory-private.h
@@ -107,6 +107,17 @@ struct NautilusDirectoryDetails
GList *file_operations_in_progress; /* list of FileOperation * */
};
+/* A request for information about one or more files. */
+typedef struct {
+ gboolean activation_uri;
+ gboolean deep_count;
+ gboolean directory_count;
+ gboolean file_info;
+ gboolean file_list; /* always FALSE if file != NULL */
+ gboolean metafile;
+ gboolean mime_list;
+ gboolean top_left_text;
+} Request;
NautilusDirectory *nautilus_directory_get_existing (const char *uri);
@@ -153,7 +164,6 @@ void nautilus_directory_cancel_loading_file_attributes (NautilusD
NautilusFile *file,
GList *file_attributes);
-
/* Calls shared between directory, file, and async. code. */
void nautilus_directory_emit_metadata_changed (NautilusDirectory *directory);
void nautilus_directory_emit_files_added (NautilusDirectory *directory,
@@ -164,10 +174,12 @@ void nautilus_directory_emit_change_signals_deep (NautilusD
GList *changed_files);
void nautilus_directory_emit_done_loading (NautilusDirectory *directory);
void nautilus_directory_emit_load_error (NautilusDirectory *directory,
- GnomeVFSResult error_result);
+ GnomeVFSResult error_result);
NautilusDirectory *nautilus_directory_get_internal (const char *uri,
gboolean create);
-char * nautilus_directory_get_name_for_self_as_new_file (NautilusDirectory *directory);
+char * nautilus_directory_get_name_for_self_as_new_file (NautilusDirectory *directory);
+void nautilus_directory_set_up_request (Request *request,
+ GList *file_attributes);
/* Interface to the file list. */
NautilusFile * nautilus_directory_find_file_by_name (NautilusDirectory *directory,
@@ -183,11 +195,8 @@ GList * nautilus_directory_begin_file_name_change (NautilusD
void nautilus_directory_end_file_name_change (NautilusDirectory *directory,
NautilusFile *file,
GList *node);
-
-
-void nautilus_directory_handle_directory_moved (NautilusDirectory *directory,
- const char *to_uri);
+void nautilus_directory_handle_directory_moved (NautilusDirectory *directory,
+ const char *to_uri);
/* debugging functions */
int nautilus_directory_number_outstanding (void);
-
diff --git a/libnautilus-private/nautilus-file-attributes.h b/libnautilus-private/nautilus-file-attributes.h
index b73b8f0d3..e4b3a8406 100644
--- a/libnautilus-private/nautilus-file-attributes.h
+++ b/libnautilus-private/nautilus-file-attributes.h
@@ -30,14 +30,15 @@
*/
#define NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI "activation URI"
+#define NAUTILUS_FILE_ATTRIBUTE_CAPABILITIES "capabilities"
#define NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON "custom icon"
#define NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS "deep counts"
#define NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT "directory item count"
-#define NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE "MIME type"
-#define NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT "top left text"
-#define NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY "is directory"
-#define NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE "file type"
#define NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES "directory item MIME types"
+#define NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE "file type"
+#define NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY "is directory"
#define NAUTILUS_FILE_ATTRIBUTE_METADATA "metadata"
+#define NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE "MIME type"
+#define NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT "top left text"
#endif /* NAUTILUS_FILE_ATTRIBUTES_H */
diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
index 6a25cedfd..408bbc014 100644
--- a/libnautilus-private/nautilus-file-operations.c
+++ b/libnautilus-private/nautilus-file-operations.c
@@ -536,7 +536,7 @@ handle_xfer_vfs_error (const GnomeVFSXferProgressInfo *progress_info,
"permissions to change it's parent folder.");
} else {
error_string = _("Error while moving.\n"
- "%s cannot be moved because it's parent folder "
+ "%s cannot be moved because its parent folder "
"is read-only.");
}
} else if (progress_info->phase == GNOME_VFS_XFER_PHASE_OPENSOURCE
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 5cd291eb2..04b24dcb2 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -4329,83 +4329,36 @@ forget_activation_uri (NautilusFile *file)
void
nautilus_file_forget_attributes_internal (NautilusFile *file,
- GList *file_attributes)
+ GList *file_attributes)
{
+ Request request;
+
if (file == NULL) {
return;
}
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT,
- nautilus_str_compare) != NULL) {
+ nautilus_directory_set_up_request (&request, file_attributes);
+
+ if (request.directory_count) {
forget_directory_count (file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS,
- nautilus_str_compare) != NULL) {
+ if (request.deep_count) {
forget_deep_counts (file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES,
- nautilus_str_compare) != NULL) {
+ if (request.mime_list) {
forget_mime_list (file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_MIME_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE,
- nautilus_str_compare) != NULL ||
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY,
- nautilus_str_compare) != NULL) {
+ if (request.file_info) {
forget_file_info (file);
}
-
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT,
- nautilus_str_compare) != NULL) {
- /* Forget file info too, since applicability of
- * activation URI depends on it.
- */
- forget_file_info (file);
-
- /* Forget actual activation top left text */
+ if (request.top_left_text) {
forget_top_left_text (file);
}
-
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI,
- nautilus_str_compare) != NULL) {
- /* Forget file info too, since applicability of
- * activation URI depends on it.
- */
- forget_file_info (file);
-
- /* Forget actual activation URI info */
+ if (request.activation_uri) {
forget_activation_uri (file);
}
-
- if (g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_METADATA,
- nautilus_str_compare) != NULL ||
- /* FIXME bugzilla.eazel.com 2435:
- * Some file attributes are really pieces of metadata.
- * This is a confusing/broken design, since other metadata
- * pieces are handled separately from file attributes...
- */
- g_list_find_custom (file_attributes,
- NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON,
- nautilus_str_compare) != NULL) {
- /* FIXME: implement forgetting metadata */
-
- /* ?? reload the directory's metafile ?? */
- }
+
+ /* FIXME: implement forgetting metadata */
}
@@ -4439,6 +4392,7 @@ nautilus_file_forget_all_attributes (NautilusFile *file)
GList *attributes;
attributes = g_list_prepend (NULL, NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI);
+ attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_CAPABILITIES);
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_CUSTOM_ICON);
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS);
attributes = g_list_prepend (attributes, NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT);
diff --git a/libnautilus-private/nautilus-icon-factory.c b/libnautilus-private/nautilus-icon-factory.c
index 88c92b5d0..c40f00316 100644
--- a/libnautilus-private/nautilus-icon-factory.c
+++ b/libnautilus-private/nautilus-icon-factory.c
@@ -104,32 +104,27 @@ static const char *icon_file_name_suffixes[] =
*/
#define ICON_CACHE_SWEEP_TIMEOUT (10 * 1000)
-/* For now, images are used themselves as thumbnails when they are
- * below this threshold size. Later we might have to have a more
- * complex rule about when to use an image for itself.
+/* Images are used themselves as thumbnails when they are below this
+ * threshold size.
+ */
+/* FIXME: Later we might have to have a more complex rule about when
+ * to use an image for itself.
*/
#define SELF_THUMBNAIL_SIZE_THRESHOLD 16384
-/* extremely large images can eat up hundreds of megabytes of memory, so we
- * shouldn't automatically thumbnail when larges are too large. Eventually,
- * we want this threshold to be user-settable, but for now it's hard-wired.
+/* Extremely large images can eat up hundreds of megabytes of memory, so we
+ * shouldn't automatically thumbnail when larges are too large.
*/
- #define INHIBIT_THUMBNAIL_SIZE_THRESHOLD 1048576
-
-/* This circular doubly-linked list structure is used to keep a list
- * of the most recently used items in the cache.
+/* FIXME: Eventually, we want this threshold to be user-settable, but
+ * for now it's hard-wired.
*/
-typedef struct NautilusCircularList NautilusCircularList;
-struct NautilusCircularList {
- NautilusCircularList *next;
- NautilusCircularList *prev;
-};
-
-/* maximum size for either dimension at the standard zoom level */
-#define MAXIMUM_ICON_SIZE 96
+#define INHIBIT_THUMBNAIL_SIZE_THRESHOLD (1024 * 1024)
+
+/* Maximum size for either dimension at the standard zoom level. */
+#define MAXIMUM_ICON_SIZE 96
/* FIXME bugzilla.eazel.com 1102: Embedded text should use preferences
- * to determine what font it uses.
+ * to determine what font it uses instead of this set of constants.
*/
#define EMBEDDED_TEXT_FONT_FAMILY _("helvetica")
#define EMBEDDED_TEXT_FONT_WEIGHT _("medium")
@@ -139,6 +134,18 @@ struct NautilusCircularList {
#define EMBEDDED_TEXT_LINE_OFFSET 1
#define EMBEDDED_TEXT_EMPTY_LINE_HEIGHT 4
+#define MINIMUM_EMBEDDED_TEXT_RECT_WIDTH 20.0
+#define MINIMUM_EMBEDDED_TEXT_RECT_HEIGHT 20.0
+
+/* This circular doubly-linked list structure is used to keep a list
+ * of the most recently used items in the cache.
+ */
+typedef struct CircularList CircularList;
+struct CircularList {
+ CircularList *next;
+ CircularList *prev;
+};
+
/* The icon factory.
* These are just globals, but they're in an object so we can
* connect signals and have multiple icon factories some day
@@ -173,7 +180,7 @@ typedef struct {
* let them go when we sweep the cache.
*/
GHashTable *icon_cache;
- NautilusCircularList recently_used_dummy_head;
+ CircularList recently_used_dummy_head;
guint recently_used_count;
guint sweep_timer;
} NautilusIconFactory;
@@ -235,7 +242,7 @@ typedef struct {
guint internal_ref_count;
/* Used to decide when to kick icons out of the cache. */
- NautilusCircularList recently_used_node;
+ CircularList recently_used_node;
/* Used to know when to make a new thumbnail. */
time_t cache_time;
@@ -245,9 +252,6 @@ typedef struct {
gboolean scaled;
} CacheIcon;
-#define MINIMUM_EMBEDDED_TEXT_RECT_WIDTH 20.0
-#define MINIMUM_EMBEDDED_TEXT_RECT_HEIGHT 20.0
-
static CacheIcon *fallback_icon;
/* forward declarations */
@@ -316,7 +320,7 @@ static void
check_recently_used_list (void)
{
NautilusIconFactory *factory;
- NautilusCircularList *head, *node, *next;
+ CircularList *head, *node, *next;
guint count;
factory = get_icon_factory ();
@@ -456,7 +460,7 @@ static void
cache_icon_unref (CacheIcon *icon)
{
NautilusIconFactory *factory;
- NautilusCircularList *node;
+ CircularList *node;
factory = get_icon_factory ();
@@ -531,7 +535,7 @@ static void
nautilus_icon_factory_clear (void)
{
NautilusIconFactory *factory;
- NautilusCircularList *head;
+ CircularList *head;
factory = get_icon_factory ();
@@ -1278,7 +1282,7 @@ should_display_image_file_as_itself (NautilusFile *file)
/* key routine to get the scalable icon for a file */
NautilusScalableIcon *
-nautilus_icon_factory_get_icon_for_file (NautilusFile *file, const char* modifier, gboolean anti_aliased)
+nautilus_icon_factory_get_icon_for_file (NautilusFile *file, const char *modifier, gboolean anti_aliased)
{
char *uri, *file_uri, *file_path, *image_uri, *icon_name, *mime_type, *top_left_text;
gboolean is_local;
@@ -1566,6 +1570,41 @@ path_represents_svg_image (const char *path)
return is_svg;
}
+/* Returns GNOME_VFS_ERROR_NOT_SUPPORTED for icons that are not files. */
+static GnomeVFSResult
+get_cache_time (const char *file_uri, time_t *cache_time)
+{
+ GnomeVFSURI *vfs_uri;
+ GnomeVFSFileInfo file_info;
+ GnomeVFSResult result;
+ gboolean is_local;
+
+ /* If there's no specific file, simply return. */
+ if (file_uri == NULL) {
+ return GNOME_VFS_ERROR_NOT_SUPPORTED;
+ }
+
+ /* FIXME bugzilla.eazel.com 2566: if the URI is remote, assume
+ * it's valid to match logic below.
+ */
+ vfs_uri = gnome_vfs_uri_new (file_uri);
+ is_local = gnome_vfs_uri_is_local (vfs_uri);
+ gnome_vfs_uri_unref (vfs_uri);
+ if (!is_local) {
+ return GNOME_VFS_ERROR_NOT_SUPPORTED;
+ }
+
+ /* Gather the info and then compare modification times. */
+ gnome_vfs_file_info_init (&file_info);
+ result = gnome_vfs_get_file_info (file_uri, &file_info, GNOME_VFS_FILE_INFO_DEFAULT);
+ if (result == GNOME_VFS_OK) {
+ *cache_time = file_info.mtime;
+ }
+ gnome_vfs_file_info_clear (&file_info);
+
+ return result;
+}
+
/* This load function returns NULL if the icon is not available at
* this size.
*/
@@ -1617,7 +1656,10 @@ load_specific_icon (NautilusScalableIcon *scalable_icon,
/* Since we got something, we can create a cache icon. */
icon = cache_icon_new (pixbuf, custom, FALSE, &details);
+ get_cache_time (scalable_icon->uri,
+ &icon->cache_time);
gdk_pixbuf_unref (pixbuf);
+
return icon;
}
@@ -1754,6 +1796,7 @@ scale_icon (CacheIcon *icon,
icon->custom,
TRUE,
&scaled_details);
+ scaled_icon->cache_time = icon->cache_time;
gdk_pixbuf_unref (scaled_pixbuf);
return scaled_icon;
}
@@ -1828,10 +1871,10 @@ load_icon_scale_if_necessary (NautilusScalableIcon *scalable_icon,
* bumping the last item off that list if necessary.
*/
static void
-mark_recently_used (NautilusCircularList *node)
+mark_recently_used (CircularList *node)
{
NautilusIconFactory *factory;
- NautilusCircularList *head, *last_node;
+ CircularList *head, *last_node;
check_recently_used_list ();
@@ -1875,46 +1918,32 @@ mark_recently_used (NautilusCircularList *node)
check_recently_used_list ();
}
-/* Utility routine that checks if a cached icon has changed since it
- * was cached. It returns TRUE if the icon is still valid, and
- * removes it from the cache if it's not.
+/* Utility routine that checks if a cached thubmnail-type icon has
+ * changed since it was cached. Returns TRUE after removing the icon
+ * from the cache if the icon has changed.
*/
static gboolean
-cached_icon_still_valid (const char *file_uri, time_t cached_time)
+remove_icons_if_file_changed (const char *file_uri, time_t cached_time)
{
- GnomeVFSURI *vfs_uri;
- GnomeVFSFileInfo file_info;
GnomeVFSResult result;
- gboolean is_local, is_valid;
+ time_t new_time;
- /* If there's no specific file, simply return TRUE. */
- if (file_uri == NULL) {
- return TRUE;
- }
-
- /* FIXME bugzilla.eazel.com 2566: if the URI is remote, assume
- * it's valid to avoid delay of testing. Eventually we'll have
- * to make this async to fix this.
- */
- vfs_uri = gnome_vfs_uri_new (file_uri);
- is_local = gnome_vfs_uri_is_local (vfs_uri);
- gnome_vfs_uri_unref (vfs_uri);
- if (!is_local) {
- return TRUE;
+ /* Get the time from the file. */
+ result = get_cache_time (file_uri, &new_time);
+
+ /* Do nothing for cases where a time doesn't apply. */
+ if (result == GNOME_VFS_ERROR_NOT_SUPPORTED) {
+ return FALSE;
}
-
- /* Gather the info and then compare modification times. */
- gnome_vfs_file_info_init (&file_info);
- result = gnome_vfs_get_file_info (file_uri, &file_info, GNOME_VFS_FILE_INFO_DEFAULT);
- is_valid = result == GNOME_VFS_OK && file_info.mtime <= cached_time;
- gnome_vfs_file_info_clear (&file_info);
- /* if it's not valid, remove it from the cache */
- if (!is_valid) {
- nautilus_icon_factory_remove_by_uri (file_uri);
+ /* Do nothing if the file is still the same as before. */
+ if (result == GNOME_VFS_OK && new_time == cached_time) {
+ return FALSE;
}
-
- return is_valid;
+
+ /* Remove the icon from the cache and inform the caller. */
+ nautilus_icon_factory_remove_by_uri (file_uri);
+ return TRUE;
}
/* Get the icon, handling the caching.
@@ -1962,8 +1991,8 @@ get_icon_from_cache (NautilusScalableIcon *scalable_icon,
}
/* Check if the cached image is good before using it. */
- if (!cached_icon_still_valid (scalable_icon->uri,
- icon->cache_time)) {
+ if (remove_icons_if_file_changed (scalable_icon->uri,
+ icon->cache_time)) {
icon = NULL;
}
}
@@ -2305,6 +2334,7 @@ load_icon_with_embedded_text (NautilusScalableIcon *scalable_icon,
icon_without_text->custom,
icon_without_text->scaled,
&details);
+ icon_with_text->cache_time = icon_without_text->cache_time;
cache_icon_unref (icon_without_text);
gdk_pixbuf_unref (pixbuf_with_text);
diff --git a/libnautilus-private/nautilus-search-uri.c b/libnautilus-private/nautilus-search-uri.c
index e7af65da3..cadda5d42 100644
--- a/libnautilus-private/nautilus-search-uri.c
+++ b/libnautilus-private/nautilus-search-uri.c
@@ -241,7 +241,7 @@ static value_criterion_item file_type_options3_table [] = {
N_("applications"),
NULL},
{"directory",
- N_("directories"),
+ N_("folders"),
NULL},
{"music",
N_("music"),
@@ -500,7 +500,7 @@ get_translated_criterion (const GSList *criterion)
return ret_val;
}
- return g_strdup (_("are directories"));
+ return g_strdup (_("are folders"));
}
/**
@@ -724,7 +724,7 @@ nautilus_self_check_search_uri (void)
"smaller than 2000 bytes."));
NAUTILUS_CHECK_STRING_RESULT (nautilus_search_uri_to_human ("search:[][]file_name contains medusa & file_type is directory"),
_("Items with \"medusa\" in the name and are "
- "directories."));
+ "folders."));
/* is_search_uri */
NAUTILUS_CHECK_BOOLEAN_RESULT (nautilus_is_search_uri (""), FALSE);
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index c83ad562f..9b2c27158 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -136,6 +136,7 @@ struct FMDirectoryViewDetails
guint files_added_handler_id;
guint files_changed_handler_id;
guint load_error_handler_id;
+ guint file_changed_handler_id;
GList *pending_files_added;
GList *pending_files_changed;
@@ -1354,12 +1355,13 @@ check_for_directory_hard_limit (FMDirectoryView *view)
directory = view->details->model;
if (nautilus_directory_file_list_length_reached (directory)) {
- dialog = nautilus_warning_dialog (_("We're sorry, but the directory you're viewing has more files than "
- "we're able to display. As a result, we are only able to show you the "
- "first 4000 files it contains. "
+ /* FIXME: This says Preview Release explicitly. Must remove for real thing. */
+ dialog = nautilus_warning_dialog (_("We're sorry, but the folder you're viewing has more files than "
+ "we're able to display. As a result, we are only able to show you the "
+ "first 4000 files it contains."
"\n"
"This is a temporary limitation in this Preview Release of Nautilus, "
- "and will not be present in the final shipping version.\n"),
+ "and will not be present in the final version."),
_("Too many Files"),
get_containing_window (view));
}
@@ -3468,6 +3470,12 @@ fm_directory_view_activate_files (FMDirectoryView *view,
}
}
+static void
+file_changed_callback (NautilusFile *file, gpointer callback_data)
+{
+ schedule_update_menus (FM_DIRECTORY_VIEW (callback_data));
+}
+
/**
* load_directory:
*
@@ -3512,9 +3520,9 @@ load_directory (FMDirectoryView *view,
view->details->force_reload = force_reload;
- /* FIXME: In theory, we also need to monitor here (as well as
- * doing a call when ready), in case external forces change
- * the directory's file metadata.
+ /* FIXME: In theory, we also need to monitor metadata here (as
+ * well as doing a call when ready), in case external forces
+ * change the directory's file metadata.
*/
attributes = g_list_prepend (NULL, NAUTILUS_FILE_ATTRIBUTE_METADATA);
nautilus_file_call_when_ready
@@ -3522,6 +3530,20 @@ load_directory (FMDirectoryView *view,
attributes,
metadata_ready_callback, view);
g_list_free (attributes);
+
+ /* If capabilities change, then we need to update the menus
+ * because of New Folder.
+ */
+ attributes = g_list_prepend (NULL, NAUTILUS_FILE_ATTRIBUTE_CAPABILITIES);
+ nautilus_file_monitor_add (view->details->directory_as_file,
+ view, attributes);
+ g_list_free (attributes);
+
+ view->details->file_changed_handler_id = gtk_signal_connect
+ (GTK_OBJECT (view->details->directory_as_file),
+ "changed",
+ file_changed_callback,
+ view);
}
static void
@@ -3633,26 +3655,42 @@ fm_directory_view_merge_menus (FMDirectoryView *view)
}
static void
-disconnect_handler (FMDirectoryView *view, int *id)
+disconnect_handler (GtkObject *object, int *id)
{
if (*id != 0) {
- gtk_signal_disconnect (GTK_OBJECT (view->details->model), *id);
+ gtk_signal_disconnect (object, *id);
*id = 0;
}
}
static void
+disconnect_directory_handler (FMDirectoryView *view, int *id)
+{
+ disconnect_handler (GTK_OBJECT (view->details->model), id);
+}
+
+static void
+disconnect_directory_as_file_handler (FMDirectoryView *view, int *id)
+{
+ disconnect_handler (GTK_OBJECT (view->details->directory_as_file), id);
+}
+
+static void
disconnect_model_handlers (FMDirectoryView *view)
{
- disconnect_handler (view, &view->details->files_added_handler_id);
- disconnect_handler (view, &view->details->files_changed_handler_id);
- disconnect_handler (view, &view->details->load_error_handler_id);
- if (view->details->model != NULL) {
- nautilus_directory_file_monitor_remove (view->details->model, view);
- nautilus_file_cancel_call_when_ready (view->details->directory_as_file,
- metadata_ready_callback,
- view);
+ if (view->details->model == NULL) {
+ return;
}
+ disconnect_directory_handler (view, &view->details->files_added_handler_id);
+ disconnect_directory_handler (view, &view->details->files_changed_handler_id);
+ disconnect_directory_handler (view, &view->details->load_error_handler_id);
+ disconnect_directory_as_file_handler (view, &view->details->file_changed_handler_id);
+ nautilus_directory_file_monitor_remove (view->details->model, view);
+ nautilus_file_cancel_call_when_ready (view->details->directory_as_file,
+ metadata_ready_callback,
+ view);
+ nautilus_file_monitor_remove (view->details->directory_as_file,
+ view);
}
/**
diff --git a/src/file-manager/fm-error-reporting.c b/src/file-manager/fm-error-reporting.c
index e4a26bb63..d545cadef 100644
--- a/src/file-manager/fm-error-reporting.c
+++ b/src/file-manager/fm-error-reporting.c
@@ -26,6 +26,7 @@
#include <config.h>
#include "fm-error-reporting.h"
+#include <string.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-i18n.h>
#include <libnautilus-extensions/nautilus-file.h>
@@ -51,20 +52,29 @@ fm_report_error_renaming_file (NautilusFile *file,
switch (error) {
case GNOME_VFS_ERROR_FILE_EXISTS:
- message = g_strdup_printf (_("The name \"%s\" is already used in this folder.\nPlease use a different name."),
+ message = g_strdup_printf (_("The name \"%s\" is already used in this folder. "
+ "Please use a different name."),
new_name);
break;
case GNOME_VFS_ERROR_NOT_FOUND:
- message = g_strdup_printf (_("There is no \"%s\" in this folder. Perhaps it was just moved or deleted?"),
+ message = g_strdup_printf (_("There is no \"%s\" in this folder. "
+ "Perhaps it was just moved or deleted?"),
new_name);
break;
case GNOME_VFS_ERROR_ACCESS_DENIED:
- message = g_strdup_printf (_("You do not have the permissions necessary to rename \"%s.\""),
+ message = g_strdup_printf (_("You do not have the permissions necessary to rename \"%s\"."),
original_name);
break;
case GNOME_VFS_ERROR_NOT_PERMITTED:
- message = g_strdup_printf (_("The name \"%s.\" is not valid. \nPlease use a different name."),
- original_name);
+ if (strchr (new_name, '/') != NULL) {
+ message = g_strdup_printf (_("The name \"%s\" is not valid because it contains the character \"/\". "
+ "Please use a different name."),
+ new_name);
+ } else {
+ message = g_strdup_printf (_("The name \"%s\" is not valid. "
+ "Please use a different name."),
+ new_name);
+ }
break;
default:
/* We should invent decent error messages for every case we actually experience. */
@@ -73,6 +83,7 @@ fm_report_error_renaming_file (NautilusFile *file,
message = g_strdup_printf (_("Sorry, couldn't rename \"%s\" to \"%s\"."),
original_name, new_name);
}
+
g_free (original_name);
nautilus_error_dialog (message, _("Renaming Error"), NULL);
@@ -211,7 +222,7 @@ fm_rename_file (NautilusFile *file,
/* Start the timed wait to cancel the rename. */
old_name = nautilus_file_get_name (file);
- wait_message = g_strdup_printf (_("Renaming %s to %s."),
+ wait_message = g_strdup_printf (_("Renaming \"%s\" to \"%s\"."),
old_name,
new_name);
g_free (old_name);
diff --git a/src/nautilus-location-bar.c b/src/nautilus-location-bar.c
index 23b2b3d0d..cd4420627 100644
--- a/src/nautilus-location-bar.c
+++ b/src/nautilus-location-bar.c
@@ -92,7 +92,7 @@ static NautilusWindow *
nautilus_location_bar_get_window (GtkWidget *bar)
{
- return NAUTILUS_WINDOW (gtk_object_get_data (GTK_OBJECT (bar), "associated_window"));
+ return NAUTILUS_WINDOW (gtk_widget_get_ancestor (bar, NAUTILUS_TYPE_WINDOW));
}
static void
@@ -439,8 +439,6 @@ nautilus_location_bar_initialize (NautilusLocationBar *bar)
GtkWidget *event_box;
GtkWidget *hbox;
- bar->last_location = NULL;
-
hbox = gtk_hbox_new (0, FALSE);
event_box = gtk_event_box_new ();
@@ -495,8 +493,6 @@ nautilus_location_bar_initialize (NautilusLocationBar *bar)
bar->label = GTK_LABEL (label);
bar->entry = GTK_ENTRY (entry);
-
-
}
@@ -540,10 +536,7 @@ nautilus_location_bar_set_location (NautilusNavigationBar *navigation_bar,
/* remember the original location for later comparison */
- if (bar->last_location) {
- g_free (bar->last_location);
- }
-
+ g_free (bar->last_location);
bar->last_location = g_strdup (location);
nautilus_location_bar_update_label (bar);
}
@@ -591,6 +584,9 @@ nautilus_location_bar_update_label (NautilusLocationBar *bar)
if (nautilus_uris_match (bar->last_location, current_location)) {
gtk_label_set_text (GTK_LABEL (bar->label), _("Location:"));
} else {
+ /* FIXME: Use of spaces here to line up Go To with
+ * Location is fragile and hard to translate.
+ */
gtk_label_set_text (GTK_LABEL (bar->label), _(" Go To:"));
}
g_free (current_location);
diff --git a/src/nautilus-location-bar.h b/src/nautilus-location-bar.h
index 3175ad890..1f419a473 100644
--- a/src/nautilus-location-bar.h
+++ b/src/nautilus-location-bar.h
@@ -49,10 +49,7 @@ typedef struct NautilusLocationBar {
GtkLabel *label;
GtkEntry *entry;
-
- gchar *undo_text;
- gchar *last_location;
- gboolean undo_registered;
+ char *last_location;
} NautilusLocationBar;
typedef struct {
diff --git a/src/nautilus-search-bar-criterion.c b/src/nautilus-search-bar-criterion.c
index 88c0422ef..43669aa8c 100644
--- a/src/nautilus-search-bar-criterion.c
+++ b/src/nautilus-search-bar-criterion.c
@@ -103,7 +103,7 @@ static char *type_objects [] = {
N_("regular file"),
N_("text file"),
N_("application"),
- N_("directory"),
+ N_("folder"),
N_("music"),
NULL
};
diff --git a/src/nautilus-theme-selector.c b/src/nautilus-theme-selector.c
index 11a819dd7..13b7e0991 100644
--- a/src/nautilus-theme-selector.c
+++ b/src/nautilus-theme-selector.c
@@ -370,7 +370,7 @@ add_theme_to_icons (GtkWidget *widget, gpointer *data)
g_free (temp_path);
if (!g_file_exists (xml_path)) {
- char *message = g_strdup_printf (_("Sorry, but %s is not a valid theme directory."), theme_path);
+ char *message = g_strdup_printf (_("Sorry, but \"%s\" is not a valid theme folder."), theme_path);
nautilus_error_dialog (message, _("Couldn't add theme"), GTK_WINDOW (theme_selector));
g_free (message);
} else {
@@ -399,7 +399,7 @@ add_theme_to_icons (GtkWidget *widget, gpointer *data)
g_free (theme_destination_path);
if (result != GNOME_VFS_OK) {
- char *message = g_strdup_printf (_("Sorry, but the theme %s couldn't be installed."), theme_path);
+ char *message = g_strdup_printf (_("Sorry, but the \"%s\" theme couldn't be installed."), theme_path);
nautilus_error_dialog (message, _("Couldn't install theme"), GTK_WINDOW (theme_selector));
g_free (message);
@@ -441,7 +441,7 @@ add_new_theme_button_callback(GtkWidget *widget, NautilusThemeSelector *theme_se
GtkFileSelection *file_dialog;
theme_selector->details->dialog = gtk_file_selection_new
- (_("Select a theme directory to add as a new theme:"));
+ (_("Select a theme folder to add as a new theme:"));
file_dialog = GTK_FILE_SELECTION (theme_selector->details->dialog);
gtk_signal_connect (GTK_OBJECT (theme_selector->details->dialog),
@@ -463,24 +463,20 @@ add_new_theme_button_callback(GtkWidget *widget, NautilusThemeSelector *theme_se
}
}
-/* handle the "remove" button */
static void
-remove_button_callback(GtkWidget *widget, NautilusThemeSelector *theme_selector)
+remove_button_callback (GtkWidget *widget, NautilusThemeSelector *theme_selector)
{
if (theme_selector->details->remove_mode) {
return;
}
theme_selector->details->remove_mode = TRUE;
- /* change the label to the remove message */
- nautilus_label_set_text (NAUTILUS_LABEL(theme_selector->details->help_label),
- _("Click on a theme to remove it."));
-
- /* change the add button label */
- nautilus_label_set_text (NAUTILUS_LABEL(theme_selector->details->add_button_label),
- _("Cancel Remove"));
+
+ nautilus_label_set_text (NAUTILUS_LABEL (theme_selector->details->help_label),
+ _("Click on a theme to remove it."));
+ nautilus_label_set_text (NAUTILUS_LABEL (theme_selector->details->add_button_label),
+ _("Cancel Remove"));
- /* regenerate the list */
populate_list_with_themes (theme_selector);
}
@@ -527,7 +523,8 @@ set_help_label (NautilusThemeSelector *theme_selector, gboolean remove_mode)
_("Click on a theme to remove it."));
} else {
nautilus_label_set_text (NAUTILUS_LABEL(theme_selector->details->help_label),
- _("Click on a theme to change the\nappearance of Nautilus."));
+ _("Click on a theme to change the\n"
+ "appearance of Nautilus."));
}
}
@@ -567,7 +564,8 @@ theme_select_row_callback (GtkCList * clist, int row, int column, GdkEventButton
if (nautilus_strcmp (theme_name, current_theme) == 0) {
g_free (current_theme);
exit_remove_mode (theme_selector);
- nautilus_error_dialog (_("Sorry, but you can't remove the current theme. Please change to another theme before removing this one"),
+ nautilus_error_dialog (_("Sorry, but you can't remove the current theme. "
+ "Please change to another theme before removing this one."),
_("Can't delete current theme"),
GTK_WINDOW (theme_selector));
theme_selector->details->handling_theme_change = FALSE;
@@ -624,18 +622,18 @@ vfs_file_exists (const char *file_uri)
/* utility routine to test for the presence of an icon file */
static gboolean
-has_image_file(const char *path_uri, const char *dir_name, const char *image_file)
+has_image_file (const char *path_uri, const char *dir_name, const char *image_file)
{
char* image_uri;
gboolean exists;
- image_uri = g_strdup_printf("%s/%s/%s.png", path_uri, dir_name, image_file);
+ image_uri = g_strdup_printf ("%s/%s/%s.png", path_uri, dir_name, image_file);
exists = vfs_file_exists (image_uri);
g_free (image_uri);
if (exists)
return TRUE;
- image_uri = g_strdup_printf("%s/%s/%s.svg", path_uri, dir_name, image_file);
+ image_uri = g_strdup_printf ("%s/%s/%s.svg", path_uri, dir_name, image_file);
exists = vfs_file_exists (image_uri);
g_free (image_uri);
return exists;
@@ -657,29 +655,29 @@ make_theme_description (const char *theme_name, const char *theme_path_uri)
theme_path = nautilus_make_path (theme_local_path, theme_file_name);
g_free (theme_local_path);
- if (theme_path) {
+ if (theme_path != NULL) {
/* read the xml document */
theme_document = xmlParseFile(theme_path);
if (theme_document != NULL) {
/* fetch the description mode, of any */
- description_node = nautilus_xml_get_child_by_name (xmlDocGetRootElement (theme_document), "description");
- if (description_node) {
- temp_str = xmlGetProp(description_node, "TEXT");
- if (temp_str)
- description_result = g_strdup (temp_str);
+ description_node = nautilus_xml_get_child_by_name (xmlDocGetRootElement (theme_document),
+ "description");
+ if (description_node != NULL) {
+ temp_str = xmlGetProp (description_node, "TEXT");
+ description_result = g_strdup (temp_str);
}
-
+
xmlFreeDoc (theme_document);
}
-
+
g_free (theme_path);
}
-
+
g_free (theme_file_name);
if (description_result)
return description_result;
- return g_strdup_printf (_("No information available for the %s theme"), theme_name);
+ return g_strdup_printf (_("No information available for the \"%s\" theme"), theme_name);
}
diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c
index 7e9022c7d..c7ae6ccfb 100644
--- a/src/nautilus-window-manage-views.c
+++ b/src/nautilus-window-manage-views.c
@@ -170,6 +170,7 @@ static void
window_set_title_with_timestamp (NautilusWindow *window, const char *title)
{
char *timestamp;
+ char *title_with_timestamp;
g_return_if_fail (NAUTILUS_IS_WINDOW (window));
g_return_if_fail (title != NULL);
@@ -177,12 +178,14 @@ window_set_title_with_timestamp (NautilusWindow *window, const char *title)
timestamp = nautilus_get_build_timestamp ();
if (timestamp != NULL) {
- char *title_with_timestamp;
+ /* FIXME: The text Preview Release is hardcoded here.
+ * Are all builds with timestamps really best described
+ * as "preview release"?.
+ */
title_with_timestamp = g_strdup_printf ("Preview Release %s: %s", timestamp, title);
gtk_window_set_title (GTK_WINDOW (window), title_with_timestamp);
g_free (title_with_timestamp);
- }
- else {
+ } else {
gtk_window_set_title (GTK_WINDOW (window), title);
}