summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2008-01-22 22:41:46 +0000
committerAlexander Larsson <alexl@src.gnome.org>2008-01-22 22:41:46 +0000
commit36481d7c1aa02701586810a7f35072baaaee9402 (patch)
tree53f4cca007d5dfc46d6675f664b59260cd29a956
parentdf8c3f3896d4d59f9cc7226896653a779d696dc5 (diff)
downloadnautilus-36481d7c1aa02701586810a7f35072baaaee9402.tar.gz
Add attribute_q property that is the Quark of the attribute property.
2008-01-22 Alexander Larsson <alexl@redhat.com> * libnautilus-extension/nautilus-column.c: Add attribute_q property that is the Quark of the attribute property. * src/file-manager/fm-icon-container.c: * src/file-manager/fm-list-model.[ch]: * src/file-manager/fm-list-view.c: Use the quark versions of the string attribute calls for better performance. svn path=/trunk/; revision=13642
-rw-r--r--ChangeLog12
-rw-r--r--libnautilus-extension/nautilus-column.c20
-rw-r--r--libnautilus-private/nautilus-file.c4
-rw-r--r--src/file-manager/fm-icon-container.c78
-rw-r--r--src/file-manager/fm-list-model.c69
-rw-r--r--src/file-manager/fm-list-model.h5
-rw-r--r--src/file-manager/fm-list-view.c19
7 files changed, 136 insertions, 71 deletions
diff --git a/ChangeLog b/ChangeLog
index fd6ac0ba8..d137c3f8f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
2008-01-22 Alexander Larsson <alexl@redhat.com>
+ * libnautilus-extension/nautilus-column.c:
+ Add attribute_q property that is the Quark
+ of the attribute property.
+
+ * src/file-manager/fm-icon-container.c:
+ * src/file-manager/fm-list-model.[ch]:
+ * src/file-manager/fm-list-view.c:
+ Use the quark versions of the string attribute
+ calls for better performance.
+
+2008-01-22 Alexander Larsson <alexl@redhat.com>
+
* libnautilus-private/nautilus-file.[ch]:
Add quark-bases string-attribute accessors.
Store extension infos as quarks
diff --git a/libnautilus-extension/nautilus-column.c b/libnautilus-extension/nautilus-column.c
index 9532c2ebe..a5af0c49f 100644
--- a/libnautilus-extension/nautilus-column.c
+++ b/libnautilus-extension/nautilus-column.c
@@ -30,6 +30,7 @@ enum {
PROP_0,
PROP_NAME,
PROP_ATTRIBUTE,
+ PROP_ATTRIBUTE_Q,
PROP_LABEL,
PROP_DESCRIPTION,
PROP_XALIGN,
@@ -38,7 +39,7 @@ enum {
struct _NautilusColumnDetails {
char *name;
- char *attribute;
+ GQuark attribute;
char *label;
char *description;
float xalign;
@@ -84,7 +85,10 @@ nautilus_column_get_property (GObject *object,
g_value_set_string (value, column->details->name);
break;
case PROP_ATTRIBUTE :
- g_value_set_string (value, column->details->attribute);
+ g_value_set_string (value, g_quark_to_string (column->details->attribute));
+ break;
+ case PROP_ATTRIBUTE_Q :
+ g_value_set_uint (value, column->details->attribute);
break;
case PROP_LABEL :
g_value_set_string (value, column->details->label);
@@ -118,9 +122,9 @@ nautilus_column_set_property (GObject *object,
g_object_notify (object, "name");
break;
case PROP_ATTRIBUTE :
- g_free (column->details->attribute);
- column->details->attribute = g_strdup (g_value_get_string (value));
+ column->details->attribute = g_quark_from_string (g_value_get_string (value));
g_object_notify (object, "attribute");
+ g_object_notify (object, "attribute_q");
break;
case PROP_LABEL :
g_free (column->details->label);
@@ -150,7 +154,6 @@ nautilus_column_finalize (GObject *object)
column = NAUTILUS_COLUMN (object);
g_free (column->details->name);
- g_free (column->details->attribute);
g_free (column->details->label);
g_free (column->details->description);
@@ -190,6 +193,13 @@ nautilus_column_class_init (NautilusColumnClass *class)
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (class),
+ PROP_ATTRIBUTE_Q,
+ g_param_spec_uint ("attribute_q",
+ "Attribute quark",
+ "The attribute name to display, in quark form",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READABLE));
+ g_object_class_install_property (G_OBJECT_CLASS (class),
PROP_LABEL,
g_param_spec_string ("label",
"Label",
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 6f427acc7..11de7ecdb 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -5128,10 +5128,6 @@ char *
nautilus_file_get_string_attribute_q (NautilusFile *file, GQuark attribute_q)
{
char *extension_attribute;
-
- /* FIXME bugzilla.gnome.org 40646:
- * Use hash table and switch statement or function pointers for speed?
- */
if (attribute_q == attribute_name_q) {
return nautilus_file_get_display_name (file);
diff --git a/src/file-manager/fm-icon-container.c b/src/file-manager/fm-icon-container.c
index 2d24cdfc8..4ca15f951 100644
--- a/src/file-manager/fm-icon-container.c
+++ b/src/file-manager/fm-icon-container.c
@@ -41,6 +41,8 @@ GNOME_CLASS_BOILERPLATE (FMIconContainer, fm_icon_container,
NautilusIconContainer,
nautilus_icon_container_get_type ())
+static GQuark attribute_none_q;
+
static FMIconView *
get_icon_view (NautilusIconContainer *container)
{
@@ -176,20 +178,41 @@ fm_icon_container_prioritize_thumbnailing (NautilusIconContainer *container,
}
}
+static void
+update_captions (GQuark **attributes_p)
+{
+ char **attribute_names;
+ int i;
+
+ attribute_names = eel_preferences_get_string_array (NAUTILUS_PREFERENCES_ICON_VIEW_CAPTIONS);
+
+ g_free (*attributes_p);
+ *attributes_p = g_new (GQuark, g_strv_length (attribute_names) + 1);
+
+ for (i = 0; attribute_names[i] != NULL; ++i) {
+ (*attributes_p)[i] = g_quark_from_string (attribute_names[i]);
+ }
+ (*attributes_p)[i] = 0;
+
+ g_strfreev (attribute_names);
+}
+
/*
* Get the preference for which caption text should appear
* beneath icons.
*/
-static char **
+static GQuark *
fm_icon_container_get_icon_text_attributes_from_preferences (void)
{
- static char **attributes;
+ static GQuark *attributes = NULL;
if (attributes == NULL) {
- eel_preferences_add_auto_string_array (NAUTILUS_PREFERENCES_ICON_VIEW_CAPTIONS,
- &attributes);
+ eel_preferences_add_callback (NAUTILUS_PREFERENCES_ICON_VIEW_CAPTIONS,
+ (EelPreferencesCallback)update_captions,
+ &attributes);
+ update_captions (&attributes);
}
-
+
/* We don't need to sanity check the attributes list even though it came
* from preferences.
*
@@ -219,6 +242,17 @@ fm_icon_container_get_icon_text_attributes_from_preferences (void)
return attributes;
}
+static int
+quarkv_length (GQuark *attributes)
+{
+ int i;
+ i = 0;
+ while (attributes[i] != 0) {
+ i++;
+ }
+ return i;
+}
+
/**
* fm_icon_view_get_icon_text_attribute_names:
*
@@ -228,11 +262,11 @@ fm_icon_container_get_icon_text_attributes_from_preferences (void)
* @view: FMIconView to query.
*
**/
-static char **
+static GQuark *
fm_icon_container_get_icon_text_attribute_names (NautilusIconContainer *container,
int *len)
{
- char **attributes;
+ GQuark *attributes;
int piece_count;
const int pieces_by_level[] = {
@@ -249,7 +283,7 @@ fm_icon_container_get_icon_text_attribute_names (NautilusIconContainer *containe
attributes = fm_icon_container_get_icon_text_attributes_from_preferences ();
- *len = MIN (piece_count, g_strv_length (attributes));
+ *len = MIN (piece_count, quarkv_length (attributes));
return attributes;
}
@@ -265,7 +299,7 @@ fm_icon_container_get_icon_text (NautilusIconContainer *container,
{
char *actual_uri;
gchar *description;
- char **attribute_names;
+ GQuark *attributes;
char *text_array[4];
int i, j, num_attributes;
FMIconView *icon_view;
@@ -312,27 +346,33 @@ fm_icon_container_get_icon_text (NautilusIconContainer *container,
}
/* Find out what attributes go below each icon. */
- attribute_names = fm_icon_container_get_icon_text_attribute_names (container,
+ attributes = fm_icon_container_get_icon_text_attribute_names (container,
&num_attributes);
/* Get the attributes. */
j = 0;
- for (i = 0; i < num_attributes; ++i)
- {
- if (strcmp (attribute_names[i], "none") == 0) {
+ for (i = 0; i < num_attributes; ++i) {
+ if (attributes[i] == attribute_none_q) {
continue;
}
text_array[j++] =
- nautilus_file_get_string_attribute_with_default (file, attribute_names[i]);
+ nautilus_file_get_string_attribute_with_default_q (file, attributes[i]);
}
text_array[j] = NULL;
/* Return them. */
- *additional_text = g_strjoinv ("\n", text_array);
-
- for (i = 0; i < j; i++) {
- g_free (text_array[i]);
+ if (j == 0) {
+ *additional_text = NULL;
+ } else if (j == 1) {
+ /* Only one item, avoid the strdup + free */
+ *additional_text = text_array[0];
+ } else {
+ *additional_text = g_strjoinv ("\n", text_array);
+
+ for (i = 0; i < j; i++) {
+ g_free (text_array[i]);
+ }
}
}
@@ -494,6 +534,8 @@ fm_icon_container_class_init (FMIconContainerClass *klass)
ic_class = &klass->parent_class;
+ attribute_none_q = g_quark_from_static_string ("none");
+
ic_class->get_icon_text = fm_icon_container_get_icon_text;
ic_class->get_icon_images = fm_icon_container_get_icon_images;
ic_class->get_icon_description = fm_icon_container_get_icon_description;
diff --git a/src/file-manager/fm-list-model.c b/src/file-manager/fm-list-model.c
index 5d47b9bb7..5670a2e87 100644
--- a/src/file-manager/fm-list-model.c
+++ b/src/file-manager/fm-list-model.c
@@ -48,14 +48,18 @@ enum {
LAST_SIGNAL
};
+static GQuark attribute_name_q,
+ attribute_modification_date_q,
+ attribute_date_modified_q;
+
/* msec delay after Loading... dummy row turns into (empty) */
#define LOADING_TO_EMPTY_DELAY 100
static guint list_model_signals[LAST_SIGNAL] = { 0 };
static int fm_list_model_file_entry_compare_func (gconstpointer a,
- gconstpointer b,
- gpointer user_data);
+ gconstpointer b,
+ gpointer user_data);
static GObjectClass *parent_class;
@@ -66,7 +70,7 @@ struct FMListModelDetails {
int stamp;
- char *sort_attribute;
+ GQuark sort_attribute;
GtkSortType order;
gboolean sort_directories_first;
@@ -363,25 +367,24 @@ fm_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column
default:
if (column >= FM_LIST_MODEL_NUM_COLUMNS || column < FM_LIST_MODEL_NUM_COLUMNS + model->details->columns->len) {
NautilusColumn *nautilus_column;
- char *attribute;
+ GQuark attribute;
nautilus_column = model->details->columns->pdata[column - FM_LIST_MODEL_NUM_COLUMNS];
g_value_init (value, G_TYPE_STRING);
g_object_get (nautilus_column,
- "attribute", &attribute,
+ "attribute_q", &attribute,
NULL);
if (file != NULL) {
- str = nautilus_file_get_string_attribute_with_default (file,
- attribute);
+ str = nautilus_file_get_string_attribute_with_default_q (file,
+ attribute);
g_value_set_string_take_ownership (value, str);
- } else if (!strcmp (attribute, "name")) {
+ } else if (attribute == attribute_name_q) {
if (file_entry->parent->loaded) {
g_value_set_string (value, _("(Empty)"));
} else {
g_value_set_string (value, _("Loading..."));
}
}
- g_free (attribute);
} else {
g_assert_not_reached ();
}
@@ -642,10 +645,10 @@ fm_list_model_file_entry_compare_func (gconstpointer a,
file_entry2 = (FileEntry *)b;
if (file_entry1->file != NULL && file_entry2->file != NULL) {
- result = nautilus_file_compare_for_sort_by_attribute (file_entry1->file, file_entry2->file,
- model->details->sort_attribute,
- model->details->sort_directories_first,
- (model->details->order == GTK_SORT_DESCENDING));
+ result = nautilus_file_compare_for_sort_by_attribute_q (file_entry1->file, file_entry2->file,
+ model->details->sort_attribute,
+ model->details->sort_directories_first,
+ (model->details->order == GTK_SORT_DESCENDING));
} else if (file_entry1->file == NULL) {
return -1;
} else {
@@ -662,10 +665,10 @@ fm_list_model_compare_func (FMListModel *model,
{
int result;
- result = nautilus_file_compare_for_sort_by_attribute (file1, file2,
- model->details->sort_attribute,
- model->details->sort_directories_first,
- (model->details->order == GTK_SORT_DESCENDING));
+ result = nautilus_file_compare_for_sort_by_attribute_q (file1, file2,
+ model->details->sort_attribute,
+ model->details->sort_directories_first,
+ (model->details->order == GTK_SORT_DESCENDING));
return result;
}
@@ -778,7 +781,6 @@ fm_list_model_set_sort_column_id (GtkTreeSortable *sortable, gint sort_column_id
model = (FMListModel *)sortable;
- g_free (model->details->sort_attribute);
model->details->sort_attribute = fm_list_model_get_attribute_from_sort_column_id (model, sort_column_id);
model->details->order = order;
@@ -1309,57 +1311,55 @@ fm_list_model_set_should_sort_directories_first (FMListModel *model, gboolean so
int
fm_list_model_get_sort_column_id_from_attribute (FMListModel *model,
- const char *attribute)
+ GQuark attribute)
{
guint i;
- if (attribute == NULL) {
+ if (attribute == 0) {
return -1;
}
/* Hack - the preferences dialog sets modification_date for some
* rather than date_modified for some reason. Make sure that
* works. */
- if (!strcmp (attribute, "modification_date")) {
- attribute = "date_modified";
+ if (attribute == attribute_modification_date_q) {
+ attribute = attribute_date_modified_q;
}
for (i = 0; i < model->details->columns->len; i++) {
NautilusColumn *column;
- char *column_attribute;
+ GQuark column_attribute;
column =
NAUTILUS_COLUMN (model->details->columns->pdata[i]);
g_object_get (G_OBJECT (column),
- "attribute", &column_attribute,
+ "attribute_q", &column_attribute,
NULL);
- if (!strcmp (column_attribute, attribute)) {
- g_free (column_attribute);
+ if (column_attribute == attribute) {
return FM_LIST_MODEL_NUM_COLUMNS + i;
}
- g_free (column_attribute);
}
return -1;
}
-char *
+GQuark
fm_list_model_get_attribute_from_sort_column_id (FMListModel *model,
int sort_column_id)
{
NautilusColumn *column;
int index;
- char *attribute;
+ GQuark attribute;
index = sort_column_id - FM_LIST_MODEL_NUM_COLUMNS;
if (index < 0 || index >= model->details->columns->len) {
g_warning ("unknown sort column id: %d", sort_column_id);
- return NULL;
+ return 0;
}
column = NAUTILUS_COLUMN (model->details->columns->pdata[index]);
- g_object_get (G_OBJECT (column), "attribute", &attribute, NULL);
+ g_object_get (G_OBJECT (column), "attribute_q", &attribute, NULL);
return attribute;
}
@@ -1553,7 +1553,6 @@ fm_list_model_finalize (GObject *object)
model = FM_LIST_MODEL (object);
- g_free (model->details->sort_attribute);
g_free (model->details);
EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
@@ -1567,7 +1566,7 @@ fm_list_model_init (FMListModel *model)
model->details->top_reverse_map = g_hash_table_new (g_direct_hash, g_direct_equal);
model->details->directory_reverse_map = g_hash_table_new (g_direct_hash, g_direct_equal);
model->details->stamp = g_random_int ();
- model->details->sort_attribute = NULL;
+ model->details->sort_attribute = 0;
model->details->columns = g_ptr_array_new ();
}
@@ -1576,6 +1575,10 @@ fm_list_model_class_init (FMListModelClass *klass)
{
GObjectClass *object_class;
+ attribute_name_q = g_quark_from_static_string ("name");
+ attribute_modification_date_q = g_quark_from_static_string ("modification_date");
+ attribute_date_modified_q = g_quark_from_static_string ("date_modified");
+
object_class = (GObjectClass *)klass;
parent_class = g_type_class_peek_parent (klass);
diff --git a/src/file-manager/fm-list-model.h b/src/file-manager/fm-list-model.h
index ec5f0fad1..237ec03f3 100644
--- a/src/file-manager/fm-list-model.h
+++ b/src/file-manager/fm-list-model.h
@@ -99,9 +99,8 @@ void fm_list_model_set_should_sort_directories_first (FMListModel *
gboolean sort_directories_first);
int fm_list_model_get_sort_column_id_from_attribute (FMListModel *model,
-
- const char *attribute);
-char *fm_list_model_get_attribute_from_sort_column_id (FMListModel *model,
+ GQuark attribute);
+GQuark fm_list_model_get_attribute_from_sort_column_id (FMListModel *model,
int sort_column_id);
void fm_list_model_sort_files (FMListModel *model,
GList **files);
diff --git a/src/file-manager/fm-list-view.c b/src/file-manager/fm-list-view.c
index 673e1892c..2e9ea8b0b 100644
--- a/src/file-manager/fm-list-view.c
+++ b/src/file-manager/fm-list-view.c
@@ -1005,7 +1005,7 @@ sort_column_changed_callback (GtkTreeSortable *sortable,
NautilusFile *file;
gint sort_column_id;
GtkSortType reversed;
- char *sort_attr, *default_sort_attr;
+ GQuark sort_attr, default_sort_attr;
char *reversed_attr, *default_reversed_attr;
file = fm_directory_view_get_directory_as_file (FM_DIRECTORY_VIEW (view));
@@ -1013,12 +1013,11 @@ sort_column_changed_callback (GtkTreeSortable *sortable,
gtk_tree_sortable_get_sort_column_id (sortable, &sort_column_id, &reversed);
sort_attr = fm_list_model_get_attribute_from_sort_column_id (view->details->model, sort_column_id);
- sort_column_id = fm_list_model_get_sort_column_id_from_attribute (view->details->model, default_sort_order_auto_value);
+ sort_column_id = fm_list_model_get_sort_column_id_from_attribute (view->details->model,
+ g_quark_from_string (default_sort_order_auto_value));
default_sort_attr = fm_list_model_get_attribute_from_sort_column_id (view->details->model, sort_column_id);
nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN,
- default_sort_attr, sort_attr);
- g_free (default_sort_attr);
- g_free (sort_attr);
+ g_quark_to_string (default_sort_attr), g_quark_to_string (sort_attr));
default_reversed_attr = (default_sort_reversed_auto_value ? "true" : "false");
reversed_attr = (reversed ? "true" : "false");
@@ -1555,10 +1554,13 @@ set_sort_order_from_metadata_and_preferences (FMListView *list_view)
sort_attribute = nautilus_file_get_metadata (file,
NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN,
NULL);
- sort_column_id = fm_list_model_get_sort_column_id_from_attribute (list_view->details->model, sort_attribute);
+ sort_column_id = fm_list_model_get_sort_column_id_from_attribute (list_view->details->model,
+ g_quark_from_string (sort_attribute));
g_free (sort_attribute);
if (sort_column_id == -1) {
- sort_column_id = fm_list_model_get_sort_column_id_from_attribute (list_view->details->model, default_sort_order_auto_value);
+ sort_column_id =
+ fm_list_model_get_sort_column_id_from_attribute (list_view->details->model,
+ g_quark_from_string (default_sort_order_auto_value));
}
sort_reversed = nautilus_file_get_boolean_metadata (file,
@@ -2156,7 +2158,8 @@ fm_list_view_reset_to_defaults (FMDirectoryView *view)
gtk_tree_sortable_set_sort_column_id
(GTK_TREE_SORTABLE (FM_LIST_VIEW (view)->details->model),
- fm_list_model_get_sort_column_id_from_attribute (FM_LIST_VIEW (view)->details->model, default_sort_order_auto_value),
+ fm_list_model_get_sort_column_id_from_attribute (FM_LIST_VIEW (view)->details->model,
+ g_quark_from_string (default_sort_order_auto_value)),
default_sort_reversed_auto_value ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING);
fm_list_view_set_zoom_level (FM_LIST_VIEW (view), get_default_zoom_level (), FALSE);