--- a/buffy.c
+++ b/buffy.c
-@@ -292,6 +292,7 @@
- char path[_POSIX_PATH_MAX];
- struct stat contex_sb;
- time_t t;
-+ CONTEXT *ctx;
+@@ -312,6 +312,10 @@
+ return 0;
+ }
- sb.st_size=0;
- contex_sb.st_dev=0;
-@@ -331,6 +332,8 @@
-
- for (tmp = Incoming; tmp; tmp = tmp->next)
++ mailbox->msgcount = 0;
++ mailbox->msg_unread = 0;
++ mailbox->msg_flagged = 0;
++
+ while ((de = readdir (dirp)) != NULL)
{
-+ if ( tmp->new == 1 )
-+ tmp->has_new = 1;
- #ifdef USE_IMAP
- if (tmp->magic != M_IMAP)
- #endif
-@@ -388,10 +391,27 @@
- case M_MBOX:
- case M_MMDF:
+ if (*de->d_name == '.')
+@@ -329,7 +333,9 @@
+ continue;
+ }
+ /* one new and undeleted message is enough */
+- mailbox->new = 1;
++ mailbox->has_new = mailbox->new = 1;
++ mailbox->msgcount++;
++ mailbox->msg_unread++;
+ rc = 1;
+ break;
+ }
+@@ -337,6 +343,34 @@
-- if (STAT_CHECK)
-+ {
-+ if (STAT_CHECK || tmp->msgcount == 0)
- {
-- BuffyCount++;
-- tmp->new = 1;
-+ BUFFY b = *tmp;
+ closedir (dirp);
+
++ /*
++ * count read messages (for folderlist (sidebar) we also need to count
++ * messages in cur so that we the total number of messages
++ */
++ snprintf (path, sizeof (path), "%s/cur", mailbox->path);
++ if ((dirp = opendir (path)) == NULL)
++ {
++ mailbox->magic = 0;
++ }
++ while ((de = readdir (dirp)) != NULL)
++ {
++ char *p;
++ if (*de->d_name != '.') {
++ if ((p = strstr (de->d_name, ":2,"))) {
++ if (!strchr (p + 3, 'T')) {
++ mailbox->msgcount++;
++ if ( !strchr (p + 3, 'S'))
++ mailbox->msg_unread++;
++ if (strchr(p + 3, 'F'))
++ mailbox->msg_flagged++;
++ }
++ } else
++ mailbox->msgcount++;
++ }
++ }
++
++ closedir (dirp);
++
+ return rc;
+ }
+
+@@ -345,14 +379,33 @@
+ {
+ int rc = 0;
+ int statcheck;
++ CONTEXT *ctx;
+
+ if (option (OPTCHECKMBOXSIZE))
+ statcheck = sb->st_size > mailbox->size;
+ else
+ statcheck = sb->st_mtime > sb->st_atime
+ || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime);
+- if (statcheck)
++ if (statcheck || mailbox->msgcount == 0)
+ {
++ BUFFY b = *mailbox;
+ int msgcount = 0;
+ int msg_unread = 0;
+ /* parse the mailbox, to see how much mail there is */
-+ ctx = mx_open_mailbox( tmp->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL);
++ ctx = mx_open_mailbox( mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL);
+ if(ctx)
+ {
-+ msgcount = ctx->msgcount;
++ msgcount = ctx->msgcount;
+ msg_unread = ctx->unread;
+ mx_close_mailbox(ctx, 0);
+ }
-+ *tmp = b;
-+ tmp->msgcount = msgcount;
-+ tmp->msg_unread = msg_unread;
-+ if(STAT_CHECK) {
-+ tmp->has_new = tmp->new = 1;
-+ BuffyCount++;
-+ }
- }
- else if (option(OPTCHECKMBOXSIZE))
- {
-@@ -401,35 +421,86 @@
- if (tmp->newly_created &&
- (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
- tmp->newly_created = 0;
--
-+ }
- break;
-
- case M_MAILDIR:
-
-+ /* count new message */
- snprintf (path, sizeof (path), "%s/new", tmp->path);
- if ((dirp = opendir (path)) == NULL)
- {
- tmp->magic = 0;
- break;
- }
-+ tmp->msgcount = 0;
-+ tmp->msg_unread = 0;
-+ tmp->msg_flagged = 0;
- while ((de = readdir (dirp)) != NULL)
- {
- char *p;
- if (*de->d_name != '.' &&
- (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
- {
-- /* one new and undeleted message is enough */
-- BuffyCount++;
-- tmp->new = 1;
-- break;
-+ tmp->has_new = tmp->new = 1;
-+ tmp->msgcount++;
-+ tmp->msg_unread++;
-+ }
-+ }
-+ if(tmp->msg_unread)
-+ BuffyCount++;
-+
-+ closedir (dirp);
-+
-+ /*
-+ * count read messages (for folderlist (sidebar) we also need to count
-+ * messages in cur so that we the total number of messages
-+ */
-+ snprintf (path, sizeof (path), "%s/cur", tmp->path);
-+ if ((dirp = opendir (path)) == NULL)
-+ {
-+ tmp->magic = 0;
-+ break;
-+ }
-+ while ((de = readdir (dirp)) != NULL)
-+ {
-+ char *p;
-+ if (*de->d_name != '.') {
-+ if ((p = strstr (de->d_name, ":2,"))) {
-+ if (!strchr (p + 3, 'T')) {
-+ tmp->msgcount++;
-+ if ( !strchr (p + 3, 'S'))
-+ tmp->msg_unread++;
-+ if (strchr(p + 3, 'F'))
-+ tmp->msg_flagged++;
-+ }
-+ } else
-+ tmp->msgcount++;
- }
- }
- closedir (dirp);
- break;
++ *mailbox = b;
++ mailbox->msgcount = msgcount;
++ mailbox->msg_unread = msg_unread;
++ if(statcheck)
++ {
++ mailbox->has_new = mailbox->new = 1;
++ }
+ if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited)
+ {
+ rc = 1;
+@@ -374,9 +427,11 @@
+ int mutt_buffy_check (int force)
+ {
+ BUFFY *tmp;
++ struct dirent *de, *dp;
+ struct stat sb;
+ struct stat contex_sb;
+ time_t t;
++ CONTEXT *ctx;
+ sb.st_size=0;
+ contex_sb.st_dev=0;
+@@ -456,6 +511,20 @@
case M_MH:
-+ {
-+ DIR *dp;
-+ struct dirent *de;
if ((tmp->new = mh_buffy (tmp->path)) > 0)
BuffyCount++;
+
-+ if ((dp = opendir (path)) == NULL)
-+ break;
-+ tmp->msgcount = 0;
-+ while ((de = readdir (dp)))
-+ {
-+ if (mh_valid_message (de->d_name))
-+ {
-+ tmp->msgcount++;
-+ tmp->has_new = tmp->new = 1;
-+ }
-+ }
-+ closedir (dp);
-+ }
++ if ((dp = opendir (tmp->path)) == NULL)
++ break;
++ tmp->msgcount = 0;
++ while ((de = readdir (dp)))
++ {
++ if (mh_valid_message (de->d_name))
++ {
++ tmp->msgcount++;
++ tmp->has_new = tmp->new = 1;
++ }
++ }
++ closedir (dp);
++
break;
}
}
static char *Prompts[] =
{
-@@ -115,16 +115,16 @@
- if ((WithCrypto & APPLICATION_PGP) && (WithCrypto & APPLICATION_SMIME))
- {
- if (!msg->security)
-- mvaddstr (HDR_CRYPT, 0, "Security: ");
-+ mvaddstr (HDR_CRYPT, SidebarWidth, "Security: ");
- else if (msg->security & APPLICATION_SMIME)
-- mvaddstr (HDR_CRYPT, 0, " S/MIME: ");
-+ mvaddstr (HDR_CRYPT, SidebarWidth, " S/MIME: ");
- else if (msg->security & APPLICATION_PGP)
-- mvaddstr (HDR_CRYPT, 0, " PGP: ");
-+ mvaddstr (HDR_CRYPT, SidebarWidth, " PGP: ");
+@@ -112,7 +112,7 @@
+ {
+ int off = 0;
+
+- mvaddstr (HDR_CRYPT, 0, "Security: ");
++ mvaddstr (HDR_CRYPT, SidebarWidth, "Security: ");
+
+ if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0)
+ {
+@@ -144,7 +144,7 @@
}
- else if ((WithCrypto & APPLICATION_SMIME))
-- mvaddstr (HDR_CRYPT, 0, " S/MIME: ");
-+ mvaddstr (HDR_CRYPT, SidebarWidth, " S/MIME: ");
- else if ((WithCrypto & APPLICATION_PGP))
-- mvaddstr (HDR_CRYPT, 0, " PGP: ");
-+ mvaddstr (HDR_CRYPT, SidebarWidth, " PGP: ");
- else
- return;
-@@ -148,7 +148,7 @@
- }
clrtoeol ();
-
- move (HDR_CRYPTINFO, 0);
+ move (HDR_CRYPTINFO, SidebarWidth);
clrtoeol ();
+
if ((WithCrypto & APPLICATION_PGP)
- && msg->security & APPLICATION_PGP && msg->security & SIGN)
-@@ -164,7 +164,7 @@
+@@ -161,7 +161,7 @@
&& (msg->security & ENCRYPT)
&& SmimeCryptAlg
&& *SmimeCryptAlg) {
NONULL(SmimeCryptAlg));
off = 20;
}
-@@ -178,7 +178,7 @@
+@@ -175,7 +175,7 @@
int c;
char *t;
if (!chain)
{
-@@ -193,7 +193,7 @@
+@@ -190,7 +190,7 @@
if (t && t[0] == '0' && t[1] == '\0')
t = "<random>";
break;
addstr (NONULL(t));
-@@ -245,7 +245,7 @@
+@@ -242,7 +242,7 @@
buf[0] = 0;
rfc822_write_address (buf, sizeof (buf), addr, 1);
mutt_paddstr (W, buf);
}
-@@ -255,10 +255,10 @@
+@@ -252,10 +252,10 @@
draw_envelope_addr (HDR_TO, msg->env->to);
draw_envelope_addr (HDR_CC, msg->env->cc);
draw_envelope_addr (HDR_BCC, msg->env->bcc);
mutt_paddstr (W, fcc);
if (WithCrypto)
-@@ -269,7 +269,7 @@
+@@ -266,7 +266,7 @@
#endif
SETCOLOR (MT_COLOR_STATUS);
BKGDSET (MT_COLOR_STATUS);
clrtoeol ();
-@@ -307,7 +307,7 @@
+@@ -304,7 +304,7 @@
/* redraw the expanded list so the user can see the result */
buf[0] = 0;
rfc822_write_address (buf, sizeof (buf), *addr, 1);
mutt_paddstr (W, buf);
return 0;
-@@ -552,7 +552,7 @@
+@@ -549,7 +549,7 @@
if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0)
{
mutt_str_replace (&msg->env->subject, buf);
clrtoeol ();
if (msg->env->subject)
mutt_paddstr (W, msg->env->subject);
-@@ -569,7 +569,7 @@
+@@ -566,7 +566,7 @@
{
strfcpy (fcc, buf, fcclen);
mutt_pretty_mailbox (fcc, fcclen);
#ifdef USE_POP
#include "pop.h"
-@@ -536,8 +538,12 @@
+@@ -532,8 +534,12 @@
menu->redraw |= REDRAW_STATUS;
if (do_buffy_notify)
{
}
else
do_buffy_notify = 1;
-@@ -549,6 +555,7 @@
+@@ -545,6 +551,7 @@
if (menu->redraw & REDRAW_FULL)
{
menu_redraw_full (menu);
mutt_show_error ();
}
-@@ -571,10 +578,13 @@
+@@ -567,10 +574,13 @@
if (menu->redraw & REDRAW_STATUS)
{
mutt_paddstr (COLS, buf);
SETCOLOR (MT_COLOR_NORMAL);
BKGDSET (MT_COLOR_NORMAL);
-@@ -595,7 +605,7 @@
+@@ -591,7 +601,7 @@
menu->oldcurrent = -1;
if (option (OPTARROWCURSOR))
else if (option (OPTBRAILLEFRIENDLY))
move (menu->current - menu->top + menu->offset, 0);
else
-@@ -1075,6 +1085,7 @@
+@@ -1089,6 +1099,7 @@
menu->redraw = REDRAW_FULL;
break;
case OP_MAIN_CHANGE_FOLDER:
case OP_MAIN_NEXT_UNREAD_MAILBOX:
-@@ -1106,7 +1117,11 @@
+@@ -1120,7 +1131,11 @@
{
mutt_buffy (buf, sizeof (buf));
{
if (menu->menu == MENU_PAGER)
{
-@@ -1124,6 +1139,7 @@
+@@ -1138,6 +1153,7 @@
}
mutt_expand_path (buf, sizeof (buf));
if (mx_get_magic (buf) <= 0)
{
mutt_error (_("%s is not a mailbox."), buf);
-@@ -2216,6 +2232,12 @@
+@@ -2241,6 +2257,12 @@
mutt_what_key();
break;
void mutt_tag_set_flag (int flag, int bf)
--- a/functions.h
+++ b/functions.h
-@@ -169,6 +169,11 @@
+@@ -170,6 +170,11 @@
{ "decrypt-save", OP_DECRYPT_SAVE, NULL },
{ NULL, 0, NULL }
};
-@@ -270,6 +275,11 @@
+@@ -274,6 +279,11 @@
{ "what-key", OP_WHAT_KEY, NULL },
WHERE char *Signature;
WHERE char *SimpleSearch;
#if USE_SMTP
-@@ -209,6 +210,9 @@
+@@ -210,6 +211,9 @@
WHERE short ScoreThresholdRead;
WHERE short ScoreThresholdFlag;
WHERE short ImapPipelineDepth;
--- a/init.h
+++ b/init.h
-@@ -1963,6 +1963,22 @@
+@@ -1965,6 +1965,22 @@
** not used.
** (PGP only)
*/
#define M_ADD_FROM 1 /* add a From_ line */
--- a/Makefile.am
+++ b/Makefile.am
-@@ -29,7 +29,8 @@
+@@ -33,7 +33,8 @@
score.c send.c sendlib.c signal.c sort.c \
status.c system.c thread.c charset.c history.c lib.c \
muttlib.c editmsg.c mbyte.c \
-- url.c ascii.c crypt-mod.c crypt-mod.h
-+ url.c ascii.c crypt-mod.c crypt-mod.h \
-+ sidebar.c
+- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c
++ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c \
++ sidebar.c
nodist_mutt_SOURCES = $(BUILT_SOURCES)
ctx->mtime = sb.st_mtime;
ctx->size = sb.st_size;
-@@ -259,6 +260,7 @@
+@@ -255,6 +256,7 @@
ctx->size = sb.st_size;
ctx->mtime = sb.st_mtime;
menu_make_entry (buf, sizeof (buf), menu, menu->current);
menu_pad_string (buf, sizeof (buf));
-@@ -885,7 +887,7 @@
+@@ -884,7 +886,7 @@
if (option (OPTARROWCURSOR))
--- a/mutt.h
+++ b/mutt.h
-@@ -426,6 +426,7 @@
+@@ -431,6 +431,7 @@
OPTSAVEEMPTY,
OPTSAVENAME,
OPTSCORE,
OPTSIGDASHES,
OPTSIGONTOP,
OPTSORTRE,
-@@ -865,6 +866,7 @@
+@@ -874,6 +875,7 @@
{
char *path;
FILE *fp;
time_t mtime;
off_t size;
off_t vsize;
-@@ -905,6 +907,7 @@
+@@ -914,6 +916,7 @@
unsigned int quiet : 1; /* inhibit status messages? */
unsigned int collapsed : 1; /* are all threads collapsed? */
unsigned int closing : 1; /* mailbox is being closed */
void *data; /* driver specific data */
--- a/muttlib.c
+++ b/muttlib.c
-@@ -1232,6 +1232,8 @@
+@@ -1286,6 +1286,8 @@
pl = pw = 1;
/* see if there's room to add content, else ignore */
if ((col < COLS && wlen < destlen) || soft)
{
int pad;
-@@ -1274,6 +1276,52 @@
+@@ -1329,6 +1331,52 @@
col += wid;
src += pl;
}
+ }
+#endif
- if (ctx->mx_close)
- ctx->mx_close (ctx);
+ /* never announce that a mailbox we've just left has new mail. #3290
+ * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */
--- a/OPS
+++ b/OPS
-@@ -179,3 +179,8 @@
+@@ -180,3 +180,8 @@
OP_MAIN_SHOW_LIMIT "show currently active limit pattern"
OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread"
OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads"
#include "mutt_crypt.h"
-@@ -1071,6 +1072,8 @@
- mbstate_t mbstate;
+@@ -1099,6 +1100,7 @@
+ if (check_attachment_marker ((char *)buf) == 0)
+ wrap_cols = COLS;
- int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap);
-+
+ wrap_cols -= SidebarWidth;
-
/* FIXME: this should come from lineInfo */
memset(&mbstate, 0, sizeof(mbstate));
-@@ -1717,7 +1720,7 @@
+
+@@ -1745,7 +1747,7 @@
if ((redraw & REDRAW_BODY) || topline != oldtopline)
{
do {
curline = oldtopline = topline;
lines = 0;
force_redraw = 0;
-@@ -1730,6 +1733,7 @@
+@@ -1758,6 +1760,7 @@
&QuoteList, &q_level, &force_redraw, &SearchRE) > 0)
lines++;
curline++;
}
last_offset = lineInfo[curline].offset;
} while (force_redraw);
-@@ -1743,6 +1747,7 @@
+@@ -1771,6 +1774,7 @@
addch ('~');
addch ('\n');
lines++;
}
/* We are going to update the pager status bar, so it isn't
* necessary to reset to normal color now. */
-@@ -1766,11 +1771,11 @@
+@@ -1794,11 +1798,11 @@
/* print out the pager status bar */
SETCOLOR (MT_COLOR_STATUS);
BKGDSET (MT_COLOR_STATUS);
size_t l2 = sizeof (buffer);
hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr;
mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT);
-@@ -1780,7 +1785,7 @@
+@@ -1808,7 +1812,7 @@
{
char bn[STRING];
snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str);
}
BKGDSET (MT_COLOR_NORMAL);
SETCOLOR (MT_COLOR_NORMAL);
-@@ -1798,18 +1803,23 @@
+@@ -1826,18 +1830,23 @@
/* redraw the pager_index indicator, because the
* flags for this message might have changed. */
menu_redraw_current (index);
redraw = 0;
if (option(OPTBRAILLEFRIENDLY)) {
-@@ -2742,6 +2752,13 @@
+@@ -2769,6 +2778,13 @@
mutt_what_key ();
break;
# Name: crypt_autosign
--- a/imap/imap.c
+++ b/imap/imap.c
-@@ -1521,7 +1521,7 @@
+@@ -1527,7 +1527,7 @@
imap_munge_mbox_name (munged, sizeof (munged), name);
snprintf (command, sizeof (command),
{
--- a/imap/command.c
+++ b/imap/command.c
-@@ -1009,6 +1009,13 @@
+@@ -1011,6 +1011,13 @@
opened */
status->uidnext = oldun;