diff options
author | Martin Wehner <martin.wehner@gmail.com> | 2006-02-20 20:39:56 +0000 |
---|---|---|
committer | Martin Wehner <mwehner@src.gnome.org> | 2006-02-20 20:39:56 +0000 |
commit | aed37dc58a7cdec3dc0539b45251b5c5ad8df01b (patch) | |
tree | 3081253912f435abb8281adb358c190cc21ca732 /libnautilus-private/nautilus-mime-actions.c | |
parent | 0210784ff7839929484d2d1e2fceb589f61bef0f (diff) | |
download | nautilus-aed37dc58a7cdec3dc0539b45251b5c5ad8df01b.tar.gz |
Avoid redundant application lookups by sorting the files by mime type and
2006-02-19 Martin Wehner <martin.wehner@gmail.com>
* libnautilus-private/nautilus-mime-actions.c:
(file_compare_by_mime_type), (file_compare_by_guessed_mime_type),
(file_compare_by_uri_scheme),
(nautilus_mime_get_default_application_for_files),
(nautilus_mime_get_open_with_applications_for_files),
(nautilus_mime_get_applications_for_files),
(nautilus_mime_has_any_applications_for_files):
Avoid redundant application lookups by sorting the files by mime type
and skipping the ones which have the same mime type / parent uri
combination as the previous one. Prevents nautilus from blocking for
seconds when selecting many files of similar type.
Diffstat (limited to 'libnautilus-private/nautilus-mime-actions.c')
-rw-r--r-- | libnautilus-private/nautilus-mime-actions.c | 116 |
1 files changed, 106 insertions, 10 deletions
diff --git a/libnautilus-private/nautilus-mime-actions.c b/libnautilus-private/nautilus-mime-actions.c index 388d4b4c3..16a570310 100644 --- a/libnautilus-private/nautilus-mime-actions.c +++ b/libnautilus-private/nautilus-mime-actions.c @@ -125,6 +125,58 @@ nautilus_mime_get_default_application_for_file (NautilusFile *file) } static int +file_compare_by_mime_type (NautilusFile *file_a, + NautilusFile *file_b) +{ + char *mime_type_a, *mime_type_b; + int ret; + + mime_type_a = nautilus_file_get_mime_type (file_a); + mime_type_b = nautilus_file_get_mime_type (file_b); + + ret = strcmp (mime_type_a, mime_type_b); + + g_free (mime_type_a); + g_free (mime_type_b); + + return ret; +} + +static int +file_compare_by_guessed_mime_type (NautilusFile *file_a, + NautilusFile *file_b) { + char *guessed_mime_type_a, *guessed_mime_type_b; + int ret; + + guessed_mime_type_a = nautilus_file_get_guessed_mime_type (file_a); + guessed_mime_type_b = nautilus_file_get_guessed_mime_type (file_b); + + ret = strcmp (guessed_mime_type_a, guessed_mime_type_b); + + g_free (guessed_mime_type_a); + g_free (guessed_mime_type_b); + + return ret; +} + +static int +file_compare_by_parent_uri (NautilusFile *file_a, + NautilusFile *file_b) { + char *parent_uri_a, *parent_uri_b; + int ret; + + parent_uri_a = nautilus_file_get_parent_uri (file_a); + parent_uri_b = nautilus_file_get_parent_uri (file_b); + + ret = strcmp (parent_uri_a, parent_uri_b); + + g_free (parent_uri_a); + g_free (parent_uri_b); + + return ret; +} + +static int application_compare_by_name (const GnomeVFSMimeApplication *app_a, const GnomeVFSMimeApplication *app_b) { @@ -238,16 +290,24 @@ nautilus_mime_has_any_applications_for_file (NautilusFile *file) GnomeVFSMimeApplication * nautilus_mime_get_default_application_for_files (GList *files) { - GList *l; + GList *l, *sorted_files; NautilusFile *file; GnomeVFSMimeApplication *app, *one_app; g_assert (files != NULL); + sorted_files = g_list_sort (g_list_copy (files), (GCompareFunc) file_compare_by_mime_type); + app = NULL; - for (l = files; l != NULL; l = l->next) { + for (l = sorted_files; l != NULL; l = l->next) { file = l->data; + if (l->prev && + file_compare_by_mime_type (file, l->prev->data) == 0 && + file_compare_by_parent_uri (file, l->prev->data) == 0) { + continue; + } + one_app = nautilus_mime_get_default_application_for_file (file); if (one_app == NULL || (app != NULL && !gnome_vfs_mime_application_equal (app, one_app))) { gnome_vfs_mime_application_free (app); @@ -263,6 +323,8 @@ nautilus_mime_get_default_application_for_files (GList *files) } } + g_list_free (sorted_files); + return app; } @@ -315,16 +377,25 @@ intersect_application_lists (GList *a, GList * nautilus_mime_get_open_with_applications_for_files (GList *files) { - GList *l; + GList *l, *sorted_files; NautilusFile *file; GList *one_ret, *ret; g_assert (files != NULL); + sorted_files = g_list_sort (g_list_copy (files), (GCompareFunc) file_compare_by_mime_type); + ret = NULL; - for (l = files; l != NULL; l = l->next) { + for (l = sorted_files; l != NULL; l = l->next) { file = l->data; + if (l->prev && + file_compare_by_mime_type (file, l->prev->data) == 0 && + file_compare_by_guessed_mime_type (file, l->prev->data) == 0 && + file_compare_by_parent_uri (file, l->prev->data) == 0) { + continue; + } + one_ret = nautilus_mime_get_open_with_applications_for_file (file); if (ret != NULL) { ret = intersect_application_lists (ret, one_ret); @@ -337,22 +408,31 @@ nautilus_mime_get_open_with_applications_for_files (GList *files) } } + g_list_free (sorted_files); + return ret; } GList * nautilus_mime_get_applications_for_files (GList *files) { - GList *l; + GList *l, *sorted_files; NautilusFile *file; GList *one_ret, *ret; g_assert (files != NULL); + sorted_files = g_list_sort (g_list_copy (files), (GCompareFunc) file_compare_by_mime_type); + ret = NULL; - for (l = files; l != NULL; l = l->next) { + for (l = sorted_files; l != NULL; l = l->next) { file = l->data; + if (l->prev && + file_compare_by_mime_type (file, l->prev->data) == 0) { + continue; + } + one_ret = nautilus_mime_get_applications_for_file (file); if (ret != NULL) { ret = intersect_application_lists (ret, one_ret); @@ -365,23 +445,39 @@ nautilus_mime_get_applications_for_files (GList *files) } } + g_list_free (sorted_files); + return ret; } gboolean nautilus_mime_has_any_applications_for_files (GList *files) { - GList *l; + GList *l, *sorted_files; NautilusFile *file; + gboolean ret; g_assert (files != NULL); - for (l = files; l != NULL; l = l->next) { + sorted_files = g_list_sort (g_list_copy (files), (GCompareFunc) file_compare_by_mime_type); + + ret = TRUE; + for (l = sorted_files; l != NULL; l = l->next) { file = NAUTILUS_FILE (l->data); + + if (l->prev && + file_compare_by_mime_type (file, l->prev->data) == 0 && + file_compare_by_parent_uri (file, l->prev->data) == 0) { + continue; + } + if (!nautilus_mime_has_any_applications_for_file (file)) { - return FALSE; + ret = FALSE; + break; } } - return TRUE; + g_list_free (sorted_files); + + return ret; } |