* please see the file GPL in the top level source directory.
*/
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include <lib-lib/lib-lib.h>
+
+#include <lib-ui/curses.h>
+#include <lib-ui/menu.h>
+#include <lib-ui/sidebar.h>
+#include <lib-mx/mx.h>
#include "mutt.h"
-#include "mutt_curses.h"
-#include "mutt_menu.h"
#include "sort.h"
-#include "mx.h"
-#include "sidebar.h"
-#ifdef USE_IMAP
-#include "imap_private.h"
-#endif
+#include <imap/imap_private.h>
-#include "lib/intl.h"
void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx)
{
int changed = h->changed;
int deleted = ctx->deleted;
int tagged = ctx->tagged;
+ int flagged = ctx->flagged;
if (ctx->readonly && flag != M_TAG)
return; /* don't modify anything if we are read-only */
switch (flag) {
case M_DELETE:
-#ifdef USE_IMAP
- if (ctx && ctx->magic == M_IMAP)
- if (mutt_bit_isset (((IMAP_DATA *) ctx->data)->capabilities, ACL)
- && !mutt_bit_isset (((IMAP_DATA *) ctx->data)->rights,
- IMAP_ACL_DELETE))
- return;
-#endif
+ if (!mx_acl_check (ctx, ACL_DELETE))
+ return;
if (bf) {
if (!h->deleted && !ctx->readonly) {
h->deleted = 1;
if (upd_ctx)
ctx->deleted++;
-#ifdef USE_IMAP
/* deleted messages aren't treated as changed elsewhere so that the
* purge-on-sync option works correctly. This isn't applicable here */
if (ctx && ctx->magic == M_IMAP) {
if (upd_ctx)
ctx->changed = 1;
}
-#endif
}
}
else if (h->deleted) {
ctx->appended--;
}
h->appended = 0; /* when undeleting, also reset the appended flag */
-#ifdef USE_IMAP
/* see my comment above */
if (ctx->magic == M_IMAP) {
h->changed = 1;
if (upd_ctx)
ctx->changed = 1;
}
-#endif
/*
* If the user undeletes a message which is marked as
* "trash" in the maildir folder on disk, the folder has
case M_NEW:
-#ifdef USE_IMAP
- if (ctx && ctx->magic == M_IMAP)
- if (mutt_bit_isset (((IMAP_DATA *) ctx->data)->capabilities, ACL)
- && !mutt_bit_isset (((IMAP_DATA *) ctx->data)->rights,
- IMAP_ACL_SEEN))
- return;
-#endif
+ if (!mx_acl_check (ctx, ACL_SEEN))
+ return;
if (bf) {
if (h->read || h->old) {
case M_OLD:
-#ifdef USE_IMAP
- if (ctx && ctx->magic == M_IMAP)
- if (mutt_bit_isset (((IMAP_DATA *) ctx->data)->capabilities, ACL)
- && !mutt_bit_isset (((IMAP_DATA *) ctx->data)->rights,
- IMAP_ACL_SEEN))
- return;
-#endif
+ if (!mx_acl_check (ctx, ACL_SEEN))
+ return;
if (bf) {
if (!h->old) {
case M_READ:
-#ifdef USE_IMAP
- if (ctx && ctx->magic == M_IMAP)
- if (mutt_bit_isset (((IMAP_DATA *) ctx->data)->capabilities, ACL)
- && !mutt_bit_isset (((IMAP_DATA *) ctx->data)->rights,
- IMAP_ACL_SEEN))
- return;
-#endif
+ if (!mx_acl_check (ctx, ACL_SEEN))
+ return;
if (bf) {
if (!h->read) {
case M_REPLIED:
-#ifdef USE_IMAP
- if (ctx && ctx->magic == M_IMAP)
- if (mutt_bit_isset (((IMAP_DATA *) ctx->data)->capabilities, ACL)
- && !mutt_bit_isset (((IMAP_DATA *) ctx->data)->rights,
- IMAP_ACL_WRITE))
- return;
-#endif
+ if (!mx_acl_check (ctx, ACL_WRITE))
+ return;
if (bf) {
if (!h->replied) {
case M_FLAG:
-#ifdef USE_IMAP
- if (ctx && ctx->magic == M_IMAP)
- if (mutt_bit_isset (((IMAP_DATA *) ctx->data)->capabilities, ACL)
- && !mutt_bit_isset (((IMAP_DATA *) ctx->data)->rights,
- IMAP_ACL_WRITE))
- return;
-#endif
+ if (!mx_acl_check (ctx, ACL_WRITE))
+ return;
if (bf) {
if (!h->flagged) {
* search results so that any future search will match the current status
* of this message and not what it was at the time it was last searched.
*/
- if (h->searched
- && (changed != h->changed || deleted != ctx->deleted
- || tagged != ctx->tagged))
+ if (h->searched && (changed != h->changed || deleted != ctx->deleted ||
+ tagged != ctx->tagged || flagged != ctx->flagged))
h->searched = 0;
- draw_sidebar (0);
+ sidebar_draw ();
}
void mutt_tag_set_flag (int flag, int bf)
if ((cur = cur->child) == NULL)
return (0);
- FOREVER {
+ for (;;) {
if (cur->message)
mutt_set_flag (Context, cur->message, flag, bf);
/* not reached */
}
-int mutt_change_flag (HEADER * h, int bf)
+int mutt_change_flag(HEADER * h, int bf)
{
- int i, flag;
- event_t event;
-
- mvprintw (LINES - 1, 0, "%s? (D/N/O/r/*/!): ",
- bf ? _("Set flag") : _("Clear flag"));
- clrtoeol ();
+ static char const actions[] = {
+ ['d'] = M_DELETE, ['D'] = M_DELETE,
+ ['n'] = M_NEW, ['N'] = M_NEW,
+ ['o'] = M_OLD, ['O'] = M_OLD,
+ ['r'] = M_REPLIED, ['R'] = M_REPLIED,
+ ['*'] = M_TAG,
+ ['!'] = M_FLAG,
+ };
+
+ int c;
+
+ mvprintw(LINES - 1, 0, "%s? (D/N/O/r/*/!): ",
+ bf ? _("Set flag") : _("Clear flag"));
+ clrtoeol();
+
+ c = mutt_getch().ch;
+ if (c == -1) {
+ CLEARLINE (LINES - 1);
+ return (-1);
+ }
- event = mutt_getch ();
- i = event.ch;
- if (i == -1) {
CLEARLINE (LINES - 1);
- return (-1);
- }
-
- CLEARLINE (LINES - 1);
-
- switch (i) {
- case 'd':
- case 'D':
- flag = M_DELETE;
- break;
-
- case 'N':
- case 'n':
- flag = M_NEW;
- break;
-
- case 'o':
- case 'O':
- if (h)
- mutt_set_flag (Context, h, M_READ, !bf);
- else
- mutt_tag_set_flag (M_READ, !bf);
- flag = M_OLD;
- break;
- case 'r':
- case 'R':
- flag = M_REPLIED;
- break;
-
- case '*':
- flag = M_TAG;
- break;
-
- case '!':
- flag = M_FLAG;
- break;
+ if (c < 0 || c > countof(actions) || !actions[c]) {
+ BEEP();
+ return -1;
+ }
- default:
- BEEP ();
- return (-1);
- }
+ if (actions[c] == M_OLD) {
+ if (h) {
+ mutt_set_flag(Context, h, M_READ, !bf);
+ } else {
+ mutt_tag_set_flag(M_READ, !bf);
+ }
+ }
- if (h)
- mutt_set_flag (Context, h, flag, bf);
- else
- mutt_tag_set_flag (flag, bf);
+ if (h) {
+ mutt_set_flag(Context, h, actions[c], bf);
+ } else {
+ mutt_tag_set_flag(actions[c], bf);
+ }
- return 0;
+ return 0;
}