Commit e4bdbd56 authored by Alain Bench's avatar Alain Bench

Allow empty limits, and limits in empty mailboxes. Closes: #1853, #1906.

parent daff2612
...@@ -55,6 +55,13 @@ static const char *Mailbox_is_read_only = N_("Mailbox is read-only."); ...@@ -55,6 +55,13 @@ static const char *Mailbox_is_read_only = N_("Mailbox is read-only.");
static const char *Function_not_permitted_in_attach_message_mode = N_("Function not permitted in attach-message mode."); static const char *Function_not_permitted_in_attach_message_mode = N_("Function not permitted in attach-message mode.");
static const char *No_visible = N_("No visible messages."); static const char *No_visible = N_("No visible messages.");
#define CHECK_IN_MAILBOX if (!Context) \
{ \
mutt_flushinp (); \
mutt_error _(No_mailbox_is_open); \
break; \
}
#define CHECK_MSGCOUNT if (!Context) \ #define CHECK_MSGCOUNT if (!Context) \
{ \ { \
mutt_flushinp (); \ mutt_flushinp (); \
...@@ -286,20 +293,17 @@ static void update_index (MUTTMENU *menu, CONTEXT *ctx, int check, ...@@ -286,20 +293,17 @@ static void update_index (MUTTMENU *menu, CONTEXT *ctx, int check,
if (Context->pattern) if (Context->pattern)
{ {
#define THIS_BODY Context->hdrs[j]->content #define THIS_BODY Context->hdrs[j]->content
if (oldcount || check == M_REOPENED) for (j = (check == M_REOPENED) ? 0 : oldcount; j < Context->msgcount; j++)
{ {
for (j = (check == M_REOPENED) ? 0 : oldcount; j < Context->msgcount; j++) if (mutt_pattern_exec (Context->limit_pattern,
M_MATCH_FULL_ADDRESS,
Context, Context->hdrs[j]))
{ {
if (mutt_pattern_exec (Context->limit_pattern, Context->hdrs[j]->virtual = Context->vcount;
M_MATCH_FULL_ADDRESS, Context->v2r[Context->vcount] = j;
Context, Context->hdrs[j])) Context->hdrs[j]->limited = 1;
{ Context->vcount++;
Context->hdrs[j]->virtual = Context->vcount; Context->vsize += THIS_BODY->length + THIS_BODY->offset - THIS_BODY->hdr_offset;
Context->v2r[Context->vcount] = j;
Context->hdrs[j]->limited = 1;
Context->vcount++;
Context->vsize += THIS_BODY->length + THIS_BODY->offset - THIS_BODY->hdr_offset;
}
} }
} }
#undef THIS_BODY #undef THIS_BODY
...@@ -826,7 +830,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE); ...@@ -826,7 +830,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE);
break; break;
case OP_MAIN_SHOW_LIMIT: case OP_MAIN_SHOW_LIMIT:
CHECK_MSGCOUNT; CHECK_IN_MAILBOX;
if (!Context->pattern) if (!Context->pattern)
mutt_message _("No limit pattern is in effect."); mutt_message _("No limit pattern is in effect.");
else else
...@@ -840,7 +844,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE); ...@@ -840,7 +844,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE);
case OP_MAIN_LIMIT: case OP_MAIN_LIMIT:
CHECK_MSGCOUNT; CHECK_IN_MAILBOX;
menu->oldcurrent = (Context->vcount && menu->current >= 0 && menu->current < Context->vcount) ? menu->oldcurrent = (Context->vcount && menu->current >= 0 && menu->current < Context->vcount) ?
CURHDR->index : -1; CURHDR->index : -1;
if (mutt_pattern_func (M_LIMIT, _("Limit to messages matching: ")) == 0) if (mutt_pattern_func (M_LIMIT, _("Limit to messages matching: ")) == 0)
...@@ -860,7 +864,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE); ...@@ -860,7 +864,7 @@ CHECK_IMAP_ACL(IMAP_ACL_DELETE);
else else
menu->current = 0; menu->current = 0;
menu->redraw = REDRAW_INDEX | REDRAW_STATUS; menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
if ((Sort & SORT_MASK) == SORT_THREADS) if (Context->msgcount && (Sort & SORT_MASK) == SORT_THREADS)
mutt_draw_tree (Context); mutt_draw_tree (Context);
menu->redraw = REDRAW_FULL; menu->redraw = REDRAW_FULL;
} }
...@@ -1582,7 +1586,7 @@ CHECK_IMAP_ACL(IMAP_ACL_SEEN); ...@@ -1582,7 +1586,7 @@ CHECK_IMAP_ACL(IMAP_ACL_SEEN);
case OP_TOGGLE_WRITE: case OP_TOGGLE_WRITE:
CHECK_MSGCOUNT; CHECK_IN_MAILBOX;
if (mx_toggle_write (Context) == 0) if (mx_toggle_write (Context) == 0)
menu->redraw |= REDRAW_STATUS; menu->redraw |= REDRAW_STATUS;
break; break;
......
...@@ -1218,23 +1218,16 @@ int mutt_pattern_func (int op, char *prompt) ...@@ -1218,23 +1218,16 @@ int mutt_pattern_func (int op, char *prompt)
if (op == M_LIMIT) if (op == M_LIMIT)
{ {
/* drop previous limit pattern */
FREE (&Context->pattern); FREE (&Context->pattern);
if (Context->limit_pattern) if (Context->limit_pattern)
mutt_pattern_free (&Context->limit_pattern); mutt_pattern_free (&Context->limit_pattern);
if (!Context->vcount)
{ if (Context->msgcount && !Context->vcount)
mutt_error _("No messages matched criteria."); mutt_error _("No messages matched criteria.");
#if 0
Context->vcount = Context->msgcount; /* record new limit pattern, unless match all */
/* restore full display */ if (mutt_strcmp (buf, "~A") != 0)
for (i = 0; i < Context->msgcount; i++)
{
Context->hdrs[i]->virtual = i;
Context->v2r[i] = i;
}
#endif
}
else if (mutt_strncmp (buf, "~A", 2) != 0)
{ {
Context->pattern = simple; Context->pattern = simple;
simple = NULL; /* don't clobber it */ simple = NULL; /* don't clobber it */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment