add 'fast filter' for claws' filtering
[claws.git] / src / prefs_matcher.c
index c231b1e6c573e3822554ebb4070d93444603f133..d2a1b5a109b072c55f5c8f856cee1b0a51f0f192 100644 (file)
@@ -46,6 +46,8 @@
 #include "alertpanel.h"
 #include "folder.h"
 
+#include "matcher_parser.h"
+
 static struct Matcher {
        GtkWidget *window;
 
@@ -106,7 +108,11 @@ enum {
        CRITERIA_SCORE_LOWER = 22,
        CRITERIA_SCORE_EQUAL = 23,
 
-       CRITERIA_EXECUTE = 24
+       CRITERIA_EXECUTE = 24,
+
+       CRITERIA_SIZE_GREATER = 25,
+       CRITERIA_SIZE_SMALLER = 26,
+       CRITERIA_SIZE_EQUAL   = 27
 };
 
 enum {
@@ -148,7 +154,10 @@ gchar * criteria_text [] = {
        N_("Replied flag"), N_("Forwarded flag"),
        N_("Score greater than"), N_("Score lower than"),
        N_("Score equal to"),
-       N_("Execute")
+       N_("Execute"),
+       N_("Size greater than"), 
+       N_("Size smaller than"),
+       N_("Size exactly")
 };
 
 static gint get_sel_from_list(GtkList * list)
@@ -170,11 +179,6 @@ static gint get_sel_from_list(GtkList * list)
 
 static PrefsMatcherSignal * matchers_callback;
 
-#define VSPACING               12
-#define VSPACING_NARROW                4
-#define DEFAULT_ENTRY_WIDTH    80
-#define PREFSBUFSIZE           1024
-
 /* widget creating functions */
 static void prefs_matcher_create       (void);
 
@@ -215,7 +219,7 @@ static void prefs_matcher_exec_info_create(void);
 
 void prefs_matcher_open(MatcherList * matchers, PrefsMatcherSignal * cb)
 {
-       inc_autocheck_timer_remove();
+       inc_lock();
 
        if (!matcher.window) {
                prefs_matcher_create();
@@ -286,7 +290,7 @@ static void prefs_matcher_create(void)
        GList *combo_items;
        gint i;
 
-       gchar *title[] = {_("Registered rules")};
+       gchar *title[1];
 
        debug_print(_("Creating matcher setting window...\n"));
 
@@ -312,10 +316,7 @@ static void prefs_matcher_create(void)
                            GTK_SIGNAL_FUNC(prefs_matcher_deleted), NULL);
        gtk_signal_connect (GTK_OBJECT(window), "key_press_event",
                            GTK_SIGNAL_FUNC(prefs_matcher_key_pressed), NULL);
-       gtk_signal_connect (GTK_OBJECT(window), "focus_in_event",
-                           GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
-       gtk_signal_connect (GTK_OBJECT(window), "focus_out_event",
-                           GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
+       MANAGE_WINDOW_SIGNALS_CONNECT (window);
        gtk_signal_connect (GTK_OBJECT(ok_btn), "clicked",
                            GTK_SIGNAL_FUNC(prefs_matcher_ok), NULL);
        gtk_signal_connect (GTK_OBJECT(cancel_btn), "clicked",
@@ -380,7 +381,7 @@ static void prefs_matcher_create(void)
        gtkut_combo_set_items (GTK_COMBO (header_combo),
                               "Subject", "From", "To", "Cc", "Reply-To",
                               "Sender", "X-ML-Name", "X-List", "X-Sequence",
-                              "X-Mailer",
+                              "X-Mailer","X-BeenThere",
                               NULL);
        gtk_table_attach (GTK_TABLE (table1), header_combo, 1, 2, 1, 2,
                          0, 0, 0, 0);
@@ -550,6 +551,7 @@ static void prefs_matcher_create(void)
                                        GTK_POLICY_AUTOMATIC,
                                        GTK_POLICY_AUTOMATIC);
 
+       title[0] = ("Registered rules");
        cond_clist = gtk_clist_new_with_titles(1, title);
        gtk_widget_show (cond_clist);
        gtk_container_add (GTK_CONTAINER (cond_scrolledwin), cond_clist);
@@ -684,10 +686,10 @@ static MatcherList * prefs_matcher_get_list(void)
                                  row, 0, &matcher_str)) {
 
                if (strcmp(matcher_str, _("(New)")) != 0) {
-                       tmp = matcher_str;
-                       prop = matcherprop_parse(&tmp);
+                       /* tmp = matcher_str; */
+                       prop = matcher_parser_get_prop(matcher_str);
                        
-                       if (tmp == NULL)
+                       if (prop == NULL)
                                break;
                        
                        matcher_list = g_slist_append(matcher_list, prop);
@@ -705,78 +707,83 @@ static MatcherList * prefs_matcher_get_list(void)
 static gint prefs_matcher_get_criteria_from_matching(gint matching_id)
 {
        switch(matching_id) {
-       case MATCHING_ALL:
+       case MATCHCRITERIA_ALL:
                return CRITERIA_ALL;
-       case MATCHING_NOT_UNREAD:
-       case MATCHING_UNREAD:
+       case MATCHCRITERIA_NOT_UNREAD:
+       case MATCHCRITERIA_UNREAD:
                return CRITERIA_UNREAD;
-       case MATCHING_NOT_NEW:
-       case MATCHING_NEW:
+       case MATCHCRITERIA_NOT_NEW:
+       case MATCHCRITERIA_NEW:
                return CRITERIA_NEW;
-       case MATCHING_NOT_MARKED:
-       case MATCHING_MARKED:
+       case MATCHCRITERIA_NOT_MARKED:
+       case MATCHCRITERIA_MARKED:
                return CRITERIA_MARKED;
-       case MATCHING_NOT_DELETED:
-       case MATCHING_DELETED:
+       case MATCHCRITERIA_NOT_DELETED:
+       case MATCHCRITERIA_DELETED:
                return CRITERIA_DELETED;
                break;
-       case MATCHING_NOT_REPLIED:
-       case MATCHING_REPLIED:
+       case MATCHCRITERIA_NOT_REPLIED:
+       case MATCHCRITERIA_REPLIED:
                return CRITERIA_REPLIED;
-       case MATCHING_NOT_FORWARDED:
-       case MATCHING_FORWARDED:
+       case MATCHCRITERIA_NOT_FORWARDED:
+       case MATCHCRITERIA_FORWARDED:
                return CRITERIA_FORWARDED;
-       case MATCHING_NOT_SUBJECT:
-       case MATCHING_SUBJECT:
+       case MATCHCRITERIA_NOT_SUBJECT:
+       case MATCHCRITERIA_SUBJECT:
                return CRITERIA_SUBJECT;
-       case MATCHING_NOT_FROM:
-       case MATCHING_FROM:
+       case MATCHCRITERIA_NOT_FROM:
+       case MATCHCRITERIA_FROM:
                return CRITERIA_FROM;
-       case MATCHING_NOT_TO:
-       case MATCHING_TO:
+       case MATCHCRITERIA_NOT_TO:
+       case MATCHCRITERIA_TO:
                return CRITERIA_TO;
-       case MATCHING_NOT_CC:
-       case MATCHING_CC:
+       case MATCHCRITERIA_NOT_CC:
+       case MATCHCRITERIA_CC:
                return CRITERIA_CC;
-       case MATCHING_NOT_NEWSGROUPS:
-       case MATCHING_NEWSGROUPS:
+       case MATCHCRITERIA_NOT_NEWSGROUPS:
+       case MATCHCRITERIA_NEWSGROUPS:
                return CRITERIA_NEWSGROUPS;
-       case MATCHING_NOT_INREPLYTO:
-       case MATCHING_INREPLYTO:
+       case MATCHCRITERIA_NOT_INREPLYTO:
+       case MATCHCRITERIA_INREPLYTO:
                return CRITERIA_INREPLYTO;
-       case MATCHING_NOT_REFERENCES:
-       case MATCHING_REFERENCES:
+       case MATCHCRITERIA_NOT_REFERENCES:
+       case MATCHCRITERIA_REFERENCES:
                return CRITERIA_REFERENCES;
-       case MATCHING_NOT_TO_AND_NOT_CC:
-       case MATCHING_TO_OR_CC:
+       case MATCHCRITERIA_NOT_TO_AND_NOT_CC:
+       case MATCHCRITERIA_TO_OR_CC:
                return CRITERIA_TO_OR_CC;
-       case MATCHING_NOT_BODY_PART:
-       case MATCHING_BODY_PART:
+       case MATCHCRITERIA_NOT_BODY_PART:
+       case MATCHCRITERIA_BODY_PART:
                return CRITERIA_BODY_PART;
-       case MATCHING_NOT_MESSAGE:
-       case MATCHING_MESSAGE:
+       case MATCHCRITERIA_NOT_MESSAGE:
+       case MATCHCRITERIA_MESSAGE:
                return CRITERIA_MESSAGE;
                break;
-       case MATCHING_NOT_HEADERS_PART:
-       case MATCHING_HEADERS_PART:
+       case MATCHCRITERIA_NOT_HEADERS_PART:
+       case MATCHCRITERIA_HEADERS_PART:
                return CRITERIA_HEADERS_PART;
-       case MATCHING_NOT_HEADER:
-       case MATCHING_HEADER:
+       case MATCHCRITERIA_NOT_HEADER:
+       case MATCHCRITERIA_HEADER:
                return CRITERIA_HEADER;
-       case MATCHING_AGE_GREATER:
+       case MATCHCRITERIA_AGE_GREATER:
                return CRITERIA_AGE_GREATER;
-       case MATCHING_AGE_LOWER:
+       case MATCHCRITERIA_AGE_LOWER:
                return CRITERIA_AGE_LOWER;
-       case MATCHING_SCORE_GREATER:
+       case MATCHCRITERIA_SCORE_GREATER:
                return CRITERIA_SCORE_GREATER;
-       case MATCHING_SCORE_LOWER:
+       case MATCHCRITERIA_SCORE_LOWER:
                return CRITERIA_SCORE_LOWER;
-       case MATCHING_SCORE_EQUAL:
+       case MATCHCRITERIA_SCORE_EQUAL:
                return CRITERIA_SCORE_EQUAL;
-       case MATCHING_NOT_EXECUTE:
-       case MATCHING_EXECUTE:
+       case MATCHCRITERIA_NOT_EXECUTE:
+       case MATCHCRITERIA_EXECUTE:
                return CRITERIA_EXECUTE;
-               break;
+       case MATCHCRITERIA_SIZE_GREATER:
+               return CRITERIA_SIZE_GREATER;
+       case MATCHCRITERIA_SIZE_SMALLER:
+               return CRITERIA_SIZE_SMALLER;
+       case MATCHCRITERIA_SIZE_EQUAL:
+               return CRITERIA_SIZE_EQUAL;
        default:
                return -1;
        }
@@ -786,55 +793,61 @@ static gint prefs_matcher_get_matching_from_criteria(gint criteria_id)
 {
        switch (criteria_id) {
        case CRITERIA_ALL:
-               return MATCHING_ALL;
+               return MATCHCRITERIA_ALL;
        case CRITERIA_UNREAD:
-               return MATCHING_UNREAD;
+               return MATCHCRITERIA_UNREAD;
        case CRITERIA_NEW:
-               return MATCHING_NEW;
+               return MATCHCRITERIA_NEW;
        case CRITERIA_MARKED:
-               return MATCHING_MARKED;
+               return MATCHCRITERIA_MARKED;
        case CRITERIA_DELETED:
-               return MATCHING_DELETED;
+               return MATCHCRITERIA_DELETED;
        case CRITERIA_REPLIED:
-               return MATCHING_REPLIED;
+               return MATCHCRITERIA_REPLIED;
        case CRITERIA_FORWARDED:
-               return MATCHING_FORWARDED;
+               return MATCHCRITERIA_FORWARDED;
        case CRITERIA_SUBJECT:
-               return MATCHING_SUBJECT;
+               return MATCHCRITERIA_SUBJECT;
        case CRITERIA_FROM:
-               return MATCHING_FROM;
+               return MATCHCRITERIA_FROM;
        case CRITERIA_TO:
-               return MATCHING_TO;
+               return MATCHCRITERIA_TO;
        case CRITERIA_CC:
-               return MATCHING_CC;
+               return MATCHCRITERIA_CC;
        case CRITERIA_TO_OR_CC:
-               return MATCHING_TO_OR_CC;
+               return MATCHCRITERIA_TO_OR_CC;
        case CRITERIA_NEWSGROUPS:
-               return MATCHING_NEWSGROUPS;
+               return MATCHCRITERIA_NEWSGROUPS;
        case CRITERIA_INREPLYTO:
-               return MATCHING_INREPLYTO;
+               return MATCHCRITERIA_INREPLYTO;
        case CRITERIA_REFERENCES:
-               return MATCHING_REFERENCES;
+               return MATCHCRITERIA_REFERENCES;
        case CRITERIA_AGE_GREATER:
-               return MATCHING_AGE_GREATER;
+               return MATCHCRITERIA_AGE_GREATER;
        case CRITERIA_AGE_LOWER:
-               return MATCHING_AGE_LOWER;
+               return MATCHCRITERIA_AGE_LOWER;
        case CRITERIA_SCORE_GREATER:
-               return MATCHING_SCORE_GREATER;
+               return MATCHCRITERIA_SCORE_GREATER;
        case CRITERIA_SCORE_LOWER:
-               return MATCHING_SCORE_LOWER;
+               return MATCHCRITERIA_SCORE_LOWER;
        case CRITERIA_SCORE_EQUAL:
-               return MATCHING_SCORE_EQUAL;
+               return MATCHCRITERIA_SCORE_EQUAL;
        case CRITERIA_HEADER:
-               return MATCHING_HEADER;
+               return MATCHCRITERIA_HEADER;
        case CRITERIA_HEADERS_PART:
-               return MATCHING_HEADERS_PART;
+               return MATCHCRITERIA_HEADERS_PART;
        case CRITERIA_BODY_PART:
-               return MATCHING_BODY_PART;
+               return MATCHCRITERIA_BODY_PART;
        case CRITERIA_MESSAGE:
-               return MATCHING_MESSAGE;
+               return MATCHCRITERIA_MESSAGE;
        case CRITERIA_EXECUTE:
-               return MATCHING_EXECUTE;
+               return MATCHCRITERIA_EXECUTE;
+       case CRITERIA_SIZE_GREATER:
+               return MATCHCRITERIA_SIZE_GREATER;
+       case CRITERIA_SIZE_SMALLER:
+               return MATCHCRITERIA_SIZE_SMALLER;
+       case CRITERIA_SIZE_EQUAL:
+               return MATCHCRITERIA_SIZE_EQUAL;
        default:
                return -1;
        }
@@ -843,44 +856,44 @@ static gint prefs_matcher_get_matching_from_criteria(gint criteria_id)
 static gint prefs_matcher_not_criteria(gint matcher_criteria)
 {
        switch(matcher_criteria) {
-       case MATCHING_UNREAD:
-               return MATCHING_NOT_UNREAD;
-       case MATCHING_NEW:
-               return MATCHING_NOT_NEW;
-       case MATCHING_MARKED:
-               return MATCHING_NOT_MARKED;
-       case MATCHING_DELETED:
-               return MATCHING_NOT_DELETED;
-       case MATCHING_REPLIED:
-               return MATCHING_NOT_REPLIED;
-       case MATCHING_FORWARDED:
-               return MATCHING_NOT_FORWARDED;
-       case MATCHING_SUBJECT:
-               return MATCHING_NOT_SUBJECT;
-       case MATCHING_FROM:
-               return MATCHING_NOT_FROM;
-       case MATCHING_TO:
-               return MATCHING_NOT_TO;
-       case MATCHING_CC:
-               return MATCHING_NOT_CC;
-       case MATCHING_TO_OR_CC:
-               return MATCHING_NOT_TO_AND_NOT_CC;
-       case MATCHING_NEWSGROUPS:
-               return MATCHING_NOT_NEWSGROUPS;
-       case MATCHING_INREPLYTO:
-               return MATCHING_NOT_INREPLYTO;
-       case MATCHING_REFERENCES:
-               return MATCHING_NOT_REFERENCES;
-       case MATCHING_HEADER:
-               return MATCHING_NOT_HEADER;
-       case MATCHING_HEADERS_PART:
-               return MATCHING_NOT_HEADERS_PART;
-       case MATCHING_MESSAGE:
-               return MATCHING_NOT_MESSAGE;
-       case MATCHING_EXECUTE:
-               return MATCHING_NOT_EXECUTE;
-       case MATCHING_BODY_PART:
-               return MATCHING_NOT_BODY_PART;
+       case MATCHCRITERIA_UNREAD:
+               return MATCHCRITERIA_NOT_UNREAD;
+       case MATCHCRITERIA_NEW:
+               return MATCHCRITERIA_NOT_NEW;
+       case MATCHCRITERIA_MARKED:
+               return MATCHCRITERIA_NOT_MARKED;
+       case MATCHCRITERIA_DELETED:
+               return MATCHCRITERIA_NOT_DELETED;
+       case MATCHCRITERIA_REPLIED:
+               return MATCHCRITERIA_NOT_REPLIED;
+       case MATCHCRITERIA_FORWARDED:
+               return MATCHCRITERIA_NOT_FORWARDED;
+       case MATCHCRITERIA_SUBJECT:
+               return MATCHCRITERIA_NOT_SUBJECT;
+       case MATCHCRITERIA_FROM:
+               return MATCHCRITERIA_NOT_FROM;
+       case MATCHCRITERIA_TO:
+               return MATCHCRITERIA_NOT_TO;
+       case MATCHCRITERIA_CC:
+               return MATCHCRITERIA_NOT_CC;
+       case MATCHCRITERIA_TO_OR_CC:
+               return MATCHCRITERIA_NOT_TO_AND_NOT_CC;
+       case MATCHCRITERIA_NEWSGROUPS:
+               return MATCHCRITERIA_NOT_NEWSGROUPS;
+       case MATCHCRITERIA_INREPLYTO:
+               return MATCHCRITERIA_NOT_INREPLYTO;
+       case MATCHCRITERIA_REFERENCES:
+               return MATCHCRITERIA_NOT_REFERENCES;
+       case MATCHCRITERIA_HEADER:
+               return MATCHCRITERIA_NOT_HEADER;
+       case MATCHCRITERIA_HEADERS_PART:
+               return MATCHCRITERIA_NOT_HEADERS_PART;
+       case MATCHCRITERIA_MESSAGE:
+               return MATCHCRITERIA_NOT_MESSAGE;
+       case MATCHCRITERIA_EXECUTE:
+               return MATCHCRITERIA_NOT_EXECUTE;
+       case MATCHCRITERIA_BODY_PART:
+               return MATCHCRITERIA_NOT_BODY_PART;
        default:
                return matcher_criteria;
        }
@@ -943,15 +956,15 @@ static MatcherProp * prefs_matcher_dialog_to_matcher()
 
        if (use_regexp) {
                if (case_sensitive)
-                       matchtype = MATCHING_REGEXP;
+                       matchtype = MATCHTYPE_REGEXP;
                else
-                       matchtype = MATCHING_REGEXPCASE;
+                       matchtype = MATCHTYPE_REGEXPCASE;
        }
        else {
                if (case_sensitive)
-                       matchtype = MATCHING_MATCH;
+                       matchtype = MATCHTYPE_MATCH;
                else
-                       matchtype = MATCHING_MATCHCASE;
+                       matchtype = MATCHTYPE_MATCHCASE;
        }
 
        header = NULL;
@@ -995,6 +1008,9 @@ static MatcherProp * prefs_matcher_dialog_to_matcher()
        case CRITERIA_SCORE_GREATER:
        case CRITERIA_SCORE_LOWER:
        case CRITERIA_SCORE_EQUAL:
+       case CRITERIA_SIZE_GREATER:
+       case CRITERIA_SIZE_SMALLER:
+       case CRITERIA_SIZE_EQUAL:
                value_str = gtk_entry_get_text(GTK_ENTRY(matcher.value_entry));
 
                if (*value_str == '\0') {
@@ -1136,9 +1152,9 @@ static void prefs_matcher_select(GtkCList *clist, gint row, gint column,
                return;
        }
 
-       tmp = matcher_str;
-       prop = matcherprop_parse(&tmp);
-       if (tmp == NULL)
+       //      tmp = matcher_str;
+       prop = matcher_parser_get_prop(matcher_str);
+       if (prop == NULL)
                return;
 
        criteria = prefs_matcher_get_criteria_from_matching(prop->criteria);
@@ -1147,67 +1163,70 @@ static void prefs_matcher_select(GtkCList *clist, gint row, gint column,
                                     criteria);
 
        switch(prop->criteria) {
-       case MATCHING_NOT_UNREAD:
-       case MATCHING_NOT_NEW:
-       case MATCHING_NOT_MARKED:
-       case MATCHING_NOT_DELETED:
-       case MATCHING_NOT_REPLIED:
-       case MATCHING_NOT_FORWARDED:
-       case MATCHING_NOT_SUBJECT:
-       case MATCHING_NOT_FROM:
-       case MATCHING_NOT_TO:
-       case MATCHING_NOT_CC:
-       case MATCHING_NOT_NEWSGROUPS:
-       case MATCHING_NOT_INREPLYTO:
-       case MATCHING_NOT_REFERENCES:
-       case MATCHING_NOT_TO_AND_NOT_CC:
-       case MATCHING_NOT_BODY_PART:
-       case MATCHING_NOT_MESSAGE:
-       case MATCHING_NOT_HEADERS_PART:
-       case MATCHING_NOT_HEADER:
+       case MATCHCRITERIA_NOT_UNREAD:
+       case MATCHCRITERIA_NOT_NEW:
+       case MATCHCRITERIA_NOT_MARKED:
+       case MATCHCRITERIA_NOT_DELETED:
+       case MATCHCRITERIA_NOT_REPLIED:
+       case MATCHCRITERIA_NOT_FORWARDED:
+       case MATCHCRITERIA_NOT_SUBJECT:
+       case MATCHCRITERIA_NOT_FROM:
+       case MATCHCRITERIA_NOT_TO:
+       case MATCHCRITERIA_NOT_CC:
+       case MATCHCRITERIA_NOT_NEWSGROUPS:
+       case MATCHCRITERIA_NOT_INREPLYTO:
+       case MATCHCRITERIA_NOT_REFERENCES:
+       case MATCHCRITERIA_NOT_TO_AND_NOT_CC:
+       case MATCHCRITERIA_NOT_BODY_PART:
+       case MATCHCRITERIA_NOT_MESSAGE:
+       case MATCHCRITERIA_NOT_HEADERS_PART:
+       case MATCHCRITERIA_NOT_HEADER:
                negative_cond = TRUE;
                break;
        }
        
        switch(prop->criteria) {
-       case MATCHING_ALL:
+       case MATCHCRITERIA_ALL:
                break;
 
-       case MATCHING_NOT_SUBJECT:
-       case MATCHING_NOT_FROM:
-       case MATCHING_NOT_TO:
-       case MATCHING_NOT_CC:
-       case MATCHING_NOT_TO_AND_NOT_CC:
-       case MATCHING_NOT_NEWSGROUPS:
-       case MATCHING_NOT_INREPLYTO:
-       case MATCHING_NOT_REFERENCES:
-       case MATCHING_NOT_HEADERS_PART:
-       case MATCHING_NOT_BODY_PART:
-       case MATCHING_NOT_MESSAGE:
-       case MATCHING_SUBJECT:
-       case MATCHING_FROM:
-       case MATCHING_TO:
-       case MATCHING_CC:
-       case MATCHING_TO_OR_CC:
-       case MATCHING_NEWSGROUPS:
-       case MATCHING_INREPLYTO:
-       case MATCHING_REFERENCES:
-       case MATCHING_HEADERS_PART:
-       case MATCHING_BODY_PART:
-       case MATCHING_MESSAGE:
+       case MATCHCRITERIA_NOT_SUBJECT:
+       case MATCHCRITERIA_NOT_FROM:
+       case MATCHCRITERIA_NOT_TO:
+       case MATCHCRITERIA_NOT_CC:
+       case MATCHCRITERIA_NOT_TO_AND_NOT_CC:
+       case MATCHCRITERIA_NOT_NEWSGROUPS:
+       case MATCHCRITERIA_NOT_INREPLYTO:
+       case MATCHCRITERIA_NOT_REFERENCES:
+       case MATCHCRITERIA_NOT_HEADERS_PART:
+       case MATCHCRITERIA_NOT_BODY_PART:
+       case MATCHCRITERIA_NOT_MESSAGE:
+       case MATCHCRITERIA_SUBJECT:
+       case MATCHCRITERIA_FROM:
+       case MATCHCRITERIA_TO:
+       case MATCHCRITERIA_CC:
+       case MATCHCRITERIA_TO_OR_CC:
+       case MATCHCRITERIA_NEWSGROUPS:
+       case MATCHCRITERIA_INREPLYTO:
+       case MATCHCRITERIA_REFERENCES:
+       case MATCHCRITERIA_HEADERS_PART:
+       case MATCHCRITERIA_BODY_PART:
+       case MATCHCRITERIA_MESSAGE:
                gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), prop->expr);
                break;
 
-       case MATCHING_AGE_GREATER:
-       case MATCHING_AGE_LOWER:
-       case MATCHING_SCORE_GREATER:
-       case MATCHING_SCORE_LOWER:
-       case MATCHING_SCORE_EQUAL:
+       case MATCHCRITERIA_AGE_GREATER:
+       case MATCHCRITERIA_AGE_LOWER:
+       case MATCHCRITERIA_SCORE_GREATER:
+       case MATCHCRITERIA_SCORE_LOWER:
+       case MATCHCRITERIA_SCORE_EQUAL:
+       case MATCHCRITERIA_SIZE_GREATER:
+       case MATCHCRITERIA_SIZE_SMALLER:
+       case MATCHCRITERIA_SIZE_EQUAL:
                gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), itos(prop->value));
                break;
 
-       case MATCHING_NOT_HEADER:
-       case MATCHING_HEADER:
+       case MATCHCRITERIA_NOT_HEADER:
+       case MATCHCRITERIA_HEADER:
                gtk_entry_set_text(GTK_ENTRY(matcher.header_entry), prop->header);
                gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), prop->expr);
                break;
@@ -1219,22 +1238,22 @@ static void prefs_matcher_select(GtkCList *clist, gint row, gint column,
                gtk_list_select_item(GTK_LIST(matcher.predicate_list), 0);
 
        switch(prop->matchtype) {
-       case MATCHING_MATCH:
+       case MATCHTYPE_MATCH:
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), FALSE);
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), TRUE);
                break;
 
-       case MATCHING_MATCHCASE:
+       case MATCHTYPE_MATCHCASE:
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), FALSE);
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), FALSE);
                break;
 
