diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/file-manager/fm-icon-container.c | 78 | ||||
-rw-r--r-- | src/file-manager/fm-list-model.c | 69 | ||||
-rw-r--r-- | src/file-manager/fm-list-model.h | 5 | ||||
-rw-r--r-- | src/file-manager/fm-list-view.c | 19 |
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); |