++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL },
++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL },
++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL },
+ { NULL, 0, NULL }
+ };
+
+***************
+*** 266,271 ****
+--- 271,281 ----
+
+ { "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.19-orig/globals.h 2009-01-03 17:27:10.000000000 -0600
+--- mutt-1.5.19-patched/globals.h 2009-05-21 23:08:38.000000000 -0500
+***************
+*** 116,121 ****
+--- 116,122 ----
+ WHERE char *SendCharset;
+ WHERE char *Sendmail;
+ WHERE char *Shell;
++ WHERE char *SidebarDelim;
+ WHERE char *Signature;
+ WHERE char *SimpleSearch;
+ #if USE_SMTP
+***************
+*** 205,210 ****
+--- 206,214 ----
+ 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.19-orig/init.h 2009-01-05 13:20:53.000000000 -0600
+--- mutt-1.5.19-patched/init.h 2009-05-21 23:08:38.000000000 -0500
+***************
+*** 1572,1577 ****
+--- 1572,1593 ----
+ ** you may \fIunset\fP this setting.
+ ** (Crypto 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_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
+*** mutt-1.5.19-orig/mailbox.h 2008-03-19 15:07:06.000000000 -0500
+--- mutt-1.5.19-patched/mailbox.h 2009-05-21 23:08:38.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.19-orig/Makefile.am 2009-01-05 13:20:53.000000000 -0600
+--- mutt-1.5.19-patched/Makefile.am 2009-05-21 23:08:38.000000000 -0500
+***************
+*** 29,35 ****
+ 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
+
+ nodist_mutt_SOURCES = $(BUILT_SOURCES)
+
+--- 29,36 ----
+ 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 \
+! sidebar.c
+
+ nodist_mutt_SOURCES = $(BUILT_SOURCES)
+
+*** mutt-1.5.19-orig/Makefile.in 2009-01-05 13:24:13.000000000 -0600
+--- mutt-1.5.19-patched/Makefile.in 2009-05-21 23:08:38.000000000 -0500
+***************
+*** 83,89 ****
+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \
+ history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \
+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \
+! ascii.$(OBJEXT) crypt-mod.$(OBJEXT)
+ am__objects_1 = patchlist.$(OBJEXT)
+ nodist_mutt_OBJECTS = $(am__objects_1)
+ mutt_OBJECTS = $(am_mutt_OBJECTS) $(nodist_mutt_OBJECTS)
+--- 83,90 ----
+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \
+ history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \
+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \
+! ascii.$(OBJEXT) crypt-mod.$(OBJEXT) \
+! sidebar.$(OBJEXT)
+ am__objects_1 = patchlist.$(OBJEXT)
+ nodist_mutt_OBJECTS = $(am__objects_1)
+ mutt_OBJECTS = $(am_mutt_OBJECTS) $(nodist_mutt_OBJECTS)
+***************
+*** 307,313 ****
+ 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
+
+ nodist_mutt_SOURCES = $(BUILT_SOURCES)
+ mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \
+--- 308,315 ----
+ 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 \
+! sidebar.c
+
+ nodist_mutt_SOURCES = $(BUILT_SOURCES)
+ mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \
+***************
+*** 339,345 ****
+ README.SSL smime.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
+--- 341,347 ----
+ README.SSL smime.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.19-orig/mbox.c 2008-08-15 13:30:12.000000000 -0500
+--- mutt-1.5.19-patched/mbox.c 2009-05-21 23:08:38.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;
+
+***************
+*** 255,260 ****
+--- 256,262 ----
+
+ 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.19-orig/menu.c 2009-01-05 13:20:53.000000000 -0600
+--- mutt-1.5.19-patched/menu.c 2009-05-21 23:08:38.000000000 -0500
+***************
+*** 24,29 ****
+--- 24,30 ----
+ #include "mutt_curses.h"
+ #include "mutt_menu.h"
+ #include "mbyte.h"
++ #include "sidebar.h"
+
+ #include <string.h>
+ #include <stdlib.h>
+***************
+*** 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));
+
+***************
+*** 882,888 ****
+
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+--- 884,890 ----
+
+
+ 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.19-orig/mutt_curses.h 2008-03-19 15:07:57.000000000 -0500
+--- mutt-1.5.19-patched/mutt_curses.h 2009-05-21 23:08:38.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.19-orig/mutt.h 2008-09-25 17:00:03.000000000 -0500
+--- mutt-1.5.19-patched/mutt.h 2009-05-21 23:08:38.000000000 -0500
+***************
+*** 409,414 ****
+--- 409,415 ----
+ OPTSAVEEMPTY,
+ OPTSAVENAME,
+ OPTSCORE,
++ OPTSIDEBAR,
+ OPTSIGDASHES,
+ OPTSIGONTOP,
+ OPTSORTRE,
+***************
+*** 843,848 ****
+--- 844,850 ----
+ {
+ char *path;
+ FILE *fp;
++ time_t atime;
+ time_t mtime;
+ off_t size;
+ off_t vsize;
+***************
+*** 877,882 ****
+--- 879,885 ----
+ 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.19-orig/muttlib.c 2009-01-05 13:20:53.000000000 -0600
+--- mutt-1.5.19-patched/muttlib.c 2009-05-21 23:08:38.000000000 -0500
+***************
+*** 1217,1222 ****
+--- 1217,1224 ----
+ pl = pw = 1;
+
+ /* see if there's room to add content, else ignore */
++ if ( DrawFullLine )
++ {
+ if ((col < COLS && wlen < destlen) || soft)
+ {
+ int pad;
+***************
+*** 1259,1264 ****
+--- 1261,1312 ----
+ 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.19-orig/mx.c 2009-01-05 13:20:53.000000000 -0600
+--- mutt-1.5.19-patched/mx.c 2009-05-21 23:08:38.000000000 -0500
+***************
+*** 611,616 ****
+--- 611,617 ----
+ * 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