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,
 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
 
 
 2005-03-05
 
-  New Color: 'sidebar [fg] [bg]'
+  New Color: 'sidebar [fg] [bg]' for the delimiter
 
 2005-03-01 (init)
 
 
 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
 #ifdef USE_NNTP
 #include "nntp.h"
 #endif
+#include "sidebar.h"
 
 #include <stdlib.h>
 #include <dirent.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>
 
 
 #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
 
 
 #ifdef BUFFY_SIZE
 
@@ -303,7 +305,7 @@ int mutt_buffy_check (int force)
   DIR *dirp;
   char path[_POSIX_PATH_MAX];
   struct stat contex_sb;
   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 */
   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;
   /* 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;
     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;
 
   BuffyCount = 0;
   BuffyNotify = 0;
 
@@ -340,10 +354,6 @@ int mutt_buffy_check (int force)
   
   for (tmp = Incoming; tmp; tmp = tmp->next)
   {
   
   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;
 #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:
       {
       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
 #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
 #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:
         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;
           }
           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')))
             {
           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->msgcount++;
+              tmp->msg_unread++;
+              tmp->new++;
             }
           }
           closedir (dirp);
             }
           }
           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:
         }
         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:
         }
         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++;
           BuffyCount++;
+          tmp->has_new = 1;
         }
         }
-        else
-          tmp->new = 0;
         break;
 #endif
 
         break;
 #endif
 
@@ -537,9 +585,10 @@ int mutt_buffy_check (int force)
       tmp->notified = 0;
     else if (!tmp->notified)
       BuffyNotify++;
       tmp->notified = 0;
     else if (!tmp->notified)
       BuffyNotify++;
+    tmp->has_new = tmp->new > 0;
   }
   }
-
-  BuffyDoneTime = BuffyTime;
+  if (BuffyCount > 0)
+    draw_sidebar (CurrentMenu);
   return (BuffyCount);
 }
 
   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
 
 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">
 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
 
 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>
 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
   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 SidebarWidth;
 #ifdef USE_IMAP
 WHERE short ImapKeepalive;
+WHERE short ImapBuffyTimeout;
 #endif
 
 /* flags for received signals */
 #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.
   */
   ** 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
   { "imap_pass",       DT_STR,  R_NONE, UL &ImapPass, UL 0 },
   /*
   ** .pp