More string and buffer functions.
[apps/madmutt.git] / flags.c
diff --git a/flags.c b/flags.c
index bc57bb9..d25aca7 100644 (file)
--- a/flags.c
+++ b/flags.c
@@ -7,28 +7,23 @@
  * please see the file GPL in the top level source directory.
  */
 
  * 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/lib-ui.h>
+#include <lib-ui/menu.h>
+#include <lib-mx/mx.h>
+#include <imap/imap.h>
 
 #include "mutt.h"
 
 #include "mutt.h"
-#include "mutt_curses.h"
-#include "mutt_menu.h"
 #include "sort.h"
 #include "sort.h"
-#include "mx.h"
-#include "sidebar.h"
-
-#ifdef USE_IMAP
-#include "imap_private.h"
-#endif
 
 
-#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;
 
 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 */
 
   if (ctx->readonly && flag != M_TAG)
     return;                     /* don't modify anything if we are read-only */
@@ -36,20 +31,14 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx)
   switch (flag) {
   case M_DELETE:
 
   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++;
 
     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) {
         /* 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) {
@@ -57,7 +46,6 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx)
           if (upd_ctx)
             ctx->changed = 1;
         }
           if (upd_ctx)
             ctx->changed = 1;
         }
-#endif
       }
     }
     else if (h->deleted) {
       }
     }
     else if (h->deleted) {
@@ -68,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 */
           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;
       }
       /* 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
       /* 
        * If the user undeletes a message which is marked as
        * "trash" in the maildir folder on disk, the folder has
@@ -110,13 +96,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx)
 
   case M_NEW:
 
 
   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) {
 
     if (bf) {
       if (h->read || h->old) {
@@ -148,13 +129,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx)
 
   case M_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) {
 
     if (bf) {
       if (!h->old) {
@@ -180,13 +156,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx)
 
   case M_READ:
 
 
   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) {
 
     if (bf) {
       if (!h->read) {
@@ -216,13 +187,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx)
 
   case M_REPLIED:
 
 
   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) {
 
     if (bf) {
       if (!h->replied) {
@@ -250,13 +216,8 @@ void _mutt_set_flag (CONTEXT * ctx, HEADER * h, int flag, int bf, int upd_ctx)
 
   case M_FLAG:
 
 
   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) {
 
     if (bf) {
       if (!h->flagged) {
@@ -300,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.
    */
    * 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;
     h->searched = 0;
-  sidebar_draw (0);
+  sidebar_draw ();
 }
 
 void mutt_tag_set_flag (int flag, int bf)
 }
 
 void mutt_tag_set_flag (int flag, int bf)
@@ -322,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.");
 
   if ((Sort & SORT_MASK) != SORT_THREADS) {
     mutt_error _("Threading is not enabled.");
 
-    return (-1);
+    return -1;
   }
 
   if (!subthread)
   }
 
   if (!subthread)
@@ -334,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)
     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);
 
     if (cur->message)
       mutt_set_flag (Context, cur->message, flag, bf);
 
@@ -348,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)
       while (!cur->next) {
         cur = cur->parent;
         if (cur == start)
-          return (0);
+          return 0;
       }
       cur = cur->next;
     }
       }
       cur = cur->next;
     }
@@ -356,66 +316,40 @@ int mutt_thread_set_flag (HEADER * hdr, int flag, int bf, int subthread)
   /* not reached */
 }
 
   /* 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;
 }
 }