diff options
Diffstat (limited to 'libnautilus-private')
-rw-r--r-- | libnautilus-private/nautilus-directory-async.c | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-utilities.c | 44 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-utilities.h | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file.c | 37 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-canvas-item.c | 78 |
5 files changed, 117 insertions, 46 deletions
diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index 6feb7d064..a58794a86 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -2180,8 +2180,6 @@ is_needy (NautilusFile *file, ReadyCallback *callback; Monitor *monitor; - g_assert (NAUTILUS_IS_FILE (file)); - if (!(* check_missing) (file)) { return FALSE; } diff --git a/libnautilus-private/nautilus-file-utilities.c b/libnautilus-private/nautilus-file-utilities.c index 339ca708e..f13fe8956 100644 --- a/libnautilus-private/nautilus-file-utilities.c +++ b/libnautilus-private/nautilus-file-utilities.c @@ -167,6 +167,50 @@ nautilus_get_desktop_directory_uri_no_create (void) } +/* These need to be reset to NULL when desktop_is_home_dir changes */ +static char *escaped_desktop_dir = NULL; +static char *escaped_desktop_file = NULL; +static gboolean desktop_dir_changed_callback_installed = FALSE; + +static void +desktop_dir_changed_callback (gpointer callback_data) +{ + g_free (escaped_desktop_dir); + g_free (escaped_desktop_file); + escaped_desktop_dir = NULL; + escaped_desktop_file = NULL; +} + +gboolean +nautilus_is_desktop_directory_escaped (char *escaped_dir, + char *escaped_file) +{ + char *uri, *path; + GnomeVFSURI *vfs_uri; + + if (!desktop_dir_changed_callback_installed) { + eel_preferences_add_callback (NAUTILUS_PREFERENCES_DESKTOP_IS_HOME_DIR, + desktop_dir_changed_callback, + NULL); + desktop_dir_changed_callback_installed = TRUE; + } + + if (escaped_desktop_dir == NULL) { + path = get_desktop_path (); + uri = gnome_vfs_get_uri_from_local_path (path); + vfs_uri = gnome_vfs_uri_new (uri); + g_free (path); + g_free (uri); + escaped_desktop_file = gnome_vfs_uri_extract_short_path_name (vfs_uri); + escaped_desktop_dir = gnome_vfs_uri_extract_dirname (vfs_uri); + gnome_vfs_uri_unref (vfs_uri); + } + + return (strcmp (escaped_dir, escaped_desktop_dir) == 0 && + strcmp (escaped_file, escaped_desktop_file) == 0); +} + + /** * nautilus_get_gmc_desktop_directory: * diff --git a/libnautilus-private/nautilus-file-utilities.h b/libnautilus-private/nautilus-file-utilities.h index 7ee4249b3..e26f8a05f 100644 --- a/libnautilus-private/nautilus-file-utilities.h +++ b/libnautilus-private/nautilus-file-utilities.h @@ -37,6 +37,8 @@ gboolean nautilus_file_name_matches_backup_pattern (const char *name_or_relati char * nautilus_get_user_directory (void); char * nautilus_get_desktop_directory (void); char * nautilus_get_desktop_directory_uri (void); +gboolean nautilus_is_desktop_directory_escaped (char *escaped_dir, + char *escaped_filename); char * nautilus_get_gmc_desktop_directory (void); char * nautilus_get_pixmap_directory (void); diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c index bc502ee1d..9fad12273 100644 --- a/libnautilus-private/nautilus-file.c +++ b/libnautilus-private/nautilus-file.c @@ -44,6 +44,7 @@ #include "nautilus-trash-file.h" #include "nautilus-vfs-file.h" #include "nautilus-volume-monitor.h" +#include <eel/eel-debug.h> #include <eel/eel-glib-extensions.h> #include <eel/eel-gtk-extensions.h> #include <eel/eel-vfs-extensions.h> @@ -75,7 +76,8 @@ extern void eazel_dump_stack_trace (const char *print_prefix, #endif /* Files that start with these characters sort after files that don't. */ -#define SORT_LAST_CHARACTERS ".#" +#define SORT_LAST_CHAR1 '.' +#define SORT_LAST_CHAR2 '#' /* Name to use to tag metadata for the directory itself. */ #define FILE_NAME_FOR_DIRECTORY_METADATA "." @@ -171,7 +173,7 @@ nautilus_file_info_missing (NautilusFile *file, GnomeVFSFileInfoFields needed_ma if (file == NULL) { return TRUE; } - g_return_val_if_fail (NAUTILUS_IS_FILE (file), TRUE); + info = file->details->info; if (info == NULL) { return TRUE; @@ -1660,8 +1662,8 @@ compare_by_display_name (NautilusFile *file_1, NautilusFile *file_2) name_1 = nautilus_file_get_display_name_nocopy (file_1); name_2 = nautilus_file_get_display_name_nocopy (file_2); - sort_last_1 = strchr (SORT_LAST_CHARACTERS, name_1[0]) != NULL; - sort_last_2 = strchr (SORT_LAST_CHARACTERS, name_2[0]) != NULL; + sort_last_1 = name_1[0] == SORT_LAST_CHAR1 || name_1[0] == SORT_LAST_CHAR2; + sort_last_2 = name_2[0] == SORT_LAST_CHAR1 || name_2[0] == SORT_LAST_CHAR2; if (sort_last_1 && !sort_last_2) { compare = +1; @@ -1670,7 +1672,7 @@ compare_by_display_name (NautilusFile *file_1, NautilusFile *file_2) } else { key_1 = nautilus_file_get_display_name_collation_key (file_1); key_2 = nautilus_file_get_display_name_collation_key (file_2); - compare = eel_strcmp (key_1, key_2); + compare = strcmp (key_1, key_2); } return compare; @@ -1713,14 +1715,17 @@ file_has_note (NautilusFile *file) static gboolean file_is_desktop (NautilusFile *file) { - char *desktop_uri; - gboolean res; + GnomeVFSURI *dir_vfs_uri; - desktop_uri = nautilus_get_desktop_directory_uri_no_create (); - res = nautilus_file_matches_uri (file, desktop_uri); - g_free (desktop_uri); + dir_vfs_uri = file->details->directory->details->vfs_uri; - return res; + if (dir_vfs_uri == NULL || + strcmp (dir_vfs_uri->method_string, "file") != 0) { + return FALSE; + } + + return nautilus_is_desktop_directory_escaped (dir_vfs_uri->text, + file->details->relative_uri); } static int @@ -2359,8 +2364,6 @@ nautilus_file_get_display_name_collation_key (NautilusFile *file) return NULL; } - g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL); - if (file->details->display_name_collation_key != NULL) { return file->details->display_name_collation_key; } @@ -2383,8 +2386,6 @@ nautilus_file_get_display_name_nocopy (NautilusFile *file) return NULL; } - g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL); - if (file->details->cached_display_name != NULL) { return file->details->cached_display_name; } @@ -4451,8 +4452,10 @@ nautilus_file_get_file_type (NautilusFile *file) if (file == NULL) { return GNOME_VFS_FILE_TYPE_UNKNOWN; } - return EEL_CALL_METHOD_WITH_RETURN_VALUE - (NAUTILUS_FILE_CLASS, file, get_file_type, (file)); + /* Don't use EEL_CALL_METHOD_WITH_RETURN_VALUE here, because the + typechecking was showing up a lot on the profiles, since this + is called from the sorting code */ + return ((NautilusFileClass*)G_OBJECT_GET_CLASS (file))->get_file_type (file); } /** diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c index 146f939fe..921dc0031 100644 --- a/libnautilus-private/nautilus-icon-canvas-item.c +++ b/libnautilus-private/nautilus-icon-canvas-item.c @@ -97,7 +97,9 @@ struct NautilusIconCanvasItemDetails { guint rendered_is_focused : 1; guint is_renaming : 1; - + + guint bounds_cached : 1; + PangoLayout *editable_text_layout; PangoLayout *additional_text_layout; @@ -109,6 +111,8 @@ struct NautilusIconCanvasItemDetails { ArtIRect text_rect; ArtIRect emblem_rect; + ArtIRect bounds_cache; + /* Accessibility bits */ GailTextUtil *text_util; }; @@ -272,10 +276,17 @@ pixbuf_is_acceptable (GdkPixbuf *pixbuf) && gdk_pixbuf_get_bits_per_sample (pixbuf) == 8; } +static void +nautilus_icon_canvas_item_invalidate_bounds_cache (NautilusIconCanvasItem *item) +{ + item->details->bounds_cached = FALSE; +} + /* invalidate the text width and height cached in the item details. */ void nautilus_icon_canvas_item_invalidate_label_size (NautilusIconCanvasItem *item) { + nautilus_icon_canvas_item_invalidate_bounds_cache (item); item->details->text_width = -1; item->details->text_height = -1; if (item->details->editable_text_layout != NULL) { @@ -452,6 +463,7 @@ nautilus_icon_canvas_item_set_image (NautilusIconCanvasItem *item, details->pixbuf = image; + nautilus_icon_canvas_item_invalidate_bounds_cache (item); eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); } @@ -481,6 +493,8 @@ nautilus_icon_canvas_item_set_emblems (NautilusIconCanvasItem *item, eel_gdk_pixbuf_list_ref (emblem_pixbufs); eel_gdk_pixbuf_list_free (item->details->emblem_pixbufs); item->details->emblem_pixbufs = g_list_copy (emblem_pixbufs); + + nautilus_icon_canvas_item_invalidate_bounds_cache (item); eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); } @@ -495,6 +509,8 @@ nautilus_icon_canvas_item_set_attach_points (NautilusIconCanvasItem *item, item->details->attach_points = g_new (NautilusEmblemAttachPoints, 1); *item->details->attach_points = *attach_points; } + + nautilus_icon_canvas_item_invalidate_bounds_cache (item); } void @@ -503,6 +519,7 @@ nautilus_icon_canvas_item_set_embedded_text_rect (NautilusIconCanvasItem * { item->details->embedded_text_rect = *text_rect; + nautilus_icon_canvas_item_invalidate_bounds_cache (item); eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); } @@ -1728,7 +1745,7 @@ nautilus_icon_canvas_item_bounds (EelCanvasItem *item, double pixels_per_unit; EmblemLayout emblem_layout; GdkPixbuf *emblem_pixbuf; - + g_assert (x1 != NULL); g_assert (y1 != NULL); g_assert (x2 != NULL); @@ -1737,35 +1754,42 @@ nautilus_icon_canvas_item_bounds (EelCanvasItem *item, icon_item = NAUTILUS_ICON_CANVAS_ITEM (item); details = icon_item->details; - measure_label_text (icon_item); - - /* Compute icon rectangle. */ - icon_rect.x0 = details->x; - icon_rect.y0 = details->y; - if (details->pixbuf == NULL) { - icon_rect.x1 = icon_rect.x0; - icon_rect.y1 = icon_rect.y0; - } else { - pixels_per_unit = item->canvas->pixels_per_unit; - icon_rect.x1 = icon_rect.x0 + gdk_pixbuf_get_width (details->pixbuf) / pixels_per_unit; - icon_rect.y1 = icon_rect.y0 + gdk_pixbuf_get_height (details->pixbuf) / pixels_per_unit; - } - - /* Compute text rectangle. */ - text_rect = compute_text_rectangle (icon_item, icon_rect, FALSE); + if (details->bounds_cached) { + total_rect = details->bounds_cache; + } else { + measure_label_text (icon_item); + + /* Compute icon rectangle. */ + icon_rect.x0 = 0; + icon_rect.y0 = 0; + if (details->pixbuf == NULL) { + icon_rect.x1 = icon_rect.x0; + icon_rect.y1 = icon_rect.y0; + } else { + pixels_per_unit = item->canvas->pixels_per_unit; + icon_rect.x1 = icon_rect.x0 + gdk_pixbuf_get_width (details->pixbuf) / pixels_per_unit; + icon_rect.y1 = icon_rect.y0 + gdk_pixbuf_get_height (details->pixbuf) / pixels_per_unit; + } + + /* Compute text rectangle. */ + text_rect = compute_text_rectangle (icon_item, icon_rect, FALSE); + + /* Compute total rectangle, adding in emblem rectangles. */ + art_irect_union (&total_rect, &icon_rect, &text_rect); + emblem_layout_reset (&emblem_layout, icon_item, icon_rect); + while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) { + art_irect_union (&total_rect, &total_rect, &emblem_rect); + } - /* Compute total rectangle, adding in emblem rectangles. */ - art_irect_union (&total_rect, &icon_rect, &text_rect); - emblem_layout_reset (&emblem_layout, icon_item, icon_rect); - while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) { - art_irect_union (&total_rect, &total_rect, &emblem_rect); + details->bounds_cache = total_rect; + details->bounds_cached = TRUE; } /* Return the result. */ - *x1 = floor (total_rect.x0); - *y1 = floor (total_rect.y0); - *x2 = ceil (total_rect.x1) + 1; - *y2 = ceil (total_rect.y1) + 1; + *x1 = (int)details->x + total_rect.x0; + *y1 = (int)details->y + total_rect.y0; + *x2 = (int)details->x + total_rect.x1 + 1; + *y2 = (int)details->y + total_rect.y1 + 1; } /* Get the rectangle of the icon only, in world coordinates. */ |