-       case MATCHING_REGEXP:
+       case MATCHTYPE_REGEXP:
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), TRUE);
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), TRUE);
                break;
 
-       case MATCHING_REGEXPCASE:
+       case MATCHTYPE_REGEXPCASE:
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), TRUE);
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), FALSE);
                break;
@@ -1330,6 +1349,9 @@ static void prefs_matcher_criteria_select(GtkList *list,
        case CRITERIA_SCORE_GREATER:
        case CRITERIA_SCORE_LOWER:
        case CRITERIA_SCORE_EQUAL:
+       case CRITERIA_SIZE_GREATER:
+       case CRITERIA_SIZE_SMALLER:
+       case CRITERIA_SIZE_EQUAL:
                gtk_widget_set_sensitive(matcher.header_combo, FALSE);
                gtk_widget_set_sensitive(matcher.header_label, FALSE);
                gtk_widget_set_sensitive(matcher.value_label, TRUE);
@@ -1371,6 +1393,7 @@ static void prefs_matcher_key_pressed(GtkWidget *widget, GdkEventKey *event,
 static void prefs_matcher_cancel(void)
 {
        gtk_widget_hide(matcher.window);
+       inc_unlock();
 }
 
 static void prefs_matcher_ok(void)
@@ -1378,15 +1401,13 @@ static void prefs_matcher_ok(void)
        MatcherList * matchers;
 
        matchers = prefs_matcher_get_list();
+       gtk_widget_hide(matcher.window);
+       inc_unlock();
        if (matchers != NULL) {
-               gtk_widget_hide(matcher.window);
                if (matchers_callback != NULL)
                        matchers_callback(matchers);
                matcherlist_free(matchers);
        }
-       else {
-               gtk_widget_hide(matcher.window);
-       }
 }
 
 static gint prefs_matcher_deleted(GtkWidget *widget, GdkEventAny *event,