X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=flags.c;h=d25aca7e2049cfc9d8d0101429b69cc121217879;hp=c3f14bd7473931e62a01bf7d6b7274851aac7f02;hb=7db27b8f24670fd40cf24755f2782a104ad24594;hpb=c3e57678c8be193fc137854020f3a90887be97c9 diff --git a/flags.c b/flags.c index c3f14bd..d25aca7 100644 --- a/flags.c +++ b/flags.c @@ -7,26 +7,23 @@ * please see the file GPL in the top level source directory. */ -#if HAVE_CONFIG_H -# include "config.h" -#endif +#include + +#include +#include +#include +#include #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 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 */ @@ -34,20 +31,14 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) 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) { @@ -55,7 +46,6 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) if (upd_ctx) ctx->changed = 1; } -#endif } } else if (h->deleted) { @@ -66,14 +56,12 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) 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 @@ -108,13 +96,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) 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) { @@ -146,13 +129,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) 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) { @@ -178,13 +156,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) 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) { @@ -214,13 +187,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) 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) { @@ -248,13 +216,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) 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) { @@ -298,11 +261,10 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx) * 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) @@ -320,7 +282,7 @@ int mutt_thread_set_flag (HEADER * hdr, int flag, int bf, int subthread) if ((Sort & SORT_MASK) != SORT_THREADS) { mutt_error _("Threading is not enabled."); - return (-1); + return -1; } if (!subthread) @@ -332,9 +294,9 @@ int mutt_thread_set_flag (HEADER * hdr, int flag, int bf, int subthread) mutt_set_flag (Context, cur->message, flag, bf); if ((cur = cur->child) == NULL) - return (0); + return 0; - FOREVER { + for (;;) { if (cur->message) mutt_set_flag (Context, cur->message, flag, bf); @@ -346,7 +308,7 @@ int mutt_thread_set_flag (HEADER * hdr, int flag, int bf, int subthread) while (!cur->next) { cur = cur->parent; if (cur == start) - return (0); + return 0; } cur = cur->next; } @@ -354,66 +316,40 @@ int mutt_thread_set_flag (HEADER * hdr, int flag, int bf, int subthread) /* 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 (); - - 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; - - default: - BEEP (); - return (-1); - } + char buf[STRING]; + const char letters[] = "dDnNoOrR*!"; + 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; + + snprintf(buf, sizeof(buf), "%s? (D/N/O/r/*/!): ", + bf ? _("Set flag") : _("Clear flag")); + c = mutt_multi_choice(buf, letters); + if (c <= 0) + return -1; + c = letters[c - 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; }