FreeBSD Bugzilla – Attachment 156033 Details for
Bug 199727
maintainer update of mail/mutt
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
maintainer patch
mutt.diff (text/plain), 217.81 KB, created by
Udo.Schweigert
on 2015-04-27 06:49:15 UTC
(
hide
)
Description:
maintainer patch
Filename:
MIME Type:
Creator:
Udo.Schweigert
Created:
2015-04-27 06:49:15 UTC
Size:
217.81 KB
patch
obsolete
>diff -ru /usr/ports/mail/mutt/Makefile ./Makefile >--- /usr/ports/mail/mutt/Makefile 2015-04-22 08:21:51.000000000 +0200 >+++ ./Makefile 2015-04-27 08:38:01.000000000 +0200 >@@ -3,7 +3,7 @@ > > PORTNAME= mutt > PORTVERSION= 1.5.23 >-PORTREVISION?= 8 >+PORTREVISION?= 9 > CATEGORIES+= mail ipv6 > MASTER_SITES= ftp://ftp.mutt.org/mutt/ \ > ftp://ftp.mutt.org/mutt/devel/ \ >diff -ru /usr/ports/mail/mutt/files/extra-patch-sidebar ./files/extra-patch-sidebar >--- /usr/ports/mail/mutt/files/extra-patch-sidebar 2014-09-11 12:28:45.000000000 +0200 >+++ ./files/extra-patch-sidebar 2015-04-27 08:35:24.000000000 +0200 >@@ -1,1416 +1,2314 @@ >-Based on Gentoo's updated version of the Mutt Sidebar patch, >-rebased to apply to pristine Mutt sources. >+Taken from http://lunar-linux.org/~tchan/mutt/patch-1.5.23.sidebar.20140412.txt > >-http://prefix.gentooexperimental.org:8000/mutt-patches/file/8117acc3edc0/sidebar.patch >- >-diff -uNp -r mutt-1.5.22.orig/OPS mutt-1.5.22/OPS >---- mutt-1.5.22.orig/OPS Tue Feb 23 06:57:28 2010 >-+++ mutt-1.5.22/OPS Fri Oct 18 10:18:45 2013 >-@@ -179,3 +179,8 @@ OP_WHAT_KEY "display the keycode for a key press" >- OP_MAIN_SHOW_LIMIT "show currently active limit pattern" >- OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread" >- OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads" >-+OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page" >-+OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page" >-+OP_SIDEBAR_NEXT "go down to next mailbox" >-+OP_SIDEBAR_PREV "go to previous mailbox" >-+OP_SIDEBAR_OPEN "open hilighted mailbox" >-diff -uNp -r mutt-1.5.22.orig/PATCHES mutt-1.5.22/PATCHES >---- mutt-1.5.22.orig/PATCHES Sun Feb 21 05:51:26 2010 >-+++ mutt-1.5.22/PATCHES Fri Oct 18 10:19:14 2013 >-@@ -0,0 +1 @@ >-+patch-1.5.22.sidebar.gentoo-openbsd > diff -uNp -r mutt-1.5.22.orig/buffy.c mutt-1.5.22/buffy.c >---- mutt-1.5.22.orig/buffy.c Mon Apr 22 07:14:53 2013 >-+++ mutt-1.5.22/buffy.c Fri Oct 18 10:18:45 2013 >-@@ -161,6 +161,49 @@ void mutt_buffy_cleanup (const char *buf, struct stat >- } >- } >- >-+static int buffy_compare_name(const void *a, const void *b) { >-+ const BUFFY *b1 = * (BUFFY * const *) a; >-+ const BUFFY *b2 = * (BUFFY * const *) b; >-+ >-+ return mutt_strcoll(b1->path, b2->path); >-+} >-+ >-+static BUFFY *buffy_sort(BUFFY *b) >-+{ >-+ BUFFY *tmp = b; >-+ int buffycount = 0; >-+ BUFFY **ary; >-+ int i; >-+ >-+ if (!option(OPTSIDEBARSORT)) >-+ return b; >-+ >-+ for (; tmp != NULL; tmp = tmp->next) >-+ buffycount++; >-+ >-+ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary)); >-+ >-+ tmp = b; >-+ for (i = 0; tmp != NULL; tmp = tmp->next, i++) { >-+ ary[i] = tmp; >-+ } >-+ >-+ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name); >-+ >-+ for (i = 0; i < buffycount - 1; i++) { >-+ ary[i]->next = ary[i+1]; >-+ } >-+ ary[buffycount - 1]->next = NULL; >-+ for (i = 1; i < buffycount; i++) { >-+ ary[i]->prev = ary[i-1]; >-+ } >-+ ary[0]->prev = NULL; >-+ >-+ tmp = ary[0]; >-+ free(ary); >-+ return tmp; >-+} >-+ >- BUFFY *mutt_find_mailbox (const char *path) >- { >- BUFFY *tmp = NULL; >-@@ -282,6 +325,7 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, uns >- else >- (*tmp)->size = 0; >- } >-+ Incoming = buffy_sort(Incoming); >- return 0; >- } >- >-@@ -340,6 +384,68 @@ static int buffy_maildir_hasnew (BUFFY* mailbox) >- return rc; >- } >- >-+/* update message counts for the sidebar */ >-+void buffy_maildir_update (BUFFY* mailbox) >-+{ >-+ char path[_POSIX_PATH_MAX]; >-+ DIR *dirp; >-+ struct dirent *de; >-+ char *p; >-+ >-+ mailbox->msgcount = 0; >-+ mailbox->msg_unread = 0; >-+ mailbox->msg_flagged = 0; >-+ >-+ snprintf (path, sizeof (path), "%s/new", mailbox->path); >-+ >-+ if ((dirp = opendir (path)) == NULL) >-+ { >-+ mailbox->magic = 0; >-+ return; >-+ } >-+ >-+ while ((de = readdir (dirp)) != NULL) >-+ { >-+ if (*de->d_name == '.') >-+ continue; >-+ >-+ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { >-+ mailbox->new = 1; >-+ mailbox->msgcount++; >-+ mailbox->msg_unread++; >-+ } >-+ } >-+ >-+ closedir (dirp); >-+ snprintf (path, sizeof (path), "%s/cur", mailbox->path); >-+ >-+ if ((dirp = opendir (path)) == NULL) >-+ { >-+ mailbox->magic = 0; >-+ return; >-+ } >-+ >-+ while ((de = readdir (dirp)) != NULL) >-+ { >-+ if (*de->d_name == '.') >-+ continue; >-+ >-+ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { >-+ mailbox->msgcount++; >-+ if ((p = strstr (de->d_name, ":2,"))) { >-+ if (!strchr (p + 3, 'T')) { >-+ if (!strchr (p + 3, 'S')) >-+ mailbox->msg_unread++; >-+ if (strchr(p + 3, 'F')) >-+ mailbox->msg_flagged++; >-+ } >-+ } >-+ } >-+ } >-+ >-+ closedir (dirp); >-+} >-+ >- /* returns 1 if mailbox has new mail */ >- static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb) >- { >-@@ -371,6 +477,20 @@ static int buffy_mbox_hasnew (BUFFY* mailbox, struct s >- return rc; >- } >- >-+/* update message counts for the sidebar */ >-+void buffy_mbox_update (BUFFY* mailbox) >-+{ >-+ CONTEXT *ctx = NULL; >-+ >-+ ctx = mx_open_mailbox(mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL); >-+ if(ctx) >-+ { >-+ mailbox->msgcount = ctx->msgcount; >-+ mailbox->msg_unread = ctx->unread; >-+ mx_close_mailbox(ctx, 0); >-+ } >-+} >-+ >- int mutt_buffy_check (int force) >- { >- BUFFY *tmp; >-@@ -444,16 +564,19 @@ int mutt_buffy_check (int force) >- { >- case M_MBOX: >- case M_MMDF: >-+ buffy_mbox_update (tmp); >- if (buffy_mbox_hasnew (tmp, &sb) > 0) >- BuffyCount++; >- break; >- >- case M_MAILDIR: >-+ buffy_maildir_update (tmp); >- if (buffy_maildir_hasnew (tmp) > 0) >- BuffyCount++; >- break; >- >- case M_MH: >-+ mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged); >- mh_buffy(tmp); >- if (tmp->new) >- BuffyCount++; >-diff -uNp -r mutt-1.5.22.orig/buffy.h mutt-1.5.22/buffy.h >---- mutt-1.5.22.orig/buffy.h Mon Apr 22 07:14:53 2013 >-+++ mutt-1.5.22/buffy.h Fri Oct 18 10:18:45 2013 >-@@ -25,7 +25,11 @@ typedef struct buffy_t >- char path[_POSIX_PATH_MAX]; >- off_t size; >- struct buffy_t *next; >-+ struct buffy_t *prev; >- short new; /* mailbox has new mail */ >-+ int msgcount; /* total number of messages */ >-+ int msg_unread; /* number of unread messages */ >-+ int msg_flagged; /* number of flagged messages */ >- short notified; /* user has been notified */ >- short magic; /* mailbox type */ >- short newly_created; /* mbox or mmdf just popped into existence */ >-diff -uNp -r mutt-1.5.22.orig/color.c mutt-1.5.22/color.c >---- mutt-1.5.22.orig/color.c Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/color.c Fri Oct 18 10:19:53 2013 >-@@ -93,6 +93,8 @@ static const struct mapping_t Fields[] = >- { "bold", MT_COLOR_BOLD }, >- { "underline", MT_COLOR_UNDERLINE }, >- { "index", MT_COLOR_INDEX }, >-+ { "sidebar_new", MT_COLOR_NEW }, >-+ { "sidebar_flagged", MT_COLOR_FLAGGED }, >- { NULL, 0 } >- }; >- >-diff -uNp -r mutt-1.5.22.orig/compose.c mutt-1.5.22/compose.c >---- mutt-1.5.22.orig/compose.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/compose.c Fri Oct 18 10:22:12 2013 >-@@ -72,7 +72,7 @@ enum >- >- #define HDR_XOFFSET 10 >- #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ >--#define W (COLS - HDR_XOFFSET) >-+#define W (COLS - HDR_XOFFSET - SidebarWidth) >- >- static const char * const Prompts[] = >- { >-@@ -110,7 +110,7 @@ static void snd_entry (char *b, size_t blen, MUTTMENU >- >- static void redraw_crypt_lines (HEADER *msg) >- { >-- mvaddstr (HDR_CRYPT, 0, "Security: "); >-+ mvaddstr (HDR_CRYPT, SidebarWidth, "Security: "); >- >- if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) >- { >-@@ -142,7 +142,7 @@ static void redraw_crypt_lines (HEADER *msg) >- } >- >- clrtoeol (); >-- move (HDR_CRYPTINFO, 0); >-+ move (HDR_CRYPTINFO, SidebarWidth); >- clrtoeol (); >- >- if ((WithCrypto & APPLICATION_PGP) >-@@ -159,7 +159,7 @@ static void redraw_crypt_lines (HEADER *msg) >- && (msg->security & ENCRYPT) >- && SmimeCryptAlg >- && *SmimeCryptAlg) { >-- mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "), >-+ mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "), >- NONULL(SmimeCryptAlg)); >- } >- } >-@@ -172,7 +172,7 @@ static void redraw_mix_line (LIST *chain) >- int c; >- char *t; >- >-- mvaddstr (HDR_MIX, 0, " Mix: "); >-+ mvaddstr (HDR_MIX, SidebarWidth, " Mix: "); >- >- if (!chain) >- { >-@@ -187,7 +187,7 @@ static void redraw_mix_line (LIST *chain) >- if (t && t[0] == '0' && t[1] == '\0') >- t = "<random>"; >- >-- if (c + mutt_strlen (t) + 2 >= COLS) >-+ if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth) >- break; >- >- addstr (NONULL(t)); >-@@ -239,7 +239,7 @@ static void draw_envelope_addr (int line, ADDRESS *add >- >- buf[0] = 0; >- rfc822_write_address (buf, sizeof (buf), addr, 1); >-- mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]); >-+ mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]); >- mutt_paddstr (W, buf); >- } >- >-@@ -249,10 +249,10 @@ static void draw_envelope (HEADER *msg, char *fcc) >- draw_envelope_addr (HDR_TO, msg->env->to); >- draw_envelope_addr (HDR_CC, msg->env->cc); >- draw_envelope_addr (HDR_BCC, msg->env->bcc); >-- mvprintw (HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); >-+ mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); >- mutt_paddstr (W, NONULL (msg->env->subject)); >- draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); >-- mvprintw (HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]); >-+ mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]); >- mutt_paddstr (W, fcc); >- >- if (WithCrypto) >-@@ -263,7 +263,7 @@ static void draw_envelope (HEADER *msg, char *fcc) >- #endif >- >- SETCOLOR (MT_COLOR_STATUS); >-- mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); >-+ mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments")); >- clrtoeol (); >- >- NORMAL_COLOR; >-@@ -299,7 +299,7 @@ static int edit_address_list (int line, ADDRESS **addr >- /* redraw the expanded list so the user can see the result */ >- buf[0] = 0; >- rfc822_write_address (buf, sizeof (buf), *addr, 1); >-- move (line, HDR_XOFFSET); >-+ move (line, HDR_XOFFSET+SidebarWidth); >- mutt_paddstr (W, buf); >- >- return 0; >-@@ -544,7 +544,7 @@ int mutt_compose_menu (HEADER *msg, /* structure for >- if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) >- { >- mutt_str_replace (&msg->env->subject, buf); >-- move (HDR_SUBJECT, HDR_XOFFSET); >-+ move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth); >- if (msg->env->subject) >- mutt_paddstr (W, msg->env->subject); >- else >-@@ -562,7 +562,7 @@ int mutt_compose_menu (HEADER *msg, /* structure for >- { >- strfcpy (fcc, buf, fcclen); >- mutt_pretty_mailbox (fcc, fcclen); >-- move (HDR_FCC, HDR_XOFFSET); >-+ move (HDR_FCC, HDR_XOFFSET + SidebarWidth); >- mutt_paddstr (W, fcc); >- fccSet = 1; >- } >-diff -uNp -r mutt-1.5.22.orig/curs_main.c mutt-1.5.22/curs_main.c >---- mutt-1.5.22.orig/curs_main.c Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/curs_main.c Fri Oct 18 10:18:45 2013 >-@@ -26,7 +26,9 @@ >- #include "mailbox.h" >- #include "mapping.h" >- #include "sort.h" >-+#include "buffy.h" >- #include "mx.h" >-+#include "sidebar.h" >- >- #ifdef USE_POP >- #include "pop.h" >-@@ -519,8 +521,12 @@ int mutt_index_menu (void) >- menu->redraw |= REDRAW_STATUS; >- if (do_buffy_notify) >+*** mutt-1.5.23-orig/buffy.c 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/buffy.c 2014-04-12 15:33:54.000000000 -0500 >+*************** >+*** 161,166 **** >+--- 161,209 ---- >+ } >+ } >+ >++ static int buffy_compare_name(const void *a, const void *b) { >++ const BUFFY *b1 = * (BUFFY * const *) a; >++ const BUFFY *b2 = * (BUFFY * const *) b; >++ >++ return mutt_strcoll(b1->path, b2->path); >++ } >++ >++ static BUFFY *buffy_sort(BUFFY *b) >++ { >++ BUFFY *tmp = b; >++ int buffycount = 0; >++ BUFFY **ary; >++ int i; >++ >++ if (!option(OPTSIDEBARSORT)) >++ return b; >++ >++ for (; tmp != NULL; tmp = tmp->next) >++ buffycount++; >++ >++ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary)); >++ >++ tmp = b; >++ for (i = 0; tmp != NULL; tmp = tmp->next, i++) { >++ ary[i] = tmp; >++ } >++ >++ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name); >++ >++ for (i = 0; i < buffycount - 1; i++) { >++ ary[i]->next = ary[i+1]; >++ } >++ ary[buffycount - 1]->next = NULL; >++ for (i = 1; i < buffycount; i++) { >++ ary[i]->prev = ary[i-1]; >++ } >++ ary[0]->prev = NULL; >++ >++ tmp = ary[0]; >++ free(ary); >++ return tmp; >++ } >++ >+ BUFFY *mutt_find_mailbox (const char *path) >+ { >+ BUFFY *tmp = NULL; >+*************** >+*** 196,204 **** >+--- 239,251 ---- >+ static BUFFY *buffy_new (const char *path) >+ { >+ BUFFY* buffy; >++ char rp[PATH_MAX]; >++ char *r; >+ >+ buffy = (BUFFY *) safe_calloc (1, sizeof (BUFFY)); >+ strfcpy (buffy->path, path, sizeof (buffy->path)); >++ r = realpath(path, rp); >++ strfcpy (buffy->realpath, r ? rp : path, sizeof (buffy->realpath)); >+ buffy->next = NULL; >+ buffy->magic = 0; >+ >+*************** >+*** 243,250 **** >+ p = realpath (buf, f1); >+ for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) > { >-- if (mutt_buffy_notify () && option (OPTBEEPNEW)) >-- beep (); >-+ if (mutt_buffy_notify ()) >-+ { >-+ menu->redraw |= REDRAW_FULL; >-+ if (option (OPTBEEPNEW)) >-+ beep (); >+! q = realpath ((*tmp)->path, f2); >+! if (mutt_strcmp (p ? p : buf, q ? q : (*tmp)->path) == 0) >+ { >+ dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path)); >+ break; >+--- 290,297 ---- >+ p = realpath (buf, f1); >+ for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) >+ { >+! q = (*tmp)->realpath; >+! if (mutt_strcmp (p ? p : buf, q) == 0) >+ { >+ dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path)); >+ break; >+*************** >+*** 282,287 **** >+--- 329,335 ---- >+ else >+ (*tmp)->size = 0; >+ } >++ Incoming = buffy_sort(Incoming); >+ return 0; >+ } >+ >+*************** >+*** 306,311 **** >+--- 354,364 ---- >+ return 0; >+ } >+ >++ if (option(OPTSIDEBAR) && mailbox->msg_unread > 0) { >++ mailbox->new = 1; >++ return 1; >++ } >++ >+ if ((dirp = opendir (path)) == NULL) >+ { >+ mailbox->magic = 0; >+*************** >+*** 340,345 **** >+--- 393,464 ---- >+ return rc; >+ } >+ >++ /* update message counts for the sidebar */ >++ void buffy_maildir_update (BUFFY* mailbox) >++ { >++ char path[_POSIX_PATH_MAX]; >++ DIR *dirp; >++ struct dirent *de; >++ char *p; >++ >++ if(!option(OPTSIDEBAR)) >++ return; >++ >++ mailbox->msgcount = 0; >++ mailbox->msg_unread = 0; >++ mailbox->msg_flagged = 0; >++ >++ snprintf (path, sizeof (path), "%s/new", mailbox->path); >++ >++ if ((dirp = opendir (path)) == NULL) >++ { >++ mailbox->magic = 0; >++ return; >++ } >++ >++ while ((de = readdir (dirp)) != NULL) >++ { >++ if (*de->d_name == '.') >++ continue; >++ >++ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { >++ mailbox->new = 1; >++ mailbox->msgcount++; >++ mailbox->msg_unread++; >++ } >++ } >++ >++ closedir (dirp); >++ snprintf (path, sizeof (path), "%s/cur", mailbox->path); >++ >++ if ((dirp = opendir (path)) == NULL) >++ { >++ mailbox->magic = 0; >++ return; >++ } >++ >++ while ((de = readdir (dirp)) != NULL) >++ { >++ if (*de->d_name == '.') >++ continue; >++ >++ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { >++ mailbox->msgcount++; >++ if ((p = strstr (de->d_name, ":2,"))) { >++ if (!strchr (p + 3, 'T')) { >++ if (!strchr (p + 3, 'S')) >++ mailbox->msg_unread++; >++ if (strchr(p + 3, 'F')) >++ mailbox->msg_flagged++; >++ } > + } >++ } >++ } >++ >++ mailbox->sb_last_checked = time(NULL); >++ closedir (dirp); >++ } >++ >+ /* returns 1 if mailbox has new mail */ >+ static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb) >+ { >+*************** >+*** 351,357 **** >+ else >+ statcheck = sb->st_mtime > sb->st_atime >+ || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); >+! if (statcheck) >+ { >+ if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) >+ { >+--- 470,476 ---- >+ else >+ statcheck = sb->st_mtime > sb->st_atime >+ || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); >+! if ((!option(OPTSIDEBAR) && statcheck) || (option(OPTSIDEBAR) && mailbox->msg_unread > 0)) >+ { >+ if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) >+ { >+*************** >+*** 371,376 **** >+--- 490,516 ---- >+ return rc; >+ } >+ >++ /* update message counts for the sidebar */ >++ void buffy_mbox_update (BUFFY* mailbox, struct stat *sb) >++ { >++ CONTEXT *ctx = NULL; >++ >++ if(!option(OPTSIDEBAR)) >++ return; >++ if(mailbox->sb_last_checked > sb->st_mtime && mailbox->msgcount != 0) >++ return; /* no check necessary */ >++ >++ ctx = mx_open_mailbox(mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL); >++ if(ctx) >++ { >++ mailbox->msgcount = ctx->msgcount; >++ mailbox->msg_unread = ctx->unread; >++ mailbox->msg_flagged = ctx->flagged; >++ mailbox->sb_last_checked = time(NULL); >++ mx_close_mailbox(ctx, 0); >++ } >++ } >++ >+ int mutt_buffy_check (int force) >+ { >+ BUFFY *tmp; >+*************** >+*** 444,460 **** >+ { >+ case M_MBOX: >+ case M_MMDF: >+ if (buffy_mbox_hasnew (tmp, &sb) > 0) >+ BuffyCount++; >+ break; >+ >+ case M_MAILDIR: >+ if (buffy_maildir_hasnew (tmp) > 0) >+ BuffyCount++; >+ break; >+ >+ case M_MH: >+! mh_buffy(tmp); >+ if (tmp->new) >+ BuffyCount++; >+ break; >+--- 584,603 ---- >+ { >+ case M_MBOX: >+ case M_MMDF: >++ buffy_mbox_update (tmp, &sb); >+ if (buffy_mbox_hasnew (tmp, &sb) > 0) >+ BuffyCount++; >+ break; >+ >+ case M_MAILDIR: >++ buffy_maildir_update (tmp); >+ if (buffy_maildir_hasnew (tmp) > 0) >+ BuffyCount++; >+ break; >+ >+ case M_MH: >+! mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged, &tmp->sb_last_checked); >+! mh_buffy(tmp); >+ if (tmp->new) >+ BuffyCount++; >+ break; >+*** mutt-1.5.23-orig/buffy.h 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/buffy.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 23,35 **** >+--- 23,41 ---- >+ typedef struct buffy_t >+ { >+ char path[_POSIX_PATH_MAX]; >++ char realpath[_POSIX_PATH_MAX]; >+ off_t size; >+ struct buffy_t *next; >++ struct buffy_t *prev; >+ short new; /* mailbox has new mail */ >++ int msgcount; /* total number of messages */ >++ int msg_unread; /* number of unread messages */ >++ int msg_flagged; /* number of flagged messages */ >+ 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 */ >++ time_t sb_last_checked; /* time of last buffy check from sidebar */ >+ } >+ BUFFY; >+ >+*** mutt-1.5.23-orig/color.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/color.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 93,98 **** >+--- 93,100 ---- >+ { "bold", MT_COLOR_BOLD }, >+ { "underline", MT_COLOR_UNDERLINE }, >+ { "index", MT_COLOR_INDEX }, >++ { "sidebar_new", MT_COLOR_NEW }, >++ { "sidebar_flagged", MT_COLOR_FLAGGED }, >+ { NULL, 0 } >+ }; >+ >+*** mutt-1.5.23-orig/compose.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/compose.c 2014-04-12 12:15:56.000000000 -0500 >+*************** >+*** 72,78 **** >+ >+ #define HDR_XOFFSET 10 >+ #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ >+! #define W (COLS - HDR_XOFFSET) >+ >+ static const char * const Prompts[] = >+ { >+--- 72,78 ---- >+ >+ #define HDR_XOFFSET 10 >+ #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ >+! #define W (COLS - HDR_XOFFSET - SidebarWidth) >+ >+ static const char * const Prompts[] = >+ { >+*************** >+*** 110,116 **** >+ >+ static void redraw_crypt_lines (HEADER *msg) >+ { >+! mvaddstr (HDR_CRYPT, 0, "Security: "); >+ >+ if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) >+ { >+--- 110,116 ---- >+ >+ static void redraw_crypt_lines (HEADER *msg) >+ { >+! mvaddstr (HDR_CRYPT, SidebarWidth, "Security: "); >+ >+ if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) >+ { >+*************** >+*** 142,148 **** >+ } >+ >+ clrtoeol (); >+! move (HDR_CRYPTINFO, 0); >+ clrtoeol (); >+ >+ if ((WithCrypto & APPLICATION_PGP) >+--- 142,148 ---- >+ } >+ >+ clrtoeol (); >+! move (HDR_CRYPTINFO, SidebarWidth); >+ clrtoeol (); >+ >+ if ((WithCrypto & APPLICATION_PGP) >+*************** >+*** 159,165 **** >+ && (msg->security & ENCRYPT) >+ && SmimeCryptAlg >+ && *SmimeCryptAlg) { >+! mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "), >+ NONULL(SmimeCryptAlg)); >+ } >+ } >+--- 159,165 ---- >+ && (msg->security & ENCRYPT) >+ && SmimeCryptAlg >+ && *SmimeCryptAlg) { >+! mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "), >+ NONULL(SmimeCryptAlg)); >+ } >+ } >+*************** >+*** 172,178 **** >+ int c; >+ char *t; >+ >+! mvaddstr (HDR_MIX, 0, " Mix: "); >+ >+ if (!chain) >+ { >+--- 172,178 ---- >+ int c; >+ char *t; >+ >+! mvaddstr (HDR_MIX, SidebarWidth, " Mix: "); >+ >+ if (!chain) >+ { >+*************** >+*** 187,193 **** >+ if (t && t[0] == '0' && t[1] == '\0') >+ t = "<random>"; >+ >+! if (c + mutt_strlen (t) + 2 >= COLS) >+ break; >+ >+ addstr (NONULL(t)); >+--- 187,193 ---- >+ if (t && t[0] == '0' && t[1] == '\0') >+ t = "<random>"; >+ >+! if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth) >+ break; >+ >+ addstr (NONULL(t)); >+*************** >+*** 239,245 **** >+ >+ buf[0] = 0; >+ rfc822_write_address (buf, sizeof (buf), addr, 1); >+! mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]); >+ mutt_paddstr (W, buf); >+ } >+ >+--- 239,245 ---- >+ >+ buf[0] = 0; >+ rfc822_write_address (buf, sizeof (buf), addr, 1); >+! mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]); >+ mutt_paddstr (W, buf); >+ } >+ >+*************** >+*** 249,258 **** >+ draw_envelope_addr (HDR_TO, msg->env->to); >+ draw_envelope_addr (HDR_CC, msg->env->cc); >+ draw_envelope_addr (HDR_BCC, msg->env->bcc); >+! mvprintw (HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); >+ mutt_paddstr (W, NONULL (msg->env->subject)); >+ draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); >+! mvprintw (HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]); >+ mutt_paddstr (W, fcc); >+ >+ if (WithCrypto) >+--- 249,258 ---- >+ draw_envelope_addr (HDR_TO, msg->env->to); >+ draw_envelope_addr (HDR_CC, msg->env->cc); >+ draw_envelope_addr (HDR_BCC, msg->env->bcc); >+! mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); >+ mutt_paddstr (W, NONULL (msg->env->subject)); >+ draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); >+! mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]); >+ mutt_paddstr (W, fcc); >+ >+ if (WithCrypto) >+*************** >+*** 263,269 **** >+ #endif >+ >+ SETCOLOR (MT_COLOR_STATUS); >+! mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); >+ clrtoeol (); >+ >+ NORMAL_COLOR; >+--- 263,269 ---- >+ #endif >+ >+ SETCOLOR (MT_COLOR_STATUS); >+! mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments")); >+ clrtoeol (); >+ >+ NORMAL_COLOR; >+*************** >+*** 299,305 **** >+ /* redraw the expanded list so the user can see the result */ >+ buf[0] = 0; >+ rfc822_write_address (buf, sizeof (buf), *addr, 1); >+! move (line, HDR_XOFFSET); >+ mutt_paddstr (W, buf); >+ >+ return 0; >+--- 299,305 ---- >+ /* redraw the expanded list so the user can see the result */ >+ buf[0] = 0; >+ rfc822_write_address (buf, sizeof (buf), *addr, 1); >+! move (line, HDR_XOFFSET+SidebarWidth); >+ mutt_paddstr (W, buf); >+ >+ return 0; >+*************** >+*** 544,550 **** >+ if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) >+ { >+ mutt_str_replace (&msg->env->subject, buf); >+! move (HDR_SUBJECT, HDR_XOFFSET); >+ if (msg->env->subject) >+ mutt_paddstr (W, msg->env->subject); >+ else >+--- 544,550 ---- >+ if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) >+ { >+ mutt_str_replace (&msg->env->subject, buf); >+! move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth); >+ if (msg->env->subject) >+ mutt_paddstr (W, msg->env->subject); >+ else >+*************** >+*** 562,568 **** >+ { >+ strfcpy (fcc, buf, fcclen); >+ mutt_pretty_mailbox (fcc, fcclen); >+! move (HDR_FCC, HDR_XOFFSET); >+ mutt_paddstr (W, fcc); >+ fccSet = 1; >+ } >+--- 562,568 ---- >+ { >+ strfcpy (fcc, buf, fcclen); >+ mutt_pretty_mailbox (fcc, fcclen); >+! move (HDR_FCC, HDR_XOFFSET + SidebarWidth); >+ mutt_paddstr (W, fcc); >+ fccSet = 1; >+ } >+*** mutt-1.5.23-orig/configure.ac 2014-03-12 11:26:40.000000000 -0500 >+--- mutt-1.5.23/configure.ac 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1276,1281 **** >+--- 1276,1283 ---- >+ AC_DEFINE(HAVE_LANGINFO_YESEXPR,1,[ Define if you have <langinfo.h> and nl_langinfo(YESEXPR). ]) >+ fi >+ >++ AC_CHECK_FUNCS(fmemopen open_memstream) >++ >+ dnl Documentation tools >+ have_openjade="no" >+ AC_PATH_PROG([OSPCAT], [ospcat], [none]) >+*** mutt-1.5.23-orig/curs_main.c 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/curs_main.c 2014-04-12 21:45:21.000000000 -0500 >+*************** >+*** 26,32 **** >+--- 26,34 ---- >+ #include "mailbox.h" >+ #include "mapping.h" >+ #include "sort.h" >++ #include "buffy.h" >+ #include "mx.h" >++ #include "sidebar.h" >+ >+ #ifdef USE_POP >+ #include "pop.h" >+*************** >+*** 519,538 **** >+ menu->redraw |= REDRAW_STATUS; >+ if (do_buffy_notify) >+ { >+! if (mutt_buffy_notify () && option (OPTBEEPNEW)) >+! beep (); >+ } >+ else >+ do_buffy_notify = 1; > } >- else >- do_buffy_notify = 1; >-@@ -532,6 +538,7 @@ int mutt_index_menu (void) >- if (menu->redraw & REDRAW_FULL) >- { >- menu_redraw_full (menu); >-+ draw_sidebar(menu->menu); >- mutt_show_error (); >- } >- >-@@ -554,9 +561,12 @@ int mutt_index_menu (void) >- >- if (menu->redraw & REDRAW_STATUS) >+ >+ if (op != -1) >+ mutt_curs_set (0); >+ >+ if (menu->redraw & REDRAW_FULL) >+ { >+ menu_redraw_full (menu); >+ mutt_show_error (); >+ } >+ >+ if (menu->menu == MENU_MAIN) >+--- 521,551 ---- >+ menu->redraw |= REDRAW_STATUS; >+ if (do_buffy_notify) > { >-+ DrawFullLine = 1; >- menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); >-+ DrawFullLine = 0; >- move (option (OPTSTATUSONTOP) ? 0 : LINES-2, 0); >- SETCOLOR (MT_COLOR_STATUS); >-+ set_buffystats(Context); >- mutt_paddstr (COLS, buf); >- NORMAL_COLOR; >- menu->redraw &= ~REDRAW_STATUS; >-@@ -569,7 +579,7 @@ int mutt_index_menu (void) >- menu->oldcurrent = -1; >- >- if (option (OPTARROWCURSOR)) >-- move (menu->current - menu->top + menu->offset, 2); >-+ move (menu->current - menu->top + menu->offset, SidebarWidth + 2); >- else if (option (OPTBRAILLEFRIENDLY)) >- move (menu->current - menu->top + menu->offset, 0); >+! if (mutt_buffy_notify ()) >+! { >+! menu->redraw |= REDRAW_STATUS; >+! if (option (OPTBEEPNEW)) >+! beep (); >+! } >+ } > else >-@@ -1070,6 +1080,7 @@ int mutt_index_menu (void) >- menu->redraw = REDRAW_FULL; >- break; >- >-+ case OP_SIDEBAR_OPEN: >- case OP_MAIN_CHANGE_FOLDER: >- case OP_MAIN_NEXT_UNREAD_MAILBOX: >- >-@@ -1101,7 +1112,11 @@ int mutt_index_menu (void) >- { >- mutt_buffy (buf, sizeof (buf)); >- >-- if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) >-+ if ( op == OP_SIDEBAR_OPEN ) { >-+ if(!CurBuffy) >-+ break; >-+ strncpy( buf, CurBuffy->path, sizeof(buf) ); >-+ } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) >- { >- if (menu->menu == MENU_PAGER) >- { >-@@ -1119,6 +1134,7 @@ int mutt_index_menu (void) >- } >- >- mutt_expand_path (buf, sizeof (buf)); >-+ set_curbuffy(buf); >- if (mx_get_magic (buf) <= 0) >- { >- mutt_error (_("%s is not a mailbox."), buf); >-@@ -2209,6 +2225,12 @@ int mutt_index_menu (void) >- mutt_what_key(); >- break; >- >-+ case OP_SIDEBAR_SCROLL_UP: >-+ case OP_SIDEBAR_SCROLL_DOWN: >-+ case OP_SIDEBAR_NEXT: >-+ case OP_SIDEBAR_PREV: >-+ scroll_sidebar(op, menu->menu); >-+ break; >- default: >- if (menu->menu == MENU_MAIN) >- km_error_key (MENU_MAIN); >-diff -uNp -r mutt-1.5.22.orig/flags.c mutt-1.5.22/flags.c >---- mutt-1.5.22.orig/flags.c Sun Feb 21 22:10:41 2010 >-+++ mutt-1.5.22/flags.c Fri Oct 18 10:18:45 2013 >-@@ -22,8 +22,10 @@ >- >- #include "mutt.h" >- #include "mutt_curses.h" >-+#include "mutt_menu.h" >- #include "sort.h" >- #include "mx.h" >-+#include "sidebar.h" >- >- void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx) >- { >-@@ -263,6 +265,7 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag >- */ >- if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged)) >- h->searched = 0; >-+ draw_sidebar(0); >- } >- >- void mutt_tag_set_flag (int flag, int bf) >-diff -uNp -r mutt-1.5.22.orig/functions.h mutt-1.5.22/functions.h >---- mutt-1.5.22.orig/functions.h Sat Dec 3 19:10:04 2011 >-+++ mutt-1.5.22/functions.h Fri Oct 18 10:18:45 2013 >-@@ -169,6 +169,11 @@ const struct binding_t OpMain[] = { /* map: index */ >- { "decrypt-save", OP_DECRYPT_SAVE, NULL }, >- >- >-+ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, >-+ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, >-+ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, >-+ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, >-+ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, >- { NULL, 0, NULL } >- }; >- >-@@ -272,6 +277,11 @@ const struct binding_t OpPager[] = { /* map: pager */ >- >- { "what-key", OP_WHAT_KEY, NULL }, >- >+ do_buffy_notify = 1; >+ } >+ >++ if(option(OPTSIDEBAR)) >++ menu->redraw |= REDRAW_SIDEBAR; >++ >+ if (op != -1) >+ mutt_curs_set (0); >+ >+ if (menu->redraw & REDRAW_FULL) >+ { >+ menu_redraw_full (menu); >++ draw_sidebar(menu->menu); >+ mutt_show_error (); >++ } else if(menu->redraw & REDRAW_SIDEBAR) { >++ draw_sidebar(menu->menu); >++ menu->redraw &= ~REDRAW_SIDEBAR; >+ } >+ >+ if (menu->menu == MENU_MAIN) >+*************** >+*** 554,562 **** >+--- 567,578 ---- >+ >+ if (menu->redraw & REDRAW_STATUS) >+ { >++ DrawFullLine = 1; >+ menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); >++ DrawFullLine = 0; >+ move (option (OPTSTATUSONTOP) ? 0 : LINES-2, 0); >+ SETCOLOR (MT_COLOR_STATUS); >++ set_buffystats(Context); >+ mutt_paddstr (COLS, buf); >+ NORMAL_COLOR; >+ menu->redraw &= ~REDRAW_STATUS; >+*************** >+*** 569,575 **** >+ menu->oldcurrent = -1; >+ >+ if (option (OPTARROWCURSOR)) >+! move (menu->current - menu->top + menu->offset, 2); >+ else if (option (OPTBRAILLEFRIENDLY)) >+ move (menu->current - menu->top + menu->offset, 0); >+ else >+--- 585,591 ---- >+ menu->oldcurrent = -1; >+ >+ if (option (OPTARROWCURSOR)) >+! move (menu->current - menu->top + menu->offset, SidebarWidth + 2); >+ else if (option (OPTBRAILLEFRIENDLY)) >+ move (menu->current - menu->top + menu->offset, 0); >+ else >+*************** >+*** 1011,1016 **** >+--- 1027,1033 ---- >+ break; >+ >+ CHECK_MSGCOUNT; >++ CHECK_VISIBLE; >+ CHECK_READONLY; >+ { >+ int oldvcount = Context->vcount; >+*************** >+*** 1070,1075 **** >+--- 1087,1093 ---- >+ menu->redraw = REDRAW_FULL; >+ break; >+ >++ case OP_SIDEBAR_OPEN: >+ case OP_MAIN_CHANGE_FOLDER: >+ case OP_MAIN_NEXT_UNREAD_MAILBOX: >+ >+*************** >+*** 1101,1107 **** >+ { >+ mutt_buffy (buf, sizeof (buf)); >+ >+! if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) >+ { >+ if (menu->menu == MENU_PAGER) >+ { >+--- 1119,1129 ---- >+ { >+ mutt_buffy (buf, sizeof (buf)); >+ >+! if ( op == OP_SIDEBAR_OPEN ) { >+! if(!CurBuffy) >+! break; >+! strncpy( buf, CurBuffy->path, sizeof(buf) ); >+! } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) >+ { >+ if (menu->menu == MENU_PAGER) >+ { >+*************** >+*** 1119,1124 **** >+--- 1141,1147 ---- >+ } >+ >+ mutt_expand_path (buf, sizeof (buf)); >++ set_curbuffy(buf); >+ if (mx_get_magic (buf) <= 0) >+ { >+ mutt_error (_("%s is not a mailbox."), buf); >+*************** >+*** 2209,2214 **** >+--- 2232,2243 ---- >+ mutt_what_key(); >+ break; >+ >++ case OP_SIDEBAR_SCROLL_UP: >++ case OP_SIDEBAR_SCROLL_DOWN: >++ case OP_SIDEBAR_NEXT: >++ case OP_SIDEBAR_PREV: >++ scroll_sidebar(op, menu->menu); >++ break; >+ default: >+ if (menu->menu == MENU_MAIN) >+ km_error_key (MENU_MAIN); >+*** mutt-1.5.23-orig/flags.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/flags.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 22,29 **** >+--- 22,31 ---- >+ >+ #include "mutt.h" >+ #include "mutt_curses.h" >++ #include "mutt_menu.h" >+ #include "sort.h" >+ #include "mx.h" >++ #include "sidebar.h" >+ >+ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx) >+ { >+*************** >+*** 263,268 **** >+--- 265,271 ---- >+ */ >+ if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged)) >+ h->searched = 0; >++ draw_sidebar(0); >+ } >+ >+ void mutt_tag_set_flag (int flag, int bf) >+*** mutt-1.5.23-orig/functions.h 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/functions.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 169,174 **** >+--- 169,179 ---- >+ { "decrypt-save", OP_DECRYPT_SAVE, NULL }, >+ >+ > + { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, > + { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, >-+ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, >-+ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, >-+ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, >- { NULL, 0, NULL } >- }; >- >-diff -uNp -r mutt-1.5.22.orig/globals.h mutt-1.5.22/globals.h >---- mutt-1.5.22.orig/globals.h Sat Dec 3 19:10:04 2011 >-+++ mutt-1.5.22/globals.h Fri Oct 18 10:18:45 2013 >-@@ -117,6 +117,7 @@ WHERE short SearchContext; >- WHERE char *SendCharset; >- WHERE char *Sendmail; >- WHERE char *Shell; >-+WHERE char *SidebarDelim; >- WHERE char *Signature; >- WHERE char *SimpleSearch; >- #if USE_SMTP >-@@ -208,6 +209,9 @@ WHERE short ScoreThresholdDelete; >- WHERE short ScoreThresholdRead; >- WHERE short ScoreThresholdFlag; >- >-+WHERE struct buffy_t *CurBuffy INITVAL(0); >-+WHERE short DrawFullLine INITVAL(0); >-+WHERE short SidebarWidth; >- #ifdef USE_IMAP >- WHERE short ImapKeepalive; >- WHERE short ImapPipelineDepth; >-diff -uNp -r mutt-1.5.22.orig/imap/command.c mutt-1.5.22/imap/command.c >---- mutt-1.5.22.orig/imap/command.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/imap/command.c Fri Oct 18 10:18:45 2013 >-@@ -1012,6 +1012,13 @@ static void cmd_parse_status (IMAP_DATA* idata, char* >- opened */ >- status->uidnext = oldun; >- >-+ /* Added to make the sidebar show the correct numbers */ >-+ if (status->messages) >-+ { >-+ inc->msgcount = status->messages; >-+ inc->msg_unread = status->unseen; >-+ } >-+ >- FREE (&value); >- return; >- } >-diff -uNp -r mutt-1.5.22.orig/imap/imap.c mutt-1.5.22/imap/imap.c >---- mutt-1.5.22.orig/imap/imap.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/imap/imap.c Fri Oct 18 10:18:45 2013 >-@@ -1514,7 +1514,7 @@ int imap_buffy_check (int force) >- >- imap_munge_mbox_name (munged, sizeof (munged), name); >- snprintf (command, sizeof (command), >-- "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged); >-+ "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged); >- >- if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) >- { >-diff -uNp -r mutt-1.5.22.orig/init.h mutt-1.5.22/init.h >---- mutt-1.5.22.orig/init.h Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/init.h Fri Oct 18 10:18:45 2013 >-@@ -1966,6 +1966,27 @@ struct option_t MuttVars[] = { >- ** not used. >- ** (PGP only) >++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, >++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, >++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, >+ { NULL, 0, NULL } >+ }; >+ >+*************** >+*** 272,277 **** >+--- 277,287 ---- >+ >+ { "what-key", OP_WHAT_KEY, NULL }, >+ >++ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, >++ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, >++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, >++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, >++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, >+ { NULL, 0, NULL } >+ }; >+ >+*** mutt-1.5.23-orig/globals.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/globals.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 117,122 **** >+--- 117,125 ---- >+ WHERE char *SendCharset; >+ WHERE char *Sendmail; >+ WHERE char *Shell; >++ WHERE char *SidebarDelim; >++ WHERE char *SidebarFormat; >++ WHERE char *SidebarIndentStr; >+ WHERE char *Signature; >+ WHERE char *SimpleSearch; >+ #if USE_SMTP >+*************** >+*** 208,213 **** >+--- 211,219 ---- >+ WHERE short ScoreThresholdRead; >+ WHERE short ScoreThresholdFlag; >+ >++ WHERE struct buffy_t *CurBuffy INITVAL(0); >++ WHERE short DrawFullLine INITVAL(0); >++ WHERE short SidebarWidth; >+ #ifdef USE_IMAP >+ WHERE short ImapKeepalive; >+ WHERE short ImapPipelineDepth; >+*** mutt-1.5.23-orig/handler.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/handler.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1599,1604 **** >+--- 1599,1609 ---- >+ size_t tmplength = 0; >+ int rc = 0; >+ >++ #ifdef HAVE_FMEMOPEN >++ char *temp; >++ size_t tempsize; >++ #endif >++ >+ int oflags = s->flags; >+ >+ /* first determine which handler to use to process this part */ >+*************** >+*** 1711,1716 **** >+--- 1716,1729 ---- >+ { >+ /* decode to a tempfile, saving the original destination */ >+ fp = s->fpout; >++ #ifdef HAVE_FMEMOPEN >++ if ((s->fpout = open_memstream(&temp, &tempsize)) == NULL) >++ { >++ mutt_error _("Unable to open memory stream!"); >++ dprint (1, (debugfile, "Can't open memory stream.\n")); >++ goto bail; >++ } >++ #else >+ mutt_mktemp (tempfile, sizeof (tempfile)); >+ if ((s->fpout = safe_fopen (tempfile, "w")) == NULL) >+ { >+*************** >+*** 1718,1723 **** >+--- 1731,1737 ---- >+ dprint (1, (debugfile, "Can't open %s.\n", tempfile)); >+ goto bail; >+ } >++ #endif >+ /* decoding the attachment changes the size and offset, so save a copy >+ * of the "real" values now, and restore them after processing >+ */ >+*************** >+*** 1746,1753 **** >+--- 1760,1778 ---- >+ /* restore final destination and substitute the tempfile for input */ >+ s->fpout = fp; >+ fp = s->fpin; >++ #ifdef HAVE_FMEMOPEN >++ if(tempsize) >++ s->fpin = fmemopen(temp, tempsize, "r"); >++ else /* fmemopen cannot handle zero-length buffers */ >++ s->fpin = safe_fopen ("/dev/null", "r"); >++ if(s->fpin == NULL) { >++ mutt_perror("failed to re-open memstream!"); >++ return (-1); >++ } >++ #else >+ s->fpin = fopen (tempfile, "r"); >+ unlink (tempfile); >++ #endif >+ >+ /* restore the prefix */ >+ s->prefix = savePrefix; >+*************** >+*** 1773,1778 **** >+--- 1798,1807 ---- >+ >+ /* restore the original source stream */ >+ safe_fclose (&s->fpin); >++ #ifdef HAVE_FMEMOPEN >++ if(tempsize) >++ FREE(&temp); >++ #endif >+ s->fpin = fp; >+ } >+ } >+*** mutt-1.5.23-orig/init.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/init.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1966,1971 **** >+--- 1966,2019 ---- >+ ** not used. >+ ** (PGP only) >+ */ >++ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, UL "|"}, >++ /* >++ ** .pp >++ ** This specifies the delimiter between the sidebar (if visible) and >++ ** other screens. >++ */ >++ {"sidebar_indentstr", DT_STR, R_BOTH, UL &SidebarIndentStr, UL " "}, >++ /* >++ ** .pp >++ ** This specifies the string that is used to indent items >++ ** with sidebar_folderindent= yes >++ */ >++ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 }, >++ /* >++ ** .pp >++ ** This specifies whether or not to show sidebar (left-side list of folders). >++ */ >++ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 }, >++ /* >++ ** .pp >++ ** This specifies whether or not to sort the sidebar alphabetically. >++ */ >++ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 }, >++ /* >++ ** .pp >++ ** The width of the sidebar. >++ */ >++ { "sidebar_shortpath", DT_BOOL, R_BOTH, OPTSIDEBARSHORTPATH, 1 }, >++ /* >++ ** .pp >++ ** Should the sidebar shorten the path showed. >++ */ >++ {"sidebar_format", DT_STR, R_NONE, UL &SidebarFormat, UL "%B%?F? [%F]?%* %?N?%N/?%4S"}, >++ /* >++ ** .pp >++ ** Format string for the sidebar. The sequences `%N', `%F' and `%S' >++ ** will be replaced by the number of new or flagged messages or the total >++ ** size of them mailbox. `%B' will be replaced with the name of the mailbox. >++ ** The `%!' sequence will be expanded to `!' if there is one flagged message; >++ ** to `!!' if there are two flagged messages; and to `n!' for n flagged >++ ** messages, n>2. >++ */ >++ { "sidebar_folderindent", DT_BOOL, R_BOTH, OPTSIDEBARFOLDERINDENT, 0 }, >++ /* >++ ** .pp >++ ** Should folders be indented in the sidebar. >++ */ >++ >+ { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0}, >+ /* >+ ** .pp >+*** mutt-1.5.23-orig/mailbox.h 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mailbox.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 27,32 **** >+--- 27,33 ---- >+ #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses >+ * safe_fopen() for mbox-style folders. >+ */ >++ #define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */ >+ >+ /* mx_open_new_message() */ >+ #define M_ADD_FROM 1 /* add a From_ line */ >+*** mutt-1.5.23-orig/main.c 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/main.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 50,55 **** >+--- 50,56 ---- >+ #include <unistd.h> >+ #include <errno.h> >+ #include <sys/stat.h> >++ #include <limits.h> >+ #include <sys/utsname.h> >+ >+ #ifdef HAVE_GETOPT_H >+*************** >+*** 555,561 **** >+ >+ int main (int argc, char **argv) >+ { >+! char folder[_POSIX_PATH_MAX] = ""; >+ char *subject = NULL; >+ char *includeFile = NULL; >+ char *draftFile = NULL; >+--- 556,562 ---- >+ >+ int main (int argc, char **argv) >+ { >+! char folder[PATH_MAX] = ""; >+ char *subject = NULL; >+ char *includeFile = NULL; >+ char *draftFile = NULL; >+*************** >+*** 1025,1030 **** >+--- 1026,1038 ---- >+ strfcpy (folder, NONULL(Spoolfile), sizeof (folder)); >+ mutt_expand_path (folder, sizeof (folder)); >+ >++ { >++ char tmpfolder[PATH_MAX]; >++ strfcpy (tmpfolder, folder, sizeof (tmpfolder)); >++ if(!realpath(tmpfolder, folder)) >++ strfcpy (folder, tmpfolder, sizeof (tmpfolder)); >++ } >++ >+ mutt_str_replace (&CurrentFolder, folder); >+ mutt_str_replace (&LastFolder, folder); >+ >+*************** >+*** 1047,1052 **** >+--- 1055,1061 ---- >+ if((Context = mx_open_mailbox (folder, ((flags & M_RO) || option (OPTREADONLY)) ? M_READONLY : 0, NULL)) >+ || !explicit_folder) >+ { >++ set_curbuffy(folder); >+ mutt_index_menu (); >+ if (Context) >+ FREE (&Context); >+*** mutt-1.5.23-orig/Makefile.am 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/Makefile.am 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 32,37 **** >+--- 32,38 ---- >+ rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \ >+ score.c send.c sendlib.c signal.c sort.c \ >+ status.c system.c thread.c charset.c history.c lib.c \ >++ sidebar.c \ >+ muttlib.c editmsg.c mbyte.c \ >+ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c >+ >+*** mutt-1.5.23-orig/Makefile.in 2014-03-12 11:26:44.000000000 -0500 >+--- mutt-1.5.23/Makefile.in 2014-04-12 12:12:38.000000000 -0500 >+*************** >+*** 129,135 **** >+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ >+ history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ >+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ >+! ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) >+ am__objects_1 = >+ am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ >+ $(am__objects_1) >+--- 129,136 ---- >+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ >+ history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ >+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ >+! ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) \ >+! sidebar.$(OBJEXT) >+ am__objects_1 = >+ am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ >+ $(am__objects_1) >+*************** >+*** 468,474 **** >+ score.c send.c sendlib.c signal.c sort.c \ >+ status.c system.c thread.c charset.c history.c lib.c \ >+ muttlib.c editmsg.c mbyte.c \ >+! url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c >+ >+ nodist_mutt_SOURCES = $(BUILT_SOURCES) >+ mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ >+--- 469,476 ---- >+ score.c send.c sendlib.c signal.c sort.c \ >+ status.c system.c thread.c charset.c history.c lib.c \ >+ muttlib.c editmsg.c mbyte.c \ >+! url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c \ >+! sidebar.c >+ >+ nodist_mutt_SOURCES = $(BUILT_SOURCES) >+ mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ >+*************** >+*** 500,506 **** >+ README.SSL smime.h group.h \ >+ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ >+ ChangeLog mkchangelog.sh mutt_idna.h \ >+! snprintf.c regex.c crypt-gpgme.h hcachever.sh.in \ >+ txt2c.c txt2c.sh version.sh check_sec.sh >+ >+ EXTRA_SCRIPTS = smime_keys >+--- 502,508 ---- >+ README.SSL smime.h group.h \ >+ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ >+ ChangeLog mkchangelog.sh mutt_idna.h \ >+! snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in \ >+ txt2c.c txt2c.sh version.sh check_sec.sh >+ >+ EXTRA_SCRIPTS = smime_keys >+*** mutt-1.5.23-orig/mbox.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mbox.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 100,105 **** >+--- 100,106 ---- >+ mutt_perror (ctx->path); >+ return (-1); >+ } >++ ctx->atime = sb.st_atime; >+ ctx->mtime = sb.st_mtime; >+ ctx->size = sb.st_size; >+ >+*************** >+*** 251,256 **** >+--- 252,258 ---- >+ >+ ctx->size = sb.st_size; >+ ctx->mtime = sb.st_mtime; >++ ctx->atime = sb.st_atime; >+ >+ #ifdef NFS_ATTRIBUTE_HACK >+ if (sb.st_mtime > sb.st_atime) >+*** mutt-1.5.23-orig/menu.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/menu.c 2014-04-12 21:31:16.000000000 -0500 >+*************** >+*** 24,29 **** >+--- 24,30 ---- >+ #include "mutt_curses.h" >+ #include "mutt_menu.h" >+ #include "mbyte.h" >++ #include "sidebar.h" >+ >+ extern size_t UngetCount; >+ >+*************** >+*** 186,192 **** >+ { >+ char *scratch = safe_strdup (s); >+ int shift = option (OPTARROWCURSOR) ? 3 : 0; >+! int cols = COLS - shift; >+ >+ mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); >+ s[n - 1] = 0; >+--- 187,193 ---- >+ { >+ char *scratch = safe_strdup (s); >+ int shift = option (OPTARROWCURSOR) ? 3 : 0; >+! int cols = COLS - shift - SidebarWidth; >+ >+ mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); >+ s[n - 1] = 0; >+*************** >+*** 239,244 **** >+--- 240,246 ---- >+ int do_color; >+ int attr; >+ >++ draw_sidebar(1); >+ for (i = menu->top; i < menu->top + menu->pagelen; i++) >+ { >+ if (i < menu->max) >+*************** >+*** 249,255 **** >+ menu_pad_string (buf, sizeof (buf)); >+ >+ ATTRSET(attr); >+! move(i - menu->top + menu->offset, 0); >+ do_color = 1; >+ >+ if (i == menu->current) >+--- 251,257 ---- >+ menu_pad_string (buf, sizeof (buf)); >+ >+ ATTRSET(attr); >+! move(i - menu->top + menu->offset, SidebarWidth); >+ do_color = 1; >+ >+ if (i == menu->current) >+*************** >+*** 272,278 **** >+ else >+ { >+ NORMAL_COLOR; >+! CLEARLINE(i - menu->top + menu->offset); >+ } >+ } >+ NORMAL_COLOR; >+--- 274,280 ---- >+ else >+ { >+ NORMAL_COLOR; >+! CLEARLINE_WIN (i - menu->top + menu->offset); >+ } >+ } >+ NORMAL_COLOR; >+*************** >+*** 289,295 **** >+ return; >+ } >+ >+! move (menu->oldcurrent + menu->offset - menu->top, 0); >+ ATTRSET(menu->color (menu->oldcurrent)); >+ >+ if (option (OPTARROWCURSOR)) >+--- 291,297 ---- >+ return; >+ } >+ >+! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); >+ ATTRSET(menu->color (menu->oldcurrent)); >+ >+ if (option (OPTARROWCURSOR)) >+*************** >+*** 301,313 **** >+ { >+ menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); >+ menu_pad_string (buf, sizeof (buf)); >+! move (menu->oldcurrent + menu->offset - menu->top, 3); >+ print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); >+ } >+ >+ /* now draw it in the new location */ >+ SETCOLOR(MT_COLOR_INDICATOR); >+! mvaddstr(menu->current + menu->offset - menu->top, 0, "->"); >+ } >+ else >+ { >+--- 303,315 ---- >+ { >+ menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); >+ menu_pad_string (buf, sizeof (buf)); >+! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3); >+ print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); >+ } >+ >+ /* now draw it in the new location */ >+ SETCOLOR(MT_COLOR_INDICATOR); >+! mvaddstr(menu->current + menu->offset - menu->top, SidebarWidth, "->"); >+ } >+ else >+ { >+*************** >+*** 320,326 **** >+ menu_make_entry (buf, sizeof (buf), menu, menu->current); >+ menu_pad_string (buf, sizeof (buf)); >+ SETCOLOR(MT_COLOR_INDICATOR); >+! move(menu->current - menu->top + menu->offset, 0); >+ print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); >+ } >+ menu->redraw &= REDRAW_STATUS; >+--- 322,328 ---- >+ menu_make_entry (buf, sizeof (buf), menu, menu->current); >+ menu_pad_string (buf, sizeof (buf)); >+ SETCOLOR(MT_COLOR_INDICATOR); >+! move(menu->current - menu->top + menu->offset, SidebarWidth); >+ print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); >+ } >+ menu->redraw &= REDRAW_STATUS; >+*************** >+*** 332,338 **** >+ char buf[LONG_STRING]; >+ int attr = menu->color (menu->current); >+ >+! move (menu->current + menu->offset - menu->top, 0); >+ menu_make_entry (buf, sizeof (buf), menu, menu->current); >+ menu_pad_string (buf, sizeof (buf)); >+ >+--- 334,340 ---- >+ char buf[LONG_STRING]; >+ int attr = menu->color (menu->current); >+ >+! move (menu->current + menu->offset - menu->top, SidebarWidth); >+ menu_make_entry (buf, sizeof (buf), menu, menu->current); >+ menu_pad_string (buf, sizeof (buf)); >+ >+*************** >+*** 872,878 **** >+ >+ >+ if (option (OPTARROWCURSOR)) >+! move (menu->current - menu->top + menu->offset, 2); >+ else if (option (OPTBRAILLEFRIENDLY)) >+ move (menu->current - menu->top + menu->offset, 0); >+ else >+--- 874,880 ---- >+ >+ >+ if (option (OPTARROWCURSOR)) >+! move (menu->current - menu->top + menu->offset, SidebarWidth + 2); >+ else if (option (OPTBRAILLEFRIENDLY)) >+ move (menu->current - menu->top + menu->offset, 0); >+ else >+*** mutt-1.5.23-orig/mh.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mh.c 2014-04-11 11:04:59.000000000 -0500 >+*************** >+*** 295,300 **** >+--- 295,326 ---- >+ mhs_free_sequences (&mhs); >+ } >+ >++ void mh_buffy_update (const char *path, int *msgcount, int *msg_unread, int *msg_flagged, time_t *sb_last_checked) >++ { >++ int i; >++ struct mh_sequences mhs; >++ memset (&mhs, 0, sizeof (mhs)); >++ >++ if(!option(OPTSIDEBAR)) >++ return; >++ >++ if (mh_read_sequences (&mhs, path) < 0) >++ return; >++ >++ msgcount = 0; >++ msg_unread = 0; >++ msg_flagged = 0; >++ for (i = 0; i <= mhs.max; i++) >++ msgcount++; >++ if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) { >++ msg_unread++; >++ } >++ if (mhs_check (&mhs, i) & MH_SEQ_FLAGGED) >++ msg_flagged++; >++ mhs_free_sequences (&mhs); >++ *sb_last_checked = time(NULL); >++ } >++ >+ static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) >+ { >+ int fd; >+*** mutt-1.5.23-orig/mutt_curses.h 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mutt_curses.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 64,69 **** >+--- 64,70 ---- >+ #undef lines >+ #endif /* lines */ >+ >++ #define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol() >+ #define CLEARLINE(x) move(x,0), clrtoeol() >+ #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x) >+ #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0) >+*************** >+*** 120,125 **** >+--- 121,128 ---- >+ MT_COLOR_BOLD, >+ MT_COLOR_UNDERLINE, >+ MT_COLOR_INDEX, >++ MT_COLOR_NEW, >++ MT_COLOR_FLAGGED, >+ MT_COLOR_MAX >+ }; >+ >+*** mutt-1.5.23-orig/mutt_menu.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/mutt_menu.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 34,39 **** >+--- 34,40 ---- >+ #define REDRAW_FULL (1<<5) >+ #define REDRAW_BODY (1<<6) >+ #define REDRAW_SIGWINCH (1<<7) >++ #define REDRAW_SIDEBAR (1<<8) >+ >+ #define M_MODEFMT "-- Mutt: %s" >+ >+*** mutt-1.5.23-orig/mutt.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/mutt.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 421,426 **** >+--- 421,430 ---- >+ OPTSAVEEMPTY, >+ OPTSAVENAME, >+ OPTSCORE, >++ OPTSIDEBAR, >++ OPTSIDEBARSHORTPATH, >++ OPTSIDEBARSORT, >++ OPTSIDEBARFOLDERINDENT, >+ OPTSIGDASHES, >+ OPTSIGONTOP, >+ OPTSORTRE, >+*************** >+*** 861,866 **** >+--- 865,871 ---- >+ { >+ char *path; >+ FILE *fp; >++ time_t atime; >+ time_t mtime; >+ off_t size; >+ off_t vsize; >+*************** >+*** 895,900 **** >+--- 900,906 ---- >+ unsigned int quiet : 1; /* inhibit status messages? */ >+ unsigned int collapsed : 1; /* are all threads collapsed? */ >+ unsigned int closing : 1; /* mailbox is being closed */ >++ unsigned int peekonly : 1; /* just taking a glance, revert atime */ >+ >+ /* driver hooks */ >+ void *data; /* driver specific data */ >+*** mutt-1.5.23-orig/muttlib.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/muttlib.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1281,1286 **** >+--- 1281,1288 ---- >+ pl = pw = 1; >+ >+ /* see if there's room to add content, else ignore */ >++ if ( DrawFullLine ) >++ { >+ if ((col < COLS && wlen < destlen) || soft) >+ { >+ int pad; >+*************** >+*** 1324,1329 **** >+--- 1326,1377 ---- >+ col += wid; >+ src += pl; >+ } >++ } >++ else >++ { >++ if ((col < COLS-SidebarWidth && wlen < destlen) || soft) >++ { >++ int pad; >++ >++ /* get contents after padding */ >++ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags); >++ len = mutt_strlen (buf); >++ wid = mutt_strwidth (buf); >++ >++ /* try to consume as many columns as we can, if we don't have >++ * memory for that, use as much memory as possible */ >++ pad = (COLS - SidebarWidth - col - wid) / pw; >++ if (pad > 0 && wlen + (pad * pl) + len > destlen) >++ pad = ((signed)(destlen - wlen - len)) / pl; >++ if (pad > 0) >++ { >++ while (pad--) >++ { >++ memcpy (wptr, src, pl); >++ wptr += pl; >++ wlen += pl; >++ col += pw; >++ } >++ } >++ else if (soft && pad < 0) >++ { >++ /* \0-terminate dest for length computation in mutt_wstr_trunc() */ >++ *wptr = 0; >++ /* make sure right part is at most as wide as display */ >++ len = mutt_wstr_trunc (buf, destlen, COLS, &wid); >++ /* truncate left so that right part fits completely in */ >++ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col); >++ wptr = dest + wlen; >++ } >++ if (len + wlen > destlen) >++ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL); >++ memcpy (wptr, buf, len); >++ wptr += len; >++ wlen += len; >++ col += wid; >++ src += pl; >++ } >++ } >+ break; /* skip rest of input */ >+ } >+ else if (ch == '|') >+*** mutt-1.5.23-orig/mx.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mx.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 580,585 **** >+--- 580,586 ---- >+ * M_APPEND open mailbox for appending >+ * M_READONLY open mailbox in read-only mode >+ * M_QUIET only print error messages >++ * M_PEEK revert atime where applicable >+ * ctx if non-null, context struct to use > */ >-+ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, "|"}, >-+ /* >-+ ** .pp >-+ ** This specifies the delimiter between the sidebar (if visible) and >-+ ** other screens. >-+ */ >-+ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 }, >-+ /* >-+ ** .pp >-+ ** This specifies whether or not to show sidebar (left-side list of folders). >-+ */ >-+ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 }, >-+ /* >-+ ** .pp >-+ ** This specifies whether or not to sort the sidebar alphabetically. >-+ */ >-+ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 }, >-+ /* >-+ ** .pp >-+ ** The width of the sidebar. >-+ */ >- { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0}, >- /* >- ** .pp >-diff -uNp -r mutt-1.5.22.orig/mailbox.h mutt-1.5.22/mailbox.h >---- mutt-1.5.22.orig/mailbox.h Sun Feb 21 22:10:41 2010 >-+++ mutt-1.5.22/mailbox.h Fri Oct 18 10:18:45 2013 >-@@ -27,6 +27,7 @@ >- #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses >- * safe_fopen() for mbox-style folders. >- */ >-+#define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */ >- >- /* mx_open_new_message() */ >- #define M_ADD_FROM 1 /* add a From_ line */ >-diff -uNp -r mutt-1.5.22.orig/mbox.c mutt-1.5.22/mbox.c >---- mutt-1.5.22.orig/mbox.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/mbox.c Fri Oct 18 10:18:45 2013 >-@@ -100,6 +100,7 @@ int mmdf_parse_mailbox (CONTEXT *ctx) >- mutt_perror (ctx->path); >- return (-1); >- } >-+ ctx->atime = sb.st_atime; >- ctx->mtime = sb.st_mtime; >- ctx->size = sb.st_size; >- >-@@ -251,6 +252,7 @@ int mbox_parse_mailbox (CONTEXT *ctx) >- >- ctx->size = sb.st_size; >- ctx->mtime = sb.st_mtime; >-+ ctx->atime = sb.st_atime; >- >- #ifdef NFS_ATTRIBUTE_HACK >- if (sb.st_mtime > sb.st_atime) >-diff -uNp -r mutt-1.5.22.orig/menu.c mutt-1.5.22/menu.c >---- mutt-1.5.22.orig/menu.c Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/menu.c Fri Oct 18 10:18:45 2013 >-@@ -24,6 +24,7 @@ >- #include "mutt_curses.h" >- #include "mutt_menu.h" >- #include "mbyte.h" >-+#include "sidebar.h" >- >- extern size_t UngetCount; >- >-@@ -186,7 +187,7 @@ static void menu_pad_string (char *s, size_t n) >- { >- char *scratch = safe_strdup (s); >- int shift = option (OPTARROWCURSOR) ? 3 : 0; >-- int cols = COLS - shift; >-+ int cols = COLS - shift - SidebarWidth; >- >- mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); >- s[n - 1] = 0; >-@@ -239,6 +240,7 @@ void menu_redraw_index (MUTTMENU *menu) >- int do_color; >- int attr; >- >-+ draw_sidebar(1); >- for (i = menu->top; i < menu->top + menu->pagelen; i++) >- { >- if (i < menu->max) >-@@ -249,7 +251,7 @@ void menu_redraw_index (MUTTMENU *menu) >- menu_pad_string (buf, sizeof (buf)); >- >- ATTRSET(attr); >-- move(i - menu->top + menu->offset, 0); >-+ move(i - menu->top + menu->offset, SidebarWidth); >- do_color = 1; >- >- if (i == menu->current) >-@@ -272,7 +274,7 @@ void menu_redraw_index (MUTTMENU *menu) >- else >- { >- NORMAL_COLOR; >-- CLEARLINE(i - menu->top + menu->offset); >-+ CLEARLINE_WIN(i - menu->top + menu->offset); >- } >- } >- NORMAL_COLOR; >-@@ -289,7 +291,7 @@ void menu_redraw_motion (MUTTMENU *menu) >- return; >- } >+ CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx) >+*************** >+*** 602,607 **** >+--- 603,610 ---- >+ ctx->quiet = 1; >+ if (flags & M_READONLY) >+ ctx->readonly = 1; >++ if (flags & M_PEEK) >++ ctx->peekonly = 1; >+ >+ if (flags & (M_APPEND|M_NEWFOLDER)) >+ { >+*************** >+*** 701,713 **** >+ void mx_fastclose_mailbox (CONTEXT *ctx) >+ { >+ int i; >+ >+ if(!ctx) >+ return; >+ >+ /* never announce that a mailbox we've just left has new mail. #3290 >+ * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ >+! mutt_buffy_setnotified(ctx->path); >+ >+ if (ctx->mx_close) >+ ctx->mx_close (ctx); >+--- 704,729 ---- >+ void mx_fastclose_mailbox (CONTEXT *ctx) >+ { >+ int i; >++ #ifndef BUFFY_SIZE >++ struct utimbuf ut; >++ #endif >+ >+ if(!ctx) >+ return; >++ #ifndef BUFFY_SIZE >++ /* fix up the times so buffy won't get confused */ >++ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime) >++ { >++ ut.actime = ctx->atime; >++ ut.modtime = ctx->mtime; >++ utime (ctx->path, &ut); >++ } >++ #endif >+ >+ /* never announce that a mailbox we've just left has new mail. #3290 >+ * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ >+! if(!ctx->peekonly) >+! mutt_buffy_setnotified(ctx->path); >+ >+ if (ctx->mx_close) >+ ctx->mx_close (ctx); >+*************** >+*** 719,724 **** >+--- 735,742 ---- >+ mutt_clear_threads (ctx); >+ for (i = 0; i < ctx->msgcount; i++) >+ mutt_free_header (&ctx->hdrs[i]); >++ ctx->msgcount -= ctx->deleted; >++ set_buffystats(ctx); >+ FREE (&ctx->hdrs); >+ FREE (&ctx->v2r); >+ FREE (&ctx->path); >+*************** >+*** 812,817 **** >+--- 830,839 ---- >+ if (!ctx->hdrs[i]->deleted && ctx->hdrs[i]->read >+ && !(ctx->hdrs[i]->flagged && option (OPTKEEPFLAGGED))) >+ read_msgs++; >++ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read) >++ ctx->unread--; >++ if (ctx->hdrs[i]->deleted && ctx->hdrs[i]->flagged) >++ ctx->flagged--; >+ } >+ >+ if (read_msgs && quadoption (OPT_MOVE) != M_NO) >+*** mutt-1.5.23-orig/mx.h 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mx.h 2014-04-11 11:11:47.000000000 -0500 >+*************** >+*** 57,62 **** >+--- 57,63 ---- >+ int mh_read_dir (CONTEXT *, const char *); >+ int mh_sync_mailbox (CONTEXT *, int *); >+ int mh_check_mailbox (CONTEXT *, int *); >++ void mh_buffy_update (const char *, int *, int *, int *, time_t *); >+ int mh_check_empty (const char *); >+ >+ int maildir_read_dir (CONTEXT *); >+*** mutt-1.5.23-orig/OPS 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/OPS 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 179,181 **** >+--- 179,186 ---- >+ OP_MAIN_SHOW_LIMIT "show currently active limit pattern" >+ OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread" >+ OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads" >++ OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page" >++ OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page" >++ OP_SIDEBAR_NEXT "go down to next mailbox" >++ OP_SIDEBAR_PREV "go to previous mailbox" >++ OP_SIDEBAR_OPEN "open hilighted mailbox" >+*** mutt-1.5.23-orig/pager.c 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/pager.c 2014-04-12 21:53:15.000000000 -0500 >+*************** >+*** 29,34 **** >+--- 29,35 ---- >+ #include "pager.h" >+ #include "attach.h" >+ #include "mbyte.h" >++ #include "sidebar.h" >+ >+ #include "mutt_crypt.h" >+ >+*************** >+*** 1095,1100 **** >+--- 1096,1102 ---- >+ wchar_t wc; >+ mbstate_t mbstate; >+ int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap); >++ wrap_cols -= SidebarWidth; >+ >+ if (check_attachment_marker ((char *)buf) == 0) >+ wrap_cols = COLS; >+*************** >+*** 1572,1577 **** >+--- 1574,1580 ---- >+ >+ int bodyoffset = 1; /* offset of first line of real text */ >+ int statusoffset = 0; /* offset for the status bar */ >++ int statuswidth; >+ int helpoffset = LINES - 2; /* offset for the help bar. */ >+ int bodylen = LINES - 2 - bodyoffset; /* length of displayable area */ >+ >+*************** >+*** 1746,1752 **** >+ if ((redraw & REDRAW_BODY) || topline != oldtopline) >+ { >+ do { >+! move (bodyoffset, 0); >+ curline = oldtopline = topline; >+ lines = 0; >+ force_redraw = 0; >+--- 1749,1755 ---- >+ if ((redraw & REDRAW_BODY) || topline != oldtopline) >+ { >+ do { >+! move (bodyoffset, SidebarWidth); >+ curline = oldtopline = topline; >+ lines = 0; >+ force_redraw = 0; >+*************** >+*** 1759,1764 **** >+--- 1762,1768 ---- >+ &QuoteList, &q_level, &force_redraw, &SearchRE) > 0) >+ lines++; >+ curline++; >++ move(lines + bodyoffset, SidebarWidth); >+ } >+ last_offset = lineInfo[curline].offset; >+ } while (force_redraw); >+*************** >+*** 1771,1776 **** >+--- 1775,1781 ---- >+ addch ('~'); >+ addch ('\n'); >+ lines++; >++ move(lines + bodyoffset, SidebarWidth); >+ } >+ NORMAL_COLOR; >+ >+*************** >+*** 1788,1816 **** >+ hfi.ctx = Context; >+ hfi.pager_progress = pager_progress_str; >+ >+ if (last_pos < sb.st_size - 1) >+ snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size)); >+ else >+ strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str)); >+ >+ /* print out the pager status bar */ >+! move (statusoffset, 0); >+ SETCOLOR (MT_COLOR_STATUS); >+ >+ if (IsHeader (extra) || IsMsgAttach (extra)) >+ { >+! size_t l1 = COLS * MB_LEN_MAX; >+ size_t l2 = sizeof (buffer); >+ hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; >+ mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); >+! mutt_paddstr (COLS, buffer); >+ } >+ else >+ { >+ char bn[STRING]; >+ snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); >+! mutt_paddstr (COLS, bn); >+ } >+ NORMAL_COLOR; >+ } >+ >+--- 1793,1831 ---- >+ hfi.ctx = Context; >+ hfi.pager_progress = pager_progress_str; >+ >++ statuswidth = COLS - (option(OPTSTATUSONTOP) && PagerIndexLines > 0 ? SidebarWidth : 0); >++ >+ if (last_pos < sb.st_size - 1) >+ snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size)); >+ else >+ strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str)); >+ >+ /* print out the pager status bar */ >+! move (statusoffset, SidebarWidth); >+ SETCOLOR (MT_COLOR_STATUS); >++ if(option(OPTSTATUSONTOP) && PagerIndexLines > 0) { >++ CLEARLINE_WIN (statusoffset); >++ } else { >++ CLEARLINE (statusoffset); >++ DrawFullLine = 1; /* for mutt_make_string_info */ >++ } >+ >+ if (IsHeader (extra) || IsMsgAttach (extra)) >+ { >+! size_t l1 = statuswidth * MB_LEN_MAX; >+ size_t l2 = sizeof (buffer); >+ hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; >+ mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); >+! mutt_paddstr (statuswidth, buffer); >+ } >+ else >+ { >+ char bn[STRING]; >+ snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); >+! mutt_paddstr (statuswidth, bn); >+ } >++ if(!option(OPTSTATUSONTOP) || PagerIndexLines == 0) >++ DrawFullLine = 0; /* reset */ >+ NORMAL_COLOR; >+ } >+ >+*************** >+*** 1819,1834 **** >+ /* redraw the pager_index indicator, because the >+ * flags for this message might have changed. */ >+ menu_redraw_current (index); >+ >+ /* print out the index status bar */ >+ menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); > >-- move (menu->oldcurrent + menu->offset - menu->top, 0); >-+ move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); >- ATTRSET(menu->color (menu->oldcurrent)); >- >- if (option (OPTARROWCURSOR)) >-@@ -301,13 +303,13 @@ void menu_redraw_motion (MUTTMENU *menu) >- { >- menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); >- menu_pad_string (buf, sizeof (buf)); >-- move (menu->oldcurrent + menu->offset - menu->top, 3); >-+ move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3); >- print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); >- } >- >- /* now draw it in the new location */ >- SETCOLOR(MT_COLOR_INDICATOR); >-- mvaddstr(menu->current + menu->offset - menu->top, 0, "->"); >-+ mvaddstr(menu->current + menu->offset - menu->top, SidebarWidth, "->"); >- } >- else >- { >-@@ -320,7 +322,7 @@ void menu_redraw_motion (MUTTMENU *menu) >- menu_make_entry (buf, sizeof (buf), menu, menu->current); >- menu_pad_string (buf, sizeof (buf)); >- SETCOLOR(MT_COLOR_INDICATOR); >-- move(menu->current - menu->top + menu->offset, 0); >-+ move(menu->current - menu->top + menu->offset, SidebarWidth); >- print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); >- } >- menu->redraw &= REDRAW_STATUS; >-@@ -332,7 +334,7 @@ void menu_redraw_current (MUTTMENU *menu) >- char buf[LONG_STRING]; >- int attr = menu->color (menu->current); >+! move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); >+ SETCOLOR (MT_COLOR_STATUS); >+! mutt_paddstr (COLS, buffer); >+ NORMAL_COLOR; >+ } >+ >+ redraw = 0; >+ >+ if (option(OPTBRAILLEFRIENDLY)) { >+--- 1834,1855 ---- >+ /* redraw the pager_index indicator, because the >+ * flags for this message might have changed. */ >+ menu_redraw_current (index); >++ draw_sidebar(MENU_PAGER); >+ >+ /* print out the index status bar */ >+ menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); > >-- move (menu->current + menu->offset - menu->top, 0); >-+ move (menu->current + menu->offset - menu->top, SidebarWidth); >- menu_make_entry (buf, sizeof (buf), menu, menu->current); >- menu_pad_string (buf, sizeof (buf)); >- >-@@ -872,7 +874,7 @@ int mutt_menuLoop (MUTTMENU *menu) >- >- >- if (option (OPTARROWCURSOR)) >-- move (menu->current - menu->top + menu->offset, 2); >-+ move (menu->current - menu->top + menu->offset, SidebarWidth + 2); >- else if (option (OPTBRAILLEFRIENDLY)) >- move (menu->current - menu->top + menu->offset, 0); >- else >-diff -uNp -r mutt-1.5.22.orig/mh.c mutt-1.5.22/mh.c >---- mutt-1.5.22.orig/mh.c Mon Apr 22 07:14:53 2013 >-+++ mutt-1.5.22/mh.c Fri Oct 18 10:18:45 2013 >-@@ -295,6 +295,28 @@ void mh_buffy(BUFFY *b) >- mhs_free_sequences (&mhs); >- } >- >-+void mh_buffy_update (const char *path, int *msgcount, int *msg_unread, int *msg_flagged) >-+{ >-+ int i; >-+ struct mh_sequences mhs; >-+ memset (&mhs, 0, sizeof (mhs)); >-+ >-+ if (mh_read_sequences (&mhs, path) < 0) >-+ return; >-+ >-+ msgcount = 0; >-+ msg_unread = 0; >-+ msg_flagged = 0; >-+ for (i = 0; i <= mhs.max; i++) >-+ msgcount++; >-+ if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) { >-+ msg_unread++; >-+ } >-+ if (mhs_check (&mhs, i) & MH_SEQ_FLAGGED) >-+ msg_flagged++; >-+ mhs_free_sequences (&mhs); >-+} >-+ >- static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) >- { >- int fd; >-diff -uNp -r mutt-1.5.22.orig/mutt.h mutt-1.5.22/mutt.h >---- mutt-1.5.22.orig/mutt.h Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/mutt.h Fri Oct 18 10:18:45 2013 >-@@ -420,6 +420,8 @@ enum >- OPTSAVEEMPTY, >- OPTSAVENAME, >- OPTSCORE, >-+ OPTSIDEBAR, >-+ OPTSIDEBARSORT, >- OPTSIGDASHES, >- OPTSIGONTOP, >- OPTSORTRE, >-@@ -860,6 +862,7 @@ typedef struct _context >- { >- char *path; >- FILE *fp; >-+ time_t atime; >- time_t mtime; >- off_t size; >- off_t vsize; >-@@ -894,6 +897,7 @@ typedef struct _context >- unsigned int quiet : 1; /* inhibit status messages? */ >- unsigned int collapsed : 1; /* are all threads collapsed? */ >- unsigned int closing : 1; /* mailbox is being closed */ >-+ unsigned int peekonly : 1; /* just taking a glance, revert atime */ >- >- /* driver hooks */ >- void *data; /* driver specific data */ >-diff -uNp -r mutt-1.5.22.orig/mutt_curses.h mutt-1.5.22/mutt_curses.h >---- mutt-1.5.22.orig/mutt_curses.h Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/mutt_curses.h Fri Oct 18 10:22:32 2013 >-@@ -64,6 +64,7 @@ >- #undef lines >- #endif /* lines */ >- >-+#define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol() >- #define CLEARLINE(x) move(x,0), clrtoeol() >- #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x) >- #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0) >-@@ -120,6 +121,8 @@ enum >- MT_COLOR_BOLD, >- MT_COLOR_UNDERLINE, >- MT_COLOR_INDEX, >-+ MT_COLOR_NEW, >-+ MT_COLOR_FLAGGED, >- MT_COLOR_MAX >- }; >- >-diff -uNp -r mutt-1.5.22.orig/muttlib.c mutt-1.5.22/muttlib.c >---- mutt-1.5.22.orig/muttlib.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/muttlib.c Fri Oct 18 10:18:45 2013 >-@@ -1286,6 +1286,8 @@ void mutt_FormatString (char *dest, /* output buffer >- pl = pw = 1; >- >- /* see if there's room to add content, else ignore */ >-+ if ( DrawFullLine ) >-+ { >- if ((col < COLS && wlen < destlen) || soft) >- { >- int pad; >-@@ -1329,6 +1331,52 @@ void mutt_FormatString (char *dest, /* output buffer >- col += wid; >- src += pl; >- } >-+ } >-+ else >-+ { >-+ if ((col < COLS-SidebarWidth && wlen < destlen) || soft) >-+ { >-+ int pad; >-+ >-+ /* get contents after padding */ >-+ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags); >-+ len = mutt_strlen (buf); >-+ wid = mutt_strwidth (buf); >-+ >-+ /* try to consume as many columns as we can, if we don't have >-+ * memory for that, use as much memory as possible */ >-+ pad = (COLS - SidebarWidth - col - wid) / pw; >-+ if (pad > 0 && wlen + (pad * pl) + len > destlen) >-+ pad = ((signed)(destlen - wlen - len)) / pl; >-+ if (pad > 0) >-+ { >-+ while (pad--) >-+ { >-+ memcpy (wptr, src, pl); >-+ wptr += pl; >-+ wlen += pl; >-+ col += pw; >-+ } >-+ } >-+ else if (soft && pad < 0) >-+ { >-+ /* \0-terminate dest for length computation in mutt_wstr_trunc() */ >-+ *wptr = 0; >-+ /* make sure right part is at most as wide as display */ >-+ len = mutt_wstr_trunc (buf, destlen, COLS, &wid); >-+ /* truncate left so that right part fits completely in */ >-+ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col); >-+ wptr = dest + wlen; >-+ } >-+ if (len + wlen > destlen) >-+ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL); >-+ memcpy (wptr, buf, len); >-+ wptr += len; >-+ wlen += len; >-+ col += wid; >-+ src += pl; >-+ } >-+ } >- break; /* skip rest of input */ >- } >- else if (ch == '|') >-diff -uNp -r mutt-1.5.22.orig/mx.c mutt-1.5.22/mx.c >---- mutt-1.5.22.orig/mx.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/mx.c Fri Oct 18 10:18:45 2013 >-@@ -580,6 +580,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int f >- * M_APPEND open mailbox for appending >- * M_READONLY open mailbox in read-only mode >- * M_QUIET only print error messages >-+ * M_PEEK revert atime where applicable >- * ctx if non-null, context struct to use >- */ >- CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx) >-@@ -602,6 +603,8 @@ CONTEXT *mx_open_mailbox (const char *path, int flags, >- ctx->quiet = 1; >- if (flags & M_READONLY) >- ctx->readonly = 1; >-+ if (flags & M_PEEK) >-+ ctx->peekonly = 1; >- >- if (flags & (M_APPEND|M_NEWFOLDER)) >- { >-@@ -701,9 +704,21 @@ CONTEXT *mx_open_mailbox (const char *path, int flags, >- void mx_fastclose_mailbox (CONTEXT *ctx) >- { >- int i; >-+#ifndef BUFFY_SIZE >-+ struct utimbuf ut; >-+#endif >- >- if(!ctx) >- return; >-+#ifndef BUFFY_SIZE >-+ /* fix up the times so buffy won't get confused */ >-+ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime) >-+ { >-+ ut.actime = ctx->atime; >-+ ut.modtime = ctx->mtime; >-+ utime (ctx->path, &ut); >-+ } >-+#endif >- >- /* never announce that a mailbox we've just left has new mail. #3290 >- * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ >-diff -uNp -r mutt-1.5.22.orig/mx.h mutt-1.5.22/mx.h >---- mutt-1.5.22.orig/mx.h Mon Apr 22 07:14:53 2013 >-+++ mutt-1.5.22/mx.h Fri Oct 18 10:18:45 2013 >-@@ -57,6 +57,7 @@ void mbox_reset_atime (CONTEXT *, struct stat *); >- int mh_read_dir (CONTEXT *, const char *); >- int mh_sync_mailbox (CONTEXT *, int *); >- int mh_check_mailbox (CONTEXT *, int *); >-+void mh_buffy_update (const char *, int *, int *, int *); >- int mh_check_empty (const char *); >- >- int maildir_read_dir (CONTEXT *); >-diff -uNp -r mutt-1.5.22.orig/pager.c mutt-1.5.22/pager.c >---- mutt-1.5.22.orig/pager.c Mon Apr 22 07:17:32 2013 >-+++ mutt-1.5.22/pager.c Fri Oct 18 10:18:45 2013 >-@@ -29,6 +29,7 @@ >- #include "pager.h" >- #include "attach.h" >- #include "mbyte.h" >-+#include "sidebar.h" >- >- #include "mutt_crypt.h" >- >-@@ -1095,6 +1096,7 @@ static int format_line (struct line_t **lineInfo, int >- wchar_t wc; >- mbstate_t mbstate; >- int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap); >-+ wrap_cols -= SidebarWidth; >- >- if (check_attachment_marker ((char *)buf) == 0) >- wrap_cols = COLS; >-@@ -1746,7 +1748,7 @@ mutt_pager (const char *banner, const char *fname, int >- if ((redraw & REDRAW_BODY) || topline != oldtopline) >- { >- do { >-- move (bodyoffset, 0); >-+ move (bodyoffset, SidebarWidth); >- curline = oldtopline = topline; >- lines = 0; >- force_redraw = 0; >-@@ -1759,6 +1761,7 @@ mutt_pager (const char *banner, const char *fname, int >- &QuoteList, &q_level, &force_redraw, &SearchRE) > 0) >- lines++; >- curline++; >-+ move(lines + bodyoffset, SidebarWidth); >- } >- last_offset = lineInfo[curline].offset; >- } while (force_redraw); >-@@ -1771,6 +1774,7 @@ mutt_pager (const char *banner, const char *fname, int >- addch ('~'); >- addch ('\n'); >- lines++; >-+ move(lines + bodyoffset, SidebarWidth); >- } >- NORMAL_COLOR; >- >-@@ -1799,17 +1803,17 @@ mutt_pager (const char *banner, const char *fname, int >- >- if (IsHeader (extra) || IsMsgAttach (extra)) >- { >-- size_t l1 = COLS * MB_LEN_MAX; >-+ size_t l1 = (COLS-SidebarWidth) * MB_LEN_MAX; >- size_t l2 = sizeof (buffer); >- hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; >- mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); >-- mutt_paddstr (COLS, buffer); >-+ mutt_paddstr (COLS-SidebarWidth, buffer); >- } >- else >- { >- char bn[STRING]; >- snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); >-- mutt_paddstr (COLS, bn); >-+ mutt_paddstr (COLS-SidebarWidth, bn); >- } >- NORMAL_COLOR; >- } >-@@ -1819,16 +1823,21 @@ mutt_pager (const char *banner, const char *fname, int >- /* redraw the pager_index indicator, because the >- * flags for this message might have changed. */ >- menu_redraw_current (index); >-+ draw_sidebar(MENU_PAGER); >- >- /* print out the index status bar */ >- menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); >- >-- move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); >-+ move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), SidebarWidth); >- SETCOLOR (MT_COLOR_STATUS); >-- mutt_paddstr (COLS, buffer); >-+ mutt_paddstr (COLS-SidebarWidth, buffer); >- NORMAL_COLOR; >- } >- >-+ /* if we're not using the index, update every time */ >-+ if ( index == 0 ) >-+ draw_sidebar(MENU_PAGER); >-+ >- redraw = 0; >- >- if (option(OPTBRAILLEFRIENDLY)) { >-@@ -2762,6 +2771,13 @@ search_next: >- case OP_WHAT_KEY: >- mutt_what_key (); >- break; >-+ >-+ case OP_SIDEBAR_SCROLL_UP: >-+ case OP_SIDEBAR_SCROLL_DOWN: >-+ case OP_SIDEBAR_NEXT: >-+ case OP_SIDEBAR_PREV: >-+ scroll_sidebar(ch, MENU_PAGER); >-+ break; >- >- default: >- ch = -1; >-diff -uNp -r mutt-1.5.22.orig/sidebar.c mutt-1.5.22/sidebar.c >---- mutt-1.5.22.orig/sidebar.c Thu Jan 1 01:00:00 1970 >-+++ mutt-1.5.22/sidebar.c Fri Oct 18 10:18:45 2013 >-@@ -0,0 +1,333 @@ >-+/* >-+ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> >-+ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> >-+ * >-+ * This program is free software; you can redistribute it and/or modify >-+ * it under the terms of the GNU General Public License as published by >-+ * the Free Software Foundation; either version 2 of the License, or >-+ * (at your option) any later version. >-+ * >-+ * This program is distributed in the hope that it will be useful, >-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >-+ * GNU General Public License for more details. >-+ * >-+ * You should have received a copy of the GNU General Public License >-+ * along with this program; if not, write to the Free Software >-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. >-+ */ >-+ >-+ >-+#if HAVE_CONFIG_H >-+# include "config.h" >-+#endif >-+ >-+#include "mutt.h" >-+#include "mutt_menu.h" >-+#include "mutt_curses.h" >-+#include "sidebar.h" >-+#include "buffy.h" >-+#include <libgen.h> >-+#include "keymap.h" >-+#include <stdbool.h> >-+ >-+/*BUFFY *CurBuffy = 0;*/ >-+static BUFFY *TopBuffy = 0; >-+static BUFFY *BottomBuffy = 0; >-+static int known_lines = 0; >-+ >-+static int quick_log10(int n) >-+{ >-+ char string[32]; >-+ sprintf(string, "%d", n); >-+ return strlen(string); >-+} >-+ >-+void calc_boundaries (int menu) >-+{ >-+ BUFFY *tmp = Incoming; >-+ >-+ if ( known_lines != LINES ) { >-+ TopBuffy = BottomBuffy = 0; >-+ known_lines = LINES; >-+ } >-+ for ( ; tmp->next != 0; tmp = tmp->next ) >-+ tmp->next->prev = tmp; >-+ >-+ if ( TopBuffy == 0 && BottomBuffy == 0 ) >-+ TopBuffy = Incoming; >-+ if ( BottomBuffy == 0 ) { >-+ int count = LINES - 2 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); >-+ BottomBuffy = TopBuffy; >-+ while ( --count && BottomBuffy->next ) >-+ BottomBuffy = BottomBuffy->next; >-+ } >-+ else if ( TopBuffy == CurBuffy->next ) { >-+ int count = LINES - 2 - (menu != MENU_PAGER); >-+ BottomBuffy = CurBuffy; >-+ tmp = BottomBuffy; >-+ while ( --count && tmp->prev) >-+ tmp = tmp->prev; >-+ TopBuffy = tmp; >-+ } >-+ else if ( BottomBuffy == CurBuffy->prev ) { >-+ int count = LINES - 2 - (menu != MENU_PAGER); >-+ TopBuffy = CurBuffy; >-+ tmp = TopBuffy; >-+ while ( --count && tmp->next ) >-+ tmp = tmp->next; >-+ BottomBuffy = tmp; >-+ } >-+} >-+ >-+char *make_sidebar_entry(char *box, int size, int new, int flagged) >-+{ >-+ static char *entry = 0; >-+ char *c; >-+ int i = 0; >-+ int delim_len = strlen(SidebarDelim); >-+ >-+ c = realloc(entry, SidebarWidth - delim_len + 2); >-+ if ( c ) entry = c; >-+ entry[SidebarWidth - delim_len + 1] = 0; >-+ for (; i < SidebarWidth - delim_len + 1; entry[i++] = ' ' ); >-+ i = strlen(box); >-+ strncpy( entry, box, i < (SidebarWidth - delim_len + 1) ? i : (SidebarWidth - delim_len + 1) ); >-+ >-+ if (size == -1) >-+ sprintf(entry + SidebarWidth - delim_len - 3, "?"); >-+ else if ( new ) { >-+ if (flagged > 0) { >-+ sprintf( >-+ entry + SidebarWidth - delim_len - 5 - quick_log10(size) - quick_log10(new) - quick_log10(flagged), >-+ "% d(%d)[%d]", size, new, flagged); >+! move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), >+! (option(OPTSTATUSONTOP) ? 0: SidebarWidth)); >+ SETCOLOR (MT_COLOR_STATUS); >+! mutt_paddstr (COLS - (option(OPTSTATUSONTOP) ? 0 : SidebarWidth), buffer); >+ NORMAL_COLOR; >+ } >+ >++ /* if we're not using the index, update every time */ >++ if ( index == 0 ) >++ draw_sidebar(MENU_PAGER); >++ >+ redraw = 0; >+ >+ if (option(OPTBRAILLEFRIENDLY)) { >+*************** >+*** 2763,2768 **** >+--- 2784,2796 ---- >+ mutt_what_key (); >+ break; >+ >++ case OP_SIDEBAR_SCROLL_UP: >++ case OP_SIDEBAR_SCROLL_DOWN: >++ case OP_SIDEBAR_NEXT: >++ case OP_SIDEBAR_PREV: >++ scroll_sidebar(ch, MENU_PAGER); >++ break; >++ >+ default: >+ ch = -1; >+ break; >+*** mutt-1.5.23-orig/pattern.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/pattern.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 154,159 **** >+--- 154,163 ---- >+ HEADER *h = ctx->hdrs[msgno]; >+ char *buf; >+ size_t blen; >++ #ifdef HAVE_FMEMOPEN >++ char *temp; >++ size_t tempsize; >++ #endif >+ >+ if ((msg = mx_open_message (ctx, msgno)) != NULL) >+ { >+*************** >+*** 163,174 **** >+--- 167,186 ---- >+ memset (&s, 0, sizeof (s)); >+ s.fpin = msg->fp; >+ s.flags = M_CHARCONV; >++ #ifdef HAVE_FMEMOPEN >++ if((s.fpout = open_memstream(&temp, &tempsize)) == NULL) >++ { >++ mutt_perror ("Error opening memstream"); >++ return (0); >++ } >++ #else >+ mutt_mktemp (tempfile, sizeof (tempfile)); >+ if ((s.fpout = safe_fopen (tempfile, "w+")) == NULL) >+ { >+ mutt_perror (tempfile); >+ return (0); >+ } >++ #endif >+ >+ if (pat->op != M_BODY) >+ mutt_copy_header (msg->fp, h, s.fpout, CH_FROM | CH_DECODE, NULL); >+*************** >+*** 184,190 **** >+--- 196,206 ---- >+ if (s.fpout) >+ { >+ safe_fclose (&s.fpout); >++ #ifdef HAVE_FMEMOPEN >++ FREE(&temp); >++ #else >+ unlink (tempfile); >++ #endif >+ } >+ return (0); >+ } >+*************** >+*** 193,203 **** >+--- 209,236 ---- >+ mutt_body_handler (h->content, &s); >+ } >+ >++ #ifdef HAVE_FMEMOPEN >++ fclose(s.fpout); >++ lng = tempsize; >++ >++ if(tempsize) { >++ if ((fp = fmemopen(temp, tempsize, "r")) == NULL) { >++ mutt_perror ("Error re-opening memstream"); >++ return (0); >++ } >++ } else { /* fmemopen cannot handle empty buffers */ >++ if ((fp = safe_fopen ("/dev/null", "r")) == NULL) { >++ mutt_perror ("Error opening /dev/null"); >++ return (0); >++ } >++ } >++ #else >+ fp = s.fpout; >+ fflush (fp); >+ fseek (fp, 0, 0); >+ fstat (fileno (fp), &st); >+ lng = (long) st.st_size; >++ #endif >+ } >+ else >+ { >+*************** >+*** 244,250 **** >+--- 277,288 ---- >+ if (option (OPTTHOROUGHSRC)) >+ { >+ safe_fclose (&fp); >++ #ifdef HAVE_FMEMOPEN >++ if(tempsize) >++ FREE (&temp); >++ #else >+ unlink (tempfile); >++ #endif >+ } >+ } >+ >+*** mutt-1.5.23-orig/PATCHES 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/PATCHES 2014-04-12 12:36:35.000000000 -0500 >+*************** >+*** 0 **** >+--- 1 ---- >++ patch-1.5.23.sidebar.20140412.txt >+*** mutt-1.5.23-orig/protos.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/protos.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 36,41 **** >+--- 36,48 ---- >+ const char *pager_progress; >+ }; >+ >++ struct sidebar_entry { >++ char box[SHORT_STRING]; >++ unsigned int size; >++ unsigned int new; >++ unsigned int flagged; >++ }; >++ >+ void mutt_make_string_info (char *, size_t, const char *, struct hdr_format_info *, format_flag); >+ >+ int mutt_extract_token (BUFFER *, BUFFER *, int); >+*** mutt-1.5.23-orig/sidebar.c 1969-12-31 18:00:00.000000000 -0600 >+--- mutt-1.5.23/sidebar.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 0 **** >+--- 1,405 ---- >++ /* >++ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> >++ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> >++ * >++ * This program is free software; you can redistribute it and/or modify >++ * it under the terms of the GNU General Public License as published by >++ * the Free Software Foundation; either version 2 of the License, or >++ * (at your option) any later version. >++ * >++ * This program is distributed in the hope that it will be useful, >++ * but WITHOUT ANY WARRANTY; without even the implied warranty of >++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >++ * GNU General Public License for more details. >++ * >++ * You should have received a copy of the GNU General Public License >++ * along with this program; if not, write to the Free Software >++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. >++ */ >++ >++ >++ #if HAVE_CONFIG_H >++ # include "config.h" >++ #endif >++ >++ #include "mutt.h" >++ #include "mutt_menu.h" >++ #include "mutt_curses.h" >++ #include "sidebar.h" >++ #include "buffy.h" >++ #include <libgen.h> >++ #include "keymap.h" >++ #include <stdbool.h> >++ >++ /*BUFFY *CurBuffy = 0;*/ >++ static BUFFY *TopBuffy = 0; >++ static BUFFY *BottomBuffy = 0; >++ static int known_lines = 0; >++ >++ void calc_boundaries() { >++ >++ BUFFY *tmp = Incoming; >++ >++ int count = LINES - 2 - (option(OPTHELP) ? 1 : 0); >++ >++ if ( known_lines != LINES ) { >++ TopBuffy = BottomBuffy = 0; >++ known_lines = LINES; >++ } >++ for ( ; tmp->next != 0; tmp = tmp->next ) >++ tmp->next->prev = tmp; >++ >++ if ( TopBuffy == 0 && BottomBuffy == 0 ) >++ TopBuffy = Incoming; >++ if ( BottomBuffy == 0 ) { >++ BottomBuffy = TopBuffy; >++ while ( --count && BottomBuffy->next ) >++ BottomBuffy = BottomBuffy->next; >++ } >++ else if ( TopBuffy == CurBuffy->next ) { >++ BottomBuffy = CurBuffy; >++ tmp = BottomBuffy; >++ while ( --count && tmp->prev) >++ tmp = tmp->prev; >++ TopBuffy = tmp; >++ } >++ else if ( BottomBuffy == CurBuffy->prev ) { >++ TopBuffy = CurBuffy; >++ tmp = TopBuffy; >++ while ( --count && tmp->next ) >++ tmp = tmp->next; >++ BottomBuffy = tmp; >++ } >++ } >++ >++ static const char * >++ sidebar_format_str (char *dest, >++ size_t destlen, >++ size_t col, >++ char op, >++ const char *src, >++ const char *prefix, >++ const char *ifstring, >++ const char *elsestring, >++ unsigned long data, >++ format_flag flags) >++ { >++ /* casting from unsigned long - srsly?! */ >++ struct sidebar_entry *sbe = (struct sidebar_entry *) data; >++ unsigned int optional; >++ char fmt[SHORT_STRING], buf[SHORT_STRING]; >++ >++ optional = flags & M_FORMAT_OPTIONAL; >++ >++ switch(op) { >++ case 'F': >++ if(!optional) { >++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); >++ snprintf (dest, destlen, fmt, sbe->flagged); >++ } else if(sbe->flagged == 0) { >++ optional = 0; >++ } >++ break; >++ >++ case '!': >++ if(sbe->flagged == 0) >++ mutt_format_s(dest, destlen, prefix, ""); >++ if(sbe->flagged == 1) >++ mutt_format_s(dest, destlen, prefix, "!"); >++ if(sbe->flagged == 2) >++ mutt_format_s(dest, destlen, prefix, "!!"); >++ if(sbe->flagged > 2) { >++ snprintf (buf, sizeof (buf), "%d!", sbe->flagged); >++ mutt_format_s(dest, destlen, prefix, buf); >++ } >++ break; >++ >++ case 'S': >++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); >++ snprintf (dest, destlen, fmt, sbe->size); >++ break; >++ >++ case 'N': >++ if(!optional) { >++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); >++ snprintf (dest, destlen, fmt, sbe->new); >++ } else if(sbe->new == 0) { >++ optional = 0; >++ } >++ break; >++ >++ case 'B': >++ mutt_format_s(dest, destlen, prefix, sbe->box); >++ break; >++ } >++ >++ if(optional) >++ mutt_FormatString (dest, destlen, col, ifstring, sidebar_format_str, (unsigned long) sbe, flags); >++ else if (flags & M_FORMAT_OPTIONAL) >++ mutt_FormatString (dest, destlen, col, elsestring, sidebar_format_str, (unsigned long) sbe, flags); >++ >++ return (src); >++ } >++ >++ char *make_sidebar_entry(char *box, unsigned int size, unsigned int new, unsigned int flagged) { >++ static char *entry = 0; >++ struct sidebar_entry sbe; >++ int SBvisual; >++ >++ SBvisual = SidebarWidth - strlen(SidebarDelim); >++ if (SBvisual < 1) >++ return NULL; >++ >++ sbe.new = new; >++ sbe.flagged = flagged; >++ sbe.size = size; >++ strncpy(sbe.box, box, 31); >++ >++ safe_realloc(&entry, SBvisual + 2); >++ entry[SBvisual + 1] = '\0'; >++ >++ mutt_FormatString (entry, SBvisual+1, 0, SidebarFormat, sidebar_format_str, (unsigned long) &sbe, 0); >++ >++ return entry; >++ } >++ >++ void set_curbuffy(char buf[LONG_STRING]) >++ { >++ BUFFY* tmp = CurBuffy = Incoming; >++ >++ if (!Incoming) >++ return; >++ >++ while(1) { >++ if(!strcmp(tmp->path, buf) || !strcmp(tmp->realpath, buf)) { >++ CurBuffy = tmp; >++ break; >++ } >++ >++ if(tmp->next) >++ tmp = tmp->next; >++ else >++ break; >++ } >++ } >++ >++ int draw_sidebar(int menu) { >++ >++ BUFFY *tmp; >++ #ifndef USE_SLANG_CURSES >++ attr_t attrs; >++ #endif >++ short delim_len = strlen(SidebarDelim); >++ short color_pair; >++ >++ static bool initialized = false; >++ static int prev_show_value; >++ static short saveSidebarWidth; >++ int lines = 0; >++ int SidebarHeight; >++ >++ if(option(OPTSTATUSONTOP) || option(OPTHELP)) >++ lines++; /* either one will occupy the first line */ >++ >++ /* initialize first time */ >++ if(!initialized) { >++ prev_show_value = option(OPTSIDEBAR); >++ saveSidebarWidth = SidebarWidth; >++ if(!option(OPTSIDEBAR)) SidebarWidth = 0; >++ initialized = true; >++ } >++ >++ /* save or restore the value SidebarWidth */ >++ if(prev_show_value != option(OPTSIDEBAR)) { >++ if(prev_show_value && !option(OPTSIDEBAR)) { >++ saveSidebarWidth = SidebarWidth; >++ SidebarWidth = 0; >++ } else if(!prev_show_value && option(OPTSIDEBAR)) { >++ mutt_buffy_check(1); /* we probably have bad or no numbers */ >++ SidebarWidth = saveSidebarWidth; >++ } >++ prev_show_value = option(OPTSIDEBAR); >++ } >++ >++ >++ /* if ( SidebarWidth == 0 ) return 0; */ >++ if (SidebarWidth > 0 && option (OPTSIDEBAR) >++ && delim_len >= SidebarWidth) { >++ unset_option (OPTSIDEBAR); >++ /* saveSidebarWidth = SidebarWidth; */ >++ if (saveSidebarWidth > delim_len) { >++ SidebarWidth = saveSidebarWidth; >++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar.")); >++ sleep (2); > + } else { >-+ sprintf( >-+ entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(new), >-+ "% d(%d)", size, new); >++ SidebarWidth = 0; >++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value.")); >++ sleep (4); /* the advise to set a sane value should be seen long enough */ > + } >-+ } else if (flagged > 0) { >-+ sprintf( entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(flagged), "% d[%d]", size, flagged); >-+ } else { >-+ sprintf( entry + SidebarWidth - delim_len - 1 - quick_log10(size), "% d", size); >-+ } >-+ return entry; >-+} >-+ >-+void set_curbuffy(char buf[LONG_STRING]) >-+{ >-+ BUFFY* tmp = CurBuffy = Incoming; >-+ >-+ if (!Incoming) >-+ return; >-+ >-+ while(1) { >-+ if(!strcmp(tmp->path, buf)) { >-+ CurBuffy = tmp; >-+ break; >-+ } >-+ >-+ if(tmp->next) >-+ tmp = tmp->next; >-+ else >-+ break; >-+ } >-+} >-+ >-+int draw_sidebar(int menu) { >-+ >-+ int lines = option(OPTHELP) ? 1 : 0; >-+ BUFFY *tmp; >-+#ifndef USE_SLANG_CURSES >-+ attr_t attrs; >-+#endif >-+ short delim_len = strlen(SidebarDelim); >-+ short color_pair; >-+ >-+ static bool initialized = false; >-+ static int prev_show_value; >-+ static short saveSidebarWidth; >-+ >-+ /* initialize first time */ >-+ if(!initialized) { >-+ prev_show_value = option(OPTSIDEBAR); >-+ saveSidebarWidth = SidebarWidth; >-+ if(!option(OPTSIDEBAR)) SidebarWidth = 0; >-+ initialized = true; >++ saveSidebarWidth = 0; >++ return (0); > + } >-+ >-+ /* save or restore the value SidebarWidth */ >-+ if(prev_show_value != option(OPTSIDEBAR)) { >-+ if(prev_show_value && !option(OPTSIDEBAR)) { >-+ saveSidebarWidth = SidebarWidth; >-+ SidebarWidth = 0; >-+ } else if(!prev_show_value && option(OPTSIDEBAR)) { >-+ SidebarWidth = saveSidebarWidth; >-+ } >-+ prev_show_value = option(OPTSIDEBAR); >-+ } >-+ >-+ >-+// if ( SidebarWidth == 0 ) return 0; >-+ if (SidebarWidth > 0 && option (OPTSIDEBAR) >-+ && delim_len >= SidebarWidth) { >-+ unset_option (OPTSIDEBAR); >-+ /* saveSidebarWidth = SidebarWidth; */ >-+ if (saveSidebarWidth > delim_len) { >-+ SidebarWidth = saveSidebarWidth; >-+ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar.")); >-+ sleep (2); >-+ } else { >-+ SidebarWidth = 0; >-+ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value.")); >-+ sleep (4); /* the advise to set a sane value should be seen long enough */ >-+ } >-+ saveSidebarWidth = 0; >-+ return (0); >++ >++ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) { >++ if (SidebarWidth > 0) { >++ saveSidebarWidth = SidebarWidth; >++ SidebarWidth = 0; > + } >-+ >-+ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) { >-+ if (SidebarWidth > 0) { >-+ saveSidebarWidth = SidebarWidth; >-+ SidebarWidth = 0; >-+ } >-+ unset_option(OPTSIDEBAR); >-+ return 0; >-+ } >-+ >-+ /* get attributes for divider */ >-+ SETCOLOR(MT_COLOR_STATUS); >-+#ifndef USE_SLANG_CURSES >-+ attr_get(&attrs, &color_pair, 0); >-+#else >-+ color_pair = attr_get(); >-+#endif >-+ SETCOLOR(MT_COLOR_NORMAL); >-+ >-+ /* draw the divider */ >-+ >-+ for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) { >-+ move(lines, SidebarWidth - delim_len); >-+ addstr(NONULL(SidebarDelim)); >-+#ifndef USE_SLANG_CURSES >-+ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); >-+#endif >-+ } >-+ >-+ if ( Incoming == 0 ) return 0; >-+ lines = option(OPTHELP) ? 1 : 0; /* go back to the top */ >-+ >-+ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) >-+ calc_boundaries(menu); >-+ if ( CurBuffy == 0 ) CurBuffy = Incoming; >-+ >-+ tmp = TopBuffy; >-+ >-+ SETCOLOR(MT_COLOR_NORMAL); >-+ >-+ for ( ; tmp && lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); tmp = tmp->next ) { >-+ if ( tmp == CurBuffy ) >-+ SETCOLOR(MT_COLOR_INDICATOR); >-+ else if ( tmp->msg_unread > 0 ) >-+ SETCOLOR(MT_COLOR_NEW); >-+ else if ( tmp->msg_flagged > 0 ) >-+ SETCOLOR(MT_COLOR_FLAGGED); >-+ else >-+ SETCOLOR(MT_COLOR_NORMAL); >-+ >-+ move( lines, 0 ); >-+ if ( Context && !strcmp( tmp->path, Context->path ) ) { >-+ tmp->msg_unread = Context->unread; >-+ tmp->msgcount = Context->msgcount; >-+ tmp->msg_flagged = Context->flagged; >-+ } >-+ // check whether Maildir is a prefix of the current folder's path >-+ short maildir_is_prefix = 0; >-+ if ( (strlen(tmp->path) > strlen(Maildir)) && >-+ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) >-+ maildir_is_prefix = 1; >-+ // calculate depth of current folder and generate its display name with indented spaces >-+ int sidebar_folder_depth = 0; >-+ char *sidebar_folder_name; >-+ sidebar_folder_name = basename(tmp->path); >-+ if ( maildir_is_prefix ) { >-+ char *tmp_folder_name; >-+ int i; >-+ tmp_folder_name = tmp->path + strlen(Maildir); >-+ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { >-+ if (tmp_folder_name[i] == '/') sidebar_folder_depth++; >-+ } >-+ if (sidebar_folder_depth > 0) { >-+ sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1); >-+ for (i=0; i < sidebar_folder_depth; i++) >-+ sidebar_folder_name[i]=' '; >-+ sidebar_folder_name[i]=0; >-+ strncat(sidebar_folder_name, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth); >-+ } >-+ } >-+ printw( "%.*s", SidebarWidth - delim_len + 1, >-+ make_sidebar_entry(sidebar_folder_name, tmp->msgcount, >-+ tmp->msg_unread, tmp->msg_flagged)); >-+ if (sidebar_folder_depth > 0) >-+ free(sidebar_folder_name); >-+ lines++; >-+ } >-+ SETCOLOR(MT_COLOR_NORMAL); >-+ for ( ; lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) { >-+ int i = 0; >-+ move( lines, 0 ); >-+ for ( ; i < SidebarWidth - delim_len; i++ ) >-+ addch(' '); >-+ } >-+ return 0; >-+} >-+ >-+ >-+void set_buffystats(CONTEXT* Context) >-+{ >-+ BUFFY *tmp = Incoming; >-+ while(tmp) { >-+ if(Context && !strcmp(tmp->path, Context->path)) { >-+ tmp->msg_unread = Context->unread; >-+ tmp->msgcount = Context->msgcount; >-+ break; >-+ } >-+ tmp = tmp->next; >-+ } >-+} >-+ >-+void scroll_sidebar(int op, int menu) >-+{ >-+ if(!SidebarWidth) return; >-+ if(!CurBuffy) return; >-+ >-+ switch (op) { >-+ case OP_SIDEBAR_NEXT: >-+ if ( CurBuffy->next == NULL ) return; >-+ CurBuffy = CurBuffy->next; >-+ break; >-+ case OP_SIDEBAR_PREV: >-+ if ( CurBuffy->prev == NULL ) return; >-+ CurBuffy = CurBuffy->prev; >-+ break; >-+ case OP_SIDEBAR_SCROLL_UP: >-+ CurBuffy = TopBuffy; >-+ if ( CurBuffy != Incoming ) { >-+ calc_boundaries(menu); >-+ CurBuffy = CurBuffy->prev; >-+ } >-+ break; >-+ case OP_SIDEBAR_SCROLL_DOWN: >-+ CurBuffy = BottomBuffy; >-+ if ( CurBuffy->next ) { >-+ calc_boundaries(menu); >-+ CurBuffy = CurBuffy->next; >-+ } >-+ break; >-+ default: >-+ return; >-+ } >-+ calc_boundaries(menu); >-+ draw_sidebar(menu); >-+} >-+ >-diff -uNp -r mutt-1.5.22.orig/sidebar.h mutt-1.5.22/sidebar.h >---- mutt-1.5.22.orig/sidebar.h Thu Jan 1 01:00:00 1970 >-+++ mutt-1.5.22/sidebar.h Fri Oct 18 10:18:45 2013 >-@@ -0,0 +1,36 @@ >-+/* >-+ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> >-+ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> >-+ * >-+ * This program is free software; you can redistribute it and/or modify >-+ * it under the terms of the GNU General Public License as published by >-+ * the Free Software Foundation; either version 2 of the License, or >-+ * (at your option) any later version. >-+ * >-+ * This program is distributed in the hope that it will be useful, >-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >-+ * GNU General Public License for more details. >-+ * >-+ * You should have received a copy of the GNU General Public License >-+ * along with this program; if not, write to the Free Software >-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. >-+ */ >-+ >-+#ifndef SIDEBAR_H >-+#define SIDEBAR_H >-+ >-+struct MBOX_LIST { >-+ char *path; >-+ int msgcount; >-+ int new; >-+} MBLIST; >-+ >-+/* parameter is whether or not to go to the status line */ >-+/* used for omitting the last | that covers up the status bar in the index */ >-+int draw_sidebar(int); >-+void scroll_sidebar(int, int); >-+void set_curbuffy(char*); >-+void set_buffystats(CONTEXT*); >-+ >-+#endif /* SIDEBAR_H */ >---- orig/Makefile.am.orig 2010-09-18 13:23:19.000000000 +0200 >-+++ new/Makefile.am 2010-09-18 13:25:19.000000000 +0200 >-@@ -34,7 +34,7 @@ >- score.c send.c sendlib.c signal.c sort.c \ >- status.c system.c thread.c charset.c history.c lib.c \ >- muttlib.c editmsg.c mbyte.c \ >-- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c >-+ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c >- >- nodist_mutt_SOURCES = $(BUILT_SOURCES) >- >---- orig/Makefile.in.orig 2013-10-25 08:23:07.000000000 +0200 >-+++ new/Makefile.in 2013-10-25 08:26:20.000000000 +0200 >-@@ -133,7 +133,7 @@ >- system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ >- history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ >- editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ >-- ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) >-+ ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) sidebar.$(OBJEXT) >- am__objects_1 = >- am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ >- $(am__objects_1) >-@@ -472,7 +472,7 @@ >- score.c send.c sendlib.c signal.c sort.c \ >- status.c system.c thread.c charset.c history.c lib.c \ >- muttlib.c editmsg.c mbyte.c \ >-- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c >-+ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c >- >- nodist_mutt_SOURCES = $(BUILT_SOURCES) >- mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ >-@@ -504,7 +504,7 @@ >- README.SSL smime.h group.h \ >- muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ >- ChangeLog mkchangelog.sh mutt_idna.h \ >-- snprintf.c regex.c crypt-gpgme.h hcachever.sh.in \ >-+ snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in \ >- txt2c.c txt2c.sh version.sh check_sec.sh >- >- EXTRA_SCRIPTS = smime_keys >-*** mutt-1.5.20-orig/doc/Muttrc 2009-06-14 13:53:24.000000000 -0500 >---- mutt-1.5.20-patched/doc/Muttrc 2009-06-19 22:07:04.000000000 -0500 >++ unset_option(OPTSIDEBAR); >++ return 0; >++ } >++ >++ /* get attributes for divider */ >++ SETCOLOR(MT_COLOR_STATUS); >++ #ifndef USE_SLANG_CURSES >++ attr_get(&attrs, &color_pair, 0); >++ #else >++ color_pair = attr_get(); >++ #endif >++ SETCOLOR(MT_COLOR_NORMAL); >++ >++ /* draw the divider */ >++ >++ SidebarHeight = LINES - 1; >++ if(option(OPTHELP) || !option(OPTSTATUSONTOP)) >++ SidebarHeight--; >++ >++ for ( ; lines < SidebarHeight; lines++ ) { >++ move(lines, SidebarWidth - delim_len); >++ addstr(NONULL(SidebarDelim)); >++ #ifndef USE_SLANG_CURSES >++ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); >++ #endif >++ } >++ >++ if ( Incoming == 0 ) return 0; >++ lines = 0; >++ if(option(OPTSTATUSONTOP) || option(OPTHELP)) >++ lines++; /* either one will occupy the first line */ >++ >++ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) >++ calc_boundaries(menu); >++ if ( CurBuffy == 0 ) CurBuffy = Incoming; >++ >++ tmp = TopBuffy; >++ >++ SETCOLOR(MT_COLOR_NORMAL); >++ >++ for ( ; tmp && lines < SidebarHeight; tmp = tmp->next ) { >++ if ( tmp == CurBuffy ) >++ SETCOLOR(MT_COLOR_INDICATOR); >++ else if ( tmp->msg_unread > 0 ) >++ SETCOLOR(MT_COLOR_NEW); >++ else if ( tmp->msg_flagged > 0 ) >++ SETCOLOR(MT_COLOR_FLAGGED); >++ else >++ SETCOLOR(MT_COLOR_NORMAL); >++ >++ move( lines, 0 ); >++ if ( Context && (!strcmp(tmp->path, Context->path)|| >++ !strcmp(tmp->realpath, Context->path)) ) { >++ tmp->msg_unread = Context->unread; >++ tmp->msgcount = Context->msgcount; >++ tmp->msg_flagged = Context->flagged; >++ } >++ /* check whether Maildir is a prefix of the current folder's path */ >++ short maildir_is_prefix = 0; >++ if ( (strlen(tmp->path) > strlen(Maildir)) && >++ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) >++ maildir_is_prefix = 1; >++ /* calculate depth of current folder and generate its display name with indented spaces */ >++ int sidebar_folder_depth = 0; >++ char *sidebar_folder_name; >++ sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir) + 1); >++ if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) { >++ char *tmp_folder_name; >++ int i; >++ tmp_folder_name = tmp->path + strlen(Maildir) + 1; >++ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { >++ if (tmp_folder_name[i] == '/' || tmp_folder_name[i] == '.') sidebar_folder_depth++; >++ } >++ if (sidebar_folder_depth > 0) { >++ if (option(OPTSIDEBARSHORTPATH)) { >++ tmp_folder_name = strrchr(tmp->path, '.'); >++ if (tmp_folder_name == NULL) >++ tmp_folder_name = mutt_basename(tmp->path); >++ else >++ tmp_folder_name++; >++ } >++ else >++ tmp_folder_name = tmp->path + strlen(Maildir) + 1; >++ sidebar_folder_name = malloc(strlen(tmp_folder_name) + sidebar_folder_depth*strlen(NONULL(SidebarIndentStr)) + 1); >++ sidebar_folder_name[0]=0; >++ for (i=0; i < sidebar_folder_depth; i++) >++ strncat(sidebar_folder_name, NONULL(SidebarIndentStr), strlen(NONULL(SidebarIndentStr))); >++ strncat(sidebar_folder_name, tmp_folder_name, strlen(tmp_folder_name)); >++ } >++ } >++ printw( "%.*s", SidebarWidth - delim_len + 1, >++ make_sidebar_entry(sidebar_folder_name, tmp->msgcount, >++ tmp->msg_unread, tmp->msg_flagged)); >++ if (sidebar_folder_depth > 0) >++ free(sidebar_folder_name); >++ lines++; >++ } >++ SETCOLOR(MT_COLOR_NORMAL); >++ for ( ; lines < SidebarHeight; lines++ ) { >++ int i = 0; >++ move( lines, 0 ); >++ for ( ; i < SidebarWidth - delim_len; i++ ) >++ addch(' '); >++ } >++ return 0; >++ } >++ >++ >++ void set_buffystats(CONTEXT* Context) >++ { >++ BUFFY *tmp = Incoming; >++ while(tmp) { >++ if(Context && (!strcmp(tmp->path, Context->path) || >++ !strcmp(tmp->realpath, Context->path))) { >++ tmp->msg_unread = Context->unread; >++ tmp->msgcount = Context->msgcount; >++ tmp->msg_flagged = Context->flagged; >++ break; >++ } >++ tmp = tmp->next; >++ } >++ } >++ >++ void scroll_sidebar(int op, int menu) >++ { >++ if(!SidebarWidth) return; >++ if(!CurBuffy) return; >++ >++ switch (op) { >++ case OP_SIDEBAR_NEXT: >++ if ( CurBuffy->next == NULL ) return; >++ CurBuffy = CurBuffy->next; >++ break; >++ case OP_SIDEBAR_PREV: >++ if ( CurBuffy->prev == NULL ) return; >++ CurBuffy = CurBuffy->prev; >++ break; >++ case OP_SIDEBAR_SCROLL_UP: >++ CurBuffy = TopBuffy; >++ if ( CurBuffy != Incoming ) { >++ calc_boundaries(menu); >++ CurBuffy = CurBuffy->prev; >++ } >++ break; >++ case OP_SIDEBAR_SCROLL_DOWN: >++ CurBuffy = BottomBuffy; >++ if ( CurBuffy->next ) { >++ calc_boundaries(menu); >++ CurBuffy = CurBuffy->next; >++ } >++ break; >++ default: >++ return; >++ } >++ calc_boundaries(menu); >++ draw_sidebar(menu); >++ } >++ >+*** mutt-1.5.23-orig/sidebar.h 1969-12-31 18:00:00.000000000 -0600 >+--- mutt-1.5.23/sidebar.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 0 **** >+--- 1,36 ---- >++ /* >++ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> >++ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> >++ * >++ * This program is free software; you can redistribute it and/or modify >++ * it under the terms of the GNU General Public License as published by >++ * the Free Software Foundation; either version 2 of the License, or >++ * (at your option) any later version. >++ * >++ * This program is distributed in the hope that it will be useful, >++ * but WITHOUT ANY WARRANTY; without even the implied warranty of >++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >++ * GNU General Public License for more details. >++ * >++ * You should have received a copy of the GNU General Public License >++ * along with this program; if not, write to the Free Software >++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. >++ */ >++ >++ #ifndef SIDEBAR_H >++ #define SIDEBAR_H >++ >++ struct MBOX_LIST { >++ char *path; >++ int msgcount; >++ int new; >++ } MBLIST; >++ >++ /* parameter is whether or not to go to the status line */ >++ /* used for omitting the last | that covers up the status bar in the index */ >++ int draw_sidebar(int); >++ void scroll_sidebar(int, int); >++ void set_curbuffy(char*); >++ void set_buffystats(CONTEXT*); >++ >++ #endif /* SIDEBAR_H */ >+*** mutt-1.5.23-orig/doc/Muttrc 2014-03-12 11:27:11.000000000 -0500 >+--- mutt-1.5.23/doc/Muttrc 2014-04-11 10:14:01.000000000 -0500 > *************** > *** 657,662 **** > --- 657,682 ---- >@@ -1440,3 +2338,40 @@ > # set crypt_autosign=no > # > # Name: crypt_autosign >+*** mutt-1.5.23-orig/imap/imap.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/imap/imap.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1514,1520 **** >+ >+ imap_munge_mbox_name (munged, sizeof (munged), name); >+ snprintf (command, sizeof (command), >+! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged); >+ >+ if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) >+ { >+--- 1514,1520 ---- >+ >+ imap_munge_mbox_name (munged, sizeof (munged), name); >+ snprintf (command, sizeof (command), >+! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged); >+ >+ if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) >+ { >+*** mutt-1.5.23-orig/imap/command.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/imap/command.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1012,1017 **** >+--- 1012,1024 ---- >+ opened */ >+ status->uidnext = oldun; >+ >++ /* Added to make the sidebar show the correct numbers */ >++ if (status->messages) >++ { >++ inc->msgcount = status->messages; >++ inc->msg_unread = status->unseen; >++ } >++ >+ FREE (&value); >+ return; >+ } >diff -ru /usr/ports/mail/mutt/files/extra-patch-sidebar-nntp ./files/extra-patch-sidebar-nntp >--- /usr/ports/mail/mutt/files/extra-patch-sidebar-nntp 2014-09-11 12:28:45.000000000 +0200 >+++ ./files/extra-patch-sidebar-nntp 2015-04-27 08:36:46.000000000 +0200 >@@ -1,226 +1,320 @@ >-Based on Gentoo's updated version of the Mutt Sidebar patch, >-rebased to apply to pristine Mutt sources. >+Taken from http://lunar-linux.org/~tchan/mutt/patch-1.5.23.sidebar.20140412.txt > >-http://prefix.gentooexperimental.org:8000/mutt-patches/file/8117acc3edc0/sidebar.patch >- >-diff -uNp -r mutt-1.5.22.orig/OPS mutt-1.5.22/OPS >---- mutt-1.5.22.orig/OPS Tue Feb 23 06:57:28 2010 >-+++ mutt-1.5.22/OPS Fri Oct 18 10:18:45 2013 >-@@ -179,3 +179,8 @@ OP_WHAT_KEY "display the keycode for a key press" >- OP_MAIN_SHOW_LIMIT "show currently active limit pattern" >- OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread" >- OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads" >-+OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page" >-+OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page" >-+OP_SIDEBAR_NEXT "go down to next mailbox" >-+OP_SIDEBAR_PREV "go to previous mailbox" >-+OP_SIDEBAR_OPEN "open hilighted mailbox" >-diff -uNp -r mutt-1.5.22.orig/PATCHES mutt-1.5.22/PATCHES >---- mutt-1.5.22.orig/PATCHES Sun Feb 21 05:51:26 2010 >-+++ mutt-1.5.22/PATCHES Fri Oct 18 10:19:14 2013 >-@@ -0,0 +1 @@ >-+patch-1.5.22.sidebar.gentoo-openbsd > diff -uNp -r mutt-1.5.22.orig/buffy.c mutt-1.5.22/buffy.c >---- mutt-1.5.22.orig/buffy.c Mon Apr 22 07:14:53 2013 >-+++ mutt-1.5.22/buffy.c Fri Oct 18 10:18:45 2013 >-@@ -161,6 +161,49 @@ void mutt_buffy_cleanup (const char *buf, struct stat >- } >- } >- >-+static int buffy_compare_name(const void *a, const void *b) { >-+ const BUFFY *b1 = * (BUFFY * const *) a; >-+ const BUFFY *b2 = * (BUFFY * const *) b; >-+ >-+ return mutt_strcoll(b1->path, b2->path); >-+} >-+ >-+static BUFFY *buffy_sort(BUFFY *b) >-+{ >-+ BUFFY *tmp = b; >-+ int buffycount = 0; >-+ BUFFY **ary; >-+ int i; >-+ >-+ if (!option(OPTSIDEBARSORT)) >-+ return b; >-+ >-+ for (; tmp != NULL; tmp = tmp->next) >-+ buffycount++; >-+ >-+ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary)); >-+ >-+ tmp = b; >-+ for (i = 0; tmp != NULL; tmp = tmp->next, i++) { >-+ ary[i] = tmp; >-+ } >-+ >-+ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name); >-+ >-+ for (i = 0; i < buffycount - 1; i++) { >-+ ary[i]->next = ary[i+1]; >-+ } >-+ ary[buffycount - 1]->next = NULL; >-+ for (i = 1; i < buffycount; i++) { >-+ ary[i]->prev = ary[i-1]; >-+ } >-+ ary[0]->prev = NULL; >-+ >-+ tmp = ary[0]; >-+ free(ary); >-+ return tmp; >-+} >-+ >- BUFFY *mutt_find_mailbox (const char *path) >- { >- BUFFY *tmp = NULL; >-@@ -282,6 +325,7 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, uns >- else >- (*tmp)->size = 0; >- } >-+ Incoming = buffy_sort(Incoming); >- return 0; >- } >- >-@@ -340,6 +384,68 @@ static int buffy_maildir_hasnew (BUFFY* mailbox) >- return rc; >- } >- >-+/* update message counts for the sidebar */ >-+void buffy_maildir_update (BUFFY* mailbox) >-+{ >-+ char path[_POSIX_PATH_MAX]; >-+ DIR *dirp; >-+ struct dirent *de; >-+ char *p; >-+ >-+ mailbox->msgcount = 0; >-+ mailbox->msg_unread = 0; >-+ mailbox->msg_flagged = 0; >-+ >-+ snprintf (path, sizeof (path), "%s/new", mailbox->path); >-+ >-+ if ((dirp = opendir (path)) == NULL) >-+ { >-+ mailbox->magic = 0; >-+ return; >-+ } >-+ >-+ while ((de = readdir (dirp)) != NULL) >-+ { >-+ if (*de->d_name == '.') >-+ continue; >-+ >-+ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { >-+ mailbox->new = 1; >-+ mailbox->msgcount++; >-+ mailbox->msg_unread++; >-+ } >-+ } >-+ >-+ closedir (dirp); >-+ snprintf (path, sizeof (path), "%s/cur", mailbox->path); >-+ >-+ if ((dirp = opendir (path)) == NULL) >-+ { >-+ mailbox->magic = 0; >-+ return; >-+ } >-+ >-+ while ((de = readdir (dirp)) != NULL) >-+ { >-+ if (*de->d_name == '.') >-+ continue; >-+ >-+ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { >-+ mailbox->msgcount++; >-+ if ((p = strstr (de->d_name, ":2,"))) { >-+ if (!strchr (p + 3, 'T')) { >-+ if (!strchr (p + 3, 'S')) >-+ mailbox->msg_unread++; >-+ if (strchr(p + 3, 'F')) >-+ mailbox->msg_flagged++; >-+ } >-+ } >-+ } >-+ } >-+ >-+ closedir (dirp); >-+} >-+ >- /* returns 1 if mailbox has new mail */ >- static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb) >- { >-@@ -371,6 +477,20 @@ static int buffy_mbox_hasnew (BUFFY* mailbox, struct s >- return rc; >- } >- >-+/* update message counts for the sidebar */ >-+void buffy_mbox_update (BUFFY* mailbox) >-+{ >-+ CONTEXT *ctx = NULL; >-+ >-+ ctx = mx_open_mailbox(mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL); >-+ if(ctx) >-+ { >-+ mailbox->msgcount = ctx->msgcount; >-+ mailbox->msg_unread = ctx->unread; >-+ mx_close_mailbox(ctx, 0); >-+ } >-+} >-+ >- int mutt_buffy_check (int force) >- { >- BUFFY *tmp; >-@@ -444,16 +564,19 @@ int mutt_buffy_check (int force) >- { >- case M_MBOX: >- case M_MMDF: >-+ buffy_mbox_update (tmp); >- if (buffy_mbox_hasnew (tmp, &sb) > 0) >- BuffyCount++; >- break; >- >- case M_MAILDIR: >-+ buffy_maildir_update (tmp); >- if (buffy_maildir_hasnew (tmp) > 0) >- BuffyCount++; >- break; >- >- case M_MH: >-+ mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged); >- mh_buffy(tmp); >- if (tmp->new) >- BuffyCount++; >-diff -uNp -r mutt-1.5.22.orig/buffy.h mutt-1.5.22/buffy.h >---- mutt-1.5.22.orig/buffy.h Mon Apr 22 07:14:53 2013 >-+++ mutt-1.5.22/buffy.h Fri Oct 18 10:18:45 2013 >-@@ -25,7 +25,11 @@ typedef struct buffy_t >- char path[_POSIX_PATH_MAX]; >- off_t size; >- struct buffy_t *next; >-+ struct buffy_t *prev; >- short new; /* mailbox has new mail */ >-+ int msgcount; /* total number of messages */ >-+ int msg_unread; /* number of unread messages */ >-+ int msg_flagged; /* number of flagged messages */ >- short notified; /* user has been notified */ >- short magic; /* mailbox type */ >- short newly_created; /* mbox or mmdf just popped into existence */ >-diff -uNp -r mutt-1.5.22.orig/color.c mutt-1.5.22/color.c >---- mutt-1.5.22.orig/color.c Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/color.c Fri Oct 18 10:19:53 2013 >-@@ -93,6 +93,8 @@ static const struct mapping_t Fields[] = >- { "bold", MT_COLOR_BOLD }, >- { "underline", MT_COLOR_UNDERLINE }, >- { "index", MT_COLOR_INDEX }, >-+ { "sidebar_new", MT_COLOR_NEW }, >-+ { "sidebar_flagged", MT_COLOR_FLAGGED }, >- { NULL, 0 } >- }; >- >-diff -uNp -r mutt-1.5.22.orig/compose.c mutt-1.5.22/compose.c >---- mutt-1.5.22.orig/compose.c.orig 2013-10-25 08:31:26.000000000 +0200 >-+++ mutt-1.5.22/compose.c 2013-10-25 08:44:32.000000000 +0200 >+*** mutt-1.5.23-orig/buffy.c 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/buffy.c 2014-04-12 15:33:54.000000000 -0500 >+*************** >+*** 161,166 **** >+--- 161,209 ---- >+ } >+ } >+ >++ static int buffy_compare_name(const void *a, const void *b) { >++ const BUFFY *b1 = * (BUFFY * const *) a; >++ const BUFFY *b2 = * (BUFFY * const *) b; >++ >++ return mutt_strcoll(b1->path, b2->path); >++ } >++ >++ static BUFFY *buffy_sort(BUFFY *b) >++ { >++ BUFFY *tmp = b; >++ int buffycount = 0; >++ BUFFY **ary; >++ int i; >++ >++ if (!option(OPTSIDEBARSORT)) >++ return b; >++ >++ for (; tmp != NULL; tmp = tmp->next) >++ buffycount++; >++ >++ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary)); >++ >++ tmp = b; >++ for (i = 0; tmp != NULL; tmp = tmp->next, i++) { >++ ary[i] = tmp; >++ } >++ >++ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name); >++ >++ for (i = 0; i < buffycount - 1; i++) { >++ ary[i]->next = ary[i+1]; >++ } >++ ary[buffycount - 1]->next = NULL; >++ for (i = 1; i < buffycount; i++) { >++ ary[i]->prev = ary[i-1]; >++ } >++ ary[0]->prev = NULL; >++ >++ tmp = ary[0]; >++ free(ary); >++ return tmp; >++ } >++ >+ BUFFY *mutt_find_mailbox (const char *path) >+ { >+ BUFFY *tmp = NULL; >+*************** >+*** 196,204 **** >+--- 239,251 ---- >+ static BUFFY *buffy_new (const char *path) >+ { >+ BUFFY* buffy; >++ char rp[PATH_MAX]; >++ char *r; >+ >+ buffy = (BUFFY *) safe_calloc (1, sizeof (BUFFY)); >+ strfcpy (buffy->path, path, sizeof (buffy->path)); >++ r = realpath(path, rp); >++ strfcpy (buffy->realpath, r ? rp : path, sizeof (buffy->realpath)); >+ buffy->next = NULL; >+ buffy->magic = 0; >+ >+*************** >+*** 243,250 **** >+ p = realpath (buf, f1); >+ for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) >+ { >+! q = realpath ((*tmp)->path, f2); >+! if (mutt_strcmp (p ? p : buf, q ? q : (*tmp)->path) == 0) >+ { >+ dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path)); >+ break; >+--- 290,297 ---- >+ p = realpath (buf, f1); >+ for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) >+ { >+! q = (*tmp)->realpath; >+! if (mutt_strcmp (p ? p : buf, q) == 0) >+ { >+ dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path)); >+ break; >+*************** >+*** 282,287 **** >+--- 329,335 ---- >+ else >+ (*tmp)->size = 0; >+ } >++ Incoming = buffy_sort(Incoming); >+ return 0; >+ } >+ >+*************** >+*** 306,311 **** >+--- 354,364 ---- >+ return 0; >+ } >+ >++ if (option(OPTSIDEBAR) && mailbox->msg_unread > 0) { >++ mailbox->new = 1; >++ return 1; >++ } >++ >+ if ((dirp = opendir (path)) == NULL) >+ { >+ mailbox->magic = 0; >+*************** >+*** 340,345 **** >+--- 393,464 ---- >+ return rc; >+ } >+ >++ /* update message counts for the sidebar */ >++ void buffy_maildir_update (BUFFY* mailbox) >++ { >++ char path[_POSIX_PATH_MAX]; >++ DIR *dirp; >++ struct dirent *de; >++ char *p; >++ >++ if(!option(OPTSIDEBAR)) >++ return; >++ >++ mailbox->msgcount = 0; >++ mailbox->msg_unread = 0; >++ mailbox->msg_flagged = 0; >++ >++ snprintf (path, sizeof (path), "%s/new", mailbox->path); >++ >++ if ((dirp = opendir (path)) == NULL) >++ { >++ mailbox->magic = 0; >++ return; >++ } >++ >++ while ((de = readdir (dirp)) != NULL) >++ { >++ if (*de->d_name == '.') >++ continue; >++ >++ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { >++ mailbox->new = 1; >++ mailbox->msgcount++; >++ mailbox->msg_unread++; >++ } >++ } >++ >++ closedir (dirp); >++ snprintf (path, sizeof (path), "%s/cur", mailbox->path); >++ >++ if ((dirp = opendir (path)) == NULL) >++ { >++ mailbox->magic = 0; >++ return; >++ } >++ >++ while ((de = readdir (dirp)) != NULL) >++ { >++ if (*de->d_name == '.') >++ continue; >++ >++ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { >++ mailbox->msgcount++; >++ if ((p = strstr (de->d_name, ":2,"))) { >++ if (!strchr (p + 3, 'T')) { >++ if (!strchr (p + 3, 'S')) >++ mailbox->msg_unread++; >++ if (strchr(p + 3, 'F')) >++ mailbox->msg_flagged++; >++ } >++ } >++ } >++ } >++ >++ mailbox->sb_last_checked = time(NULL); >++ closedir (dirp); >++ } >++ >+ /* returns 1 if mailbox has new mail */ >+ static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb) >+ { >+*************** >+*** 351,357 **** >+ else >+ statcheck = sb->st_mtime > sb->st_atime >+ || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); >+! if (statcheck) >+ { >+ if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) >+ { >+--- 470,476 ---- >+ else >+ statcheck = sb->st_mtime > sb->st_atime >+ || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); >+! if ((!option(OPTSIDEBAR) && statcheck) || (option(OPTSIDEBAR) && mailbox->msg_unread > 0)) >+ { >+ if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) >+ { >+*************** >+*** 371,376 **** >+--- 490,516 ---- >+ return rc; >+ } >+ >++ /* update message counts for the sidebar */ >++ void buffy_mbox_update (BUFFY* mailbox, struct stat *sb) >++ { >++ CONTEXT *ctx = NULL; >++ >++ if(!option(OPTSIDEBAR)) >++ return; >++ if(mailbox->sb_last_checked > sb->st_mtime && mailbox->msgcount != 0) >++ return; /* no check necessary */ >++ >++ ctx = mx_open_mailbox(mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL); >++ if(ctx) >++ { >++ mailbox->msgcount = ctx->msgcount; >++ mailbox->msg_unread = ctx->unread; >++ mailbox->msg_flagged = ctx->flagged; >++ mailbox->sb_last_checked = time(NULL); >++ mx_close_mailbox(ctx, 0); >++ } >++ } >++ >+ int mutt_buffy_check (int force) >+ { >+ BUFFY *tmp; >+*************** >+*** 444,460 **** >+ { >+ case M_MBOX: >+ case M_MMDF: >+ if (buffy_mbox_hasnew (tmp, &sb) > 0) >+ BuffyCount++; >+ break; >+ >+ case M_MAILDIR: >+ if (buffy_maildir_hasnew (tmp) > 0) >+ BuffyCount++; >+ break; >+ >+ case M_MH: >+! mh_buffy(tmp); >+ if (tmp->new) >+ BuffyCount++; >+ break; >+--- 584,603 ---- >+ { >+ case M_MBOX: >+ case M_MMDF: >++ buffy_mbox_update (tmp, &sb); >+ if (buffy_mbox_hasnew (tmp, &sb) > 0) >+ BuffyCount++; >+ break; >+ >+ case M_MAILDIR: >++ buffy_maildir_update (tmp); >+ if (buffy_maildir_hasnew (tmp) > 0) >+ BuffyCount++; >+ break; >+ >+ case M_MH: >+! mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged, &tmp->sb_last_checked); >+! mh_buffy(tmp); >+ if (tmp->new) >+ BuffyCount++; >+ break; >+*** mutt-1.5.23-orig/buffy.h 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/buffy.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 23,35 **** >+--- 23,41 ---- >+ typedef struct buffy_t >+ { >+ char path[_POSIX_PATH_MAX]; >++ char realpath[_POSIX_PATH_MAX]; >+ off_t size; >+ struct buffy_t *next; >++ struct buffy_t *prev; >+ short new; /* mailbox has new mail */ >++ int msgcount; /* total number of messages */ >++ int msg_unread; /* number of unread messages */ >++ int msg_flagged; /* number of flagged messages */ >+ 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 */ >++ time_t sb_last_checked; /* time of last buffy check from sidebar */ >+ } >+ BUFFY; >+ >+*** mutt-1.5.23-orig/color.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/color.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 93,98 **** >+--- 93,100 ---- >+ { "bold", MT_COLOR_BOLD }, >+ { "underline", MT_COLOR_UNDERLINE }, >+ { "index", MT_COLOR_INDEX }, >++ { "sidebar_new", MT_COLOR_NEW }, >++ { "sidebar_flagged", MT_COLOR_FLAGGED }, >+ { NULL, 0 } >+ }; >+ >+*** mutt-1.5.23-orig/compose.c.orig 2014-04-13 09:37:15.000000000 +0200 >+--- mutt-1.5.23/compose.c 2014-04-13 09:41:42.000000000 +0200 > @@ -83,7 +83,7 @@ > > #define HDR_XOFFSET 14 >@@ -347,1084 +441,1790 @@ > mutt_paddstr (W, fcc); > fccSet = 1; > } >-diff -uNp -r mutt-1.5.22.orig/curs_main.c mutt-1.5.22/curs_main.c >---- mutt-1.5.22.orig/curs_main.c Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/curs_main.c Fri Oct 18 10:18:45 2013 >-@@ -26,7 +26,9 @@ >- #include "mailbox.h" >- #include "mapping.h" >- #include "sort.h" >-+#include "buffy.h" >- #include "mx.h" >-+#include "sidebar.h" >- >- #ifdef USE_POP >- #include "pop.h" >-@@ -519,8 +521,12 @@ int mutt_index_menu (void) >- menu->redraw |= REDRAW_STATUS; >- if (do_buffy_notify) >+*** mutt-1.5.23-orig/configure.ac 2014-03-12 11:26:40.000000000 -0500 >+--- mutt-1.5.23/configure.ac 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1276,1281 **** >+--- 1276,1283 ---- >+ AC_DEFINE(HAVE_LANGINFO_YESEXPR,1,[ Define if you have <langinfo.h> and nl_langinfo(YESEXPR). ]) >+ fi >+ >++ AC_CHECK_FUNCS(fmemopen open_memstream) >++ >+ dnl Documentation tools >+ have_openjade="no" >+ AC_PATH_PROG([OSPCAT], [ospcat], [none]) >+*** mutt-1.5.23-orig/curs_main.c 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/curs_main.c 2014-04-12 21:45:21.000000000 -0500 >+*************** >+*** 26,32 **** >+--- 26,34 ---- >+ #include "mailbox.h" >+ #include "mapping.h" >+ #include "sort.h" >++ #include "buffy.h" >+ #include "mx.h" >++ #include "sidebar.h" >+ >+ #ifdef USE_POP >+ #include "pop.h" >+*************** >+*** 519,538 **** >+ menu->redraw |= REDRAW_STATUS; >+ if (do_buffy_notify) >+ { >+! if (mutt_buffy_notify () && option (OPTBEEPNEW)) >+! beep (); >+ } >+ else >+ do_buffy_notify = 1; >+ } >+ >+ if (op != -1) >+ mutt_curs_set (0); >+ >+ if (menu->redraw & REDRAW_FULL) > { >-- if (mutt_buffy_notify () && option (OPTBEEPNEW)) >-- beep (); >-+ if (mutt_buffy_notify ()) >-+ { >-+ menu->redraw |= REDRAW_FULL; >-+ if (option (OPTBEEPNEW)) >-+ beep (); >-+ } >+ menu_redraw_full (menu); >+ mutt_show_error (); > } >- else >- do_buffy_notify = 1; >-@@ -532,6 +538,7 @@ int mutt_index_menu (void) >- if (menu->redraw & REDRAW_FULL) >- { >- menu_redraw_full (menu); >-+ draw_sidebar(menu->menu); >- mutt_show_error (); >- } >- >-@@ -554,9 +561,12 @@ int mutt_index_menu (void) >- >- if (menu->redraw & REDRAW_STATUS) >+ >+ if (menu->menu == MENU_MAIN) >+--- 521,551 ---- >+ menu->redraw |= REDRAW_STATUS; >+ if (do_buffy_notify) > { >-+ DrawFullLine = 1; >- menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); >-+ DrawFullLine = 0; >- move (option (OPTSTATUSONTOP) ? 0 : LINES-2, 0); >- SETCOLOR (MT_COLOR_STATUS); >-+ set_buffystats(Context); >- mutt_paddstr (COLS, buf); >- NORMAL_COLOR; >- menu->redraw &= ~REDRAW_STATUS; >-@@ -569,7 +579,7 @@ int mutt_index_menu (void) >- menu->oldcurrent = -1; >- >- if (option (OPTARROWCURSOR)) >-- move (menu->current - menu->top + menu->offset, 2); >-+ move (menu->current - menu->top + menu->offset, SidebarWidth + 2); >- else if (option (OPTBRAILLEFRIENDLY)) >- move (menu->current - menu->top + menu->offset, 0); >+! if (mutt_buffy_notify ()) >+! { >+! menu->redraw |= REDRAW_STATUS; >+! if (option (OPTBEEPNEW)) >+! beep (); >+! } >+ } > else >-@@ -1070,6 +1080,7 @@ int mutt_index_menu (void) >- menu->redraw = REDRAW_FULL; >- break; >- >-+ case OP_SIDEBAR_OPEN: >- case OP_MAIN_CHANGE_FOLDER: >- case OP_MAIN_NEXT_UNREAD_MAILBOX: >- >-@@ -1101,7 +1112,11 @@ int mutt_index_menu (void) >- { >- mutt_buffy (buf, sizeof (buf)); >- >-- if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) >-+ if ( op == OP_SIDEBAR_OPEN ) { >-+ if(!CurBuffy) >-+ break; >-+ strncpy( buf, CurBuffy->path, sizeof(buf) ); >-+ } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) >- { >- if (menu->menu == MENU_PAGER) >- { >-@@ -1119,6 +1134,7 @@ int mutt_index_menu (void) >- } >- >- mutt_expand_path (buf, sizeof (buf)); >-+ set_curbuffy(buf); >- if (mx_get_magic (buf) <= 0) >- { >- mutt_error (_("%s is not a mailbox."), buf); >-@@ -2209,6 +2225,12 @@ int mutt_index_menu (void) >- mutt_what_key(); >- break; >- >-+ case OP_SIDEBAR_SCROLL_UP: >-+ case OP_SIDEBAR_SCROLL_DOWN: >-+ case OP_SIDEBAR_NEXT: >-+ case OP_SIDEBAR_PREV: >-+ scroll_sidebar(op, menu->menu); >-+ break; >- default: >- if (menu->menu == MENU_MAIN) >- km_error_key (MENU_MAIN); >-diff -uNp -r mutt-1.5.22.orig/flags.c mutt-1.5.22/flags.c >---- mutt-1.5.22.orig/flags.c Sun Feb 21 22:10:41 2010 >-+++ mutt-1.5.22/flags.c Fri Oct 18 10:18:45 2013 >-@@ -22,8 +22,10 @@ >- >- #include "mutt.h" >- #include "mutt_curses.h" >-+#include "mutt_menu.h" >- #include "sort.h" >- #include "mx.h" >-+#include "sidebar.h" >- >- void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx) >- { >-@@ -263,6 +265,7 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag >- */ >- if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged)) >- h->searched = 0; >-+ draw_sidebar(0); >- } >- >- void mutt_tag_set_flag (int flag, int bf) >-diff -uNp -r mutt-1.5.22.orig/functions.h mutt-1.5.22/functions.h >---- mutt-1.5.22.orig/functions.h Sat Dec 3 19:10:04 2011 >-+++ mutt-1.5.22/functions.h Fri Oct 18 10:18:45 2013 >-@@ -169,6 +169,11 @@ const struct binding_t OpMain[] = { /* map: index */ >- { "decrypt-save", OP_DECRYPT_SAVE, NULL }, >- >- >-+ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, >-+ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, >-+ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, >-+ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, >-+ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, >- { NULL, 0, NULL } >- }; >- >-@@ -272,6 +277,11 @@ const struct binding_t OpPager[] = { /* map: pager */ >- >- { "what-key", OP_WHAT_KEY, NULL }, >- >+ do_buffy_notify = 1; >+ } >+ >++ if(option(OPTSIDEBAR)) >++ menu->redraw |= REDRAW_SIDEBAR; >++ >+ if (op != -1) >+ mutt_curs_set (0); >+ >+ if (menu->redraw & REDRAW_FULL) >+ { >+ menu_redraw_full (menu); >++ draw_sidebar(menu->menu); >+ mutt_show_error (); >++ } else if(menu->redraw & REDRAW_SIDEBAR) { >++ draw_sidebar(menu->menu); >++ menu->redraw &= ~REDRAW_SIDEBAR; >+ } >+ >+ if (menu->menu == MENU_MAIN) >+*************** >+*** 554,562 **** >+--- 567,578 ---- >+ >+ if (menu->redraw & REDRAW_STATUS) >+ { >++ DrawFullLine = 1; >+ menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); >++ DrawFullLine = 0; >+ move (option (OPTSTATUSONTOP) ? 0 : LINES-2, 0); >+ SETCOLOR (MT_COLOR_STATUS); >++ set_buffystats(Context); >+ mutt_paddstr (COLS, buf); >+ NORMAL_COLOR; >+ menu->redraw &= ~REDRAW_STATUS; >+*************** >+*** 569,575 **** >+ menu->oldcurrent = -1; >+ >+ if (option (OPTARROWCURSOR)) >+! move (menu->current - menu->top + menu->offset, 2); >+ else if (option (OPTBRAILLEFRIENDLY)) >+ move (menu->current - menu->top + menu->offset, 0); >+ else >+--- 585,591 ---- >+ menu->oldcurrent = -1; >+ >+ if (option (OPTARROWCURSOR)) >+! move (menu->current - menu->top + menu->offset, SidebarWidth + 2); >+ else if (option (OPTBRAILLEFRIENDLY)) >+ move (menu->current - menu->top + menu->offset, 0); >+ else >+*************** >+*** 1011,1016 **** >+--- 1027,1033 ---- >+ break; >+ >+ CHECK_MSGCOUNT; >++ CHECK_VISIBLE; >+ CHECK_READONLY; >+ { >+ int oldvcount = Context->vcount; >+*************** >+*** 1070,1075 **** >+--- 1087,1093 ---- >+ menu->redraw = REDRAW_FULL; >+ break; >+ >++ case OP_SIDEBAR_OPEN: >+ case OP_MAIN_CHANGE_FOLDER: >+ case OP_MAIN_NEXT_UNREAD_MAILBOX: >+ >+*************** >+*** 1101,1107 **** >+ { >+ mutt_buffy (buf, sizeof (buf)); >+ >+! if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) >+ { >+ if (menu->menu == MENU_PAGER) >+ { >+--- 1119,1129 ---- >+ { >+ mutt_buffy (buf, sizeof (buf)); >+ >+! if ( op == OP_SIDEBAR_OPEN ) { >+! if(!CurBuffy) >+! break; >+! strncpy( buf, CurBuffy->path, sizeof(buf) ); >+! } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) >+ { >+ if (menu->menu == MENU_PAGER) >+ { >+*************** >+*** 1119,1124 **** >+--- 1141,1147 ---- >+ } >+ >+ mutt_expand_path (buf, sizeof (buf)); >++ set_curbuffy(buf); >+ if (mx_get_magic (buf) <= 0) >+ { >+ mutt_error (_("%s is not a mailbox."), buf); >+*************** >+*** 2209,2214 **** >+--- 2232,2243 ---- >+ mutt_what_key(); >+ break; >+ >++ case OP_SIDEBAR_SCROLL_UP: >++ case OP_SIDEBAR_SCROLL_DOWN: >++ case OP_SIDEBAR_NEXT: >++ case OP_SIDEBAR_PREV: >++ scroll_sidebar(op, menu->menu); >++ break; >+ default: >+ if (menu->menu == MENU_MAIN) >+ km_error_key (MENU_MAIN); >+*** mutt-1.5.23-orig/flags.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/flags.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 22,29 **** >+--- 22,31 ---- >+ >+ #include "mutt.h" >+ #include "mutt_curses.h" >++ #include "mutt_menu.h" >+ #include "sort.h" >+ #include "mx.h" >++ #include "sidebar.h" >+ >+ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx) >+ { >+*************** >+*** 263,268 **** >+--- 265,271 ---- >+ */ >+ if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged)) >+ h->searched = 0; >++ draw_sidebar(0); >+ } >+ >+ void mutt_tag_set_flag (int flag, int bf) >+*** mutt-1.5.23-orig/functions.h 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/functions.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 169,174 **** >+--- 169,179 ---- >+ { "decrypt-save", OP_DECRYPT_SAVE, NULL }, >+ >+ > + { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, > + { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, >-+ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, >-+ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, >-+ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, >- { NULL, 0, NULL } >- }; >- >-diff -uNp -r mutt-1.5.22.orig/globals.h mutt-1.5.22/globals.h >---- mutt-1.5.22.orig/globals.h Sat Dec 3 19:10:04 2011 >-+++ mutt-1.5.22/globals.h Fri Oct 18 10:18:45 2013 >-@@ -117,6 +117,7 @@ WHERE short SearchContext; >- WHERE char *SendCharset; >- WHERE char *Sendmail; >- WHERE char *Shell; >-+WHERE char *SidebarDelim; >- WHERE char *Signature; >- WHERE char *SimpleSearch; >- #if USE_SMTP >-@@ -208,6 +209,9 @@ WHERE short ScoreThresholdDelete; >- WHERE short ScoreThresholdRead; >- WHERE short ScoreThresholdFlag; >- >-+WHERE struct buffy_t *CurBuffy INITVAL(0); >-+WHERE short DrawFullLine INITVAL(0); >-+WHERE short SidebarWidth; >- #ifdef USE_IMAP >- WHERE short ImapKeepalive; >- WHERE short ImapPipelineDepth; >-diff -uNp -r mutt-1.5.22.orig/imap/command.c mutt-1.5.22/imap/command.c >---- mutt-1.5.22.orig/imap/command.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/imap/command.c Fri Oct 18 10:18:45 2013 >-@@ -1012,6 +1012,13 @@ static void cmd_parse_status (IMAP_DATA* idata, char* >- opened */ >- status->uidnext = oldun; >- >-+ /* Added to make the sidebar show the correct numbers */ >-+ if (status->messages) >-+ { >-+ inc->msgcount = status->messages; >-+ inc->msg_unread = status->unseen; >-+ } >-+ >- FREE (&value); >- return; >- } >-diff -uNp -r mutt-1.5.22.orig/imap/imap.c mutt-1.5.22/imap/imap.c >---- mutt-1.5.22.orig/imap/imap.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/imap/imap.c Fri Oct 18 10:18:45 2013 >-@@ -1514,7 +1514,7 @@ int imap_buffy_check (int force) >- >- imap_munge_mbox_name (munged, sizeof (munged), name); >- snprintf (command, sizeof (command), >-- "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged); >-+ "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged); >- >- if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) >- { >-diff -uNp -r mutt-1.5.22.orig/init.h mutt-1.5.22/init.h >---- mutt-1.5.22.orig/init.h Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/init.h Fri Oct 18 10:18:45 2013 >-@@ -1966,6 +1966,27 @@ struct option_t MuttVars[] = { >- ** not used. >- ** (PGP only) >++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, >++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, >++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, >+ { NULL, 0, NULL } >+ }; >+ >+*************** >+*** 272,277 **** >+--- 277,287 ---- >+ >+ { "what-key", OP_WHAT_KEY, NULL }, >+ >++ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, >++ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, >++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, >++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, >++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, >+ { NULL, 0, NULL } >+ }; >+ >+*** mutt-1.5.23-orig/globals.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/globals.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 117,122 **** >+--- 117,125 ---- >+ WHERE char *SendCharset; >+ WHERE char *Sendmail; >+ WHERE char *Shell; >++ WHERE char *SidebarDelim; >++ WHERE char *SidebarFormat; >++ WHERE char *SidebarIndentStr; >+ WHERE char *Signature; >+ WHERE char *SimpleSearch; >+ #if USE_SMTP >+*************** >+*** 208,213 **** >+--- 211,219 ---- >+ WHERE short ScoreThresholdRead; >+ WHERE short ScoreThresholdFlag; >+ >++ WHERE struct buffy_t *CurBuffy INITVAL(0); >++ WHERE short DrawFullLine INITVAL(0); >++ WHERE short SidebarWidth; >+ #ifdef USE_IMAP >+ WHERE short ImapKeepalive; >+ WHERE short ImapPipelineDepth; >+*** mutt-1.5.23-orig/handler.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/handler.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1599,1604 **** >+--- 1599,1609 ---- >+ size_t tmplength = 0; >+ int rc = 0; >+ >++ #ifdef HAVE_FMEMOPEN >++ char *temp; >++ size_t tempsize; >++ #endif >++ >+ int oflags = s->flags; >+ >+ /* first determine which handler to use to process this part */ >+*************** >+*** 1711,1716 **** >+--- 1716,1729 ---- >+ { >+ /* decode to a tempfile, saving the original destination */ >+ fp = s->fpout; >++ #ifdef HAVE_FMEMOPEN >++ if ((s->fpout = open_memstream(&temp, &tempsize)) == NULL) >++ { >++ mutt_error _("Unable to open memory stream!"); >++ dprint (1, (debugfile, "Can't open memory stream.\n")); >++ goto bail; >++ } >++ #else >+ mutt_mktemp (tempfile, sizeof (tempfile)); >+ if ((s->fpout = safe_fopen (tempfile, "w")) == NULL) >+ { >+*************** >+*** 1718,1723 **** >+--- 1731,1737 ---- >+ dprint (1, (debugfile, "Can't open %s.\n", tempfile)); >+ goto bail; >+ } >++ #endif >+ /* decoding the attachment changes the size and offset, so save a copy >+ * of the "real" values now, and restore them after processing >+ */ >+*************** >+*** 1746,1753 **** >+--- 1760,1778 ---- >+ /* restore final destination and substitute the tempfile for input */ >+ s->fpout = fp; >+ fp = s->fpin; >++ #ifdef HAVE_FMEMOPEN >++ if(tempsize) >++ s->fpin = fmemopen(temp, tempsize, "r"); >++ else /* fmemopen cannot handle zero-length buffers */ >++ s->fpin = safe_fopen ("/dev/null", "r"); >++ if(s->fpin == NULL) { >++ mutt_perror("failed to re-open memstream!"); >++ return (-1); >++ } >++ #else >+ s->fpin = fopen (tempfile, "r"); >+ unlink (tempfile); >++ #endif >+ >+ /* restore the prefix */ >+ s->prefix = savePrefix; >+*************** >+*** 1773,1778 **** >+--- 1798,1807 ---- >+ >+ /* restore the original source stream */ >+ safe_fclose (&s->fpin); >++ #ifdef HAVE_FMEMOPEN >++ if(tempsize) >++ FREE(&temp); >++ #endif >+ s->fpin = fp; >+ } >+ } >+*** mutt-1.5.23-orig/init.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/init.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1966,1971 **** >+--- 1966,2019 ---- >+ ** not used. >+ ** (PGP only) >+ */ >++ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, UL "|"}, >++ /* >++ ** .pp >++ ** This specifies the delimiter between the sidebar (if visible) and >++ ** other screens. >++ */ >++ {"sidebar_indentstr", DT_STR, R_BOTH, UL &SidebarIndentStr, UL " "}, >++ /* >++ ** .pp >++ ** This specifies the string that is used to indent items >++ ** with sidebar_folderindent= yes >++ */ >++ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 }, >++ /* >++ ** .pp >++ ** This specifies whether or not to show sidebar (left-side list of folders). >++ */ >++ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 }, >++ /* >++ ** .pp >++ ** This specifies whether or not to sort the sidebar alphabetically. >++ */ >++ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 }, >++ /* >++ ** .pp >++ ** The width of the sidebar. >++ */ >++ { "sidebar_shortpath", DT_BOOL, R_BOTH, OPTSIDEBARSHORTPATH, 1 }, >++ /* >++ ** .pp >++ ** Should the sidebar shorten the path showed. >++ */ >++ {"sidebar_format", DT_STR, R_NONE, UL &SidebarFormat, UL "%B%?F? [%F]?%* %?N?%N/?%4S"}, >++ /* >++ ** .pp >++ ** Format string for the sidebar. The sequences `%N', `%F' and `%S' >++ ** will be replaced by the number of new or flagged messages or the total >++ ** size of them mailbox. `%B' will be replaced with the name of the mailbox. >++ ** The `%!' sequence will be expanded to `!' if there is one flagged message; >++ ** to `!!' if there are two flagged messages; and to `n!' for n flagged >++ ** messages, n>2. >++ */ >++ { "sidebar_folderindent", DT_BOOL, R_BOTH, OPTSIDEBARFOLDERINDENT, 0 }, >++ /* >++ ** .pp >++ ** Should folders be indented in the sidebar. >++ */ >++ >+ { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0}, >+ /* >+ ** .pp >+*** mutt-1.5.23-orig/mailbox.h 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mailbox.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 27,32 **** >+--- 27,33 ---- >+ #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses >+ * safe_fopen() for mbox-style folders. >+ */ >++ #define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */ >+ >+ /* mx_open_new_message() */ >+ #define M_ADD_FROM 1 /* add a From_ line */ >+*** mutt-1.5.23-orig/main.c 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/main.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 50,55 **** >+--- 50,56 ---- >+ #include <unistd.h> >+ #include <errno.h> >+ #include <sys/stat.h> >++ #include <limits.h> >+ #include <sys/utsname.h> >+ >+ #ifdef HAVE_GETOPT_H >+*************** >+*** 555,561 **** >+ >+ int main (int argc, char **argv) >+ { >+! char folder[_POSIX_PATH_MAX] = ""; >+ char *subject = NULL; >+ char *includeFile = NULL; >+ char *draftFile = NULL; >+--- 556,562 ---- >+ >+ int main (int argc, char **argv) >+ { >+! char folder[PATH_MAX] = ""; >+ char *subject = NULL; >+ char *includeFile = NULL; >+ char *draftFile = NULL; >+*************** >+*** 1025,1030 **** >+--- 1026,1038 ---- >+ strfcpy (folder, NONULL(Spoolfile), sizeof (folder)); >+ mutt_expand_path (folder, sizeof (folder)); >+ >++ { >++ char tmpfolder[PATH_MAX]; >++ strfcpy (tmpfolder, folder, sizeof (tmpfolder)); >++ if(!realpath(tmpfolder, folder)) >++ strfcpy (folder, tmpfolder, sizeof (tmpfolder)); >++ } >++ >+ mutt_str_replace (&CurrentFolder, folder); >+ mutt_str_replace (&LastFolder, folder); >+ >+*************** >+*** 1047,1052 **** >+--- 1055,1061 ---- >+ if((Context = mx_open_mailbox (folder, ((flags & M_RO) || option (OPTREADONLY)) ? M_READONLY : 0, NULL)) >+ || !explicit_folder) >+ { >++ set_curbuffy(folder); >+ mutt_index_menu (); >+ if (Context) >+ FREE (&Context); >+*** mutt-1.5.23-orig/Makefile.am 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/Makefile.am 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 32,37 **** >+--- 32,38 ---- >+ rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \ >+ score.c send.c sendlib.c signal.c sort.c \ >+ status.c system.c thread.c charset.c history.c lib.c \ >++ sidebar.c \ >+ muttlib.c editmsg.c mbyte.c \ >+ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c >+ >+*** mutt-1.5.23-orig/Makefile.in 2014-03-12 11:26:44.000000000 -0500 >+--- mutt-1.5.23/Makefile.in 2014-04-12 12:12:38.000000000 -0500 >+*************** >+*** 129,135 **** >+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ >+ history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ >+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ >+! ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) >+ am__objects_1 = >+ am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ >+ $(am__objects_1) >+--- 129,136 ---- >+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ >+ history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ >+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ >+! ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) \ >+! sidebar.$(OBJEXT) >+ am__objects_1 = >+ am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ >+ $(am__objects_1) >+*************** >+*** 468,474 **** >+ score.c send.c sendlib.c signal.c sort.c \ >+ status.c system.c thread.c charset.c history.c lib.c \ >+ muttlib.c editmsg.c mbyte.c \ >+! url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c >+ >+ nodist_mutt_SOURCES = $(BUILT_SOURCES) >+ mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ >+--- 469,476 ---- >+ score.c send.c sendlib.c signal.c sort.c \ >+ status.c system.c thread.c charset.c history.c lib.c \ >+ muttlib.c editmsg.c mbyte.c \ >+! url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c \ >+! sidebar.c >+ >+ nodist_mutt_SOURCES = $(BUILT_SOURCES) >+ mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ >+*************** >+*** 500,506 **** >+ README.SSL smime.h group.h \ >+ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ >+ ChangeLog mkchangelog.sh mutt_idna.h \ >+! snprintf.c regex.c crypt-gpgme.h hcachever.sh.in \ >+ txt2c.c txt2c.sh version.sh check_sec.sh >+ >+ EXTRA_SCRIPTS = smime_keys >+--- 502,508 ---- >+ README.SSL smime.h group.h \ >+ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ >+ ChangeLog mkchangelog.sh mutt_idna.h \ >+! snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in \ >+ txt2c.c txt2c.sh version.sh check_sec.sh >+ >+ EXTRA_SCRIPTS = smime_keys >+*** mutt-1.5.23-orig/mbox.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mbox.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 100,105 **** >+--- 100,106 ---- >+ mutt_perror (ctx->path); >+ return (-1); >+ } >++ ctx->atime = sb.st_atime; >+ ctx->mtime = sb.st_mtime; >+ ctx->size = sb.st_size; >+ >+*************** >+*** 251,256 **** >+--- 252,258 ---- >+ >+ ctx->size = sb.st_size; >+ ctx->mtime = sb.st_mtime; >++ ctx->atime = sb.st_atime; >+ >+ #ifdef NFS_ATTRIBUTE_HACK >+ if (sb.st_mtime > sb.st_atime) >+*** mutt-1.5.23-orig/menu.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/menu.c 2014-04-12 21:31:16.000000000 -0500 >+*************** >+*** 24,29 **** >+--- 24,30 ---- >+ #include "mutt_curses.h" >+ #include "mutt_menu.h" >+ #include "mbyte.h" >++ #include "sidebar.h" >+ >+ extern size_t UngetCount; >+ >+*************** >+*** 186,192 **** >+ { >+ char *scratch = safe_strdup (s); >+ int shift = option (OPTARROWCURSOR) ? 3 : 0; >+! int cols = COLS - shift; >+ >+ mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); >+ s[n - 1] = 0; >+--- 187,193 ---- >+ { >+ char *scratch = safe_strdup (s); >+ int shift = option (OPTARROWCURSOR) ? 3 : 0; >+! int cols = COLS - shift - SidebarWidth; >+ >+ mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); >+ s[n - 1] = 0; >+*************** >+*** 239,244 **** >+--- 240,246 ---- >+ int do_color; >+ int attr; >+ >++ draw_sidebar(1); >+ for (i = menu->top; i < menu->top + menu->pagelen; i++) >+ { >+ if (i < menu->max) >+*************** >+*** 249,255 **** >+ menu_pad_string (buf, sizeof (buf)); >+ >+ ATTRSET(attr); >+! move(i - menu->top + menu->offset, 0); >+ do_color = 1; >+ >+ if (i == menu->current) >+--- 251,257 ---- >+ menu_pad_string (buf, sizeof (buf)); >+ >+ ATTRSET(attr); >+! move(i - menu->top + menu->offset, SidebarWidth); >+ do_color = 1; >+ >+ if (i == menu->current) >+*************** >+*** 272,278 **** >+ else >+ { >+ NORMAL_COLOR; >+! CLEARLINE(i - menu->top + menu->offset); >+ } >+ } >+ NORMAL_COLOR; >+--- 274,280 ---- >+ else >+ { >+ NORMAL_COLOR; >+! CLEARLINE_WIN (i - menu->top + menu->offset); >+ } >+ } >+ NORMAL_COLOR; >+*************** >+*** 289,295 **** >+ return; >+ } >+ >+! move (menu->oldcurrent + menu->offset - menu->top, 0); >+ ATTRSET(menu->color (menu->oldcurrent)); >+ >+ if (option (OPTARROWCURSOR)) >+--- 291,297 ---- >+ return; >+ } >+ >+! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); >+ ATTRSET(menu->color (menu->oldcurrent)); >+ >+ if (option (OPTARROWCURSOR)) >+*************** >+*** 301,313 **** >+ { >+ menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); >+ menu_pad_string (buf, sizeof (buf)); >+! move (menu->oldcurrent + menu->offset - menu->top, 3); >+ print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); >+ } >+ >+ /* now draw it in the new location */ >+ SETCOLOR(MT_COLOR_INDICATOR); >+! mvaddstr(menu->current + menu->offset - menu->top, 0, "->"); >+ } >+ else >+ { >+--- 303,315 ---- >+ { >+ menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); >+ menu_pad_string (buf, sizeof (buf)); >+! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3); >+ print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); >+ } >+ >+ /* now draw it in the new location */ >+ SETCOLOR(MT_COLOR_INDICATOR); >+! mvaddstr(menu->current + menu->offset - menu->top, SidebarWidth, "->"); >+ } >+ else >+ { >+*************** >+*** 320,326 **** >+ menu_make_entry (buf, sizeof (buf), menu, menu->current); >+ menu_pad_string (buf, sizeof (buf)); >+ SETCOLOR(MT_COLOR_INDICATOR); >+! move(menu->current - menu->top + menu->offset, 0); >+ print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); >+ } >+ menu->redraw &= REDRAW_STATUS; >+--- 322,328 ---- >+ menu_make_entry (buf, sizeof (buf), menu, menu->current); >+ menu_pad_string (buf, sizeof (buf)); >+ SETCOLOR(MT_COLOR_INDICATOR); >+! move(menu->current - menu->top + menu->offset, SidebarWidth); >+ print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); >+ } >+ menu->redraw &= REDRAW_STATUS; >+*************** >+*** 332,338 **** >+ char buf[LONG_STRING]; >+ int attr = menu->color (menu->current); >+ >+! move (menu->current + menu->offset - menu->top, 0); >+ menu_make_entry (buf, sizeof (buf), menu, menu->current); >+ menu_pad_string (buf, sizeof (buf)); >+ >+--- 334,340 ---- >+ char buf[LONG_STRING]; >+ int attr = menu->color (menu->current); >+ >+! move (menu->current + menu->offset - menu->top, SidebarWidth); >+ menu_make_entry (buf, sizeof (buf), menu, menu->current); >+ menu_pad_string (buf, sizeof (buf)); >+ >+*************** >+*** 872,878 **** >+ >+ >+ if (option (OPTARROWCURSOR)) >+! move (menu->current - menu->top + menu->offset, 2); >+ else if (option (OPTBRAILLEFRIENDLY)) >+ move (menu->current - menu->top + menu->offset, 0); >+ else >+--- 874,880 ---- >+ >+ >+ if (option (OPTARROWCURSOR)) >+! move (menu->current - menu->top + menu->offset, SidebarWidth + 2); >+ else if (option (OPTBRAILLEFRIENDLY)) >+ move (menu->current - menu->top + menu->offset, 0); >+ else >+*** mutt-1.5.23-orig/mh.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mh.c 2014-04-11 11:04:59.000000000 -0500 >+*************** >+*** 295,300 **** >+--- 295,326 ---- >+ mhs_free_sequences (&mhs); >+ } >+ >++ void mh_buffy_update (const char *path, int *msgcount, int *msg_unread, int *msg_flagged, time_t *sb_last_checked) >++ { >++ int i; >++ struct mh_sequences mhs; >++ memset (&mhs, 0, sizeof (mhs)); >++ >++ if(!option(OPTSIDEBAR)) >++ return; >++ >++ if (mh_read_sequences (&mhs, path) < 0) >++ return; >++ >++ msgcount = 0; >++ msg_unread = 0; >++ msg_flagged = 0; >++ for (i = 0; i <= mhs.max; i++) >++ msgcount++; >++ if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) { >++ msg_unread++; >++ } >++ if (mhs_check (&mhs, i) & MH_SEQ_FLAGGED) >++ msg_flagged++; >++ mhs_free_sequences (&mhs); >++ *sb_last_checked = time(NULL); >++ } >++ >+ static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) >+ { >+ int fd; >+*** mutt-1.5.23-orig/mutt_curses.h 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mutt_curses.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 64,69 **** >+--- 64,70 ---- >+ #undef lines >+ #endif /* lines */ >+ >++ #define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol() >+ #define CLEARLINE(x) move(x,0), clrtoeol() >+ #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x) >+ #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0) >+*************** >+*** 120,125 **** >+--- 121,128 ---- >+ MT_COLOR_BOLD, >+ MT_COLOR_UNDERLINE, >+ MT_COLOR_INDEX, >++ MT_COLOR_NEW, >++ MT_COLOR_FLAGGED, >+ MT_COLOR_MAX >+ }; >+ >+*** mutt-1.5.23-orig/mutt_menu.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/mutt_menu.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 34,39 **** >+--- 34,40 ---- >+ #define REDRAW_FULL (1<<5) >+ #define REDRAW_BODY (1<<6) >+ #define REDRAW_SIGWINCH (1<<7) >++ #define REDRAW_SIDEBAR (1<<8) >+ >+ #define M_MODEFMT "-- Mutt: %s" >+ >+*** mutt-1.5.23-orig/mutt.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/mutt.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 421,426 **** >+--- 421,430 ---- >+ OPTSAVEEMPTY, >+ OPTSAVENAME, >+ OPTSCORE, >++ OPTSIDEBAR, >++ OPTSIDEBARSHORTPATH, >++ OPTSIDEBARSORT, >++ OPTSIDEBARFOLDERINDENT, >+ OPTSIGDASHES, >+ OPTSIGONTOP, >+ OPTSORTRE, >+*************** >+*** 861,866 **** >+--- 865,871 ---- >+ { >+ char *path; >+ FILE *fp; >++ time_t atime; >+ time_t mtime; >+ off_t size; >+ off_t vsize; >+*************** >+*** 895,900 **** >+--- 900,906 ---- >+ unsigned int quiet : 1; /* inhibit status messages? */ >+ unsigned int collapsed : 1; /* are all threads collapsed? */ >+ unsigned int closing : 1; /* mailbox is being closed */ >++ unsigned int peekonly : 1; /* just taking a glance, revert atime */ >+ >+ /* driver hooks */ >+ void *data; /* driver specific data */ >+*** mutt-1.5.23-orig/muttlib.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/muttlib.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1281,1286 **** >+--- 1281,1288 ---- >+ pl = pw = 1; >+ >+ /* see if there's room to add content, else ignore */ >++ if ( DrawFullLine ) >++ { >+ if ((col < COLS && wlen < destlen) || soft) >+ { >+ int pad; >+*************** >+*** 1324,1329 **** >+--- 1326,1377 ---- >+ col += wid; >+ src += pl; >+ } >++ } >++ else >++ { >++ if ((col < COLS-SidebarWidth && wlen < destlen) || soft) >++ { >++ int pad; >++ >++ /* get contents after padding */ >++ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags); >++ len = mutt_strlen (buf); >++ wid = mutt_strwidth (buf); >++ >++ /* try to consume as many columns as we can, if we don't have >++ * memory for that, use as much memory as possible */ >++ pad = (COLS - SidebarWidth - col - wid) / pw; >++ if (pad > 0 && wlen + (pad * pl) + len > destlen) >++ pad = ((signed)(destlen - wlen - len)) / pl; >++ if (pad > 0) >++ { >++ while (pad--) >++ { >++ memcpy (wptr, src, pl); >++ wptr += pl; >++ wlen += pl; >++ col += pw; >++ } >++ } >++ else if (soft && pad < 0) >++ { >++ /* \0-terminate dest for length computation in mutt_wstr_trunc() */ >++ *wptr = 0; >++ /* make sure right part is at most as wide as display */ >++ len = mutt_wstr_trunc (buf, destlen, COLS, &wid); >++ /* truncate left so that right part fits completely in */ >++ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col); >++ wptr = dest + wlen; >++ } >++ if (len + wlen > destlen) >++ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL); >++ memcpy (wptr, buf, len); >++ wptr += len; >++ wlen += len; >++ col += wid; >++ src += pl; >++ } >++ } >+ break; /* skip rest of input */ >+ } >+ else if (ch == '|') >+*** mutt-1.5.23-orig/mx.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mx.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 580,585 **** >+--- 580,586 ---- >+ * M_APPEND open mailbox for appending >+ * M_READONLY open mailbox in read-only mode >+ * M_QUIET only print error messages >++ * M_PEEK revert atime where applicable >+ * ctx if non-null, context struct to use > */ >-+ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, "|"}, >-+ /* >-+ ** .pp >-+ ** This specifies the delimiter between the sidebar (if visible) and >-+ ** other screens. >-+ */ >-+ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 }, >-+ /* >-+ ** .pp >-+ ** This specifies whether or not to show sidebar (left-side list of folders). >-+ */ >-+ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 }, >-+ /* >-+ ** .pp >-+ ** This specifies whether or not to sort the sidebar alphabetically. >-+ */ >-+ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 }, >-+ /* >-+ ** .pp >-+ ** The width of the sidebar. >-+ */ >- { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0}, >- /* >- ** .pp >-diff -uNp -r mutt-1.5.22.orig/mailbox.h mutt-1.5.22/mailbox.h >---- mutt-1.5.22.orig/mailbox.h Sun Feb 21 22:10:41 2010 >-+++ mutt-1.5.22/mailbox.h Fri Oct 18 10:18:45 2013 >-@@ -27,6 +27,7 @@ >- #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses >- * safe_fopen() for mbox-style folders. >- */ >-+#define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */ >- >- /* mx_open_new_message() */ >- #define M_ADD_FROM 1 /* add a From_ line */ >-diff -uNp -r mutt-1.5.22.orig/mbox.c mutt-1.5.22/mbox.c >---- mutt-1.5.22.orig/mbox.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/mbox.c Fri Oct 18 10:18:45 2013 >-@@ -100,6 +100,7 @@ int mmdf_parse_mailbox (CONTEXT *ctx) >- mutt_perror (ctx->path); >- return (-1); >- } >-+ ctx->atime = sb.st_atime; >- ctx->mtime = sb.st_mtime; >- ctx->size = sb.st_size; >- >-@@ -251,6 +252,7 @@ int mbox_parse_mailbox (CONTEXT *ctx) >- >- ctx->size = sb.st_size; >- ctx->mtime = sb.st_mtime; >-+ ctx->atime = sb.st_atime; >- >- #ifdef NFS_ATTRIBUTE_HACK >- if (sb.st_mtime > sb.st_atime) >-diff -uNp -r mutt-1.5.22.orig/menu.c mutt-1.5.22/menu.c >---- mutt-1.5.22.orig/menu.c Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/menu.c Fri Oct 18 10:18:45 2013 >-@@ -24,6 +24,7 @@ >- #include "mutt_curses.h" >- #include "mutt_menu.h" >- #include "mbyte.h" >-+#include "sidebar.h" >- >- extern size_t UngetCount; >- >-@@ -186,7 +187,7 @@ static void menu_pad_string (char *s, size_t n) >- { >- char *scratch = safe_strdup (s); >- int shift = option (OPTARROWCURSOR) ? 3 : 0; >-- int cols = COLS - shift; >-+ int cols = COLS - shift - SidebarWidth; >- >- mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); >- s[n - 1] = 0; >-@@ -239,6 +240,7 @@ void menu_redraw_index (MUTTMENU *menu) >- int do_color; >- int attr; >- >-+ draw_sidebar(1); >- for (i = menu->top; i < menu->top + menu->pagelen; i++) >- { >- if (i < menu->max) >-@@ -249,7 +251,7 @@ void menu_redraw_index (MUTTMENU *menu) >- menu_pad_string (buf, sizeof (buf)); >- >- ATTRSET(attr); >-- move(i - menu->top + menu->offset, 0); >-+ move(i - menu->top + menu->offset, SidebarWidth); >- do_color = 1; >- >- if (i == menu->current) >-@@ -272,7 +274,7 @@ void menu_redraw_index (MUTTMENU *menu) >- else >- { >- NORMAL_COLOR; >-- CLEARLINE(i - menu->top + menu->offset); >-+ CLEARLINE_WIN(i - menu->top + menu->offset); >- } >- } >- NORMAL_COLOR; >-@@ -289,7 +291,7 @@ void menu_redraw_motion (MUTTMENU *menu) >- return; >- } >+ CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx) >+*************** >+*** 602,607 **** >+--- 603,610 ---- >+ ctx->quiet = 1; >+ if (flags & M_READONLY) >+ ctx->readonly = 1; >++ if (flags & M_PEEK) >++ ctx->peekonly = 1; >+ >+ if (flags & (M_APPEND|M_NEWFOLDER)) >+ { >+*************** >+*** 701,713 **** >+ void mx_fastclose_mailbox (CONTEXT *ctx) >+ { >+ int i; >+ >+ if(!ctx) >+ return; >+ >+ /* never announce that a mailbox we've just left has new mail. #3290 >+ * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ >+! mutt_buffy_setnotified(ctx->path); >+ >+ if (ctx->mx_close) >+ ctx->mx_close (ctx); >+--- 704,729 ---- >+ void mx_fastclose_mailbox (CONTEXT *ctx) >+ { >+ int i; >++ #ifndef BUFFY_SIZE >++ struct utimbuf ut; >++ #endif >+ >+ if(!ctx) >+ return; >++ #ifndef BUFFY_SIZE >++ /* fix up the times so buffy won't get confused */ >++ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime) >++ { >++ ut.actime = ctx->atime; >++ ut.modtime = ctx->mtime; >++ utime (ctx->path, &ut); >++ } >++ #endif >+ >+ /* never announce that a mailbox we've just left has new mail. #3290 >+ * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ >+! if(!ctx->peekonly) >+! mutt_buffy_setnotified(ctx->path); >+ >+ if (ctx->mx_close) >+ ctx->mx_close (ctx); >+*************** >+*** 719,724 **** >+--- 735,742 ---- >+ mutt_clear_threads (ctx); >+ for (i = 0; i < ctx->msgcount; i++) >+ mutt_free_header (&ctx->hdrs[i]); >++ ctx->msgcount -= ctx->deleted; >++ set_buffystats(ctx); >+ FREE (&ctx->hdrs); >+ FREE (&ctx->v2r); >+ FREE (&ctx->path); >+*************** >+*** 812,817 **** >+--- 830,839 ---- >+ if (!ctx->hdrs[i]->deleted && ctx->hdrs[i]->read >+ && !(ctx->hdrs[i]->flagged && option (OPTKEEPFLAGGED))) >+ read_msgs++; >++ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read) >++ ctx->unread--; >++ if (ctx->hdrs[i]->deleted && ctx->hdrs[i]->flagged) >++ ctx->flagged--; >+ } >+ >+ if (read_msgs && quadoption (OPT_MOVE) != M_NO) >+*** mutt-1.5.23-orig/mx.h 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/mx.h 2014-04-11 11:11:47.000000000 -0500 >+*************** >+*** 57,62 **** >+--- 57,63 ---- >+ int mh_read_dir (CONTEXT *, const char *); >+ int mh_sync_mailbox (CONTEXT *, int *); >+ int mh_check_mailbox (CONTEXT *, int *); >++ void mh_buffy_update (const char *, int *, int *, int *, time_t *); >+ int mh_check_empty (const char *); >+ >+ int maildir_read_dir (CONTEXT *); >+*** mutt-1.5.23-orig/OPS 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/OPS 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 179,181 **** >+--- 179,186 ---- >+ OP_MAIN_SHOW_LIMIT "show currently active limit pattern" >+ OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread" >+ OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads" >++ OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page" >++ OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page" >++ OP_SIDEBAR_NEXT "go down to next mailbox" >++ OP_SIDEBAR_PREV "go to previous mailbox" >++ OP_SIDEBAR_OPEN "open hilighted mailbox" >+*** mutt-1.5.23-orig/pager.c 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/pager.c 2014-04-12 21:53:15.000000000 -0500 >+*************** >+*** 29,34 **** >+--- 29,35 ---- >+ #include "pager.h" >+ #include "attach.h" >+ #include "mbyte.h" >++ #include "sidebar.h" >+ >+ #include "mutt_crypt.h" >+ >+*************** >+*** 1095,1100 **** >+--- 1096,1102 ---- >+ wchar_t wc; >+ mbstate_t mbstate; >+ int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap); >++ wrap_cols -= SidebarWidth; >+ >+ if (check_attachment_marker ((char *)buf) == 0) >+ wrap_cols = COLS; >+*************** >+*** 1572,1577 **** >+--- 1574,1580 ---- >+ >+ int bodyoffset = 1; /* offset of first line of real text */ >+ int statusoffset = 0; /* offset for the status bar */ >++ int statuswidth; >+ int helpoffset = LINES - 2; /* offset for the help bar. */ >+ int bodylen = LINES - 2 - bodyoffset; /* length of displayable area */ >+ >+*************** >+*** 1746,1752 **** >+ if ((redraw & REDRAW_BODY) || topline != oldtopline) >+ { >+ do { >+! move (bodyoffset, 0); >+ curline = oldtopline = topline; >+ lines = 0; >+ force_redraw = 0; >+--- 1749,1755 ---- >+ if ((redraw & REDRAW_BODY) || topline != oldtopline) >+ { >+ do { >+! move (bodyoffset, SidebarWidth); >+ curline = oldtopline = topline; >+ lines = 0; >+ force_redraw = 0; >+*************** >+*** 1759,1764 **** >+--- 1762,1768 ---- >+ &QuoteList, &q_level, &force_redraw, &SearchRE) > 0) >+ lines++; >+ curline++; >++ move(lines + bodyoffset, SidebarWidth); >+ } >+ last_offset = lineInfo[curline].offset; >+ } while (force_redraw); >+*************** >+*** 1771,1776 **** >+--- 1775,1781 ---- >+ addch ('~'); >+ addch ('\n'); >+ lines++; >++ move(lines + bodyoffset, SidebarWidth); >+ } >+ NORMAL_COLOR; >+ >+*************** >+*** 1788,1816 **** >+ hfi.ctx = Context; >+ hfi.pager_progress = pager_progress_str; >+ >+ if (last_pos < sb.st_size - 1) >+ snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size)); >+ else >+ strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str)); >+ >+ /* print out the pager status bar */ >+! move (statusoffset, 0); >+ SETCOLOR (MT_COLOR_STATUS); >+ >+ if (IsHeader (extra) || IsMsgAttach (extra)) >+ { >+! size_t l1 = COLS * MB_LEN_MAX; >+ size_t l2 = sizeof (buffer); >+ hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; >+ mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); >+! mutt_paddstr (COLS, buffer); >+ } >+ else >+ { >+ char bn[STRING]; >+ snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); >+! mutt_paddstr (COLS, bn); >+ } >+ NORMAL_COLOR; >+ } >+ >+--- 1793,1831 ---- >+ hfi.ctx = Context; >+ hfi.pager_progress = pager_progress_str; >+ >++ statuswidth = COLS - (option(OPTSTATUSONTOP) && PagerIndexLines > 0 ? SidebarWidth : 0); >++ >+ if (last_pos < sb.st_size - 1) >+ snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size)); >+ else >+ strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str)); >+ >+ /* print out the pager status bar */ >+! move (statusoffset, SidebarWidth); >+ SETCOLOR (MT_COLOR_STATUS); >++ if(option(OPTSTATUSONTOP) && PagerIndexLines > 0) { >++ CLEARLINE_WIN (statusoffset); >++ } else { >++ CLEARLINE (statusoffset); >++ DrawFullLine = 1; /* for mutt_make_string_info */ >++ } >+ >+ if (IsHeader (extra) || IsMsgAttach (extra)) >+ { >+! size_t l1 = statuswidth * MB_LEN_MAX; >+ size_t l2 = sizeof (buffer); >+ hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; >+ mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); >+! mutt_paddstr (statuswidth, buffer); >+ } >+ else >+ { >+ char bn[STRING]; >+ snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); >+! mutt_paddstr (statuswidth, bn); >+ } >++ if(!option(OPTSTATUSONTOP) || PagerIndexLines == 0) >++ DrawFullLine = 0; /* reset */ >+ NORMAL_COLOR; >+ } >+ >+*************** >+*** 1819,1834 **** >+ /* redraw the pager_index indicator, because the >+ * flags for this message might have changed. */ >+ menu_redraw_current (index); >+ >+ /* print out the index status bar */ >+ menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); > >-- move (menu->oldcurrent + menu->offset - menu->top, 0); >-+ move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); >- ATTRSET(menu->color (menu->oldcurrent)); >- >- if (option (OPTARROWCURSOR)) >-@@ -301,13 +303,13 @@ void menu_redraw_motion (MUTTMENU *menu) >- { >- menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); >- menu_pad_string (buf, sizeof (buf)); >-- move (menu->oldcurrent + menu->offset - menu->top, 3); >-+ move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3); >- print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); >- } >- >- /* now draw it in the new location */ >- SETCOLOR(MT_COLOR_INDICATOR); >-- mvaddstr(menu->current + menu->offset - menu->top, 0, "->"); >-+ mvaddstr(menu->current + menu->offset - menu->top, SidebarWidth, "->"); >- } >- else >- { >-@@ -320,7 +322,7 @@ void menu_redraw_motion (MUTTMENU *menu) >- menu_make_entry (buf, sizeof (buf), menu, menu->current); >- menu_pad_string (buf, sizeof (buf)); >- SETCOLOR(MT_COLOR_INDICATOR); >-- move(menu->current - menu->top + menu->offset, 0); >-+ move(menu->current - menu->top + menu->offset, SidebarWidth); >- print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); >- } >- menu->redraw &= REDRAW_STATUS; >-@@ -332,7 +334,7 @@ void menu_redraw_current (MUTTMENU *menu) >- char buf[LONG_STRING]; >- int attr = menu->color (menu->current); >+! move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); >+ SETCOLOR (MT_COLOR_STATUS); >+! mutt_paddstr (COLS, buffer); >+ NORMAL_COLOR; >+ } >+ >+ redraw = 0; >+ >+ if (option(OPTBRAILLEFRIENDLY)) { >+--- 1834,1855 ---- >+ /* redraw the pager_index indicator, because the >+ * flags for this message might have changed. */ >+ menu_redraw_current (index); >++ draw_sidebar(MENU_PAGER); >+ >+ /* print out the index status bar */ >+ menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); > >-- move (menu->current + menu->offset - menu->top, 0); >-+ move (menu->current + menu->offset - menu->top, SidebarWidth); >- menu_make_entry (buf, sizeof (buf), menu, menu->current); >- menu_pad_string (buf, sizeof (buf)); >- >-@@ -872,7 +874,7 @@ int mutt_menuLoop (MUTTMENU *menu) >- >- >- if (option (OPTARROWCURSOR)) >-- move (menu->current - menu->top + menu->offset, 2); >-+ move (menu->current - menu->top + menu->offset, SidebarWidth + 2); >- else if (option (OPTBRAILLEFRIENDLY)) >- move (menu->current - menu->top + menu->offset, 0); >- else >-diff -uNp -r mutt-1.5.22.orig/mh.c mutt-1.5.22/mh.c >---- mutt-1.5.22.orig/mh.c Mon Apr 22 07:14:53 2013 >-+++ mutt-1.5.22/mh.c Fri Oct 18 10:18:45 2013 >-@@ -295,6 +295,28 @@ void mh_buffy(BUFFY *b) >- mhs_free_sequences (&mhs); >- } >- >-+void mh_buffy_update (const char *path, int *msgcount, int *msg_unread, int *msg_flagged) >-+{ >-+ int i; >-+ struct mh_sequences mhs; >-+ memset (&mhs, 0, sizeof (mhs)); >-+ >-+ if (mh_read_sequences (&mhs, path) < 0) >-+ return; >-+ >-+ msgcount = 0; >-+ msg_unread = 0; >-+ msg_flagged = 0; >-+ for (i = 0; i <= mhs.max; i++) >-+ msgcount++; >-+ if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) { >-+ msg_unread++; >-+ } >-+ if (mhs_check (&mhs, i) & MH_SEQ_FLAGGED) >-+ msg_flagged++; >-+ mhs_free_sequences (&mhs); >-+} >-+ >- static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) >- { >- int fd; >-diff -uNp -r mutt-1.5.22.orig/mutt.h mutt-1.5.22/mutt.h >---- mutt-1.5.22.orig/mutt.h Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/mutt.h Fri Oct 18 10:18:45 2013 >-@@ -420,6 +420,8 @@ enum >- OPTSAVEEMPTY, >- OPTSAVENAME, >- OPTSCORE, >-+ OPTSIDEBAR, >-+ OPTSIDEBARSORT, >- OPTSIGDASHES, >- OPTSIGONTOP, >- OPTSORTRE, >-@@ -860,6 +862,7 @@ typedef struct _context >- { >- char *path; >- FILE *fp; >-+ time_t atime; >- time_t mtime; >- off_t size; >- off_t vsize; >-@@ -894,6 +897,7 @@ typedef struct _context >- unsigned int quiet : 1; /* inhibit status messages? */ >- unsigned int collapsed : 1; /* are all threads collapsed? */ >- unsigned int closing : 1; /* mailbox is being closed */ >-+ unsigned int peekonly : 1; /* just taking a glance, revert atime */ >- >- /* driver hooks */ >- void *data; /* driver specific data */ >-diff -uNp -r mutt-1.5.22.orig/mutt_curses.h mutt-1.5.22/mutt_curses.h >---- mutt-1.5.22.orig/mutt_curses.h Tue Jan 15 07:37:15 2013 >-+++ mutt-1.5.22/mutt_curses.h Fri Oct 18 10:22:32 2013 >-@@ -64,6 +64,7 @@ >- #undef lines >- #endif /* lines */ >- >-+#define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol() >- #define CLEARLINE(x) move(x,0), clrtoeol() >- #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x) >- #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0) >-@@ -120,6 +121,8 @@ enum >- MT_COLOR_BOLD, >- MT_COLOR_UNDERLINE, >- MT_COLOR_INDEX, >-+ MT_COLOR_NEW, >-+ MT_COLOR_FLAGGED, >- MT_COLOR_MAX >- }; >- >-diff -uNp -r mutt-1.5.22.orig/muttlib.c mutt-1.5.22/muttlib.c >---- mutt-1.5.22.orig/muttlib.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/muttlib.c Fri Oct 18 10:18:45 2013 >-@@ -1286,6 +1286,8 @@ void mutt_FormatString (char *dest, /* output buffer >- pl = pw = 1; >- >- /* see if there's room to add content, else ignore */ >-+ if ( DrawFullLine ) >-+ { >- if ((col < COLS && wlen < destlen) || soft) >- { >- int pad; >-@@ -1329,6 +1331,52 @@ void mutt_FormatString (char *dest, /* output buffer >- col += wid; >- src += pl; >- } >-+ } >-+ else >-+ { >-+ if ((col < COLS-SidebarWidth && wlen < destlen) || soft) >-+ { >-+ int pad; >-+ >-+ /* get contents after padding */ >-+ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags); >-+ len = mutt_strlen (buf); >-+ wid = mutt_strwidth (buf); >-+ >-+ /* try to consume as many columns as we can, if we don't have >-+ * memory for that, use as much memory as possible */ >-+ pad = (COLS - SidebarWidth - col - wid) / pw; >-+ if (pad > 0 && wlen + (pad * pl) + len > destlen) >-+ pad = ((signed)(destlen - wlen - len)) / pl; >-+ if (pad > 0) >-+ { >-+ while (pad--) >-+ { >-+ memcpy (wptr, src, pl); >-+ wptr += pl; >-+ wlen += pl; >-+ col += pw; >-+ } >-+ } >-+ else if (soft && pad < 0) >-+ { >-+ /* \0-terminate dest for length computation in mutt_wstr_trunc() */ >-+ *wptr = 0; >-+ /* make sure right part is at most as wide as display */ >-+ len = mutt_wstr_trunc (buf, destlen, COLS, &wid); >-+ /* truncate left so that right part fits completely in */ >-+ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col); >-+ wptr = dest + wlen; >-+ } >-+ if (len + wlen > destlen) >-+ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL); >-+ memcpy (wptr, buf, len); >-+ wptr += len; >-+ wlen += len; >-+ col += wid; >-+ src += pl; >-+ } >-+ } >- break; /* skip rest of input */ >- } >- else if (ch == '|') >-diff -uNp -r mutt-1.5.22.orig/mx.c mutt-1.5.22/mx.c >---- mutt-1.5.22.orig/mx.c Fri Oct 18 05:48:24 2013 >-+++ mutt-1.5.22/mx.c Fri Oct 18 10:18:45 2013 >-@@ -580,6 +580,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int f >- * M_APPEND open mailbox for appending >- * M_READONLY open mailbox in read-only mode >- * M_QUIET only print error messages >-+ * M_PEEK revert atime where applicable >- * ctx if non-null, context struct to use >- */ >- CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx) >-@@ -602,6 +603,8 @@ CONTEXT *mx_open_mailbox (const char *path, int flags, >- ctx->quiet = 1; >- if (flags & M_READONLY) >- ctx->readonly = 1; >-+ if (flags & M_PEEK) >-+ ctx->peekonly = 1; >- >- if (flags & (M_APPEND|M_NEWFOLDER)) >- { >-@@ -701,9 +704,21 @@ CONTEXT *mx_open_mailbox (const char *path, int flags, >- void mx_fastclose_mailbox (CONTEXT *ctx) >- { >- int i; >-+#ifndef BUFFY_SIZE >-+ struct utimbuf ut; >-+#endif >- >- if(!ctx) >- return; >-+#ifndef BUFFY_SIZE >-+ /* fix up the times so buffy won't get confused */ >-+ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime) >-+ { >-+ ut.actime = ctx->atime; >-+ ut.modtime = ctx->mtime; >-+ utime (ctx->path, &ut); >-+ } >-+#endif >- >- /* never announce that a mailbox we've just left has new mail. #3290 >- * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ >-diff -uNp -r mutt-1.5.22.orig/mx.h mutt-1.5.22/mx.h >---- mutt-1.5.22.orig/mx.h Mon Apr 22 07:14:53 2013 >-+++ mutt-1.5.22/mx.h Fri Oct 18 10:18:45 2013 >-@@ -57,6 +57,7 @@ void mbox_reset_atime (CONTEXT *, struct stat *); >- int mh_read_dir (CONTEXT *, const char *); >- int mh_sync_mailbox (CONTEXT *, int *); >- int mh_check_mailbox (CONTEXT *, int *); >-+void mh_buffy_update (const char *, int *, int *, int *); >- int mh_check_empty (const char *); >- >- int maildir_read_dir (CONTEXT *); >-diff -uNp -r mutt-1.5.22.orig/pager.c mutt-1.5.22/pager.c >---- mutt-1.5.22.orig/pager.c Mon Apr 22 07:17:32 2013 >-+++ mutt-1.5.22/pager.c Fri Oct 18 10:18:45 2013 >-@@ -29,6 +29,7 @@ >- #include "pager.h" >- #include "attach.h" >- #include "mbyte.h" >-+#include "sidebar.h" >- >- #include "mutt_crypt.h" >- >-@@ -1095,6 +1096,7 @@ static int format_line (struct line_t **lineInfo, int >- wchar_t wc; >- mbstate_t mbstate; >- int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap); >-+ wrap_cols -= SidebarWidth; >- >- if (check_attachment_marker ((char *)buf) == 0) >- wrap_cols = COLS; >-@@ -1746,7 +1748,7 @@ mutt_pager (const char *banner, const char *fname, int >- if ((redraw & REDRAW_BODY) || topline != oldtopline) >- { >- do { >-- move (bodyoffset, 0); >-+ move (bodyoffset, SidebarWidth); >- curline = oldtopline = topline; >- lines = 0; >- force_redraw = 0; >-@@ -1759,6 +1761,7 @@ mutt_pager (const char *banner, const char *fname, int >- &QuoteList, &q_level, &force_redraw, &SearchRE) > 0) >- lines++; >- curline++; >-+ move(lines + bodyoffset, SidebarWidth); >- } >- last_offset = lineInfo[curline].offset; >- } while (force_redraw); >-@@ -1771,6 +1774,7 @@ mutt_pager (const char *banner, const char *fname, int >- addch ('~'); >- addch ('\n'); >- lines++; >-+ move(lines + bodyoffset, SidebarWidth); >- } >- NORMAL_COLOR; >- >-@@ -1799,17 +1803,17 @@ mutt_pager (const char *banner, const char *fname, int >- >- if (IsHeader (extra) || IsMsgAttach (extra)) >- { >-- size_t l1 = COLS * MB_LEN_MAX; >-+ size_t l1 = (COLS-SidebarWidth) * MB_LEN_MAX; >- size_t l2 = sizeof (buffer); >- hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; >- mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); >-- mutt_paddstr (COLS, buffer); >-+ mutt_paddstr (COLS-SidebarWidth, buffer); >- } >- else >- { >- char bn[STRING]; >- snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); >-- mutt_paddstr (COLS, bn); >-+ mutt_paddstr (COLS-SidebarWidth, bn); >- } >- NORMAL_COLOR; >- } >-@@ -1819,16 +1823,21 @@ mutt_pager (const char *banner, const char *fname, int >- /* redraw the pager_index indicator, because the >- * flags for this message might have changed. */ >- menu_redraw_current (index); >-+ draw_sidebar(MENU_PAGER); >- >- /* print out the index status bar */ >- menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); >+! move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), >+! (option(OPTSTATUSONTOP) ? 0: SidebarWidth)); >+ SETCOLOR (MT_COLOR_STATUS); >+! mutt_paddstr (COLS - (option(OPTSTATUSONTOP) ? 0 : SidebarWidth), buffer); >+ NORMAL_COLOR; >+ } > >-- move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); >-+ move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), SidebarWidth); >- SETCOLOR (MT_COLOR_STATUS); >-- mutt_paddstr (COLS, buffer); >-+ mutt_paddstr (COLS-SidebarWidth, buffer); >- NORMAL_COLOR; >- } >- >-+ /* if we're not using the index, update every time */ >-+ if ( index == 0 ) >-+ draw_sidebar(MENU_PAGER); >-+ >- redraw = 0; >- >- if (option(OPTBRAILLEFRIENDLY)) { >-@@ -2762,6 +2771,13 @@ search_next: >- case OP_WHAT_KEY: >- mutt_what_key (); >- break; >-+ >-+ case OP_SIDEBAR_SCROLL_UP: >-+ case OP_SIDEBAR_SCROLL_DOWN: >-+ case OP_SIDEBAR_NEXT: >-+ case OP_SIDEBAR_PREV: >-+ scroll_sidebar(ch, MENU_PAGER); >-+ break; >- >- default: >- ch = -1; >-diff -uNp -r mutt-1.5.22.orig/sidebar.c mutt-1.5.22/sidebar.c >---- mutt-1.5.22.orig/sidebar.c Thu Jan 1 01:00:00 1970 >-+++ mutt-1.5.22/sidebar.c Fri Oct 18 10:18:45 2013 >-@@ -0,0 +1,333 @@ >-+/* >-+ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> >-+ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> >-+ * >-+ * This program is free software; you can redistribute it and/or modify >-+ * it under the terms of the GNU General Public License as published by >-+ * the Free Software Foundation; either version 2 of the License, or >-+ * (at your option) any later version. >-+ * >-+ * This program is distributed in the hope that it will be useful, >-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >-+ * GNU General Public License for more details. >-+ * >-+ * You should have received a copy of the GNU General Public License >-+ * along with this program; if not, write to the Free Software >-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. >-+ */ >-+ >-+ >-+#if HAVE_CONFIG_H >-+# include "config.h" >-+#endif >-+ >-+#include "mutt.h" >-+#include "mutt_menu.h" >-+#include "mutt_curses.h" >-+#include "sidebar.h" >-+#include "buffy.h" >-+#include <libgen.h> >-+#include "keymap.h" >-+#include <stdbool.h> >-+ >-+/*BUFFY *CurBuffy = 0;*/ >-+static BUFFY *TopBuffy = 0; >-+static BUFFY *BottomBuffy = 0; >-+static int known_lines = 0; >-+ >-+static int quick_log10(int n) >-+{ >-+ char string[32]; >-+ sprintf(string, "%d", n); >-+ return strlen(string); >-+} >-+ >-+void calc_boundaries (int menu) >-+{ >-+ BUFFY *tmp = Incoming; >-+ >-+ if ( known_lines != LINES ) { >-+ TopBuffy = BottomBuffy = 0; >-+ known_lines = LINES; >-+ } >-+ for ( ; tmp->next != 0; tmp = tmp->next ) >-+ tmp->next->prev = tmp; >-+ >-+ if ( TopBuffy == 0 && BottomBuffy == 0 ) >-+ TopBuffy = Incoming; >-+ if ( BottomBuffy == 0 ) { >-+ int count = LINES - 2 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); >-+ BottomBuffy = TopBuffy; >-+ while ( --count && BottomBuffy->next ) >-+ BottomBuffy = BottomBuffy->next; >-+ } >-+ else if ( TopBuffy == CurBuffy->next ) { >-+ int count = LINES - 2 - (menu != MENU_PAGER); >-+ BottomBuffy = CurBuffy; >-+ tmp = BottomBuffy; >-+ while ( --count && tmp->prev) >-+ tmp = tmp->prev; >-+ TopBuffy = tmp; >-+ } >-+ else if ( BottomBuffy == CurBuffy->prev ) { >-+ int count = LINES - 2 - (menu != MENU_PAGER); >-+ TopBuffy = CurBuffy; >-+ tmp = TopBuffy; >-+ while ( --count && tmp->next ) >-+ tmp = tmp->next; >-+ BottomBuffy = tmp; >-+ } >-+} >-+ >-+char *make_sidebar_entry(char *box, int size, int new, int flagged) >-+{ >-+ static char *entry = 0; >-+ char *c; >-+ int i = 0; >-+ int delim_len = strlen(SidebarDelim); >-+ >-+ c = realloc(entry, SidebarWidth - delim_len + 2); >-+ if ( c ) entry = c; >-+ entry[SidebarWidth - delim_len + 1] = 0; >-+ for (; i < SidebarWidth - delim_len + 1; entry[i++] = ' ' ); >-+ i = strlen(box); >-+ strncpy( entry, box, i < (SidebarWidth - delim_len + 1) ? i : (SidebarWidth - delim_len + 1) ); >-+ >-+ if (size == -1) >-+ sprintf(entry + SidebarWidth - delim_len - 3, "?"); >-+ else if ( new ) { >-+ if (flagged > 0) { >-+ sprintf( >-+ entry + SidebarWidth - delim_len - 5 - quick_log10(size) - quick_log10(new) - quick_log10(flagged), >-+ "% d(%d)[%d]", size, new, flagged); >++ /* if we're not using the index, update every time */ >++ if ( index == 0 ) >++ draw_sidebar(MENU_PAGER); >++ >+ redraw = 0; >+ >+ if (option(OPTBRAILLEFRIENDLY)) { >+*************** >+*** 2763,2768 **** >+--- 2784,2796 ---- >+ mutt_what_key (); >+ break; >+ >++ case OP_SIDEBAR_SCROLL_UP: >++ case OP_SIDEBAR_SCROLL_DOWN: >++ case OP_SIDEBAR_NEXT: >++ case OP_SIDEBAR_PREV: >++ scroll_sidebar(ch, MENU_PAGER); >++ break; >++ >+ default: >+ ch = -1; >+ break; >+*** mutt-1.5.23-orig/pattern.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/pattern.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 154,159 **** >+--- 154,163 ---- >+ HEADER *h = ctx->hdrs[msgno]; >+ char *buf; >+ size_t blen; >++ #ifdef HAVE_FMEMOPEN >++ char *temp; >++ size_t tempsize; >++ #endif >+ >+ if ((msg = mx_open_message (ctx, msgno)) != NULL) >+ { >+*************** >+*** 163,174 **** >+--- 167,186 ---- >+ memset (&s, 0, sizeof (s)); >+ s.fpin = msg->fp; >+ s.flags = M_CHARCONV; >++ #ifdef HAVE_FMEMOPEN >++ if((s.fpout = open_memstream(&temp, &tempsize)) == NULL) >++ { >++ mutt_perror ("Error opening memstream"); >++ return (0); >++ } >++ #else >+ mutt_mktemp (tempfile, sizeof (tempfile)); >+ if ((s.fpout = safe_fopen (tempfile, "w+")) == NULL) >+ { >+ mutt_perror (tempfile); >+ return (0); >+ } >++ #endif >+ >+ if (pat->op != M_BODY) >+ mutt_copy_header (msg->fp, h, s.fpout, CH_FROM | CH_DECODE, NULL); >+*************** >+*** 184,190 **** >+--- 196,206 ---- >+ if (s.fpout) >+ { >+ safe_fclose (&s.fpout); >++ #ifdef HAVE_FMEMOPEN >++ FREE(&temp); >++ #else >+ unlink (tempfile); >++ #endif >+ } >+ return (0); >+ } >+*************** >+*** 193,203 **** >+--- 209,236 ---- >+ mutt_body_handler (h->content, &s); >+ } >+ >++ #ifdef HAVE_FMEMOPEN >++ fclose(s.fpout); >++ lng = tempsize; >++ >++ if(tempsize) { >++ if ((fp = fmemopen(temp, tempsize, "r")) == NULL) { >++ mutt_perror ("Error re-opening memstream"); >++ return (0); >++ } >++ } else { /* fmemopen cannot handle empty buffers */ >++ if ((fp = safe_fopen ("/dev/null", "r")) == NULL) { >++ mutt_perror ("Error opening /dev/null"); >++ return (0); >++ } >++ } >++ #else >+ fp = s.fpout; >+ fflush (fp); >+ fseek (fp, 0, 0); >+ fstat (fileno (fp), &st); >+ lng = (long) st.st_size; >++ #endif >+ } >+ else >+ { >+*************** >+*** 244,250 **** >+--- 277,288 ---- >+ if (option (OPTTHOROUGHSRC)) >+ { >+ safe_fclose (&fp); >++ #ifdef HAVE_FMEMOPEN >++ if(tempsize) >++ FREE (&temp); >++ #else >+ unlink (tempfile); >++ #endif >+ } >+ } >+ >+*** mutt-1.5.23-orig/PATCHES 2014-03-12 11:03:44.000000000 -0500 >+--- mutt-1.5.23/PATCHES 2014-04-12 12:36:35.000000000 -0500 >+*************** >+*** 0 **** >+--- 1 ---- >++ patch-1.5.23.sidebar.20140412.txt >+*** mutt-1.5.23-orig/protos.h 2014-03-12 11:06:17.000000000 -0500 >+--- mutt-1.5.23/protos.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 36,41 **** >+--- 36,48 ---- >+ const char *pager_progress; >+ }; >+ >++ struct sidebar_entry { >++ char box[SHORT_STRING]; >++ unsigned int size; >++ unsigned int new; >++ unsigned int flagged; >++ }; >++ >+ void mutt_make_string_info (char *, size_t, const char *, struct hdr_format_info *, format_flag); >+ >+ int mutt_extract_token (BUFFER *, BUFFER *, int); >+*** mutt-1.5.23-orig/sidebar.c 1969-12-31 18:00:00.000000000 -0600 >+--- mutt-1.5.23/sidebar.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 0 **** >+--- 1,405 ---- >++ /* >++ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> >++ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> >++ * >++ * This program is free software; you can redistribute it and/or modify >++ * it under the terms of the GNU General Public License as published by >++ * the Free Software Foundation; either version 2 of the License, or >++ * (at your option) any later version. >++ * >++ * This program is distributed in the hope that it will be useful, >++ * but WITHOUT ANY WARRANTY; without even the implied warranty of >++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >++ * GNU General Public License for more details. >++ * >++ * You should have received a copy of the GNU General Public License >++ * along with this program; if not, write to the Free Software >++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. >++ */ >++ >++ >++ #if HAVE_CONFIG_H >++ # include "config.h" >++ #endif >++ >++ #include "mutt.h" >++ #include "mutt_menu.h" >++ #include "mutt_curses.h" >++ #include "sidebar.h" >++ #include "buffy.h" >++ #include <libgen.h> >++ #include "keymap.h" >++ #include <stdbool.h> >++ >++ /*BUFFY *CurBuffy = 0;*/ >++ static BUFFY *TopBuffy = 0; >++ static BUFFY *BottomBuffy = 0; >++ static int known_lines = 0; >++ >++ void calc_boundaries() { >++ >++ BUFFY *tmp = Incoming; >++ >++ int count = LINES - 2 - (option(OPTHELP) ? 1 : 0); >++ >++ if ( known_lines != LINES ) { >++ TopBuffy = BottomBuffy = 0; >++ known_lines = LINES; >++ } >++ for ( ; tmp->next != 0; tmp = tmp->next ) >++ tmp->next->prev = tmp; >++ >++ if ( TopBuffy == 0 && BottomBuffy == 0 ) >++ TopBuffy = Incoming; >++ if ( BottomBuffy == 0 ) { >++ BottomBuffy = TopBuffy; >++ while ( --count && BottomBuffy->next ) >++ BottomBuffy = BottomBuffy->next; >++ } >++ else if ( TopBuffy == CurBuffy->next ) { >++ BottomBuffy = CurBuffy; >++ tmp = BottomBuffy; >++ while ( --count && tmp->prev) >++ tmp = tmp->prev; >++ TopBuffy = tmp; >++ } >++ else if ( BottomBuffy == CurBuffy->prev ) { >++ TopBuffy = CurBuffy; >++ tmp = TopBuffy; >++ while ( --count && tmp->next ) >++ tmp = tmp->next; >++ BottomBuffy = tmp; >++ } >++ } >++ >++ static const char * >++ sidebar_format_str (char *dest, >++ size_t destlen, >++ size_t col, >++ char op, >++ const char *src, >++ const char *prefix, >++ const char *ifstring, >++ const char *elsestring, >++ unsigned long data, >++ format_flag flags) >++ { >++ /* casting from unsigned long - srsly?! */ >++ struct sidebar_entry *sbe = (struct sidebar_entry *) data; >++ unsigned int optional; >++ char fmt[SHORT_STRING], buf[SHORT_STRING]; >++ >++ optional = flags & M_FORMAT_OPTIONAL; >++ >++ switch(op) { >++ case 'F': >++ if(!optional) { >++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); >++ snprintf (dest, destlen, fmt, sbe->flagged); >++ } else if(sbe->flagged == 0) { >++ optional = 0; >++ } >++ break; >++ >++ case '!': >++ if(sbe->flagged == 0) >++ mutt_format_s(dest, destlen, prefix, ""); >++ if(sbe->flagged == 1) >++ mutt_format_s(dest, destlen, prefix, "!"); >++ if(sbe->flagged == 2) >++ mutt_format_s(dest, destlen, prefix, "!!"); >++ if(sbe->flagged > 2) { >++ snprintf (buf, sizeof (buf), "%d!", sbe->flagged); >++ mutt_format_s(dest, destlen, prefix, buf); >++ } >++ break; >++ >++ case 'S': >++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); >++ snprintf (dest, destlen, fmt, sbe->size); >++ break; >++ >++ case 'N': >++ if(!optional) { >++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); >++ snprintf (dest, destlen, fmt, sbe->new); >++ } else if(sbe->new == 0) { >++ optional = 0; >++ } >++ break; >++ >++ case 'B': >++ mutt_format_s(dest, destlen, prefix, sbe->box); >++ break; >++ } >++ >++ if(optional) >++ mutt_FormatString (dest, destlen, col, ifstring, sidebar_format_str, (unsigned long) sbe, flags); >++ else if (flags & M_FORMAT_OPTIONAL) >++ mutt_FormatString (dest, destlen, col, elsestring, sidebar_format_str, (unsigned long) sbe, flags); >++ >++ return (src); >++ } >++ >++ char *make_sidebar_entry(char *box, unsigned int size, unsigned int new, unsigned int flagged) { >++ static char *entry = 0; >++ struct sidebar_entry sbe; >++ int SBvisual; >++ >++ SBvisual = SidebarWidth - strlen(SidebarDelim); >++ if (SBvisual < 1) >++ return NULL; >++ >++ sbe.new = new; >++ sbe.flagged = flagged; >++ sbe.size = size; >++ strncpy(sbe.box, box, 31); >++ >++ safe_realloc(&entry, SBvisual + 2); >++ entry[SBvisual + 1] = '\0'; >++ >++ mutt_FormatString (entry, SBvisual+1, 0, SidebarFormat, sidebar_format_str, (unsigned long) &sbe, 0); >++ >++ return entry; >++ } >++ >++ void set_curbuffy(char buf[LONG_STRING]) >++ { >++ BUFFY* tmp = CurBuffy = Incoming; >++ >++ if (!Incoming) >++ return; >++ >++ while(1) { >++ if(!strcmp(tmp->path, buf) || !strcmp(tmp->realpath, buf)) { >++ CurBuffy = tmp; >++ break; >++ } >++ >++ if(tmp->next) >++ tmp = tmp->next; >++ else >++ break; >++ } >++ } >++ >++ int draw_sidebar(int menu) { >++ >++ BUFFY *tmp; >++ #ifndef USE_SLANG_CURSES >++ attr_t attrs; >++ #endif >++ short delim_len = strlen(SidebarDelim); >++ short color_pair; >++ >++ static bool initialized = false; >++ static int prev_show_value; >++ static short saveSidebarWidth; >++ int lines = 0; >++ int SidebarHeight; >++ >++ if(option(OPTSTATUSONTOP) || option(OPTHELP)) >++ lines++; /* either one will occupy the first line */ >++ >++ /* initialize first time */ >++ if(!initialized) { >++ prev_show_value = option(OPTSIDEBAR); >++ saveSidebarWidth = SidebarWidth; >++ if(!option(OPTSIDEBAR)) SidebarWidth = 0; >++ initialized = true; >++ } >++ >++ /* save or restore the value SidebarWidth */ >++ if(prev_show_value != option(OPTSIDEBAR)) { >++ if(prev_show_value && !option(OPTSIDEBAR)) { >++ saveSidebarWidth = SidebarWidth; >++ SidebarWidth = 0; >++ } else if(!prev_show_value && option(OPTSIDEBAR)) { >++ mutt_buffy_check(1); /* we probably have bad or no numbers */ >++ SidebarWidth = saveSidebarWidth; >++ } >++ prev_show_value = option(OPTSIDEBAR); >++ } >++ >++ >++ /* if ( SidebarWidth == 0 ) return 0; */ >++ if (SidebarWidth > 0 && option (OPTSIDEBAR) >++ && delim_len >= SidebarWidth) { >++ unset_option (OPTSIDEBAR); >++ /* saveSidebarWidth = SidebarWidth; */ >++ if (saveSidebarWidth > delim_len) { >++ SidebarWidth = saveSidebarWidth; >++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar.")); >++ sleep (2); > + } else { >-+ sprintf( >-+ entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(new), >-+ "% d(%d)", size, new); >++ SidebarWidth = 0; >++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value.")); >++ sleep (4); /* the advise to set a sane value should be seen long enough */ > + } >-+ } else if (flagged > 0) { >-+ sprintf( entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(flagged), "% d[%d]", size, flagged); >-+ } else { >-+ sprintf( entry + SidebarWidth - delim_len - 1 - quick_log10(size), "% d", size); >-+ } >-+ return entry; >-+} >-+ >-+void set_curbuffy(char buf[LONG_STRING]) >-+{ >-+ BUFFY* tmp = CurBuffy = Incoming; >-+ >-+ if (!Incoming) >-+ return; >-+ >-+ while(1) { >-+ if(!strcmp(tmp->path, buf)) { >-+ CurBuffy = tmp; >-+ break; >-+ } >-+ >-+ if(tmp->next) >-+ tmp = tmp->next; >-+ else >-+ break; >-+ } >-+} >-+ >-+int draw_sidebar(int menu) { >-+ >-+ int lines = option(OPTHELP) ? 1 : 0; >-+ BUFFY *tmp; >-+#ifndef USE_SLANG_CURSES >-+ attr_t attrs; >-+#endif >-+ short delim_len = strlen(SidebarDelim); >-+ short color_pair; >-+ >-+ static bool initialized = false; >-+ static int prev_show_value; >-+ static short saveSidebarWidth; >-+ >-+ /* initialize first time */ >-+ if(!initialized) { >-+ prev_show_value = option(OPTSIDEBAR); >-+ saveSidebarWidth = SidebarWidth; >-+ if(!option(OPTSIDEBAR)) SidebarWidth = 0; >-+ initialized = true; >-+ } >-+ >-+ /* save or restore the value SidebarWidth */ >-+ if(prev_show_value != option(OPTSIDEBAR)) { >-+ if(prev_show_value && !option(OPTSIDEBAR)) { >-+ saveSidebarWidth = SidebarWidth; >-+ SidebarWidth = 0; >-+ } else if(!prev_show_value && option(OPTSIDEBAR)) { >-+ SidebarWidth = saveSidebarWidth; >-+ } >-+ prev_show_value = option(OPTSIDEBAR); >++ saveSidebarWidth = 0; >++ return (0); > + } >-+ >-+ >-+// if ( SidebarWidth == 0 ) return 0; >-+ if (SidebarWidth > 0 && option (OPTSIDEBAR) >-+ && delim_len >= SidebarWidth) { >-+ unset_option (OPTSIDEBAR); >-+ /* saveSidebarWidth = SidebarWidth; */ >-+ if (saveSidebarWidth > delim_len) { >-+ SidebarWidth = saveSidebarWidth; >-+ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar.")); >-+ sleep (2); >-+ } else { >-+ SidebarWidth = 0; >-+ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value.")); >-+ sleep (4); /* the advise to set a sane value should be seen long enough */ >-+ } >-+ saveSidebarWidth = 0; >-+ return (0); >++ >++ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) { >++ if (SidebarWidth > 0) { >++ saveSidebarWidth = SidebarWidth; >++ SidebarWidth = 0; > + } >-+ >-+ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) { >-+ if (SidebarWidth > 0) { >-+ saveSidebarWidth = SidebarWidth; >-+ SidebarWidth = 0; >-+ } >-+ unset_option(OPTSIDEBAR); >-+ return 0; >-+ } >-+ >-+ /* get attributes for divider */ >-+ SETCOLOR(MT_COLOR_STATUS); >-+#ifndef USE_SLANG_CURSES >-+ attr_get(&attrs, &color_pair, 0); >-+#else >-+ color_pair = attr_get(); >-+#endif >-+ SETCOLOR(MT_COLOR_NORMAL); >-+ >-+ /* draw the divider */ >-+ >-+ for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) { >-+ move(lines, SidebarWidth - delim_len); >-+ addstr(NONULL(SidebarDelim)); >-+#ifndef USE_SLANG_CURSES >-+ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); >-+#endif >-+ } >-+ >-+ if ( Incoming == 0 ) return 0; >-+ lines = option(OPTHELP) ? 1 : 0; /* go back to the top */ >-+ >-+ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) >-+ calc_boundaries(menu); >-+ if ( CurBuffy == 0 ) CurBuffy = Incoming; >-+ >-+ tmp = TopBuffy; >-+ >-+ SETCOLOR(MT_COLOR_NORMAL); >-+ >-+ for ( ; tmp && lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); tmp = tmp->next ) { >-+ if ( tmp == CurBuffy ) >-+ SETCOLOR(MT_COLOR_INDICATOR); >-+ else if ( tmp->msg_unread > 0 ) >-+ SETCOLOR(MT_COLOR_NEW); >-+ else if ( tmp->msg_flagged > 0 ) >-+ SETCOLOR(MT_COLOR_FLAGGED); >-+ else >-+ SETCOLOR(MT_COLOR_NORMAL); >-+ >-+ move( lines, 0 ); >-+ if ( Context && !strcmp( tmp->path, Context->path ) ) { >-+ tmp->msg_unread = Context->unread; >-+ tmp->msgcount = Context->msgcount; >-+ tmp->msg_flagged = Context->flagged; >-+ } >-+ // check whether Maildir is a prefix of the current folder's path >-+ short maildir_is_prefix = 0; >-+ if ( (strlen(tmp->path) > strlen(Maildir)) && >-+ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) >-+ maildir_is_prefix = 1; >-+ // calculate depth of current folder and generate its display name with indented spaces >-+ int sidebar_folder_depth = 0; >-+ char *sidebar_folder_name; >-+ sidebar_folder_name = basename(tmp->path); >-+ if ( maildir_is_prefix ) { >-+ char *tmp_folder_name; >-+ int i; >-+ tmp_folder_name = tmp->path + strlen(Maildir); >-+ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { >-+ if (tmp_folder_name[i] == '/') sidebar_folder_depth++; >-+ } >-+ if (sidebar_folder_depth > 0) { >-+ sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1); >-+ for (i=0; i < sidebar_folder_depth; i++) >-+ sidebar_folder_name[i]=' '; >-+ sidebar_folder_name[i]=0; >-+ strncat(sidebar_folder_name, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth); >-+ } >-+ } >-+ printw( "%.*s", SidebarWidth - delim_len + 1, >-+ make_sidebar_entry(sidebar_folder_name, tmp->msgcount, >-+ tmp->msg_unread, tmp->msg_flagged)); >-+ if (sidebar_folder_depth > 0) >-+ free(sidebar_folder_name); >-+ lines++; >-+ } >-+ SETCOLOR(MT_COLOR_NORMAL); >-+ for ( ; lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) { >-+ int i = 0; >-+ move( lines, 0 ); >-+ for ( ; i < SidebarWidth - delim_len; i++ ) >-+ addch(' '); >-+ } >-+ return 0; >-+} >-+ >-+ >-+void set_buffystats(CONTEXT* Context) >-+{ >-+ BUFFY *tmp = Incoming; >-+ while(tmp) { >-+ if(Context && !strcmp(tmp->path, Context->path)) { >-+ tmp->msg_unread = Context->unread; >-+ tmp->msgcount = Context->msgcount; >-+ break; >-+ } >-+ tmp = tmp->next; >-+ } >-+} >-+ >-+void scroll_sidebar(int op, int menu) >-+{ >-+ if(!SidebarWidth) return; >-+ if(!CurBuffy) return; >-+ >-+ switch (op) { >-+ case OP_SIDEBAR_NEXT: >-+ if ( CurBuffy->next == NULL ) return; >-+ CurBuffy = CurBuffy->next; >-+ break; >-+ case OP_SIDEBAR_PREV: >-+ if ( CurBuffy->prev == NULL ) return; >-+ CurBuffy = CurBuffy->prev; >-+ break; >-+ case OP_SIDEBAR_SCROLL_UP: >-+ CurBuffy = TopBuffy; >-+ if ( CurBuffy != Incoming ) { >-+ calc_boundaries(menu); >-+ CurBuffy = CurBuffy->prev; >-+ } >-+ break; >-+ case OP_SIDEBAR_SCROLL_DOWN: >-+ CurBuffy = BottomBuffy; >-+ if ( CurBuffy->next ) { >-+ calc_boundaries(menu); >-+ CurBuffy = CurBuffy->next; >-+ } >-+ break; >-+ default: >-+ return; >-+ } >-+ calc_boundaries(menu); >-+ draw_sidebar(menu); >-+} >-+ >-diff -uNp -r mutt-1.5.22.orig/sidebar.h mutt-1.5.22/sidebar.h >---- mutt-1.5.22.orig/sidebar.h Thu Jan 1 01:00:00 1970 >-+++ mutt-1.5.22/sidebar.h Fri Oct 18 10:18:45 2013 >-@@ -0,0 +1,36 @@ >-+/* >-+ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> >-+ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> >-+ * >-+ * This program is free software; you can redistribute it and/or modify >-+ * it under the terms of the GNU General Public License as published by >-+ * the Free Software Foundation; either version 2 of the License, or >-+ * (at your option) any later version. >-+ * >-+ * This program is distributed in the hope that it will be useful, >-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >-+ * GNU General Public License for more details. >-+ * >-+ * You should have received a copy of the GNU General Public License >-+ * along with this program; if not, write to the Free Software >-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. >-+ */ >-+ >-+#ifndef SIDEBAR_H >-+#define SIDEBAR_H >-+ >-+struct MBOX_LIST { >-+ char *path; >-+ int msgcount; >-+ int new; >-+} MBLIST; >-+ >-+/* parameter is whether or not to go to the status line */ >-+/* used for omitting the last | that covers up the status bar in the index */ >-+int draw_sidebar(int); >-+void scroll_sidebar(int, int); >-+void set_curbuffy(char*); >-+void set_buffystats(CONTEXT*); >-+ >-+#endif /* SIDEBAR_H */ >---- orig/Makefile.am.orig 2010-09-18 13:23:19.000000000 +0200 >-+++ new/Makefile.am 2010-09-18 13:25:19.000000000 +0200 >-@@ -34,7 +34,7 @@ >- score.c send.c sendlib.c signal.c sort.c \ >- status.c system.c thread.c charset.c history.c lib.c \ >- muttlib.c editmsg.c mbyte.c \ >-- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c >-+ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c >- >- nodist_mutt_SOURCES = $(BUILT_SOURCES) >- >---- orig/Makefile.in.orig 2013-10-25 08:23:07.000000000 +0200 >-+++ new/Makefile.in 2013-10-25 08:26:20.000000000 +0200 >-@@ -133,7 +133,7 @@ >- system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ >- history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ >- editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ >-- ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) >-+ ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) sidebar.$(OBJEXT) >- am__objects_1 = >- am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ >- $(am__objects_1) >-@@ -472,7 +472,7 @@ >- score.c send.c sendlib.c signal.c sort.c \ >- status.c system.c thread.c charset.c history.c lib.c \ >- muttlib.c editmsg.c mbyte.c \ >-- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c >-+ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c >- >- nodist_mutt_SOURCES = $(BUILT_SOURCES) >- mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ >-@@ -504,7 +504,7 @@ >- README.SSL smime.h group.h \ >- muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ >- ChangeLog mkchangelog.sh mutt_idna.h \ >-- snprintf.c regex.c crypt-gpgme.h hcachever.sh.in \ >-+ snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in \ >- txt2c.c txt2c.sh version.sh check_sec.sh >- >- EXTRA_SCRIPTS = smime_keys >-*** mutt-1.5.20-orig/doc/Muttrc 2009-06-14 13:53:24.000000000 -0500 >---- mutt-1.5.20-patched/doc/Muttrc 2009-06-19 22:07:04.000000000 -0500 >++ unset_option(OPTSIDEBAR); >++ return 0; >++ } >++ >++ /* get attributes for divider */ >++ SETCOLOR(MT_COLOR_STATUS); >++ #ifndef USE_SLANG_CURSES >++ attr_get(&attrs, &color_pair, 0); >++ #else >++ color_pair = attr_get(); >++ #endif >++ SETCOLOR(MT_COLOR_NORMAL); >++ >++ /* draw the divider */ >++ >++ SidebarHeight = LINES - 1; >++ if(option(OPTHELP) || !option(OPTSTATUSONTOP)) >++ SidebarHeight--; >++ >++ for ( ; lines < SidebarHeight; lines++ ) { >++ move(lines, SidebarWidth - delim_len); >++ addstr(NONULL(SidebarDelim)); >++ #ifndef USE_SLANG_CURSES >++ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); >++ #endif >++ } >++ >++ if ( Incoming == 0 ) return 0; >++ lines = 0; >++ if(option(OPTSTATUSONTOP) || option(OPTHELP)) >++ lines++; /* either one will occupy the first line */ >++ >++ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) >++ calc_boundaries(menu); >++ if ( CurBuffy == 0 ) CurBuffy = Incoming; >++ >++ tmp = TopBuffy; >++ >++ SETCOLOR(MT_COLOR_NORMAL); >++ >++ for ( ; tmp && lines < SidebarHeight; tmp = tmp->next ) { >++ if ( tmp == CurBuffy ) >++ SETCOLOR(MT_COLOR_INDICATOR); >++ else if ( tmp->msg_unread > 0 ) >++ SETCOLOR(MT_COLOR_NEW); >++ else if ( tmp->msg_flagged > 0 ) >++ SETCOLOR(MT_COLOR_FLAGGED); >++ else >++ SETCOLOR(MT_COLOR_NORMAL); >++ >++ move( lines, 0 ); >++ if ( Context && (!strcmp(tmp->path, Context->path)|| >++ !strcmp(tmp->realpath, Context->path)) ) { >++ tmp->msg_unread = Context->unread; >++ tmp->msgcount = Context->msgcount; >++ tmp->msg_flagged = Context->flagged; >++ } >++ /* check whether Maildir is a prefix of the current folder's path */ >++ short maildir_is_prefix = 0; >++ if ( (strlen(tmp->path) > strlen(Maildir)) && >++ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) >++ maildir_is_prefix = 1; >++ /* calculate depth of current folder and generate its display name with indented spaces */ >++ int sidebar_folder_depth = 0; >++ char *sidebar_folder_name; >++ sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir) + 1); >++ if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) { >++ char *tmp_folder_name; >++ int i; >++ tmp_folder_name = tmp->path + strlen(Maildir) + 1; >++ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { >++ if (tmp_folder_name[i] == '/' || tmp_folder_name[i] == '.') sidebar_folder_depth++; >++ } >++ if (sidebar_folder_depth > 0) { >++ if (option(OPTSIDEBARSHORTPATH)) { >++ tmp_folder_name = strrchr(tmp->path, '.'); >++ if (tmp_folder_name == NULL) >++ tmp_folder_name = mutt_basename(tmp->path); >++ else >++ tmp_folder_name++; >++ } >++ else >++ tmp_folder_name = tmp->path + strlen(Maildir) + 1; >++ sidebar_folder_name = malloc(strlen(tmp_folder_name) + sidebar_folder_depth*strlen(NONULL(SidebarIndentStr)) + 1); >++ sidebar_folder_name[0]=0; >++ for (i=0; i < sidebar_folder_depth; i++) >++ strncat(sidebar_folder_name, NONULL(SidebarIndentStr), strlen(NONULL(SidebarIndentStr))); >++ strncat(sidebar_folder_name, tmp_folder_name, strlen(tmp_folder_name)); >++ } >++ } >++ printw( "%.*s", SidebarWidth - delim_len + 1, >++ make_sidebar_entry(sidebar_folder_name, tmp->msgcount, >++ tmp->msg_unread, tmp->msg_flagged)); >++ if (sidebar_folder_depth > 0) >++ free(sidebar_folder_name); >++ lines++; >++ } >++ SETCOLOR(MT_COLOR_NORMAL); >++ for ( ; lines < SidebarHeight; lines++ ) { >++ int i = 0; >++ move( lines, 0 ); >++ for ( ; i < SidebarWidth - delim_len; i++ ) >++ addch(' '); >++ } >++ return 0; >++ } >++ >++ >++ void set_buffystats(CONTEXT* Context) >++ { >++ BUFFY *tmp = Incoming; >++ while(tmp) { >++ if(Context && (!strcmp(tmp->path, Context->path) || >++ !strcmp(tmp->realpath, Context->path))) { >++ tmp->msg_unread = Context->unread; >++ tmp->msgcount = Context->msgcount; >++ tmp->msg_flagged = Context->flagged; >++ break; >++ } >++ tmp = tmp->next; >++ } >++ } >++ >++ void scroll_sidebar(int op, int menu) >++ { >++ if(!SidebarWidth) return; >++ if(!CurBuffy) return; >++ >++ switch (op) { >++ case OP_SIDEBAR_NEXT: >++ if ( CurBuffy->next == NULL ) return; >++ CurBuffy = CurBuffy->next; >++ break; >++ case OP_SIDEBAR_PREV: >++ if ( CurBuffy->prev == NULL ) return; >++ CurBuffy = CurBuffy->prev; >++ break; >++ case OP_SIDEBAR_SCROLL_UP: >++ CurBuffy = TopBuffy; >++ if ( CurBuffy != Incoming ) { >++ calc_boundaries(menu); >++ CurBuffy = CurBuffy->prev; >++ } >++ break; >++ case OP_SIDEBAR_SCROLL_DOWN: >++ CurBuffy = BottomBuffy; >++ if ( CurBuffy->next ) { >++ calc_boundaries(menu); >++ CurBuffy = CurBuffy->next; >++ } >++ break; >++ default: >++ return; >++ } >++ calc_boundaries(menu); >++ draw_sidebar(menu); >++ } >++ >+*** mutt-1.5.23-orig/sidebar.h 1969-12-31 18:00:00.000000000 -0600 >+--- mutt-1.5.23/sidebar.h 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 0 **** >+--- 1,36 ---- >++ /* >++ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> >++ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> >++ * >++ * This program is free software; you can redistribute it and/or modify >++ * it under the terms of the GNU General Public License as published by >++ * the Free Software Foundation; either version 2 of the License, or >++ * (at your option) any later version. >++ * >++ * This program is distributed in the hope that it will be useful, >++ * but WITHOUT ANY WARRANTY; without even the implied warranty of >++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >++ * GNU General Public License for more details. >++ * >++ * You should have received a copy of the GNU General Public License >++ * along with this program; if not, write to the Free Software >++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. >++ */ >++ >++ #ifndef SIDEBAR_H >++ #define SIDEBAR_H >++ >++ struct MBOX_LIST { >++ char *path; >++ int msgcount; >++ int new; >++ } MBLIST; >++ >++ /* parameter is whether or not to go to the status line */ >++ /* used for omitting the last | that covers up the status bar in the index */ >++ int draw_sidebar(int); >++ void scroll_sidebar(int, int); >++ void set_curbuffy(char*); >++ void set_buffystats(CONTEXT*); >++ >++ #endif /* SIDEBAR_H */ >+*** mutt-1.5.23-orig/doc/Muttrc 2014-03-12 11:27:11.000000000 -0500 >+--- mutt-1.5.23/doc/Muttrc 2014-04-11 10:14:01.000000000 -0500 > *************** > *** 657,662 **** > --- 657,682 ---- >@@ -1454,3 +2254,40 @@ > # set crypt_autosign=no > # > # Name: crypt_autosign >+*** mutt-1.5.23-orig/imap/imap.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/imap/imap.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1514,1520 **** >+ >+ imap_munge_mbox_name (munged, sizeof (munged), name); >+ snprintf (command, sizeof (command), >+! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged); >+ >+ if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) >+ { >+--- 1514,1520 ---- >+ >+ imap_munge_mbox_name (munged, sizeof (munged), name); >+ snprintf (command, sizeof (command), >+! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged); >+ >+ if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) >+ { >+*** mutt-1.5.23-orig/imap/command.c 2014-03-12 11:03:45.000000000 -0500 >+--- mutt-1.5.23/imap/command.c 2014-04-11 10:14:01.000000000 -0500 >+*************** >+*** 1012,1017 **** >+--- 1012,1024 ---- >+ opened */ >+ status->uidnext = oldun; >+ >++ /* Added to make the sidebar show the correct numbers */ >++ if (status->messages) >++ { >++ inc->msgcount = status->messages; >++ inc->msg_unread = status->unseen; >++ } >++ >+ FREE (&value); >+ return; >+ } >diff -ru /usr/ports/mail/mutt/files/extra-patch-sidebar-refresh ./files/extra-patch-sidebar-refresh >--- /usr/ports/mail/mutt/files/extra-patch-sidebar-refresh 2015-04-22 08:21:51.000000000 +0200 >+++ ./files/extra-patch-sidebar-refresh 2015-04-22 08:14:16.000000000 +0200 >@@ -1,5 +1,5 @@ >---- mutt.orig/buffy.c 2012-11-02 13:16:39.000000000 +0100 >-+++ mutt/buffy.c 2012-11-02 13:20:52.000000000 +0100 >+--- mutt.orig/buffy.c.orig 2015-04-22 08:09:04.000000000 +0200 >++++ mutt/buffy.c 2015-04-22 08:12:54.000000000 +0200 > @@ -26,6 +26,7 @@ > #include "mx.h" > >@@ -8,13 +8,13 @@ > > #ifdef USE_IMAP > #include "imap.h" >-@@ -564,19 +565,28 @@ >+@@ -584,19 +585,28 @@ > { > case M_MBOX: > case M_MMDF: >-- buffy_mbox_update (tmp); >+- buffy_mbox_update (tmp, &sb); > + if (sidebar_should_refresh()) { >-+ buffy_mbox_update (tmp); >++ buffy_mbox_update (tmp, &sb); > + sidebar_updated(); > + } > if (buffy_mbox_hasnew (tmp, &sb) > 0) >@@ -26,18 +26,18 @@ > + if (sidebar_should_refresh()) { > + buffy_maildir_update (tmp); > + sidebar_updated(); >-+ } >++ } > if (buffy_maildir_hasnew (tmp) > 0) > BuffyCount++; > break; > > case M_MH: >-- mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged); >+- mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged, &tmp->sb_last_checked); > + if (sidebar_should_refresh()) { >-+ mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged); >++ mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged, &tmp->sb_last_checked); > + sidebar_updated(); >-+ } >- mh_buffy(tmp); >++ } >+ mh_buffy(tmp); > if (tmp->new) > BuffyCount++; > Index: mutt/globals.h >diff -ru /usr/ports/mail/mutt/files/patch-pgpkey.c ./files/patch-pgpkey.c >--- /usr/ports/mail/mutt/files/patch-pgpkey.c 1970-01-01 01:00:00.000000000 +0100 >+++ ./files/patch-pgpkey.c 2015-04-13 17:50:49.000000000 +0200 >@@ -0,0 +1,18 @@ >+--- pgpkey.c.orig 2014-03-12 17:03:44.000000000 +0100 >++++ pgpkey.c 2015-04-13 17:50:05.000000000 +0200 >+@@ -985,13 +985,13 @@ >+ pgp_remove_key (&matches, k); >+ >+ pgp_free_key (&matches); >+- if (!p[l-1]) >++ if (l && !p[l-1]) >+ p[l-1] = '!'; >+ return k; >+ } >+ >+ out: >+- if (!p[l-1]) >++ if (l && !p[l-1]) >+ p[l-1] = '!'; >+ return NULL; >+ }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 199727
:
156033
|
156068