summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--OPS2
-rw-r--r--curs_lib.c2
-rw-r--r--curs_main.c38
-rw-r--r--functions.h2
-rw-r--r--menu.c27
5 files changed, 70 insertions, 1 deletions
diff --git a/OPS b/OPS
index ddb2022d..f090fb2c 100644
--- a/OPS
+++ b/OPS
@@ -1,4 +1,5 @@
OP_NULL "null operation"
+OP_END_COND "end of conditional execution (noop)"
OP_ATTACH_VIEW_MAILCAP "force viewing of attachment using mailcap"
OP_ATTACH_VIEW_TEXT "view attachment as text"
OP_ATTACH_COLLAPSE "Toggle display of subparts"
@@ -156,6 +157,7 @@ OP_SORT "sort messages"
OP_SORT_REVERSE "sort messages in reverse order"
OP_TAG "tag the current entry"
OP_TAG_PREFIX "apply next function to tagged messages"
+OP_TAG_PREFIX_COND "apply next function ONLY to tagged messages"
OP_TAG_SUBTHREAD "tag the current subthread"
OP_TAG_THREAD "tag the current thread"
OP_TOGGLE_NEW "toggle a message's 'new' flag"
diff --git a/curs_lib.c b/curs_lib.c
index 0bb9f3b3..ba120bd4 100644
--- a/curs_lib.c
+++ b/curs_lib.c
@@ -39,7 +39,7 @@
* is impossible to unget function keys in SLang, so roll our own input
* buffering routines.
*/
-static size_t UngetCount = 0;
+size_t UngetCount = 0;
static size_t UngetBufLen = 0;
static event_t *KeyEvent;
diff --git a/curs_main.c b/curs_main.c
index 2bc3b593..cf618895 100644
--- a/curs_main.c
+++ b/curs_main.c
@@ -101,6 +101,7 @@ static const char *No_visible = N_("No visible messages.");
#define UNREAD(h) mutt_thread_contains_unread (Context, h)
extern const char *ReleaseDate;
+extern size_t UngetCount;
void index_make_entry (char *s, size_t l, MUTTMENU *menu, int num)
{
@@ -632,6 +633,40 @@ int mutt_index_menu (void)
else if (option (OPTAUTOTAG) && Context && Context->tagged)
tag = 1;
+ if (op == OP_TAG_PREFIX_COND)
+ {
+ if (!Context)
+ {
+ mutt_error _("No mailbox is open.");
+ continue;
+ }
+
+ if (!Context->tagged)
+ {
+ event_t tmp;
+ while(UngetCount>0)
+ {
+ tmp=mutt_getch();
+ if(tmp.op==OP_END_COND)break;
+ }
+ mutt_message _("Nothing to do.");
+ continue;
+ }
+ tag = 1;
+
+ /* give visual indication that the next command is a tag- command */
+ mvaddstr (LINES - 1, 0, "tag-");
+ clrtoeol ();
+
+ /* get the real command */
+ if ((op = km_dokey (MENU_MAIN)) == OP_TAG_PREFIX)
+ {
+ /* abort tag sequence */
+ CLEARLINE (LINES-1);
+ continue;
+ }
+ }
+
mutt_clear_error ();
}
else
@@ -2026,6 +2061,9 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE);
menu->redraw = REDRAW_FULL;
break;
+ case OP_END_COND:
+ break;
+
case OP_WHAT_KEY:
mutt_what_key();
break;
diff --git a/functions.h b/functions.h
index 94791f21..a3021126 100644
--- a/functions.h
+++ b/functions.h
@@ -51,6 +51,8 @@ struct binding_t OpGeneric[] = {
{ "half-down", OP_HALF_DOWN, "]" },
{ "help", OP_HELP, "?" },
{ "tag-prefix", OP_TAG_PREFIX, ";" },
+ { "tag-prefix-cond", OP_TAG_PREFIX_COND, NULL },
+ { "end-cond", OP_END_COND, NULL },
{ "shell-escape", OP_SHELL_ESCAPE, "!" },
{ "select-entry", OP_GENERIC_SELECT_ENTRY,M_ENTER_S },
{ "search", OP_SEARCH, "/" },
diff --git a/menu.c b/menu.c
index d9212b8a..97636362 100644
--- a/menu.c
+++ b/menu.c
@@ -30,6 +30,8 @@
extern int Charset_is_utf8; /* FIXME: bad modularisation */
+extern size_t UngetCount;
+
static void print_enriched_string (int attr, unsigned char *s, int do_color)
{
wchar_t wc;
@@ -870,6 +872,28 @@ int mutt_menuLoop (MUTTMENU *menu)
i = -1;
}
}
+ if (i == OP_TAG_PREFIX_COND)
+ {
+ if (menu->tagged)
+ {
+ mvaddstr (LINES - 1, 0, "Tag-");
+ clrtoeol ();
+ i = km_dokey (menu->menu);
+ menu->tagprefix = 1;
+ CLEARLINE (LINES - 1);
+ }
+ else
+ {
+ event_t tmp;
+ while(UngetCount>0)
+ {
+ tmp=mutt_getch();
+ if(tmp.op==OP_END_COND)break;
+ }
+ mutt_message _("Nothing to do.");
+ i = -1;
+ }
+ }
else if (menu->tagged && option (OPTAUTOTAG))
menu->tagprefix = 1;
else
@@ -1032,6 +1056,9 @@ int mutt_menuLoop (MUTTMENU *menu)
km_error_key (menu->menu);
break;
+ case OP_END_COND:
+ break;
+
default:
return (i);
}