hey Christoph,
 I noticed here that you were looking for an updated version of the
sidebar patch:
  http://marc.info/?l=mutt-dev&m=117475859101336&w=2

Since mutt-ng is dead, I decided to switch back to mutt and have
ported the 1.5.15 sidebar patch from Terry P. Chan to the version of
mutt in experimental.

Though its been working for me for the past, oh, 12 hours - I make no
claim that its perfect :)

diff -urpN mutt-1.5.15+20070515.orig/Makefile.am 
mutt-1.5.15+20070515/Makefile.am
--- mutt-1.5.15+20070515.orig/Makefile.am       2007-06-04 23:45:16.000000000 
-0600
+++ mutt-1.5.15+20070515/Makefile.am    2007-06-04 23:54:09.000000000 -0600
@@ -29,7 +29,8 @@ mutt_SOURCES = $(BUILT_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 mutt_idna.c crypt-mod.c crypt-mod.h
+       url.c ascii.c mutt_idna.c crypt-mod.c crypt-mod.h \
+        sidebar.c
 
 mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \
        $(INTLLIBS) $(LIBICONV)  $(GPGME_LIBS)
diff -urpN mutt-1.5.15+20070515.orig/Makefile.in 
mutt-1.5.15+20070515/Makefile.in
--- mutt-1.5.15+20070515.orig/Makefile.in       2007-06-04 23:45:17.000000000 
-0600
+++ mutt-1.5.15+20070515/Makefile.in    2007-06-04 23:54:09.000000000 -0600
@@ -91,7 +91,8 @@ am_mutt_OBJECTS = $(am__objects_1) addrb
        thread.$(OBJEXT) charset.$(OBJEXT) history.$(OBJEXT) \
        lib.$(OBJEXT) muttlib.$(OBJEXT) editmsg.$(OBJEXT) \
        mbyte.$(OBJEXT) url.$(OBJEXT) ascii.$(OBJEXT) \
-       mutt_idna.$(OBJEXT) crypt-mod.$(OBJEXT)
+       mutt_idna.$(OBJEXT) crypt-mod.$(OBJEXT) \
+        sidebar.$(OBJEXT)
 mutt_OBJECTS = $(am_mutt_OBJECTS)
 am__DEPENDENCIES_1 =
 am_mutt_dotlock_OBJECTS = mutt_dotlock.$(OBJEXT)
@@ -312,7 +313,8 @@ mutt_SOURCES = $(BUILT_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 mutt_idna.c crypt-mod.c crypt-mod.h
+       url.c ascii.c mutt_idna.c crypt-mod.c crypt-mod.h \
+        sidebar.c
 
 mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \
        $(INTLLIBS) $(LIBICONV)  $(GPGME_LIBS)
@@ -346,7 +348,7 @@ EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP O
        makedoc.c makedoc-defs.h stamp-doc-rc README.SSL smime.h \
        muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \
        ChangeLog ChangeLog.old mkchangelog.sh cvslog2changelog.pl mutt_idna.h \
-       snprintf.c regex.c crypt-gpgme.h hcachever.sh
+       snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh
 
 EXTRA_SCRIPTS = smime_keys
 mutt_dotlock_SOURCES = mutt_dotlock.c
diff -urpN mutt-1.5.15+20070515.orig/Muttrc mutt-1.5.15+20070515/Muttrc
--- mutt-1.5.15+20070515.orig/Muttrc    2007-05-17 06:47:29.000000000 -0600
+++ mutt-1.5.15+20070515/Muttrc 2007-06-04 23:54:09.000000000 -0600
@@ -2037,6 +2037,26 @@ attachments   -I message/external-body
 # function.
 # 
 # 
+# 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
diff -urpN mutt-1.5.15+20070515.orig/OPS mutt-1.5.15+20070515/OPS
--- mutt-1.5.15+20070515.orig/OPS       2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/OPS    2007-06-04 23:54:09.000000000 -0600
@@ -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"
diff -urpN mutt-1.5.15+20070515.orig/buffy.c mutt-1.5.15+20070515/buffy.c
--- mutt-1.5.15+20070515.orig/buffy.c   2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/buffy.c        2007-06-05 00:00:32.000000000 -0600
@@ -261,7 +261,7 @@ int mutt_buffy_check (int force)
   char path[_POSIX_PATH_MAX];
   struct stat contex_sb;
   time_t t;
-
+  CONTEXT *ctx;
 #ifdef USE_IMAP
   /* update postponed count as well, on force */
   if (force)
@@ -296,6 +296,8 @@ int mutt_buffy_check (int force)
   
   for (tmp = Incoming; tmp; tmp = tmp->next)
   {
+    if ( tmp->new == 1 )
+      tmp->has_new = 1;
 #ifdef USE_IMAP
     if (tmp->magic != M_IMAP)
 #endif
@@ -353,41 +355,85 @@ int mutt_buffy_check (int force)
       case M_MBOX:
       case M_MMDF:
 
-       if (STAT_CHECK)
+        {
+        if (STAT_CHECK || tmp->msgcount == 0)
        {
-         BuffyCount++;
-         tmp->new = 1;
+         BUFFY b = *tmp;
+         int msgcount = 0;
+         int msg_unread = 0;
+         /* parse the mailbox, to see how much mail there is */
+         ctx = mx_open_mailbox( tmp->path, M_READONLY | M_QUIET | M_NOSORT | 
M_PEEK, NULL);
+         if(ctx)
+         {
+            msgcount = ctx->msgcount;
+           msg_unread = ctx->unread;
+           mx_close_mailbox(ctx, 0);
+         }
+         *tmp = b;
+         tmp->msgcount = msgcount;
+         tmp->msg_unread = msg_unread;
+         if(STAT_CHECK) {
+           tmp->has_new = tmp->new = 1;
+           BuffyCount++;
+          }  
        }
        else if (option(OPTCHECKMBOXSIZE))
        {
          /* some other program has deleted mail from the folder */
          tmp->size = (long) sb.st_size;
        }
-       if (tmp->newly_created &&
-           (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
-         tmp->newly_created = 0;
-
-       break;
+        if (tmp->newly_created &&
+            (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
+          tmp->newly_created = 0;
+        }
+        break;
 
       case M_MAILDIR:
 
+        /* count new message */
        snprintf (path, sizeof (path), "%s/new", tmp->path);
        if ((dirp = opendir (path)) == NULL)
        {
          tmp->magic = 0;
          break;
        }
+       tmp->msgcount = 0;
+       tmp->msg_unread = 0;
        while ((de = readdir (dirp)) != NULL)
        {
          char *p;
          if (*de->d_name != '.' && 
              (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
          {
+           tmp->has_new = tmp->new = 1;
+            tmp->msgcount++;
+            tmp->msg_unread++;
+         }
+       }
+        if(tmp->msg_unread)
+          BuffyCount++;
+ 
+       closedir (dirp);
+ 
+        /*
+         * count read messages (for folderlist (sidebar) we also need to count
+         * messages in cur so that we the total number of messages
+         */
+       snprintf (path, sizeof (path), "%s/cur", tmp->path);
+       if ((dirp = opendir (path)) == NULL)
+       {
+         tmp->magic = 0;
+         break;
+       }
+       while ((de = readdir (dirp)) != NULL)
+       {
+         char *p;
+         if (*de->d_name != '.' && 
+             (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
+         {
+             tmp->msgcount++;
            if (!tmp->new)
            {
-             /* one new and undeleted message is enough */
-             BuffyCount++;
-             tmp->new = 1;
 
              if (! option (OPTMAILDIRMTIME)) /* prevent stat calls */
                break;
@@ -403,8 +449,25 @@ int mutt_buffy_check (int force)
        break;
 
       case M_MH:
-       if ((tmp->new = mh_buffy (tmp->path)) > 0)
-         BuffyCount++;
+      {
+      DIR *dp;
+      struct dirent *de;
+      if ((tmp->new = mh_buffy (tmp->path)) > 0)
+        BuffyCount++;
+    
+      if ((dp = opendir (path)) == NULL)
+        break;
+      tmp->msgcount = 0;
+      while ((de = readdir (dp)))
+      {
+        if (mh_valid_message (de->d_name))
+        {
+         tmp->msgcount++;
+         tmp->has_new = tmp->new = 1;
+        }
+      }
+      closedir (dp);
+      }
        break;
       }
     }
diff -urpN mutt-1.5.15+20070515.orig/buffy.h mutt-1.5.15+20070515/buffy.h
--- mutt-1.5.15+20070515.orig/buffy.h   2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/buffy.h        2007-06-05 00:01:09.000000000 -0600
@@ -25,8 +25,12 @@ typedef struct buffy_t
   char *path;
   long size;
   struct buffy_t *next;
+  struct buffy_t *prev;
   time_t mtime;                        /* for maildirs...time of newest entry 
*/
   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 */
   short notified;              /* user has been notified */
   short magic;                 /* mailbox type */
   short newly_created;         /* mbox or mmdf just popped into existence */
diff -urpN mutt-1.5.15+20070515.orig/color.c mutt-1.5.15+20070515/color.c
--- mutt-1.5.15+20070515.orig/color.c   2007-03-24 11:45:30.000000000 -0600
+++ mutt-1.5.15+20070515/color.c        2007-06-04 23:54:09.000000000 -0600
@@ -93,6 +93,7 @@ static struct mapping_t Fields[] =
   { "bold",            MT_COLOR_BOLD },
   { "underline",       MT_COLOR_UNDERLINE },
   { "index",           MT_COLOR_INDEX },
+  { "sidebar_new",     MT_COLOR_NEW },
   { NULL,              0 }
 };
 
diff -urpN mutt-1.5.15+20070515.orig/compose.c mutt-1.5.15+20070515/compose.c
--- mutt-1.5.15+20070515.orig/compose.c 2007-05-16 15:08:46.000000000 -0600
+++ mutt-1.5.15+20070515/compose.c      2007-06-04 23:54:09.000000000 -0600
@@ -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[] =
 {
@@ -115,16 +115,16 @@ static void redraw_crypt_lines (HEADER *
   if ((WithCrypto & APPLICATION_PGP) && (WithCrypto & APPLICATION_SMIME))
   {     
     if (!msg->security)
-      mvaddstr (HDR_CRYPT, 0,     "Security: ");
+      mvaddstr (HDR_CRYPT, SidebarWidth,     "Security: ");
     else if (msg->security & APPLICATION_SMIME)
-      mvaddstr (HDR_CRYPT, 0,     "  S/MIME: ");
+      mvaddstr (HDR_CRYPT, SidebarWidth,     "  S/MIME: ");
     else if (msg->security & APPLICATION_PGP)
-      mvaddstr (HDR_CRYPT, 0,     "     PGP: ");
+      mvaddstr (HDR_CRYPT, SidebarWidth,     "     PGP: ");
   }
   else if ((WithCrypto & APPLICATION_SMIME))
-    mvaddstr (HDR_CRYPT, 0,     "  S/MIME: ");
+    mvaddstr (HDR_CRYPT, SidebarWidth,     "  S/MIME: ");
   else if ((WithCrypto & APPLICATION_PGP))
-    mvaddstr (HDR_CRYPT, 0,     "     PGP: ");
+    mvaddstr (HDR_CRYPT, SidebarWidth,     "     PGP: ");
   else
     return;
 
@@ -148,7 +148,7 @@ static void redraw_crypt_lines (HEADER *
     }
   clrtoeol ();
 
-  move (HDR_CRYPTINFO, 0);
+  move (HDR_CRYPTINFO, SidebarWidth);
   clrtoeol ();
   if ((WithCrypto & APPLICATION_PGP)
       && msg->security & APPLICATION_PGP  && msg->security & SIGN)
@@ -164,7 +164,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;
   }
@@ -178,7 +178,7 @@ static void redraw_mix_line (LIST *chain
   int c;
   char *t;
 
-  mvaddstr (HDR_MIX, 0,     "     Mix: ");
+  mvaddstr (HDR_MIX, SidebarWidth,     "     Mix: ");
 
   if (!chain)
   {
@@ -193,7 +193,7 @@ static void redraw_mix_line (LIST *chain
     if (t && t[0] == '0' && t[1] == '\0')
       t = "<random>";
     
-    if (c + mutt_strlen (t) + 2 >= COLS)
+    if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth)
       break;
 
     addstr (NONULL(t));
@@ -245,7 +245,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);
 }
 
@@ -255,10 +255,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)
@@ -269,7 +269,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 ();
 
@@ -307,7 +307,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;
@@ -553,7 +553,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);
@@ -570,7 +570,7 @@ int mutt_compose_menu (HEADER *msg,   /*
        {
          strfcpy (fcc, buf, _POSIX_PATH_MAX);
          mutt_pretty_mailbox (fcc);
-         move (HDR_FCC, HDR_XOFFSET);
+         move (HDR_FCC, HDR_XOFFSET + SidebarWidth);
          mutt_paddstr (W, fcc);
          fccSet = 1;
        }
diff -urpN mutt-1.5.15+20070515.orig/contrib/gpg.rc 
mutt-1.5.15+20070515/contrib/gpg.rc
--- mutt-1.5.15+20070515.orig/contrib/gpg.rc    2007-06-04 23:45:18.000000000 
-0600
+++ mutt-1.5.15+20070515/contrib/gpg.rc 2007-06-05 00:10:44.000000000 -0600
@@ -49,11 +49,11 @@ set pgp_clearsign_command="gpg --no-verb
 
 # create a pgp/mime encrypted attachment
 # set pgp_encrypt_only_command="pgpewrap gpg-2comp -v --batch --output - 
--encrypt --textmode --armor --always-trust -- -r %r -- %f"
-set pgp_encrypt_only_command="/usr/lib/mutt/pgpewrap gpg --batch --quiet 
--no-verbose --output - --encrypt --textmode --armor --always-trust -- -r %r -- 
%f"
+set pgp_encrypt_only_command="pgpewrap gpg --batch --quiet --no-verbose 
--output - --encrypt --textmode --armor --always-trust -- -r %r -- %f"
 
 # create a pgp/mime encrypted and signed attachment
 # set pgp_encrypt_sign_command="pgpewrap gpg-2comp %?p?--passphrase-fd 0? -v 
--batch --output - --encrypt --sign %?a?-u %a? --armor --always-trust -- -r %r 
-- %f"
-set pgp_encrypt_sign_command="/usr/lib/mutt/pgpewrap gpg %?p?--passphrase-fd 
0? --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u 
%a? --armor --always-trust -- -r %r -- %f"
+set pgp_encrypt_sign_command="pgpewrap gpg %?p?--passphrase-fd 0? --batch 
--quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor 
--always-trust -- -r %r -- %f"
 
 # import a key into the public key ring
 set pgp_import_command="gpg --no-verbose --import %f"
@@ -72,8 +72,6 @@ set pgp_list_secring_command="gpg --no-v
 
 # fetch keys
 # set pgp_getkeys_command="pkspxycwrap %r"
-# This will work when #172960 will be fixed upstream
-# set pgp_getkeys_command="gpg --recv-keys %r"
 
 # pattern for good signature - may need to be adapted to locale!
 
diff -urpN mutt-1.5.15+20070515.orig/curs_main.c 
mutt-1.5.15+20070515/curs_main.c
--- mutt-1.5.15+20070515.orig/curs_main.c       2007-06-04 23:45:17.000000000 
-0600
+++ mutt-1.5.15+20070515/curs_main.c    2007-06-05 00:08:00.000000000 -0600
@@ -29,6 +29,7 @@
 #include "sort.h"
 #include "buffy.h"
 #include "mx.h"
+#include "sidebar.h"
 
 #ifdef USE_POP
 #include "pop.h"
@@ -544,8 +545,13 @@ 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;
@@ -557,6 +563,7 @@ int mutt_index_menu (void)
     if (menu->redraw & REDRAW_FULL)
     {
       menu_redraw_full (menu);
+      draw_sidebar(menu->menu);
       mutt_show_error ();
     }
 
@@ -579,10 +586,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);
@@ -603,7 +613,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
@@ -1071,6 +1081,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:
       
@@ -1102,7 +1113,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)
            {
@@ -1120,6 +1135,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);
@@ -2212,6 +2228,12 @@ int mutt_index_menu (void)
        mutt_what_key();
        break;
 
+      case OP_SIDEBAR_SCROLL_UP:
+      case OP_SIDEBAR_SCROLL_DOWN:
+      case OP_SIDEBAR_NEXT:
+      case OP_SIDEBAR_PREV:
+        scroll_sidebar(op, menu->menu);
+       break;
       default:
        if (menu->menu == MENU_MAIN)
          km_error_key (MENU_MAIN);
diff -urpN mutt-1.5.15+20070515.orig/flags.c mutt-1.5.15+20070515/flags.c
--- mutt-1.5.15+20070515.orig/flags.c   2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/flags.c        2007-06-04 23:54:09.000000000 -0600
@@ -22,8 +22,10 @@
 
 #include "mutt.h"
 #include "mutt_curses.h"
+#include "mutt_menu.h"
 #include "sort.h"
 #include "mx.h"
+#include "sidebar.h"
 
 #ifdef USE_IMAP
 #include "imap_private.h"
@@ -294,6 +296,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)
diff -urpN mutt-1.5.15+20070515.orig/functions.h 
mutt-1.5.15+20070515/functions.h
--- mutt-1.5.15+20070515.orig/functions.h       2007-06-04 23:45:18.000000000 
-0600
+++ mutt-1.5.15+20070515/functions.h    2007-06-04 23:54:09.000000000 -0600
@@ -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 }
 };
 
@@ -267,6 +272,11 @@ struct binding_t OpPager[] = { /* map: p
   { "decrypt-save",            OP_DECRYPT_SAVE,                NULL },
 
 
+  { "sidebar-scroll-up",       OP_SIDEBAR_SCROLL_UP, NULL },
+  { "sidebar-scroll-down",     OP_SIDEBAR_SCROLL_DOWN, NULL },
+  { "sidebar-next",    OP_SIDEBAR_NEXT, NULL },
+  { "sidebar-prev",    OP_SIDEBAR_PREV, NULL },
+  { "sidebar-open", OP_SIDEBAR_OPEN, NULL },
   { NULL,              0,                              NULL }
 };
 
diff -urpN mutt-1.5.15+20070515.orig/globals.h mutt-1.5.15+20070515/globals.h
--- mutt-1.5.15+20070515.orig/globals.h 2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/globals.h      2007-06-04 23:54:09.000000000 -0600
@@ -115,6 +115,7 @@ WHERE char *Realname;
 WHERE char *SendCharset;
 WHERE char *Sendmail;
 WHERE char *Shell;
+WHERE char *SidebarDelim;
 WHERE char *Signature;
 WHERE char *SimpleSearch;
 #if USE_SMTP
@@ -210,6 +211,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;
 #endif
diff -urpN mutt-1.5.15+20070515.orig/imap/command.c 
mutt-1.5.15+20070515/imap/command.c
--- mutt-1.5.15+20070515.orig/imap/command.c    2007-04-12 10:15:14.000000000 
-0600
+++ mutt-1.5.15+20070515/imap/command.c 2007-06-04 23:54:09.000000000 -0600
@@ -911,6 +911,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;
       }
diff -urpN mutt-1.5.15+20070515.orig/imap/imap.c 
mutt-1.5.15+20070515/imap/imap.c
--- mutt-1.5.15+20070515.orig/imap/imap.c       2007-04-12 10:15:14.000000000 
-0600
+++ mutt-1.5.15+20070515/imap/imap.c    2007-06-04 23:54:09.000000000 -0600
@@ -1483,7 +1483,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_cmd_queue (idata, command) < 0)
     {
diff -urpN mutt-1.5.15+20070515.orig/init.h mutt-1.5.15+20070515/init.h
--- mutt-1.5.15+20070515.orig/init.h    2007-06-04 23:45:18.000000000 -0600
+++ mutt-1.5.15+20070515/init.h 2007-06-04 23:54:09.000000000 -0600
@@ -1504,6 +1504,22 @@ struct option_t MuttVars[] = {
   ** If ``no'', never attempt to verify cryptographic signatures.
   ** (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.
+  */
   { "smime_is_default", DT_BOOL,  R_NONE, OPTSMIMEISDEFAULT, 0},
   /*
   ** .pp
diff -urpN mutt-1.5.15+20070515.orig/mailbox.h mutt-1.5.15+20070515/mailbox.h
--- mutt-1.5.15+20070515.orig/mailbox.h 2007-03-24 11:45:27.000000000 -0600
+++ mutt-1.5.15+20070515/mailbox.h      2007-06-04 23:54:09.000000000 -0600
@@ -27,6 +27,7 @@
 #define M_NEWFOLDER    (1<<4) /* create a new folder - same as M_APPEND, but 
uses
                                * safe_fopen() for mbox-style folders.
                                */
+#define M_PEEK         (1<<5) /* revert atime back after taking a look (if 
applicable) */
 
 /* mx_open_new_message() */
 #define M_ADD_FROM     1       /* add a From_ line */
diff -urpN mutt-1.5.15+20070515.orig/mbox.c mutt-1.5.15+20070515/mbox.c
--- mutt-1.5.15+20070515.orig/mbox.c    2007-06-04 23:45:16.000000000 -0600
+++ mutt-1.5.15+20070515/mbox.c 2007-06-04 23:54:09.000000000 -0600
@@ -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)
diff -urpN mutt-1.5.15+20070515.orig/menu.c mutt-1.5.15+20070515/menu.c
--- mutt-1.5.15+20070515.orig/menu.c    2007-03-24 11:45:30.000000000 -0600
+++ mutt-1.5.15+20070515/menu.c 2007-06-04 23:54:09.000000000 -0600
@@ -24,6 +24,7 @@
 #include "mutt_curses.h"
 #include "mutt_menu.h"
 #include "mbyte.h"
+#include "sidebar.h"
 
 #ifdef USE_IMAP
 #include "imap.h"
@@ -158,7 +159,7 @@ void menu_pad_string (char *s, size_t n)
 {
   char *scratch = safe_strdup (s);
   int shift = option (OPTARROWCURSOR) ? 3 : 0;
-  int cols = COLS - shift;
+  int cols = COLS - shift - SidebarWidth;
 
   mutt_format_string (s, n, cols, cols, 0, ' ', scratch, mutt_strlen 
(scratch), 1);
   s[n - 1] = 0;
@@ -209,6 +210,7 @@ void menu_redraw_index (MUTTMENU *menu)
   char buf[STRING];
   int i;
 
+  draw_sidebar(1);
   for (i = menu->top; i < menu->top + menu->pagelen; i++)
   {
     if (i < menu->max)
@@ -219,7 +221,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)
        {
@@ -248,14 +250,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;
 }
@@ -270,7 +272,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);
 
@@ -285,13 +287,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 ("->");
@@ -312,7 +314,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);
@@ -324,7 +326,7 @@ void menu_redraw_current (MUTTMENU *menu
 {
   char buf[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));
 
@@ -867,7 +869,7 @@ int mutt_menuLoop (MUTTMENU *menu)
     
     
     if (option (OPTARROWCURSOR))
-      move (menu->current - menu->top + menu->offset, 2);
+      move (menu->current - menu->top + menu->offset, SidebarWidth + 2);
     else if (option (OPTBRAILLEFRIENDLY))
       move (menu->current - menu->top + menu->offset, 0);
     else
diff -urpN mutt-1.5.15+20070515.orig/mutt.h mutt-1.5.15+20070515/mutt.h
--- mutt-1.5.15+20070515.orig/mutt.h    2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/mutt.h 2007-06-04 23:54:09.000000000 -0600
@@ -437,6 +437,7 @@ enum
   OPTSAVEEMPTY,
   OPTSAVENAME,
   OPTSCORE,
+  OPTSIDEBAR,
   OPTSIGDASHES,
   OPTSIGONTOP,
   OPTSORTRE,
@@ -874,6 +875,7 @@ typedef struct _context
 {
   char *path;
   FILE *fp;
+  time_t atime;
   time_t mtime;
   off_t size;
   off_t vsize;
@@ -914,6 +916,7 @@ typedef struct _context
   unsigned int quiet : 1;      /* inhibit status messages? */
   unsigned int collapsed : 1;   /* are all threads collapsed? */
   unsigned int closing : 1;    /* mailbox is being closed */
+  unsigned int peekonly : 1;   /* just taking a glance, revert atime */
 
   /* driver hooks */
   void *data;                  /* driver specific data */
diff -urpN mutt-1.5.15+20070515.orig/mutt_curses.h 
mutt-1.5.15+20070515/mutt_curses.h
--- mutt-1.5.15+20070515.orig/mutt_curses.h     2007-03-24 11:45:30.000000000 
-0600
+++ mutt-1.5.15+20070515/mutt_curses.h  2007-06-04 23:54:09.000000000 -0600
@@ -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,7 @@ enum
   MT_COLOR_BOLD,
   MT_COLOR_UNDERLINE,
   MT_COLOR_INDEX,
+  MT_COLOR_NEW,
   MT_COLOR_MAX
 };
 
diff -urpN mutt-1.5.15+20070515.orig/muttlib.c mutt-1.5.15+20070515/muttlib.c
--- mutt-1.5.15+20070515.orig/muttlib.c 2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/muttlib.c      2007-06-04 23:54:09.000000000 -0600
@@ -1201,7 +1201,10 @@ void mutt_FormatString (char *dest,              /* 
        ch = *src++; /* pad char */
        /* calculate space left on line.  if we've already written more data
           than will fit on the line, ignore the rest of the line */
-       count = (COLS < destlen ? COLS : destlen);
+       if ( DrawFullLine )
+         count = (COLS < destlen ? COLS : destlen);
+       else
+         count = ((COLS-SidebarWidth) < destlen ? COLS - SidebarWidth : 
destlen);
        if (count > col)
        {
          count -= col; /* how many columns left on this line */
diff -urpN mutt-1.5.15+20070515.orig/mx.c mutt-1.5.15+20070515/mx.c
--- mutt-1.5.15+20070515.orig/mx.c      2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/mx.c   2007-06-04 23:54:09.000000000 -0600
@@ -631,6 +631,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)
@@ -653,6 +654,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))
   {
@@ -757,9 +760,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
 
   if (ctx->mx_close)
     ctx->mx_close (ctx);
diff -urpN mutt-1.5.15+20070515.orig/pager.c mutt-1.5.15+20070515/pager.c
--- mutt-1.5.15+20070515.orig/pager.c   2007-06-04 23:45:17.000000000 -0600
+++ mutt-1.5.15+20070515/pager.c        2007-06-05 00:06:38.000000000 -0600
@@ -30,6 +30,7 @@
 #include "pager.h"
 #include "attach.h"
 #include "mbyte.h"
+#include "sidebar.h"
 void set_xterm_title_bar(char *title);
 void set_xterm_icon_name(char *name);
 
@@ -1070,6 +1071,8 @@ static int format_line (struct line_t **
 
   int wrap_cols = mutt_term_width (Wrap);
   
+  wrap_cols -= SidebarWidth;
+
   /* FIXME: this should come from lineInfo */
   memset(&mbstate, 0, sizeof(mbstate));
 
@@ -1702,7 +1705,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;
@@ -1715,6 +1718,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);
@@ -1728,6 +1732,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. */
@@ -1751,22 +1756,22 @@ 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))
       {
-       size_t l1 = COLS * MB_LEN_MAX;
+       size_t l1 = COLS * MB_LEN_MAX - (SidebarWidth * MB_LEN_MAX);
        size_t l2 = sizeof (buffer);
        hfi.hdr = extra->hdr;
        mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), 
&hfi, M_FORMAT_MAKEPRINT);
       }
       else if (IsMsgAttach (extra))
       {
-       size_t l1 = COLS * MB_LEN_MAX;
+       size_t l1 = COLS * MB_LEN_MAX - (SidebarWidth * MB_LEN_MAX);
        size_t l2 = sizeof (buffer);
        hfi.hdr = extra->bdy->hdr;
        mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), 
&hfi, M_FORMAT_MAKEPRINT);
       }
-      mutt_paddstr (COLS, IsHeader (extra) || IsMsgAttach (extra) ?  buffer : 
banner);
+      mutt_paddstr (COLS-SidebarWidth, IsHeader (extra) || IsMsgAttach (extra) 
? buffer : banner);
       BKGDSET (MT_COLOR_NORMAL);
       SETCOLOR (MT_COLOR_NORMAL);
       if (option(OPTXTERMSETTITLES))
@@ -1783,18 +1788,24 @@ 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)) {
@@ -2673,6 +2684,12 @@ search_next:
         redraw = REDRAW_FULL;
         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;
diff -urpN mutt-1.5.15+20070515.orig/sidebar.c mutt-1.5.15+20070515/sidebar.c
--- mutt-1.5.15+20070515.orig/sidebar.c 1969-12-31 17:00:00.000000000 -0700
+++ mutt-1.5.15+20070515/sidebar.c      2007-06-04 23:54:09.000000000 -0600
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) ????-2004 Justin Hibbits <[EMAIL PROTECTED]>
+ * Copyright (C) 2004 Thomer M. Gil <[EMAIL PROTECTED]>
+ * 
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ * 
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ * 
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program; if not, write to the Free Software
+ *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ */ 
+
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "mutt.h"
+#include "mutt_menu.h"
+#include "mutt_curses.h"
+#include "sidebar.h"
+#include "buffy.h"
+#include <libgen.h>
+#include "keymap.h"
+#include <stdbool.h>
+
+/*BUFFY *CurBuffy = 0;*/
+static BUFFY *TopBuffy = 0;
+static BUFFY *BottomBuffy = 0;
+static int known_lines = 0;
+
+static int quick_log10(int n)
+{
+        char string[32];
+        sprintf(string, "%d", n);
+        return strlen(string);
+}
+
+void calc_boundaries (int menu)
+{
+       BUFFY *tmp = Incoming;
+
+       if ( known_lines != LINES ) {
+               TopBuffy = BottomBuffy = 0;
+               known_lines = LINES;
+       }
+       for ( ; tmp->next != 0; tmp = tmp->next )
+               tmp->next->prev = tmp;
+
+       if ( TopBuffy == 0 && BottomBuffy == 0 )
+               TopBuffy = Incoming;
+       if ( BottomBuffy == 0 ) {
+               int count = LINES - 2 - (menu != MENU_PAGER || 
option(OPTSTATUSONTOP));
+               BottomBuffy = TopBuffy;
+               while ( --count && BottomBuffy->next )
+                       BottomBuffy = BottomBuffy->next;
+       }
+       else if ( TopBuffy == CurBuffy->next ) {
+               int count = LINES - 2 - (menu != MENU_PAGER);
+               BottomBuffy = CurBuffy;
+               tmp = BottomBuffy;
+               while ( --count && tmp->prev)
+                       tmp = tmp->prev;
+               TopBuffy = tmp;
+       }
+       else if ( BottomBuffy == CurBuffy->prev ) {
+               int count = LINES - 2 - (menu != MENU_PAGER);
+               TopBuffy = CurBuffy;
+               tmp = TopBuffy;
+               while ( --count && tmp->next )
+                       tmp = tmp->next;
+               BottomBuffy = tmp;
+       }
+}
+
+char *make_sidebar_entry(char *box, int size, int new)
+{
+       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 ) 
+               sprintf(
+                       entry + SidebarWidth - delim_len - 3 - 
quick_log10(size) - quick_log10(new),
+                       "% d(%d)", size, new);
+       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 ) 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 */
+
+       for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); 
lines++ ) {
+               move(lines, SidebarWidth - delim_len);
+               addstr(NONULL(SidebarDelim));
+#ifndef USE_SLANG_CURSES
+                mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, 
color_pair, NULL);
+#endif
+       }
+
+       if ( Incoming == 0 ) return 0;
+       lines = option(OPTHELP) ? 1 : 0; /* go back to the top */
+
+       if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) 
+               calc_boundaries(menu);
+       if ( CurBuffy == 0 ) CurBuffy = Incoming;
+
+       tmp = TopBuffy;
+
+       SETCOLOR(MT_COLOR_NORMAL);
+
+       for ( ; tmp && lines < LINES-1 - (menu != MENU_PAGER || 
option(OPTSTATUSONTOP)); tmp = tmp->next ) {
+               if ( tmp == CurBuffy )
+                       SETCOLOR(MT_COLOR_INDICATOR);
+               else if ( tmp->msg_unread > 0 )
+                       SETCOLOR(MT_COLOR_NEW);
+               else
+                       SETCOLOR(MT_COLOR_NORMAL);
+
+               move( lines, 0 );
+               if ( Context && !strcmp( tmp->path, Context->path ) ) {
+                       tmp->msg_unread = Context->unread;
+                       tmp->msgcount = Context->msgcount;
+               }
+                printw( "%.*s", SidebarWidth - delim_len + 1,
+                        make_sidebar_entry(basename(tmp->path), tmp->msgcount,
+                        tmp->msg_unread));
+               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 - 1; i++ )
+                       addch(' ');
+       }
+       return 0;
+}
+
+
+void set_buffystats(CONTEXT* Context)
+{
+        BUFFY *tmp = Incoming;
+        while(tmp) {
+                if(Context && !strcmp(tmp->path, Context->path)) {
+                       tmp->msg_unread = Context->unread;
+                       tmp->msgcount = Context->msgcount;
+                        break;
+                }
+                tmp = tmp->next;
+        }
+}
+
+void scroll_sidebar(int op, int menu)
+{
+        if(!SidebarWidth) return;
+        if(!CurBuffy) return;
+
+       switch (op) {
+               case OP_SIDEBAR_NEXT:
+                       if ( CurBuffy->next == NULL ) return;
+                       CurBuffy = CurBuffy->next;
+                       break;
+               case OP_SIDEBAR_PREV:
+                       if ( CurBuffy->prev == NULL ) return;
+                       CurBuffy = CurBuffy->prev;
+                       break;
+               case OP_SIDEBAR_SCROLL_UP:
+                       CurBuffy = TopBuffy;
+                       if ( CurBuffy != Incoming ) {
+                               calc_boundaries(menu);
+                               CurBuffy = CurBuffy->prev;
+                       }
+                       break;
+               case OP_SIDEBAR_SCROLL_DOWN:
+                       CurBuffy = BottomBuffy;
+                       if ( CurBuffy->next ) {
+                               calc_boundaries(menu);
+                               CurBuffy = CurBuffy->next;
+                       }
+                       break;
+               default:
+                       return;
+       }
+       calc_boundaries(menu);
+       draw_sidebar(menu);
+}
diff -urpN mutt-1.5.15+20070515.orig/sidebar.h mutt-1.5.15+20070515/sidebar.h
--- mutt-1.5.15+20070515.orig/sidebar.h 1969-12-31 17:00:00.000000000 -0700
+++ mutt-1.5.15+20070515/sidebar.h      2007-06-04 23:54:09.000000000 -0600
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) ????-2004 Justin Hibbits <[EMAIL PROTECTED]>
+ * Copyright (C) 2004 Thomer M. Gil <[EMAIL PROTECTED]>
+ * 
+ *     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 */


-- 
dann frazier | HP Open Source and Linux Organization

Attachment: signature.asc
Description: Digital signature

Reply via email to