X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=buffy.c;h=c955ab9d73d420b69b76aac74f42c1892d78be36;hp=37f479da25a70b301022527b873d659014a0dbed;hb=31edbe030ac69952aa535730427246b5e9a1603c;hpb=0c2917cbb01234de10d402cc274207f9b7a46503 diff --git a/buffy.c b/buffy.c index 37f479d..c955ab9 100644 --- a/buffy.c +++ b/buffy.c @@ -174,25 +174,12 @@ void mutt_update_mailbox (BUFFY * b) int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *err) { - BUFFY **tmp,*tmp1,*last; + BUFFY **tmp,*tmp1; char buf[_POSIX_PATH_MAX]; - int dup = 0; #ifdef BUFFY_SIZE struct stat sb; #endif /* BUFFY_SIZE */ - /* - * FIXME - * to get rid of correcting the ->prev pointers in sidebar.c, - * correct them right here - */ - - /* - * FIXME - * if we really want to make the sort order of the sidebar - * configurable, this has to go right here - */ - while (MoreArgs (s)) { mutt_extract_token (path, s, 0); @@ -216,19 +203,12 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e if(!*buf) continue; /* simple check to avoid duplicates */ - dup = 0; - for (tmp = &Incoming; *tmp && dup == 0; tmp = &((*tmp)->next)) + for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) { - if (mutt_strcmp (buf, (*tmp)->path) == 0) { - dup = 1; - break; - } + if (mutt_strcmp (buf, (*tmp)->path) == 0) + break; } - if (dup == 1) - continue; - tmp = &Incoming; - if(data == M_UNMAILBOXES) { if(*tmp) @@ -241,32 +221,16 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e continue; } - /* loop over list while it's sorted */ - tmp1 = NULL; - last = NULL; - for (tmp = &Incoming; *tmp ; tmp = &((*tmp)->next)) { - /* - * FIXME - * change this to get whatever sorting order - */ - if (mutt_strcmp (buf, (*tmp)->path) < 0) { - tmp1 = (*tmp); - break; - } - last = (*tmp); + if (!*tmp) + { + *tmp = (BUFFY *) safe_calloc (1, sizeof (BUFFY)); + (*tmp)->path = safe_strdup (buf); + (*tmp)->next = NULL; + /* it is tempting to set magic right here */ + (*tmp)->magic = 0; + } - /* we want: last -> tmp -> tmp1 */ - *tmp = (BUFFY *) safe_calloc (1, sizeof (BUFFY)); - (*tmp)->path = safe_strdup (buf); - (*tmp)->magic = 0; - - /* correct pointers */ - (*tmp)->next = tmp1; - if (last) - last->next = (*tmp); - - /* left as-is */ (*tmp)->new = 0; (*tmp)->notified = 1; (*tmp)->newly_created = 0; @@ -297,6 +261,11 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e #define STAT_CHECK (sb.st_mtime > sb.st_atime || (tmp->newly_created && sb.st_ctime == sb.st_mtime && sb.st_ctime == sb.st_atime)) #endif /* BUFFY_SIZE */ +/* values for force: + * 0 don't force any checks + update sidebar + * 1 force all checks + update sidebar + * 2 force all checks + _don't_ update sidebar + */ int mutt_buffy_check (int force) { BUFFY *tmp; @@ -305,11 +274,12 @@ int mutt_buffy_check (int force) DIR *dirp; char path[_POSIX_PATH_MAX]; struct stat contex_sb; - time_t now, last1, last2; + time_t now, last1; CONTEXT *ctx; #ifdef USE_IMAP + time_t last2; /* update postponed count as well, on force */ - if (force) + if (force != 0) mutt_update_num_postponed (); #endif @@ -317,7 +287,7 @@ int mutt_buffy_check (int force) if (!Incoming) return 0; now = time (NULL); - if (!force && (now - BuffyTime < BuffyTimeout) + if (force == 0 && (now - BuffyTime < BuffyTimeout) #ifdef USE_IMAP && (now - ImapBuffyTime < ImapBuffyTimeout)) #else @@ -326,11 +296,11 @@ int mutt_buffy_check (int force) return BuffyCount; last1 = BuffyTime; - if (force || now - BuffyTime >= BuffyTimeout) + if (force != 0 || now - BuffyTime >= BuffyTimeout) BuffyTime = now; #ifdef USE_IMAP last2 = ImapBuffyTime; - if (force || now - ImapBuffyTime >= ImapBuffyTimeout) + if (force != 0 || now - ImapBuffyTime >= ImapBuffyTimeout) ImapBuffyTime = now; #endif BuffyCount = 0; @@ -406,13 +376,11 @@ int mutt_buffy_check (int force) case M_MBOX: case M_MMDF: /* only check on force or $mail_check reached */ - if (force || (now - last1 >= BuffyTimeout)) { - tmp->new = 0; - tmp->msg_unread = 0; + if (force != 0 || (now - last1 >= BuffyTimeout)) { if (SidebarWidth == 0 || !option (OPTMBOXPANE)) { if (STAT_CHECK) { BuffyCount++; - tmp->new = tmp->has_new = 1; + tmp->new = 1; } #ifdef BUFFY_SIZE else @@ -424,33 +392,25 @@ int mutt_buffy_check (int force) } 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; + tmp->msgcount = ctx->msgcount; + tmp->new = ctx->new; + tmp->msg_unread = ctx->new; /* for sidebar, wtf? */ + tmp->msg_flagged = ctx->flagged; mx_close_mailbox (ctx, 0); } - tmp->msgcount = msg_count; - tmp->new = msg_new; - tmp->msg_unread = msg_unread; - 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 */ + } else if (tmp->new > 0) BuffyCount++; - tmp->has_new = 1; - } break; case M_MAILDIR: /* only check on force or $mail_check reached */ - if (force || (now - last1 >= BuffyTimeout)) { + if (force != 0 || (now - last1 >= BuffyTimeout)) { snprintf (path, sizeof (path), "%s/new", tmp->path); if ((dirp = opendir (path)) == NULL) { @@ -470,7 +430,7 @@ int mutt_buffy_check (int force) if (tmp->new == 0) { BuffyCount++; - tmp->has_new = tmp->new = 1; + tmp->new = 1; if (SidebarWidth == 0 || !option (OPTMBOXPANE)) /* if sidebar invisible -> done */ break; @@ -481,7 +441,6 @@ int mutt_buffy_check (int force) } } closedir (dirp); - tmp->has_new = tmp->new > 0; if (SidebarWidth > 0 && option (OPTMBOXPANE)) { @@ -492,29 +451,27 @@ int mutt_buffy_check (int force) tmp->magic = 0; break; } + 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'))) - { - tmp->msgcount++; + if (*de->d_name != '.' && (p = strstr (de->d_name, ":2,")) != NULL) { + if (!strchr (p + 3, 'T')) + tmp->msgcount++; + if (strchr (p + 3, 'F')) + tmp->msg_flagged++; } } closedir (dirp); } - } else if (tmp->new > 0) { + } else if (tmp->new > 0) /* keep current stats if !force and !$mail_check reached */ BuffyCount++; - tmp->has_new = 1; - } break; case M_MH: /* only check on force or $mail_check reached */ - if (force || (now - last1 >= BuffyTimeout)) { - tmp->new = 0; - tmp->msg_unread = 0; + if (force != 0 || (now - last1 >= BuffyTimeout)) { if ((tmp->new = mh_buffy (tmp->path)) > 0) BuffyCount++; if (SidebarWidth > 0 && option (OPTMBOXPANE)) @@ -523,7 +480,9 @@ int mutt_buffy_check (int force) struct dirent *de; if ((dp = opendir (path)) == NULL) break; - tmp->msgcount = 0; + tmp->new = 0; + tmp->msgcount = 0; + tmp->msg_unread = 0; while ((de = readdir (dp))) { if (mh_valid_message (de->d_name)) @@ -535,33 +494,27 @@ int mutt_buffy_check (int force) } closedir (dp); } - tmp->has_new = tmp->new > 0; - } else if (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: /* only check on force or $imap_mail_check reached */ - if (force || (now - last2 >= ImapBuffyTimeout)) { - tmp->new = 0; - tmp->msg_unread = 0; + if (force != 0 || (now - last2 >= ImapBuffyTimeout)) { 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 + else { tmp->new = 0; - } else if (tmp->new > 0) { + tmp->msg_unread = 0; + } + } else if (tmp->new > 0) /* keep current stats if !force and !$imap_mail_check reached */ BuffyCount++; - tmp->has_new = 1; - } break; #endif @@ -581,13 +534,13 @@ int mutt_buffy_check (int force) tmp->size = (long) sb.st_size; /* update the size */ #endif - if (!tmp->new) + if (tmp->new <= 0) tmp->notified = 0; else if (!tmp->notified) BuffyNotify++; tmp->has_new = tmp->new > 0; } - if (BuffyCount > 0) + if (BuffyCount > 0 && force != 2) draw_sidebar (CurrentMenu); return (BuffyCount); } @@ -611,7 +564,7 @@ int mutt_buffy_list (void) for (tmp = Incoming; tmp; tmp = tmp->next) { /* Is there new mail in this mailbox? */ - if (!tmp->new || (have_unnotified && tmp->notified)) + if (tmp->new <= 0 || (have_unnotified && tmp->notified)) continue; strfcpy (path, tmp->path, sizeof (path)); @@ -681,7 +634,7 @@ void mutt_buffy (char *s, size_t slen) case 1: - while (tmp && !tmp->new) + while (tmp && tmp->new <= 0) tmp = tmp->next; if (!tmp) { @@ -700,7 +653,7 @@ void mutt_buffy (char *s, size_t slen) { if (mutt_strcmp (s, tmp->path) == 0) count++; - else if (count && tmp->new) + else if (count && tmp->new > 0) break; tmp = tmp->next; if (!tmp)