]> granicus.if.org Git - mutt/commitdiff
add $mail_check_recent boolean to control whether Mutt will notify about all new...
authorMichael Elkins <me@sigpipe.org>
Mon, 13 Sep 2010 02:54:06 +0000 (19:54 -0700)
committerMichael Elkins <me@sigpipe.org>
Mon, 13 Sep 2010 02:54:06 +0000 (19:54 -0700)
closes #3271

partly addresses #3310

buffy.c
buffy.h
imap/command.c
init.h
mbox.c
mutt.h

diff --git a/buffy.c b/buffy.c
index eb9ad5403a3608041897e41443d2cf2d6327d106..fd54dd2dca3be2c28e04161eb4041308abeeaf3d 100644 (file)
--- a/buffy.c
+++ b/buffy.c
@@ -293,9 +293,19 @@ static int buffy_maildir_hasnew (BUFFY* mailbox)
   struct dirent *de;
   char *p;
   int rc = 0;
+  struct stat sb;
 
   snprintf (path, sizeof (path), "%s/new", mailbox->path);
 
+  /* when $mail_check_recent is set, if the new/ directory hasn't been modified since
+   * the user last exited the mailbox, then we know there is no recent mail.
+   */
+  if (option(OPTMAILCHECKRECENT))
+  {
+    if (stat(path, &sb) == 0 && sb.st_mtime < mailbox->last_visited)
+      return 0;
+  }
+
   if ((dirp = opendir (path)) == NULL)
   {
     mailbox->magic = 0;
@@ -307,7 +317,17 @@ static int buffy_maildir_hasnew (BUFFY* mailbox)
     if (*de->d_name == '.')
       continue;
 
-    if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) {
+    if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T'))
+    {
+      if (option(OPTMAILCHECKRECENT))
+      {
+       char msgpath[_POSIX_PATH_MAX];
+
+       snprintf(msgpath, sizeof(msgpath), "%s/%s", path, de->d_name);
+       /* ensure this message was received since leaving this mailbox */
+       if (stat(msgpath, &sb) == 0 && (sb.st_ctime <= mailbox->last_visited))
+         continue;
+      }
       /* one new and undeleted message is enough */
       mailbox->new = 1;
       rc = 1;
@@ -333,8 +353,11 @@ static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb)
       || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime);
   if (statcheck)
   {
-    rc = 1;
-    mailbox->new = 1;
+    if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited)
+    {
+      rc = 1;
+      mailbox->new = 1;
+    }
   }
   else if (option(OPTCHECKMBOXSIZE))
   {
@@ -390,11 +413,9 @@ int mutt_buffy_check (int force)
   
   for (tmp = Incoming; tmp; tmp = tmp->next)
   {
-    if (tmp->magic != M_IMAP)
-      tmp->new = 0;
-
     if (tmp->magic != M_IMAP)
     {
+      tmp->new = 0;
 #ifdef USE_POP
       if (mx_is_pop (tmp->path))
        tmp->magic = M_POP;
@@ -513,6 +534,7 @@ void mutt_buffy_setnotified (const char *path)
     return;
 
   buffy->notified = 1;
+  time(&buffy->last_visited);
 }
 
 int mutt_buffy_notify (void)
diff --git a/buffy.h b/buffy.h
index f88bd27ffe4502d55fe2e4d46c4944602569dbe0..2e5e04849e94b7b6316bee041c4406251654aa84 100644 (file)
--- a/buffy.h
+++ b/buffy.h
@@ -29,6 +29,7 @@ typedef struct buffy_t
   short notified;              /* user has been notified */
   short magic;                 /* mailbox type */
   short newly_created;         /* mbox or mmdf just popped into existence */
+  time_t last_visited;         /* time of last exit from this mailbox */
 }
 BUFFY;
 
index 2968ca2f44f20c94a94ba68a48a1832c94e7da8d..0959068c5d339476870f92b20d6bafdda9eff4d8 100644 (file)
@@ -990,14 +990,19 @@ static void cmd_parse_status (IMAP_DATA* idata, char* s)
         dprint (3, (debugfile, "Found %s in buffy list (OV: %d ON: %d U: %d)\n",
                     mailbox, olduv, oldun, status->unseen));
         
-        if (olduv && olduv == status->uidvalidity)
+       if (option(OPTMAILCHECKRECENT))
+       {
+         /*
+          * the \Recent flag will be set on messages that have been delivered since the mailbox
+          * was last opened.
+          */
+         inc->new = status->recent;
+       }
+       else if (olduv && olduv == status->uidvalidity)
         {
           if (oldun < status->uidnext)
             inc->new = status->unseen;
         }
-        else if (!olduv && !oldun)
-         /* first check per session, use recent. might need a flag for this. */
-         inc->new = status->recent;
        else
           inc->new = status->unseen;
 
diff --git a/init.h b/init.h
index 21df2c72e507ec6d725fc2ca47f17e059171b141..5ecd8700c37ad281a26a11062c6ba6d4af0bdada 100644 (file)
--- a/init.h
+++ b/init.h
@@ -1335,6 +1335,17 @@ struct option_t MuttVars[] = {
   ** This variable configures how often (in seconds) mutt should look for
   ** new mail. Also see the $$timeout variable.
   */
+  { "mail_check_recent",DT_BOOL, R_NONE, OPTMAILCHECKRECENT, 0 },
+  /*
+  ** .pp
+  ** When \fIset\fP, Mutt will only notify you about new mail that has been received
+  ** since the last time you opened the mailbox.  When \fIunset\fP, Mutt will notify you
+  ** if any new mail exists in the mailbox, regardless of whether you have visited it
+  ** recently.
+  ** .pp
+  ** When \fI$$mark_old\fP is set, Mutt does not consider the mailbox to contain new
+  ** mail if only old messages exist.
+  */
   { "mailcap_path",    DT_STR,  R_NONE, UL &MailcapPath, 0 },
   /*
   ** .pp
diff --git a/mbox.c b/mbox.c
index b46a197e3451d8b4665d134940efb5d770f2f10a..afd1be4cef5c67456bbf10f035db95d247b7becc 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -671,12 +671,26 @@ int mbox_check_mailbox (CONTEXT *ctx, int *index_hint)
   return (-1);
 }
 
+/*
+ * Returns 1 if the mailbox has at least 1 new messages (not old)
+ * otherwise returns 0.
+ */
+static int mbox_has_new(CONTEXT *ctx)
+{
+  int i;
+
+  for (i = 0; i < ctx->msgcount; i++)
+    if (!ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read && !ctx->hdrs[i]->old)
+      return 1;
+  return 0;
+}
+
 /* if mailbox has at least 1 new message, sets mtime > atime of mailbox
  * so buffy check reports new mail */
 void mbox_reset_atime (CONTEXT *ctx, struct stat *st)
 {
   struct utimbuf utimebuf;
-  int i, found = 0;
+  int i;
   struct stat _st;
 
   if (!st)
@@ -689,11 +703,11 @@ void mbox_reset_atime (CONTEXT *ctx, struct stat *st)
   utimebuf.actime = st->st_atime;
   utimebuf.modtime = st->st_mtime;
 
-  for (i = 0; !found && i < ctx->msgcount; i++)
-    if (!ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read && !ctx->hdrs[i]->old)
-      found = 1;
-
-  if (found && utimebuf.actime >= utimebuf.modtime)
+  /*
+   * When $mbox_check_recent is set, existing new mail is ignored, so do not
+   * recent the atime to mtime-1 to signal new mail.
+   */
+  if (!option(OPTMAILCHECKRECENT) && utimebuf.actime >= utimebuf.modtime && mbox_has_new(ctx))
     utimebuf.actime = utimebuf.modtime - 1;
 
   utime (ctx->path, &utimebuf);
diff --git a/mutt.h b/mutt.h
index 4d67cabb2dbe60c52d600b5639904c8bd8d94533..578d1118d74e69c78cef84bd63133fb7ab0cc539 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -384,6 +384,7 @@ enum
   OPTINCLUDEONLYFIRST,
   OPTKEEPFLAGGED,
   OPTMAILCAPSANITIZE,
+  OPTMAILCHECKRECENT,
   OPTMAILDIRTRASH,
   OPTMARKERS,
   OPTMARKOLD,