summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
4 files changed, 109 insertions, 62 deletions
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);