}
/**
- * mutt_tag_set_flag - Set flag on tagged messages
+ * mutt_emails_set_flag - Set flag on messages
+ * @param m Mailbox
+ * @param el List of Emails to flag
* @param flag Flag to set, e.g. #MUTT_DELETE
* @param bf true: set the flag; false: clear the flag
*/
-void mutt_tag_set_flag(int flag, int bf)
+void mutt_emails_set_flag(struct Mailbox *m, struct EmailList *el, int flag, int bf)
{
- for (int i = 0; i < Context->mailbox->msg_count; i++)
- if (message_is_tagged(Context, i))
- mutt_set_flag(Context->mailbox, Context->mailbox->emails[i], flag, bf);
+ if (!m || !el || STAILQ_EMPTY(el))
+ return;
+
+ struct EmailNode *en = NULL;
+ STAILQ_FOREACH(en, el, entries)
+ {
+ mutt_set_flag(m, en->email, flag, bf);
+ }
}
/**
/**
* mutt_change_flag - Change the flag on a Message
- * @param e Email
+ * @param m Mailbox
+ * @param el List of Emails to change
* @param bf true: set the flag; false: clear the flag
* @retval 0 Success
* @retval -1 Failure
*/
-int mutt_change_flag(struct Email *e, int bf)
+int mutt_change_flag(struct Mailbox *m, struct EmailList *el, int bf)
{
+ if (!m || !el || STAILQ_EMPTY(el))
+ return -1;
+
int i, flag;
struct Event event;
case 'd':
case 'D':
if (!bf)
- {
- if (e)
- mutt_set_flag(Context->mailbox, e, MUTT_PURGE, bf);
- else
- mutt_tag_set_flag(MUTT_PURGE, bf);
- }
+ mutt_emails_set_flag(m, el, MUTT_PURGE, bf);
flag = MUTT_DELETE;
break;
case 'o':
case 'O':
- if (e)
- mutt_set_flag(Context->mailbox, e, MUTT_READ, !bf);
- else
- mutt_tag_set_flag(MUTT_READ, !bf);
+ mutt_emails_set_flag(m, el, MUTT_READ, !bf);
flag = MUTT_OLD;
break;
return -1;
}
- if (e)
- mutt_set_flag(Context->mailbox, e, flag, bf);
- else
- mutt_tag_set_flag(flag, bf);
-
+ mutt_emails_set_flag(m, el, flag, bf);
return 0;
}
case OP_MAIN_SET_FLAG:
case OP_MAIN_CLEAR_FLAG:
-
+ {
CHECK_MSGCOUNT;
CHECK_VISIBLE;
CHECK_READONLY;
/* CHECK_ACL(MUTT_ACL_WRITE); */
- if (mutt_change_flag(tag ? NULL : CUR_EMAIL, (op == OP_MAIN_SET_FLAG)) == 0)
+ struct EmailList el = STAILQ_HEAD_INITIALIZER(el);
+ el_add_tagged(&el, Context, CUR_EMAIL, tag);
+
+ if (mutt_change_flag(Context->mailbox, &el, (op == OP_MAIN_SET_FLAG)) == 0)
{
menu->redraw |= REDRAW_STATUS;
if (tag)
else
menu->redraw |= REDRAW_CURRENT;
}
+ el_free(&el);
break;
+ }
case OP_MAIN_COLLAPSE_THREAD:
CHECK_MSGCOUNT;
case OP_PURGE_MESSAGE:
case OP_DELETE:
-
+ {
CHECK_MSGCOUNT;
CHECK_VISIBLE;
CHECK_READONLY;
/* L10N: CHECK_ACL */
CHECK_ACL(MUTT_ACL_DELETE, _("Cannot delete message"));
+ struct EmailList el = STAILQ_HEAD_INITIALIZER(el);
+ el_add_tagged(&el, Context, CUR_EMAIL, tag);
+
+ mutt_emails_set_flag(Context->mailbox, &el, MUTT_DELETE, 1);
+ mutt_emails_set_flag(Context->mailbox, &el, MUTT_PURGE, (op == OP_PURGE_MESSAGE));
+ if (DeleteUntag)
+ mutt_emails_set_flag(Context->mailbox, &el, MUTT_TAG, 0);
+ el_free(&el);
+
if (tag)
{
- mutt_tag_set_flag(MUTT_DELETE, 1);
- mutt_tag_set_flag(MUTT_PURGE, (op == OP_PURGE_MESSAGE));
- if (DeleteUntag)
- mutt_tag_set_flag(MUTT_TAG, 0);
menu->redraw |= REDRAW_INDEX;
}
else
{
- mutt_set_flag(Context->mailbox, CUR_EMAIL, MUTT_DELETE, 1);
- mutt_set_flag(Context->mailbox, CUR_EMAIL, MUTT_PURGE, (op == OP_PURGE_MESSAGE));
- if (DeleteUntag)
- mutt_set_flag(Context->mailbox, CUR_EMAIL, MUTT_TAG, 0);
if (Resolve)
{
menu->current = ci_next_undeleted(menu->current);
}
menu->redraw |= REDRAW_STATUS;
break;
+ }
case OP_DELETE_THREAD:
case OP_DELETE_SUBTHREAD:
break;
case OP_UNDELETE:
-
+ {
CHECK_MSGCOUNT;
CHECK_VISIBLE;
CHECK_READONLY;
/* L10N: CHECK_ACL */
CHECK_ACL(MUTT_ACL_DELETE, _("Cannot undelete message"));
+ struct EmailList el = STAILQ_HEAD_INITIALIZER(el);
+ el_add_tagged(&el, Context, CUR_EMAIL, tag);
+
+ mutt_emails_set_flag(Context->mailbox, &el, MUTT_DELETE, 0);
+ mutt_emails_set_flag(Context->mailbox, &el, MUTT_PURGE, 0);
+ el_free(&el);
+
if (tag)
{
- mutt_tag_set_flag(MUTT_DELETE, 0);
- mutt_tag_set_flag(MUTT_PURGE, 0);
menu->redraw |= REDRAW_INDEX;
}
else
{
- mutt_set_flag(Context->mailbox, CUR_EMAIL, MUTT_DELETE, 0);
- mutt_set_flag(Context->mailbox, CUR_EMAIL, MUTT_PURGE, 0);
if (Resolve && menu->current < Context->mailbox->vcount - 1)
{
menu->current++;
else
menu->redraw |= REDRAW_CURRENT;
}
+
menu->redraw |= REDRAW_STATUS;
break;
+ }
case OP_UNDELETE_THREAD:
case OP_UNDELETE_SUBTHREAD:
case OP_MAIN_SET_FLAG:
case OP_MAIN_CLEAR_FLAG:
+ {
CHECK_MODE(IsEmail(extra));
CHECK_READONLY;
- if (mutt_change_flag(extra->email, (ch == OP_MAIN_SET_FLAG)) == 0)
+ struct EmailList el = STAILQ_HEAD_INITIALIZER(el);
+ el_add_email(&el, extra->email);
+
+ if (mutt_change_flag(Context->mailbox, &el, (ch == OP_MAIN_SET_FLAG)) == 0)
pager_menu->redraw |= REDRAW_STATUS | REDRAW_INDEX;
if (extra->email->deleted && Resolve)
{
ch = -1;
rc = OP_MAIN_NEXT_UNDELETED;
}
+ el_free(&el);
break;
+ }
case OP_DELETE_THREAD:
case OP_DELETE_SUBTHREAD:
void mutt_set_flag_update(struct Mailbox *m, struct Email *e, int flag, bool bf, bool upd_mbox);
#define mutt_set_flag(a, b, c, d) mutt_set_flag_update(a, b, c, d, true)
void mutt_signal_init(void);
-void mutt_tag_set_flag(int flag, int bf);
-int mutt_change_flag(struct Email *e, int bf);
+void mutt_emails_set_flag(struct Mailbox *m, struct EmailList *el, int flag, int bf);
+int mutt_change_flag(struct Mailbox *m, struct EmailList *el, int bf);
int mutt_complete(char *buf, size_t buflen);
int mutt_prepare_template(FILE *fp, struct Mailbox *m, struct Email *newhdr, struct Email *e, bool resend);