diff --git a/aw.listreply.diff b/aw.listreply.diff index 765fb2d..c56f5dc 100644 --- a/aw.listreply.diff +++ b/aw.listreply.diff @@ -6,7 +6,7 @@ Index: mutt-1.5.21/PATCHES +++ mutt-1.5.21/PATCHES 2012-06-21 11:48:50.352837436 +0200 @@ -1,3 +1,4 @@ +patch-1.5.9.aw.listreply.1 - patch-1.5.20.sidebar.20090619.txt + patch-1.5.21.sidebar.20120829.txt patch-1.5.19.rr.compressed.1 patch-1.5.5.1.nt.xtitles.3.ab.1 Index: mutt-1.5.21/init.h diff --git a/mutt-1.5.21.sidebar.20090619.patch b/mutt-1.5.21.sidebar.20090619.patch deleted file mode 100644 index fb62254..0000000 --- a/mutt-1.5.21.sidebar.20090619.patch +++ /dev/null @@ -1,1513 +0,0 @@ -Index: mutt-1.5.21/buffy.c -=================================================================== ---- mutt-1.5.21.orig/buffy.c 2010-09-13 19:19:55.000000000 +0200 -+++ mutt-1.5.21/buffy.c 2012-06-21 11:48:06.752181922 +0200 -@@ -161,6 +161,49 @@ void mutt_buffy_cleanup (const char *buf - } - } - -+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, - else - (*tmp)->size = 0; - } -+ Incoming = buffy_sort(Incoming); - return 0; - } - -@@ -340,6 +384,68 @@ static int buffy_maildir_hasnew (BUFFY* - 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,12 +477,27 @@ static int buffy_mbox_hasnew (BUFFY* mai - 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; - struct stat sb; - struct stat contex_sb; - time_t t; -+ CONTEXT *ctx; - - sb.st_size=0; - contex_sb.st_dev=0; -@@ -413,6 +534,9 @@ int mutt_buffy_check (int force) - - for (tmp = Incoming; tmp; tmp = tmp->next) - { -+ if (tmp->new == 1) -+ tmp->has_new = 1; -+ - if (tmp->magic != M_IMAP) - { - tmp->new = 0; -@@ -444,16 +568,24 @@ int mutt_buffy_check (int force) - { - case M_MBOX: - case M_MMDF: -- if (buffy_mbox_hasnew (tmp, &sb) > 0) -+ if (option(OPTSIDEBAR)) -+ buffy_mbox_update(tmp); -+ if (buffy_mbox_hasnew (tmp, &sb) > 0) { - BuffyCount++; -+ } - break; - - case M_MAILDIR: -+ if (option(OPTSIDEBAR)) -+ buffy_maildir_update(tmp); - if (buffy_maildir_hasnew (tmp) > 0) - BuffyCount++; - break; - - case M_MH: -+ if (option(OPTSIDEBAR)) -+ mh_buffy_update (tmp->path, &tmp->msgcount, -+ &tmp->msg_unread, &tmp->msg_flagged); - if ((tmp->new = mh_buffy (tmp->path)) > 0) - BuffyCount++; - break; -Index: mutt-1.5.21/buffy.h -=================================================================== ---- mutt-1.5.21.orig/buffy.h 2010-09-13 19:19:55.000000000 +0200 -+++ mutt-1.5.21/buffy.h 2012-06-21 11:48:06.752181922 +0200 -@@ -25,7 +25,12 @@ 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 */ -+ short has_new; /* set it new if new and not read */ -+ 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 */ -Index: mutt-1.5.21/color.c -=================================================================== ---- mutt-1.5.21.orig/color.c 2009-05-15 19:18:23.000000000 +0200 -+++ mutt-1.5.21/color.c 2012-06-21 11:48:06.752181922 +0200 -@@ -93,6 +93,8 @@ static 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 } - }; - -Index: mutt-1.5.21/compose.c -=================================================================== ---- mutt-1.5.21.orig/compose.c 2010-04-14 20:50:19.000000000 +0200 -+++ mutt-1.5.21/compose.c 2012-06-21 11:48:06.753181937 +0200 -@@ -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 char *Prompts[] = - { -@@ -112,7 +112,7 @@ static void redraw_crypt_lines (HEADER * - { - int off = 0; - -- mvaddstr (HDR_CRYPT, 0, "Security: "); -+ mvaddstr (HDR_CRYPT, SidebarWidth, "Security: "); - - if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) - { -@@ -144,7 +144,7 @@ static void redraw_crypt_lines (HEADER * - } - - clrtoeol (); -- move (HDR_CRYPTINFO, 0); -+ move (HDR_CRYPTINFO, SidebarWidth); - clrtoeol (); - - if ((WithCrypto & APPLICATION_PGP) -@@ -161,7 +161,7 @@ static void redraw_crypt_lines (HEADER * - && (msg->security & ENCRYPT) - && SmimeCryptAlg - && *SmimeCryptAlg) { -- mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "), -+ mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "), - NONULL(SmimeCryptAlg)); - off = 20; - } -@@ -175,7 +175,7 @@ static void redraw_mix_line (LIST *chain - int c; - char *t; - -- mvaddstr (HDR_MIX, 0, " Mix: "); -+ mvaddstr (HDR_MIX, SidebarWidth, " Mix: "); - - if (!chain) - { -@@ -190,7 +190,7 @@ static void redraw_mix_line (LIST *chain - if (t && t[0] == '0' && t[1] == '\0') - t = ""; - -- if (c + mutt_strlen (t) + 2 >= COLS) -+ if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth) - break; - - addstr (NONULL(t)); -@@ -242,7 +242,7 @@ static void draw_envelope_addr (int line - - 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); - } - -@@ -252,10 +252,10 @@ static void draw_envelope (HEADER *msg, - 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) -@@ -266,7 +266,7 @@ static void draw_envelope (HEADER *msg, - #endif - - SETCOLOR (MT_COLOR_STATUS); -- mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); -+ mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments")); - BKGDSET (MT_COLOR_STATUS); - clrtoeol (); - -@@ -304,7 +304,7 @@ static int edit_address_list (int line, - /* 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; -@@ -549,7 +549,7 @@ int mutt_compose_menu (HEADER *msg, /* - 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); - clrtoeol (); - if (msg->env->subject) - mutt_paddstr (W, msg->env->subject); -@@ -566,7 +566,7 @@ int mutt_compose_menu (HEADER *msg, /* - { - 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; - } -Index: mutt-1.5.21/curs_main.c -=================================================================== ---- mutt-1.5.21.orig/curs_main.c 2012-06-21 11:48:06.742181772 +0200 -+++ mutt-1.5.21/curs_main.c 2012-06-21 11:48:06.753181937 +0200 -@@ -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" -@@ -532,8 +534,12 @@ int mutt_index_menu (void) - menu->redraw |= REDRAW_STATUS; - if (do_buffy_notify) - { -- if (mutt_buffy_notify () && option (OPTBEEPNEW)) -- beep (); -+ if (mutt_buffy_notify ()) -+ { -+ menu->redraw |= REDRAW_FULL; -+ if (option (OPTBEEPNEW)) -+ beep (); -+ } - } - else - do_buffy_notify = 1; -@@ -545,6 +551,7 @@ int mutt_index_menu (void) - if (menu->redraw & REDRAW_FULL) - { - menu_redraw_full (menu); -+ draw_sidebar(menu->menu); - mutt_show_error (); - } - -@@ -567,10 +574,13 @@ int mutt_index_menu (void) - - if (menu->redraw & REDRAW_STATUS) - { -+ DrawFullLine = 1; - menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); -+ DrawFullLine = 0; - CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2); - SETCOLOR (MT_COLOR_STATUS); - BKGDSET (MT_COLOR_STATUS); -+ set_buffystats(Context); - mutt_paddstr (COLS, buf); - SETCOLOR (MT_COLOR_NORMAL); - BKGDSET (MT_COLOR_NORMAL); -@@ -591,7 +601,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); - else -@@ -1089,6 +1099,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: - -@@ -1120,7 +1131,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) - { -@@ -1138,6 +1153,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); -@@ -2233,6 +2249,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); -Index: mutt-1.5.21/flags.c -=================================================================== ---- mutt-1.5.21.orig/flags.c 2012-06-21 11:48:06.587179442 +0200 -+++ mutt-1.5.21/flags.c 2012-06-21 11:48:06.753181937 +0200 -@@ -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, HEADE - */ - 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) -Index: mutt-1.5.21/functions.h -=================================================================== ---- mutt-1.5.21.orig/functions.h 2010-08-24 18:34:21.000000000 +0200 -+++ mutt-1.5.21/functions.h 2012-06-21 11:48:06.753181937 +0200 -@@ -169,6 +169,11 @@ struct binding_t OpMain[] = { /* map: in - { "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 @@ struct binding_t OpPager[] = { /* map: p - - { "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 } - }; - -Index: mutt-1.5.21/globals.h -=================================================================== ---- mutt-1.5.21.orig/globals.h 2012-06-21 11:48:06.742181772 +0200 -+++ mutt-1.5.21/globals.h 2012-06-21 11:48:06.754181952 +0200 -@@ -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 -@@ -209,6 +210,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; -Index: mutt-1.5.21/init.h -=================================================================== ---- mutt-1.5.21.orig/init.h 2012-06-21 11:48:06.743181787 +0200 -+++ mutt-1.5.21/init.h 2012-06-21 11:50:43.372537019 +0200 -@@ -1955,6 +1955,27 @@ struct option_t MuttVars[] = { - ** not used. - ** (PGP only) - */ -+ {"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 -Index: mutt-1.5.21/mailbox.h -=================================================================== ---- mutt-1.5.21.orig/mailbox.h 2009-04-30 19:33:48.000000000 +0200 -+++ mutt-1.5.21/mailbox.h 2012-06-21 11:48:06.754181952 +0200 -@@ -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 */ -Index: mutt-1.5.21/Makefile.am -=================================================================== ---- mutt-1.5.21.orig/Makefile.am 2012-06-21 11:48:06.694181050 +0200 -+++ mutt-1.5.21/Makefile.am 2012-06-21 11:50:50.018636976 +0200 -@@ -33,7 +33,8 @@ mutt_SOURCES = \ - 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) - -Index: mutt-1.5.21/Makefile.in -=================================================================== ---- mutt-1.5.21.orig/Makefile.in 2012-06-21 11:48:06.695181065 +0200 -+++ mutt-1.5.21/Makefile.in 2012-06-21 11:50:50.018636976 +0200 -@@ -86,7 +86,8 @@ am_mutt_OBJECTS = addrbook.$(OBJEXT) ali - 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) $(am__objects_1) - nodist_mutt_OBJECTS = $(am__objects_2) -@@ -360,7 +361,8 @@ mutt_SOURCES = \ - 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) \ -@@ -392,7 +394,7 @@ EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP O - 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 - - EXTRA_SCRIPTS = smime_keys - mutt_dotlock_SOURCES = mutt_dotlock.c -Index: mutt-1.5.21/mbox.c -=================================================================== ---- mutt-1.5.21.orig/mbox.c 2012-06-21 11:48:06.703181186 +0200 -+++ mutt-1.5.21/mbox.c 2012-06-21 11:50:50.018636976 +0200 -@@ -104,6 +104,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; - -@@ -255,6 +256,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) -Index: mutt-1.5.21/menu.c -=================================================================== ---- mutt-1.5.21.orig/menu.c 2010-08-25 18:31:40.000000000 +0200 -+++ mutt-1.5.21/menu.c 2012-06-21 11:48:06.755181967 +0200 -@@ -24,6 +24,7 @@ - #include "mutt_curses.h" - #include "mutt_menu.h" - #include "mbyte.h" -+#include "sidebar.h" - - #include - #include -@@ -156,7 +157,7 @@ static void menu_pad_string (char *s, si - { - 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; -@@ -207,6 +208,7 @@ void menu_redraw_index (MUTTMENU *menu) - char buf[LONG_STRING]; - int i; - -+ draw_sidebar(1); - for (i = menu->top; i < menu->top + menu->pagelen; i++) - { - if (i < menu->max) -@@ -217,7 +219,7 @@ void menu_redraw_index (MUTTMENU *menu) - if (option (OPTARROWCURSOR)) - { - attrset (menu->color (i)); -- CLEARLINE (i - menu->top + menu->offset); -+ CLEARLINE_WIN (i - menu->top + menu->offset); - - if (i == menu->current) - { -@@ -246,14 +248,14 @@ void menu_redraw_index (MUTTMENU *menu) - BKGDSET (MT_COLOR_INDICATOR); - } - -- CLEARLINE (i - menu->top + menu->offset); -+ CLEARLINE_WIN (i - menu->top + menu->offset); - print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current); - SETCOLOR (MT_COLOR_NORMAL); - BKGDSET (MT_COLOR_NORMAL); - } - } - else -- CLEARLINE (i - menu->top + menu->offset); -+ CLEARLINE_WIN (i - menu->top + menu->offset); - } - menu->redraw = 0; - } -@@ -268,7 +270,7 @@ void menu_redraw_motion (MUTTMENU *menu) - return; - } - -- move (menu->oldcurrent + menu->offset - menu->top, 0); -+ move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); - SETCOLOR (MT_COLOR_NORMAL); - BKGDSET (MT_COLOR_NORMAL); - -@@ -283,13 +285,13 @@ void menu_redraw_motion (MUTTMENU *menu) - clrtoeol (); - 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); - SETCOLOR (MT_COLOR_NORMAL); - } - - /* now draw it in the new location */ -- move (menu->current + menu->offset - menu->top, 0); -+ move (menu->current + menu->offset - menu->top, SidebarWidth); - attrset (menu->color (menu->current)); - ADDCOLOR (MT_COLOR_INDICATOR); - addstr ("->"); -@@ -310,7 +312,7 @@ void menu_redraw_motion (MUTTMENU *menu) - attrset (menu->color (menu->current)); - ADDCOLOR (MT_COLOR_INDICATOR); - BKGDSET (MT_COLOR_INDICATOR); -- CLEARLINE (menu->current - menu->top + menu->offset); -+ CLEARLINE_WIN (menu->current - menu->top + menu->offset); - print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); - SETCOLOR (MT_COLOR_NORMAL); - BKGDSET (MT_COLOR_NORMAL); -@@ -322,7 +324,7 @@ void menu_redraw_current (MUTTMENU *menu - { - char buf[LONG_STRING]; - -- 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)); - -@@ -875,7 +877,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 -Index: mutt-1.5.21/mutt_curses.h -=================================================================== ---- mutt-1.5.21.orig/mutt_curses.h 2008-03-19 21:07:57.000000000 +0100 -+++ mutt-1.5.21/mutt_curses.h 2012-06-21 11:48:06.755181967 +0200 -@@ -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) -@@ -126,6 +127,8 @@ enum - MT_COLOR_BOLD, - MT_COLOR_UNDERLINE, - MT_COLOR_INDEX, -+ MT_COLOR_NEW, -+ MT_COLOR_FLAGGED, - MT_COLOR_MAX - }; - -Index: mutt-1.5.21/mutt.h -=================================================================== ---- mutt-1.5.21.orig/mutt.h 2012-06-21 11:48:06.743181787 +0200 -+++ mutt-1.5.21/mutt.h 2012-06-21 11:50:50.018636976 +0200 -@@ -425,6 +425,8 @@ enum - OPTSAVENAME, - OPTSENDGROUPREPLYTO, - OPTSCORE, -+ OPTSIDEBAR, -+ OPTSIDEBARSORT, - OPTSIGDASHES, - OPTSIGONTOP, - OPTSORTRE, -@@ -866,6 +868,7 @@ typedef struct _context - { - char *path; - FILE *fp; -+ time_t atime; - time_t mtime; - off_t size; - off_t vsize; -@@ -905,6 +908,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 */ -Index: mutt-1.5.21/muttlib.c -=================================================================== ---- mutt-1.5.21.orig/muttlib.c 2012-06-21 11:48:06.648180359 +0200 -+++ mutt-1.5.21/muttlib.c 2012-06-21 11:48:06.756181982 +0200 -@@ -1289,6 +1289,8 @@ void mutt_FormatString (char *dest, /* - pl = pw = 1; - - /* see if there's room to add content, else ignore */ -+ if ( DrawFullLine ) -+ { - if ((col < COLS && wlen < destlen) || soft) - { - int pad; -@@ -1332,6 +1334,52 @@ void mutt_FormatString (char *dest, /* - 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 == '|') -Index: mutt-1.5.21/mx.c -=================================================================== ---- mutt-1.5.21.orig/mx.c 2012-06-21 11:48:06.704181201 +0200 -+++ mutt-1.5.21/mx.c 2012-06-21 11:48:06.756181982 +0200 -@@ -595,6 +595,7 @@ static int mx_open_mailbox_append (CONTE - * 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) -@@ -617,6 +618,8 @@ CONTEXT *mx_open_mailbox (const char *pa - ctx->quiet = 1; - if (flags & M_READONLY) - ctx->readonly = 1; -+ if (flags & M_PEEK) -+ ctx->peekonly = 1; - - if (flags & (M_APPEND|M_NEWFOLDER)) - { -@@ -721,9 +724,21 @@ CONTEXT *mx_open_mailbox (const char *pa - 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 */ -Index: mutt-1.5.21/OPS -=================================================================== ---- mutt-1.5.21.orig/OPS 2010-03-01 18:56:19.000000000 +0100 -+++ mutt-1.5.21/OPS 2012-06-21 11:48:06.756181982 +0200 -@@ -179,3 +179,8 @@ OP_WHAT_KEY "display the keycode for a k - 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" -Index: mutt-1.5.21/pager.c -=================================================================== ---- mutt-1.5.21.orig/pager.c 2012-06-21 11:48:06.744181802 +0200 -+++ mutt-1.5.21/pager.c 2012-06-21 11:48:06.757181997 +0200 -@@ -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 ** - 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; -@@ -1745,7 +1747,7 @@ mutt_pager (const char *banner, const ch - if ((redraw & REDRAW_BODY) || topline != oldtopline) - { - do { -- move (bodyoffset, 0); -+ move (bodyoffset, SidebarWidth); - curline = oldtopline = topline; - lines = 0; - force_redraw = 0; -@@ -1758,6 +1760,7 @@ mutt_pager (const char *banner, const ch - &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 ch - addch ('~'); - addch ('\n'); - lines++; -+ move(lines + bodyoffset, SidebarWidth); - } - /* We are going to update the pager status bar, so it isn't - * necessary to reset to normal color now. */ -@@ -1794,21 +1798,21 @@ mutt_pager (const char *banner, const ch - /* print out the pager status bar */ - SETCOLOR (MT_COLOR_STATUS); - BKGDSET (MT_COLOR_STATUS); -- CLEARLINE (statusoffset); -+ CLEARLINE_WIN (statusoffset); - - 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); - } - BKGDSET (MT_COLOR_NORMAL); - SETCOLOR (MT_COLOR_NORMAL); -@@ -1826,18 +1830,23 @@ mutt_pager (const char *banner, const ch - /* 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); - BKGDSET (MT_COLOR_STATUS); -- mutt_paddstr (COLS, buffer); -+ mutt_paddstr (COLS-SidebarWidth, buffer); - SETCOLOR (MT_COLOR_NORMAL); - BKGDSET (MT_COLOR_NORMAL); - } - -+ /* if we're not using the index, update every time */ -+ if ( index == 0 ) -+ draw_sidebar(MENU_PAGER); -+ - redraw = 0; - - if (option(OPTBRAILLEFRIENDLY)) { -@@ -2763,6 +2772,13 @@ search_next: - 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; -Index: mutt-1.5.21/PATCHES -=================================================================== ---- mutt-1.5.21.orig/PATCHES 2012-06-21 11:48:06.741181757 +0200 -+++ mutt-1.5.21/PATCHES 2012-06-21 11:50:43.372537019 +0200 -@@ -1,2 +1,3 @@ -+patch-1.5.20.sidebar.20090619.txt - patch-1.5.19.rr.compressed.1 - patch-1.5.5.1.nt.xtitles.3.ab.1 -Index: mutt-1.5.21/sidebar.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ mutt-1.5.21/sidebar.c 2012-06-21 11:56:09.904450421 +0200 -@@ -0,0 +1,333 @@ -+/* -+ * Copyright (C) ????-2004 Justin Hibbits -+ * Copyright (C) 2004 Thomer M. Gil -+ * -+ * 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 -+#include "keymap.h" -+#include -+ -+/*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); -+ } else { -+ sprintf( -+ entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(new), -+ "% d(%d)", size, new); -+ } -+ } 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); -+ } -+ -+ -+ 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; -+ } -+ 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 ) { -+ short maildir_is_prefix = 0; -+ int sidebar_folder_depth = 0; -+ char *sidebar_folder_name; -+ -+ 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 */ -+ 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 */ -+ 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); -+} -+ -Index: mutt-1.5.21/sidebar.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ mutt-1.5.21/sidebar.h 2012-06-21 11:48:06.757181997 +0200 -@@ -0,0 +1,36 @@ -+/* -+ * Copyright (C) ????-2004 Justin Hibbits -+ * Copyright (C) 2004 Thomer M. Gil -+ * -+ * 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 */ -Index: mutt-1.5.21/doc/Muttrc -=================================================================== ---- mutt-1.5.21.orig/doc/Muttrc 2012-06-21 11:48:06.700181140 +0200 -+++ mutt-1.5.21/doc/Muttrc 2012-06-21 11:48:06.758182012 +0200 -@@ -662,6 +662,26 @@ set check_mbox_size=yes - # $crypt_autosign, $crypt_replysign and $smime_is_default. - # - # -+# set sidebar_visible=no -+# -+# Name: sidebar_visible -+# Type: boolean -+# Default: no -+# -+# -+# This specifies whether or not to show sidebar (left-side list of folders). -+# -+# -+# set sidebar_width=0 -+# -+# Name: sidebar_width -+# Type: number -+# Default: 0 -+# -+# -+# The width of the sidebar. -+# -+# - # set crypt_autosign=no - # - # Name: crypt_autosign -Index: mutt-1.5.21/imap/imap.c -=================================================================== ---- mutt-1.5.21.orig/imap/imap.c 2009-08-25 21:08:52.000000000 +0200 -+++ mutt-1.5.21/imap/imap.c 2012-06-21 11:48:06.758182012 +0200 -@@ -1521,7 +1521,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) - { -Index: mutt-1.5.21/imap/command.c -=================================================================== ---- mutt-1.5.21.orig/imap/command.c 2010-09-15 17:39:31.000000000 +0200 -+++ mutt-1.5.21/imap/command.c 2012-06-21 11:48:06.759182027 +0200 -@@ -1011,6 +1011,13 @@ static void cmd_parse_status (IMAP_DATA* - 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; - } -Index: mutt-1.5.21/mh.c -=================================================================== ---- mutt-1.5.21.orig/mh.c 2010-08-24 18:34:21.000000000 +0200 -+++ mutt-1.5.21/mh.c 2012-06-21 11:50:50.018636976 +0200 -@@ -242,6 +242,29 @@ int mh_buffy (const char *path) - return r; - } - -+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; -Index: mutt-1.5.21/mx.h -=================================================================== ---- mutt-1.5.21.orig/mx.h 2012-06-21 11:48:06.704181201 +0200 -+++ mutt-1.5.21/mx.h 2012-06-21 11:48:06.759182027 +0200 -@@ -61,6 +61,8 @@ int mh_read_dir (CONTEXT *, const char * - int mh_sync_mailbox (CONTEXT *, int *); - int mh_check_mailbox (CONTEXT *, int *); - int mh_buffy (const char *); -+void mh_buffy_update (const char *path, int *msgcount, -+ int *msg_unread, int *msg_flagged); - int mh_check_empty (const char *); - - int maildir_read_dir (CONTEXT *); diff --git a/mutt-1.5.21.sidebar.20120829.patch b/mutt-1.5.21.sidebar.20120829.patch new file mode 100644 index 0000000..22589ad --- /dev/null +++ b/mutt-1.5.21.sidebar.20120829.patch @@ -0,0 +1,2373 @@ +*** mutt-1.5.21-orig/buffy.c 2010-09-13 12:19:55.000000000 -0500 +--- mutt-1.5.21/buffy.c 2012-08-29 12:12:22.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,459 **** +--- 584,602 ---- + { + 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); + if ((tmp->new = mh_buffy (tmp->path)) > 0) + BuffyCount++; + break; +*** mutt-1.5.21-orig/buffy.h 2010-09-13 12:19:55.000000000 -0500 +--- mutt-1.5.21/buffy.h 2012-08-29 12:11:20.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.21-orig/color.c 2009-05-15 12:18:23.000000000 -0500 +--- mutt-1.5.21/color.c 2012-08-29 11:25:04.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.21-orig/compose.c 2010-04-14 13:50:19.000000000 -0500 +--- mutt-1.5.21/compose.c 2012-08-29 11:25:04.000000000 -0500 +*************** +*** 72,78 **** + + #define HDR_XOFFSET 10 + #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ +! #define W (COLS - HDR_XOFFSET) + + static char *Prompts[] = + { +--- 72,78 ---- + + #define HDR_XOFFSET 10 + #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ +! #define W (COLS - HDR_XOFFSET - SidebarWidth) + + static char *Prompts[] = + { +*************** +*** 112,118 **** + { + int off = 0; + +! mvaddstr (HDR_CRYPT, 0, "Security: "); + + if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) + { +--- 112,118 ---- + { + int off = 0; + +! mvaddstr (HDR_CRYPT, SidebarWidth, "Security: "); + + if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) + { +*************** +*** 144,150 **** + } + + clrtoeol (); +! move (HDR_CRYPTINFO, 0); + clrtoeol (); + + if ((WithCrypto & APPLICATION_PGP) +--- 144,150 ---- + } + + clrtoeol (); +! move (HDR_CRYPTINFO, SidebarWidth); + clrtoeol (); + + if ((WithCrypto & APPLICATION_PGP) +*************** +*** 161,167 **** + && (msg->security & ENCRYPT) + && SmimeCryptAlg + && *SmimeCryptAlg) { +! mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "), + NONULL(SmimeCryptAlg)); + off = 20; + } +--- 161,167 ---- + && (msg->security & ENCRYPT) + && SmimeCryptAlg + && *SmimeCryptAlg) { +! mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "), + NONULL(SmimeCryptAlg)); + off = 20; + } +*************** +*** 175,181 **** + int c; + char *t; + +! mvaddstr (HDR_MIX, 0, " Mix: "); + + if (!chain) + { +--- 175,181 ---- + int c; + char *t; + +! mvaddstr (HDR_MIX, SidebarWidth, " Mix: "); + + if (!chain) + { +*************** +*** 190,196 **** + if (t && t[0] == '0' && t[1] == '\0') + t = ""; + +! if (c + mutt_strlen (t) + 2 >= COLS) + break; + + addstr (NONULL(t)); +--- 190,196 ---- + if (t && t[0] == '0' && t[1] == '\0') + t = ""; + +! if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth) + break; + + addstr (NONULL(t)); +*************** +*** 242,248 **** + + buf[0] = 0; + rfc822_write_address (buf, sizeof (buf), addr, 1); +! mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]); + mutt_paddstr (W, buf); + } + +--- 242,248 ---- + + buf[0] = 0; + rfc822_write_address (buf, sizeof (buf), addr, 1); +! mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]); + mutt_paddstr (W, buf); + } + +*************** +*** 252,261 **** + 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) +--- 252,261 ---- + 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) +*************** +*** 266,272 **** + #endif + + SETCOLOR (MT_COLOR_STATUS); +! mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); + BKGDSET (MT_COLOR_STATUS); + clrtoeol (); + +--- 266,272 ---- + #endif + + SETCOLOR (MT_COLOR_STATUS); +! mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments")); + BKGDSET (MT_COLOR_STATUS); + clrtoeol (); + +*************** +*** 304,310 **** + /* 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; +--- 304,310 ---- + /* 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; +*************** +*** 549,555 **** + if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) + { + mutt_str_replace (&msg->env->subject, buf); +! move (HDR_SUBJECT, HDR_XOFFSET); + clrtoeol (); + if (msg->env->subject) + mutt_paddstr (W, msg->env->subject); +--- 549,555 ---- + if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) + { + mutt_str_replace (&msg->env->subject, buf); +! move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth); + clrtoeol (); + if (msg->env->subject) + mutt_paddstr (W, msg->env->subject); +*************** +*** 566,572 **** + { + strfcpy (fcc, buf, fcclen); + mutt_pretty_mailbox (fcc, fcclen); +! move (HDR_FCC, HDR_XOFFSET); + mutt_paddstr (W, fcc); + fccSet = 1; + } +--- 566,572 ---- + { + strfcpy (fcc, buf, fcclen); + mutt_pretty_mailbox (fcc, fcclen); +! move (HDR_FCC, HDR_XOFFSET + SidebarWidth); + mutt_paddstr (W, fcc); + fccSet = 1; + } +*** mutt-1.5.21-orig/configure.ac 2010-08-24 11:34:21.000000000 -0500 +--- mutt-1.5.21/configure.ac 2012-08-29 12:10:31.000000000 -0500 +*************** +*** 1289,1294 **** +--- 1289,1296 ---- + AC_DEFINE(HAVE_LANGINFO_YESEXPR,1,[ Define if you have 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.21-orig/curs_main.c 2010-09-13 12:19:55.000000000 -0500 +--- mutt-1.5.21/curs_main.c 2012-08-29 12:08:10.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) + { + menu_redraw_full (menu); + mutt_show_error (); + } + + if (menu->menu == MENU_MAIN) +--- 521,551 ---- + menu->redraw |= REDRAW_STATUS; + if (do_buffy_notify) + { +! if (mutt_buffy_notify ()) +! { +! menu->redraw |= REDRAW_STATUS; +! if (option (OPTBEEPNEW)) +! beep (); +! } + } + else + 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,563 **** +--- 567,579 ---- + + if (menu->redraw & REDRAW_STATUS) + { ++ DrawFullLine = 1; + menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); ++ DrawFullLine = 0; + CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2); + SETCOLOR (MT_COLOR_STATUS); + BKGDSET (MT_COLOR_STATUS); ++ set_buffystats(Context); + mutt_paddstr (COLS, buf); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); +*************** +*** 571,577 **** + 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 +--- 587,593 ---- + 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 +*************** +*** 1069,1074 **** +--- 1085,1091 ---- + menu->redraw = REDRAW_FULL; + break; + ++ case OP_SIDEBAR_OPEN: + case OP_MAIN_CHANGE_FOLDER: + case OP_MAIN_NEXT_UNREAD_MAILBOX: + +*************** +*** 1100,1106 **** + { + mutt_buffy (buf, sizeof (buf)); + +! if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) + { + if (menu->menu == MENU_PAGER) + { +--- 1117,1127 ---- + { + 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) + { +*************** +*** 1118,1123 **** +--- 1139,1145 ---- + } + + mutt_expand_path (buf, sizeof (buf)); ++ set_curbuffy(buf); + if (mx_get_magic (buf) <= 0) + { + mutt_error (_("%s is not a mailbox."), buf); +*************** +*** 2208,2213 **** +--- 2230,2241 ---- + 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.21-orig/flags.c 2009-01-03 17:27:10.000000000 -0600 +--- mutt-1.5.21/flags.c 2012-08-29 11:25:04.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.21-orig/functions.h 2010-08-24 11:34:21.000000000 -0500 +--- mutt-1.5.21/functions.h 2012-08-29 11:25:04.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 } + }; + +*************** +*** 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.21-orig/globals.h 2009-08-25 14:08:52.000000000 -0500 +--- mutt-1.5.21/globals.h 2012-08-29 12:09:02.000000000 -0500 +*************** +*** 117,122 **** +--- 117,124 ---- + WHERE char *SendCharset; + WHERE char *Sendmail; + WHERE char *Shell; ++ WHERE char *SidebarDelim; ++ WHERE char *SidebarFormat; + WHERE char *Signature; + WHERE char *SimpleSearch; + #if USE_SMTP +*************** +*** 207,212 **** +--- 209,217 ---- + 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.21-orig/handler.c 2009-08-25 14:08:52.000000000 -0500 +--- mutt-1.5.21/handler.c 2012-08-29 12:10:31.000000000 -0500 +*************** +*** 1525,1530 **** +--- 1525,1535 ---- + char type[STRING]; + 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 */ +*************** +*** 1644,1649 **** +--- 1649,1662 ---- + { + /* 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) + { +*************** +*** 1651,1656 **** +--- 1664,1670 ---- + 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 + */ +*************** +*** 1679,1686 **** +--- 1693,1711 ---- + /* 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; +*************** +*** 1706,1711 **** +--- 1731,1740 ---- + + /* restore the original source stream */ + safe_fclose (&s->fpin); ++ #ifdef HAVE_FMEMOPEN ++ if(tempsize) ++ FREE(&temp); ++ #endif + s->fpin = fp; + } + } +*** mutt-1.5.21-orig/init.h 2010-09-15 10:39:31.000000000 -0500 +--- mutt-1.5.21/init.h 2012-08-29 12:09:48.000000000 -0500 +*************** +*** 1953,1958 **** +--- 1953,2000 ---- + ** 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_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, 0 }, ++ /* ++ ** .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.21-orig/mailbox.h 2009-04-30 12:33:48.000000000 -0500 +--- mutt-1.5.21/mailbox.h 2012-08-29 11:25:04.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.21-orig/main.c 2010-09-13 12:19:55.000000000 -0500 +--- mutt-1.5.21/main.c 2012-08-29 12:13:28.000000000 -0500 +*************** +*** 50,55 **** +--- 50,56 ---- + #include + #include + #include ++ #include + #include + + #ifdef HAVE_GETOPT_H +*************** +*** 525,531 **** + + int main (int argc, char **argv) + { +! char folder[_POSIX_PATH_MAX] = ""; + char *subject = NULL; + char *includeFile = NULL; + char *draftFile = NULL; +--- 526,532 ---- + + int main (int argc, char **argv) + { +! char folder[PATH_MAX] = ""; + char *subject = NULL; + char *includeFile = NULL; + char *draftFile = NULL; +*************** +*** 995,1000 **** +--- 996,1008 ---- + 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); + +*************** +*** 1017,1022 **** +--- 1025,1031 ---- + 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.21-orig/Makefile.am 2010-08-24 11:34:21.000000000 -0500 +--- mutt-1.5.21/Makefile.am 2012-08-29 11:25:04.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.21-orig/Makefile.in 2010-08-25 11:31:48.000000000 -0500 +--- mutt-1.5.21/Makefile.in 2012-08-29 11:25:04.000000000 -0500 +*************** +*** 85,91 **** + 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) $(am__objects_1) + nodist_mutt_OBJECTS = $(am__objects_2) +--- 85,92 ---- + 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) $(am__objects_1) + nodist_mutt_OBJECTS = $(am__objects_2) +*************** +*** 359,365 **** + 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) \ +--- 360,367 ---- + 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) \ +*************** +*** 391,397 **** + 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 + + EXTRA_SCRIPTS = smime_keys + mutt_dotlock_SOURCES = mutt_dotlock.c +--- 393,399 ---- + 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 + + EXTRA_SCRIPTS = smime_keys + mutt_dotlock_SOURCES = mutt_dotlock.c +*** mutt-1.5.21-orig/mbox.c 2010-09-13 12:19:55.000000000 -0500 +--- mutt-1.5.21/mbox.c 2012-08-29 11:25:04.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.21-orig/menu.c 2010-08-25 11:31:40.000000000 -0500 +--- mutt-1.5.21/menu.c 2012-08-29 11:25:04.000000000 -0500 +*************** +*** 24,29 **** +--- 24,30 ---- + #include "mutt_curses.h" + #include "mutt_menu.h" + #include "mbyte.h" ++ #include "sidebar.h" + + #include + #include +*************** +*** 156,162 **** + { + 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; +--- 157,163 ---- + { + 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; +*************** +*** 207,212 **** +--- 208,214 ---- + char buf[LONG_STRING]; + int i; + ++ draw_sidebar(1); + for (i = menu->top; i < menu->top + menu->pagelen; i++) + { + if (i < menu->max) +*************** +*** 217,223 **** + if (option (OPTARROWCURSOR)) + { + attrset (menu->color (i)); +! CLEARLINE (i - menu->top + menu->offset); + + if (i == menu->current) + { +--- 219,225 ---- + if (option (OPTARROWCURSOR)) + { + attrset (menu->color (i)); +! CLEARLINE_WIN (i - menu->top + menu->offset); + + if (i == menu->current) + { +*************** +*** 246,259 **** + BKGDSET (MT_COLOR_INDICATOR); + } + +! CLEARLINE (i - menu->top + menu->offset); + print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); + } + } + else +! CLEARLINE (i - menu->top + menu->offset); + } + menu->redraw = 0; + } +--- 248,261 ---- + BKGDSET (MT_COLOR_INDICATOR); + } + +! CLEARLINE_WIN (i - menu->top + menu->offset); + print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); + } + } + else +! CLEARLINE_WIN (i - menu->top + menu->offset); + } + menu->redraw = 0; + } +*************** +*** 268,274 **** + return; + } + +! move (menu->oldcurrent + menu->offset - menu->top, 0); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); + +--- 270,276 ---- + return; + } + +! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); + +*************** +*** 283,295 **** + clrtoeol (); + 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); + SETCOLOR (MT_COLOR_NORMAL); + } + + /* now draw it in the new location */ +! move (menu->current + menu->offset - menu->top, 0); + attrset (menu->color (menu->current)); + ADDCOLOR (MT_COLOR_INDICATOR); + addstr ("->"); +--- 285,297 ---- + clrtoeol (); + 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); + SETCOLOR (MT_COLOR_NORMAL); + } + + /* now draw it in the new location */ +! move (menu->current + menu->offset - menu->top, SidebarWidth); + attrset (menu->color (menu->current)); + ADDCOLOR (MT_COLOR_INDICATOR); + addstr ("->"); +*************** +*** 310,316 **** + attrset (menu->color (menu->current)); + ADDCOLOR (MT_COLOR_INDICATOR); + BKGDSET (MT_COLOR_INDICATOR); +! CLEARLINE (menu->current - menu->top + menu->offset); + print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); +--- 312,318 ---- + attrset (menu->color (menu->current)); + ADDCOLOR (MT_COLOR_INDICATOR); + BKGDSET (MT_COLOR_INDICATOR); +! CLEARLINE_WIN (menu->current - menu->top + menu->offset); + print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); +*************** +*** 322,328 **** + { + char buf[LONG_STRING]; + +! move (menu->current + menu->offset - menu->top, 0); + menu_make_entry (buf, sizeof (buf), menu, menu->current); + menu_pad_string (buf, sizeof (buf)); + +--- 324,330 ---- + { + char buf[LONG_STRING]; + +! move (menu->current + menu->offset - menu->top, SidebarWidth); + menu_make_entry (buf, sizeof (buf), menu, menu->current); + menu_pad_string (buf, sizeof (buf)); + +*************** +*** 875,881 **** + + + if (option (OPTARROWCURSOR)) +! move (menu->current - menu->top + menu->offset, 2); + else if (option (OPTBRAILLEFRIENDLY)) + move (menu->current - menu->top + menu->offset, 0); + else +--- 877,883 ---- + + + 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.21-orig/mh.c 2010-08-24 11:34:21.000000000 -0500 +--- mutt-1.5.21/mh.c 2012-08-29 12:07:18.000000000 -0500 +*************** +*** 235,247 **** + + if (mh_read_sequences (&mhs, path) < 0) + return 0; + for (i = 0; !r && i <= mhs.max; i++) +! if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) + r = 1; + mhs_free_sequences (&mhs); + return r; + } + + static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) + { + int fd; +--- 235,275 ---- + + if (mh_read_sequences (&mhs, path) < 0) + return 0; ++ + for (i = 0; !r && i <= mhs.max; i++) +! if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) { + r = 1; ++ } + mhs_free_sequences (&mhs); + return r; + } + ++ 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.21-orig/mutt_curses.h 2008-03-19 15:07:57.000000000 -0500 +--- mutt-1.5.21/mutt_curses.h 2012-08-29 11:25:04.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) +*************** +*** 126,131 **** +--- 127,134 ---- + MT_COLOR_BOLD, + MT_COLOR_UNDERLINE, + MT_COLOR_INDEX, ++ MT_COLOR_NEW, ++ MT_COLOR_FLAGGED, + MT_COLOR_MAX + }; + +*** mutt-1.5.21-orig/mutt_menu.h 2008-12-12 14:33:17.000000000 -0600 +--- mutt-1.5.21/mutt_menu.h 2012-08-29 12:08:10.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.21-orig/mutt.h 2012-12-18 16:48:18.248240958 +0100 +--- mutt-1.5.21-orig/mutt.h 2012-12-18 16:49:58.028242779 +0100 +*************** +*** 426,431 **** +--- 426,435 ---- + OPTSAVENAME, + OPTSENDGROUPREPLYTO, + OPTSCORE, ++ OPTSIDEBAR, ++ OPTSIDEBARSHORTPATH, ++ OPTSIDEBARSORT, ++ OPTSIDEBARFOLDERINDENT, + OPTSIGDASHES, + OPTSIGONTOP, + OPTSORTRE, +*************** +*** 867,872 **** +--- 871,877 ---- + { + char *path; + FILE *fp; ++ time_t atime; + time_t mtime; + off_t size; + off_t vsize; +*************** +*** 906,911 **** +--- 911,917 ---- + 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.21-orig/muttlib.c 2010-08-25 11:31:40.000000000 -0500 +--- mutt-1.5.21/muttlib.c 2012-08-29 11:25:04.000000000 -0500 +*************** +*** 1286,1291 **** +--- 1286,1293 ---- + pl = pw = 1; + + /* see if there's room to add content, else ignore */ ++ if ( DrawFullLine ) ++ { + if ((col < COLS && wlen < destlen) || soft) + { + int pad; +*************** +*** 1329,1334 **** +--- 1331,1382 ---- + 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.21-orig/mx.c 2010-09-13 12:19:55.000000000 -0500 +--- mutt-1.5.21/mx.c 2012-08-29 12:12:49.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 + */ + 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); + +@@ -755,6 +755,8 @@ + 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); + #ifdef USE_COMPRESSED +*************** +*** 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.21-orig/mx.h 2009-08-25 14:08:52.000000000 -0500 +--- mutt-1.5.21/mx.h 2012-08-29 12:06:47.000000000 -0500 +*************** +*** 58,63 **** +--- 58,64 ---- + int mh_sync_mailbox (CONTEXT *, int *); + int mh_check_mailbox (CONTEXT *, int *); + int mh_buffy (const char *); ++ 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.21-orig/OPS 2010-03-01 11:56:19.000000000 -0600 +--- mutt-1.5.21/OPS 2012-08-29 11:25:04.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.21-orig/pager.c 2010-08-25 11:31:40.000000000 -0500 +--- mutt-1.5.21/pager.c 2012-08-29 11:36:24.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; +*************** +*** 1571,1576 **** +--- 1573,1579 ---- + + 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 */ + +*************** +*** 1745,1751 **** + if ((redraw & REDRAW_BODY) || topline != oldtopline) + { + do { +! move (bodyoffset, 0); + curline = oldtopline = topline; + lines = 0; + force_redraw = 0; +--- 1748,1754 ---- + if ((redraw & REDRAW_BODY) || topline != oldtopline) + { + do { +! move (bodyoffset, SidebarWidth); + curline = oldtopline = topline; + lines = 0; + force_redraw = 0; +*************** +*** 1758,1763 **** +--- 1761,1767 ---- + &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); + } + /* We are going to update the pager status bar, so it isn't + * necessary to reset to normal color now. */ +*************** +*** 1786,1791 **** +--- 1791,1798 ---- + 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 +*************** +*** 1801,1822 **** + /* print out the pager status bar */ + SETCOLOR (MT_COLOR_STATUS); + BKGDSET (MT_COLOR_STATUS); +! CLEARLINE (statusoffset); + + 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); + } + BKGDSET (MT_COLOR_NORMAL); + SETCOLOR (MT_COLOR_NORMAL); + if (option(OPTXTERMSETTITLES)) +--- 1801,1829 ---- + /* print out the pager status bar */ + SETCOLOR (MT_COLOR_STATUS); + BKGDSET (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 */ + BKGDSET (MT_COLOR_NORMAL); + SETCOLOR (MT_COLOR_NORMAL); + if (option(OPTXTERMSETTITLES)) +*************** +*** 1819,1836 **** + /* 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 (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); + SETCOLOR (MT_COLOR_STATUS); + BKGDSET (MT_COLOR_STATUS); +! mutt_paddstr (COLS, buffer); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); + } + + redraw = 0; + + if (option(OPTBRAILLEFRIENDLY)) { +--- 1833,1856 ---- + /* 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); + BKGDSET (MT_COLOR_STATUS); +! mutt_paddstr (COLS - (option(OPTSTATUSONTOP) ? 0 : SidebarWidth), buffer); + SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); + } + ++ /* if we're not using the index, update every time */ ++ if ( index == 0 ) ++ draw_sidebar(MENU_PAGER); ++ + redraw = 0; + + if (option(OPTBRAILLEFRIENDLY)) { +*************** +*** 2756,2761 **** +--- 2776,2788 ---- + 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.21-orig/pattern.c 2010-08-24 11:34:21.000000000 -0500 +--- mutt-1.5.21/pattern.c 2012-08-29 12:10:31.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.21-orig/PATCHES 2008-03-19 15:07:06.000000000 -0500 +--- mutt-1.5.21/PATCHES 2012-08-29 13:22:48.000000000 -0500 +*************** +*** 0 **** +--- 1 ---- ++ patch-1.5.21.sidebar.20120829.txt +*** mutt-1.5.21-orig/protos.h 2010-08-24 11:34:21.000000000 -0500 +--- mutt-1.5.21/protos.h 2012-08-29 12:09:02.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.21-orig/sidebar.c 1969-12-31 18:00:00.000000000 -0600 +--- mutt-1.5.21/sidebar.c 2012-08-29 12:16:48.000000000 -0500 +*************** +*** 0 **** +--- 1,405 ---- ++ /* ++ * Copyright (C) ????-2004 Justin Hibbits ++ * Copyright (C) 2004 Thomer M. Gil ++ * ++ * 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 ++ #include "keymap.h" ++ #include ++ ++ /*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 { ++ 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; ++ } ++ 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 = mutt_basename(tmp->path); ++ if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) { ++ 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] == '/' || 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 = tmp->path; ++ else ++ tmp_folder_name++; ++ } ++ else ++ tmp_folder_name = tmp->path; ++ sidebar_folder_name = malloc(strlen(basename(tmp_folder_name)) + 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, mutt_basename(tmp_folder_name), strlen(mutt_basename(tmp_folder_name)) + 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 < 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.21-orig/sidebar.h 1969-12-31 18:00:00.000000000 -0600 +--- mutt-1.5.21/sidebar.h 2012-08-29 11:25:04.000000000 -0500 +*************** +*** 0 **** +--- 1,36 ---- ++ /* ++ * Copyright (C) ????-2004 Justin Hibbits ++ * Copyright (C) 2004 Thomer M. Gil ++ * ++ * 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.21-orig/doc/Muttrc 2010-09-15 12:07:19.000000000 -0500 +--- mutt-1.5.21/doc/Muttrc 2012-08-29 11:25:04.000000000 -0500 +*************** +*** 657,662 **** +--- 657,682 ---- + # $crypt_autosign, $crypt_replysign and $smime_is_default. + # + # ++ # set sidebar_visible=no ++ # ++ # Name: sidebar_visible ++ # Type: boolean ++ # Default: no ++ # ++ # ++ # This specifies whether or not to show sidebar (left-side list of folders). ++ # ++ # ++ # set sidebar_width=0 ++ # ++ # Name: sidebar_width ++ # Type: number ++ # Default: 0 ++ # ++ # ++ # The width of the sidebar. ++ # ++ # + # set crypt_autosign=no + # + # Name: crypt_autosign +*** mutt-1.5.21-orig/imap/imap.c 2009-08-25 14:08:52.000000000 -0500 +--- mutt-1.5.21/imap/imap.c 2012-08-29 11:25:04.000000000 -0500 +*************** +*** 1521,1527 **** + + 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) + { +--- 1521,1527 ---- + + 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.21-orig/imap/command.c 2010-09-15 10:39:31.000000000 -0500 +--- mutt-1.5.21/imap/command.c 2012-08-29 11:25:04.000000000 -0500 +*************** +*** 1011,1016 **** +--- 1011,1023 ---- + 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 --git a/mutt.changes b/mutt.changes index 557fde1..f3586f9 100644 --- a/mutt.changes +++ b/mutt.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Tue Dec 18 16:26:45 UTC 2012 - aginies@suse.com + +- update sidebar to version 20120829 + ------------------------------------------------------------------- Tue Sep 18 15:47:45 UTC 2012 - vmiklos@suse.cz diff --git a/mutt.spec b/mutt.spec index 38dd57d..012787a 100644 --- a/mutt.spec +++ b/mutt.spec @@ -61,7 +61,7 @@ Requires(postun): shared-mime-info # desktop selections. #Requires: desktop-data-SuSE Version: 1.5.21 -Release: 0 +Release: 33.2 Summary: Mail Program License: GPL-2.0+ Group: Productivity/Networking/Email/Clients @@ -83,7 +83,7 @@ Patch3: %name-1.5.20-sendgroupreplyto.diff Patch4: %name-1.5.15-wrapcolumn.diff Patch5: patch-1.5.5.1.nt.xtitles.3.ab.1 # http://lunar-linux.org/index.php?page=mutt-sidebar -Patch6: mutt-1.5.21.sidebar.20090619.patch +Patch6: mutt-1.5.21.sidebar.20120829.patch Patch7: mutt-1.5.21-opennfs.dif Patch8: mutt-1.5.20-gpgme_set_locale.patch Patch9: bug-676388-largefile.patch diff --git a/nion.sidebar-color.diff b/nion.sidebar-color.diff index e7fac7b..6b4275c 100644 --- a/nion.sidebar-color.diff +++ b/nion.sidebar-color.diff @@ -34,36 +34,39 @@ diff --git a/sidebar.c b/sidebar.c index 9e12319..4b37b76 100644 --- a/sidebar.c +++ b/sidebar.c -@@ -195,22 +195,26 @@ int draw_sidebar(int menu) { - } +@@ -250,13 +250,14 @@ + } - /* get attributes for divider */ -- SETCOLOR(MT_COLOR_STATUS); -+ SETCOLOR(MT_COLOR_SIDEBAR); + /* get attributes for divider */ +- SETCOLOR(MT_COLOR_STATUS); ++ SETCOLOR(MT_COLOR_SIDEBAR); #ifndef USE_SLANG_CURSES - attr_get(&attrs, &color_pair, 0); + attr_get(&attrs, &color_pair, 0); #else - color_pair = attr_get(); + color_pair = attr_get(); #endif -- SETCOLOR(MT_COLOR_NORMAL); + SETCOLOR(MT_COLOR_NORMAL); + /* SETCOLOR(MT_COLOR_SIDEBAR); */ - /* draw the divider */ + /* draw the divider */ - for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) { - move(lines, SidebarWidth - delim_len); -- addstr(NONULL(SidebarDelim)); +@@ -266,10 +267,14 @@ + + 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); +- mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); -#endif -+ if (option (OPTASCIICHARS)) -+ addstr (NONULL (SidebarDelim)); -+ else if (!option (OPTASCIICHARS) && !strcmp (NONULL(SidebarDelim), "|")) -+ addch (ACS_VLINE); -+ else if ((Charset_is_utf8) && !strcmp (NONULL(SidebarDelim), "|")) -+ addstr ("\342\224\202"); -+ else -+ addstr (NONULL (SidebarDelim)); - } ++ if (option (OPTASCIICHARS)) ++ addstr (NONULL (SidebarDelim)); ++ else if (!option (OPTASCIICHARS) && !strcmp (NONULL(SidebarDelim), "|")) ++ addch (ACS_VLINE); ++ else if ((Charset_is_utf8) && !strcmp (NONULL(SidebarDelim), "|")) ++ addstr ("\342\224\202"); ++ else ++ addstr (NONULL (SidebarDelim)); + } - if ( Incoming == 0 ) return 0; + if ( Incoming == 0 ) return 0; +