commit 20fe9f935ad289b54862265c09a6b2d47147d50c
Author: Frédéric Brière <fbriere@fbriere.net>
Date:   Sat Jul 18 16:30:34 2009 -0400

    Added commands to mark selected articles as (un)read

diff --git a/include/extern.h b/include/extern.h
index 182a52d..3c557d7 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -768,6 +768,8 @@ extern constext txt_help_group_list_thread[];
 extern constext txt_help_group_mark_article_unread[];
 extern constext txt_help_group_mark_thread_read[];
 extern constext txt_help_group_mark_thread_unread[];
+extern constext txt_help_group_mark_feed_read[];
+extern constext txt_help_group_mark_feed_unread[];
 extern constext txt_help_group_mark_unsel_art_read[];
 extern constext txt_help_group_next[];
 extern constext txt_help_group_prev[];
diff --git a/include/keymap.h b/include/keymap.h
index 419780d..ece9a78 100644
--- a/include/keymap.h
+++ b/include/keymap.h
@@ -247,6 +247,8 @@ enum defined_functions {
 	MARK_READ_CURRENT,
 	MARK_READ_TAGGED,
 	MARK_THREAD_UNREAD,
+	MARK_FEED_READ,
+	MARK_FEED_UNREAD,
 	PAGE_AUTOSAVE,
 	PAGE_BOTTOM_THREAD,
 	PAGE_CANCEL,
diff --git a/include/tin.h b/include/tin.h
index f10dcca..0e0f004 100644
--- a/include/tin.h
+++ b/include/tin.h
@@ -1022,6 +1022,8 @@ enum {
 #define FEED_SAVE		4
 #define FEED_AUTOSAVE	5
 #define FEED_REPOST		6
+#define FEED_MARK_READ		7
+#define FEED_MARK_UNREAD	8
 
 
 /*
diff --git a/src/feed.c b/src/feed.c
index c3441ef..ee5acb1 100644
--- a/src/feed.c
+++ b/src/feed.c
@@ -505,9 +505,18 @@ feed_article(
 	/*
 	 * Mark read for the SAVE cases (but not print/pipe etc..)
 	 */
-	if (function == FEED_SAVE || function == FEED_AUTOSAVE) {
+	switch (function) {
+	case FEED_SAVE:
+	case FEED_AUTOSAVE:
 		if (ok && curr_group->attribute->mark_saved_read)
 			art_mark(curr_group, &arts[art], ART_READ);
+		break;
+	case FEED_MARK_READ:
+		art_mark(curr_group, &arts[art], ART_READ);
+		break;
+	case FEED_MARK_UNREAD:
+		art_mark(curr_group, &arts[art], ART_UNREAD);
+		break;
 	}
 
 	if (!use_current)
@@ -520,7 +529,7 @@ feed_article(
  * Single entry point for 'feed'ing article(s) to a backend
  * Function:
  *	FEED_PIPE, FEED_MAIL, FEED_PRINT, FEED_REPOST
- *	FEED_SAVE, FEED_AUTOSAVE
+ *	FEED_SAVE, FEED_AUTOSAVE, FEED_MARK_READ, FEED_MARK_UNREAD
  * Level:
  *	GROUP_LEVEL, THREAD_LEVEL, PAGE_LEVEL
  * Respnum:
@@ -733,8 +742,10 @@ feed_articles(
 	/*
 	 * Performance hack - If we feed a single art from the pager then we can
 	 * re-use the currently open article
+	 * Also no need to fetch articles just to mark them (un)read
 	 */
-	if (level == PAGE_LEVEL && feed_type == FEED_ARTICLE) {
+	if ((level == PAGE_LEVEL && feed_type == FEED_ARTICLE) ||
+			(function == FEED_MARK_READ || function == FEED_MARK_UNREAD)) {
 		saved_curr_line = curr_line;		/* Save where we were in pager */
 		use_current = TRUE;
 	}
@@ -881,8 +892,12 @@ got_sig_pipe_while_piping:
 			break;
 	}
 
-	if (level != PAGE_LEVEL)
+	if (level != PAGE_LEVEL) {
 		ret1 = curr_group->attribute->mark_saved_read;
+		/* Force a redraw if we've marked anything (un)read */
+		if (function == FEED_MARK_READ || function == FEED_MARK_UNREAD)
+			ret1 = TRUE;
+	}
 
 	if (ret1 || post_processed_ok)
 		redraw_screen = TRUE;
diff --git a/src/group.c b/src/group.c
index 0a0a23d..c067782 100644
--- a/src/group.c
+++ b/src/group.c
@@ -746,6 +746,16 @@ group_page(
 				}
 				break;
 
+			case MARK_FEED_READ:	/* mark selected articles as read */
+				if (grpmenu.curr >= 0)
+					feed_articles(FEED_MARK_READ, GROUP_LEVEL, group, (int) base[grpmenu.curr]);
+				break;
+
+			case MARK_FEED_UNREAD:	/* mark selected articles as unread */
+				if (grpmenu.curr >= 0)
+					feed_articles(FEED_MARK_UNREAD, GROUP_LEVEL, group, (int) base[grpmenu.curr]);
+				break;
+
 			case GROUP_SELECT_THREAD:	/* mark thread as selected */
 			case GROUP_TOGGLE_SELECT_THREAD:	/* toggle thread */
 				if (grpmenu.curr < 0) {
diff --git a/src/help.c b/src/help.c
index 35c61eb..64eef2f 100644
--- a/src/help.c
+++ b/src/help.c
@@ -203,6 +203,8 @@ static t_help_page group_help_page[] = {
 	{ txt_help_group_catchup_next, CATCHUP_NEXT_UNREAD },
 	{ txt_help_group_mark_article_unread, MARK_ARTICLE_UNREAD },
 	{ txt_help_group_mark_thread_unread, MARK_THREAD_UNREAD },
+	{ txt_help_group_mark_feed_read, MARK_FEED_READ },
+	{ txt_help_group_mark_feed_unread, MARK_FEED_UNREAD },
 	{ txt_help_empty_line, NOT_ASSIGNED },
 	{ txt_help_group_select_all, GROUP_DO_AUTOSELECT },
 	{ txt_help_group_select_thread, GROUP_SELECT_THREAD },
diff --git a/src/keymap.c b/src/keymap.c
index 67509ca..1b201f1 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -896,6 +896,16 @@ process_mapping(
 
 				return TRUE;
 			}
+			if (strcmp(keyname, "MarkFeedRead") == 0) {
+				process_keys(MARK_FEED_READ, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "MarkFeedUnread") == 0) {
+				process_keys(MARK_FEED_UNREAD, keys, &group_keys);
+
+				return TRUE;
+			}
 			if (strcmp(keyname, "MenuFilterKill") == 0) {
 				process_keys(GLOBAL_MENU_FILTER_KILL, keys, &group_keys);
 				process_keys(GLOBAL_MENU_FILTER_KILL, keys, &page_keys);
@@ -2353,6 +2363,8 @@ setup_default_keys(
 	add_default_key(&group_keys, "", GLOBAL_MENU_FILTER_SELECT);
 	add_default_key(&group_keys, "\n\r", GROUP_READ_BASENOTE);
 	add_default_key(&group_keys, "", GLOBAL_MENU_FILTER_KILL);
+	add_default_key(&group_keys, "", MARK_FEED_READ);
+	add_default_key(&group_keys, "", MARK_FEED_UNREAD);
 	add_default_key(&group_keys, "a", GLOBAL_SEARCH_AUTHOR_FORWARD);
 	add_default_key(&group_keys, "c", CATCHUP);
 	add_default_key(&group_keys, "d", GROUP_TOGGLE_SUBJECT_DISPLAY);
diff --git a/src/lang.c b/src/lang.c
index 4033759..fb11b6c 100644
--- a/src/lang.c
+++ b/src/lang.c
@@ -373,6 +373,8 @@ constext txt_help_group_list_thread[] = N_("list articles within current thread
 constext txt_help_group_mark_article_unread[] = N_("mark article as unread");
 constext txt_help_group_mark_thread_read[] = N_("mark current thread or tagged threads as read");
 constext txt_help_group_mark_thread_unread[] = N_("mark thread as unread");
+constext txt_help_group_mark_feed_read[] = N_("mark selected articles as read");
+constext txt_help_group_mark_feed_unread[] = N_("mark selected articles as unread");
 constext txt_help_group_mark_unsel_art_read[] = N_("toggle display of all/selected articles");
 constext txt_help_group_next[] = N_("display next group");
 constext txt_help_group_prev[] = N_("display previous group");
