X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=curs_main.c;h=4341a71a94997eda147d56d63c492a5c851ba1b3;hp=7720241dd8840ea332bcc9ea2d9a5d771a5e86a8;hb=d5d56308b49c3f157a17125415312f0c13e1e25b;hpb=df70e07e24add1869bcc9b7af2277d9d0c09a281 diff --git a/curs_main.c b/curs_main.c index 7720241..4341a71 100644 --- a/curs_main.c +++ b/curs_main.c @@ -1,50 +1,51 @@ /* + * Copyright notice from original mutt: * Copyright (C) 1996-2000 Michael R. Elkins - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * + * Parts were written/modified by: + * Nico Golde + * + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * 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 "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" -#endif +#include -#ifdef USE_IMAP -#include "imap_private.h" -#endif - -#include "mutt_crypt.h" +#include #ifdef USE_NNTP #include "nntp.h" #endif +#ifdef USE_SASL +#include "mutt_sasl.h" +#endif + +#include "lib/debug.h" #include #include @@ -61,9 +62,16 @@ static const char *Function_not_permitted_in_attach_message_mode = N_("Function not permitted in attach-message mode."); static const char *No_visible = N_("No visible messages."); +#define CHECK_IN_MAILBOX if (!Context) \ + { \ + mutt_flushinp (); \ + mutt_error (_(No_mailbox_is_open)); \ + break; \ + } + #define CHECK_MSGCOUNT if (!Context) \ { \ - mutt_flushinp (); \ + mutt_flushinp (); \ mutt_error(_(No_mailbox_is_open)); \ break; \ } \ @@ -89,17 +97,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 (); \ @@ -110,26 +107,10 @@ static const char *No_visible = N_("No visible messages."); #define CURHDR Context->hdrs[Context->v2r[menu->current]] #define OLDHDR Context->hdrs[Context->v2r[menu->oldcurrent]] #define UNREAD(h) mutt_thread_contains_unread (Context, h) +#define SW (option(OPTMBOXPANE)?SidebarWidth:0) -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 = @@ -276,7 +257,7 @@ static int mx_toggle_write (CONTEXT * ctx) return 0; } -static void update_index (MUTTMENU * menu, CONTEXT * ctx, int check, +static void update_index (MUTTMENU * menu, CONTEXT * ctx __attribute__ ((unused)), int check, int oldcount, int index_hint) { /* store pointers to the newly added messages */ @@ -296,19 +277,16 @@ static void update_index (MUTTMENU * menu, CONTEXT * ctx, int check, * they will be visible in the limited view */ if (Context->pattern) { #define THIS_BODY Context->hdrs[j]->content - if (oldcount || check == M_REOPENED) { - for (j = (check == M_REOPENED) ? 0 : oldcount; j < Context->msgcount; - j++) { - if (mutt_pattern_exec - (Context->limit_pattern, M_MATCH_FULL_ADDRESS, Context, - Context->hdrs[j])) { - Context->hdrs[j]->virtual = Context->vcount; - Context->v2r[Context->vcount] = j; - Context->hdrs[j]->limited = 1; - Context->vcount++; - Context->vsize += - THIS_BODY->length + THIS_BODY->offset - THIS_BODY->hdr_offset; - } + for (j = (check == M_REOPENED) ? 0 : oldcount; j < Context->msgcount; j++) { + if (mutt_pattern_exec + (Context->limit_pattern, M_MATCH_FULL_ADDRESS, Context, + Context->hdrs[j])) { + Context->hdrs[j]->virtual = Context->vcount; + Context->v2r[Context->vcount] = j; + Context->hdrs[j]->limited = 1; + Context->vcount++; + Context->vsize += + THIS_BODY->length + THIS_BODY->offset - THIS_BODY->hdr_offset; } } #undef THIS_BODY @@ -316,9 +294,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 *) * - (Context->msgcount - oldcount)); + save_new = p_new(HEADER*, Context->msgcount - oldcount); for (j = oldcount; j < Context->msgcount; j++) save_new[j - oldcount] = Context->hdrs[j]; } @@ -329,13 +305,13 @@ static void update_index (MUTTMENU * menu, CONTEXT * ctx, int check, /* uncollapse threads with new mail */ if ((Sort & SORT_MASK) == SORT_THREADS) { if (check == M_REOPENED) { - THREAD *h, *j; + THREAD *h, *c; Context->collapsed = 0; for (h = Context->tree; h; h = h->next) { - for (j = h; !j->message; j = j->child); - mutt_uncollapse_thread (Context, j->message); + for (c = h; !c->message; c = c->child); + mutt_uncollapse_thread (Context, c->message); } mutt_set_virtual (Context); } @@ -350,7 +326,7 @@ static void update_index (MUTTMENU * menu, CONTEXT * ctx, int check, mutt_uncollapse_thread (Context, h); } } - FREE (&save_new); + p_delete(&save_new); mutt_set_virtual (Context); } } @@ -368,7 +344,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) @@ -405,7 +380,7 @@ struct mapping_t IndexHelp[] = { {N_("Reply"), OP_REPLY}, {N_("Group"), OP_GROUP_REPLY}, {N_("Help"), OP_HELP}, - {NULL} + {NULL, OP_NULL} }; #ifdef USE_NNTP @@ -418,7 +393,7 @@ struct mapping_t IndexNewsHelp[] = { {N_("Followup"), OP_FOLLOWUP}, {N_("Catchup"), OP_CATCHUP}, {N_("Help"), OP_HELP}, - {NULL} + {NULL, OP_NULL} }; #endif @@ -440,14 +415,14 @@ int mutt_index_menu (void) char *cp; /* temporary variable. */ int index_hint; /* used to restore cursor position */ int do_buffy_notify = 1; - int close = 0; /* did we OP_QUIT or OP_EXIT out of this menu? */ + int closed = 0; /* did we OP_QUIT or OP_EXIT out of this menu? */ int attach_msg = option (OPTATTACHMSG); menu = mutt_new_menu (); menu->menu = MENU_MAIN; menu->offset = 1; menu->pagelen = LINES - 3; - menu->make_entry = index_make_entry; + menu->make_entry = (void *) index_make_entry; menu->color = index_color; menu->current = ci_first_message (); menu->help = mutt_compile_help (helpstr, sizeof (helpstr), MENU_MAIN, @@ -459,13 +434,13 @@ 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) - set_curbuffy (Context->path); + sidebar_set_current (Context->path); } - FOREVER { + for (;;) { tag = 0; /* clear the tag-prefix */ menu->max = Context ? Context->vcount : 0; @@ -493,9 +468,7 @@ int mutt_index_menu (void) * modified underneath us.) */ -#ifdef USE_IMAP imap_allow_reopen (Context); -#endif index_hint = (Context->vcount && menu->current >= 0 && menu->current < Context->vcount) ? CURHDR->index : 0; @@ -503,7 +476,7 @@ int mutt_index_menu (void) if ((check = mx_check_mailbox (Context, &index_hint, 0)) < 0) { if (!Context->path) { /* fatal error occurred */ - FREE (&Context); + p_delete(&Context); menu->redraw = REDRAW_FULL; } set_option (OPTSEARCHINVALID); @@ -517,7 +490,7 @@ int mutt_index_menu (void) ("Mailbox was externally modified. Flags may be wrong.")); else if (check == M_NEW_MAIL) { /* on new mail: redraw sidebar */ - draw_sidebar (CurrentMenu); + sidebar_draw (CurrentMenu); mutt_message (_("New mail in this mailbox.")); if (option (OPTBEEPNEW)) @@ -536,20 +509,18 @@ int mutt_index_menu (void) } } -#ifdef USE_IMAP imap_keepalive (); imap_disallow_reopen (Context); -#endif 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 @@ -559,10 +530,10 @@ int mutt_index_menu (void) if (op != -1) mutt_curs_set (0); if (menu->redraw & REDRAW_SIDEBAR) - draw_sidebar (menu->menu); + sidebar_draw (menu->menu); if (menu->redraw & REDRAW_FULL) { menu_redraw_full (menu); - draw_sidebar (menu->menu); + sidebar_draw (menu->menu); mutt_show_error (); } @@ -581,20 +552,22 @@ int mutt_index_menu (void) } if (menu->redraw & REDRAW_STATUS) { - DrawFullLine = 1; menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); - DrawFullLine = 0; CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES - 2); + sidebar_draw_frames(); SETCOLOR (MT_COLOR_STATUS); - mutt_paddstr (COLS, buf); + BKGDSET (MT_COLOR_STATUS); + move(option (OPTSTATUSONTOP) ? 0 : LINES - 2,SW); + mutt_paddstr (COLS-SW, buf); SETCOLOR (MT_COLOR_NORMAL); - set_buffystats (Context); + 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); } } @@ -606,15 +579,12 @@ 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)); - #if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM) if (SigWinch) { mutt_flushinp (); @@ -632,6 +602,10 @@ int mutt_index_menu (void) } #endif + op = km_dokey (MENU_MAIN); + + debug_print (4, ("Got op %d\n", op)); + if (op == -1) continue; /* either user abort or timeout */ @@ -772,7 +746,7 @@ int mutt_index_menu (void) if (op == OP_GET_MESSAGE) { buf[0] = 0; - if (mutt_get_field (_("Enter Message-Id: "), buf, sizeof (buf), 0) + if (mutt_get_field (_("Enter Message-ID: "), buf, sizeof (buf), 0) != 0 || !buf[0]) break; } @@ -784,7 +758,7 @@ int mutt_index_menu (void) break; } - strfcpy (buf, ref->data, sizeof (buf)); + m_strcpy(buf, sizeof(buf), ref->data); } if (!Context->id_hash) Context->id_hash = mutt_make_id_hash (Context); @@ -823,14 +797,14 @@ int mutt_index_menu (void) int old = CURHDR->index, i; if (!CURHDR->env->message_id) { - mutt_error (_("No Message-Id. Unable to perform operation")); + mutt_error (_("No Message-ID. Unable to perform operation")); break; } if (!Context->id_hash) Context->id_hash = mutt_make_id_hash (Context); - strfcpy (buf, CURHDR->env->message_id, sizeof (buf)); + m_strcpy(buf, sizeof(buf), CURHDR->env->message_id); if (op == OP_RECONSTRUCT_THREAD) { LIST *ref = CURHDR->env->references; @@ -839,7 +813,7 @@ int mutt_index_menu (void) nntp_check_msgid (Context, ref->data); /* the last msgid in References is the root message */ if (!ref->next) - strfcpy (buf, ref->data, sizeof (buf)); + m_strcpy(buf, sizeof(buf), ref->data); ref = ref->next; } } @@ -924,23 +898,19 @@ 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: ")); menu->redraw = REDRAW_INDEX | REDRAW_STATUS; break; -#ifdef USE_POP case OP_MAIN_FETCH_MAIL: CHECK_ATTACH; pop_fetch_mail (); menu->redraw = REDRAW_FULL; break; -#endif /* USE_POP */ case OP_HELP: @@ -949,43 +919,43 @@ int mutt_index_menu (void) break; case OP_MAIN_SHOW_LIMIT: - CHECK_MSGCOUNT; + CHECK_IN_MAILBOX; if (!Context->pattern) mutt_message (_("No limit pattern is in effect.")); else { - char buf[STRING]; + char buffer[STRING]; /* i18n: ask for a limit to apply */ - snprintf (buf, sizeof (buf), _("Limit: %s"), Context->pattern); - mutt_message ("%s", buf); + snprintf (buffer, sizeof (buffer), _("Limit: %s"), Context->pattern); + mutt_message ("%s", buffer); } break; case OP_MAIN_LIMIT: case OP_TOGGLE_READ: - CHECK_MSGCOUNT; + CHECK_IN_MAILBOX; menu->oldcurrent = (Context->vcount && menu->current >= 0 && menu->current < Context->vcount) ? CURHDR->index : -1; if (op == OP_TOGGLE_READ) { - char buf[LONG_STRING]; + char buffer[LONG_STRING]; if (!Context->pattern || strncmp (Context->pattern, "!~R!~D~s", 8) != 0) { - snprintf (buf, sizeof (buf), "!~R!~D~s%s", + snprintf (buffer, sizeof (buffer), "!~R!~D~s%s", Context->pattern ? Context->pattern : ".*"); set_option (OPTHIDEREAD); } else { - strfcpy (buf, Context->pattern + 8, sizeof (buf)); + m_strcpy(buf, sizeof(buf), Context->pattern + 8); if (!*buf || strncmp (buf, ".*", 2) == 0) snprintf (buf, sizeof (buf), "~A"); unset_option (OPTHIDEREAD); } - FREE (&Context->pattern); - Context->pattern = safe_strdup (buf); + p_delete(&Context->pattern); + Context->pattern = m_strdup(buf); } if ((op == OP_TOGGLE_READ && mutt_pattern_func (M_LIMIT, NULL) == 0) || mutt_pattern_func (M_LIMIT, _("Limit to messages matching: ")) == 0) @@ -1004,15 +974,17 @@ int mutt_index_menu (void) else menu->current = 0; menu->redraw = REDRAW_INDEX | REDRAW_STATUS; - if ((Sort & SORT_MASK) == SORT_THREADS) + if (Context->msgcount && (Sort & SORT_MASK) == SORT_THREADS) mutt_draw_tree (Context); menu->redraw = REDRAW_FULL; } + if (Context->pattern) + mutt_message _("To view all messages, limit to \"all\"."); break; case OP_QUIT: - close = op; + closed = op; if (attach_msg) { done = 1; break; @@ -1104,9 +1076,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) @@ -1125,12 +1095,10 @@ int mutt_index_menu (void) * The following operations can be performed inside of the pager. */ -#ifdef USE_IMAP case OP_MAIN_IMAP_FETCH: if (Context->magic == M_IMAP) imap_check_mailbox (Context, &index_hint, 1); break; -#endif case OP_MAIN_SYNC_FOLDER: @@ -1142,7 +1110,7 @@ int mutt_index_menu (void) CHECK_READONLY; { int oldvcount = Context->vcount; - int oldcount = Context->msgcount; + oldcount = Context->msgcount; int dcount = 0; int check; @@ -1172,7 +1140,7 @@ int mutt_index_menu (void) /* check for a fatal error, or all messages deleted */ if (!Context->path) - FREE (&Context); + p_delete(&Context); /* if we were in the pager, redisplay the message */ if (menu->menu == MENU_PAGER) { @@ -1215,24 +1183,27 @@ 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)); + m_strcpy(buf, sizeof(buf), Context->path); + if (op != OP_SIDEBAR_OPEN) + buffy_next (buf, sizeof (buf)); } if (op == OP_SIDEBAR_OPEN) { - if (!CurBuffy) + m_strcpy(buf, sizeof(buf), sidebar_get_current()); + } + else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) { + if (menu->menu == MENU_PAGER) { + op = OP_DISPLAY_MESSAGE; + continue; + } else break; - strncpy (buf, CurBuffy->path, sizeof (buf)); } - else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == - -1) - break; if (!buf[0]) { CLEARLINE (LINES - 1); break; @@ -1246,23 +1217,19 @@ int mutt_index_menu (void) else #endif mutt_expand_path (buf, sizeof (buf)); - set_curbuffy (buf); if (mx_get_magic (buf) <= 0) { mutt_error (_("%s is not a mailbox."), buf); break; } - mutt_str_replace (&CurrentFolder, buf); + m_strreplace(&CurrentFolder, buf); if (Context) { int check; -#ifdef USE_COMPRESSED if (Context->compressinfo && Context->realpath) - mutt_str_replace (&LastFolder, Context->realpath); + m_strreplace(&LastFolder, Context->realpath); else -#endif - - mutt_str_replace (&LastFolder, Context->path); + m_strreplace(&LastFolder, Context->path); oldcount = Context ? Context->msgcount : 0; if ((check = mx_close_mailbox (Context, &index_hint)) != 0) { @@ -1273,7 +1240,7 @@ int mutt_index_menu (void) menu->redraw = REDRAW_INDEX | REDRAW_STATUS; break; } - FREE (&Context); + p_delete(&Context); } mutt_sleep (0); @@ -1291,9 +1258,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 == @@ -1301,7 +1269,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); @@ -1328,6 +1296,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; @@ -1339,7 +1311,7 @@ int mutt_index_menu (void) case OP_EXIT: - close = op; + closed = op; if (menu->menu == MENU_MAIN && attach_msg) { done = 1; break; @@ -1351,7 +1323,7 @@ int mutt_index_menu (void) { if (Context) { mx_fastclose_mailbox (Context); - FREE (&Context); + p_delete(&Context); } done = 1; } @@ -1525,9 +1497,6 @@ int mutt_index_menu (void) case OP_DECRYPT_COPY: case OP_DECRYPT_SAVE: - if (!WithCrypto) - break; - /* fall thru */ case OP_COPY_MESSAGE: case OP_SAVE: case OP_DECODE_COPY: @@ -1654,27 +1623,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++) { @@ -1707,9 +1656,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++) { @@ -1747,7 +1694,7 @@ int mutt_index_menu (void) case OP_TOGGLE_WRITE: - CHECK_MSGCOUNT; + CHECK_IN_MAILBOX; if (mx_toggle_write (Context) == 0) menu->redraw |= REDRAW_STATUS; break; @@ -1816,10 +1763,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; @@ -1953,9 +1896,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); @@ -1995,9 +1936,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); @@ -2048,27 +1987,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))) @@ -2083,6 +2002,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; @@ -2097,6 +2020,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; @@ -2107,6 +2035,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; @@ -2120,8 +2053,6 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE); break; case OP_MAIL_KEY: - if (!(WithCrypto & APPLICATION_PGP)) - break; CHECK_ATTACH; ci_send_message (SENDKEY, NULL, NULL, NULL, NULL); menu->redraw = REDRAW_FULL; @@ -2129,8 +2060,6 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE); case OP_EXTRACT_KEYS: - if (!WithCrypto) - break; CHECK_MSGCOUNT; CHECK_VISIBLE; crypt_extract_keys_from_messages (tag ? NULL : CURHDR); @@ -2139,8 +2068,6 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE); case OP_CHECK_TRADITIONAL: - if (!(WithCrypto & APPLICATION_PGP)) - break; CHECK_MSGCOUNT; CHECK_VISIBLE; if (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)) @@ -2157,6 +2084,12 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE); CHECK_MSGCOUNT; CHECK_VISIBLE; mutt_pipe_message (tag ? NULL : CURHDR); + /* in an IMAP folder index with imap_peek=no, piping could change + * * new or old messages status to read. Redraw what's needed. + */ + if (Context->magic == M_IMAP && !option (OPTIMAPPEEK)) { + menu->redraw = (tag ? REDRAW_INDEX : REDRAW_CURRENT) | REDRAW_STATUS; + } MAYBE_REDRAW (menu->redraw); break; @@ -2165,6 +2098,12 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE); CHECK_MSGCOUNT; CHECK_VISIBLE; mutt_print_message (tag ? NULL : CURHDR); + /* in an IMAP folder index with imap_peek=no, piping could change + * * new or old messages status to read. Redraw what's needed. + */ + if (Context->magic == M_IMAP && !option (OPTIMAPPEEK)) { + menu->redraw = (tag ? REDRAW_INDEX : REDRAW_CURRENT) | REDRAW_STATUS; + } break; case OP_MAIN_READ_THREAD: @@ -2174,9 +2113,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); @@ -2230,7 +2167,7 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE); sleep (2); } else if (op != OP_FOLLOWUP || !CURHDR->env->followup_to || - mutt_strcasecmp (CURHDR->env->followup_to, "poster") || + m_strcasecmp(CURHDR->env->followup_to, "poster") || query_quadoption (OPT_FOLLOWUPTOPOSTER, _("Reply by mail as poster prefers?")) != M_YES) { @@ -2262,6 +2199,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; @@ -2297,9 +2239,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); @@ -2326,9 +2266,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) @@ -2354,7 +2292,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; @@ -2374,13 +2314,17 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE); mutt_what_key (); break; + case OP_REBUILD_CACHE: + mx_rebuild_cache (); + break; + case OP_SIDEBAR_SCROLL_UP: case OP_SIDEBAR_SCROLL_DOWN: case OP_SIDEBAR_NEXT: case OP_SIDEBAR_PREV: case OP_SIDEBAR_NEXT_NEW: case OP_SIDEBAR_PREV_NEW: - scroll_sidebar (op, menu->menu); + sidebar_scroll (op, menu->menu); break; default: if (menu->menu == MENU_MAIN) @@ -2399,19 +2343,20 @@ CHECK_IMAP_ACL(IMAP_ACL_WRITE); break; } -#ifdef USE_IMAP + if (!attach_msg) { /* Close all open IMAP connections */ - if (!attach_msg) imap_logout_all (); -#endif #ifdef USE_NNTP /* Close all open NNTP connections */ - if (!attach_msg) nntp_logout_all (); #endif +#ifdef USE_SASL + mutt_sasl_done (); +#endif + } mutt_menuDestroy (&menu); - return (close); + return (closed); } void mutt_set_header_color (CONTEXT * ctx, HEADER * curhdr)