talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 123d26deb9ce491a923329d3b1a8f379b52ce6ef
parent 0af9d59862a00c6d19f4ba6eb88bba43107ba7bc
Author: Colin Leroy <colin@colino.net>
Date:   Sun, 18 Nov 2012 19:50:36 +0000

2012-11-18 [colin]	3.9.0cvs14

	* AUTHORS
	* src/advsearch.c
	* src/matcher.c
	* src/matcher.h
	* src/matcher_parser_parse.y
	* src/prefs_matcher.c
	* src/gtk/authors.h
	* src/gtk/quicksearch.c
		Add age_{greater,lower}_hours matcher criteria
		Initial patch by Abhay S. Kushwaha.

Diffstat:
MAUTHORS | 1+
MChangeLog | 13+++++++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/advsearch.c | 2++
Msrc/gtk/authors.h | 1+
Msrc/gtk/quicksearch.c | 2++
Msrc/matcher.c | 17+++++++++++++++--
Msrc/matcher.h | 1+
Msrc/matcher_parser_parse.y | 19+++++++++++++++++++
Msrc/prefs_matcher.c | 48+++++++++++++++++++++++++++++++++++++++---------
11 files changed, 95 insertions(+), 12 deletions(-)

diff --git a/AUTHORS b/AUTHORS @@ -292,3 +292,4 @@ contributors (in addition to the above; based on Changelog) Sean Buckheister Natanael Copa Igor Mammedov + Abhay S. Kushwaha diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,16 @@ +2012-11-18 [colin] 3.9.0cvs14 + + * AUTHORS + * src/advsearch.c + * src/matcher.c + * src/matcher.h + * src/matcher_parser_parse.y + * src/prefs_matcher.c + * src/gtk/authors.h + * src/gtk/quicksearch.c + Add age_{greater,lower}_hours matcher criteria + Initial patch by Abhay S. Kushwaha. + 2012-11-18 [ticho] 3.9.0cvs13 * src/mbox.c diff --git a/PATCHSETS b/PATCHSETS @@ -4511,3 +4511,4 @@ ( cvs diff -u -r 1.61.2.106 -r 1.61.2.107 src/account.c; cvs diff -u -r 1.1.2.13 -r 1.1.2.14 src/addrcustomattr.c; cvs diff -u -r 1.1.2.30 -r 1.1.2.31 src/edittags.c; cvs diff -u -r 1.59.2.93 -r 1.59.2.94 src/prefs_filtering.c; cvs diff -u -r 1.43.2.98 -r 1.43.2.99 src/prefs_matcher.c; cvs diff -u -r 1.1.2.49 -r 1.1.2.50 src/prefs_msg_colors.c; cvs diff -u -r 1.43.2.131 -r 1.43.2.132 src/toolbar.c; cvs diff -u -r 1.1.2.18 -r 1.1.2.19 src/uri_opener.c; cvs diff -u -r 1.1.2.88 -r 1.1.2.89 src/wizard.c; cvs diff -u -r 1.36.2.208 -r 1.36.2.209 src/common/utils.c; cvs diff -u -r 1.4.2.86 -r 1.4.2.87 src/gtk/about.c; ) > 3.9.0cvs11.patchset ( cvs diff -u -r 1.21.2.9 -r 1.21.2.10 po/bg.po; cvs diff -u -r 1.1.2.19 -r 1.1.2.20 po/ca.po; cvs diff -u -r 1.9.2.26 -r 1.9.2.27 po/cs.po; cvs diff -u -r 1.58.2.52 -r 1.58.2.53 po/de.po; cvs diff -u -r 1.12.2.18 -r 1.12.2.19 po/en_GB.po; cvs diff -u -r 1.60.2.66 -r 1.60.2.67 po/es.po; cvs diff -u -r 1.1.2.29 -r 1.1.2.30 po/fi.po; cvs diff -u -r 1.42.2.59 -r 1.42.2.60 po/fr.po; cvs diff -u -r 1.1.2.2 -r 1.1.2.3 po/he.po; cvs diff -u -r 1.5.2.23 -r 1.5.2.24 po/hu.po; cvs diff -u -r 1.1.2.2 -r 1.1.2.3 po/id_ID.po; cvs diff -u -r 1.34.2.30 -r 1.34.2.31 po/it.po; cvs diff -u -r 1.16.2.12 -r 1.16.2.13 po/ja.po; cvs diff -u -r 1.1.2.5 -r 1.1.2.6 po/lt.po; cvs diff -u -r 1.28.2.15 -r 1.28.2.16 po/nl.po; cvs diff -u -r 1.10.2.18 -r 1.10.2.19 po/pl.po; cvs diff -u -r 1.50.2.45 -r 1.50.2.46 po/pt_BR.po; cvs diff -u -r 1.1.2.4 -r 1.1.2.5 po/pt_PT.po; cvs diff -u -r 1.17.2.22 -r 1.17.2.23 po/ru.po; cvs diff -u -r 1.2.2.37 -r 1.2.2.38 po/sk.po; cvs diff -u -r 1.17.2.28 -r 1.17.2.29 po/sr.po; cvs diff -u -r 1.4.2.13 -r 1.4.2.14 po/sv.po; cvs diff -u -r 1.1.2.6 -r 1.1.2.7 po/uk.po; cvs diff -u -r 1.5.2.31 -r 1.5.2.32 po/zh_CN.po; cvs diff -u -r 1.1.2.5 -r 1.1.2.6 po/zh_TW.po; cvs diff -u -r 1.1.4.6 -r 1.1.4.7 po/Makevars; ) > 3.9.0cvs12.patchset ( cvs diff -u -r 1.28.2.55 -r 1.28.2.56 src/mbox.c; ) > 3.9.0cvs13.patchset +( cvs diff -u -r 1.100.2.86 -r 1.100.2.87 AUTHORS; cvs diff -u -r 1.1.2.9 -r 1.1.2.10 src/advsearch.c; cvs diff -u -r 1.75.2.78 -r 1.75.2.79 src/matcher.c; cvs diff -u -r 1.39.2.23 -r 1.39.2.24 src/matcher.h; cvs diff -u -r 1.25.2.36 -r 1.25.2.37 src/matcher_parser_parse.y; cvs diff -u -r 1.43.2.99 -r 1.43.2.100 src/prefs_matcher.c; cvs diff -u -r 1.1.2.82 -r 1.1.2.83 src/gtk/authors.h; cvs diff -u -r 1.1.2.121 -r 1.1.2.122 src/gtk/quicksearch.c; ) > 3.9.0cvs14.patchset diff --git a/configure.ac b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=9 MICRO_VERSION=0 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=13 +EXTRA_VERSION=14 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/advsearch.c b/src/advsearch.c @@ -150,6 +150,8 @@ gchar *advsearch_expand_search_string(const gchar *search_string) { "a", "all", 0, FALSE, FALSE }, { "ag", "age_greater", 1, FALSE, FALSE }, { "al", "age_lower", 1, FALSE, FALSE }, + { "agh","age_greater_hours", 1, FALSE, FALSE }, + { "alh","age_lower_hours", 1, FALSE, FALSE }, { "b", "body_part", 1, TRUE, TRUE }, { "B", "message", 1, TRUE, TRUE }, { "c", "cc", 1, TRUE, TRUE }, diff --git a/src/gtk/authors.h b/src/gtk/authors.h @@ -164,6 +164,7 @@ static char *CONTRIBS_LIST[] = { "Fabian Keil", "Martin Kluge", "IWAMOTO Kouichi", +"Abhay S. Kushwaha", "Joshua M. Kwan", "Jean-Yves Lefort", "Jérôme Lelong", diff --git a/src/gtk/quicksearch.c b/src/gtk/quicksearch.c @@ -433,6 +433,8 @@ static gchar *search_descr_strings[] = { "a", N_("all messages"), "ag #", N_("messages whose age is greater than # days"), "al #", N_("messages whose age is less than # days"), + "agh #", N_("messages whose age is greater than # hours"), + "alh #", N_("messages whose age is less than # hours"), "b S", N_("messages which contain S in the message body"), "B S", N_("messages which contain S in the whole message"), "c S", N_("messages carbon-copied to S"), diff --git a/src/matcher.c b/src/matcher.c @@ -110,6 +110,8 @@ static const MatchParser matchparser_tab[] = { {MATCHCRITERIA_NOT_TAGGED, "~tagged"}, {MATCHCRITERIA_AGE_GREATER, "age_greater"}, {MATCHCRITERIA_AGE_LOWER, "age_lower"}, + {MATCHCRITERIA_AGE_GREATER_HOURS, "age_greater_hours"}, + {MATCHCRITERIA_AGE_LOWER_HOURS, "age_lower_hours"}, {MATCHCRITERIA_NEWSGROUPS, "newsgroups"}, {MATCHCRITERIA_NOT_NEWSGROUPS, "~newsgroups"}, {MATCHCRITERIA_INREPLYTO, "inreplyto"}, @@ -757,6 +759,7 @@ static gboolean matcherprop_match(MatcherProp *prop, MsgInfo *info) { time_t t; + gint age_mult_hours = 1; switch(prop->criteria) { case MATCHCRITERIA_ALL: @@ -880,12 +883,15 @@ static gboolean matcherprop_match(MatcherProp *prop, case MATCHCRITERIA_NOT_TAGGED: return info->tags == NULL; case MATCHCRITERIA_AGE_GREATER: + age_mult_hours = 24; + /* Fallthrough intended */ + case MATCHCRITERIA_AGE_GREATER_HOURS: { gboolean ret; gint age; t = time(NULL); - age = ((t - info->date_t) / (60 * 60 * 24)); + age = ((t - info->date_t) / (60 * 60 * age_mult_hours)); ret = (age >= prop->value); /* debug output */ @@ -904,12 +910,15 @@ static gboolean matcherprop_match(MatcherProp *prop, return ret; } case MATCHCRITERIA_AGE_LOWER: + age_mult_hours = 24; + /* Fallthrough intended */ + case MATCHCRITERIA_AGE_LOWER_HOURS: { gboolean ret; gint age; t = time(NULL); - age = ((t - info->date_t) / (60 * 60 * 24)); + age = ((t - info->date_t) / (60 * 60 * age_mult_hours)); ret = (age < prop->value); /* debug output */ @@ -1748,6 +1757,8 @@ gboolean matcherlist_match(MatcherList *matchers, MsgInfo *info) case MATCHCRITERIA_NOT_TAGGED: case MATCHCRITERIA_AGE_GREATER: case MATCHCRITERIA_AGE_LOWER: + case MATCHCRITERIA_AGE_GREATER_HOURS: + case MATCHCRITERIA_AGE_LOWER_HOURS: case MATCHCRITERIA_NEWSGROUPS: case MATCHCRITERIA_NOT_NEWSGROUPS: case MATCHCRITERIA_INREPLYTO: @@ -1895,6 +1906,8 @@ gchar *matcherprop_to_string(MatcherProp *matcher) switch (matcher->criteria) { case MATCHCRITERIA_AGE_GREATER: case MATCHCRITERIA_AGE_LOWER: + case MATCHCRITERIA_AGE_GREATER_HOURS: + case MATCHCRITERIA_AGE_LOWER_HOURS: case MATCHCRITERIA_SCORE_GREATER: case MATCHCRITERIA_SCORE_LOWER: case MATCHCRITERIA_SCORE_EQUAL: diff --git a/src/matcher.h b/src/matcher.h @@ -87,6 +87,7 @@ enum { MC_(CC), MC_(NOT_CC), MC_(TO_OR_CC), MC_(NOT_TO_AND_NOT_CC), MC_(AGE_GREATER), MC_(AGE_LOWER), + MC_(AGE_GREATER_HOURS), MC_(AGE_LOWER_HOURS), MC_(NEWSGROUPS), MC_(NOT_NEWSGROUPS), MC_(INREPLYTO), MC_(NOT_INREPLYTO), MC_(REFERENCES), MC_(NOT_REFERENCES), diff --git a/src/matcher_parser_parse.y b/src/matcher_parser_parse.y @@ -319,6 +319,7 @@ int matcher_parserwrap(void) %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS +%token MATCHER_AGE_GREATER_HOURS MATCHER_AGE_LOWER_HOURS %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER @@ -953,6 +954,24 @@ MATCHER_ALL value = strtol($2, NULL, 0); prop = matcherprop_new(criteria, NULL, 0, NULL, value); } +| MATCHER_AGE_GREATER_HOURS MATCHER_INTEGER +{ + gint criteria = 0; + gint value = 0; + + criteria = MATCHCRITERIA_AGE_GREATER_HOURS; + value = strtol($2, NULL, 0); + prop = matcherprop_new(criteria, NULL, 0, NULL, value); +} +| MATCHER_AGE_LOWER_HOURS MATCHER_INTEGER +{ + gint criteria = 0; + gint value = 0; + + criteria = MATCHCRITERIA_AGE_LOWER_HOURS; + value = strtol($2, NULL, 0); + prop = matcherprop_new(criteria, NULL, 0, NULL, value); +} | MATCHER_NEWSGROUPS match_type MATCHER_STRING { gint criteria = 0; diff --git a/src/prefs_matcher.c b/src/prefs_matcher.c @@ -183,7 +183,10 @@ enum { CRITERIA_TAGGED = 36, CRITERIA_HAS_ATTACHMENT = 37, - CRITERIA_SIGNED = 38 + CRITERIA_SIGNED = 38, + + CRITERIA_AGE_GREATER_HOURS = 39, + CRITERIA_AGE_LOWER_HOURS = 40 }; enum { @@ -203,8 +206,9 @@ enum { }; enum { - AGE_DAYS = 0, - AGE_WEEKS = 1 + AGE_HOURS = 0, + AGE_DAYS = 1, + AGE_WEEKS = 2 }; enum { @@ -326,6 +330,7 @@ static void prefs_matcher_models_create(void) matcher.model_age = GTK_TREE_MODEL(store); store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); + COMBOBOX_ADD(store, _("hours"), AGE_HOURS); COMBOBOX_ADD(store, _("days"), AGE_DAYS); COMBOBOX_ADD(store, _("weeks"), AGE_WEEKS); matcher.model_age_units = GTK_TREE_MODEL(store); @@ -1136,6 +1141,10 @@ static gint prefs_matcher_get_criteria_from_matching(gint matching_id) case MATCHCRITERIA_NOT_HEADER: case MATCHCRITERIA_HEADER: return CRITERIA_HEADER; + case MATCHCRITERIA_AGE_GREATER_HOURS: + return CRITERIA_AGE_GREATER_HOURS; + case MATCHCRITERIA_AGE_LOWER_HOURS: + return CRITERIA_AGE_LOWER_HOURS; case MATCHCRITERIA_AGE_GREATER: return CRITERIA_AGE_GREATER; case MATCHCRITERIA_AGE_LOWER: @@ -1230,6 +1239,10 @@ static gint prefs_matcher_get_matching_from_criteria(gint criteria_id) return MATCHCRITERIA_AGE_GREATER; case CRITERIA_AGE_LOWER: return MATCHCRITERIA_AGE_LOWER; + case CRITERIA_AGE_GREATER_HOURS: + return MATCHCRITERIA_AGE_GREATER_HOURS; + case CRITERIA_AGE_LOWER_HOURS: + return MATCHCRITERIA_AGE_LOWER_HOURS; case CRITERIA_SCORE_GREATER: return MATCHCRITERIA_SCORE_GREATER; case CRITERIA_SCORE_LOWER: @@ -1439,12 +1452,6 @@ static MatcherProp *prefs_matcher_dialog_to_matcher(void) if (value_criteria == -1) return NULL; - criteria = prefs_matcher_get_matching_from_criteria(value_criteria); - - value_pred = prefs_matcher_get_pred(value_criteria); - if(value_pred) - criteria = prefs_matcher_not_criteria(criteria); - #ifndef G_OS_WIN32 use_regexp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn)); #else @@ -1523,6 +1530,12 @@ static MatcherProp *prefs_matcher_dialog_to_matcher(void) sel = gtk_combo_box_get_active(GTK_COMBO_BOX(matcher.match_combo2)); if(sel == AGE_WEEKS) value *= 7; + else if (sel == AGE_HOURS) { + if (value_criteria == CRITERIA_AGE_GREATER) + value_criteria = CRITERIA_AGE_GREATER_HOURS; + else + value_criteria = CRITERIA_AGE_LOWER_HOURS; + } break; case CRITERIA_SCORE_GREATER: @@ -1603,6 +1616,12 @@ static MatcherProp *prefs_matcher_dialog_to_matcher(void) break; } + criteria = prefs_matcher_get_matching_from_criteria(value_criteria); + + value_pred = prefs_matcher_get_pred(value_criteria); + if(value_pred) + criteria = prefs_matcher_not_criteria(criteria); + matcherprop = matcherprop_new(criteria, header, matchtype, expr, value); @@ -1935,6 +1954,7 @@ static void prefs_matcher_criteria_select(GtkWidget *widget, gtk_spin_button_set_range(GTK_SPIN_BUTTON( matcher.numeric_entry), 0, 1000); gtk_spin_button_set_value(GTK_SPIN_BUTTON(matcher.numeric_entry), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), AGE_DAYS); gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Age is")); break; case MATCH_FLAG: @@ -2261,6 +2281,8 @@ static void prefs_matcher_set_criteria(const gint criteria) break; case CRITERIA_AGE_GREATER: case CRITERIA_AGE_LOWER: + case CRITERIA_AGE_GREATER_HOURS: + case CRITERIA_AGE_LOWER_HOURS: match_criteria = MATCH_AGE; break; case CRITERIA_SCORE_GREATER: @@ -2497,6 +2519,14 @@ static gboolean prefs_matcher_selected(GtkTreeSelection *selector, } break; + case MATCHCRITERIA_AGE_GREATER_HOURS: + case MATCHCRITERIA_AGE_LOWER_HOURS: + gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), + AGE_HOURS); + gtk_spin_button_set_value(GTK_SPIN_BUTTON( + matcher.numeric_entry), prop->value); + break; + case MATCHCRITERIA_SCORE_GREATER: case MATCHCRITERIA_SCORE_LOWER: case MATCHCRITERIA_SCORE_EQUAL: