summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Fader2016-04-30 14:00:56 +0200
committerJan Fader2016-04-30 14:00:56 +0200
commitd76fa438b22aef0ccde36342da0c8759281aad18 (patch)
tree3cbbc8ec751827ca3b9b6356e9cafe5a9d9a3d7f
parent137180e125369e17226234226cbaef034b6669b9 (diff)
downloadaur-d76fa438b22aef0ccde36342da0c8759281aad18.tar.gz
update to 1.6.0 and migrate to debian patch again
-rw-r--r--.SRCINFO25
-rw-r--r--PKGBUILD34
-rw-r--r--patch-for-first-char-jf.patch11
-rw-r--r--shortpath.patch31
-rw-r--r--sidebar-compose.patch4
-rw-r--r--sidebar-delimnullwide.patch38
-rw-r--r--sidebar-dotpathsep.patch98
-rw-r--r--sidebar-new.patch97
-rw-r--r--sidebar-newonly.patch39
-rw-r--r--sidebar-utf8.patch132
-rw-r--r--sidebar.patch1029
11 files changed, 867 insertions, 671 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 4d70c73b59d4..202bf96b56b1 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,9 +1,7 @@
-# Generated by mksrcinfo v8
-# Sat Jan 30 11:34:50 UTC 2016
pkgbase = mutt-sidebar
pkgdesc = Small but very powerful text-based mail client
- pkgver = 1.5.24
- pkgrel = 10
+ pkgver = 1.6.0
+ pkgrel = 1
url = http://www.mutt.org/
arch = i686
arch = x86_64
@@ -17,16 +15,19 @@ pkgbase = mutt-sidebar
optdepends = smtp-forwarder: to send mail
provides = mutt
conflicts = mutt
- source = https://bitbucket.org/mutt/mutt/downloads/mutt-1.5.24.tar.gz
+ source = https://bitbucket.org/mutt/mutt/downloads/mutt-1.6.0.tar.gz
source = trash-folder.patch
- source = http://lunar-linux.org/~tchan/mutt/patch-1.5.24.sidebar.20151111.txt
- source = patch-for-first-char-jf.patch
- source = shortpath.patch
- sha512sums = f7fe7edf9d1701a8e92761b1f5e6ef2e3a3b513af7898872cbe36a8800714cb76945788a60d2008820c57bc5344a4147e2686f690da42cfc8a912e3a432452b1
+ source = sidebar.patch
+ source = sidebar-delimnullwide.patch
+ source = sidebar-newonly.patch
+ source = sidebar-compose.patch
+ validpgpkeys = 8975A9B33AA37910385C5308ADEF768480316BDA
+ sha512sums = 601d5f70c7cd30903799714cd85b80f9650a029e621d044075e123656411dde809d5cef24a40ba49860bc242cf4a0b914c703deb5a7125b3a24eeb93f4ae3c4c
sha512sums = 13f2f6402d3bb407d5e0a04049f7be27c9dbc0ccb9681fe7640d060cc3c13d76a8cf9985da8daa680058603b317f9dbf1b2125aa9e103c625add0d8d530b2538
- sha512sums = 2e622a34a1d101fe9370cc015b8253492d1649fcb593c6f9cbf6eb3b54119eaca836114dc4e3da83bc8fd9de434503c7d2295981a68dc05fd8e710925e2b1f77
- sha512sums = 16ba918a8d5ef091cd7556e97189b43a0afdc1fc23a8bb9ece6a97281223090a5e680886233d2aa52e5340c402d19c68801b51eec13ae61cd8d301418470f11d
- sha512sums = 9fe87a338090ac53856893f3392a6f94d5a855cff1338fb6d1a0ef8774e57b20e6a75212b43c266066fbaae7ff21978c8437aee2e601a20eaccadf6cb1425397
+ sha512sums = 636309d514834c16ae51691aec757d35fb999404fd29ad41f80bd70f9b9370cb74a2ee84000599ffbd6f197a5316a89567ced9ac6dedaf6270b9aa4fbc90be71
+ sha512sums = defb96553dd26e7909ec06964729217c75a1bbb88bb00b6c4a07703b4c64952d06bfe1cd9f1c1aa9a6bf6cfbc5b0cc3933002387ca3b55b6399b1445474bd929
+ sha512sums = b0f9184564eb75c36c3f807a7088f2c83a72fcfc1b91feed94919e98bbbbcc74fb07776d730871ca4caa87a044fbd00f906dfbb1928b8fd5f23d1526d6375dbd
+ sha512sums = c7c1df28937b64777e66ef86a198bb168532093066c00c8aa349d76aa7a7d7f799fcc1fe0d7eb5e59a73223a43cdb4c38ab1881d644fd5ae5467844f44cb2dd9
pkgname = mutt-sidebar
diff --git a/PKGBUILD b/PKGBUILD
index dcb4c8cdbc06..d66dc4db177e 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -3,8 +3,8 @@
# Contributor: Gaetan Bisson <bisson@archlinux.org>
pkgname=mutt-sidebar
-pkgver=1.5.24
-pkgrel=10
+pkgver=1.6.0
+pkgrel=1
pkgdesc='Small but very powerful text-based mail client'
arch=('i686' 'x86_64' 'armv7h' 'armv7l')
url='http://www.mutt.org/'
@@ -15,9 +15,12 @@ conflicts=('mutt')
provides=('mutt')
source=("https://bitbucket.org/mutt/mutt/downloads/mutt-${pkgver}.tar.gz"
"trash-folder.patch"
- "http://lunar-linux.org/~tchan/mutt/patch-1.5.24.sidebar.20151111.txt"
- "patch-for-first-char-jf.patch"
- "shortpath.patch")
+ "sidebar.patch"
+ "sidebar-delimnullwide.patch"
+ "sidebar-newonly.patch"
+ "sidebar-compose.patch"
+ )
+validpgpkeys=('8975A9B33AA37910385C5308ADEF768480316BDA')
prepare() {
cd "$srcdir/mutt-$pkgver"
@@ -27,13 +30,10 @@ prepare() {
patch -Np1 -i "$srcdir"/trash-folder.patch
# patch to add sidebar support
- patch -Np1 -i "$srcdir"/patch-1.5.24.sidebar.20151111.txt
-
- # patch for first char in mailboxdir
- patch -i "$srcdir"/patch-for-first-char-jf.patch
-
- # patch to fix shortpath
- patch -i "$srcdir"/shortpath.patch
+ patch -p 1 -i "$srcdir"/sidebar.patch
+ patch -p 1 -i "$srcdir"/sidebar-delimnullwide.patch
+ patch -p 1 -i "$srcdir"/sidebar-newonly.patch
+ patch -p 1 -i "$srcdir"/sidebar-compose.patch
# fix automake issue
autoreconf -vfi
@@ -60,9 +60,9 @@ package() {
rm "$pkgdir"/usr/bin/{flea,muttbug}
rm "$pkgdir"/usr/share/man/man1/{flea,muttbug}.1
}
-
-sha512sums=('f7fe7edf9d1701a8e92761b1f5e6ef2e3a3b513af7898872cbe36a8800714cb76945788a60d2008820c57bc5344a4147e2686f690da42cfc8a912e3a432452b1'
+sha512sums=('601d5f70c7cd30903799714cd85b80f9650a029e621d044075e123656411dde809d5cef24a40ba49860bc242cf4a0b914c703deb5a7125b3a24eeb93f4ae3c4c'
'13f2f6402d3bb407d5e0a04049f7be27c9dbc0ccb9681fe7640d060cc3c13d76a8cf9985da8daa680058603b317f9dbf1b2125aa9e103c625add0d8d530b2538'
- '2e622a34a1d101fe9370cc015b8253492d1649fcb593c6f9cbf6eb3b54119eaca836114dc4e3da83bc8fd9de434503c7d2295981a68dc05fd8e710925e2b1f77'
- '16ba918a8d5ef091cd7556e97189b43a0afdc1fc23a8bb9ece6a97281223090a5e680886233d2aa52e5340c402d19c68801b51eec13ae61cd8d301418470f11d'
- '9fe87a338090ac53856893f3392a6f94d5a855cff1338fb6d1a0ef8774e57b20e6a75212b43c266066fbaae7ff21978c8437aee2e601a20eaccadf6cb1425397')
+ '636309d514834c16ae51691aec757d35fb999404fd29ad41f80bd70f9b9370cb74a2ee84000599ffbd6f197a5316a89567ced9ac6dedaf6270b9aa4fbc90be71'
+ 'defb96553dd26e7909ec06964729217c75a1bbb88bb00b6c4a07703b4c64952d06bfe1cd9f1c1aa9a6bf6cfbc5b0cc3933002387ca3b55b6399b1445474bd929'
+ 'b0f9184564eb75c36c3f807a7088f2c83a72fcfc1b91feed94919e98bbbbcc74fb07776d730871ca4caa87a044fbd00f906dfbb1928b8fd5f23d1526d6375dbd'
+ 'c7c1df28937b64777e66ef86a198bb168532093066c00c8aa349d76aa7a7d7f799fcc1fe0d7eb5e59a73223a43cdb4c38ab1881d644fd5ae5467844f44cb2dd9')
diff --git a/patch-for-first-char-jf.patch b/patch-for-first-char-jf.patch
deleted file mode 100644
index 0159718db889..000000000000
--- a/patch-for-first-char-jf.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- sidebar.c.orig 2014-04-15 19:54:06.977669530 +0200
-+++ sidebar.c 2014-04-15 19:54:59.739045269 +0200
-@@ -310,7 +310,7 @@
- /* calculate depth of current folder and generate its display name with indented spaces */
- int sidebar_folder_depth = 0;
- char *sidebar_folder_name;
-- sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir) + 1);
-+ sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir));
- if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) {
- char *tmp_folder_name;
- int i;
diff --git a/shortpath.patch b/shortpath.patch
deleted file mode 100644
index f829f2c7047c..000000000000
--- a/shortpath.patch
+++ /dev/null
@@ -1,31 +0,0 @@
---- sidebar.c.orig 2014-12-18 23:35:50.589683928 +0000
-+++ sidebar.c 2014-12-18 23:30:40.680566728 +0000
-@@ -313,6 +313,8 @@
- sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir));
- if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) {
- char *tmp_folder_name;
-+ char *tmp_folder_name_dot;
-+ char *tmp_folder_name_slash;
- int i;
- tmp_folder_name = tmp->path + strlen(Maildir) + 1;
- for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) {
-@@ -320,11 +322,15 @@
- }
- if (sidebar_folder_depth > 0) {
- if (option(OPTSIDEBARSHORTPATH)) {
-- tmp_folder_name = strrchr(tmp->path, '.');
-- if (tmp_folder_name == NULL)
-+ tmp_folder_name_dot = strrchr(tmp->path, '.');
-+ tmp_folder_name_slash = strrchr(tmp->path, '/');
-+
-+ if (tmp_folder_name_dot == NULL && tmp_folder_name_slash == NULL)
- tmp_folder_name = mutt_basename(tmp->path);
-- else
-- tmp_folder_name++;
-+ else if (tmp_folder_name_dot > tmp_folder_name_slash)
-+ tmp_folder_name = tmp_folder_name_dot + 1;
-+ else
-+ tmp_folder_name = tmp_folder_name_slash + 1;
- }
- else
- tmp_folder_name = tmp->path + strlen(Maildir) + 1;
diff --git a/sidebar-compose.patch b/sidebar-compose.patch
index 90d815b841d7..225139239137 100644
--- a/sidebar-compose.patch
+++ b/sidebar-compose.patch
@@ -12,14 +12,12 @@ Can be tested with:
HOME=/ LC_ALL=C mutt -e 'unset sidebar_visible' -s test recipient
Closes: #502627
-
-Gbp-Pq: Topic mutt-patched
---
compose.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/compose.c b/compose.c
-index b63695f..0fa6df2 100644
+index 7ff2996..42bdb46 100644
--- a/compose.c
+++ b/compose.c
@@ -32,6 +32,7 @@
diff --git a/sidebar-delimnullwide.patch b/sidebar-delimnullwide.patch
index 11d2ced5a0c0..cd684020b236 100644
--- a/sidebar-delimnullwide.patch
+++ b/sidebar-delimnullwide.patch
@@ -1,5 +1,5 @@
-From: Evgeni Golov <sargentd@die-welt.net>
-Date: Wed, 5 Mar 2014 17:46:07 +0100
+From: Evgeni Golov <evgeni@debian.org>
+Date: Fri, 25 Dec 2015 12:02:08 +0100
Subject: sidebar-delimnullwide
SidebarDelim can be NULL and strlen(NULL) is a bad idea, as it will segfault.
@@ -8,26 +8,32 @@ Wrap it with NONULL().
While at it, change strlen to mbstowcs for better utf8 support.
Closes: #696145, #663883
-
-Gbp-Pq: Topic mutt-patched
---
- sidebar.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ sidebar.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/sidebar.c b/sidebar.c
-index 51a25ca..c3ea338 100644
+index e9d9eba..b75a0e3 100644
--- a/sidebar.c
+++ b/sidebar.c
-@@ -88,7 +88,7 @@ char *make_sidebar_entry(char *box, int size, int new, int flagged)
- int box_len, box_bytes;
- int int_len;
- int right_offset = 0;
-- int delim_len = strlen(SidebarDelim);
-+ int delim_len = mbstowcs(NULL, NONULL(SidebarDelim), 0);
- static char *entry;
+@@ -30,6 +30,7 @@
+ #include <libgen.h>
+ #include "keymap.h"
+ #include <stdbool.h>
++#include <wchar.h>
+
+ /*BUFFY *CurBuffy = 0;*/
+ static BUFFY *TopBuffy = 0;
+@@ -150,7 +151,7 @@ char *make_sidebar_entry(char *box, unsigned int size, unsigned int new, unsigne
+ struct sidebar_entry sbe;
+ int SBvisual;
+
+- SBvisual = SidebarWidth - strlen(SidebarDelim);
++ SBvisual = SidebarWidth - mbstowcs(NULL, NONULL(SidebarDelim), 0);
+ if (SBvisual < 1)
+ return NULL;
- right_width = left_width = 0;
-@@ -178,7 +178,7 @@ int draw_sidebar(int menu) {
+@@ -193,7 +194,7 @@ int draw_sidebar(int menu) {
#ifndef USE_SLANG_CURSES
attr_t attrs;
#endif
diff --git a/sidebar-dotpathsep.patch b/sidebar-dotpathsep.patch
deleted file mode 100644
index 315fa1649bcf..000000000000
--- a/sidebar-dotpathsep.patch
+++ /dev/null
@@ -1,98 +0,0 @@
-From: Fabian Groffen <grobian@gentoo.org>
-Date: Tue, 4 Mar 2014 21:12:15 +0100
-Subject: sidebar-dotpathsep
-
-Make path separators for sidebar folders configurable.
-
-When using IMAP, a '.' is often used as path separator, hence make the
-path separators configurable through sidebar_delim_chars variable.
-It defaults to "/." to work for both mboxes as well as IMAP folders. It
-can be set to only "/" or "." or whichever character desired as needed.
-
-Gbp-Pq: Topic mutt-patched
----
- globals.h | 1 +
- init.h | 8 ++++++++
- sidebar.c | 31 ++++++++++++++++++++++++-------
- 3 files changed, 33 insertions(+), 7 deletions(-)
-
-diff --git a/globals.h b/globals.h
-index 004c795..602f932 100644
---- a/globals.h
-+++ b/globals.h
-@@ -119,6 +119,7 @@ WHERE char *SendCharset;
- WHERE char *Sendmail;
- WHERE char *Shell;
- WHERE char *SidebarDelim;
-+WHERE char *SidebarDelimChars INITVAL (NULL);
- WHERE char *Signature;
- WHERE char *SimpleSearch;
- #if USE_SMTP
-diff --git a/init.h b/init.h
-index c664e5f..166671b 100644
---- a/init.h
-+++ b/init.h
-@@ -2051,6 +2051,14 @@ struct option_t MuttVars[] = {
- ** .pp
- ** The width of the sidebar.
- */
-+ { "sidebar_delim_chars", DT_STR, R_NONE, UL &SidebarDelimChars, UL "/." },
-+ /*
-+ ** .pp
-+ ** This contains the list of characters which you would like to treat
-+ ** as folder separators for displaying paths in the sidebar. If
-+ ** you're not using IMAP folders, you probably prefer setting this to "/"
-+ ** alone.
-+ */
- { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0},
- /*
- ** .pp
-diff --git a/sidebar.c b/sidebar.c
-index 6098c2a..4356ffc 100644
---- a/sidebar.c
-+++ b/sidebar.c
-@@ -249,20 +249,37 @@ int draw_sidebar(int menu) {
- // calculate depth of current folder and generate its display name with indented spaces
- int sidebar_folder_depth = 0;
- char *sidebar_folder_name;
-- sidebar_folder_name = basename(tmp->path);
-+ int i;
-+ sidebar_folder_name = tmp->path;
-+ /* disregard a trailing separator, so strlen() - 2
-+ * https://bugs.gentoo.org/show_bug.cgi?id=373197#c16 */
-+ for (i = strlen(sidebar_folder_name) - 2; i >= 0; i--) {
-+ if (SidebarDelimChars &&
-+ strchr(SidebarDelimChars, sidebar_folder_name[i]))
-+ {
-+ sidebar_folder_name += i + 1;
-+ break;
-+ }
-+ }
- if ( maildir_is_prefix ) {
- char *tmp_folder_name;
-- int i;
-+ int lastsep = 0;
- 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++;
-- }
-+ for (i = 0; i < strlen(tmp_folder_name) - 1; i++) {
-+ if (SidebarDelimChars &&
-+ strchr(SidebarDelimChars, tmp_folder_name[i]))
-+ {
-+ sidebar_folder_depth++;
-+ lastsep = i + 1;
-+ }
-+ }
- if (sidebar_folder_depth > 0) {
-- sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1);
-+ tmp_folder_name += lastsep; /* basename */
-+ sidebar_folder_name = malloc(strlen(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, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth);
-+ strncat(sidebar_folder_name, tmp_folder_name, strlen(tmp_folder_name) + sidebar_folder_depth);
- }
- }
- printw( "%.*s", SidebarWidth - delim_len + 1,
diff --git a/sidebar-new.patch b/sidebar-new.patch
deleted file mode 100644
index fb2653463611..000000000000
--- a/sidebar-new.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From 355399bde98203af59d20821f9e840fc056bd383 Mon Sep 17 00:00:00 2001
-From: Julius Haertl <jus@bitgrid.net>
-Date: Tue, 9 Sep 2014 22:31:49 +0200
-Subject: Patch for sidebar iteration functionality
-
-sidebar-new will move the selected folder to the next with new messages.
-If the end is reached, it will start at the top.
-
-Useful macros would be:
-
- macro index <esc>a "<sidebar-new><sidebar-open>"
- macro pager <esc>a "<exit><sidebar-new><sidebar-open>"
----
- OPS | 1 +
- curs_main.c | 1 +
- functions.h | 2 ++
- pager.c | 1 +
- sidebar.c | 10 ++++++++++
- 5 files changed, 15 insertions(+)
-
-diff --git a/OPS b/OPS
-index 1ed9c96..3ffb82a 100644
---- a/OPS
-+++ b/OPS
-@@ -187,3 +187,4 @@ OP_SIDEBAR_PREV "go to previous mailbox"
- OP_SIDEBAR_OPEN "open hilighted mailbox"
- OP_SIDEBAR_NEXT_NEW "go down to next mailbox with new mail"
- OP_SIDEBAR_PREV_NEW "go to previous mailbox with new mail"
-+OP_SIDEBAR_NEW "iterate though mailboxes with new mail"
-diff --git a/curs_main.c b/curs_main.c
-index acb106d..2e35f90 100644
---- a/curs_main.c
-+++ b/curs_main.c
-@@ -2328,6 +2328,7 @@ int mutt_index_menu (void)
- case OP_SIDEBAR_PREV:
- case OP_SIDEBAR_NEXT_NEW:
- case OP_SIDEBAR_PREV_NEW:
-+ case OP_SIDEBAR_NEW:
- scroll_sidebar(op, menu->menu);
- break;
- default:
-diff --git a/functions.h b/functions.h
-index 363b4d5..1485080 100644
---- a/functions.h
-+++ b/functions.h
-@@ -176,6 +176,7 @@ const struct binding_t OpMain[] = { /* map: index */
- { "sidebar-prev", OP_SIDEBAR_PREV, NULL },
- { "sidebar-next-new", OP_SIDEBAR_NEXT_NEW, NULL},
- { "sidebar-prev-new", OP_SIDEBAR_PREV_NEW, NULL},
-+ { "sidebar-new", OP_SIDEBAR_NEW, NULL },
- { "sidebar-open", OP_SIDEBAR_OPEN, NULL },
- { NULL, 0, NULL }
- };
-@@ -287,6 +288,7 @@ const struct binding_t OpPager[] = { /* map: pager */
- { "sidebar-prev", OP_SIDEBAR_PREV, NULL },
- { "sidebar-next-new", OP_SIDEBAR_NEXT_NEW, NULL},
- { "sidebar-prev-new", OP_SIDEBAR_PREV_NEW, NULL},
-+ { "sidebar-new", OP_SIDEBAR_NEW, NULL },
- { "sidebar-open", OP_SIDEBAR_OPEN, NULL },
- { NULL, 0, NULL }
- };
-diff --git a/pager.c b/pager.c
-index 8d64fe1..696e55c 100644
---- a/pager.c
-+++ b/pager.c
-@@ -2791,6 +2791,7 @@ search_next:
- case OP_SIDEBAR_PREV:
- case OP_SIDEBAR_NEXT_NEW:
- case OP_SIDEBAR_PREV_NEW:
-+ case OP_SIDEBAR_NEW:
- scroll_sidebar(ch, MENU_PAGER);
- break;
-
-diff --git a/sidebar.c b/sidebar.c
-index c3ea338..eb8ecd2 100644
---- a/sidebar.c
-+++ b/sidebar.c
-@@ -429,6 +429,16 @@ void scroll_sidebar(int op, int menu)
- CurBuffy = CurBuffy->next;
- }
- break;
-+ case OP_SIDEBAR_NEW:
-+ if ( (tmp = exist_next_new()) == NULL)
-+ tmp = TopBuffy;
-+ if ( tmp->msg_unread == 0 ) {
-+ CurBuffy = tmp;
-+ tmp = exist_next_new();
-+ }
-+ if ( tmp != NULL )
-+ CurBuffy = tmp;
-+ break;
- default:
- return;
- }
---
-2.6.0.rc0.2.g7662973.dirty
-
diff --git a/sidebar-newonly.patch b/sidebar-newonly.patch
index d206848026b6..2219c0ae4f97 100644
--- a/sidebar-newonly.patch
+++ b/sidebar-newonly.patch
@@ -5,17 +5,15 @@ Subject: sidebar-newonly
patches written by Steve Kemp, it adds two new functionalities to the sidebar,
so only the mailbox with new messages will be shown (and/or) selected
See Debian bug http://bugs.debian.org/532510
-
-Gbp-Pq: Topic mutt-patched
---
OPS | 2 ++
curs_main.c | 2 ++
functions.h | 4 ++++
- init.h | 5 +++++
+ init.h | 6 +++++-
mutt.h | 2 ++
pager.c | 2 ++
sidebar.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
- 7 files changed, 70 insertions(+), 2 deletions(-)
+ 7 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/OPS b/OPS
index b036db9..1ed9c96 100644
@@ -28,10 +26,10 @@ index b036db9..1ed9c96 100644
+OP_SIDEBAR_NEXT_NEW "go down to next mailbox with new mail"
+OP_SIDEBAR_PREV_NEW "go to previous mailbox with new mail"
diff --git a/curs_main.c b/curs_main.c
-index ea530a6..acb106d 100644
+index 7583eba..3ad22c4 100644
--- a/curs_main.c
+++ b/curs_main.c
-@@ -2326,6 +2326,8 @@ int mutt_index_menu (void)
+@@ -2429,6 +2429,8 @@ int mutt_index_menu (void)
case OP_SIDEBAR_SCROLL_DOWN:
case OP_SIDEBAR_NEXT:
case OP_SIDEBAR_PREV:
@@ -63,13 +61,14 @@ index ef8937a..363b4d5 100644
{ NULL, 0, NULL }
};
diff --git a/init.h b/init.h
-index 166671b..a5d4238 100644
+index 2e7371c..b7aff80 100644
--- a/init.h
+++ b/init.h
-@@ -2059,6 +2059,11 @@ struct option_t MuttVars[] = {
- ** you're not using IMAP folders, you probably prefer setting this to "/"
- ** alone.
+@@ -2108,7 +2108,11 @@ struct option_t MuttVars[] = {
+ ** .pp
+ ** Should folders be indented in the sidebar.
*/
+-
+ {"sidebar_newmail_only", DT_BOOL, R_BOTH, OPTSIDEBARNEWMAILONLY, 0 },
+ /*
+ ** .pp
@@ -79,12 +78,12 @@ index 166671b..a5d4238 100644
/*
** .pp
diff --git a/mutt.h b/mutt.h
-index 5f25406..d73e514 100644
+index 91e58e9..2a9f1e0 100644
--- a/mutt.h
+++ b/mutt.h
-@@ -529,6 +529,8 @@ enum
+@@ -538,6 +538,8 @@ enum
OPTDONTHANDLEPGPKEYS, /* (pseudo) used to extract PGP keys */
- OPTUNBUFFEREDINPUT, /* (pseudo) don't use key buffer */
+ OPTIGNOREMACROEVENTS, /* (pseudo) don't process macro/push/exec events while set */
+ OPTSIDEBARNEWMAILONLY,
+
@@ -92,10 +91,10 @@ index 5f25406..d73e514 100644
};
diff --git a/pager.c b/pager.c
-index 5cfcb75..8d64fe1 100644
+index 676fd39..9a2b269 100644
--- a/pager.c
+++ b/pager.c
-@@ -2789,6 +2789,8 @@ search_next:
+@@ -2808,6 +2808,8 @@ search_next:
case OP_SIDEBAR_SCROLL_DOWN:
case OP_SIDEBAR_NEXT:
case OP_SIDEBAR_PREV:
@@ -105,10 +104,10 @@ index 5cfcb75..8d64fe1 100644
break;
diff --git a/sidebar.c b/sidebar.c
-index 8f58f85..51a25ca 100644
+index b75a0e3..c298599 100644
--- a/sidebar.c
+++ b/sidebar.c
-@@ -269,8 +269,21 @@ int draw_sidebar(int menu) {
+@@ -297,8 +297,21 @@ int draw_sidebar(int menu) {
SETCOLOR(MT_COLOR_NEW);
else if ( tmp->msg_flagged > 0 )
SETCOLOR(MT_COLOR_FLAGGED);
@@ -131,8 +130,8 @@ index 8f58f85..51a25ca 100644
+ }
move( lines, 0 );
- if ( Context && !strcmp( tmp->path, Context->path ) ) {
-@@ -336,6 +349,29 @@ int draw_sidebar(int menu) {
+ if ( Context && Context->path &&
+@@ -358,6 +371,29 @@ int draw_sidebar(int menu) {
return 0;
}
@@ -162,7 +161,7 @@ index 8f58f85..51a25ca 100644
void set_buffystats(CONTEXT* Context)
{
-@@ -352,18 +388,33 @@ void set_buffystats(CONTEXT* Context)
+@@ -376,18 +412,33 @@ void set_buffystats(CONTEXT* Context)
void scroll_sidebar(int op, int menu)
{
diff --git a/sidebar-utf8.patch b/sidebar-utf8.patch
deleted file mode 100644
index d67e43c24b6e..000000000000
--- a/sidebar-utf8.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-From: Antonio Radici <antonio@debian.org>
-Date: Tue, 4 Mar 2014 15:39:14 +0100
-Subject: sidebar-utf8
-
-This patch fixes a problem with utf-8 strings and the sidebar,
-it rewrites entirely make_sidebar_entry so it also fixes some
-segfaults due to misallocations and overflows.
-
-See:
- http://bugs.debian.org/584581
- http://bugs.debian.org/603287
-
-Gbp-Pq: Topic mutt-patched
----
- sidebar.c | 97 +++++++++++++++++++++++++++++++++++++++++++--------------------
- 1 file changed, 67 insertions(+), 30 deletions(-)
-
-diff --git a/sidebar.c b/sidebar.c
-index 4356ffc..8f58f85 100644
---- a/sidebar.c
-+++ b/sidebar.c
-@@ -30,6 +30,7 @@
- #include <libgen.h>
- #include "keymap.h"
- #include <stdbool.h>
-+#include <wchar.h>
-
- /*BUFFY *CurBuffy = 0;*/
- static BUFFY *TopBuffy = 0;
-@@ -82,36 +83,72 @@ void calc_boundaries (int menu)
-
- 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;
-+ char int_store[20]; // up to 64 bits integers
-+ int right_width, left_width;
-+ int box_len, box_bytes;
-+ int int_len;
-+ int right_offset = 0;
-+ int delim_len = strlen(SidebarDelim);
-+ static char *entry;
-+
-+ right_width = left_width = 0;
-+ box_len = box_bytes = 0;
-+
-+ // allocate an entry big enough to contain SidebarWidth wide chars
-+ entry = malloc((SidebarWidth*4)+1); // TODO: error check
-+
-+ // determine the right space (i.e.: how big are the numbers that we want to print)
-+ if ( size > 0 ) {
-+ int_len = snprintf(int_store, sizeof(int_store), "%d", size);
-+ right_width += int_len;
-+ } else {
-+ right_width = 1; // to represent 0
-+ }
-+ if ( new > 0 ) {
-+ int_len = snprintf(int_store, sizeof(int_store), "%d", new);
-+ right_width += int_len + 2; // 2 is for ()
-+ }
-+ if ( flagged > 0 ) {
-+ int_len = snprintf(int_store, sizeof(int_store), "%d", flagged);
-+ right_width += int_len + 2; // 2 is for []
-+ }
-+
-+ // determine how much space we have for *box and its padding (if any)
-+ left_width = SidebarWidth - right_width - 1 - delim_len; // 1 is for the space
-+ //fprintf(stdout, "left_width: %d right_width: %d\n", left_width, right_width);
-+ // right side overflow case
-+ if ( left_width <= 0 ) {
-+ snprintf(entry, SidebarWidth*4, "%-*.*s ...", SidebarWidth-4-delim_len, SidebarWidth-4-delim_len, box);
-+ return entry;
-+ }
-+ right_width -= delim_len;
-+
-+ // to support utf-8 chars we need to add enough space padding in case there
-+ // are less chars than bytes in *box
-+ box_len = mbstowcs(NULL, box, 0);
-+ box_bytes = strlen(box);
-+ // debug
-+ //fprintf(stdout, "box_len: %d box_bytes: %d (diff: %d)\n", box_len, box_bytes, (box_bytes-box_len));
-+ // if there is less string than the space we allow, then we will add the
-+ // spaces
-+ if ( box_len != -1 && box_len < left_width ) {
-+ left_width += (box_bytes - box_len);
-+ }
-+ // otherwise sprintf will truncate the string for us (therefore, no else case)
-+
-+ // print the sidebar entry (without new and flagged messages, at the moment)
-+ //fprintf(stdout, "left_width: %d right_width: %d\n", left_width, right_width);
-+ right_offset = snprintf(entry, SidebarWidth*4, "%-*.*s %d", left_width, left_width, box, size);
-+
-+ // then pad new and flagged messages if any
-+ if ( new > 0 ) {
-+ right_offset += snprintf(entry+right_offset, SidebarWidth*4-right_offset, "(%d)", new);
-+ }
-+ if ( flagged > 0 ) {
-+ right_offset += snprintf(entry+right_offset, SidebarWidth*4-right_offset, "[%d]", flagged);
-+ }
-+
-+ return entry;
- }
-
- void set_curbuffy(char buf[LONG_STRING])
diff --git a/sidebar.patch b/sidebar.patch
index 262e8f98a65a..54bb94eb4320 100644
--- a/sidebar.patch
+++ b/sidebar.patch
@@ -1,5 +1,5 @@
From: Antonio Radici <antonio@debian.org>
-Date: Tue, 4 Mar 2014 15:21:10 +0100
+Date: Sat, 19 Sep 2015 13:19:55 +0200
Subject: sidebar
When enabled, mutt will show a list of mailboxes with (new) message counts in a
@@ -15,17 +15,43 @@ in the "mutt-patched" package.
This specifies the delimiter between the sidebar (if visible) and
other screens.
+ sidebar_folderindent (boolean, default no)
+
+ Should folders be indented in the sidebar.
+
+ sidebar_format (string, default "%B%?F? [%F]?%* %?N?%N/?%4S")
+
+ 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_indentstr (string, default " ")
+
+ This specifies the string that is used to indent items
+ with sidebar_folderindent= yes
+
+ sidebar_shortpath (boolean, default no)
+
+ Should the sidebar shorten the path showed.
+
+ sidebar_sort (boolean, default no)
+
+ This specifies whether or not to sort the sidebar alphabetically.
+
sidebar_visible (boolean, default no)
This specifies whether or not to show sidebar (left-side list of folders).
sidebar_width (integer, default 0)
--
+
The width of the sidebar.
* Patch source:
- - http://www.lunar-linux.org/index.php?page=mutt-sidebar
- - http://lunar-linux.org/~tchan/mutt/patch-1.5.19.sidebar.20090522.txt
+ - http://www.lunar-linux.org/mutt-sidebar/
+ - http://lunar-linux.org/~tchan/mutt/patch-1.5.24.sidebar.20151111.txt
* Changes made:
- 2008-08-02 myon: Refreshed patch using quilt push -f to remove hunks we do
@@ -35,42 +61,49 @@ in the "mutt-patched" package.
Source:
ftp://ftp.openbsd.org/pub/OpenBSD/distfiles/mutt/sidebar-1.5.22.diff1.gz
-Signed-off-by: Matteo F. Vescovi <mfvescovi@gmail.com>
-Signed-off-by: Evgeni Golov <evgeni@debian.org>
+ - 2015-12-24 evgeni: refresh sidebar patch to the 20151111 version
-Gbp-Pq: Topic mutt-patched
+Signed-off-by: Evgeni Golov <evgeni@debian.org>
+Signed-off-by: Matteo F. Vescovi <mfv@debian.org>
---
Makefile.am | 1 +
OPS | 5 +
- buffy.c | 124 +++++++++++++++++++++
- buffy.h | 4 +
+ buffy.c | 152 ++++++++++++++++++++-
+ buffy.h | 6 +
color.c | 2 +
- compose.c | 26 ++---
- curs_main.c | 30 +++++-
+ compose.c | 26 ++--
+ configure.ac | 2 +
+ curs_main.c | 37 +++++-
+ doc/Muttrc | 20 +++
flags.c | 3 +
functions.h | 10 ++
- globals.h | 4 +
- imap/command.c | 7 ++
+ globals.h | 6 +
+ handler.c | 30 ++++-
+ imap/command.c | 7 +
imap/imap.c | 2 +-
- init.h | 21 ++++
+ init.h | 48 +++++++
mailbox.h | 1 +
+ main.c | 11 +-
mbox.c | 2 +
- menu.c | 20 ++--
- mh.c | 22 ++++
- mutt.h | 4 +
+ menu.c | 20 +--
+ mh.c | 26 ++++
+ mutt.h | 6 +
mutt_curses.h | 3 +
- muttlib.c | 48 +++++++++
- mx.c | 15 +++
+ mutt_menu.h | 1 +
+ muttlib.c | 48 +++++++
+ mx.c | 24 +++-
mx.h | 1 +
- pager.c | 30 ++++--
- sidebar.c | 333 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- sidebar.h | 36 +++++++
- 25 files changed, 720 insertions(+), 34 deletions(-)
+ pager.c | 42 +++++-
+ pattern.c | 38 ++++++
+ protos.h | 7 +
+ sidebar.c | 410 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ sidebar.h | 36 +++++
+ 32 files changed, 992 insertions(+), 41 deletions(-)
create mode 100644 sidebar.c
create mode 100644 sidebar.h
diff --git a/Makefile.am b/Makefile.am
-index 5dfeff6..cf1ac98 100644
+index 9475381..c593f4f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -33,6 +33,7 @@ mutt_SOURCES = \
@@ -78,7 +111,7 @@ index 5dfeff6..cf1ac98 100644
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 \
+ muttlib.c editmsg.c mbyte.c mutt_idna.c \
url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c
diff --git a/OPS b/OPS
@@ -95,7 +128,7 @@ index 02cea8e..b036db9 100644
+OP_SIDEBAR_PREV "go to previous mailbox"
+OP_SIDEBAR_OPEN "open hilighted mailbox"
diff --git a/buffy.c b/buffy.c
-index 12a16d1..90ca6db 100644
+index c713d16..d34e6f5 100644
--- a/buffy.c
+++ b/buffy.c
@@ -161,6 +161,49 @@ void mutt_buffy_cleanup (const char *buf, struct stat *st)
@@ -148,7 +181,32 @@ index 12a16d1..90ca6db 100644
BUFFY *mutt_find_mailbox (const char *path)
{
BUFFY *tmp = NULL;
-@@ -282,6 +325,7 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e
+@@ -196,9 +239,13 @@ void mutt_update_mailbox (BUFFY * b)
+ 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,8 +290,8 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e
+ 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)
++ 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,6 +329,7 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e
else
(*tmp)->size = 0;
}
@@ -156,90 +214,122 @@ index 12a16d1..90ca6db 100644
return 0;
}
-@@ -357,6 +401,69 @@ static int buffy_maildir_hasnew (BUFFY* mailbox)
+@@ -306,6 +354,11 @@ static int buffy_maildir_dir_hasnew(BUFFY* mailbox, const char *dir_name)
+ return 0;
+ }
+
++ if (option(OPTSIDEBAR) && mailbox->msg_unread > 0) {
++ mailbox->new = 1;
++ return 1;
++ }
++
+ if ((dirp = opendir (path)) == NULL)
+ {
+ mailbox->magic = 0;
+@@ -357,6 +410,73 @@ static int buffy_maildir_hasnew (BUFFY* mailbox)
return 0;
}
-+
-+/* update message counts for the sidebar */
++
++ /* 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++;
-+ }
-+ }
-+ }
-+ }
++ 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++;
++ }
++ }
++ }
++ }
+
-+ closedir (dirp);
++ 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)
{
-@@ -388,6 +495,20 @@ static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb)
+@@ -368,7 +488,7 @@ static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb)
+ 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(OPTSIDEBAR) && statcheck) || (option(OPTSIDEBAR) && mailbox->msg_unread > 0))
+ {
+ if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited)
+ {
+@@ -388,6 +508,27 @@ static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb)
return rc;
}
+/* update message counts for the sidebar */
-+void buffy_mbox_update (BUFFY* mailbox)
++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);
+ }
+}
@@ -247,11 +337,11 @@ index 12a16d1..90ca6db 100644
int mutt_buffy_check (int force)
{
BUFFY *tmp;
-@@ -461,16 +582,19 @@ int mutt_buffy_check (int force)
+@@ -461,17 +602,20 @@ int mutt_buffy_check (int force)
{
case M_MBOX:
case M_MMDF:
-+ buffy_mbox_update (tmp);
++ buffy_mbox_update (tmp, &sb);
if (buffy_mbox_hasnew (tmp, &sb) > 0)
BuffyCount++;
break;
@@ -263,16 +353,21 @@ index 12a16d1..90ca6db 100644
break;
case M_MH:
-+ mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged);
- mh_buffy(tmp);
+- mh_buffy(tmp);
++ mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged, &tmp->sb_last_checked);
++ mh_buffy(tmp);
if (tmp->new)
BuffyCount++;
+ break;
diff --git a/buffy.h b/buffy.h
-index f9fc55a..672d178 100644
+index 9aa8e51..03c37df 100644
--- a/buffy.h
+++ b/buffy.h
-@@ -25,7 +25,11 @@ typedef struct buffy_t
+@@ -23,13 +23,19 @@
+ 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;
@@ -283,8 +378,13 @@ index f9fc55a..672d178 100644
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;
+
diff --git a/color.c b/color.c
-index 64a46dc..d6f9198 100644
+index 6e29603..3731c37 100644
--- a/color.c
+++ b/color.c
@@ -94,6 +94,8 @@ static const struct mapping_t Fields[] =
@@ -297,7 +397,7 @@ index 64a46dc..d6f9198 100644
};
diff --git a/compose.c b/compose.c
-index 9d87060..b63695f 100644
+index 6af817f..7ff2996 100644
--- a/compose.c
+++ b/compose.c
@@ -72,7 +72,7 @@ enum
@@ -394,7 +494,7 @@ index 9d87060..b63695f 100644
mutt_paddstr (W, buf);
return 0;
-@@ -562,7 +562,7 @@ int mutt_compose_menu (HEADER *msg, /* structure for new message */
+@@ -564,7 +564,7 @@ int mutt_compose_menu (HEADER *msg, /* structure for new message */
if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0)
{
mutt_str_replace (&msg->env->subject, buf);
@@ -403,7 +503,7 @@ index 9d87060..b63695f 100644
if (msg->env->subject)
mutt_paddstr (W, msg->env->subject);
else
-@@ -580,7 +580,7 @@ int mutt_compose_menu (HEADER *msg, /* structure for new message */
+@@ -582,7 +582,7 @@ int mutt_compose_menu (HEADER *msg, /* structure for new message */
{
strfcpy (fcc, buf, fcclen);
mutt_pretty_mailbox (fcc, fcclen);
@@ -412,8 +512,21 @@ index 9d87060..b63695f 100644
mutt_paddstr (W, fcc);
fccSet = 1;
}
+diff --git a/configure.ac b/configure.ac
+index 6c579dd..8c833fa 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1306,6 +1306,8 @@ if test $mutt_cv_langinfo_yesexpr = yes; then
+ AC_DEFINE(HAVE_LANGINFO_YESEXPR,1,[ Define if you have <langinfo.h> and nl_langinfo(YESEXPR). ])
+ fi
+
++AC_CHECK_FUNCS(fmemopen open_memstream)
++
+ dnl Documentation tools
+ have_openjade="no"
+ AC_PATH_PROG([OSPCAT], [ospcat], [none])
diff --git a/curs_main.c b/curs_main.c
-index 9d718ee..ea530a6 100644
+index f418f67..7583eba 100644
--- a/curs_main.c
+++ b/curs_main.c
@@ -26,7 +26,9 @@
@@ -426,7 +539,7 @@ index 9d718ee..ea530a6 100644
#ifdef USE_POP
#include "pop.h"
-@@ -596,8 +598,12 @@ int mutt_index_menu (void)
+@@ -672,20 +674,31 @@ int mutt_index_menu (void)
menu->redraw |= REDRAW_STATUS;
if (do_buffy_notify)
{
@@ -434,35 +547,46 @@ index 9d718ee..ea530a6 100644
- beep ();
+ if (mutt_buffy_notify ())
+ {
-+ menu->redraw |= REDRAW_FULL;
++ menu->redraw |= REDRAW_STATUS;
+ if (option (OPTBEEPNEW))
+ beep ();
+ }
}
else
do_buffy_notify = 1;
-@@ -609,6 +615,7 @@ int mutt_index_menu (void)
+ }
+
++ 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;
}
-@@ -631,9 +638,12 @@ int mutt_index_menu (void)
+ if (menu->menu == MENU_MAIN)
+@@ -707,9 +720,12 @@ int mutt_index_menu (void)
if (menu->redraw & REDRAW_STATUS)
{
-+ DrawFullLine = 1;
++ DrawFullLine = 1;
menu_status_line (buf, sizeof (buf), menu, NONULL (Status));
-+ DrawFullLine = 0;
++ DrawFullLine = 0;
move (option (OPTSTATUSONTOP) ? 0 : LINES-2, 0);
SETCOLOR (MT_COLOR_STATUS);
-+ set_buffystats(Context);
++ set_buffystats(Context);
mutt_paddstr (COLS, buf);
NORMAL_COLOR;
menu->redraw &= ~REDRAW_STATUS;
-@@ -653,7 +663,7 @@ int mutt_index_menu (void)
+@@ -729,7 +745,7 @@ int mutt_index_menu (void)
menu->oldcurrent = -1;
if (option (OPTARROWCURSOR))
@@ -471,7 +595,15 @@ index 9d718ee..ea530a6 100644
else if (option (OPTBRAILLEFRIENDLY))
move (menu->current - menu->top + menu->offset, 0);
else
-@@ -1154,6 +1164,7 @@ int mutt_index_menu (void)
+@@ -1170,6 +1186,7 @@ int mutt_index_menu (void)
+ break;
+
+ CHECK_MSGCOUNT;
++ CHECK_VISIBLE;
+ CHECK_READONLY;
+ {
+ int oldvcount = Context->vcount;
+@@ -1229,6 +1246,7 @@ int mutt_index_menu (void)
menu->redraw = REDRAW_FULL;
break;
@@ -479,7 +611,7 @@ index 9d718ee..ea530a6 100644
case OP_MAIN_CHANGE_FOLDER:
case OP_MAIN_NEXT_UNREAD_MAILBOX:
-@@ -1185,7 +1196,11 @@ int mutt_index_menu (void)
+@@ -1260,7 +1278,11 @@ int mutt_index_menu (void)
{
mutt_buffy (buf, sizeof (buf));
@@ -492,7 +624,7 @@ index 9d718ee..ea530a6 100644
{
if (menu->menu == MENU_PAGER)
{
-@@ -1203,6 +1218,7 @@ int mutt_index_menu (void)
+@@ -1278,6 +1300,7 @@ int mutt_index_menu (void)
}
mutt_expand_path (buf, sizeof (buf));
@@ -500,7 +632,7 @@ index 9d718ee..ea530a6 100644
if (mx_get_magic (buf) <= 0)
{
mutt_error (_("%s is not a mailbox."), buf);
-@@ -2306,6 +2322,12 @@ int mutt_index_menu (void)
+@@ -2402,6 +2425,12 @@ int mutt_index_menu (void)
mutt_what_key();
break;
@@ -513,8 +645,39 @@ index 9d718ee..ea530a6 100644
default:
if (menu->menu == MENU_MAIN)
km_error_key (MENU_MAIN);
+diff --git a/doc/Muttrc b/doc/Muttrc
+index c8689d0..01272c7 100644
+--- a/doc/Muttrc
++++ b/doc/Muttrc
+@@ -657,6 +657,26 @@ attachments -I message/external-body
+ # $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
diff --git a/flags.c b/flags.c
-index 133fa35..48fb287 100644
+index 5309bb7..8776b18 100644
--- a/flags.c
+++ b/flags.c
@@ -22,8 +22,10 @@
@@ -565,18 +728,20 @@ index 26171a0..ef8937a 100644
};
diff --git a/globals.h b/globals.h
-index 282fde3..004c795 100644
+index 241758d..92de9db 100644
--- a/globals.h
+++ b/globals.h
-@@ -118,6 +118,7 @@ WHERE short SearchContext;
+@@ -118,6 +118,9 @@ WHERE short SearchContext;
WHERE char *SendCharset;
WHERE char *Sendmail;
WHERE char *Shell;
+WHERE char *SidebarDelim;
++WHERE char *SidebarFormat;
++WHERE char *SidebarIndentStr;
WHERE char *Signature;
WHERE char *SimpleSearch;
#if USE_SMTP
-@@ -214,6 +215,9 @@ WHERE short ScoreThresholdDelete;
+@@ -215,6 +218,9 @@ WHERE short ScoreThresholdDelete;
WHERE short ScoreThresholdRead;
WHERE short ScoreThresholdFlag;
@@ -586,11 +751,82 @@ index 282fde3..004c795 100644
#ifdef USE_IMAP
WHERE short ImapKeepalive;
WHERE short ImapPipelineDepth;
+diff --git a/handler.c b/handler.c
+index 4944d49..d7fde34 100644
+--- a/handler.c
++++ b/handler.c
+@@ -1603,6 +1603,11 @@ static int run_decode_and_handler (BODY *b, STATE *s, handler_t handler, int pla
+
+ fseeko (s->fpin, b->offset, 0);
+
++#ifdef HAVE_FMEMOPEN
++ char *temp;
++ size_t tempsize;
++#endif
++
+ /* see if we need to decode this part before processing it */
+ if (b->encoding == ENCBASE64 || b->encoding == ENCQUOTEDPRINTABLE ||
+ b->encoding == ENCUUENCODED || plaintext ||
+@@ -1618,6 +1623,14 @@ static int run_decode_and_handler (BODY *b, STATE *s, handler_t handler, int pla
+ {
+ /* 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"));
++ return -1;
++ }
++#else
+ mutt_mktemp (tempfile, sizeof (tempfile));
+ if ((s->fpout = safe_fopen (tempfile, "w")) == NULL)
+ {
+@@ -1625,6 +1638,7 @@ static int run_decode_and_handler (BODY *b, STATE *s, handler_t handler, int pla
+ dprint (1, (debugfile, "Can't open %s.\n", tempfile));
+ return -1;
+ }
++#endif
+ /* decoding the attachment changes the size and offset, so save a copy
+ * of the "real" values now, and restore them after processing
+ */
+@@ -1653,9 +1667,19 @@ static int run_decode_and_handler (BODY *b, STATE *s, handler_t handler, int pla
+ /* 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;
+ }
+@@ -1680,6 +1704,10 @@ static int run_decode_and_handler (BODY *b, STATE *s, handler_t handler, int pla
+
+ /* restore the original source stream */
+ safe_fclose (&s->fpin);
++#ifdef HAVE_FMEMOPEN
++ if(tempsize)
++ FREE(&temp);
++#endif
+ s->fpin = fp;
+ }
+ }
diff --git a/imap/command.c b/imap/command.c
-index 32f8417..d68e3ab 100644
+index d99a99a..5068fca 100644
--- a/imap/command.c
+++ b/imap/command.c
-@@ -1012,6 +1012,13 @@ static void cmd_parse_status (IMAP_DATA* idata, char* s)
+@@ -1016,6 +1016,13 @@ static void cmd_parse_status (IMAP_DATA* idata, char* s)
opened */
status->uidnext = oldun;
@@ -605,12 +841,12 @@ index 32f8417..d68e3ab 100644
return;
}
diff --git a/imap/imap.c b/imap/imap.c
-index f476873..af3ac3d 100644
+index a8476a4..5dab152 100644
--- a/imap/imap.c
+++ b/imap/imap.c
-@@ -1529,7 +1529,7 @@ int imap_buffy_check (int force)
+@@ -1541,7 +1541,7 @@ int imap_buffy_check (int force)
- imap_munge_mbox_name (munged, sizeof (munged), name);
+ imap_munge_mbox_name (idata, munged, sizeof (munged), name);
snprintf (command, sizeof (command),
- "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged);
+ "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged);
@@ -618,19 +854,25 @@ index f476873..af3ac3d 100644
if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0)
{
diff --git a/init.h b/init.h
-index 35224c1..c664e5f 100644
+index 246020b..2e7371c 100644
--- a/init.h
+++ b/init.h
-@@ -2030,6 +2030,27 @@ struct option_t MuttVars[] = {
+@@ -2061,6 +2061,54 @@ struct option_t MuttVars[] = {
** not used.
** (PGP only)
*/
-+ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, "|"},
++ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, UL "|"},
+ /*
+ ** .pp
+ ** This specifies the delimiter between the sidebar (if visible) and
+ ** other screens.
+ */
++ {"sidebar_indentstr", DT_STR, R_BOTH, UL &SidebarIndentStr, UL " "},
++ /*
++ ** .pp
++ ** This specifies the string that is used to indent items
++ ** with sidebar_folderindent= yes
++ */
+ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 },
+ /*
+ ** .pp
@@ -646,6 +888,27 @@ index 35224c1..c664e5f 100644
+ ** .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
@@ -661,8 +924,51 @@ index 2b2c9a1..000503d 100644
/* mx_open_new_message() */
#define M_ADD_FROM (1<<0) /* add a From_ line */
+diff --git a/main.c b/main.c
+index 0b60d85..0e11dc5 100644
+--- a/main.c
++++ b/main.c
+@@ -50,6 +50,7 @@
+ #include <unistd.h>
+ #include <errno.h>
+ #include <sys/stat.h>
++#include <limits.h>
+ #include <sys/utsname.h>
+
+ #ifdef HAVE_GETOPT_H
+@@ -563,7 +564,7 @@ init_extended_keys();
+
+ int main (int argc, char **argv)
+ {
+- char folder[_POSIX_PATH_MAX] = "";
++ char folder[PATH_MAX] = "";
+ char *subject = NULL;
+ char *includeFile = NULL;
+ char *draftFile = NULL;
+@@ -1204,6 +1205,13 @@ int main (int argc, char **argv)
+ 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);
+
+@@ -1226,6 +1234,7 @@ int main (int argc, char **argv)
+ 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);
diff --git a/mbox.c b/mbox.c
-index 6d3b6bd..fa82eb3 100644
+index 9ff8512..e2818a5 100644
--- a/mbox.c
+++ b/mbox.c
@@ -104,6 +104,7 @@ int mmdf_parse_mailbox (CONTEXT *ctx)
@@ -682,7 +988,7 @@ index 6d3b6bd..fa82eb3 100644
#ifdef NFS_ATTRIBUTE_HACK
if (sb.st_mtime > sb.st_atime)
diff --git a/menu.c b/menu.c
-index 27b5f8e..bc3a02f 100644
+index 4b13e7c..379b94c 100644
--- a/menu.c
+++ b/menu.c
@@ -24,6 +24,7 @@
@@ -691,9 +997,9 @@ index 27b5f8e..bc3a02f 100644
#include "mbyte.h"
+#include "sidebar.h"
- extern size_t UngetCount;
+ char* SearchBuffers[MENU_MAX];
-@@ -186,7 +187,7 @@ static void menu_pad_string (char *s, size_t n)
+@@ -184,7 +185,7 @@ static void menu_pad_string (char *s, size_t n)
{
char *scratch = safe_strdup (s);
int shift = option (OPTARROWCURSOR) ? 3 : 0;
@@ -702,7 +1008,7 @@ index 27b5f8e..bc3a02f 100644
mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1);
s[n - 1] = 0;
-@@ -239,6 +240,7 @@ void menu_redraw_index (MUTTMENU *menu)
+@@ -237,6 +238,7 @@ void menu_redraw_index (MUTTMENU *menu)
int do_color;
int attr;
@@ -710,7 +1016,7 @@ index 27b5f8e..bc3a02f 100644
for (i = menu->top; i < menu->top + menu->pagelen; i++)
{
if (i < menu->max)
-@@ -249,7 +251,7 @@ void menu_redraw_index (MUTTMENU *menu)
+@@ -247,7 +249,7 @@ void menu_redraw_index (MUTTMENU *menu)
menu_pad_string (buf, sizeof (buf));
ATTRSET(attr);
@@ -719,16 +1025,16 @@ index 27b5f8e..bc3a02f 100644
do_color = 1;
if (i == menu->current)
-@@ -272,7 +274,7 @@ void menu_redraw_index (MUTTMENU *menu)
+@@ -270,7 +272,7 @@ void menu_redraw_index (MUTTMENU *menu)
else
{
NORMAL_COLOR;
- CLEARLINE(i - menu->top + menu->offset);
-+ CLEARLINE_WIN(i - menu->top + menu->offset);
++ CLEARLINE_WIN (i - menu->top + menu->offset);
}
}
NORMAL_COLOR;
-@@ -289,7 +291,7 @@ void menu_redraw_motion (MUTTMENU *menu)
+@@ -287,7 +289,7 @@ void menu_redraw_motion (MUTTMENU *menu)
return;
}
@@ -737,7 +1043,7 @@ index 27b5f8e..bc3a02f 100644
ATTRSET(menu->color (menu->oldcurrent));
if (option (OPTARROWCURSOR))
-@@ -301,13 +303,13 @@ void menu_redraw_motion (MUTTMENU *menu)
+@@ -299,13 +301,13 @@ void menu_redraw_motion (MUTTMENU *menu)
{
menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
menu_pad_string (buf, sizeof (buf));
@@ -753,7 +1059,7 @@ index 27b5f8e..bc3a02f 100644
}
else
{
-@@ -320,7 +322,7 @@ void menu_redraw_motion (MUTTMENU *menu)
+@@ -318,7 +320,7 @@ void menu_redraw_motion (MUTTMENU *menu)
menu_make_entry (buf, sizeof (buf), menu, menu->current);
menu_pad_string (buf, sizeof (buf));
SETCOLOR(MT_COLOR_INDICATOR);
@@ -762,7 +1068,7 @@ index 27b5f8e..bc3a02f 100644
print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0);
}
menu->redraw &= REDRAW_STATUS;
-@@ -332,7 +334,7 @@ void menu_redraw_current (MUTTMENU *menu)
+@@ -330,7 +332,7 @@ void menu_redraw_current (MUTTMENU *menu)
char buf[LONG_STRING];
int attr = menu->color (menu->current);
@@ -771,7 +1077,7 @@ index 27b5f8e..bc3a02f 100644
menu_make_entry (buf, sizeof (buf), menu, menu->current);
menu_pad_string (buf, sizeof (buf));
-@@ -881,7 +883,7 @@ int mutt_menuLoop (MUTTMENU *menu)
+@@ -882,7 +884,7 @@ int mutt_menuLoop (MUTTMENU *menu)
if (option (OPTARROWCURSOR))
@@ -781,19 +1087,22 @@ index 27b5f8e..bc3a02f 100644
move (menu->current - menu->top + menu->offset, 0);
else
diff --git a/mh.c b/mh.c
-index 63e12d2..4a84a99 100644
+index bc87660..3121fca 100644
--- a/mh.c
+++ b/mh.c
-@@ -295,6 +295,28 @@ void mh_buffy(BUFFY *b)
+@@ -295,6 +295,32 @@ void mh_buffy(BUFFY *b)
mhs_free_sequences (&mhs);
}
-+void mh_buffy_update (const char *path, int *msgcount, int *msg_unread, int *msg_flagged)
++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;
+
@@ -802,31 +1111,34 @@ index 63e12d2..4a84a99 100644
+ 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++;
++ 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;
diff --git a/mutt.h b/mutt.h
-index 01d47de..5f25406 100644
+index 26f260e..91e58e9 100644
--- a/mutt.h
+++ b/mutt.h
-@@ -435,6 +435,8 @@ enum
+@@ -441,6 +441,10 @@ enum
OPTSAVEEMPTY,
OPTSAVENAME,
OPTSCORE,
+ OPTSIDEBAR,
++ OPTSIDEBARSHORTPATH,
+ OPTSIDEBARSORT,
++ OPTSIDEBARFOLDERINDENT,
OPTSIGDASHES,
OPTSIGONTOP,
OPTSORTRE,
-@@ -880,6 +882,7 @@ typedef struct _context
+@@ -887,6 +891,7 @@ typedef struct _context
{
char *path;
FILE *fp;
@@ -834,7 +1146,7 @@ index 01d47de..5f25406 100644
time_t mtime;
off_t size;
off_t vsize;
-@@ -920,6 +923,7 @@ typedef struct _context
+@@ -927,6 +932,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 */
@@ -843,7 +1155,7 @@ index 01d47de..5f25406 100644
/* driver hooks */
void *data; /* driver specific data */
diff --git a/mutt_curses.h b/mutt_curses.h
-index f8bc47c..ef9884e 100644
+index 93d9aea..888aa1c 100644
--- a/mutt_curses.h
+++ b/mutt_curses.h
@@ -64,6 +64,7 @@
@@ -854,7 +1166,7 @@ index f8bc47c..ef9884e 100644
#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)
-@@ -121,6 +122,8 @@ enum
+@@ -124,6 +125,8 @@ enum
MT_COLOR_UNDERLINE,
MT_COLOR_INDEX,
MT_COLOR_PROMPT,
@@ -863,11 +1175,23 @@ index f8bc47c..ef9884e 100644
MT_COLOR_MAX
};
+diff --git a/mutt_menu.h b/mutt_menu.h
+index bbcd722..4999748 100644
+--- a/mutt_menu.h
++++ b/mutt_menu.h
+@@ -34,6 +34,7 @@
+ #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"
+
diff --git a/muttlib.c b/muttlib.c
-index c1d565f..039e7c3 100644
+index 53cb4a3..3c4e768 100644
--- a/muttlib.c
+++ b/muttlib.c
-@@ -1279,6 +1279,8 @@ void mutt_FormatString (char *dest, /* output buffer */
+@@ -1282,6 +1282,8 @@ void mutt_FormatString (char *dest, /* output buffer */
pl = pw = 1;
/* see if there's room to add content, else ignore */
@@ -876,7 +1200,7 @@ index c1d565f..039e7c3 100644
if ((col < COLS && wlen < destlen) || soft)
{
int pad;
-@@ -1322,6 +1324,52 @@ void mutt_FormatString (char *dest, /* output buffer */
+@@ -1325,6 +1327,52 @@ void mutt_FormatString (char *dest, /* output buffer */
col += wid;
src += pl;
}
@@ -930,7 +1254,7 @@ index c1d565f..039e7c3 100644
}
else if (ch == '|')
diff --git a/mx.c b/mx.c
-index 0a1a80e..e80b8ff 100644
+index be2d0e9..16fcdf4 100644
--- a/mx.c
+++ b/mx.c
@@ -595,6 +595,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
@@ -950,7 +1274,7 @@ index 0a1a80e..e80b8ff 100644
if (flags & (M_APPEND|M_NEWFOLDER))
{
-@@ -721,9 +724,21 @@ CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx)
+@@ -721,13 +724,26 @@ CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx)
void mx_fastclose_mailbox (CONTEXT *ctx)
{
int i;
@@ -972,20 +1296,46 @@ index 0a1a80e..e80b8ff 100644
/* 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->peekonly)
++ mutt_buffy_setnotified(ctx->path);
+
+ if (ctx->mx_close)
+ ctx->mx_close (ctx);
+@@ -739,6 +755,8 @@ void mx_fastclose_mailbox (CONTEXT *ctx)
+ 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
+@@ -895,6 +913,10 @@ int mx_close_mailbox (CONTEXT *ctx, int *index_hint)
+ 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)
diff --git a/mx.h b/mx.h
-index 2ef4ec7..4aabadf 100644
+index d926cf6..ab398cb 100644
--- a/mx.h
+++ b/mx.h
@@ -60,6 +60,7 @@ void mbox_reset_atime (CONTEXT *, struct stat *);
int mh_read_dir (CONTEXT *, const char *);
int mh_sync_mailbox (CONTEXT *, int *);
int mh_check_mailbox (CONTEXT *, int *);
-+void mh_buffy_update (const char *, int *, int *, int *);
++void mh_buffy_update (const char *, int *, int *, int *, time_t *);
int mh_check_empty (const char *);
int maildir_read_dir (CONTEXT *);
diff --git a/pager.c b/pager.c
-index c99f1e4..5cfcb75 100644
+index b9f72c2..676fd39 100644
--- a/pager.c
+++ b/pager.c
@@ -29,6 +29,7 @@
@@ -996,7 +1346,7 @@ index c99f1e4..5cfcb75 100644
#include "mutt_crypt.h"
-@@ -1095,6 +1096,7 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf,
+@@ -1096,6 +1097,7 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf,
wchar_t wc;
mbstate_t mbstate;
int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap);
@@ -1004,7 +1354,15 @@ index c99f1e4..5cfcb75 100644
if (check_attachment_marker ((char *)buf) == 0)
wrap_cols = COLS;
-@@ -1746,7 +1748,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
+@@ -1573,6 +1575,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
+
+ 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 */
+
+@@ -1747,7 +1750,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
if ((redraw & REDRAW_BODY) || topline != oldtopline)
{
do {
@@ -1013,7 +1371,7 @@ index c99f1e4..5cfcb75 100644
curline = oldtopline = topline;
lines = 0;
force_redraw = 0;
-@@ -1759,6 +1761,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
+@@ -1760,6 +1763,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
&QuoteList, &q_level, &force_redraw, &SearchRE) > 0)
lines++;
curline++;
@@ -1021,7 +1379,7 @@ index c99f1e4..5cfcb75 100644
}
last_offset = lineInfo[curline].offset;
} while (force_redraw);
-@@ -1771,6 +1774,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
+@@ -1772,6 +1776,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
addch ('~');
addch ('\n');
lines++;
@@ -1029,34 +1387,51 @@ index c99f1e4..5cfcb75 100644
}
NORMAL_COLOR;
-@@ -1794,22 +1798,22 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
+@@ -1789,29 +1794,39 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
+ hfi.ctx = Context;
+ hfi.pager_progress = pager_progress_str;
+
++ statuswidth = COLS - (option(OPTSTATUSONTOP) && PagerIndexLines > 0 ? SidebarWidth : 0);
++
+ if (last_pos < sb.st_size - 1)
+ snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size));
+ else
strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str));
/* print out the pager status bar */
- move (statusoffset, 0);
+ move (statusoffset, SidebarWidth);
SETCOLOR (MT_COLOR_STATUS);
++ if(option(OPTSTATUSONTOP) && PagerIndexLines > 0) {
++ CLEARLINE_WIN (statusoffset);
++ } else {
++ CLEARLINE (statusoffset);
++ DrawFullLine = 1; /* for mutt_make_string_info */
++ }
if (IsHeader (extra) || IsMsgAttach (extra))
{
- size_t l1 = COLS * MB_LEN_MAX;
-+ size_t l1 = (COLS-SidebarWidth) * MB_LEN_MAX;
++ 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 (COLS, buffer);
-+ mutt_paddstr (COLS-SidebarWidth, buffer);
++ mutt_paddstr (statuswidth, buffer);
}
else
{
char bn[STRING];
snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str);
- mutt_paddstr (COLS, bn);
-+ mutt_paddstr (COLS-SidebarWidth, bn);
++ mutt_paddstr (statuswidth, bn);
}
++ if(!option(OPTSTATUSONTOP) || PagerIndexLines == 0)
++ DrawFullLine = 0; /* reset */
NORMAL_COLOR;
if (option(OPTTSENABLED) && TSSupported)
-@@ -1826,16 +1830,21 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
+ {
+@@ -1827,16 +1842,22 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
/* redraw the pager_index indicator, because the
* flags for this message might have changed. */
menu_redraw_current (index);
@@ -1066,10 +1441,11 @@ index c99f1e4..5cfcb75 100644
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);
++ move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)),
++ (option(OPTSTATUSONTOP) ? 0: SidebarWidth));
SETCOLOR (MT_COLOR_STATUS);
- mutt_paddstr (COLS, buffer);
-+ mutt_paddstr (COLS-SidebarWidth, buffer);
++ mutt_paddstr (COLS - (option(OPTSTATUSONTOP) ? 0 : SidebarWidth), buffer);
NORMAL_COLOR;
}
@@ -1080,7 +1456,7 @@ index c99f1e4..5cfcb75 100644
redraw = 0;
if (option(OPTBRAILLEFRIENDLY)) {
-@@ -2776,6 +2785,13 @@ search_next:
+@@ -2783,6 +2804,13 @@ search_next:
mutt_what_key ();
break;
@@ -1094,12 +1470,120 @@ index c99f1e4..5cfcb75 100644
default:
ch = -1;
break;
+diff --git a/pattern.c b/pattern.c
+index aeef591..406fd84 100644
+--- a/pattern.c
++++ b/pattern.c
+@@ -154,6 +154,10 @@ msg_search (CONTEXT *ctx, pattern_t* pat, int msgno)
+ 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,12 +167,20 @@ msg_search (CONTEXT *ctx, pattern_t* pat, int msgno)
+ 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,7 +196,11 @@ msg_search (CONTEXT *ctx, pattern_t* pat, int msgno)
+ if (s.fpout)
+ {
+ safe_fclose (&s.fpout);
++#ifdef HAVE_FMEMOPEN
++ FREE(&temp);
++#else
+ unlink (tempfile);
++#endif
+ }
+ return (0);
+ }
+@@ -193,11 +209,28 @@ msg_search (CONTEXT *ctx, pattern_t* pat, int msgno)
+ 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,7 +277,12 @@ msg_search (CONTEXT *ctx, pattern_t* pat, int msgno)
+ if (option (OPTTHOROUGHSRC))
+ {
+ safe_fclose (&fp);
++#ifdef HAVE_FMEMOPEN
++ if(tempsize)
++ FREE (&temp);
++#else
+ unlink (tempfile);
++#endif
+ }
+ }
+
+diff --git a/protos.h b/protos.h
+index 98a207a..5c83f82 100644
+--- a/protos.h
++++ b/protos.h
+@@ -36,6 +36,13 @@ struct hdr_format_info
+ 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);
diff --git a/sidebar.c b/sidebar.c
new file mode 100644
-index 0000000..6098c2a
+index 0000000..e9d9eba
--- /dev/null
+++ b/sidebar.c
-@@ -0,0 +1,333 @@
+@@ -0,0 +1,410 @@
+/*
+ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu>
+ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com>
@@ -1138,16 +1622,11 @@ index 0000000..6098c2a
+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() {
+
-+void calc_boundaries (int menu)
-+{
-+ BUFFY *tmp = Incoming;
++ BUFFY *tmp = Incoming;
++
++ int count = LINES - 2 - (option(OPTHELP) ? 1 : 0);
+
+ if ( known_lines != LINES ) {
+ TopBuffy = BottomBuffy = 0;
@@ -1159,13 +1638,11 @@ index 0000000..6098c2a
+ 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)
@@ -1173,7 +1650,6 @@ index 0000000..6098c2a
+ TopBuffy = tmp;
+ }
+ else if ( BottomBuffy == CurBuffy->prev ) {
-+ int count = LINES - 2 - (menu != MENU_PAGER);
+ TopBuffy = CurBuffy;
+ tmp = TopBuffy;
+ while ( --count && tmp->next )
@@ -1182,38 +1658,99 @@ index 0000000..6098c2a
+ }
+}
+
-+char *make_sidebar_entry(char *box, int size, int new, int flagged)
++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)
+{
-+ 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;
++/* 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':
++ if(!optional) {
++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
++ snprintf (dest, destlen, fmt, sbe->size);
++ } else if (sbe->size == 0) {
++ optional = 0;
++ }
++ 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])
@@ -1224,7 +1761,7 @@ index 0000000..6098c2a
+ return;
+
+ while(1) {
-+ if(!strcmp(tmp->path, buf)) {
++ if(!strcmp(tmp->path, buf) || !strcmp(tmp->realpath, buf)) {
+ CurBuffy = tmp;
+ break;
+ }
@@ -1238,7 +1775,6 @@ index 0000000..6098c2a
+
+int draw_sidebar(int menu) {
+
-+ int lines = option(OPTHELP) ? 1 : 0;
+ BUFFY *tmp;
+#ifndef USE_SLANG_CURSES
+ attr_t attrs;
@@ -1249,6 +1785,11 @@ index 0000000..6098c2a
+ 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) {
@@ -1264,13 +1805,14 @@ index 0000000..6098c2a
+ 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 ) return 0; */
+ if (SidebarWidth > 0 && option (OPTSIDEBAR)
+ && delim_len >= SidebarWidth) {
+ unset_option (OPTSIDEBAR);
@@ -1308,7 +1850,11 @@ index 0000000..6098c2a
+
+ /* draw the divider */
+
-+ for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) {
++ 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
@@ -1317,7 +1863,9 @@ index 0000000..6098c2a
+ }
+
+ if ( Incoming == 0 ) return 0;
-+ lines = option(OPTHELP) ? 1 : 0; /* go back to the top */
++ 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);
@@ -1327,7 +1875,7 @@ index 0000000..6098c2a
+
+ SETCOLOR(MT_COLOR_NORMAL);
+
-+ for ( ; tmp && lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); tmp = tmp->next ) {
++ for ( ; tmp && lines < SidebarHeight; tmp = tmp->next ) {
+ if ( tmp == CurBuffy )
+ SETCOLOR(MT_COLOR_INDICATOR);
+ else if ( tmp->msg_unread > 0 )
@@ -1338,33 +1886,44 @@ index 0000000..6098c2a
+ SETCOLOR(MT_COLOR_NORMAL);
+
+ move( lines, 0 );
-+ if ( Context && !strcmp( tmp->path, Context->path ) ) {
++ if ( Context && Context->path &&
++ (!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
++ /* 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
++ /* calculate depth of current folder and generate its display name with indented spaces */
+ int sidebar_folder_depth = 0;
+ char *sidebar_folder_name;
-+ sidebar_folder_name = basename(tmp->path);
-+ if ( maildir_is_prefix ) {
++ sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir) + 1);
++ if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) {
+ char *tmp_folder_name;
+ int i;
-+ tmp_folder_name = tmp->path + strlen(Maildir);
++ tmp_folder_name = tmp->path + strlen(Maildir) + 1;
+ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) {
-+ if (tmp_folder_name[i] == '/') sidebar_folder_depth++;
++ if (tmp_folder_name[i] == '/' || tmp_folder_name[i] == '.') sidebar_folder_depth++;
+ }
+ if (sidebar_folder_depth > 0) {
-+ sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1);
++ if (option(OPTSIDEBARSHORTPATH)) {
++ tmp_folder_name = strrchr(tmp->path, '.');
++ if (tmp_folder_name == NULL)
++ tmp_folder_name = mutt_basename(tmp->path);
++ else
++ tmp_folder_name++;
++ }
++ else
++ tmp_folder_name = tmp->path + strlen(Maildir) + 1;
++ sidebar_folder_name = malloc(strlen(tmp_folder_name) + sidebar_folder_depth*strlen(NONULL(SidebarIndentStr)) + 1);
++ sidebar_folder_name[0]=0;
+ for (i=0; i < sidebar_folder_depth; i++)
-+ sidebar_folder_name[i]=' ';
-+ sidebar_folder_name[i]=0;
-+ strncat(sidebar_folder_name, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth);
++ strncat(sidebar_folder_name, NONULL(SidebarIndentStr), strlen(NONULL(SidebarIndentStr)));
++ strncat(sidebar_folder_name, tmp_folder_name, strlen(tmp_folder_name));
+ }
+ }
+ printw( "%.*s", SidebarWidth - delim_len + 1,
@@ -1375,7 +1934,7 @@ index 0000000..6098c2a
+ lines++;
+ }
+ SETCOLOR(MT_COLOR_NORMAL);
-+ for ( ; lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) {
++ for ( ; lines < SidebarHeight; lines++ ) {
+ int i = 0;
+ move( lines, 0 );
+ for ( ; i < SidebarWidth - delim_len; i++ )
@@ -1389,9 +1948,11 @@ index 0000000..6098c2a
+{
+ BUFFY *tmp = Incoming;
+ while(tmp) {
-+ if(Context && !strcmp(tmp->path, Context->path)) {
++ 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;