From e458a15f9c3ff87ec98fc8d1fb27e8d7b68420c3 Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Mon, 11 May 2015 11:25:26 +0300 Subject: [PATCH 1/1] Optimized loading wallpapers at start-up; optimized sorting icons in icon view. --- src/xfce-backdrop.c | 44 +++++++++++++++++++++++++++++++++++++++++--- src/xfdesktop-icon-view.c | 43 ++++++++++++++++--------------------------- 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/src/xfce-backdrop.c b/src/xfce-backdrop.c index af514be..10da9da 100644 --- a/src/xfce-backdrop.c +++ b/src/xfce-backdrop.c @@ -26,6 +26,10 @@ #include #endif +#ifdef HAVE_STDLIB_H +#include +#endif + #ifdef HAVE_STRING_H #include #endif @@ -336,6 +340,36 @@ cb_xfce_backdrop__image_files_changed(GFileMonitor *monitor, } } +/* Equivalent to, but faster than + * g_list_sort(list, (GCompareFunc)compare_by_collate_key) */ +static GList * +sort_image_list(GList *list, guint list_size) +{ + gchar **array; + guint i; + GList *l; + + g_assert(g_list_length(list) == list_size); + /* Create an array of the same size as list */ + array = g_malloc(list_size * sizeof(array[0])); + + /* Copy list contents to the array */ + for(l = list, i = 0; l; l = l->next, ++i) + array[i] = l->data; + + /* Sort the array */ + qsort(array, list_size, sizeof(array[0]), + (GCompareFunc)compare_by_collate_key); + + /* Copy sorted array back to the list */ + for(l = list, i = 0; l; l = l->next, ++i) + l->data = array[i]; + + g_free(array); + + return list; +} + /* Returns a GList of all the image files in the parent directory of filename */ static GList * list_image_files_in_dir(const gchar *filename) @@ -344,6 +378,7 @@ list_image_files_in_dir(const gchar *filename) gboolean needs_slash = TRUE; const gchar *file; GList *files = NULL; + guint file_count = 0; gchar *dir_name; dir_name = g_path_get_dirname(filename); @@ -360,15 +395,18 @@ list_image_files_in_dir(const gchar *filename) while((file = g_dir_read_name(dir))) { gchar *current_file = g_strdup_printf(needs_slash ? "%s/%s" : "%s%s", dir_name, file); - if(xfdesktop_image_file_is_valid(current_file)) - files = g_list_insert_sorted(files, current_file, (GCompareFunc)compare_by_collate_key); - else + if(xfdesktop_image_file_is_valid(current_file)) { + files = g_list_prepend(files, current_file); + ++file_count; + } else g_free(current_file); } g_dir_close(dir); g_free(dir_name); + if(file_count > 1) + files = sort_image_list(files, file_count); return files; } diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c index 8bc180d..3c44e10 100644 --- a/src/xfdesktop-icon-view.c +++ b/src/xfdesktop-icon-view.c @@ -1852,10 +1852,8 @@ xfdesktop_icon_view_sort_icons(XfdesktopIconView *icon_view) { #ifdef ENABLE_FILE_ICONS GList *l = NULL; - GList *special_icons = NULL; - GList *volume_icons = NULL; - GList *folder_icons = NULL; - GList *regular_icons = NULL; + gint i; + GList *icons[4] = { NULL, NULL, NULL, NULL }; gint16 row = -1; /* start at -1 because we'll increment it */ gint16 col = 0; @@ -1868,41 +1866,32 @@ xfdesktop_icon_view_sort_icons(XfdesktopIconView *icon_view) if(xfdesktop_icon_get_position(l->data, &old_row, &old_col)) xfdesktop_grid_set_position_free(icon_view, old_row, old_col); - /* Add it to the correct list */ + /* Choose the correct list index */ if(XFDESKTOP_IS_SPECIAL_FILE_ICON(l->data)) { - special_icons = g_list_insert_sorted(special_icons, - l->data, - (GCompareFunc)xfdesktop_icon_view_compare_icons); + i = 0; } else if(XFDESKTOP_IS_VOLUME_ICON(l->data)) { - volume_icons = g_list_insert_sorted(volume_icons, - l->data, - (GCompareFunc)xfdesktop_icon_view_compare_icons); + i = 1; } else if(XFDESKTOP_IS_FILE_ICON(l->data) && g_file_query_file_type(xfdesktop_file_icon_peek_file(l->data), G_FILE_QUERY_INFO_NONE, NULL) == G_FILE_TYPE_DIRECTORY) { - folder_icons = g_list_insert_sorted(folder_icons, - l->data, - (GCompareFunc)xfdesktop_icon_view_compare_icons); + i = 2; } else { - regular_icons = g_list_insert_sorted(regular_icons, - l->data, - (GCompareFunc)xfdesktop_icon_view_compare_icons); + i = 3; } + + /* Add the icon to the correct list */ + icons[i] = g_list_prepend(icons[i], l->data); } /* Append the icons: special, folder, then regular */ - xfdesktop_icon_view_append_icons(icon_view, special_icons, &row, &col); - xfdesktop_icon_view_append_icons(icon_view, volume_icons, &row, &col); - xfdesktop_icon_view_append_icons(icon_view, folder_icons, &row, &col); - xfdesktop_icon_view_append_icons(icon_view, regular_icons, &row, &col); - - - g_list_free(special_icons); - g_list_free(volume_icons); - g_list_free(folder_icons); - g_list_free(regular_icons); + for(i = 0; i < sizeof(icons) / sizeof(icons[0]); ++i) { + l = g_list_sort(icons[i], + (GCompareFunc)xfdesktop_icon_view_compare_icons); + xfdesktop_icon_view_append_icons(icon_view, l, &row, &col); + g_list_free(l); + } #endif } -- 2.3.7