Rocco Rutte:
[apps/madmutt.git] / curs_main.c
index 1f8e57d..4811ba4 100644 (file)
 #include "mutt_curses.h"
 #include "mx.h"
 #include "mutt_menu.h"
-#include "mailbox.h"
 #include "mapping.h"
 #include "sort.h"
+#include "recvattach.h"
 #include "buffy.h"
 #include "mx.h"
 #include "sidebar.h"
+#include "thread.h"
+#include "xterm.h"
 
 #ifdef USE_POP
 #include "pop.h"
@@ -42,6 +44,7 @@
 #include "lib/mem.h"
 #include "lib/intl.h"
 #include "lib/str.h"
+#include "lib/debug.h"
 
 #include <ctype.h>
 #include <stdlib.h>
@@ -86,17 +89,6 @@ static const char *No_visible = N_("No visible messages.");
                                 break; \
                         }
 
-#ifdef USE_IMAP
-/* the error message returned here could be better. */
-#define CHECK_IMAP_ACL(aclbit) if (Context->magic == M_IMAP) \
-                if (mutt_bit_isset (((IMAP_DATA *)Context->data)->capabilities, ACL) \
-                && !mutt_bit_isset(((IMAP_DATA *)Context->data)->rights,aclbit)){ \
-                        mutt_flushinp(); \
-                        mutt_error ("Operation not permitted by the IMAP ACL for this mailbox"); \
-                        break; \
-                }
-#endif
-
 #define CHECK_ATTACH if(option(OPTATTACHMSG)) \
                      {\
                         mutt_flushinp (); \
@@ -111,22 +103,6 @@ static const char *No_visible = N_("No visible messages.");
 extern const char *ReleaseDate;
 extern size_t UngetCount;
 
-static void set_xterm_title_bar (char *title)
-{
-  fputs ("\033]2;", stdout);
-  fputs (title, stdout);
-  fputs ("\007", stdout);
-  fflush (stdout);
-}
-
-static void set_xterm_icon_name (char *name)
-{
-  fputs ("\033]1;", stdout);
-  fputs (name, stdout);
-  fputs ("\007", stdout);
-  fflush (stdout);
-}
-
 void index_make_entry (char *s, size_t l, MUTTMENU * menu, int num)
 {
   format_flag flag =
@@ -314,7 +290,7 @@ static void update_index (MUTTMENU * menu, CONTEXT * ctx, int check,
   /* save the list of new messages */
   if (oldcount && check != M_REOPENED && ((Sort & SORT_MASK) == SORT_THREADS)) {
     save_new =
-      (HEADER **) safe_malloc (sizeof (HEADER *) *
+      (HEADER **) mem_malloc (sizeof (HEADER *) *
                                (Context->msgcount - oldcount));
     for (j = oldcount; j < Context->msgcount; j++)
       save_new[j - oldcount] = Context->hdrs[j];
@@ -347,7 +323,7 @@ static void update_index (MUTTMENU * menu, CONTEXT * ctx, int check,
             mutt_uncollapse_thread (Context, h);
         }
       }
-      FREE (&save_new);
+      mem_free (&save_new);
       mutt_set_virtual (Context);
     }
   }
@@ -365,7 +341,6 @@ static void update_index (MUTTMENU * menu, CONTEXT * ctx, int check,
 
   if (menu->current < 0)
     menu->current = ci_first_message ();
-
 }
 
 static void resort_index (MUTTMENU * menu)
@@ -456,7 +431,7 @@ int mutt_index_menu (void)
                                   IndexHelp);
 
   if (!attach_msg) {
-    mutt_buffy_check (1);       /* force the buffy check after we enter the folder */
+    buffy_check (1);       /* force the buffy check after we enter the folder */
     /* record folder we open to place sidebar indicator properly */
     if (Context && Context->path)
       sidebar_set_current (Context->path);
@@ -500,7 +475,7 @@ int mutt_index_menu (void)
       if ((check = mx_check_mailbox (Context, &index_hint, 0)) < 0) {
         if (!Context->path) {
           /* fatal error occurred */
-          FREE (&Context);
+          mem_free (&Context);
           menu->redraw = REDRAW_FULL;
         }
         set_option (OPTSEARCHINVALID);
@@ -541,12 +516,12 @@ int mutt_index_menu (void)
     if (!attach_msg) {
       /* check for new mail in the incoming folders */
       oldcount = newcount;
-      if ((newcount = mutt_buffy_check (0)) != oldcount) {
+      if ((newcount = buffy_check (0)) != oldcount) {
         menu->redraw |= REDRAW_STATUS;
         menu->redraw |= REDRAW_SIDEBAR;
       }
       if (do_buffy_notify) {
-        if (mutt_buffy_notify () && option (OPTBEEPNEW))
+        if (buffy_notify () && option (OPTBEEPNEW))
           beep ();
       }
       else
@@ -583,15 +558,17 @@ int mutt_index_menu (void)
         DrawFullLine = 0;
         CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES - 2);
         SETCOLOR (MT_COLOR_STATUS);
+        BKGDSET (MT_COLOR_STATUS);
         mutt_paddstr (COLS, buf);
         SETCOLOR (MT_COLOR_NORMAL);
+        BKGDSET (MT_COLOR_NORMAL);
         sidebar_set_buffystats (Context);
         menu->redraw &= ~REDRAW_STATUS;
         if (option (OPTXTERMSETTITLES)) {
           menu_status_line (buf, sizeof (buf), menu, NONULL (XtermTitle));
-          set_xterm_title_bar (buf);
+          mutt_xterm_set_title (buf);
           menu_status_line (buf, sizeof (buf), menu, NONULL (XtermIcon));
-          set_xterm_icon_name (buf);
+          mutt_xterm_set_icon (buf);
         }
       }
 
@@ -603,14 +580,15 @@ int mutt_index_menu (void)
 
       if (option (OPTARROWCURSOR))
         move (menu->current - menu->top + menu->offset, 2);
+       else if (option (OPTBRAILLEFRIENDLY))
+         move (menu->current - menu->top + menu->offset, 0);
       else
         move (menu->current - menu->top + menu->offset, COLS - 1);
       mutt_refresh ();
 
       op = km_dokey (MENU_MAIN);
 
-      dprint (4,
-              (debugfile, "mutt_index_menu[%d]: Got op %d\n", __LINE__, op));
+      debug_print (4, ("Got op %d\n", op));
 
 #if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
       if (SigWinch) {
@@ -921,9 +899,7 @@ int mutt_index_menu (void)
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+      CHECK_MX_ACL (Context, ACL_DELETE, _("Deletion"));
 
       CHECK_ATTACH;
       mutt_pattern_func (M_DELETE, _("Delete messages matching: "));
@@ -981,8 +957,8 @@ int mutt_index_menu (void)
             snprintf (buf, sizeof (buf), "~A");
           unset_option (OPTHIDEREAD);
         }
-        FREE (&Context->pattern);
-        Context->pattern = safe_strdup (buf);
+        mem_free (&Context->pattern);
+        Context->pattern = str_dup (buf);
       }
       if ((op == OP_TOGGLE_READ && mutt_pattern_func (M_LIMIT, NULL) == 0) ||
           mutt_pattern_func (M_LIMIT, _("Limit to messages matching: ")) == 0)
@@ -1101,9 +1077,7 @@ int mutt_index_menu (void)
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+      CHECK_MX_ACL (Context, ACL_DELETE, _("Undeletion"));
 
       if (mutt_pattern_func (M_UNDELETE, _("Undelete messages matching: ")) ==
           0)
@@ -1169,7 +1143,7 @@ int mutt_index_menu (void)
 
       /* check for a fatal error, or all messages deleted */
       if (!Context->path)
-        FREE (&Context);
+        mem_free (&Context);
 
       /* if we were in the pager, redisplay the message */
       if (menu->menu == MENU_PAGER) {
@@ -1212,14 +1186,15 @@ int mutt_index_menu (void)
           cp = _("Open newsgroup in read-only mode");
         else
           cp = _("Open newsgroup");
-        nntp_buffy (buf);
+        nntp_buffy (buf, sizeof (buf));
       }
       else
 #endif
       {
         if (Context && Context->path)
           strncpy (buf, Context->path, sizeof (buf));
-        mutt_buffy (buf, sizeof (buf));
+        if (op != OP_SIDEBAR_OPEN)
+          buffy_next (buf, sizeof (buf));
       }
 
       if (op == OP_SIDEBAR_OPEN) {
@@ -1241,7 +1216,6 @@ int mutt_index_menu (void)
       else
 #endif
         mutt_expand_path (buf, sizeof (buf));
-      sidebar_set_current (buf);
       if (mx_get_magic (buf) <= 0) {
         mutt_error (_("%s is not a mailbox."), buf);
         break;
@@ -1268,7 +1242,7 @@ int mutt_index_menu (void)
           menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
           break;
         }
-        FREE (&Context);
+        mem_free (&Context);
       }
 
       mutt_sleep (0);
@@ -1286,9 +1260,10 @@ int mutt_index_menu (void)
       }
       else
         menu->current = 0;
+      sidebar_set_current (buf);
 
 #ifdef USE_NNTP
-      /* mutt_buffy_check() must be done with mail-reader mode! */
+      /* buffy_check() must be done with mail-reader mode! */
       menu->help = mutt_compile_help (helpstr, sizeof (helpstr), MENU_MAIN,
                                       (Context
                                        && (Context->magic ==
@@ -1296,7 +1271,7 @@ int mutt_index_menu (void)
                                       IndexHelp);
 #endif
       mutt_clear_error ();
-      mutt_buffy_check (1);     /* force the buffy check after we have changed
+      buffy_check (1);     /* force the buffy check after we have changed
                                    the folder */
       menu->redraw = REDRAW_FULL;
       set_option (OPTSEARCHINVALID);
@@ -1323,6 +1298,10 @@ int mutt_index_menu (void)
           menu->current = mutt_thread_next_unread (Context, CURHDR);
       }
 
+      if (option (OPTPGPAUTODEC) && 
+          (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)))
+        mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
+
       if ((op = mutt_display_message (CURHDR)) == -1) {
         unset_option (OPTNEEDRESORT);
         break;
@@ -1346,7 +1325,7 @@ int mutt_index_menu (void)
       {
         if (Context) {
           mx_fastclose_mailbox (Context);
-          FREE (&Context);
+          mem_free (&Context);
         }
         done = 1;
       }
@@ -1649,27 +1628,7 @@ int mutt_index_menu (void)
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_POP
-      if (Context->magic == M_POP) {
-        mutt_flushinp ();
-        mutt_error (_("Can't change 'important' flag on POP server."));
-
-        break;
-      }
-#endif
-
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_WRITE);
-#endif
-
-#ifdef USE_NNTP
-      if (Context->magic == M_NNTP) {
-        mutt_flushinp ();
-        mutt_error (_("Can't change 'important' flag on NNTP server."));
-
-        break;
-      }
-#endif
+      CHECK_MX_ACL (Context, ACL_WRITE, _("Flagging"));
 
       if (tag) {
         for (j = 0; j < Context->vcount; j++) {
@@ -1702,9 +1661,7 @@ int mutt_index_menu (void)
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_SEEN);
-#endif
+      CHECK_MX_ACL (Context, ACL_SEEN, _("Toggling"));
 
       if (tag) {
         for (j = 0; j < Context->vcount; j++) {
@@ -1811,10 +1768,6 @@ int mutt_index_menu (void)
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-/* #ifdef USE_IMAP
-CHECK_IMAP_ACL(IMAP_ACL_WRITE);
-#endif */
-
       if (mutt_change_flag (tag ? NULL : CURHDR, (op == OP_MAIN_SET_FLAG)) ==
           0) {
         menu->redraw = REDRAW_STATUS;
@@ -1948,9 +1901,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+      CHECK_MX_ACL (Context, ACL_DELETE, _("Deletion"));
 
       if (tag) {
         mutt_tag_set_flag (M_DELETE, 1);
@@ -1990,9 +1941,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+      CHECK_MX_ACL (Context, ACL_DELETE, _("Deletion"));
 
       rc = mutt_thread_set_flag (CURHDR, M_DELETE, 1,
                                  op == OP_DELETE_THREAD ? 0 : 1);
@@ -2043,27 +1992,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_READONLY;
       CHECK_ATTACH;
 
-#ifdef USE_POP
-      if (Context->magic == M_POP) {
-        mutt_flushinp ();
-        mutt_error (_("Can't edit message on POP server."));
-
-        break;
-      }
-#endif
-
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_INSERT);
-#endif
-
-#ifdef USE_NNTP
-      if (Context->magic == M_NNTP) {
-        mutt_flushinp ();
-        mutt_error (_("Can't edit message on newsserver."));
-
-        break;
-      }
-#endif
+      CHECK_MX_ACL (Context, ACL_INSERT, _("Editing"));
 
       if (option (OPTPGPAUTODEC)
           && (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)))
@@ -2078,6 +2007,10 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_MSGCOUNT;
       CHECK_VISIBLE;
       CHECK_ATTACH;
+
+      if (option (OPTPGPAUTODEC) &&
+          (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED))) 
+        mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
       ci_send_message (SENDFORWARD, NULL, NULL, Context, tag ? NULL : CURHDR);
       menu->redraw = REDRAW_FULL;
       break;
@@ -2092,6 +2025,11 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_MSGCOUNT;
       CHECK_VISIBLE;
       CHECK_ATTACH;
+
+      if (option (OPTPGPAUTODEC) &&
+          (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED))) 
+        mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
+
       ci_send_message (SENDREPLY | SENDGROUPREPLY, NULL, NULL, Context,
                        tag ? NULL : CURHDR);
       menu->redraw = REDRAW_FULL;
@@ -2102,6 +2040,11 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_ATTACH;
       CHECK_MSGCOUNT;
       CHECK_VISIBLE;
+
+      if (option (OPTPGPAUTODEC) &&
+          (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED))) 
+        mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
+
       ci_send_message (SENDREPLY | SENDLISTREPLY, NULL, NULL, Context,
                        tag ? NULL : CURHDR);
       menu->redraw = REDRAW_FULL;
@@ -2169,9 +2112,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_SEEN);
-#endif
+      CHECK_MX_ACL (Context, ACL_SEEN, _("Marking as read"));
 
       rc = mutt_thread_set_flag (CURHDR, M_READ, 1,
                                  op == OP_MAIN_READ_THREAD ? 0 : 1);
