diff options
-rw-r--r-- | src/nautilus-file-utilities.c | 96 | ||||
-rw-r--r-- | src/nautilus-files-view.c | 9 |
2 files changed, 76 insertions, 29 deletions
diff --git a/src/nautilus-file-utilities.c b/src/nautilus-file-utilities.c index 9a84d2862..30dac5606 100644 --- a/src/nautilus-file-utilities.c +++ b/src/nautilus-file-utilities.c @@ -1306,34 +1306,6 @@ nautilus_file_selection_equal (GList *selection_a, return selection_matches; } -char * -nautilus_get_common_filename_prefix (GList *file_list, - int min_required_len) -{ - GList *l; - GList *strs = NULL; - char *name; - char *result; - - if (file_list == NULL) - { - return NULL; - } - - for (l = file_list; l != NULL; l = l->next) - { - g_return_val_if_fail (NAUTILUS_IS_FILE (l->data), NULL); - - name = nautilus_file_get_display_name (l->data); - strs = g_list_append (strs, name); - } - - result = nautilus_get_common_filename_prefix_from_filenames (strs, min_required_len); - g_list_free_full (strs, g_free); - - return result; -} - static char * trim_whitespace (const gchar *string) { @@ -1369,6 +1341,74 @@ trim_whitespace (const gchar *string) } char * +nautilus_get_common_filename_prefix (GList *file_list, + int min_required_len) +{ + GList *file_names = NULL; + GList *directory_names = NULL; + char *result_files; + g_autofree char *result = NULL; + g_autofree char *result_trimmed = NULL; + + if (file_list == NULL) + { + return NULL; + } + + for (GList *l = file_list; l != NULL; l = l->next) + { + char *name; + + g_return_val_if_fail (NAUTILUS_IS_FILE (l->data), NULL); + + name = nautilus_file_get_display_name (l->data); + + /* Since the concept of file extensions does not apply to directories, + * we filter those out. + */ + if (nautilus_file_is_directory (l->data)) + { + directory_names = g_list_prepend (directory_names, name); + } + else + { + file_names = g_list_prepend (file_names, name); + } + } + + result_files = nautilus_get_common_filename_prefix_from_filenames (file_names, min_required_len); + + if (directory_names == NULL) + { + return result_files; + } + + if (result_files != NULL) + { + directory_names = g_list_prepend (directory_names, result_files); + } + + result = eel_str_get_common_prefix (directory_names, min_required_len); + + g_list_free_full (file_names, g_free); + g_list_free_full (directory_names, g_free); + + if (result == NULL) + { + return NULL; + } + + result_trimmed = trim_whitespace (result); + + if (g_utf8_strlen (result_trimmed, -1) < min_required_len) + { + return NULL; + } + + return g_steal_pointer (&result_trimmed); +} + +char * nautilus_get_common_filename_prefix_from_filenames (GList *filenames, int min_required_len) { diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 0623e3b44..9b7b9b9f5 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -2281,7 +2281,14 @@ nautilus_files_view_compress_dialog_new (NautilusFilesView *view) display_name = nautilus_file_get_display_name (selection->data); - common_prefix = eel_filename_strip_extension (display_name); + if (nautilus_file_is_directory (selection->data)) + { + common_prefix = g_steal_pointer (&display_name); + } + else + { + common_prefix = eel_filename_strip_extension (display_name); + } } else { |