@@ -66,7 +66,7 @@ typedef struct {
6666 GRegex * newline_re ;
6767
6868 GRegex * filename_re ;
69- GPatternSpec * filename_glob_pattern ;
69+ GList * filename_glob_patterns ;
7070
7171 GMutex hit_list_lock ;
7272 GList * hit_list ; // holds FileSearchResults
@@ -455,7 +455,36 @@ search_thread_data_new (NemoSearchEngineAdvanced *engine,
455455 cased = g_strdup (normalized );
456456 }
457457
458- data -> filename_glob_pattern = g_pattern_spec_new (cased );
458+ /* In (< 6.6), whitespace between words was treated as AND, and implied a filename
459+ * must include *this* AND *that* AND *other*. To preserve this behavior, split
460+ * the search text and wrap segments individually (*segment*) if no wildcard characters
461+ * already included, and generate a GPatternSpec for each segment. */
462+ gchar * * words = g_strsplit_set (cased , " " , -1 );
463+ data -> filename_glob_patterns = NULL ;
464+
465+ for (gint i = 0 ; words [i ] != NULL ; i ++ ) {
466+ if (words [i ][0 ] != '\0' ) {
467+ gchar * word_pattern ;
468+
469+ if (strchr (words [i ], '*' ) == NULL && strchr (words [i ], '?' ) == NULL ) {
470+ word_pattern = g_strdup_printf ("*%s*" , words [i ]);
471+ } else {
472+ word_pattern = g_strdup (words [i ]);
473+ }
474+
475+ GPatternSpec * pattern = g_pattern_spec_new (word_pattern );
476+ g_free (word_pattern );
477+ data -> filename_glob_patterns = g_list_prepend (data -> filename_glob_patterns , pattern );
478+ }
479+ }
480+
481+ g_strfreev (words );
482+
483+ data -> filename_glob_patterns = g_list_reverse (data -> filename_glob_patterns );
484+
485+ if (data -> filename_glob_patterns == NULL ) {
486+ data -> filename_glob_patterns = g_list_prepend (NULL , g_pattern_spec_new ("*" ));
487+ }
459488
460489 g_free (text );
461490 g_free (normalized );
@@ -540,7 +569,7 @@ search_thread_data_free (SearchThreadData *data)
540569 g_clear_pointer (& data -> content_re , g_regex_unref );
541570 g_clear_pointer (& data -> newline_re , g_regex_unref );
542571 g_clear_pointer (& data -> filename_re , g_regex_unref );
543- g_clear_pointer ( & data -> filename_glob_pattern , g_pattern_spec_free );
572+ g_list_free_full ( data -> filename_glob_patterns , ( GDestroyNotify ) g_pattern_spec_free );
544573 g_timer_destroy (data -> timer );
545574 g_mutex_clear (& data -> hit_list_lock );
546575
@@ -1011,7 +1040,17 @@ visit_directory (GFile *dir, SearchThreadData *data)
10111040 }
10121041
10131042 gchar * cased_reversed = g_utf8_strreverse (cased , -1 );
1014- hit = g_pattern_spec_match (data -> filename_glob_pattern , strlen (cased ), cased , cased_reversed );
1043+ gsize len = strlen (cased );
1044+
1045+ hit = TRUE;
1046+ for (GList * l = data -> filename_glob_patterns ; l != NULL ; l = l -> next ) {
1047+ GPatternSpec * pattern = l -> data ;
1048+ if (!g_pattern_spec_match (pattern , len , cased , cased_reversed )) {
1049+ hit = FALSE;
1050+ break ;
1051+ }
1052+ }
1053+
10151054 g_free (cased );
10161055 g_free (cased_reversed );
10171056 }
0 commit comments