Rocco Rutte:
authorpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Mon, 7 Mar 2005 16:21:56 +0000 (16:21 +0000)
committerpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Mon, 7 Mar 2005 16:21:56 +0000 (16:21 +0000)
added $imap_check_mail to decrease traffic

git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@152 e385b8ad-14ed-0310-8656-cc95a2468c6d

UPGRADING
browser.c
buffy.c
doc/manual.sgml.head
globals.h
init.h

index 5d8781e..6bc6dab 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -11,14 +11,16 @@ the necessary keywords to look them up in the manual, ChangeLog or other
 sources of information.
 
 Note: as development goes fast and as documentation is way behind it,
-this still likely is incomplete.
+this still likely is incomplete. Please report missing items to
+<mutt-ng-devel@lists.berlios.de>
 
-Note for developers: if you encounter anything missing before SVN
-rev123, please put it "into" init and removes this comment when done!
+2005-03-07
+
+  New Variable: $imap_mail_check is split from $mail_check
 
 2005-03-05
 
-  New Color: 'sidebar [fg] [bg]'
+  New Color: 'sidebar [fg] [bg]' for the delimiter
 
 2005-03-01 (init)
 
index b85d622..21bb588 100644 (file)
--- a/browser.c
+++ b/browser.c
@@ -34,6 +34,7 @@
 #ifdef USE_NNTP
 #include "nntp.h"
 #endif
+#include "sidebar.h"
 
 #include <stdlib.h>
 #include <dirent.h>
diff --git a/buffy.c b/buffy.c
index a7e7ca5..dd090fb 100644 (file)
--- a/buffy.c
+++ b/buffy.c
 
 #include <stdio.h>
 
-static time_t BuffyTime = 0;   /* last time we started checking for mail */
-time_t BuffyDoneTime = 0;      /* last time we knew for sure how much mail there was. */
-static short BuffyCount = 0;   /* how many boxes with new mail */
-static short BuffyNotify = 0;  /* # of unnotified new boxes */
+static time_t BuffyTime = 0;            /* last time we started checking for mail */
+#ifdef USE_IMAP
+static time_t ImapBuffyTime = 0;        /* last time we started checking for mail */
+#endif
+static short BuffyCount = 0;            /* how many boxes with new mail */
+static short BuffyNotify = 0;           /* # of unnotified new boxes */
 
 #ifdef BUFFY_SIZE
 
@@ -303,7 +305,7 @@ int mutt_buffy_check (int force)
   DIR *dirp;
   char path[_POSIX_PATH_MAX];
   struct stat contex_sb;
-  time_t t;
+  time_t now, last1, last2;
   CONTEXT *ctx;
 #ifdef USE_IMAP
   /* update postponed count as well, on force */
@@ -314,11 +316,23 @@ int mutt_buffy_check (int force)
   /* fastest return if there are no mailboxes */
   if (!Incoming)
     return 0;
-  t = time (NULL);
-  if (!force && (t - BuffyTime < BuffyTimeout))
+  now = time (NULL);
+  if (!force && (now - BuffyTime < BuffyTimeout)
+#ifdef USE_IMAP
+      && (now - ImapBuffyTime < ImapBuffyTimeout))
+#else
+      )
+#endif
     return BuffyCount;
-  BuffyTime = t;
+
+  last1 = BuffyTime;
+  if (force || now - BuffyTime >= BuffyTimeout)
+    BuffyTime = now;
+#ifdef USE_IMAP
+  last2 = ImapBuffyTime;
+  if (force || now - ImapBuffyTime >= ImapBuffyTimeout)
+    ImapBuffyTime = now;
+#endif
   BuffyCount = 0;
   BuffyNotify = 0;
 
