diff options
22 files changed, 569 insertions, 650 deletions
@@ -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); } |