aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-06-02 08:42:46 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-06-02 08:42:46 +0000
commit2ad5e2325437bb1a5f86fcd629226b433db0488c (patch)
tree315d8bd7d4e6c0bfb9f878d29438e5c20ff842b6 /src
parent937f0227970b779c01b562630b86bf4d554a320c (diff)
added a feature for junk mail control.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@306 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.c84
-rw-r--r--src/mainwindow.h1
-rw-r--r--src/prefs_common.c145
-rw-r--r--src/prefs_common.h6
-rw-r--r--src/summaryview.c112
-rw-r--r--src/summaryview.h3
6 files changed, 333 insertions, 18 deletions
diff --git a/src/mainwindow.c b/src/mainwindow.c
index 89827960..59be3ab5 100644
--- a/src/mainwindow.c
+++ b/src/mainwindow.c
@@ -43,6 +43,7 @@
#include <gtk/gtktooltips.h>
#include <gtk/gtkarrow.h>
#include <gtk/gtkstock.h>
+#include <gtk/gtkimage.h>
#include <string.h>
#include "main.h"
@@ -133,6 +134,8 @@ static void toolbar_forward_cb (GtkWidget *widget,
static void toolbar_delete_cb (GtkWidget *widget,
gpointer data);
+static void toolbar_junk_cb (GtkWidget *widget,
+ gpointer data);
static void toolbar_exec_cb (GtkWidget *widget,
gpointer data);
@@ -318,6 +321,10 @@ static void mark_all_read_cb (MainWindow *mainwin,
guint action,
GtkWidget *widget);
+static void junk_cb (MainWindow *mainwin,
+ guint action,
+ GtkWidget *widget);
+
static void reedit_cb (MainWindow *mainwin,
guint action,
GtkWidget *widget);
@@ -686,7 +693,7 @@ static GtkItemFactoryEntry mainwin_entries[] =
{N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
{N_("/_Message/M_ove..."), "<control>O", move_to_cb, 0, NULL},
{N_("/_Message/_Copy..."), "<shift><control>O", copy_to_cb, 0, NULL},
- {N_("/_Message/_Delete"), "<control>D", delete_cb, 0, NULL},
+ {N_("/_Message/_Delete"), "<control>D", delete_cb, 0, NULL},
{N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
{N_("/_Message/_Mark"), NULL, NULL, 0, "<Branch>"},
{N_("/_Message/_Mark/_Mark"), "<shift>asterisk", mark_cb, 0, NULL},
@@ -697,6 +704,9 @@ static GtkItemFactoryEntry mainwin_entries[] =
NULL, mark_as_read_cb, 0, NULL},
{N_("/_Message/_Mark/Mark all _read"), NULL, mark_all_read_cb, 0, NULL},
{N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
+ {N_("/_Message/Set as _junk mail"), "<control>J", junk_cb, 0, NULL},
+ {N_("/_Message/Set as not j_unk mail"), "<shift><control>J", junk_cb, 1, NULL},
+ {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
{N_("/_Message/Re-_edit"), NULL, reedit_cb, 0, NULL},
{N_("/_Tools"), NULL, NULL, 0, "<Branch>"},
@@ -1114,6 +1124,11 @@ void main_window_reflect_prefs_all(void)
main_window_set_menu_sensitive(mainwin);
main_window_set_toolbar_sensitive(mainwin);
+ if (prefs_common.enable_junk)
+ gtk_widget_show(mainwin->junk_btn);
+ else
+ gtk_widget_hide(mainwin->junk_btn);
+
if (prefs_common.immediate_exec)
gtk_widget_hide(mainwin->exec_btn);
else
@@ -1589,15 +1604,16 @@ typedef enum
M_UNTHREADED = 1 << 8,
M_ALLOW_DELETE = 1 << 9,
M_INC_ACTIVE = 1 << 10,
-
- M_FOLDER_NEWOK = 1 << 11,
- M_FOLDER_RENOK = 1 << 12,
- M_FOLDER_DELOK = 1 << 13,
- M_MBOX_ADDOK = 1 << 14,
- M_MBOX_RMOK = 1 << 15,
- M_MBOX_CHKOK = 1 << 16,
- M_MBOX_CHKALLOK = 1 << 17,
- M_MBOX_REBUILDOK = 1 << 18
+ M_ENABLE_JUNK = 1 << 11,
+
+ M_FOLDER_NEWOK = 1 << 17,
+ M_FOLDER_RENOK = 1 << 18,
+ M_FOLDER_DELOK = 1 << 19,
+ M_MBOX_ADDOK = 1 << 20,
+ M_MBOX_RMOK = 1 << 21,
+ M_MBOX_CHKOK = 1 << 22,
+ M_MBOX_CHKALLOK = 1 << 23,
+ M_MBOX_REBUILDOK = 1 << 24
} SensitiveCond;
static SensitiveCond main_window_get_current_state(MainWindow *mainwin)
@@ -1637,6 +1653,9 @@ static SensitiveCond main_window_get_current_state(MainWindow *mainwin)
if (inc_is_active())
state |= M_INC_ACTIVE;
+ if (prefs_common.enable_junk)
+ state |= M_ENABLE_JUNK;
+
item = folderview_get_selected_item(mainwin->folderview);
if (item) {
state |= M_FOLDER_NEWOK;
@@ -1672,7 +1691,7 @@ void main_window_set_toolbar_sensitive(MainWindow *mainwin)
struct {
GtkWidget *widget;
SensitiveCond cond;
- } entry[12];
+ } entry[13];
#define SET_WIDGET_COND(w, c) \
{ \
@@ -1700,6 +1719,8 @@ void main_window_set_toolbar_sensitive(MainWindow *mainwin)
SET_WIDGET_COND(mainwin->next_btn, M_MSG_EXIST);
SET_WIDGET_COND(mainwin->delete_btn,
M_TARGET_EXIST|M_ALLOW_DELETE);
+ SET_WIDGET_COND(mainwin->junk_btn,
+ M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK);
SET_WIDGET_COND(mainwin->exec_btn, M_MSG_EXIST|M_EXEC);
SET_WIDGET_COND(NULL, 0);
@@ -1786,6 +1807,8 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
{"/Message/Copy..." , M_TARGET_EXIST|M_EXEC},
{"/Message/Delete" , M_TARGET_EXIST|M_ALLOW_DELETE},
{"/Message/Mark" , M_TARGET_EXIST},
+ {"/Message/Set as junk mail" , M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK},
+ {"/Message/Set as not junk mail" , M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK},
{"/Message/Re-edit" , M_HAVE_ACCOUNT|M_ALLOW_REEDIT},
{"/Tools/Add sender to address book" , M_SINGLE_TARGET_EXIST},
@@ -2139,6 +2162,7 @@ static void main_window_toolbar_create(MainWindow *mainwin,
#endif
GtkWidget *next_btn;
GtkWidget *delete_btn;
+ GtkWidget *junk_btn;
GtkWidget *exec_btn;
gint n_entries;
@@ -2147,6 +2171,8 @@ static void main_window_toolbar_create(MainWindow *mainwin,
gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
GTK_ORIENTATION_HORIZONTAL);
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
+ gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),
+ GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_container_add(GTK_CONTAINER(container), toolbar);
gtk_widget_set_size_request(toolbar, 1, -1);
@@ -2237,7 +2263,8 @@ static void main_window_toolbar_create(MainWindow *mainwin,
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
- icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_CLOSE);
+ icon_wid = gtk_image_new_from_stock(GTK_STOCK_DELETE,
+ GTK_ICON_SIZE_SMALL_TOOLBAR);
delete_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
_("Delete"),
_("Delete the message"),
@@ -2246,7 +2273,18 @@ static void main_window_toolbar_create(MainWindow *mainwin,
G_CALLBACK(toolbar_delete_cb),
mainwin);
- icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_EXEC);
+ icon_wid = gtk_image_new_from_stock(GTK_STOCK_CANCEL,
+ GTK_ICON_SIZE_SMALL_TOOLBAR);
+ junk_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
+ _("Junk"),
+ _("Set as junk mail"),
+ "Junk",
+ icon_wid,
+ G_CALLBACK(toolbar_junk_cb),
+ mainwin);
+
+ icon_wid = gtk_image_new_from_stock(GTK_STOCK_EXECUTE,
+ GTK_ICON_SIZE_SMALL_TOOLBAR);
exec_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
_("Execute"),
_("Execute marked process"),
@@ -2255,7 +2293,8 @@ static void main_window_toolbar_create(MainWindow *mainwin,
G_CALLBACK(toolbar_exec_cb),
mainwin);
- icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_DOWN_ARROW);
+ icon_wid = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN,
+ GTK_ICON_SIZE_SMALL_TOOLBAR);
next_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
_("Next"),
_("Next unread message"),
@@ -2303,6 +2342,7 @@ static void main_window_toolbar_create(MainWindow *mainwin,
#endif
mainwin->next_btn = next_btn;
mainwin->delete_btn = delete_btn;
+ mainwin->junk_btn = junk_btn;
mainwin->exec_btn = exec_btn;
gtk_widget_show_all(toolbar);
@@ -2377,6 +2417,14 @@ static void toolbar_delete_cb (GtkWidget *widget,
summary_delete(mainwin->summaryview);
}
+static void toolbar_junk_cb (GtkWidget *widget,
+ gpointer data)
+{
+ MainWindow *mainwin = (MainWindow *)data;
+
+ summary_junk(mainwin->summaryview);
+}
+
static void toolbar_exec_cb (GtkWidget *widget,
gpointer data)
{
@@ -2907,6 +2955,14 @@ static void mark_all_read_cb(MainWindow *mainwin, guint action,
summary_mark_all_read(mainwin->summaryview);
}
+static void junk_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
+{
+ if (action == 0)
+ summary_junk(mainwin->summaryview);
+ else
+ summary_not_junk(mainwin->summaryview);
+}
+
static void reedit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
{
summary_reedit(mainwin->summaryview);
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 283ee1ce..60d5c019 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -96,6 +96,7 @@ struct _MainWindow
GtkWidget *account_btn;
GtkWidget *next_btn;
GtkWidget *delete_btn;
+ GtkWidget *junk_btn;
GtkWidget *exec_btn;
/* body */
diff --git a/src/prefs_common.c b/src/prefs_common.c
index fb68acc6..021f09ec 100644
--- a/src/prefs_common.c
+++ b/src/prefs_common.c
@@ -44,6 +44,7 @@
#include "summaryview.h"
#include "messageview.h"
#include "manage_window.h"
+#include "foldersel.h"
#include "inc.h"
#include "menu.h"
#include "codeconv.h"
@@ -150,6 +151,13 @@ static struct Message {
GtkWidget *chkbtn_inline_image;
} message;
+static struct JunkMail {
+ GtkWidget *chkbtn_enable_junk;
+ GtkWidget *entry_junk_learncmd;
+ GtkWidget *entry_nojunk_learncmd;
+ GtkWidget *entry_junkfolder;
+} junk;
+
#if USE_GPGME
static struct Privacy {
GtkWidget *checkbtn_auto_check_signatures;
@@ -567,6 +575,20 @@ static PrefParam param[] = {
{"mime_open_command", "gedit '%s'",
&prefs_common.mime_open_cmd, P_STRING, NULL, NULL, NULL},
+ /* Junk mail */
+ {"enable_junk", "FALSE", &prefs_common.enable_junk, P_BOOL,
+ &junk.chkbtn_enable_junk,
+ prefs_set_data_from_toggle, prefs_set_toggle},
+ {"junk_learn_command", "bogofilter -s -I",
+ &prefs_common.junk_learncmd, P_STRING,
+ &junk.entry_junk_learncmd, prefs_set_data_from_entry, prefs_set_entry},
+ {"nojunk_learn_command", "bogofilter -n -I",
+ &prefs_common.nojunk_learncmd, P_STRING,
+ &junk.entry_nojunk_learncmd,
+ prefs_set_data_from_entry, prefs_set_entry},
+ {"junk_folder", NULL, &prefs_common.junk_folder, P_STRING,
+ &junk.entry_junkfolder, prefs_set_data_from_entry, prefs_set_entry},
+
#if USE_GPGME
/* Privacy */
{"auto_check_signatures", "TRUE",
@@ -675,6 +697,7 @@ static void prefs_compose_create (void);
static void prefs_quote_create (void);
static void prefs_display_create (void);
static void prefs_message_create (void);
+static void prefs_junk_create (void);
#if USE_GPGME
static void prefs_privacy_create (void);
#endif
@@ -743,6 +766,9 @@ static gboolean prefs_keybind_key_pressed (GtkWidget *widget,
static void prefs_keybind_cancel (void);
static void prefs_keybind_apply_clicked (GtkWidget *widget);
+static void prefs_common_select_folder_cb (GtkWidget *widget,
+ gpointer data);
+
static gint prefs_common_deleted (GtkWidget *widget,
GdkEventAny *event,
gpointer data);
@@ -864,6 +890,8 @@ static void prefs_common_create(void)
SET_NOTEBOOK_LABEL(dialog.notebook, _("Display"), page++);
prefs_message_create();
SET_NOTEBOOK_LABEL(dialog.notebook, _("Message"), page++);
+ prefs_junk_create();
+ SET_NOTEBOOK_LABEL(dialog.notebook, _("Junk mail"), page++);
#if USE_GPGME
prefs_privacy_create();
SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"), page++);
@@ -1872,6 +1900,108 @@ static void prefs_message_create(void)
message.chkbtn_inline_image = chkbtn_inline_image;
}
+static void prefs_junk_create(void)
+{
+ GtkWidget *vbox1;
+ GtkWidget *vbox2;
+ GtkWidget *frame;
+ GtkWidget *hbox;
+ GtkWidget *chkbtn_enable_junk;
+ GtkWidget *label;
+ GtkWidget *entry_junk_learncmd;
+ GtkWidget *entry_nojunk_learncmd;
+ GtkWidget *vbox3;
+ GtkWidget *entry_junkfolder;
+ GtkWidget *btn_folder;
+
+ vbox1 = gtk_vbox_new (FALSE, VSPACING);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
+
+ chkbtn_enable_junk = gtk_check_button_new_with_label
+ (_("Enable Junk mail control"));
+ gtk_widget_show(chkbtn_enable_junk);
+
+ PACK_FRAME(vbox1, frame, NULL);
+ gtk_frame_set_label_widget(GTK_FRAME(frame), chkbtn_enable_junk);
+
+ vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
+ gtk_widget_show (vbox2);
+ gtk_container_add (GTK_CONTAINER (frame), vbox2);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
+ SET_TOGGLE_SENSITIVITY (chkbtn_enable_junk, vbox2);
+
+ label = gtk_label_new (_("Learning command:"));
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ hbox = gtk_hbox_new (FALSE, 8);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
+
+ label = gtk_label_new (_("Junk"));
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ entry_junk_learncmd = gtk_entry_new ();
+ gtk_widget_show (entry_junk_learncmd);
+ gtk_box_pack_start (GTK_BOX (hbox), entry_junk_learncmd, TRUE, TRUE, 0);
+
+ hbox = gtk_hbox_new (FALSE, 8);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
+
+ label = gtk_label_new (_("Not Junk"));
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ entry_nojunk_learncmd = gtk_entry_new ();
+ gtk_widget_show (entry_nojunk_learncmd);
+ gtk_box_pack_start (GTK_BOX (hbox), entry_nojunk_learncmd,
+ TRUE, TRUE, 0);
+
+ PACK_VSPACER(vbox2, vbox3, 0);
+
+ hbox = gtk_hbox_new (FALSE, 8);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
+
+ label = gtk_label_new (_("Junk folder"));
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ entry_junkfolder = gtk_entry_new ();
+ gtk_widget_show (entry_junkfolder);
+ gtk_box_pack_start (GTK_BOX (hbox), entry_junkfolder, TRUE, TRUE, 0);
+
+ btn_folder = gtk_button_new_with_label (_(" ... "));
+ gtk_widget_show (btn_folder);
+ gtk_box_pack_start (GTK_BOX (hbox), btn_folder, FALSE, FALSE, 0);
+ g_signal_connect (G_OBJECT (btn_folder), "clicked",
+ G_CALLBACK (prefs_common_select_folder_cb),
+ entry_junkfolder);
+
+ PACK_VSPACER(vbox2, vbox3, 0);
+
+ label = gtk_label_new
+ (_("Specify command line for learning junk mail.\n"
+ "You must add a filter rule to enable automatic filtering "
+ "using the result of this learning."));
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+ gtkut_widget_set_small_font_size (label);
+
+ junk.chkbtn_enable_junk = chkbtn_enable_junk;
+ junk.entry_junk_learncmd = entry_junk_learncmd;
+ junk.entry_nojunk_learncmd = entry_nojunk_learncmd;
+ junk.entry_junkfolder = entry_junkfolder;
+}
+
#if USE_GPGME
static void prefs_privacy_create(void)
{
@@ -3530,6 +3660,21 @@ static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam)
gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
}
+static void prefs_common_select_folder_cb(GtkWidget *widget, gpointer data)
+{
+ FolderItem *item;
+ gchar *id;
+
+ item = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL);
+ if (item && item->path) {
+ id = folder_item_get_identifier(item);
+ if (id) {
+ gtk_entry_set_text(GTK_ENTRY(data), id);
+ g_free(id);
+ }
+ }
+}
+
static gint prefs_common_deleted(GtkWidget *widget, GdkEventAny *event,
gpointer data)
{
diff --git a/src/prefs_common.h b/src/prefs_common.h
index e0e53aa9..95dd31b7 100644
--- a/src/prefs_common.h
+++ b/src/prefs_common.h
@@ -186,6 +186,12 @@ struct _PrefsCommon
GList *mime_open_cmd_history;
+ /* Junk Mail */
+ gboolean enable_junk;
+ gchar *junk_learncmd;
+ gchar *nojunk_learncmd;
+ gchar *junk_folder;
+
#if USE_GPGME
/* Privacy */
gboolean auto_check_signatures;
diff --git a/src/summaryview.c b/src/summaryview.c
index 34a5d5bc..ddcf86e9 100644
--- a/src/summaryview.c
+++ b/src/summaryview.c
@@ -815,15 +815,15 @@ gboolean summary_is_locked(SummaryView *summaryview)
SummarySelection summary_get_selection_type(SummaryView *summaryview)
{
SummarySelection selection;
- gint count;
+ GList *rows;
- count = gtk_tree_selection_count_selected_rows(summaryview->selection);
+ rows = summary_get_selected_rows(summaryview);
if (!summaryview->folder_item || summaryview->folder_item->total == 0)
selection = SUMMARY_NONE;
- else if (count == 0)
+ else if (!rows)
selection = SUMMARY_SELECTED_NONE;
- else if (count == 1)
+ else if (rows && !rows->next)
selection = SUMMARY_SELECTED_SINGLE;
else
selection = SUMMARY_SELECTED_MULTIPLE;
@@ -3671,6 +3671,110 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
g_free(key);
}
+static void summary_junk_func(GtkTreeModel *model, GtkTreePath *path,
+ GtkTreeIter *iter, gpointer data)
+{
+ FilterRule rule = {NULL, FLT_OR, NULL, NULL, FLT_TIMING_ANY, TRUE};
+ FilterAction action1 = {FLT_ACTION_EXEC, NULL, 0};
+ FilterAction action2 = {FLT_ACTION_MOVE, NULL, 0};
+ SummaryView *summaryview = (SummaryView *)data;
+ MsgInfo *msginfo;
+ FilterInfo *fltinfo;
+ gchar *file;
+ gint ret;
+
+ gtk_tree_model_get(model, iter, S_COL_MSG_INFO, &msginfo, -1);
+ file = procmsg_get_message_file(msginfo);
+ g_return_if_fail(file != NULL);
+
+ action1.str_value = prefs_common.junk_learncmd;
+ action2.str_value = prefs_common.junk_folder;
+
+ rule.action_list = g_slist_append(rule.action_list, &action1);
+ rule.action_list = g_slist_append(rule.action_list, &action2);
+
+ fltinfo = filter_info_new();
+
+ ret = filter_action_exec(&rule, msginfo, file, fltinfo);
+
+ if (ret == 0 && fltinfo->actions[FLT_ACTION_MOVE] && fltinfo->move_dest)
+ summary_move_row_to(summaryview, iter, fltinfo->move_dest);
+
+ filter_info_free(fltinfo);
+ g_slist_free(rule.action_list);
+ g_free(file);
+}
+
+static void summary_not_junk_func(GtkTreeModel *model, GtkTreePath *path,
+ GtkTreeIter *iter, gpointer data)
+{
+ FilterRule rule = {NULL, FLT_OR, NULL, NULL, FLT_TIMING_ANY, TRUE};
+ FilterAction action = {FLT_ACTION_EXEC, NULL, 0};
+ MsgInfo *msginfo;
+ FilterInfo *fltinfo;
+ gchar *file;
+ gint ret;
+
+ gtk_tree_model_get(model, iter, S_COL_MSG_INFO, &msginfo, -1);
+ file = procmsg_get_message_file(msginfo);
+ g_return_if_fail(file != NULL);
+
+ action.str_value = prefs_common.nojunk_learncmd;
+
+ rule.action_list = g_slist_append(rule.action_list, &action);
+
+ fltinfo = filter_info_new();
+
+ ret = filter_action_exec(&rule, msginfo, file, fltinfo);
+
+ filter_info_free(fltinfo);
+ g_slist_free(rule.action_list);
+ g_free(file);
+}
+
+void summary_junk(SummaryView *summaryview)
+{
+ if (!prefs_common.enable_junk)
+ return;
+ if (!prefs_common.junk_learncmd || !prefs_common.junk_folder)
+ return;
+
+ summary_lock(summaryview);
+
+ debug_print("Set mail as junk\n");
+
+ gtk_tree_selection_selected_foreach(summaryview->selection,
+ summary_junk_func, summaryview);
+
+ summary_unlock(summaryview);
+
+ if (prefs_common.immediate_exec)
+ summary_execute(summaryview);
+ else {
+ summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
+ summary_status_show(summaryview);
+ }
+
+ folderview_update_all_updated(FALSE);
+}
+
+void summary_not_junk(SummaryView *summaryview)
+{
+ if (!prefs_common.enable_junk)
+ return;
+ if (!prefs_common.nojunk_learncmd)
+ return;
+
+ summary_lock(summaryview);
+
+ debug_print("Set mail as not junk\n");
+
+ gtk_tree_selection_selected_foreach(summaryview->selection,
+ summary_not_junk_func, summaryview);
+
+ summary_unlock(summaryview);
+}
+
void summary_reply(SummaryView *summaryview, ComposeMode mode)
{
GSList *mlist;
diff --git a/src/summaryview.h b/src/summaryview.h
index fa5727aa..55fcdb87 100644
--- a/src/summaryview.h
+++ b/src/summaryview.h
@@ -199,6 +199,9 @@ void summary_filter (SummaryView *summaryview,
void summary_filter_open (SummaryView *summaryview,
PrefsFilterType type);
+void summary_junk (SummaryView *summaryview);
+void summary_not_junk (SummaryView *summaryview);
+
void summary_sort (SummaryView *summaryview,
FolderSortKey sort_key,
FolderSortType sort_type);