summaryrefslogtreecommitdiff
path: root/libnautilus-private
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2003-07-08 15:48:12 +0000
committerAlexander Larsson <alexl@src.gnome.org>2003-07-08 15:48:12 +0000
commite36213306470e6c5fa3125c544a6b3b4dc70e564 (patch)
treeafd893ec6da16b19bb1dce746e0e1bdd5cf5f048 /libnautilus-private
parent6b56535afa2da6cf0b2c2ee967cd73f365732f6a (diff)
downloadnautilus-e36213306470e6c5fa3125c544a6b3b4dc70e564.tar.gz
Skip assert for commonly run code.
2003-07-08 Alexander Larsson <alexl@redhat.com> * libnautilus-private/nautilus-directory-async.c: (is_needy): Skip assert for commonly run code. * libnautilus-private/nautilus-file-utilities.[ch]: (desktop_dir_changed_callback), (nautilus_is_desktop_directory_escaped): New function nautilus_is_desktop_directory_escaped to handle faster check if file is desktop dir. * libnautilus-private/nautilus-file.c: (nautilus_file_info_missing), (compare_by_display_name), (file_is_desktop), (nautilus_file_get_display_name_collation_key), (nautilus_file_get_display_name_nocopy), (nautilus_file_get_file_type): Some micro-optimizations. Faster file_is_desktop * libnautilus-private/nautilus-icon-canvas-item.c: (nautilus_icon_canvas_item_invalidate_bounds_cache), (nautilus_icon_canvas_item_invalidate_label_size), (nautilus_icon_canvas_item_set_image), (nautilus_icon_canvas_item_set_emblems), (nautilus_icon_canvas_item_set_attach_points), (nautilus_icon_canvas_item_set_embedded_text_rect), (nautilus_icon_canvas_item_bounds): Cache bounds calculation. Invalidate when needed.
Diffstat (limited to 'libnautilus-private')
-rw-r--r--libnautilus-private/nautilus-directory-async.c2
-rw-r--r--libnautilus-private/nautilus-file-utilities.c44
-rw-r--r--libnautilus-private/nautilus-file-utilities.h2
-rw-r--r--libnautilus-private/nautilus-file.c37
-rw-r--r--libnautilus-private/nautilus-icon-canvas-item.c78
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. */