@@ -340,10 +354,6 @@ int mutt_buffy_check (int force)
   
   for (tmp = Incoming; tmp; tmp = tmp->next)
   {
-    if ( tmp->new == 1 )
-      tmp->has_new = 1;
-    tmp->new = 0;
-
 #ifdef USE_IMAP
     if (mx_is_imap (tmp->path))
       tmp->magic = M_IMAP;
@@ -395,125 +405,163 @@ int mutt_buffy_check (int force)
       {
       case M_MBOX:
       case M_MMDF:
-
-        if (SidebarWidth == 0 || !option (OPTMBOXPANE)) {
-          if (STAT_CHECK) {
-            BuffyCount++;
-            tmp->new = tmp->has_new = 1;
-          }
+        /* only check on force or $mail_check reached */
+        if (force || (now - last1 >= BuffyTimeout)) {
+          tmp->new = 0;
+          tmp->msg_unread = 0;
+          if (SidebarWidth == 0 || !option (OPTMBOXPANE)) {
+            if (STAT_CHECK) {
+              BuffyCount++;
+              tmp->new = tmp->has_new = 1;
+            }
 #ifdef BUFFY_SIZE
-          else
-          {
-            /* some other program has deleted mail from the folder */
-            tmp->size = (long) sb.st_size;
-          }
+            else
+            {
+              /* some other program has deleted mail from the folder */
+              tmp->size = (long) sb.st_size;
+            }
 #endif
-        } else if (SidebarWidth > 0 && option (OPTMBOXPANE) && 
-                   (STAT_CHECK || tmp->msgcount == 0)) {
-          /* sidebar visible */
-          int msg_count = 0, msg_unread = 0, msg_new = 0;
-          BuffyCount++;
-          if ((ctx = mx_open_mailbox (tmp->path, M_READONLY | M_QUIET | M_NOSORT, NULL)) != NULL) {
-            msg_count = ctx->msgcount;
-            msg_unread = ctx->unread;
-            msg_new = ctx->new;
-            mx_close_mailbox (ctx, 0);
+          } else if (SidebarWidth > 0 && option (OPTMBOXPANE) && 
+                    (STAT_CHECK || tmp->msgcount == 0)) {
+            /* sidebar visible */
+            int msg_count = 0, msg_new = 0, msg_unread = 0;
+            BuffyCount++;
+            if ((ctx = mx_open_mailbox (tmp->path, M_READONLY | M_QUIET | M_NOSORT, NULL)) != NULL) {
+              msg_count = ctx->msgcount;
+              msg_new = ctx->new;
+              msg_unread = ctx->unread;
+              mx_close_mailbox (ctx, 0);
+            }
+            tmp->msgcount = msg_count;
+            tmp->new = msg_new;
+            tmp->msg_unread = msg_unread;
+            tmp->has_new = msg_new > 0;
           }
-          tmp->msgcount = msg_count;
-          tmp->msg_unread = msg_unread;
-          tmp->new = msg_new;
-          tmp->has_new = msg_new > 0;
+          if (tmp->newly_created &&
+              (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
+            tmp->newly_created = 0;
+          tmp->has_new = tmp->new > 0;
+        } else if (tmp->new > 0) {
+          /* keep current stats if !force and !$mail_check reached */
+          BuffyCount++;
+          tmp->has_new = 1;
         }
-        if (tmp->newly_created &&
-            (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
-          tmp->newly_created = 0;
         break;
 
       case M_MAILDIR:
-
-        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->new = 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 */
-            if (tmp->new == 0)
-            {
-               BuffyCount++;
-               tmp->has_new = tmp->new = 1;
-               if (SidebarWidth == 0 || !option (OPTMBOXPANE))
-                 /* if sidebar invisible -> done */
-                 break;
-            }
-            tmp->msgcount++;
-            tmp->msg_unread++;
-            tmp->new++;
-          }
-        }
-        closedir (dirp);
-
-        if (SidebarWidth > 0 && option (OPTMBOXPANE))
-        {
-          /* only count total mail if sidebar visible */
-          snprintf (path, sizeof (path), "%s/cur", tmp->path);
+        /* only check on force or $mail_check reached */
+        if (force || (now - last1 >= BuffyTimeout)) {
+          snprintf (path, sizeof (path), "%s/new", tmp->path);
           if ((dirp = opendir (path)) == NULL)
           {
             tmp->magic = 0;
             break;
           }
+          tmp->new = 0;
+          tmp->msg_unread = 0;
+          tmp->msgcount = 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 */
+              if (tmp->new == 0)
+              {
+                BuffyCount++;
+                tmp->has_new = tmp->new = 1;
+                if (SidebarWidth == 0 || !option (OPTMBOXPANE))
+                  /* if sidebar invisible -> done */
+                  break;
+              }
               tmp->msgcount++;
+              tmp->msg_unread++;
+              tmp->new++;
             }
           }
           closedir (dirp);
+          tmp->has_new = tmp->new > 0;
+
+          if (SidebarWidth > 0 && option (OPTMBOXPANE))
+          {
+            /* only count total mail if sidebar visible */
+            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 != '.' && 
+                  (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
+              {
+                tmp->msgcount++;
+              }
+            }
+            closedir (dirp);
+          }
+        } else if (tmp->new > 0) {
+          /* keep current stats if !force and !$mail_check reached */
+          BuffyCount++;
+          tmp->has_new = 1;
         }
         break;
 
       case M_MH:
-        if ((tmp->new = mh_buffy (tmp->path)) > 0)
-          BuffyCount++;
-        if (SidebarWidth > 0 && option (OPTMBOXPANE))
-        {
-          DIR *dp;
-          struct dirent *de;
-          if ((dp = opendir (path)) == NULL)
-            break;
-              tmp->msgcount = 0;
-          while ((de = readdir (dp)))
+        /* only check on force or $mail_check reached */
+        if (force || (now - last1 >= BuffyTimeout)) {
+          tmp->new = 0;
+          tmp->msg_unread = 0;
+          if ((tmp->new = mh_buffy (tmp->path)) > 0)
+            BuffyCount++;
+          if (SidebarWidth > 0 && option (OPTMBOXPANE))
           {
-            if (mh_valid_message (de->d_name))
+            DIR *dp;
+            struct dirent *de;
+            if ((dp = opendir (path)) == NULL)
+              break;
+                tmp->msgcount = 0;
+            while ((de = readdir (dp)))
             {
-              tmp->msgcount++;
-              tmp->has_new = tmp->new = 1;
+              if (mh_valid_message (de->d_name))
+              {
+                tmp->msgcount++;
+                tmp->msg_unread++;
+                tmp->new++;
+              }
             }
+            closedir (dp);
           }
-          closedir (dp);
+          tmp->has_new = tmp->new > 0;
+        } else if (tmp->new > 0) {
+          /* keep current stats if !force and !$mail_check reached */
+          BuffyCount++;
+          tmp->has_new = 1;
         }
         break;
 
 #ifdef USE_IMAP
       case M_IMAP:
-        tmp->msgcount = imap_mailbox_check(tmp->path, 0);
-        if ((tmp->new = imap_mailbox_check (tmp->path, 1)) > 0) {
+        /* only check on force or $imap_mail_check reached */
+        if (force || (now - last2 >= ImapBuffyTimeout)) {
+          tmp->new = 0;
+          tmp->msg_unread = 0;
+          tmp->msgcount = imap_mailbox_check (tmp->path, 0);
+          if ((tmp->new = imap_mailbox_check (tmp->path, 1)) > 0) {
+            BuffyCount++;
+            tmp->has_new = tmp->new > 0;
+            tmp->msg_unread = tmp->new; /* for sidebar; wtf? */
+          }
+          else
+            tmp->new = 0;
+        } else if (tmp->new > 0) {
+          /* keep current stats if !force and !$imap_mail_check reached */
           BuffyCount++;
+          tmp->has_new = 1;
         }
-        else
-          tmp->new = 0;
         break;
 #endif
 
@@ -537,9 +585,10 @@ int mutt_buffy_check (int force)
       tmp->notified = 0;
     else if (!tmp->notified)
       BuffyNotify++;
+    tmp->has_new = tmp->new > 0;
   }
-
-  BuffyDoneTime = BuffyTime;
+  if (BuffyCount > 0)
+    draw_sidebar (CurrentMenu);
   return (BuffyCount);
 }
 
index 6576bf4..c32036c 100644 (file)
@@ -2541,15 +2541,10 @@ name="&dollar;imap&lowbar;list&lowbar;subscribed"> variable.
 
 Polling for new mail on an IMAP server can cause noticeable delays. So, you'll
 want to carefully tune the
-<ref id="mail_check" name="&dollar;mail&lowbar;check">
+<ref id="imap_mail_check" name="&dollar;imap&lowbar;mail&lowbar;check">
 and
 <ref id="timeout" name="&dollar;timeout">
-variables. Personally I use
-<tscreen><verb>
-set mail_check=90
-set timeout=15
-</verb></tscreen>
-with relatively good results over my slow modem line.
+variables.
 
 Note that if you are using mbox as the mail store on UW servers prior to
 v12.250, the server has been reported to disconnect a client if another client
@@ -2562,7 +2557,7 @@ As of version 1.2, mutt supports browsing mailboxes on an IMAP
 server. This is mostly the same as the local file browser, with the
 following differences:
 <itemize>
-<item>In lieu of file permissions, mutt displays the string "IMAP",
+<item>Instead of file permissions, mutt displays the string "IMAP",
   possibly followed by the symbol "+", indicating
   that the entry contains both messages and subfolders. On
   Cyrus-like servers folders will often contain both messages and
index 7e06280..2fc7ff1 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -218,6 +218,7 @@ WHERE short DrawFullLine INITVAL(0);
 WHERE short SidebarWidth;
 #ifdef USE_IMAP
 WHERE short ImapKeepalive;
+WHERE short ImapBuffyTimeout;
 #endif
 
 /* flags for received signals */
diff --git a/init.h b/init.h
index 62b5a13..e05347c 100644 (file)
--- a/init.h
+++ b/init.h
@@ -974,6 +974,18 @@ struct option_t MuttVars[] = {
   ** only subscribed folders or all folders.  This can be toggled in the
   ** IMAP browser with the \fItoggle-subscribed\fP function.
   */
+  { "imap_mail_check", DT_NUM,  R_NONE, UL &ImapBuffyTimeout, 5 },
+  /*
+  ** .pp
+  ** This variable configures how often (in seconds) mutt-ng should look for
+  ** new mail in IMAP folders. This is split from the ``$mail_check'' variable
+  ** to generate less traffic and get more accurate information for local folders.
+  **
+  ** .pp
+  ** To not brake current setups, this defaults to the value of ``$mail_check''.
+  ** Depending on your connection and speed of your IMAP server, you may want to
+  ** increase it.
+  */
   { "imap_pass",       DT_STR,  R_NONE, UL &ImapPass, UL 0 },
   /*
   ** .pp