Simplifications.
[apps/madmutt.git] / compose.c
index a604ca0..70738d5 100644 (file)
--- a/compose.c
+++ b/compose.c
 #include <lib-lib/lib-lib.h>
 
 #include <lib-sys/unix.h>
-
 #include <lib-mime/mime.h>
 
-#include <lib-ui/curses.h>
+#include <lib-ui/lib-ui.h>
 #include <lib-ui/enter.h>
 #include <lib-ui/menu.h>
 #include <lib-mx/mx.h>
 
 #include "mutt.h"
 #include "alias.h"
+#include "crypt.h"
 #include "mutt_idna.h"
 #include "attach.h"
 #include "recvattach.h"
 #include "charset.h"
 #include "buffy.h"
 
-#ifdef MIXMASTER
-#include "remailer.h"
-#endif
-
-#ifdef USE_NNTP
-#include <nntp/nntp.h>
-#endif
-
-static const char *There_are_no_attachments = N_("There are no attachments.");
-
-#define CHECK_COUNT if (idxlen == 0) { mutt_error _(There_are_no_attachments); break; }
-
-
+#define CHECK_COUNT \
+    if (idxlen == 0) {                             \
+        mutt_error _("There are no attachments."); \
+        break;                                     \
+    }
 
 enum {
   HDR_FROM = 1,
@@ -54,169 +46,85 @@ enum {
   HDR_REPLYTO,
   HDR_FCC,
 
-#ifdef MIXMASTER
-  HDR_MIX,
-#endif
-
   HDR_CRYPT,
   HDR_CRYPTINFO,
 
-#ifdef USE_NNTP
-  HDR_NEWSGROUPS,
-  HDR_FOLLOWUPTO,
-  HDR_XCOMMENTTO,
-#endif
-
-#ifndef USE_NNTP
-  HDR_ATTACH = (HDR_FCC + 5)    /* where to start printing the attachments */
-#else
   HDR_ATTACH = (HDR_FCC + 7)
-#endif
 };
 
 #define HDR_XOFFSET     14
 #define TITLE_FMT       "%14s"        /* Used for Prompts, which are ASCII */
-#define SW              (option(OPTMBOXPANE)?SidebarWidth:0)
-#define W               (COLS - HDR_XOFFSET - SW)
+#define W               (getmaxx(main_w) - HDR_XOFFSET)
 
 static const char *Prompts[] = {
-  "From: ",
-  "To: ",
-  "Cc: ",
-  "Bcc: ",
-  "Subject: ",
-  "Reply-To: ",
-  "Fcc: "
-#ifdef USE_NNTP
-#ifdef MIXMASTER
-    , ""
-#endif
-    , "", "", "Newsgroups: ", "Followup-To: ", "X-Comment-To: "
-#endif
-};
-
-static struct mapping_t ComposeHelp[] = {
-  {N_("Send"), OP_COMPOSE_SEND_MESSAGE},
-  {N_("Abort"), OP_EXIT},
-  {"To", OP_COMPOSE_EDIT_TO},
-  {"CC", OP_COMPOSE_EDIT_CC},
-  {"Subj", OP_COMPOSE_EDIT_SUBJECT},
-  {N_("Attach file"), OP_COMPOSE_ATTACH_FILE},
-  {N_("Descrip"), OP_COMPOSE_EDIT_DESCRIPTION},
-  {N_("Help"), OP_HELP},
-  {NULL, OP_NULL}
+    "From: ",
+    "To: ",
+    "Cc: ",
+    "Bcc: ",
+    "Subject: ",
+    "Reply-To: ",
+    "Fcc: ",
 };
 
-#ifdef USE_NNTP
-static struct mapping_t ComposeNewsHelp[] = {
-  {N_("Send"), OP_COMPOSE_SEND_MESSAGE},
-  {N_("Abort"), OP_EXIT},
-  {"Newsgroups", OP_COMPOSE_EDIT_NEWSGROUPS},
-  {"Subj", OP_COMPOSE_EDIT_SUBJECT},
-  {N_("Attach file"), OP_COMPOSE_ATTACH_FILE},
-  {N_("Descrip"), OP_COMPOSE_EDIT_DESCRIPTION},
-  {N_("Help"), OP_HELP},
-  {NULL, OP_NULL}
-};
-#endif
-
-
 static void snd_entry (char *b, ssize_t blen, MUTTMENU * menu, int num) {
-  int w=(COLS-SW)>blen?blen:COLS-SW;
-  mutt_FormatString (b, w, NONULL (AttachFormat), mutt_attach_fmt,
-                     (unsigned long) (((ATTACHPTR **) menu->data)[num]),
-                     M_FORMAT_STAT_FILE | M_FORMAT_ARROWCURSOR);
+  m_strformat(b, blen, getmaxx(main_w), AttachFormat, mutt_attach_fmt,
+              ((ATTACHPTR **)menu->data)[num], M_FORMAT_STAT_FILE);
 }
 
-#include <lib-crypt/crypt.h>
-
 static void redraw_crypt_lines (HEADER * msg)
 {
   int off = 0;
 
   if (!msg->security)
-    mvaddstr (HDR_CRYPT, SW, "    Security: ");
+    mvwaddstr (main_w, HDR_CRYPT, 0, "    Security: ");
   else if (msg->security & APPLICATION_SMIME)
-    mvaddstr (HDR_CRYPT, SW, "      S/MIME: ");
+    mvwaddstr (main_w, HDR_CRYPT, 0, "      S/MIME: ");
   else if (msg->security & APPLICATION_PGP)
-    mvaddstr (HDR_CRYPT, SW, "         PGP: ");
+    mvwaddstr (main_w, HDR_CRYPT, 0, "         PGP: ");
 
   if ((msg->security & (ENCRYPT | SIGN)) == (ENCRYPT | SIGN))
-    addstr (_("Sign, Encrypt"));
+    waddstr (main_w, _("Sign, Encrypt"));
   else if (msg->security & ENCRYPT)
-    addstr (_("Encrypt"));
+    waddstr (main_w, _("Encrypt"));
   else if (msg->security & SIGN)
-    addstr (_("Sign"));
+    waddstr (main_w, _("Sign"));
   else
-    addstr (_("Clear"));
+    waddstr (main_w, _("Clear"));
 
   if ((msg->security & APPLICATION_PGP)
       && (msg->security & (ENCRYPT | SIGN))) {
     if ((msg->security & INLINE))
-      addstr (_(" (inline)"));
+      waddstr (main_w, _(" (inline)"));
     else
-      addstr (_(" (PGP/MIME)"));
+      waddstr (main_w, _(" (PGP/MIME)"));
   }
-  clrtoeol ();
+  wclrtoeol (main_w);
 
-  move (HDR_CRYPTINFO, SW);
-  clrtoeol ();
+  wmove (main_w, HDR_CRYPTINFO, 0);
+  wclrtoeol (main_w);
   if (msg->security & APPLICATION_PGP && msg->security & SIGN)
-    printw ("%s%s", _("     sign as: "),
+    wprintw (main_w, "%s%s", _("     sign as: "),
             PgpSignAs ? PgpSignAs : _("<default>"));
 
   if (msg->security & APPLICATION_SMIME && msg->security & SIGN) {
-    printw ("%s%s", _("     sign as: "),
+    wprintw (main_w, "%s%s", _("     sign as: "),
             SmimeDefaultKey ? SmimeDefaultKey : _("<default>"));
   }
 
   if ((msg->security & APPLICATION_SMIME)
       && (msg->security & ENCRYPT)
       && SmimeCryptAlg && *SmimeCryptAlg) {
-    mvprintw (HDR_CRYPTINFO, SW + 40, "%s%s", _("Encrypt with: "),
+    mvwprintw (main_w, HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "),
               NONULL (SmimeCryptAlg));
     off = 20;
   }
 }
 
-
-#ifdef MIXMASTER
-
-static void redraw_mix_line (string_list_t * chain)
-{
-  int c;
-  const char *t;
-
-  mvaddstr (HDR_MIX, SW, "         Mix: ");
-
-  if (!chain) {
-    addstr ("<no chain defined>");
-    clrtoeol ();
-    return;
-  }
-
-  for (c = 12; chain; chain = chain->next) {
-    t = chain->data;
-    if (t && t[0] == '0' && t[1] == '\0')
-      t = "<random>";
-
-    if (c + m_strlen(t) + 2 >= COLS - SW)
-      break;
-
-    addstr (NONULL (t));
-    if (chain->next)
-      addstr (", ");
-
-    c += m_strlen(t) + 2;
-  }
-}
-#endif /* MIXMASTER */
-
 static int check_attachments (ATTACHPTR ** idx, short idxlen)
 {
   int i, r;
   struct stat st;
-  char pretty[_POSIX_PATH_MAX], msg[_POSIX_PATH_MAX + SHORT_STRING];
+  char pretty[_POSIX_PATH_MAX], msg[_POSIX_PATH_MAX + STRING];
 
   for (i = 0; i < idxlen; i++) {
     m_strcpy(pretty, sizeof(pretty), idx[i]->content->filename);
@@ -246,52 +154,32 @@ static void draw_envelope_addr (int line, address_t * addr)
   char buf[STRING];
 
   buf[0] = 0;
-  rfc822_write_address (buf, sizeof (buf), addr, 1);
-  mvprintw (line, SW, TITLE_FMT, Prompts[line - 1]);
-  mutt_paddstr (W, buf);
+  rfc822_addrcat(buf, sizeof (buf), addr, 1);
+  mvwprintw (main_w, line, 0, TITLE_FMT, Prompts[line - 1]);
+  mutt_paddstr (main_w, W, buf);
 }
 
 static void draw_envelope (HEADER * msg, char *fcc)
 {
   draw_envelope_addr (HDR_FROM, msg->env->from);
-#ifdef USE_NNTP
-  if (!option (OPTNEWSSEND)) {
-#endif
-    draw_envelope_addr (HDR_TO, msg->env->to);
-    draw_envelope_addr (HDR_CC, msg->env->cc);
-    draw_envelope_addr (HDR_BCC, msg->env->bcc);
-#ifdef USE_NNTP
-  }
-  else {
-    mvprintw (HDR_TO, SW, TITLE_FMT, Prompts[HDR_NEWSGROUPS - 1]);
-    mutt_paddstr (W, NONULL (msg->env->newsgroups));
-    mvprintw (HDR_CC, SW, TITLE_FMT, Prompts[HDR_FOLLOWUPTO - 1]);
-    mutt_paddstr (W, NONULL (msg->env->followup_to));
-    if (option (OPTXCOMMENTTO)) {
-      mvprintw (HDR_BCC, 0, TITLE_FMT, Prompts[HDR_XCOMMENTTO - 1]);
-      mutt_paddstr (W, NONULL (msg->env->x_comment_to));
-    }
-  }
-#endif
-  mvprintw (HDR_SUBJECT, SW, TITLE_FMT, Prompts[HDR_SUBJECT - 1]);
-  mutt_paddstr (W, NONULL (msg->env->subject));
+  draw_envelope_addr (HDR_TO, msg->env->to);
+  draw_envelope_addr (HDR_CC, msg->env->cc);
+  draw_envelope_addr (HDR_BCC, msg->env->bcc);
+  mvwprintw (main_w, HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]);
+  mutt_paddstr (main_w, W, NONULL (msg->env->subject));
   draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to);
-  mvprintw (HDR_FCC, SW, TITLE_FMT, Prompts[HDR_FCC - 1]);
-  mutt_paddstr (W, fcc);
+  mvwprintw (main_w, HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]);
+  mutt_paddstr (main_w, W, fcc);
 
   redraw_crypt_lines (msg);
 
-#ifdef MIXMASTER
-  redraw_mix_line (msg->chain);
-#endif
+  SETCOLOR(main_w, MT_COLOR_STATUS);
+  mvwaddstr (main_w, HDR_ATTACH - 1, 0, _("-- Attachments"));
+  BKGDSET(main_w, MT_COLOR_STATUS);
+  wclrtoeol (main_w);
 
-  SETCOLOR (MT_COLOR_STATUS);
-  mvaddstr (HDR_ATTACH - 1, SW, _("-- Attachments"));
-  BKGDSET (MT_COLOR_STATUS);
-  clrtoeol ();
-
-  BKGDSET (MT_COLOR_NORMAL);
-  SETCOLOR (MT_COLOR_NORMAL);
+  BKGDSET(main_w, MT_COLOR_NORMAL);
+  SETCOLOR(main_w, MT_COLOR_NORMAL);
 }
 
 static int edit_address_list (int line, address_t ** addr)
@@ -300,7 +188,7 @@ static int edit_address_list (int line, address_t ** addr)
   char *err = NULL;
 
   mutt_addrlist_to_local (*addr);
-  rfc822_write_address (buf, sizeof (buf), *addr, 0);
+  rfc822_addrcat(buf, sizeof (buf), *addr, 0);
   if (mutt_get_field (Prompts[line - 1], buf, sizeof (buf), M_ALIAS) == 0) {
     address_list_wipe(addr);
     *addr = mutt_parse_adrlist (*addr, buf);
@@ -309,7 +197,7 @@ static int edit_address_list (int line, address_t ** addr)
 
   if (option (OPTNEEDREDRAW)) {
     unset_option (OPTNEEDREDRAW);
-    return (REDRAW_FULL);
+    return REDRAW_FULL;
   }
 
   if (mutt_addrlist_to_idna (*addr, &err) != 0) {
@@ -320,9 +208,9 @@ static int edit_address_list (int line, address_t ** addr)
 
   /* redraw the expanded list so the user can see the result */
   buf[0] = 0;
-  rfc822_write_address (buf, sizeof (buf), *addr, 1);
-  move (line, HDR_XOFFSET + SW);
-  mutt_paddstr (W, buf);
+  rfc822_addrcat(buf, sizeof (buf), *addr, 1);
+  wmove (main_w, line, HDR_XOFFSET);
+  mutt_paddstr (main_w, W, buf);
 
   return 0;
 }
@@ -338,7 +226,7 @@ static int delete_attachment (MUTTMENU * menu, short *idxlen, int x)
     mutt_error _("You may not delete the only attachment.");
 
     idx[x]->content->tagged = 0;
-    return (-1);
+    return -1;
   }
 
   for (y = 0; y < *idxlen; y++) {
@@ -373,16 +261,15 @@ static void update_idx (MUTTMENU * menu, ATTACHPTR ** idx, short idxlen)
 }
 
 
-/* 
+/*
  * cum_attachs_size: Cumulative Attachments Size
  *
  * Returns the total number of bytes used by the attachments in the
  * attachment list _after_ content-transfer-encodings have been
  * applied.
- * 
+ *
  */
-
-static unsigned long cum_attachs_size (MUTTMENU * menu)
+static unsigned long cum_attachs_size(MUTTMENU * menu)
 {
   ssize_t s;
   unsigned short i;
@@ -417,27 +304,26 @@ static unsigned long cum_attachs_size (MUTTMENU * menu)
 /*
  * compose_format_str()
  *
- * %a = total number of attachments 
+ * %a = total number of attachments
  * %h = hostname  [option]
- * %l = approx. length of current message (in bytes) 
- * %v = Mutt version 
+ * %l = approx. length of current message (in bytes)
+ * %v = Mutt version
  *
  * This function is similar to status_format_str().  Look at that function for
  * help when modifying this function.
  */
-
 static void compose_status_line (char *buf, ssize_t buflen, MUTTMENU * menu,
                                  const char *p);
 
 static const char *compose_format_str (char *buf, ssize_t buflen, char op,
                                        const char *src, const char *prefix,
-                                       const char *ifstring,
-                                       const char *elsestring,
-                                       unsigned long data, format_flag flags)
+                                       const char *ifstr,
+                                       const char *elstr,
+                                       anytype data, format_flag flags)
 {
-  char fmt[SHORT_STRING], tmp[SHORT_STRING];
+  char fmt[STRING], tmp[STRING];
   int optional = (flags & M_FORMAT_OPTIONAL);
-  MUTTMENU *menu = (MUTTMENU *) data;
+  MUTTMENU *menu = data.ptr;
 
   *buf = 0;
   switch (op) {
@@ -448,7 +334,7 @@ static const char *compose_format_str (char *buf, ssize_t buflen, char op,
 
   case 'h':                    /* hostname */
     snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
-    snprintf (buf, buflen, fmt, NONULL (Hostname));
+    snprintf (buf, buflen, fmt, NONULL(mod_core.shorthost));
     break;
 
   case 'l':                    /* approx length of current message in bytes */
@@ -458,7 +344,7 @@ static const char *compose_format_str (char *buf, ssize_t buflen, char op,
     break;
 
   case 'v':
-    m_strcpy(buf, buflen, mutt_make_version (0));
+    m_strcpy(buf, buflen, mutt_make_version());
     break;
 
   case 0:
@@ -466,14 +352,12 @@ static const char *compose_format_str (char *buf, ssize_t buflen, char op,
     return (src);
 
   default:
-    snprintf (buf, buflen, "%%%s%c", prefix, op);
+    *buf = 0;
     break;
   }
 
-  if (optional)
-    compose_status_line (buf, buflen, menu, ifstring);
-  else if (flags & M_FORMAT_OPTIONAL)
-    compose_status_line (buf, buflen, menu, elsestring);
+  if (flags & M_FORMAT_OPTIONAL)
+    compose_status_line(buf, buflen, menu, optional ? ifstr : elstr);
 
   return (src);
 }
@@ -481,12 +365,9 @@ static const char *compose_format_str (char *buf, ssize_t buflen, char op,
 static void compose_status_line (char *buf, ssize_t buflen, MUTTMENU * menu,
                                  const char *p)
 {
-  int w=(COLS-SW)>buflen?buflen:(COLS-SW);
-  mutt_FormatString (buf, w, p, compose_format_str,
-                     (unsigned long) menu, 0);
+    m_strformat(buf, buflen, getmaxx(main_w), p, compose_format_str, menu, 0);
 }
 
-
 /* return values:
  *
  * 1   message should be postponed
@@ -498,7 +379,6 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
                        ssize_t fcclen,
                        HEADER * cur __attribute__ ((unused)))
 {                               /* current message */
-  char helpstr[SHORT_STRING];
   char buf[LONG_STRING];
   char fname[_POSIX_PATH_MAX];
   MUTTMENU *menu;
@@ -516,13 +396,6 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
   int oldSort, oldSortAux;
   struct stat st;
 
-#ifdef USE_NNTP
-  int news = 0;                 /* is it a news article ? */
-
-  if (option (OPTNEWSSEND))
-    news++;
-#endif
-
   mutt_attach_init (msg->content);
   idx = mutt_gen_attach_list (msg->content, -1, idx, &idxlen, &idxmax, 0, 1);
 
@@ -533,23 +406,8 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
   menu->make_entry = snd_entry;
   menu->tag = mutt_tag_attach;
   menu->data = idx;
-#ifdef USE_NNTP
-  if (news)
-    menu->help =
-      mutt_compile_help (helpstr, sizeof (helpstr), MENU_COMPOSE,
-                         ComposeNewsHelp);
-  else
-#endif
-    menu->help =
-      mutt_compile_help (helpstr, sizeof (helpstr), MENU_COMPOSE,
-                         ComposeHelp);
 
-  if (option (OPTMBOXPANE))
-    buffy_check (0);
   while (loop) {
-#ifdef USE_NNTP
-    unset_option (OPTNEWS);     /* for any case */
-#endif
     switch (op = mutt_menuLoop (menu)) {
     case OP_REDRAW:
       draw_envelope (msg, fcc);
@@ -561,90 +419,17 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
     case OP_COMPOSE_EDIT_TO:
-#ifdef USE_NNTP
-      if (!news) {
-#endif
-        menu->redraw = edit_address_list (HDR_TO, &msg->env->to);
-        mutt_message_hook (NULL, msg, M_SEND2HOOK);
-#ifdef USE_NNTP
-      }
-#endif
+      menu->redraw = edit_address_list (HDR_TO, &msg->env->to);
+      mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
     case OP_COMPOSE_EDIT_BCC:
-#ifdef USE_NNTP
-      if (!news) {
-#endif
-        menu->redraw = edit_address_list (HDR_BCC, &msg->env->bcc);
-        mutt_message_hook (NULL, msg, M_SEND2HOOK);
-#ifdef USE_NNTP
-      }
-#endif
+      menu->redraw = edit_address_list (HDR_BCC, &msg->env->bcc);
+      mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
     case OP_COMPOSE_EDIT_CC:
-#ifdef USE_NNTP
-      if (!news) {
-#endif
-        menu->redraw = edit_address_list (HDR_CC, &msg->env->cc);
-        mutt_message_hook (NULL, msg, M_SEND2HOOK);
-#ifdef USE_NNTP
-      }
-#endif
-      break;
-#ifdef USE_NNTP
-    case OP_COMPOSE_EDIT_NEWSGROUPS:
-      if (news) {
-        if (msg->env->newsgroups)
-          m_strcpy(buf, sizeof(buf), msg->env->newsgroups);
-        else
-          buf[0] = 0;
-        if (mutt_get_field ("Newsgroups: ", buf, sizeof (buf), 0) == 0
-            && buf[0]) {
-          p_delete(&msg->env->newsgroups);
-          m_strrtrim(buf);
-          msg->env->newsgroups = m_strdup(skipspaces(buf));
-          move (HDR_TO, HDR_XOFFSET);
-          clrtoeol ();
-          if (msg->env->newsgroups)
-            printw ("%-*.*s", W, W, msg->env->newsgroups);
-        }
-      }
-      break;
-
-    case OP_COMPOSE_EDIT_FOLLOWUP_TO:
-      if (news) {
-        buf[0] = 0;
-        if (msg->env->followup_to)
-          m_strcpy(buf, sizeof(buf), msg->env->followup_to);
-        if (mutt_get_field ("Followup-To: ", buf, sizeof (buf), 0) == 0
-            && buf[0]) {
-          p_delete(&msg->env->followup_to);
-          m_strrtrim(buf);
-          msg->env->followup_to = m_strdup(skipspaces(buf));
-          move (HDR_CC, HDR_XOFFSET);
-          clrtoeol ();
-          if (msg->env->followup_to)
-            printw ("%-*.*s", W, W, msg->env->followup_to);
-        }
-      }
-      break;
-
-    case OP_COMPOSE_EDIT_X_COMMENT_TO:
-      if (news && option (OPTXCOMMENTTO)) {
-        buf[0] = 0;
-        if (msg->env->x_comment_to)
-          m_strcpy(buf, sizeof(buf), msg->env->x_comment_to);
-        if (mutt_get_field ("X-Comment-To: ", buf, sizeof (buf), 0) == 0
-            && buf[0]) {
-          p_delete(&msg->env->x_comment_to);
-          msg->env->x_comment_to = m_strdup(buf);
-          move (HDR_BCC, HDR_XOFFSET);
-          clrtoeol ();
-          if (msg->env->x_comment_to)
-            printw ("%-*.*s", W, W, msg->env->x_comment_to);
-        }
-      }
+      menu->redraw = edit_address_list (HDR_CC, &msg->env->cc);
+      mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
-#endif
     case OP_COMPOSE_EDIT_SUBJECT:
       if (msg->env->subject)
         m_strcpy(buf, sizeof(buf), msg->env->subject);
@@ -652,10 +437,10 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         buf[0] = 0;
       if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) {
         m_strreplace(&msg->env->subject, buf);
-        move (HDR_SUBJECT, HDR_XOFFSET + SW);
-        clrtoeol ();
+        wmove (main_w, HDR_SUBJECT, HDR_XOFFSET);
+        wclrtoeol (main_w);
         if (msg->env->subject)
-          mutt_paddstr (W, msg->env->subject);
+          mutt_paddstr (main_w, W, msg->env->subject);
       }
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
@@ -668,16 +453,16 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       if (mutt_get_field ("Fcc: ", buf, sizeof (buf), M_FILE | M_CLEAR) == 0) {
         m_strcpy(fcc, _POSIX_PATH_MAX, buf);
         mutt_pretty_mailbox (fcc);
-        move (HDR_FCC, HDR_XOFFSET + SW);
-        mutt_paddstr (W, fcc);
+        wmove (main_w, HDR_FCC, HDR_XOFFSET);
+        mutt_paddstr (main_w, W, fcc);
         fccSet = 1;
       }
       MAYBE_REDRAW (menu->redraw);
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
     case OP_COMPOSE_EDIT_MESSAGE:
-      if (Editor && !option (OPTEDITHDRS)) {
-        mutt_edit_file (Editor, msg->content->filename);
+      if (!option (OPTEDITHDRS)) {
+        mutt_edit_file(msg->content->filename);
         mutt_update_encoding (msg->content);
         menu->redraw = REDRAW_CURRENT | REDRAW_STATUS;
         mutt_message_hook (NULL, msg, M_SEND2HOOK);
@@ -691,8 +476,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         char *err = NULL;
 
         mutt_env_to_local (msg->env);
-        mutt_edit_headers (NONULL (Editor), msg->content->filename, msg,
-                           fcc, fcclen);
+        mutt_edit_headers(msg->content->filename, msg, fcc, fcclen);
         if (mutt_env_to_idna (msg->env, &tag, &err)) {
           mutt_error (_("Bad IDN in \"%s\": '%s'"), tag, err);
           p_delete(&err);
@@ -714,39 +498,12 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
 
       menu->redraw = REDRAW_FULL;
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
-      break;
-
-
-
-    case OP_COMPOSE_ATTACH_KEY:
-      if (idxlen == idxmax) {
-        p_realloc(&idx, idxmax += 5);
-        menu->data = idx;
-      }
-
-      idx[idxlen] = p_new(ATTACHPTR, 1);
-      if ((idx[idxlen]->content =
-           crypt_pgp_make_key_attachment (NULL)) != NULL) {
-        update_idx (menu, idx, idxlen++);
-        menu->redraw |= REDRAW_INDEX;
-      }
-      else
-        p_delete(&idx[idxlen]);
-
-      menu->redraw |= REDRAW_STATUS;
-
-      if (option (OPTNEEDREDRAW)) {
-        menu->redraw = REDRAW_FULL;
-        unset_option (OPTNEEDREDRAW);
-      }
-
-      mutt_message_hook (NULL, msg, M_SEND2HOOK);
-      break;
-
+      break; 
 
     case OP_COMPOSE_ATTACH_FILE:
       {
-        char *prompt, **files;
+        const char *prompt;
+        char **files;
         int error, numfiles;
 
         fname[0] = 0;
@@ -793,31 +550,15 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       break;
 
     case OP_COMPOSE_ATTACH_MESSAGE:
-#ifdef USE_NNTP
-    case OP_COMPOSE_ATTACH_NEWS_MESSAGE:
-#endif
       {
-        char *prompt;
+        const char *prompt;
         HEADER *h;
 
         fname[0] = 0;
         prompt = _("Open mailbox to attach message from");
 
-#ifdef USE_NNTP
-        unset_option (OPTNEWS);
-        if (op == OP_COMPOSE_ATTACH_NEWS_MESSAGE) {
-          if (!(CurrentNewsSrv = mutt_select_newsserver (NewsServer)))
-            break;
-
-          prompt = _("Open newsgroup to attach message from");
-          set_option (OPTNEWS);
-        }
-#endif
 
         if (Context)
-#ifdef USE_NNTP
-          if ((op == OP_COMPOSE_ATTACH_MESSAGE) ^ (Context->magic == M_NNTP))
-#endif
           {
             m_strcpy(fname, sizeof(fname), NONULL(Context->path));
             mutt_pretty_mailbox (fname);
@@ -827,23 +568,14 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
             == -1 || !fname[0])
           break;
 
-#ifdef USE_NNTP
-        if (option (OPTNEWS))
-          nntp_expand_path (fname, sizeof (fname),
-                            &CurrentNewsSrv->conn->account);
-        else
-#endif
-          mutt_expand_path (fname, sizeof (fname));
-        if (mx_get_magic (fname) != M_IMAP)
-          if (mx_get_magic (fname) != M_POP)
-#ifdef USE_NNTP
-            if (mx_get_magic (fname) != M_NNTP && !option (OPTNEWS))
-#endif
+        mutt_expand_path (fname, sizeof (fname));
+        if (mx_get_magic (fname) != M_IMAP && mx_get_magic (fname) != M_POP) {
               /* check to make sure the file exists and is readable */
-              if (access (fname, R_OK) == -1) {
-                mutt_perror (fname);
-                break;
-              }
+          if (access (fname, R_OK) == -1) {
+            mutt_perror (fname);
+            break;
+          }
+        }
 
         menu->redraw = REDRAW_FULL;
 
@@ -857,7 +589,6 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
           mx_close_mailbox (ctx, NULL);
           p_delete(&ctx);
           mutt_error _("No messages in that folder.");
-
           break;
         }
 
@@ -896,7 +627,6 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
               update_idx (menu, idx, idxlen++);
             else {
               mutt_error _("Unable to attach!");
-
               p_delete(&idx[idxlen]);
             }
           }
@@ -914,8 +644,8 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         /* Restore old $sort and $sort_aux */
         Sort = oldSort;
         SortAux = oldSortAux;
+        mutt_message_hook (NULL, msg, M_SEND2HOOK);
       }
-      mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
 
     case OP_DELETE:
@@ -1038,12 +768,6 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         break;
       }
 
-
-#ifdef MIXMASTER
-      if (msg->chain && mix_check_message (msg) != 0)
-        break;
-#endif
-
       if (!fccSet && *fcc) {
         if ((i = query_quadoption (OPT_COPY,
                                    _("Save a copy of this message?"))) == -1)
@@ -1058,7 +782,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
 
     case OP_COMPOSE_EDIT_FILE:
       CHECK_COUNT;
-      mutt_edit_file (NONULL (Editor), idx[menu->current]->content->filename);
+      mutt_edit_file(idx[menu->current]->content->filename);
       mutt_update_encoding (idx[menu->current]->content);
       menu->redraw = REDRAW_CURRENT | REDRAW_STATUS;
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
@@ -1122,7 +846,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         int itype;
         FILE *fp;
 
-        CLEARLINE (LINES - 1);
+        CLEARLINE(main_w, LINES - 1);
         fname[0] = 0;
         if (mutt_get_field (_("New file: "), fname, sizeof (fname), M_FILE)
             != 0 || !fname[0])
@@ -1266,20 +990,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       r = 1;
       break;
 
-    case OP_COMPOSE_ISPELL:
-      endwin ();
-      snprintf (buf, sizeof (buf), "%s -x %s", NONULL (Ispell),
-                msg->content->filename);
-      if (mutt_system (buf) == -1)
-        mutt_error (_("Error running \"%s\"!"), buf);
-      else {
-        mutt_update_encoding (msg->content);
-        menu->redraw |= REDRAW_STATUS;
-      }
-      break;
-
     case OP_COMPOSE_WRITE_MESSAGE:
-
       fname[0] = '\0';
       if (Context) {
         m_strcpy(fname, sizeof(fname), NONULL(Context->path));
@@ -1296,15 +1007,13 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         if (msg->content->next)
           msg->content = mutt_make_multipart (msg->content);
 
-        if (mutt_write_fcc (NONULL (fname), msg, NULL, 1, NULL) < 0)
+        if (mutt_write_fcc (fname, msg, NULL, 1, NULL) < 0)
           msg->content = mutt_remove_multipart (msg->content);
         else
           mutt_message _("Message written.");
       }
       break;
 
-
-
     case OP_COMPOSE_PGP_MENU:
       if (msg->security & APPLICATION_SMIME) {
         if (mutt_yesorno (_("S/MIME already selected. Clear & continue ? "),
@@ -1314,17 +1023,11 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         }
         msg->security = 0;
       }
-      msg->security = crypt_pgp_send_menu (msg, &menu->redraw);
+      msg->security = crypt_send_menu (msg, &menu->redraw, 0);
       redraw_crypt_lines (msg);
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
 
-
-    case OP_FORGET_PASSPHRASE:
-      crypt_forget_passphrase ();
-      break;
-
-
     case OP_COMPOSE_SMIME_MENU:
       if (msg->security & APPLICATION_PGP) {
         if (mutt_yesorno (_("PGP already selected. Clear & continue ? "),
@@ -1334,30 +1037,19 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         }
         msg->security = 0;
       }
-      msg->security = crypt_smime_send_menu (msg, &menu->redraw);
+      msg->security = crypt_send_menu(msg, &menu->redraw, 1);
       redraw_crypt_lines (msg);
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
-
-
-#ifdef MIXMASTER
-    case OP_COMPOSE_MIX:
-
-      mix_make_chain (&msg->chain, &menu->redraw);
-      mutt_message_hook (NULL, msg, M_SEND2HOOK);
-      break;
-#endif
-
     }
 
     /* Draw formated compose status line */
     if (menu->redraw & REDRAW_STATUS) {
       compose_status_line (buf, sizeof (buf), menu, NONULL (ComposeFormat));
-      CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES - 2);
-      SETCOLOR (MT_COLOR_STATUS);
-      move (option (OPTSTATUSONTOP) ? 0 : LINES - 2, SW);
-      printw ("%-*.*s", COLS-SW, COLS-SW, buf);
-      SETCOLOR (MT_COLOR_NORMAL);
+      CLEARLINE(main_w, 0);
+      SETCOLOR(main_w, MT_COLOR_STATUS);
+      mvwprintw (main_w, 0, 0, "%-*.*s", getmaxx(main_w), getmaxx(main_w), buf);
+      SETCOLOR(main_w, MT_COLOR_NORMAL);
       menu->redraw &= ~REDRAW_STATUS;
     }
   }
@@ -1370,9 +1062,9 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       idx[i]->content->aptr = NULL;
       p_delete(&idx[i]);
     }
-  }
-  else
+  } else {
     msg->content = NULL;
+  }
 
   p_delete(&idx);