@@ -2225,7 +2166,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
         sleep (2);
       }
       else if (op != OP_FOLLOWUP || !CURHDR->env->followup_to ||
-               safe_strcasecmp (CURHDR->env->followup_to, "poster") ||
+               str_casecmp (CURHDR->env->followup_to, "poster") ||
                query_quadoption (OPT_FOLLOWUPTOPOSTER,
                                  _("Reply by mail as poster prefers?")) !=
                M_YES) {
@@ -2257,6 +2198,11 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_ATTACH;
       CHECK_MSGCOUNT;
       CHECK_VISIBLE;
+
+      if (option (OPTPGPAUTODEC) &&
+          (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED))) 
+        mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
+
       ci_send_message (SENDREPLY, NULL, NULL, Context, tag ? NULL : CURHDR);
       menu->redraw = REDRAW_FULL;
       break;
@@ -2292,9 +2238,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+      CHECK_MX_ACL (Context, ACL_DELETE, _("Undeletion"));
 
       if (tag) {
         mutt_tag_set_flag (M_DELETE, 0);
@@ -2321,9 +2265,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       CHECK_VISIBLE;
       CHECK_READONLY;
 
-#ifdef USE_IMAP
-      CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+      CHECK_MX_ACL (Context, ACL_DELETE, _("Undeletion"));
 
       rc = mutt_thread_set_flag (CURHDR, M_DELETE, 0,
                                  op == OP_UNDELETE_THREAD ? 0 : 1)
@@ -2349,7 +2291,9 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE);
       break;
 
     case OP_BUFFY_LIST:
-      mutt_buffy_list ();
+      if (option (OPTFORCEBUFFYCHECK))
+        buffy_check (1);
+      buffy_list ();
       menu->redraw = REDRAW_FULL;
       break;