X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=buffy.c;h=a90b0a8dc609a803b47f158265c96e0f7d96bb60;hb=b1b9961ff1c305dff57f547d28cb509bf007bad7;hp=334a164d636c76c89c6e7ec3cc5937e6b5453d13;hpb=6833ce8bdca2d64e14485118f2a4417b7e1cb1b1;p=apps%2Fmadmutt.git diff --git a/buffy.c b/buffy.c index 334a164..a90b0a8 100644 --- a/buffy.c +++ b/buffy.c @@ -16,6 +16,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif + #include "mutt.h" #include "buffy.h" #include "mailbox.h" @@ -263,7 +267,7 @@ int mutt_buffy_check (int force) char path[_POSIX_PATH_MAX]; struct stat contex_sb; time_t t; - + CONTEXT *ctx; #ifdef USE_IMAP /* update postponed count as well, on force */ if (force) @@ -299,6 +303,8 @@ 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 @@ -317,7 +323,7 @@ int mutt_buffy_check (int force) else #endif if (stat (tmp->path, &sb) != 0 || sb.st_size == 0 || - (!tmp->magic && (tmp->magic = mx_get_magic (tmp->path)) <= 0)) + (!tmp->magic && (tmp->magic = mx_get_magic (tmp->path)) <= 0)) { /* if the mailbox still doesn't exist, set the newly created flag to * be ready for when it does. */ @@ -332,20 +338,20 @@ int mutt_buffy_check (int force) /* check to see if the folder is the currently selected folder * before polling */ if (!Context || !Context->path || - ( - (0 + ( + (0 #ifdef USE_IMAP - || tmp->magic == M_IMAP + || tmp->magic == M_IMAP #endif #ifdef USE_POP - || tmp->magic == M_POP + || tmp->magic == M_POP #endif #ifdef USE_NNTP - || tmp->magic == M_NNTP + || tmp->magic == M_NNTP #endif - ) ? mutt_strcmp (tmp->path, Context->path) : - (sb.st_dev != contex_sb.st_dev || sb.st_ino != contex_sb.st_ino) - ) + ) ? mutt_strcmp (tmp->path, Context->path) : + (sb.st_dev != contex_sb.st_dev || sb.st_ino != contex_sb.st_ino) + ) ) { switch (tmp->magic) @@ -353,70 +359,149 @@ int mutt_buffy_check (int force) case M_MBOX: case M_MMDF: - if (STAT_CHECK) - { - BuffyCount++; - tmp->new = 1; - } + { + if (STAT_CHECK || tmp->msgcount == 0) + { + BuffyCount++; + /* only do complete count if sidebar visible */ + if (SidebarWidth > 0) + { + BUFFY b = *tmp; + int msgcount = 0; + int msg_unread = 0; + BuffyCount++; + /* parse the mailbox, to see how much mail there is */ + ctx = mx_open_mailbox( tmp->path, M_READONLY | M_QUIET | M_NOSORT, + NULL); + if(ctx) + { + 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; + } + else + { + /* sidebar invisible -> done */ + tmp->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 - if (tmp->newly_created && - (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime)) - tmp->newly_created = 0; - - break; + 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; - } - 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; - } - } - closedir (dirp); - break; + snprintf (path, sizeof (path), "%s/new", tmp->path); + if ((dirp = opendir (path)) == NULL) + { + tmp->magic = 0; + break; + } + tmp->msgcount = 0; + tmp->msg_unread = 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 != 1) + { + BuffyCount++; + tmp->has_new = tmp->new = 1; + if (SidebarWidth == 0) + { + /* if sidebar invisible -> done */ + tmp->new = 1; + break; + } + } + tmp->msgcount++; + tmp->msg_unread++; + } + } + closedir (dirp); + + if (SidebarWidth > 0) + { + /* 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'))) + { + BuffyCount++; + tmp->msgcount++; + } + } + closedir (dirp); + } + break; case M_MH: - if ((tmp->new = mh_buffy (tmp->path)) > 0) - BuffyCount++; - break; - + if ((tmp->new = mh_buffy (tmp->path)) > 0) + BuffyCount++; + if (SidebarWidth > 0) + { + DIR *dp; + struct dirent *de; + 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); + } + break; + #ifdef USE_IMAP case M_IMAP: - if ((tmp->new = imap_mailbox_check (tmp->path, 1)) > 0) - BuffyCount++; - else - tmp->new = 0; - - break; + tmp->msgcount = imap_mailbox_check(tmp->path, 0); + if ((tmp->new = imap_mailbox_check (tmp->path, 1)) > 0) { + BuffyCount++; + } + else + tmp->new = 0; + break; #endif #ifdef USE_POP case M_POP: - break; + break; #endif #ifdef USE_NNTP case M_NNTP: - break; + break; #endif } } @@ -448,7 +533,7 @@ int mutt_buffy_list (void) pos = 0; first = 1; buffylist[0] = 0; - pos += strlen (strncat (buffylist, _("New mail in "), sizeof (buffylist) - 1 - pos)); + pos += strlen (strncat (buffylist, _("New mail in "), sizeof (buffylist) - 1 - pos)); /* __STRNCAT_CHECKED__ */ for (tmp = Incoming; tmp; tmp = tmp->next) { /* Is there new mail in this mailbox? */ @@ -462,21 +547,21 @@ int mutt_buffy_list (void) break; if (!first) - pos += strlen (strncat(buffylist + pos, ", ", sizeof(buffylist)-1-pos)); + pos += strlen (strncat(buffylist + pos, ", ", sizeof(buffylist)-1-pos)); /* __STRNCAT_CHECKED__ */ /* Prepend an asterisk to mailboxes not already notified */ if (!tmp->notified) { - /* pos += strlen (strncat(buffylist + pos, "*", sizeof(buffylist)-1-pos)); */ + /* pos += strlen (strncat(buffylist + pos, "*", sizeof(buffylist)-1-pos)); __STRNCAT_CHECKED__ */ tmp->notified = 1; BuffyNotify--; } - pos += strlen (strncat(buffylist + pos, path, sizeof(buffylist)-1-pos)); + pos += strlen (strncat(buffylist + pos, path, sizeof(buffylist)-1-pos)); /* __STRNCAT_CHECKED__ */ first = 0; } if (!first && tmp) { - strncat (buffylist + pos, ", ...", sizeof (buffylist) - 1 - pos); + strncat (buffylist + pos, ", ...", sizeof (buffylist) - 1 - pos); /* __STRNCAT_CHECKED__ */ } if (!first) {