diff options
Diffstat (limited to 'mail-client/claws-mail/files/claws-3.9.0_fix-search-field_part1.patch')
-rw-r--r-- | mail-client/claws-mail/files/claws-3.9.0_fix-search-field_part1.patch | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/mail-client/claws-mail/files/claws-3.9.0_fix-search-field_part1.patch b/mail-client/claws-mail/files/claws-3.9.0_fix-search-field_part1.patch new file mode 100644 index 000000000000..0bdadd68da22 --- /dev/null +++ b/mail-client/claws-mail/files/claws-3.9.0_fix-search-field_part1.patch @@ -0,0 +1,149 @@ +Make combo search field work again. + +Gentoo bug: https://bugs.gentoo.org/show_bug.cgi?id=455590 +Upstream commit: http://www.claws-mail.org/tracker/getpatchset.php?ver=3.9.0cvs8 +--- src/advsearch.c 24 Oct 2012 07:48:24 -0000 1.1.2.7 ++++ src/advsearch.c 16 Nov 2012 13:10:05 -0000 1.1.2.8 +@@ -314,32 +314,6 @@ + return returnstr; + } + +-// -------------------------- +- +-static gchar *expand_tag_search_string(const gchar *search_string) +-{ +- gchar *newstr = NULL; +- gchar **words = search_string ? g_strsplit(search_string, " ", -1):NULL; +- gint i = 0; +- while (words && words[i] && *words[i]) { +- g_strstrip(words[i]); +- if (!newstr) { +- newstr = g_strdup_printf("tag matchcase \"%s\"", words[i]); +- } else { +- gint o_len = strlen(newstr); +- gint s_len = 17; /* strlen("|tag matchcase \"\"") */ +- gint n_len = s_len + strlen(words[i]); +- newstr = g_realloc(newstr, o_len + n_len + 1); +- strcpy(newstr + o_len, "|tag matchcase \""); +- strcpy(newstr + o_len + (s_len - 1), words[i]); +- strcpy(newstr + o_len + (n_len - 1), "\""); +- } +- i++; +- } +- g_strfreev(words); +- return newstr; +-} +- + static void prepare_matcher_extended(AdvancedSearch *search) + { + gchar *newstr = advsearch_expand_search_string(search->request.matchstring); +@@ -350,19 +324,51 @@ + } + } + ++#define debug_matcher_list(prefix, list) \ ++do { \ ++ gchar *str = list ? matcherlist_to_string(list) : g_strdup("(NULL)"); \ ++ \ ++ debug_print("%s: %s\n", prefix, str); \ ++ \ ++ g_free(str); \ ++} while(0) ++ + static void prepare_matcher_tag(AdvancedSearch *search) + { +- char *newstr = expand_tag_search_string(search->request.matchstring); +- search->predicate = matcher_parser_get_cond(newstr, &search->is_fast); +- g_free(newstr); ++ gchar **words = search->request.matchstring ++ ? g_strsplit(search->request.matchstring, " ", -1) ++ : NULL; ++ gint i = 0; ++ ++ if (search->predicate == NULL) { ++ search->predicate = g_new0(MatcherList, 1); ++ search->predicate->bool_and = FALSE; ++ search->is_fast = TRUE; ++ } ++ ++ while (words && words[i] && *words[i]) { ++ MatcherProp *matcher; ++ ++ g_strstrip(words[i]); ++ ++ matcher = matcherprop_new(MATCHCRITERIA_TAG, NULL, ++ MATCHTYPE_MATCHCASE, words[i], 0); ++ ++ search->predicate->matchers = g_slist_prepend(search->predicate->matchers, matcher); ++ ++ i++; ++ } ++ g_strfreev(words); + } + + static void prepare_matcher_header(AdvancedSearch *search, gint match_header) + { + MatcherProp *matcher; + +- if (search->predicate == NULL) ++ if (search->predicate == NULL) { + search->predicate = g_new0(MatcherList, 1); ++ search->predicate->bool_and = FALSE; ++ } + + matcher = matcherprop_new(match_header, NULL, MATCHTYPE_MATCHCASE, + search->request.matchstring, 0); +@@ -373,10 +379,18 @@ + static void prepare_matcher_mixed(AdvancedSearch *search) + { + prepare_matcher_tag(search); ++ debug_matcher_list("tag matcher list", search->predicate); ++ ++ /* we want an OR search */ ++ if (search->predicate) ++ search->predicate->bool_and = FALSE; + + prepare_matcher_header(search, MATCHCRITERIA_SUBJECT); ++ debug_matcher_list("tag + subject matcher list", search->predicate); + prepare_matcher_header(search, MATCHCRITERIA_FROM); ++ debug_matcher_list("tag + subject + from matcher list", search->predicate); + prepare_matcher_header(search, MATCHCRITERIA_TO); ++ debug_matcher_list("tag + subject + from + to matcher list", search->predicate); + } + + static void prepare_matcher(AdvancedSearch *search) +@@ -398,26 +412,32 @@ + switch (search->request.type) { + case ADVANCED_SEARCH_SUBJECT: + prepare_matcher_header(search, MATCHCRITERIA_SUBJECT); ++ debug_matcher_list("subject search", search->predicate); + break; + + case ADVANCED_SEARCH_FROM: + prepare_matcher_header(search, MATCHCRITERIA_FROM); ++ debug_matcher_list("from search", search->predicate); + break; + + case ADVANCED_SEARCH_TO: + prepare_matcher_header(search, MATCHCRITERIA_TO); ++ debug_matcher_list("to search", search->predicate); + break; + + case ADVANCED_SEARCH_TAG: +- prepare_matcher_header(search, MATCHCRITERIA_TAG); ++ prepare_matcher_tag(search); ++ debug_matcher_list("tag search", search->predicate); + break; + + case ADVANCED_SEARCH_MIXED: + prepare_matcher_mixed(search); ++ debug_matcher_list("mixed search", search->predicate); + break; + + case ADVANCED_SEARCH_EXTENDED: + prepare_matcher_extended(search); ++ debug_matcher_list("extended search", search->predicate); + break; + + default: + |