From 35fed0c7cdce76ff4ba6fc54a64d1d572de022e9 Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Fri, 11 Sep 2015 15:37:14 +0000 Subject: [PATCH 1/2] . OBS-URL: https://build.opensuse.org/package/show/server:mail/mutt?expand=0&rev=109 --- mutt-1.5.23.tar.gz | 3 - ....21-opennfs.dif => mutt-1.5.24-opennfs.dif | 55 +- mutt-1.5.24-patches.tar.bz2 | 3 + mutt-1.5.23.dif => mutt-1.5.24.dif | 66 +- mutt-1.5.24.tar.gz | 3 + mutt.changes | 46 + mutt.spec | 26 +- nion.sidebar-color.diff | 38 +- patch-1.5.23.rr.compressed.bz2 | 3 - patch-1.5.23.sidebar.20140412.patch | 2412 ----------------- patch-1.5.23.xtitles.patch | 198 -- patch-1.5.24.rr.compressed.bz2 | 3 + patch-1.5.24.sidebar.20140412.patch | 1937 +++++++++++++ ...e_mime => patch-1.5.24.vk.pgp_verbose_mime | 41 +- widechar.sidebar.dif | 30 +- 15 files changed, 2133 insertions(+), 2731 deletions(-) delete mode 100644 mutt-1.5.23.tar.gz rename mutt-1.5.21-opennfs.dif => mutt-1.5.24-opennfs.dif (82%) create mode 100644 mutt-1.5.24-patches.tar.bz2 rename mutt-1.5.23.dif => mutt-1.5.24.dif (86%) create mode 100644 mutt-1.5.24.tar.gz delete mode 100644 patch-1.5.23.rr.compressed.bz2 delete mode 100644 patch-1.5.23.sidebar.20140412.patch delete mode 100644 patch-1.5.23.xtitles.patch create mode 100644 patch-1.5.24.rr.compressed.bz2 create mode 100644 patch-1.5.24.sidebar.20140412.patch rename patch-1.5.21.vk.pgp_verbose_mime => patch-1.5.24.vk.pgp_verbose_mime (62%) diff --git a/mutt-1.5.23.tar.gz b/mutt-1.5.23.tar.gz deleted file mode 100644 index 1d8f860..0000000 --- a/mutt-1.5.23.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3af0701e57b9e1880ed3a0dee34498a228939e854a16cdccd24e5e502626fd37 -size 3782032 diff --git a/mutt-1.5.21-opennfs.dif b/mutt-1.5.24-opennfs.dif similarity index 82% rename from mutt-1.5.21-opennfs.dif rename to mutt-1.5.24-opennfs.dif index 53b4691..1e2d824 100644 --- a/mutt-1.5.21-opennfs.dif +++ b/mutt-1.5.24-opennfs.dif @@ -1,6 +1,17 @@ +--- + Makefile.am | 4 - + Makefile.in | 6 +- + lib.c | 7 ++- + mbox.c | 2 + mh.c | 9 +++- + mutt.h | 1 + opennfs.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + sendlib.c | 2 + 8 files changed, 144 insertions(+), 9 deletions(-) + --- Makefile.am -+++ Makefile.am 2009-03-02 23:00:00.000000000 +0000 -@@ -27,7 +27,7 @@ mutt_SOURCES = \ ++++ Makefile.am 2015-09-11 14:41:16.061518931 +0000 +@@ -29,7 +29,7 @@ mutt_SOURCES = \ edit.c enter.c flags.c init.c filter.c from.c \ getdomain.c group.c \ handler.c hash.c hdrline.c headers.c help.c hook.c keymap.c \ @@ -9,18 +20,18 @@ postpone.c query.c recvattach.c recvcmd.c \ rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \ score.c send.c sendlib.c signal.c sort.c \ -@@ -83,7 +83,7 @@ mutt_dotlock_SOURCES = mutt_dotlock.c - mutt_dotlock_LDADD = @LIBOBJS@ - mutt_dotlock_DEPENDENCIES = @LIBOBJS@ +@@ -84,7 +84,7 @@ mutt_dotlock_SOURCES = mutt_dotlock.c + mutt_dotlock_LDADD = $(LIBOBJS) + mutt_dotlock_DEPENDENCIES = $(LIBOBJS) -pgpring_SOURCES = pgppubring.c pgplib.c lib.c extlib.c sha1.c md5.c pgppacket.c ascii.c +pgpring_SOURCES = pgppubring.c pgplib.c lib.c extlib.c sha1.c opennfs.c md5.c pgppacket.c ascii.c - pgpring_LDADD = @LIBOBJS@ $(INTLLIBS) - pgpring_DEPENDENCIES = @LIBOBJS@ $(INTLDEPS) + pgpring_LDADD = $(LIBOBJS) $(INTLLIBS) + pgpring_DEPENDENCIES = $(LIBOBJS) $(INTLDEPS) --- Makefile.in -+++ Makefile.in 2009-03-03 16:00:38.000000000 +0000 -@@ -77,7 +77,7 @@ am_mutt_OBJECTS = addrbook.$(OBJEXT) ali ++++ Makefile.in 2015-09-11 14:41:53.390018589 +0000 +@@ -125,7 +125,7 @@ am_mutt_OBJECTS = addrbook.$(OBJEXT) ali hash.$(OBJEXT) hdrline.$(OBJEXT) headers.$(OBJEXT) \ help.$(OBJEXT) hook.$(OBJEXT) keymap.$(OBJEXT) main.$(OBJEXT) \ mbox.$(OBJEXT) menu.$(OBJEXT) mh.$(OBJEXT) mx.$(OBJEXT) \ @@ -29,16 +40,16 @@ postpone.$(OBJEXT) query.$(OBJEXT) recvattach.$(OBJEXT) \ recvcmd.$(OBJEXT) rfc822.$(OBJEXT) rfc1524.$(OBJEXT) \ rfc2047.$(OBJEXT) rfc2231.$(OBJEXT) rfc3676.$(OBJEXT) \ -@@ -105,7 +105,7 @@ pgpewrap_LDADD = $(LDADD) - pgpewrap_DEPENDENCIES = @LIBOBJS@ +@@ -155,7 +155,7 @@ pgpewrap_LDADD = $(LDADD) + pgpewrap_DEPENDENCIES = $(LIBOBJS) $(am__DEPENDENCIES_1) am_pgpring_OBJECTS = pgppubring.$(OBJEXT) pgplib.$(OBJEXT) \ lib.$(OBJEXT) extlib.$(OBJEXT) sha1.$(OBJEXT) md5.$(OBJEXT) \ - pgppacket.$(OBJEXT) ascii.$(OBJEXT) + pgppacket.$(OBJEXT) ascii.$(OBJEXT) opennfs.$(OBJEXT) pgpring_OBJECTS = $(am_pgpring_OBJECTS) - am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; - am__vpath_adj = case $$p in \ -@@ -354,7 +354,7 @@ mutt_SOURCES = \ + am_txt2c_OBJECTS = txt2c.$(OBJEXT) + txt2c_OBJECTS = $(am_txt2c_OBJECTS) +@@ -474,7 +474,7 @@ mutt_SOURCES = \ edit.c enter.c flags.c init.c filter.c from.c \ getdomain.c group.c \ handler.c hash.c hdrline.c headers.c help.c hook.c keymap.c \ @@ -57,7 +68,7 @@ #include "lib.h" -@@ -632,6 +633,10 @@ int safe_open (const char *path, int fla +@@ -633,6 +634,10 @@ int safe_open (const char *path, int fla struct stat osb, nsb; int fd; @@ -68,7 +79,7 @@ if (flags & O_EXCL) { char safe_file[_POSIX_PATH_MAX]; -@@ -655,7 +660,7 @@ int safe_open (const char *path, int fla +@@ -656,7 +661,7 @@ int safe_open (const char *path, int fla if ((fd = open (path, flags & ~O_EXCL, 0600)) < 0) return fd; @@ -78,8 +89,8 @@ if (lstat (path, &osb) < 0 || fstat (fd, &nsb) < 0 || compare_stat(&osb, &nsb) == -1) --- mbox.c -+++ mbox.c 2010-11-04 14:01:04.775926675 +0000 -@@ -782,7 +782,7 @@ int mbox_sync_mailbox (CONTEXT *ctx, int ++++ mbox.c 2010-11-04 14:01:05.000000000 +0000 +@@ -781,7 +781,7 @@ int mbox_sync_mailbox (CONTEXT *ctx, int /* Create a temporary file to write the new version of the mailbox in. */ mutt_mktemp (tempfile, sizeof (tempfile)); @@ -90,7 +101,7 @@ if (-1 != i) --- mh.c +++ mh.c 2009-03-02 23:00:00.000000000 +0000 -@@ -277,7 +277,11 @@ static int mh_mkstemp (CONTEXT * dest, F +@@ -332,7 +332,11 @@ static int mh_mkstemp (CONTEXT * dest, F { snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d", dest->path, NONULL (Hostname), (int) getpid (), Counter++); @@ -102,7 +113,7 @@ { if (errno != EEXIST) { -@@ -1290,8 +1294,11 @@ int maildir_open_new_message (MESSAGE * +@@ -1345,8 +1349,11 @@ int maildir_open_new_message (MESSAGE * dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n", path)); @@ -117,7 +128,7 @@ { --- mutt.h +++ mutt.h 2009-03-02 23:00:00.000000000 +0000 -@@ -972,4 +972,5 @@ typedef struct +@@ -981,4 +981,5 @@ typedef struct #include "lib.h" #include "globals.h" @@ -250,7 +261,7 @@ +} --- sendlib.c +++ sendlib.c 2009-03-02 23:00:00.000000000 +0000 -@@ -2216,7 +2216,7 @@ send_msg (const char *path, char **args, +@@ -2223,7 +2223,7 @@ send_msg (const char *path, char **args, if (SendmailWait >= 0 && tempfile && *tempfile) { /* *tempfile will be opened as stdout */ diff --git a/mutt-1.5.24-patches.tar.bz2 b/mutt-1.5.24-patches.tar.bz2 new file mode 100644 index 0000000..4516007 --- /dev/null +++ b/mutt-1.5.24-patches.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:835e4f8c81ab862ff8aed0b1b0eaaa3660534c3992e7752dcdfe7f02a0859ca0 +size 244 diff --git a/mutt-1.5.23.dif b/mutt-1.5.24.dif similarity index 86% rename from mutt-1.5.23.dif rename to mutt-1.5.24.dif index 1648d2e..0c80a02 100644 --- a/mutt-1.5.23.dif +++ b/mutt-1.5.24.dif @@ -1,6 +1,16 @@ +--- + configure.ac | 10 ++++- + doc/Makefile.in | 2 - + doc/Muttrc | 102 +++++++++++++++++++++++++++++++++++++++++--------------- + doc/Muttrc.head | 2 - + imap/auth.c | 20 ++++++++++ + init.h | 3 + + mx.c | 3 + + 7 files changed, 112 insertions(+), 30 deletions(-) + --- configure.ac +++ configure.ac 2007-06-01 10:57:38.000000000 +0000 -@@ -235,7 +235,7 @@ main () +@@ -240,7 +240,7 @@ main () mutt_cv_slang=$withval if test -d $withval/include/slang; then CPPFLAGS="$CPPFLAGS -I${withval}/include/slang" @@ -9,7 +19,7 @@ CPPFLAGS="$CPPFLAGS -I${withval}/include" fi LDFLAGS="$LDFLAGS -L${withval}/lib" -@@ -660,8 +660,12 @@ AC_ARG_WITH(ssl, AC_HELP_STRING([--with- +@@ -669,8 +669,12 @@ AC_ARG_WITH(ssl, AS_HELP_STRING([--with- else if test "$with_ssl" != "yes" then @@ -22,7 +32,7 @@ fi saved_LIBS="$LIBS" -@@ -730,8 +734,12 @@ AC_ARG_WITH(sasl, AC_HELP_STRING([--with +@@ -749,8 +753,12 @@ AC_ARG_WITH(sasl, AS_HELP_STRING([--with if test "$with_sasl" != "yes" then @@ -36,8 +46,8 @@ saved_LIBS="$LIBS" --- doc/Makefile.in -+++ doc/Makefile.in 2010-11-04 13:01:17.839926726 +0000 -@@ -575,7 +575,7 @@ uninstall-local: ++++ doc/Makefile.in 2010-11-04 13:01:18.000000000 +0000 +@@ -685,7 +685,7 @@ uninstall-local: check: manual.txt: manual.html @@ -46,17 +56,6 @@ LC_ALL=C w3m -dump manual.html > $@ || \ LC_ALL=C elinks -dump -no-numbering -no-references manual.html | sed -e 's,\\001, ,g' > $@ ---- doc/Muttrc.head -+++ doc/Muttrc.head 2007-06-01 10:51:04.000000000 +0000 -@@ -23,7 +23,7 @@ macro index,pager,attach,compose \cb "\ - "call urlview to extract URLs out of a message" - - # Show documentation when pressing F1 --macro generic,pager " less @docdir@/manual.txt" "show Mutt documentation" -+macro generic,index,pager " less -iM @docdir@/manual.txt" "show Mutt documentation" - - # show the incoming mailboxes list (just like "mutt -y") and back when pressing "y" - macro index,pager y "?" "show incoming mailboxes list" --- doc/Muttrc +++ doc/Muttrc 2009-03-03 14:56:33.000000000 +0000 @@ -23,7 +23,7 @@ macro index,pager,attach,compose \cb "\ @@ -94,7 +93,7 @@ # Name: check_mbox_size # Type: boolean # Default: no -@@ -870,11 +870,11 @@ attachments -I message/external-body +@@ -909,11 +909,11 @@ attachments -I message/external-body # filtered message is read from the standard output. # # @@ -108,7 +107,7 @@ # # # Contains the path of the mutt_dotlock(8) binary to be used by -@@ -2288,9 +2288,9 @@ attachments -I message/external-body +@@ -2351,9 +2351,9 @@ attachments -I message/external-body # directly from the pager, and screen resizes cause lines longer than # the screen width to be badly formatted in the help menu. # @@ -121,7 +120,7 @@ # Name: pager_context # Type: number # Default: 0 -@@ -2318,9 +2318,9 @@ attachments -I message/external-body +@@ -2381,9 +2381,9 @@ attachments -I message/external-body # pager. The valid sequences are listed in the $index_format # section. # @@ -134,7 +133,7 @@ # Name: pager_index_lines # Type: number # Default: 0 -@@ -2338,9 +2338,9 @@ attachments -I message/external-body +@@ -2401,9 +2401,9 @@ attachments -I message/external-body # is less than $pager_index_lines, then the index will only use as # many lines as it needs. # @@ -147,7 +146,7 @@ # Name: pager_stop # Type: boolean # Default: no -@@ -3306,9 +3306,9 @@ attachments -I message/external-body +@@ -3440,9 +3440,9 @@ attachments -I message/external-body # (possibly undeleted) message whenever a command that modifies the # current message is executed. # @@ -160,7 +159,7 @@ # Name: reverse_alias # Type: boolean # Default: no -@@ -3440,6 +3440,18 @@ attachments -I message/external-body +@@ -3574,6 +3574,18 @@ attachments -I message/external-body # Also see the $force_name variable. # # @@ -179,7 +178,7 @@ # set score=yes # # Name: score -@@ -4011,9 +4023,9 @@ attachments -I message/external-body +@@ -4144,9 +4156,9 @@ attachments -I message/external-body # Setting this variable overrides the value of the $sendmail # variable. # @@ -192,7 +191,7 @@ # Name: sort # Type: sort order # Default: date -@@ -4457,9 +4469,9 @@ attachments -I message/external-body +@@ -4630,9 +4642,9 @@ attachments -I message/external-body # When set, mutt uses the date received rather than the date sent # to thread messages by subject. # @@ -205,7 +204,7 @@ # Name: tilde # Type: boolean # Default: no -@@ -4770,6 +4782,42 @@ attachments -I message/external-body +@@ -4980,6 +4992,42 @@ attachments -I message/external-body # in this case. # # @@ -248,6 +247,17 @@ # set write_inc=10 # # Name: write_inc +--- doc/Muttrc.head ++++ doc/Muttrc.head 2007-06-01 10:51:04.000000000 +0000 +@@ -23,7 +23,7 @@ macro index,pager,attach,compose \cb "\ + "call urlview to extract URLs out of a message" + + # Show documentation when pressing F1 +-macro generic,pager " less @docdir@/manual.txt" "show Mutt documentation" ++macro generic,index,pager " less -iM @docdir@/manual.txt" "show Mutt documentation" + + # show the incoming mailboxes list (just like "mutt -y") and back when pressing "y" + macro index,pager y "?" "show incoming mailboxes list" --- imap/auth.c +++ imap/auth.c 2006-11-09 15:19:56.000000000 +0000 @@ -72,6 +72,23 @@ int imap_authenticate (IMAP_DATA* idata) @@ -286,7 +296,7 @@ FREE (&methods); --- init.h +++ init.h 2009-06-25 15:52:10.000000000 +0000 -@@ -2944,6 +2944,9 @@ struct option_t MuttVars[] = { +@@ -3044,6 +3044,9 @@ struct option_t MuttVars[] = { ** the default from the GNUTLS library. */ # endif /* USE_SSL_GNUTLS */ @@ -297,8 +307,8 @@ /* ** .pp --- mx.c -+++ mx.c 2011-07-07 11:24:48.680426606 +0000 -@@ -1591,6 +1591,9 @@ void mx_update_context (CONTEXT *ctx, in ++++ mx.c 2011-07-07 11:24:49.000000000 +0000 +@@ -1537,6 +1537,9 @@ void mx_update_context (CONTEXT *ctx, in { h = ctx->hdrs[msgno]; diff --git a/mutt-1.5.24.tar.gz b/mutt-1.5.24.tar.gz new file mode 100644 index 0000000..e8c42bb --- /dev/null +++ b/mutt-1.5.24.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a292ca765ed7b19db4ac495938a3ef808a16193b7d623d65562bb8feb2b42200 +size 3897115 diff --git a/mutt.changes b/mutt.changes index ffbc8a5..573798d 100644 --- a/mutt.changes +++ b/mutt.changes @@ -1,3 +1,49 @@ +------------------------------------------------------------------- +Fri Sep 11 15:14:48 UTC 2015 - werner@suse.de + +- Update to mutt version 1.5.24 + + terminal status-line (TS) support, a.k.a. xterm title. see the + following variables: $ts_enabled, $ts_icon_format, $ts_status_format + ! $ssl_use_sslv3 is disabled by default. + ! command-line arguments: -H now combines template and command-line + address arguments. + ! GnuPG signature name is set to signature.asc + + New color object "prompt" added. + + Ability to encrypt postponed messages. See $postpone_encrypt and + $postpone_encrypt_as. + ! History ring now has a scratch buffer. + ! mail-key is implemented for GPGME. (Requires a recent GPGME). + ! Removed GPG_AGENT_INFO check for GnuPG 2.1 compatibility. Please + set pgp_use_gpg_agent if using GnuPG 2.1 or later. + ! $smime_encrypt_with now defaults to aes256. + ! GnuPG fingerprints are used internally when possible. + "--with-fingerprint" should be added to $pgp_list_pubring_command and + $pgp_list_secring_command to enable this. Please see contrib/gpg.rc. + Fingerprints may also be used at the prompts for key selection. + + $crypt_opportunistic_encrypt automatically enables/disables encryption + based on message recipients. + ! Attachments for signed, unencrypted emails may be deleted. + ! Multiple crypt-hooks may be defined for the same regexp. + This means multiple keys may be used for a recipient. + + $crypt_confirmhook allows the confirmation prompt for crypt-hooks to + be disabled. + + $ssl_ciphers allows the SSL ciphers to be directly set. + ! sime_keys better handles importing certificate chains. + ! sime_keys now records certificate purposes (sign/encrypt). Run + "sime_keys refresh" to update smime index files. + + $maildir_check_cur polls the maildir "cur" directory for new mail. +- Ported patches + patch-1.5.21.vk.pgp_verbose_mime becomes patch-1.5.24.vk.pgp_verbose_mime + patch-1.5.23.rr.compressed.bz2 becomes patch-1.5.24.rr.compressed.bz2 + patch-1.5.23.sidebar.20140412.patch becomes patch-1.5.24.sidebar.20140412.patch + mutt-1.5.21-opennfs.dif becomes mutt-1.5.24-opennfs.dif + mutt-1.5.23.dif becomes mutt-1.5.24.dif +- Modfied patches + nion.sidebar-color.diff + widechar.sidebar.dif +- Removed patch + patch-1.5.23.xtitles.patch + ------------------------------------------------------------------- Mon Jan 26 16:22:08 UTC 2015 - werner@suse.de diff --git a/mutt.spec b/mutt.spec index 41e534f..f0f495e 100644 --- a/mutt.spec +++ b/mutt.spec @@ -1,7 +1,7 @@ # # spec file for package mutt # -# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,6 +24,7 @@ BuildRequires: cyrus-sasl-devel BuildRequires: cyrus-sasl-gssapi BuildRequires: docbook-xsl-stylesheets BuildRequires: docbook_4 +BuildRequires: fdupes BuildRequires: gdbm-devel BuildRequires: glibc-i18ndata BuildRequires: ispell @@ -66,8 +67,8 @@ Requires(postun): shared-mime-info # NOTE: We don't want this dependency and desktop-data-SuSE is in all # desktop selections. #Requires: desktop-data-SuSE -Version: 1.5.23 -Release: 33.2 +Version: 1.5.24 +Release: 0 Summary: Mail Program License: GPL-2.0+ Group: Productivity/Networking/Email/Clients @@ -88,15 +89,14 @@ Patch1: patch-%version.rr.compressed.bz2 Patch2: %name-1.5.9i-pgpewrap.diff Patch3: %name-1.5.20-sendgroupreplyto.diff Patch4: %name-1.5.15-wrapcolumn.diff -Patch5: patch-1.5.23.xtitles.patch # http://lunar-linux.org/mutt-sidebar -Patch6: patch-1.5.23.sidebar.20140412.patch -Patch7: mutt-1.5.21-opennfs.dif +Patch6: patch-1.5.24.sidebar.20140412.patch +Patch7: mutt-1.5.24-opennfs.dif Patch9: bug-676388-largefile.patch Patch10: mutt-1.5.21-tinfo.dif # http://www.wolfermann.org/mutt.html Patch11: aw.listreply.diff -Patch12: patch-1.5.21.vk.pgp_verbose_mime +Patch12: patch-1.5.24.vk.pgp_verbose_mime Patch14: nion.sidebar-color.diff # PATCH-FIX-OPENSUSE: bnc#813498 - mutt crashes in fgetwc in text_enriched_handler Patch15: widechar.sidebar.dif @@ -122,18 +122,17 @@ for p in ../%name-%version-patches/*; do patch -s -p1 < $p done %patch -%patch1 -p1 -b .compressed +%patch1 -p0 -b .compressed %patch2 -p0 -b .pgpewrap %patch3 -p1 -b .sendgroupreplyto %patch4 -p0 -b .wrapcolumn -%patch5 -p1 -b .xtitles -%patch6 -p1 -b .sidebar +%patch6 -p0 -b .sidebar %patch7 -p0 -b .opennfs %patch9 -p1 -b .largefile %patch10 -p0 -b .tinfo %patch11 -p1 -b .listreply -%patch12 -p1 -b .pgp_verbose_mtime -%patch14 -p1 -b .sidebar.color +%patch12 -p0 -b .pgp_verbose_mtime +%patch14 -p2 -b .sidebar.color %patch15 -p0 -b .widechar.sidebar %patch16 -p0 -b .crlf %patch18 -p1 -b .mailcap @@ -246,8 +245,6 @@ install -D -m 644 %{SOURCE5} %{buildroot}%{_sysconfdir}/skel/.muttrc install -D -m 644 %{SOURCE9} %{buildroot}%{_datadir}/mutt/mailcap %suse_update_desktop_file mutt -#%fdupes %{buildroot} - %if 0%{?suse_version} >= 1140 %post @@ -261,7 +258,6 @@ install -D -m 644 %{SOURCE9} %{buildroot}%{_datadir}/mutt/mailcap %defattr(-,root,root) %doc doc/manual*.html doc/manual.txt.gz COPYRIGHT README* NEWS TODO %doc doc/PGP-Notes.txt doc/applying-patches.txt doc/devel-notes.txt -%doc contrib/ %config(noreplace) %{_sysconfdir}/skel/.muttrc %{_bindir}/mutt %{_bindir}/pgpewrap diff --git a/nion.sidebar-color.diff b/nion.sidebar-color.diff index 6b4275c..307f6b5 100644 --- a/nion.sidebar-color.diff +++ b/nion.sidebar-color.diff @@ -1,16 +1,17 @@ -diff --git a/color.c b/color.c -index bb6cbb4..bbf20a3 100644 ---- a/color.c -+++ b/color.c -@@ -95,6 +95,7 @@ static struct mapping_t Fields[] = + + +diff --git a/mutt-1.5.24/color.c b/mutt-1.5.24/color.c +--- a/mutt-1.5.24/color.c ++++ b/mutt-1.5.24/color.c +@@ -95,6 +95,7 @@ static const struct mapping_t Fields[] = { "index", MT_COLOR_INDEX }, { "sidebar_new", MT_COLOR_NEW }, { "sidebar_flagged", MT_COLOR_FLAGGED }, -+ { "sidebar", MT_COLOR_SIDEBAR }, ++ { "sidebar", MT_COLOR_SIDEBAR }, + { "prompt", MT_COLOR_PROMPT }, { NULL, 0 } }; - -@@ -144,6 +145,7 @@ void ci_start_color (void) +@@ -145,6 +146,7 @@ void ci_start_color (void) /* set some defaults */ ColorDefs[MT_COLOR_STATUS] = A_REVERSE; @@ -18,11 +19,10 @@ index bb6cbb4..bbf20a3 100644 ColorDefs[MT_COLOR_INDICATOR] = A_REVERSE; ColorDefs[MT_COLOR_SEARCH] = A_REVERSE; ColorDefs[MT_COLOR_MARKERS] = A_REVERSE; -diff --git a/mutt_curses.h b/mutt_curses.h -index 5f61048..cb1acf2 100644 ---- a/mutt_curses.h -+++ b/mutt_curses.h -@@ -125,6 +125,7 @@ enum +diff --git a/mutt-1.5.24/mutt_curses.h b/mutt-1.5.24/mutt_curses.h +--- a/mutt-1.5.24/mutt_curses.h ++++ b/mutt-1.5.24/mutt_curses.h +@@ -119,6 +119,7 @@ enum MT_COLOR_ATTACHMENT, MT_COLOR_SEARCH, MT_COLOR_BOLD, @@ -30,11 +30,10 @@ index 5f61048..cb1acf2 100644 MT_COLOR_UNDERLINE, MT_COLOR_INDEX, MT_COLOR_NEW, -diff --git a/sidebar.c b/sidebar.c -index 9e12319..4b37b76 100644 ---- a/sidebar.c -+++ b/sidebar.c -@@ -250,13 +250,14 @@ +diff --git a/mutt-1.5.24/sidebar.c b/mutt-1.5.24/sidebar.c +--- a/mutt-1.5.24/sidebar.c ++++ b/mutt-1.5.24/sidebar.c +@@ -250,13 +250,14 @@ int draw_sidebar(int menu) { } /* get attributes for divider */ @@ -50,7 +49,7 @@ index 9e12319..4b37b76 100644 /* draw the divider */ -@@ -266,10 +267,14 @@ +@@ -266,10 +267,14 @@ int draw_sidebar(int menu) { for ( ; lines < SidebarHeight; lines++ ) { move(lines, SidebarWidth - delim_len); @@ -69,4 +68,3 @@ index 9e12319..4b37b76 100644 } if ( Incoming == 0 ) return 0; - diff --git a/patch-1.5.23.rr.compressed.bz2 b/patch-1.5.23.rr.compressed.bz2 deleted file mode 100644 index 541fea9..0000000 --- a/patch-1.5.23.rr.compressed.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f92431ff7e793af274d200324c4526d470e88d68d6cb803aaf387c9292dba62 -size 9730 diff --git a/patch-1.5.23.sidebar.20140412.patch b/patch-1.5.23.sidebar.20140412.patch deleted file mode 100644 index 2adcf75..0000000 --- a/patch-1.5.23.sidebar.20140412.patch +++ /dev/null @@ -1,2412 +0,0 @@ ---- - Makefile.am | 1 - Makefile.in | 8 ! - OPS | 5 - PATCHES | 1 - buffy.c | 151 +++++++++++++++++++!! - buffy.h | 6 - color.c | 2 - compose.c | 26 !!! - configure.ac | 2 - curs_main.c | 37 ++!!! - doc/Muttrc | 20 ++ - flags.c | 3 - functions.h | 10 + - globals.h | 6 - handler.c | 29 ++++ - imap/command.c | 7 - imap/imap.c | 2 - init.h | 48 ++++++ - mailbox.h | 1 - main.c | 11 + - mbox.c | 2 - menu.c | 20 !! - mh.c | 26 +++ - mutt.h | 6 - mutt_curses.h | 3 - mutt_menu.h | 1 - muttlib.c | 48 ++++++ - mx.c | 24 ++! - mx.h | 1 - pager.c | 42 +++!! - pattern.c | 38 +++++ - protos.h | 7 - sidebar.c | 405 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - sidebar.h | 36 +++++ - 34 files changed, 936 insertions(+), 99 modifications(!) - -*** mutt-1.5.23/Makefile.am ---- mutt-1.5.23/Makefile.am Fri Apr 11 15:14:01 2014 -*************** mutt_SOURCES = \ -*** 33,38 **** ---- 33,39 ---- - rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \ - score.c send.c sendlib.c signal.c sort.c \ - status.c system.c thread.c charset.c history.c lib.c \ -+ sidebar.c \ - muttlib.c editmsg.c mbyte.c \ - url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c - -*** mutt-1.5.23/Makefile.in ---- mutt-1.5.23/Makefile.in Sat Apr 12 17:12:38 2014 -*************** am_mutt_OBJECTS = addrbook.$(OBJEXT) ali -*** 133,139 **** - system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ - history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ - editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ -! ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) - am__objects_1 = - am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ - $(am__objects_1) ---- 133,140 ---- - system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ - history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ - editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ -! ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) \ -! sidebar.$(OBJEXT) - am__objects_1 = - am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ - $(am__objects_1) -*************** mutt_SOURCES = \ -*** 472,478 **** - score.c send.c sendlib.c signal.c sort.c \ - status.c system.c thread.c charset.c history.c lib.c \ - muttlib.c editmsg.c mbyte.c \ -! url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c - - nodist_mutt_SOURCES = $(BUILT_SOURCES) - mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ ---- 473,480 ---- - score.c send.c sendlib.c signal.c sort.c \ - status.c system.c thread.c charset.c history.c lib.c \ - muttlib.c editmsg.c mbyte.c \ -! url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c \ -! sidebar.c - - nodist_mutt_SOURCES = $(BUILT_SOURCES) - mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ -*************** EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP O -*** 504,510 **** - README.SSL smime.h group.h \ - muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ - ChangeLog mkchangelog.sh mutt_idna.h \ -! snprintf.c regex.c crypt-gpgme.h hcachever.sh.in \ - txt2c.c txt2c.sh version.sh check_sec.sh - - EXTRA_SCRIPTS = smime_keys ---- 506,512 ---- - README.SSL smime.h group.h \ - muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ - ChangeLog mkchangelog.sh mutt_idna.h \ -! snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in \ - txt2c.c txt2c.sh version.sh check_sec.sh - - EXTRA_SCRIPTS = smime_keys -*** mutt-1.5.23/OPS ---- mutt-1.5.23/OPS Fri Apr 11 15:14:01 2014 -*************** OP_WHAT_KEY "display the keycode for a k -*** 179,181 **** ---- 179,186 ---- - OP_MAIN_SHOW_LIMIT "show currently active limit pattern" - OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread" - OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads" -+ OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page" -+ OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page" -+ OP_SIDEBAR_NEXT "go down to next mailbox" -+ OP_SIDEBAR_PREV "go to previous mailbox" -+ OP_SIDEBAR_OPEN "open hilighted mailbox" -*** mutt-1.5.23/PATCHES ---- mutt-1.5.23/PATCHES Sat Apr 12 17:36:35 2014 -*************** -*** 1 **** ---- 1,2 ---- -+ patch-1.5.23.sidebar.20140412.txt - rr.compressed -*** mutt-1.5.23/buffy.c ---- mutt-1.5.23/buffy.c Sat Apr 12 20:33:54 2014 -*************** void mutt_buffy_cleanup (const char *buf -*** 161,166 **** ---- 161,209 ---- - } - } - -+ static int buffy_compare_name(const void *a, const void *b) { -+ const BUFFY *b1 = * (BUFFY * const *) a; -+ const BUFFY *b2 = * (BUFFY * const *) b; -+ -+ return mutt_strcoll(b1->path, b2->path); -+ } -+ -+ static BUFFY *buffy_sort(BUFFY *b) -+ { -+ BUFFY *tmp = b; -+ int buffycount = 0; -+ BUFFY **ary; -+ int i; -+ -+ if (!option(OPTSIDEBARSORT)) -+ return b; -+ -+ for (; tmp != NULL; tmp = tmp->next) -+ buffycount++; -+ -+ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary)); -+ -+ tmp = b; -+ for (i = 0; tmp != NULL; tmp = tmp->next, i++) { -+ ary[i] = tmp; -+ } -+ -+ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name); -+ -+ for (i = 0; i < buffycount - 1; i++) { -+ ary[i]->next = ary[i+1]; -+ } -+ ary[buffycount - 1]->next = NULL; -+ for (i = 1; i < buffycount; i++) { -+ ary[i]->prev = ary[i-1]; -+ } -+ ary[0]->prev = NULL; -+ -+ tmp = ary[0]; -+ free(ary); -+ return tmp; -+ } -+ - BUFFY *mutt_find_mailbox (const char *path) - { - BUFFY *tmp = NULL; -*************** void mutt_update_mailbox (BUFFY * b) -*** 196,204 **** ---- 239,251 ---- - static BUFFY *buffy_new (const char *path) - { - BUFFY* buffy; -+ char rp[PATH_MAX]; -+ char *r; - - buffy = (BUFFY *) safe_calloc (1, sizeof (BUFFY)); - strfcpy (buffy->path, path, sizeof (buffy->path)); -+ r = realpath(path, rp); -+ strfcpy (buffy->realpath, r ? rp : path, sizeof (buffy->realpath)); - buffy->next = NULL; - buffy->magic = 0; - -*************** int mutt_parse_mailboxes (BUFFER *path, -*** 243,250 **** - p = realpath (buf, f1); - for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) - { -! q = realpath ((*tmp)->path, f2); -! if (mutt_strcmp (p ? p : buf, q ? q : (*tmp)->path) == 0) - { - dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path)); - break; ---- 290,297 ---- - p = realpath (buf, f1); - for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) - { -! q = (*tmp)->realpath; -! if (mutt_strcmp (p ? p : buf, q) == 0) - { - dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path)); - break; -*************** int mutt_parse_mailboxes (BUFFER *path, -*** 282,287 **** ---- 329,335 ---- - else - (*tmp)->size = 0; - } -+ Incoming = buffy_sort(Incoming); - return 0; - } - -*************** static int buffy_maildir_hasnew (BUFFY* -*** 306,311 **** ---- 354,364 ---- - return 0; - } - -+ if (option(OPTSIDEBAR) && mailbox->msg_unread > 0) { -+ mailbox->new = 1; -+ return 1; -+ } -+ - if ((dirp = opendir (path)) == NULL) - { - mailbox->magic = 0; -*************** static int buffy_maildir_hasnew (BUFFY* -*** 340,345 **** ---- 393,464 ---- - return rc; - } - -+ /* update message counts for the sidebar */ -+ void buffy_maildir_update (BUFFY* mailbox) -+ { -+ char path[_POSIX_PATH_MAX]; -+ DIR *dirp; -+ struct dirent *de; -+ char *p; -+ -+ if(!option(OPTSIDEBAR)) -+ return; -+ -+ mailbox->msgcount = 0; -+ mailbox->msg_unread = 0; -+ mailbox->msg_flagged = 0; -+ -+ snprintf (path, sizeof (path), "%s/new", mailbox->path); -+ -+ if ((dirp = opendir (path)) == NULL) -+ { -+ mailbox->magic = 0; -+ return; -+ } -+ -+ while ((de = readdir (dirp)) != NULL) -+ { -+ if (*de->d_name == '.') -+ continue; -+ -+ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { -+ mailbox->new = 1; -+ mailbox->msgcount++; -+ mailbox->msg_unread++; -+ } -+ } -+ -+ closedir (dirp); -+ snprintf (path, sizeof (path), "%s/cur", mailbox->path); -+ -+ if ((dirp = opendir (path)) == NULL) -+ { -+ mailbox->magic = 0; -+ return; -+ } -+ -+ while ((de = readdir (dirp)) != NULL) -+ { -+ if (*de->d_name == '.') -+ continue; -+ -+ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { -+ mailbox->msgcount++; -+ if ((p = strstr (de->d_name, ":2,"))) { -+ if (!strchr (p + 3, 'T')) { -+ if (!strchr (p + 3, 'S')) -+ mailbox->msg_unread++; -+ if (strchr(p + 3, 'F')) -+ mailbox->msg_flagged++; -+ } -+ } -+ } -+ } -+ -+ mailbox->sb_last_checked = time(NULL); -+ closedir (dirp); -+ } -+ - /* returns 1 if mailbox has new mail */ - static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb) - { -*************** static int buffy_mbox_hasnew (BUFFY* mai -*** 351,357 **** - else - statcheck = sb->st_mtime > sb->st_atime - || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); -! if (statcheck) - { - if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) - { ---- 470,476 ---- - else - statcheck = sb->st_mtime > sb->st_atime - || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); -! if ((!option(OPTSIDEBAR) && statcheck) || (option(OPTSIDEBAR) && mailbox->msg_unread > 0)) - { - if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) - { -*************** static int buffy_mbox_hasnew (BUFFY* mai -*** 371,376 **** ---- 490,516 ---- - return rc; - } - -+ /* update message counts for the sidebar */ -+ void buffy_mbox_update (BUFFY* mailbox, struct stat *sb) -+ { -+ CONTEXT *ctx = NULL; -+ -+ if(!option(OPTSIDEBAR)) -+ return; -+ if(mailbox->sb_last_checked > sb->st_mtime && mailbox->msgcount != 0) -+ return; /* no check necessary */ -+ -+ ctx = mx_open_mailbox(mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL); -+ if(ctx) -+ { -+ mailbox->msgcount = ctx->msgcount; -+ mailbox->msg_unread = ctx->unread; -+ mailbox->msg_flagged = ctx->flagged; -+ mailbox->sb_last_checked = time(NULL); -+ mx_close_mailbox(ctx, 0); -+ } -+ } -+ - int mutt_buffy_check (int force) - { - BUFFY *tmp; -*************** int mutt_buffy_check (int force) -*** 444,460 **** - { - case M_MBOX: - case M_MMDF: - if (buffy_mbox_hasnew (tmp, &sb) > 0) - BuffyCount++; - break; - - case M_MAILDIR: - if (buffy_maildir_hasnew (tmp) > 0) - BuffyCount++; - break; - - case M_MH: -! mh_buffy(tmp); - if (tmp->new) - BuffyCount++; - break; ---- 584,603 ---- - { - case M_MBOX: - case M_MMDF: -+ buffy_mbox_update (tmp, &sb); - if (buffy_mbox_hasnew (tmp, &sb) > 0) - BuffyCount++; - break; - - case M_MAILDIR: -+ buffy_maildir_update (tmp); - if (buffy_maildir_hasnew (tmp) > 0) - BuffyCount++; - break; - - case M_MH: -! mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged, &tmp->sb_last_checked); -! mh_buffy(tmp); - if (tmp->new) - BuffyCount++; - break; -*** mutt-1.5.23/buffy.h ---- mutt-1.5.23/buffy.h Fri Apr 11 15:14:01 2014 -*************** -*** 23,35 **** ---- 23,41 ---- - typedef struct buffy_t - { - char path[_POSIX_PATH_MAX]; -+ char realpath[_POSIX_PATH_MAX]; - off_t size; - struct buffy_t *next; -+ struct buffy_t *prev; - short new; /* mailbox has new mail */ -+ int msgcount; /* total number of messages */ -+ int msg_unread; /* number of unread messages */ -+ int msg_flagged; /* number of flagged messages */ - short notified; /* user has been notified */ - short magic; /* mailbox type */ - short newly_created; /* mbox or mmdf just popped into existence */ - time_t last_visited; /* time of last exit from this mailbox */ -+ time_t sb_last_checked; /* time of last buffy check from sidebar */ - } - BUFFY; - -*** mutt-1.5.23/color.c ---- mutt-1.5.23/color.c Fri Apr 11 15:14:01 2014 -*************** static const struct mapping_t Fields[] = -*** 93,98 **** ---- 93,100 ---- - { "bold", MT_COLOR_BOLD }, - { "underline", MT_COLOR_UNDERLINE }, - { "index", MT_COLOR_INDEX }, -+ { "sidebar_new", MT_COLOR_NEW }, -+ { "sidebar_flagged", MT_COLOR_FLAGGED }, - { NULL, 0 } - }; - -*** mutt-1.5.23/compose.c ---- mutt-1.5.23/compose.c Sat Apr 12 17:15:56 2014 -*************** enum -*** 72,78 **** - - #define HDR_XOFFSET 10 - #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ -! #define W (COLS - HDR_XOFFSET) - - static const char * const Prompts[] = - { ---- 72,78 ---- - - #define HDR_XOFFSET 10 - #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ -! #define W (COLS - HDR_XOFFSET - SidebarWidth) - - static const char * const Prompts[] = - { -*************** static void snd_entry (char *b, size_t b -*** 110,116 **** - - static void redraw_crypt_lines (HEADER *msg) - { -! mvaddstr (HDR_CRYPT, 0, "Security: "); - - if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) - { ---- 110,116 ---- - - static void redraw_crypt_lines (HEADER *msg) - { -! mvaddstr (HDR_CRYPT, SidebarWidth, "Security: "); - - if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) - { -*************** static void redraw_crypt_lines (HEADER * -*** 142,148 **** - } - - clrtoeol (); -! move (HDR_CRYPTINFO, 0); - clrtoeol (); - - if ((WithCrypto & APPLICATION_PGP) ---- 142,148 ---- - } - - clrtoeol (); -! move (HDR_CRYPTINFO, SidebarWidth); - clrtoeol (); - - if ((WithCrypto & APPLICATION_PGP) -*************** static void redraw_crypt_lines (HEADER * -*** 159,165 **** - && (msg->security & ENCRYPT) - && SmimeCryptAlg - && *SmimeCryptAlg) { -! mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "), - NONULL(SmimeCryptAlg)); - } - } ---- 159,165 ---- - && (msg->security & ENCRYPT) - && SmimeCryptAlg - && *SmimeCryptAlg) { -! mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "), - NONULL(SmimeCryptAlg)); - } - } -*************** static void redraw_mix_line (LIST *chain -*** 172,178 **** - int c; - char *t; - -! mvaddstr (HDR_MIX, 0, " Mix: "); - - if (!chain) - { ---- 172,178 ---- - int c; - char *t; - -! mvaddstr (HDR_MIX, SidebarWidth, " Mix: "); - - if (!chain) - { -*************** static void redraw_mix_line (LIST *chain -*** 187,193 **** - if (t && t[0] == '0' && t[1] == '\0') - t = ""; - -! if (c + mutt_strlen (t) + 2 >= COLS) - break; - - addstr (NONULL(t)); ---- 187,193 ---- - if (t && t[0] == '0' && t[1] == '\0') - t = ""; - -! if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth) - break; - - addstr (NONULL(t)); -*************** static void draw_envelope_addr (int line -*** 239,245 **** - - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), addr, 1); -! mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]); - mutt_paddstr (W, buf); - } - ---- 239,245 ---- - - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), addr, 1); -! mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]); - mutt_paddstr (W, buf); - } - -*************** static void draw_envelope (HEADER *msg, -*** 249,258 **** - draw_envelope_addr (HDR_TO, msg->env->to); - draw_envelope_addr (HDR_CC, msg->env->cc); - draw_envelope_addr (HDR_BCC, msg->env->bcc); -! mvprintw (HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); - mutt_paddstr (W, NONULL (msg->env->subject)); - draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); -! mvprintw (HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]); - mutt_paddstr (W, fcc); - - if (WithCrypto) ---- 249,258 ---- - draw_envelope_addr (HDR_TO, msg->env->to); - draw_envelope_addr (HDR_CC, msg->env->cc); - draw_envelope_addr (HDR_BCC, msg->env->bcc); -! mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); - mutt_paddstr (W, NONULL (msg->env->subject)); - draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); -! mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]); - mutt_paddstr (W, fcc); - - if (WithCrypto) -*************** static void draw_envelope (HEADER *msg, -*** 263,269 **** - #endif - - SETCOLOR (MT_COLOR_STATUS); -! mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); - clrtoeol (); - - NORMAL_COLOR; ---- 263,269 ---- - #endif - - SETCOLOR (MT_COLOR_STATUS); -! mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments")); - clrtoeol (); - - NORMAL_COLOR; -*************** static int edit_address_list (int line, -*** 299,305 **** - /* redraw the expanded list so the user can see the result */ - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), *addr, 1); -! move (line, HDR_XOFFSET); - mutt_paddstr (W, buf); - - return 0; ---- 299,305 ---- - /* redraw the expanded list so the user can see the result */ - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), *addr, 1); -! move (line, HDR_XOFFSET+SidebarWidth); - mutt_paddstr (W, buf); - - return 0; -*************** int mutt_compose_menu (HEADER *msg, /* -*** 544,550 **** - if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) - { - mutt_str_replace (&msg->env->subject, buf); -! move (HDR_SUBJECT, HDR_XOFFSET); - if (msg->env->subject) - mutt_paddstr (W, msg->env->subject); - else ---- 544,550 ---- - if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) - { - mutt_str_replace (&msg->env->subject, buf); -! move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth); - if (msg->env->subject) - mutt_paddstr (W, msg->env->subject); - else -*************** int mutt_compose_menu (HEADER *msg, /* -*** 562,568 **** - { - strfcpy (fcc, buf, fcclen); - mutt_pretty_mailbox (fcc, fcclen); -! move (HDR_FCC, HDR_XOFFSET); - mutt_paddstr (W, fcc); - fccSet = 1; - } ---- 562,568 ---- - { - strfcpy (fcc, buf, fcclen); - mutt_pretty_mailbox (fcc, fcclen); -! move (HDR_FCC, HDR_XOFFSET + SidebarWidth); - mutt_paddstr (W, fcc); - fccSet = 1; - } -*** mutt-1.5.23/configure.ac ---- mutt-1.5.23/configure.ac Fri Apr 11 15:14:01 2014 -*************** if test $mutt_cv_langinfo_yesexpr = yes; -*** 1289,1294 **** ---- 1289,1296 ---- - AC_DEFINE(HAVE_LANGINFO_YESEXPR,1,[ Define if you have and nl_langinfo(YESEXPR). ]) - fi - -+ AC_CHECK_FUNCS(fmemopen open_memstream) -+ - dnl Documentation tools - have_openjade="no" - AC_PATH_PROG([OSPCAT], [ospcat], [none]) -*** mutt-1.5.23/curs_main.c ---- mutt-1.5.23/curs_main.c Sun Apr 13 02:45:21 2014 -*************** -*** 26,32 **** ---- 26,34 ---- - #include "mailbox.h" - #include "mapping.h" - #include "sort.h" -+ #include "buffy.h" - #include "mx.h" -+ #include "sidebar.h" - - #ifdef USE_POP - #include "pop.h" -*************** int mutt_index_menu (void) -*** 532,551 **** - menu->redraw |= REDRAW_STATUS; - if (do_buffy_notify) - { -! if (mutt_buffy_notify () && option (OPTBEEPNEW)) -! beep (); - } - else - do_buffy_notify = 1; - } - - if (op != -1) - mutt_curs_set (0); - - if (menu->redraw & REDRAW_FULL) - { - menu_redraw_full (menu); - mutt_show_error (); - } - - if (menu->menu == MENU_MAIN) ---- 534,564 ---- - menu->redraw |= REDRAW_STATUS; - if (do_buffy_notify) - { -! if (mutt_buffy_notify ()) -! { -! menu->redraw |= REDRAW_STATUS; -! if (option (OPTBEEPNEW)) -! beep (); -! } - } - else - do_buffy_notify = 1; - } - -+ if(option(OPTSIDEBAR)) -+ menu->redraw |= REDRAW_SIDEBAR; -+ - if (op != -1) - mutt_curs_set (0); - - if (menu->redraw & REDRAW_FULL) - { - menu_redraw_full (menu); -+ draw_sidebar(menu->menu); - mutt_show_error (); -+ } else if(menu->redraw & REDRAW_SIDEBAR) { -+ draw_sidebar(menu->menu); -+ menu->redraw &= ~REDRAW_SIDEBAR; - } - - if (menu->menu == MENU_MAIN) -*************** int mutt_index_menu (void) -*** 567,575 **** ---- 580,591 ---- - - if (menu->redraw & REDRAW_STATUS) - { -+ DrawFullLine = 1; - menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); -+ DrawFullLine = 0; - move (option (OPTSTATUSONTOP) ? 0 : LINES-2, 0); - SETCOLOR (MT_COLOR_STATUS); -+ set_buffystats(Context); - mutt_paddstr (COLS, buf); - NORMAL_COLOR; - menu->redraw &= ~REDRAW_STATUS; -*************** int mutt_index_menu (void) -*** 589,595 **** - menu->oldcurrent = -1; - - if (option (OPTARROWCURSOR)) -! move (menu->current - menu->top + menu->offset, 2); - else if (option (OPTBRAILLEFRIENDLY)) - move (menu->current - menu->top + menu->offset, 0); - else ---- 605,611 ---- - menu->oldcurrent = -1; - - if (option (OPTARROWCURSOR)) -! move (menu->current - menu->top + menu->offset, SidebarWidth + 2); - else if (option (OPTBRAILLEFRIENDLY)) - move (menu->current - menu->top + menu->offset, 0); - else -*************** int mutt_index_menu (void) -*** 1031,1036 **** ---- 1047,1053 ---- - break; - - CHECK_MSGCOUNT; -+ CHECK_VISIBLE; - CHECK_READONLY; - { - int oldvcount = Context->vcount; -*************** int mutt_index_menu (void) -*** 1090,1095 **** ---- 1107,1113 ---- - menu->redraw = REDRAW_FULL; - break; - -+ case OP_SIDEBAR_OPEN: - case OP_MAIN_CHANGE_FOLDER: - case OP_MAIN_NEXT_UNREAD_MAILBOX: - -*************** int mutt_index_menu (void) -*** 1121,1127 **** - { - mutt_buffy (buf, sizeof (buf)); - -! if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) - { - if (menu->menu == MENU_PAGER) - { ---- 1139,1149 ---- - { - mutt_buffy (buf, sizeof (buf)); - -! if ( op == OP_SIDEBAR_OPEN ) { -! if(!CurBuffy) -! break; -! strncpy( buf, CurBuffy->path, sizeof(buf) ); -! } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) - { - if (menu->menu == MENU_PAGER) - { -*************** int mutt_index_menu (void) -*** 1139,1144 **** ---- 1161,1167 ---- - } - - mutt_expand_path (buf, sizeof (buf)); -+ set_curbuffy(buf); - if (mx_get_magic (buf) <= 0) - { - mutt_error (_("%s is not a mailbox."), buf); -*************** int mutt_index_menu (void) -*** 2234,2239 **** ---- 2257,2268 ---- - mutt_what_key(); - break; - -+ case OP_SIDEBAR_SCROLL_UP: -+ case OP_SIDEBAR_SCROLL_DOWN: -+ case OP_SIDEBAR_NEXT: -+ case OP_SIDEBAR_PREV: -+ scroll_sidebar(op, menu->menu); -+ break; - default: - if (menu->menu == MENU_MAIN) - km_error_key (MENU_MAIN); -*** mutt-1.5.23/doc/Muttrc ---- mutt-1.5.23/doc/Muttrc Fri Apr 11 15:14:01 2014 -*************** set check_mbox_size=yes -*** 657,662 **** ---- 657,682 ---- - # $crypt_autosign, $crypt_replysign and $smime_is_default. - # - # -+ # set sidebar_visible=no -+ # -+ # Name: sidebar_visible -+ # Type: boolean -+ # Default: no -+ # -+ # -+ # This specifies whether or not to show sidebar (left-side list of folders). -+ # -+ # -+ # set sidebar_width=0 -+ # -+ # Name: sidebar_width -+ # Type: number -+ # Default: 0 -+ # -+ # -+ # The width of the sidebar. -+ # -+ # - # set crypt_autosign=no - # - # Name: crypt_autosign -*** mutt-1.5.23/flags.c ---- mutt-1.5.23/flags.c Fri Apr 11 15:14:01 2014 -*************** -*** 22,29 **** ---- 22,31 ---- - - #include "mutt.h" - #include "mutt_curses.h" -+ #include "mutt_menu.h" - #include "sort.h" - #include "mx.h" -+ #include "sidebar.h" - - void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx) - { -*************** void _mutt_set_flag (CONTEXT *ctx, HEADE -*** 263,268 **** ---- 265,271 ---- - */ - if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged)) - h->searched = 0; -+ draw_sidebar(0); - } - - void mutt_tag_set_flag (int flag, int bf) -*** mutt-1.5.23/functions.h ---- mutt-1.5.23/functions.h Fri Apr 11 15:14:01 2014 -*************** const struct binding_t OpMain[] = { /* m -*** 169,174 **** ---- 169,179 ---- - { "decrypt-save", OP_DECRYPT_SAVE, NULL }, - - -+ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, -+ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, -+ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, -+ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, -+ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, - { NULL, 0, NULL } - }; - -*************** const struct binding_t OpPager[] = { /* -*** 272,277 **** ---- 277,287 ---- - - { "what-key", OP_WHAT_KEY, NULL }, - -+ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, -+ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, -+ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, -+ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, -+ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, - { NULL, 0, NULL } - }; - -*** mutt-1.5.23/globals.h ---- mutt-1.5.23/globals.h Fri Apr 11 15:14:01 2014 -*************** WHERE short SearchContext; -*** 117,122 **** ---- 117,125 ---- - WHERE char *SendCharset; - WHERE char *Sendmail; - WHERE char *Shell; -+ WHERE char *SidebarDelim; -+ WHERE char *SidebarFormat; -+ WHERE char *SidebarIndentStr; - WHERE char *Signature; - WHERE char *SimpleSearch; - #if USE_SMTP -*************** WHERE short ScoreThresholdDelete; -*** 210,215 **** ---- 213,221 ---- - WHERE short ScoreThresholdRead; - WHERE short ScoreThresholdFlag; - -+ WHERE struct buffy_t *CurBuffy INITVAL(0); -+ WHERE short DrawFullLine INITVAL(0); -+ WHERE short SidebarWidth; - #ifdef USE_IMAP - WHERE short ImapKeepalive; - WHERE short ImapPipelineDepth; -*** mutt-1.5.23/handler.c ---- mutt-1.5.23/handler.c Fri Apr 11 15:14:01 2014 -*************** int mutt_body_handler (BODY *b, STATE *s -*** 1599,1604 **** ---- 1599,1609 ---- - size_t tmplength = 0; - int rc = 0; - -+ #ifdef HAVE_FMEMOPEN -+ char *temp; -+ size_t tempsize; -+ #endif -+ - int oflags = s->flags; - - /* first determine which handler to use to process this part */ -*************** int mutt_body_handler (BODY *b, STATE *s -*** 1711,1716 **** ---- 1716,1729 ---- - { - /* decode to a tempfile, saving the original destination */ - fp = s->fpout; -+ #ifdef HAVE_FMEMOPEN -+ if ((s->fpout = open_memstream(&temp, &tempsize)) == NULL) -+ { -+ mutt_error _("Unable to open memory stream!"); -+ dprint (1, (debugfile, "Can't open memory stream.\n")); -+ goto bail; -+ } -+ #else - mutt_mktemp (tempfile, sizeof (tempfile)); - if ((s->fpout = safe_fopen (tempfile, "w")) == NULL) - { -*************** int mutt_body_handler (BODY *b, STATE *s -*** 1718,1723 **** ---- 1731,1737 ---- - dprint (1, (debugfile, "Can't open %s.\n", tempfile)); - goto bail; - } -+ #endif - /* decoding the attachment changes the size and offset, so save a copy - * of the "real" values now, and restore them after processing - */ -*************** int mutt_body_handler (BODY *b, STATE *s -*** 1746,1753 **** ---- 1760,1778 ---- - /* restore final destination and substitute the tempfile for input */ - s->fpout = fp; - fp = s->fpin; -+ #ifdef HAVE_FMEMOPEN -+ if(tempsize) -+ s->fpin = fmemopen(temp, tempsize, "r"); -+ else /* fmemopen cannot handle zero-length buffers */ -+ s->fpin = safe_fopen ("/dev/null", "r"); -+ if(s->fpin == NULL) { -+ mutt_perror("failed to re-open memstream!"); -+ return (-1); -+ } -+ #else - s->fpin = fopen (tempfile, "r"); - unlink (tempfile); -+ #endif - - /* restore the prefix */ - s->prefix = savePrefix; -*************** int mutt_body_handler (BODY *b, STATE *s -*** 1773,1778 **** ---- 1798,1807 ---- - - /* restore the original source stream */ - safe_fclose (&s->fpin); -+ #ifdef HAVE_FMEMOPEN -+ if(tempsize) -+ FREE(&temp); -+ #endif - s->fpin = fp; - } - } -*** mutt-1.5.23/imap/command.c ---- mutt-1.5.23/imap/command.c Fri Apr 11 15:14:01 2014 -*************** static void cmd_parse_status (IMAP_DATA* -*** 1012,1017 **** ---- 1012,1024 ---- - opened */ - status->uidnext = oldun; - -+ /* Added to make the sidebar show the correct numbers */ -+ if (status->messages) -+ { -+ inc->msgcount = status->messages; -+ inc->msg_unread = status->unseen; -+ } -+ - FREE (&value); - return; - } -*** mutt-1.5.23/imap/imap.c ---- mutt-1.5.23/imap/imap.c Fri Apr 11 15:14:01 2014 -*************** int imap_buffy_check (int force) -*** 1514,1520 **** - - imap_munge_mbox_name (munged, sizeof (munged), name); - snprintf (command, sizeof (command), -! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged); - - if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) - { ---- 1514,1520 ---- - - imap_munge_mbox_name (munged, sizeof (munged), name); - snprintf (command, sizeof (command), -! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged); - - if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) - { -*** mutt-1.5.23/init.h ---- mutt-1.5.23/init.h Fri Apr 11 15:14:01 2014 -*************** struct option_t MuttVars[] = { -*** 1966,1971 **** ---- 1966,2019 ---- - ** not used. - ** (PGP only) - */ -+ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, UL "|"}, -+ /* -+ ** .pp -+ ** This specifies the delimiter between the sidebar (if visible) and -+ ** other screens. -+ */ -+ {"sidebar_indentstr", DT_STR, R_BOTH, UL &SidebarIndentStr, UL " "}, -+ /* -+ ** .pp -+ ** This specifies the string that is used to indent items -+ ** with sidebar_folderindent= yes -+ */ -+ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 }, -+ /* -+ ** .pp -+ ** This specifies whether or not to show sidebar (left-side list of folders). -+ */ -+ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 }, -+ /* -+ ** .pp -+ ** This specifies whether or not to sort the sidebar alphabetically. -+ */ -+ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 }, -+ /* -+ ** .pp -+ ** The width of the sidebar. -+ */ -+ { "sidebar_shortpath", DT_BOOL, R_BOTH, OPTSIDEBARSHORTPATH, 0 }, -+ /* -+ ** .pp -+ ** Should the sidebar shorten the path showed. -+ */ -+ {"sidebar_format", DT_STR, R_NONE, UL &SidebarFormat, UL "%B%?F? [%F]?%* %?N?%N/?%4S"}, -+ /* -+ ** .pp -+ ** Format string for the sidebar. The sequences `%N', `%F' and `%S' -+ ** will be replaced by the number of new or flagged messages or the total -+ ** size of them mailbox. `%B' will be replaced with the name of the mailbox. -+ ** The `%!' sequence will be expanded to `!' if there is one flagged message; -+ ** to `!!' if there are two flagged messages; and to `n!' for n flagged -+ ** messages, n>2. -+ */ -+ { "sidebar_folderindent", DT_BOOL, R_BOTH, OPTSIDEBARFOLDERINDENT, 0 }, -+ /* -+ ** .pp -+ ** Should folders be indented in the sidebar. -+ */ -+ - { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0}, - /* - ** .pp -*** mutt-1.5.23/mailbox.h ---- mutt-1.5.23/mailbox.h Fri Apr 11 15:14:01 2014 -*************** -*** 27,32 **** ---- 27,33 ---- - #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses - * safe_fopen() for mbox-style folders. - */ -+ #define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */ - - /* mx_open_new_message() */ - #define M_ADD_FROM 1 /* add a From_ line */ -*** mutt-1.5.23/main.c ---- mutt-1.5.23/main.c Fri Apr 11 15:14:01 2014 -*************** -*** 50,55 **** ---- 50,56 ---- - #include - #include - #include -+ #include - #include - - #ifdef HAVE_GETOPT_H -*************** init_extended_keys(); -*** 561,567 **** - - int main (int argc, char **argv) - { -! char folder[_POSIX_PATH_MAX] = ""; - char *subject = NULL; - char *includeFile = NULL; - char *draftFile = NULL; ---- 562,568 ---- - - int main (int argc, char **argv) - { -! char folder[PATH_MAX] = ""; - char *subject = NULL; - char *includeFile = NULL; - char *draftFile = NULL; -*************** int main (int argc, char **argv) -*** 1031,1036 **** ---- 1032,1044 ---- - 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); - -*************** int main (int argc, char **argv) -*** 1053,1058 **** ---- 1061,1067 ---- - if((Context = mx_open_mailbox (folder, ((flags & M_RO) || option (OPTREADONLY)) ? M_READONLY : 0, NULL)) - || !explicit_folder) - { -+ set_curbuffy(folder); - mutt_index_menu (); - if (Context) - FREE (&Context); -*** mutt-1.5.23/mbox.c ---- mutt-1.5.23/mbox.c Fri Apr 11 15:14:01 2014 -*************** int mmdf_parse_mailbox (CONTEXT *ctx) -*** 104,109 **** ---- 104,110 ---- - mutt_perror (ctx->path); - return (-1); - } -+ ctx->atime = sb.st_atime; - ctx->mtime = sb.st_mtime; - ctx->size = sb.st_size; - -*************** int mbox_parse_mailbox (CONTEXT *ctx) -*** 255,260 **** ---- 256,262 ---- - - ctx->size = sb.st_size; - ctx->mtime = sb.st_mtime; -+ ctx->atime = sb.st_atime; - - #ifdef NFS_ATTRIBUTE_HACK - if (sb.st_mtime > sb.st_atime) -*** mutt-1.5.23/menu.c ---- mutt-1.5.23/menu.c Sun Apr 13 02:31:16 2014 -*************** -*** 24,29 **** ---- 24,30 ---- - #include "mutt_curses.h" - #include "mutt_menu.h" - #include "mbyte.h" -+ #include "sidebar.h" - - extern size_t UngetCount; - -*************** static void menu_pad_string (char *s, si -*** 186,192 **** - { - char *scratch = safe_strdup (s); - int shift = option (OPTARROWCURSOR) ? 3 : 0; -! int cols = COLS - shift; - - mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); - s[n - 1] = 0; ---- 187,193 ---- - { - char *scratch = safe_strdup (s); - int shift = option (OPTARROWCURSOR) ? 3 : 0; -! int cols = COLS - shift - SidebarWidth; - - mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); - s[n - 1] = 0; -*************** void menu_redraw_index (MUTTMENU *menu) -*** 239,244 **** ---- 240,246 ---- - int do_color; - int attr; - -+ draw_sidebar(1); - for (i = menu->top; i < menu->top + menu->pagelen; i++) - { - if (i < menu->max) -*************** void menu_redraw_index (MUTTMENU *menu) -*** 249,255 **** - menu_pad_string (buf, sizeof (buf)); - - ATTRSET(attr); -! move(i - menu->top + menu->offset, 0); - do_color = 1; - - if (i == menu->current) ---- 251,257 ---- - menu_pad_string (buf, sizeof (buf)); - - ATTRSET(attr); -! move(i - menu->top + menu->offset, SidebarWidth); - do_color = 1; - - if (i == menu->current) -*************** void menu_redraw_index (MUTTMENU *menu) -*** 272,278 **** - else - { - NORMAL_COLOR; -! CLEARLINE(i - menu->top + menu->offset); - } - } - NORMAL_COLOR; ---- 274,280 ---- - else - { - NORMAL_COLOR; -! CLEARLINE_WIN (i - menu->top + menu->offset); - } - } - NORMAL_COLOR; -*************** void menu_redraw_motion (MUTTMENU *menu) -*** 289,295 **** - return; - } - -! move (menu->oldcurrent + menu->offset - menu->top, 0); - ATTRSET(menu->color (menu->oldcurrent)); - - if (option (OPTARROWCURSOR)) ---- 291,297 ---- - return; - } - -! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); - ATTRSET(menu->color (menu->oldcurrent)); - - if (option (OPTARROWCURSOR)) -*************** void menu_redraw_motion (MUTTMENU *menu) -*** 301,313 **** - { - menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); - menu_pad_string (buf, sizeof (buf)); -! move (menu->oldcurrent + menu->offset - menu->top, 3); - print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); - } - - /* now draw it in the new location */ - SETCOLOR(MT_COLOR_INDICATOR); -! mvaddstr(menu->current + menu->offset - menu->top, 0, "->"); - } - else - { ---- 303,315 ---- - { - menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); - menu_pad_string (buf, sizeof (buf)); -! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3); - print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); - } - - /* now draw it in the new location */ - SETCOLOR(MT_COLOR_INDICATOR); -! mvaddstr(menu->current + menu->offset - menu->top, SidebarWidth, "->"); - } - else - { -*************** void menu_redraw_motion (MUTTMENU *menu) -*** 320,326 **** - menu_make_entry (buf, sizeof (buf), menu, menu->current); - menu_pad_string (buf, sizeof (buf)); - SETCOLOR(MT_COLOR_INDICATOR); -! move(menu->current - menu->top + menu->offset, 0); - print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); - } - menu->redraw &= REDRAW_STATUS; ---- 322,328 ---- - menu_make_entry (buf, sizeof (buf), menu, menu->current); - menu_pad_string (buf, sizeof (buf)); - SETCOLOR(MT_COLOR_INDICATOR); -! move(menu->current - menu->top + menu->offset, SidebarWidth); - print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); - } - menu->redraw &= REDRAW_STATUS; -*************** void menu_redraw_current (MUTTMENU *menu -*** 332,338 **** - char buf[LONG_STRING]; - int attr = menu->color (menu->current); - -! move (menu->current + menu->offset - menu->top, 0); - menu_make_entry (buf, sizeof (buf), menu, menu->current); - menu_pad_string (buf, sizeof (buf)); - ---- 334,340 ---- - char buf[LONG_STRING]; - int attr = menu->color (menu->current); - -! move (menu->current + menu->offset - menu->top, SidebarWidth); - menu_make_entry (buf, sizeof (buf), menu, menu->current); - menu_pad_string (buf, sizeof (buf)); - -*************** int mutt_menuLoop (MUTTMENU *menu) -*** 872,878 **** - - - if (option (OPTARROWCURSOR)) -! move (menu->current - menu->top + menu->offset, 2); - else if (option (OPTBRAILLEFRIENDLY)) - move (menu->current - menu->top + menu->offset, 0); - else ---- 874,880 ---- - - - if (option (OPTARROWCURSOR)) -! move (menu->current - menu->top + menu->offset, SidebarWidth + 2); - else if (option (OPTBRAILLEFRIENDLY)) - move (menu->current - menu->top + menu->offset, 0); - else -*** mutt-1.5.23/mh.c ---- mutt-1.5.23/mh.c Fri Apr 11 16:04:59 2014 -*************** void mh_buffy(BUFFY *b) -*** 295,300 **** ---- 295,326 ---- - mhs_free_sequences (&mhs); - } - -+ void mh_buffy_update (const char *path, int *msgcount, int *msg_unread, int *msg_flagged, time_t *sb_last_checked) -+ { -+ int i; -+ struct mh_sequences mhs; -+ memset (&mhs, 0, sizeof (mhs)); -+ -+ if(!option(OPTSIDEBAR)) -+ return; -+ -+ if (mh_read_sequences (&mhs, path) < 0) -+ return; -+ -+ msgcount = 0; -+ msg_unread = 0; -+ msg_flagged = 0; -+ for (i = 0; i <= mhs.max; i++) -+ msgcount++; -+ if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) { -+ msg_unread++; -+ } -+ if (mhs_check (&mhs, i) & MH_SEQ_FLAGGED) -+ msg_flagged++; -+ mhs_free_sequences (&mhs); -+ *sb_last_checked = time(NULL); -+ } -+ - static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) - { - int fd; -*** mutt-1.5.23/mutt.h ---- mutt-1.5.23/mutt.h Mon Jan 26 15:01:48 2015 -*************** enum -*** 427,432 **** ---- 427,436 ---- - OPTSAVENAME, - OPTSENDGROUPREPLYTO, - OPTSCORE, -+ OPTSIDEBAR, -+ OPTSIDEBARSHORTPATH, -+ OPTSIDEBARSORT, -+ OPTSIDEBARFOLDERINDENT, - OPTSIGDASHES, - OPTSIGONTOP, - OPTSORTRE, -*************** typedef struct _context -*** 868,873 **** ---- 872,878 ---- - { - char *path; - FILE *fp; -+ time_t atime; - time_t mtime; - off_t size; - off_t vsize; -*************** typedef struct _context -*** 907,912 **** ---- 912,918 ---- - unsigned int quiet : 1; /* inhibit status messages? */ - unsigned int collapsed : 1; /* are all threads collapsed? */ - unsigned int closing : 1; /* mailbox is being closed */ -+ unsigned int peekonly : 1; /* just taking a glance, revert atime */ - - /* driver hooks */ - void *data; /* driver specific data */ -*** mutt-1.5.23/mutt_curses.h ---- mutt-1.5.23/mutt_curses.h Fri Apr 11 15:14:01 2014 -*************** -*** 64,69 **** ---- 64,70 ---- - #undef lines - #endif /* lines */ - -+ #define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol() - #define CLEARLINE(x) move(x,0), clrtoeol() - #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x) - #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0) -*************** enum -*** 120,125 **** ---- 121,128 ---- - MT_COLOR_BOLD, - MT_COLOR_UNDERLINE, - MT_COLOR_INDEX, -+ MT_COLOR_NEW, -+ MT_COLOR_FLAGGED, - MT_COLOR_MAX - }; - -*** mutt-1.5.23/mutt_menu.h ---- mutt-1.5.23/mutt_menu.h Fri Apr 11 15:14:01 2014 -*************** -*** 34,39 **** ---- 34,40 ---- - #define REDRAW_FULL (1<<5) - #define REDRAW_BODY (1<<6) - #define REDRAW_SIGWINCH (1<<7) -+ #define REDRAW_SIDEBAR (1<<8) - - #define M_MODEFMT "-- Mutt: %s" - -*** mutt-1.5.23/muttlib.c ---- mutt-1.5.23/muttlib.c Fri Apr 11 15:14:01 2014 -*************** void mutt_FormatString (char *dest, /* -*** 1281,1286 **** ---- 1281,1288 ---- - pl = pw = 1; - - /* see if there's room to add content, else ignore */ -+ if ( DrawFullLine ) -+ { - if ((col < COLS && wlen < destlen) || soft) - { - int pad; -*************** void mutt_FormatString (char *dest, /* -*** 1324,1329 **** ---- 1326,1377 ---- - col += wid; - src += pl; - } -+ } -+ else -+ { -+ if ((col < COLS-SidebarWidth && wlen < destlen) || soft) -+ { -+ int pad; -+ -+ /* get contents after padding */ -+ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags); -+ len = mutt_strlen (buf); -+ wid = mutt_strwidth (buf); -+ -+ /* try to consume as many columns as we can, if we don't have -+ * memory for that, use as much memory as possible */ -+ pad = (COLS - SidebarWidth - col - wid) / pw; -+ if (pad > 0 && wlen + (pad * pl) + len > destlen) -+ pad = ((signed)(destlen - wlen - len)) / pl; -+ if (pad > 0) -+ { -+ while (pad--) -+ { -+ memcpy (wptr, src, pl); -+ wptr += pl; -+ wlen += pl; -+ col += pw; -+ } -+ } -+ else if (soft && pad < 0) -+ { -+ /* \0-terminate dest for length computation in mutt_wstr_trunc() */ -+ *wptr = 0; -+ /* make sure right part is at most as wide as display */ -+ len = mutt_wstr_trunc (buf, destlen, COLS, &wid); -+ /* truncate left so that right part fits completely in */ -+ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col); -+ wptr = dest + wlen; -+ } -+ if (len + wlen > destlen) -+ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL); -+ memcpy (wptr, buf, len); -+ wptr += len; -+ wlen += len; -+ col += wid; -+ src += pl; -+ } -+ } - break; /* skip rest of input */ - } - else if (ch == '|') -*** mutt-1.5.23/mx.c ---- mutt-1.5.23/mx.c Mon Jan 26 15:02:43 2015 -*************** static int mx_open_mailbox_append (CONTE -*** 596,601 **** ---- 596,602 ---- - * 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) -*************** CONTEXT *mx_open_mailbox (const char *pa -*** 618,623 **** ---- 619,626 ---- - ctx->quiet = 1; - if (flags & M_READONLY) - ctx->readonly = 1; -+ if (flags & M_PEEK) -+ ctx->peekonly = 1; - - if (flags & (M_APPEND|M_NEWFOLDER)) - { -*************** CONTEXT *mx_open_mailbox (const char *pa -*** 722,734 **** - void mx_fastclose_mailbox (CONTEXT *ctx) - { - int i; - - if(!ctx) - return; - - /* never announce that a mailbox we've just left has new mail. #3290 - * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ -! mutt_buffy_setnotified(ctx->path); - - if (ctx->mx_close) - ctx->mx_close (ctx); ---- 725,750 ---- - void mx_fastclose_mailbox (CONTEXT *ctx) - { - int i; -+ #ifndef BUFFY_SIZE -+ struct utimbuf ut; -+ #endif - - if(!ctx) - return; -+ #ifndef BUFFY_SIZE -+ /* fix up the times so buffy won't get confused */ -+ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime) -+ { -+ ut.actime = ctx->atime; -+ ut.modtime = ctx->mtime; -+ utime (ctx->path, &ut); -+ } -+ #endif - - /* never announce that a mailbox we've just left has new mail. #3290 - * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ -! if(!ctx->peekonly) -! mutt_buffy_setnotified(ctx->path); - - if (ctx->mx_close) - ctx->mx_close (ctx); -*************** void mx_fastclose_mailbox (CONTEXT *ctx) -*** 740,745 **** ---- 756,763 ---- - 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 -*************** int mx_close_mailbox (CONTEXT *ctx, int -*** 843,848 **** ---- 861,870 ---- - if (!ctx->hdrs[i]->deleted && ctx->hdrs[i]->read - && !(ctx->hdrs[i]->flagged && option (OPTKEEPFLAGGED))) - read_msgs++; -+ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read) -+ ctx->unread--; -+ if (ctx->hdrs[i]->deleted && ctx->hdrs[i]->flagged) -+ ctx->flagged--; - } - - if (read_msgs && quadoption (OPT_MOVE) != M_NO) -*** mutt-1.5.23/mx.h ---- mutt-1.5.23/mx.h Fri Apr 11 16:11:47 2014 -*************** void mbox_reset_atime (CONTEXT *, struct -*** 60,65 **** ---- 60,66 ---- - int mh_read_dir (CONTEXT *, const char *); - int mh_sync_mailbox (CONTEXT *, int *); - int mh_check_mailbox (CONTEXT *, int *); -+ void mh_buffy_update (const char *, int *, int *, int *, time_t *); - int mh_check_empty (const char *); - - int maildir_read_dir (CONTEXT *); -*** mutt-1.5.23/pager.c ---- mutt-1.5.23/pager.c Mon Jan 26 15:08:29 2015 -*************** -*** 29,34 **** ---- 29,35 ---- - #include "pager.h" - #include "attach.h" - #include "mbyte.h" -+ #include "sidebar.h" - - #include "mutt_crypt.h" - -*************** static int format_line (struct line_t ** -*** 1095,1100 **** ---- 1096,1102 ---- - wchar_t wc; - mbstate_t mbstate; - int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap); -+ wrap_cols -= SidebarWidth; - - if (check_attachment_marker ((char *)buf) == 0) - wrap_cols = COLS; -*************** mutt_pager (const char *banner, const ch -*** 1572,1577 **** ---- 1574,1580 ---- - - int bodyoffset = 1; /* offset of first line of real text */ - int statusoffset = 0; /* offset for the status bar */ -+ int statuswidth; - int helpoffset = LINES - 2; /* offset for the help bar. */ - int bodylen = LINES - 2 - bodyoffset; /* length of displayable area */ - -*************** mutt_pager (const char *banner, const ch -*** 1746,1752 **** - if ((redraw & REDRAW_BODY) || topline != oldtopline) - { - do { -! move (bodyoffset, 0); - curline = oldtopline = topline; - lines = 0; - force_redraw = 0; ---- 1749,1755 ---- - if ((redraw & REDRAW_BODY) || topline != oldtopline) - { - do { -! move (bodyoffset, SidebarWidth); - curline = oldtopline = topline; - lines = 0; - force_redraw = 0; -*************** mutt_pager (const char *banner, const ch -*** 1759,1764 **** ---- 1762,1768 ---- - &QuoteList, &q_level, &force_redraw, &SearchRE) > 0) - lines++; - curline++; -+ move(lines + bodyoffset, SidebarWidth); - } - last_offset = lineInfo[curline].offset; - } while (force_redraw); -*************** mutt_pager (const char *banner, const ch -*** 1771,1776 **** ---- 1775,1781 ---- - addch ('~'); - addch ('\n'); - lines++; -+ move(lines + bodyoffset, SidebarWidth); - } - NORMAL_COLOR; - -*************** mutt_pager (const char *banner, const ch -*** 1788,1816 **** - hfi.ctx = Context; - hfi.pager_progress = pager_progress_str; - - if (last_pos < sb.st_size - 1) - snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size)); - else - strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str)); - - /* print out the pager status bar */ -! move (statusoffset, 0); - SETCOLOR (MT_COLOR_STATUS); - - if (IsHeader (extra) || IsMsgAttach (extra)) - { -! size_t l1 = COLS * MB_LEN_MAX; - size_t l2 = sizeof (buffer); - hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; - mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); -! mutt_paddstr (COLS, buffer); - } - else - { - char bn[STRING]; - snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); -! mutt_paddstr (COLS, bn); - } - NORMAL_COLOR; - if (option(OPTXTERMSETTITLES)) - { ---- 1793,1831 ---- - hfi.ctx = Context; - hfi.pager_progress = pager_progress_str; - -+ statuswidth = COLS - (option(OPTSTATUSONTOP) && PagerIndexLines > 0 ? SidebarWidth : 0); -+ - if (last_pos < sb.st_size - 1) - snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size)); - else - strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str)); - - /* print out the pager status bar */ -! move (statusoffset, SidebarWidth); - SETCOLOR (MT_COLOR_STATUS); -+ if(option(OPTSTATUSONTOP) && PagerIndexLines > 0) { -+ CLEARLINE_WIN (statusoffset); -+ } else { -+ CLEARLINE (statusoffset); -+ DrawFullLine = 1; /* for mutt_make_string_info */ -+ } - - if (IsHeader (extra) || IsMsgAttach (extra)) - { -! size_t l1 = statuswidth * MB_LEN_MAX; - size_t l2 = sizeof (buffer); - hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; - mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); -! mutt_paddstr (statuswidth, buffer); - } - else - { - char bn[STRING]; - snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); -! mutt_paddstr (statuswidth, bn); - } -+ if(!option(OPTSTATUSONTOP) || PagerIndexLines == 0) -+ DrawFullLine = 0; /* reset */ - NORMAL_COLOR; - if (option(OPTXTERMSETTITLES)) - { -*************** mutt_pager (const char *banner, const ch -*** 1826,1841 **** - /* redraw the pager_index indicator, because the - * flags for this message might have changed. */ - menu_redraw_current (index); - - /* print out the index status bar */ - menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); - -! move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); - SETCOLOR (MT_COLOR_STATUS); -! mutt_paddstr (COLS, buffer); - NORMAL_COLOR; - } - - redraw = 0; - - if (option(OPTBRAILLEFRIENDLY)) { ---- 1841,1862 ---- - /* redraw the pager_index indicator, because the - * flags for this message might have changed. */ - menu_redraw_current (index); -+ draw_sidebar(MENU_PAGER); - - /* print out the index status bar */ - menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); - -! move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), -! (option(OPTSTATUSONTOP) ? 0: SidebarWidth)); - SETCOLOR (MT_COLOR_STATUS); -! mutt_paddstr (COLS - (option(OPTSTATUSONTOP) ? 0 : SidebarWidth), buffer); - NORMAL_COLOR; - } - -+ /* if we're not using the index, update every time */ -+ if ( index == 0 ) -+ draw_sidebar(MENU_PAGER); -+ - redraw = 0; - - if (option(OPTBRAILLEFRIENDLY)) { -*************** search_next: -*** 2770,2775 **** ---- 2791,2803 ---- - mutt_what_key (); - break; - -+ case OP_SIDEBAR_SCROLL_UP: -+ case OP_SIDEBAR_SCROLL_DOWN: -+ case OP_SIDEBAR_NEXT: -+ case OP_SIDEBAR_PREV: -+ scroll_sidebar(ch, MENU_PAGER); -+ break; -+ - default: - ch = -1; - break; -*** mutt-1.5.23/pattern.c ---- mutt-1.5.23/pattern.c Fri Apr 11 15:14:01 2014 -*************** msg_search (CONTEXT *ctx, pattern_t* pat -*** 154,159 **** ---- 154,163 ---- - HEADER *h = ctx->hdrs[msgno]; - char *buf; - size_t blen; -+ #ifdef HAVE_FMEMOPEN -+ char *temp; -+ size_t tempsize; -+ #endif - - if ((msg = mx_open_message (ctx, msgno)) != NULL) - { -*************** msg_search (CONTEXT *ctx, pattern_t* pat -*** 163,174 **** ---- 167,186 ---- - memset (&s, 0, sizeof (s)); - s.fpin = msg->fp; - s.flags = M_CHARCONV; -+ #ifdef HAVE_FMEMOPEN -+ if((s.fpout = open_memstream(&temp, &tempsize)) == NULL) -+ { -+ mutt_perror ("Error opening memstream"); -+ return (0); -+ } -+ #else - mutt_mktemp (tempfile, sizeof (tempfile)); - if ((s.fpout = safe_fopen (tempfile, "w+")) == NULL) - { - mutt_perror (tempfile); - return (0); - } -+ #endif - - if (pat->op != M_BODY) - mutt_copy_header (msg->fp, h, s.fpout, CH_FROM | CH_DECODE, NULL); -*************** msg_search (CONTEXT *ctx, pattern_t* pat -*** 184,190 **** ---- 196,206 ---- - if (s.fpout) - { - safe_fclose (&s.fpout); -+ #ifdef HAVE_FMEMOPEN -+ FREE(&temp); -+ #else - unlink (tempfile); -+ #endif - } - return (0); - } -*************** msg_search (CONTEXT *ctx, pattern_t* pat -*** 193,203 **** ---- 209,236 ---- - mutt_body_handler (h->content, &s); - } - -+ #ifdef HAVE_FMEMOPEN -+ fclose(s.fpout); -+ lng = tempsize; -+ -+ if(tempsize) { -+ if ((fp = fmemopen(temp, tempsize, "r")) == NULL) { -+ mutt_perror ("Error re-opening memstream"); -+ return (0); -+ } -+ } else { /* fmemopen cannot handle empty buffers */ -+ if ((fp = safe_fopen ("/dev/null", "r")) == NULL) { -+ mutt_perror ("Error opening /dev/null"); -+ return (0); -+ } -+ } -+ #else - fp = s.fpout; - fflush (fp); - fseek (fp, 0, 0); - fstat (fileno (fp), &st); - lng = (long) st.st_size; -+ #endif - } - else - { -*************** msg_search (CONTEXT *ctx, pattern_t* pat -*** 244,250 **** ---- 277,288 ---- - if (option (OPTTHOROUGHSRC)) - { - safe_fclose (&fp); -+ #ifdef HAVE_FMEMOPEN -+ if(tempsize) -+ FREE (&temp); -+ #else - unlink (tempfile); -+ #endif - } - } - -*** mutt-1.5.23/protos.h ---- mutt-1.5.23/protos.h Fri Apr 11 15:14:01 2014 -*************** struct hdr_format_info -*** 36,41 **** ---- 36,48 ---- - const char *pager_progress; - }; - -+ struct sidebar_entry { -+ char box[SHORT_STRING]; -+ unsigned int size; -+ unsigned int new; -+ unsigned int flagged; -+ }; -+ - void mutt_make_string_info (char *, size_t, const char *, struct hdr_format_info *, format_flag); - - int mutt_extract_token (BUFFER *, BUFFER *, int); -*** mutt-1.5.23/sidebar.c ---- mutt-1.5.23/sidebar.c Fri Apr 11 15:14:01 2014 -*************** -*** 0 **** ---- 1,405 ---- -+ /* -+ * Copyright (C) ????-2004 Justin Hibbits -+ * Copyright (C) 2004 Thomer M. Gil -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. -+ */ -+ -+ -+ #if HAVE_CONFIG_H -+ # include "config.h" -+ #endif -+ -+ #include "mutt.h" -+ #include "mutt_menu.h" -+ #include "mutt_curses.h" -+ #include "sidebar.h" -+ #include "buffy.h" -+ #include -+ #include "keymap.h" -+ #include -+ -+ /*BUFFY *CurBuffy = 0;*/ -+ static BUFFY *TopBuffy = 0; -+ static BUFFY *BottomBuffy = 0; -+ static int known_lines = 0; -+ -+ void calc_boundaries() { -+ -+ BUFFY *tmp = Incoming; -+ -+ int count = LINES - 2 - (option(OPTHELP) ? 1 : 0); -+ -+ if ( known_lines != LINES ) { -+ TopBuffy = BottomBuffy = 0; -+ known_lines = LINES; -+ } -+ for ( ; tmp->next != 0; tmp = tmp->next ) -+ tmp->next->prev = tmp; -+ -+ if ( TopBuffy == 0 && BottomBuffy == 0 ) -+ TopBuffy = Incoming; -+ if ( BottomBuffy == 0 ) { -+ BottomBuffy = TopBuffy; -+ while ( --count && BottomBuffy->next ) -+ BottomBuffy = BottomBuffy->next; -+ } -+ else if ( TopBuffy == CurBuffy->next ) { -+ BottomBuffy = CurBuffy; -+ tmp = BottomBuffy; -+ while ( --count && tmp->prev) -+ tmp = tmp->prev; -+ TopBuffy = tmp; -+ } -+ else if ( BottomBuffy == CurBuffy->prev ) { -+ TopBuffy = CurBuffy; -+ tmp = TopBuffy; -+ while ( --count && tmp->next ) -+ tmp = tmp->next; -+ BottomBuffy = tmp; -+ } -+ } -+ -+ static const char * -+ sidebar_format_str (char *dest, -+ size_t destlen, -+ size_t col, -+ char op, -+ const char *src, -+ const char *prefix, -+ const char *ifstring, -+ const char *elsestring, -+ unsigned long data, -+ format_flag flags) -+ { -+ /* casting from unsigned long - srsly?! */ -+ struct sidebar_entry *sbe = (struct sidebar_entry *) data; -+ unsigned int optional; -+ char fmt[SHORT_STRING], buf[SHORT_STRING]; -+ -+ optional = flags & M_FORMAT_OPTIONAL; -+ -+ switch(op) { -+ case 'F': -+ if(!optional) { -+ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); -+ snprintf (dest, destlen, fmt, sbe->flagged); -+ } else if(sbe->flagged == 0) { -+ optional = 0; -+ } -+ break; -+ -+ case '!': -+ if(sbe->flagged == 0) -+ mutt_format_s(dest, destlen, prefix, ""); -+ if(sbe->flagged == 1) -+ mutt_format_s(dest, destlen, prefix, "!"); -+ if(sbe->flagged == 2) -+ mutt_format_s(dest, destlen, prefix, "!!"); -+ if(sbe->flagged > 2) { -+ snprintf (buf, sizeof (buf), "%d!", sbe->flagged); -+ mutt_format_s(dest, destlen, prefix, buf); -+ } -+ break; -+ -+ case 'S': -+ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); -+ snprintf (dest, destlen, fmt, sbe->size); -+ break; -+ -+ case 'N': -+ if(!optional) { -+ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); -+ snprintf (dest, destlen, fmt, sbe->new); -+ } else if(sbe->new == 0) { -+ optional = 0; -+ } -+ break; -+ -+ case 'B': -+ mutt_format_s(dest, destlen, prefix, sbe->box); -+ break; -+ } -+ -+ if(optional) -+ mutt_FormatString (dest, destlen, col, ifstring, sidebar_format_str, (unsigned long) sbe, flags); -+ else if (flags & M_FORMAT_OPTIONAL) -+ mutt_FormatString (dest, destlen, col, elsestring, sidebar_format_str, (unsigned long) sbe, flags); -+ -+ return (src); -+ } -+ -+ char *make_sidebar_entry(char *box, unsigned int size, unsigned int new, unsigned int flagged) { -+ static char *entry = 0; -+ struct sidebar_entry sbe; -+ int SBvisual; -+ -+ SBvisual = SidebarWidth - strlen(SidebarDelim); -+ if (SBvisual < 1) -+ return NULL; -+ -+ sbe.new = new; -+ sbe.flagged = flagged; -+ sbe.size = size; -+ strncpy(sbe.box, box, 31); -+ -+ safe_realloc(&entry, SBvisual + 2); -+ entry[SBvisual + 1] = '\0'; -+ -+ mutt_FormatString (entry, SBvisual+1, 0, SidebarFormat, sidebar_format_str, (unsigned long) &sbe, 0); -+ -+ return entry; -+ } -+ -+ void set_curbuffy(char buf[LONG_STRING]) -+ { -+ BUFFY* tmp = CurBuffy = Incoming; -+ -+ if (!Incoming) -+ return; -+ -+ while(1) { -+ if(!strcmp(tmp->path, buf) || !strcmp(tmp->realpath, buf)) { -+ CurBuffy = tmp; -+ break; -+ } -+ -+ if(tmp->next) -+ tmp = tmp->next; -+ else -+ break; -+ } -+ } -+ -+ int draw_sidebar(int menu) { -+ -+ BUFFY *tmp; -+ #ifndef USE_SLANG_CURSES -+ attr_t attrs; -+ #endif -+ short delim_len = strlen(SidebarDelim); -+ short color_pair; -+ -+ static bool initialized = false; -+ static int prev_show_value; -+ static short saveSidebarWidth; -+ int lines = 0; -+ int SidebarHeight; -+ -+ if(option(OPTSTATUSONTOP) || option(OPTHELP)) -+ lines++; /* either one will occupy the first line */ -+ -+ /* initialize first time */ -+ if(!initialized) { -+ prev_show_value = option(OPTSIDEBAR); -+ saveSidebarWidth = SidebarWidth; -+ if(!option(OPTSIDEBAR)) SidebarWidth = 0; -+ initialized = true; -+ } -+ -+ /* save or restore the value SidebarWidth */ -+ if(prev_show_value != option(OPTSIDEBAR)) { -+ if(prev_show_value && !option(OPTSIDEBAR)) { -+ saveSidebarWidth = SidebarWidth; -+ SidebarWidth = 0; -+ } else if(!prev_show_value && option(OPTSIDEBAR)) { -+ mutt_buffy_check(1); /* we probably have bad or no numbers */ -+ SidebarWidth = saveSidebarWidth; -+ } -+ prev_show_value = option(OPTSIDEBAR); -+ } -+ -+ -+ /* if ( SidebarWidth == 0 ) return 0; */ -+ if (SidebarWidth > 0 && option (OPTSIDEBAR) -+ && delim_len >= SidebarWidth) { -+ unset_option (OPTSIDEBAR); -+ /* saveSidebarWidth = SidebarWidth; */ -+ if (saveSidebarWidth > delim_len) { -+ SidebarWidth = saveSidebarWidth; -+ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar.")); -+ sleep (2); -+ } else { -+ SidebarWidth = 0; -+ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value.")); -+ sleep (4); /* the advise to set a sane value should be seen long enough */ -+ } -+ saveSidebarWidth = 0; -+ return (0); -+ } -+ -+ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) { -+ if (SidebarWidth > 0) { -+ saveSidebarWidth = SidebarWidth; -+ SidebarWidth = 0; -+ } -+ unset_option(OPTSIDEBAR); -+ return 0; -+ } -+ -+ /* get attributes for divider */ -+ SETCOLOR(MT_COLOR_STATUS); -+ #ifndef USE_SLANG_CURSES -+ attr_get(&attrs, &color_pair, 0); -+ #else -+ color_pair = attr_get(); -+ #endif -+ SETCOLOR(MT_COLOR_NORMAL); -+ -+ /* draw the divider */ -+ -+ SidebarHeight = LINES - 1; -+ if(option(OPTHELP) || !option(OPTSTATUSONTOP)) -+ SidebarHeight--; -+ -+ for ( ; lines < SidebarHeight; lines++ ) { -+ move(lines, SidebarWidth - delim_len); -+ addstr(NONULL(SidebarDelim)); -+ #ifndef USE_SLANG_CURSES -+ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); -+ #endif -+ } -+ -+ if ( Incoming == 0 ) return 0; -+ lines = 0; -+ if(option(OPTSTATUSONTOP) || option(OPTHELP)) -+ lines++; /* either one will occupy the first line */ -+ -+ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) -+ calc_boundaries(menu); -+ if ( CurBuffy == 0 ) CurBuffy = Incoming; -+ -+ tmp = TopBuffy; -+ -+ SETCOLOR(MT_COLOR_NORMAL); -+ -+ for ( ; tmp && lines < SidebarHeight; tmp = tmp->next ) { -+ if ( tmp == CurBuffy ) -+ SETCOLOR(MT_COLOR_INDICATOR); -+ else if ( tmp->msg_unread > 0 ) -+ SETCOLOR(MT_COLOR_NEW); -+ else if ( tmp->msg_flagged > 0 ) -+ SETCOLOR(MT_COLOR_FLAGGED); -+ else -+ SETCOLOR(MT_COLOR_NORMAL); -+ -+ move( lines, 0 ); -+ if ( Context && (!strcmp(tmp->path, Context->path)|| -+ !strcmp(tmp->realpath, Context->path)) ) { -+ tmp->msg_unread = Context->unread; -+ tmp->msgcount = Context->msgcount; -+ tmp->msg_flagged = Context->flagged; -+ } -+ /* check whether Maildir is a prefix of the current folder's path */ -+ short maildir_is_prefix = 0; -+ if ( (strlen(tmp->path) > strlen(Maildir)) && -+ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) -+ maildir_is_prefix = 1; -+ /* calculate depth of current folder and generate its display name with indented spaces */ -+ int sidebar_folder_depth = 0; -+ char *sidebar_folder_name; -+ sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir) + 1); -+ if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) { -+ char *tmp_folder_name; -+ int i; -+ tmp_folder_name = tmp->path + strlen(Maildir) + 1; -+ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { -+ if (tmp_folder_name[i] == '/' || tmp_folder_name[i] == '.') sidebar_folder_depth++; -+ } -+ if (sidebar_folder_depth > 0) { -+ if (option(OPTSIDEBARSHORTPATH)) { -+ tmp_folder_name = strrchr(tmp->path, '.'); -+ if (tmp_folder_name == NULL) -+ tmp_folder_name = mutt_basename(tmp->path); -+ else -+ tmp_folder_name++; -+ } -+ else -+ tmp_folder_name = tmp->path + strlen(Maildir) + 1; -+ sidebar_folder_name = malloc(strlen(tmp_folder_name) + sidebar_folder_depth*strlen(NONULL(SidebarIndentStr)) + 1); -+ sidebar_folder_name[0]=0; -+ for (i=0; i < sidebar_folder_depth; i++) -+ strncat(sidebar_folder_name, NONULL(SidebarIndentStr), strlen(NONULL(SidebarIndentStr))); -+ strncat(sidebar_folder_name, tmp_folder_name, strlen(tmp_folder_name)); -+ } -+ } -+ printw( "%.*s", SidebarWidth - delim_len + 1, -+ make_sidebar_entry(sidebar_folder_name, tmp->msgcount, -+ tmp->msg_unread, tmp->msg_flagged)); -+ if (sidebar_folder_depth > 0) -+ free(sidebar_folder_name); -+ lines++; -+ } -+ SETCOLOR(MT_COLOR_NORMAL); -+ for ( ; lines < SidebarHeight; lines++ ) { -+ int i = 0; -+ move( lines, 0 ); -+ for ( ; i < SidebarWidth - delim_len; i++ ) -+ addch(' '); -+ } -+ return 0; -+ } -+ -+ -+ void set_buffystats(CONTEXT* Context) -+ { -+ BUFFY *tmp = Incoming; -+ while(tmp) { -+ if(Context && (!strcmp(tmp->path, Context->path) || -+ !strcmp(tmp->realpath, Context->path))) { -+ tmp->msg_unread = Context->unread; -+ tmp->msgcount = Context->msgcount; -+ tmp->msg_flagged = Context->flagged; -+ break; -+ } -+ tmp = tmp->next; -+ } -+ } -+ -+ void scroll_sidebar(int op, int menu) -+ { -+ if(!SidebarWidth) return; -+ if(!CurBuffy) return; -+ -+ switch (op) { -+ case OP_SIDEBAR_NEXT: -+ if ( CurBuffy->next == NULL ) return; -+ CurBuffy = CurBuffy->next; -+ break; -+ case OP_SIDEBAR_PREV: -+ if ( CurBuffy->prev == NULL ) return; -+ CurBuffy = CurBuffy->prev; -+ break; -+ case OP_SIDEBAR_SCROLL_UP: -+ CurBuffy = TopBuffy; -+ if ( CurBuffy != Incoming ) { -+ calc_boundaries(menu); -+ CurBuffy = CurBuffy->prev; -+ } -+ break; -+ case OP_SIDEBAR_SCROLL_DOWN: -+ CurBuffy = BottomBuffy; -+ if ( CurBuffy->next ) { -+ calc_boundaries(menu); -+ CurBuffy = CurBuffy->next; -+ } -+ break; -+ default: -+ return; -+ } -+ calc_boundaries(menu); -+ draw_sidebar(menu); -+ } -+ -*** mutt-1.5.23/sidebar.h ---- mutt-1.5.23/sidebar.h Fri Apr 11 15:14:01 2014 -*************** -*** 0 **** ---- 1,36 ---- -+ /* -+ * Copyright (C) ????-2004 Justin Hibbits -+ * Copyright (C) 2004 Thomer M. Gil -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. -+ */ -+ -+ #ifndef SIDEBAR_H -+ #define SIDEBAR_H -+ -+ struct MBOX_LIST { -+ char *path; -+ int msgcount; -+ int new; -+ } MBLIST; -+ -+ /* parameter is whether or not to go to the status line */ -+ /* used for omitting the last | that covers up the status bar in the index */ -+ int draw_sidebar(int); -+ void scroll_sidebar(int, int); -+ void set_curbuffy(char*); -+ void set_buffystats(CONTEXT*); -+ -+ #endif /* SIDEBAR_H */ diff --git a/patch-1.5.23.xtitles.patch b/patch-1.5.23.xtitles.patch deleted file mode 100644 index df64beb..0000000 --- a/patch-1.5.23.xtitles.patch +++ /dev/null @@ -1,198 +0,0 @@ -From: Cristoph Berg -Date: Thu, 27 Feb 2014 12:25:51 +0100 -Subject: xtitles - -This is the xterm title patch as found on the mutt mailing lists. - -* Changes made: - - 2007-01-27 myon: using %P caused a segfault, updated status.c to catch - menu==NULL. - - 2007-02-20 myon: make the note about the xterm_set_titles defaults a - comment. - - 2008-08-02 myon: move set_xterm_* prototypes into the proper header file - (cleaner code, no functional change, evades conflict with sidebar patch) - -Signed-off-by: Matteo F. Vescovi - -Gbp-Pq: Topic features ---- - curs_main.c | 20 ++++++++++++++++++++ - globals.h | 2 ++ - init.c | 20 ++++++++++++++++++++ - init.h | 21 +++++++++++++++++++++ - mutt.h | 1 + - mutt_menu.h | 2 ++ - pager.c | 7 +++++++ - status.c | 2 ++ - 8 files changed, 75 insertions(+) - -diff --git a/curs_main.c b/curs_main.c -index aa4b044..16ddbc9 100644 ---- a/curs_main.c -+++ b/curs_main.c -@@ -110,6 +110,19 @@ static const char *No_visible = N_("No visible messages."); - - extern size_t UngetCount; - -+#define ASCII_CTRL_G 0x07 -+#define ASCII_CTRL_OPEN_SQUARE_BRAKET 0x1b -+ -+void set_xterm_title_bar(char *title) -+{ -+ fprintf(stderr ,"%c]2;%s%c", ASCII_CTRL_OPEN_SQUARE_BRAKET, title, ASCII_CTRL_G); -+} -+ -+void set_xterm_icon_name(char *name) -+{ -+ fprintf(stderr, "%c]1;%s%c", ASCII_CTRL_OPEN_SQUARE_BRAKET, name, ASCII_CTRL_G); -+} -+ - void index_make_entry (char *s, size_t l, MUTTMENU *menu, int num) - { - format_flag flag = M_FORMAT_MAKEPRINT | M_FORMAT_ARROWCURSOR | M_FORMAT_INDEX; -@@ -560,6 +573,13 @@ int mutt_index_menu (void) - mutt_paddstr (COLS, buf); - NORMAL_COLOR; - menu->redraw &= ~REDRAW_STATUS; -+ if (option(OPTXTERMSETTITLES)) -+ { -+ menu_status_line (buf, sizeof (buf), menu, NONULL (XtermTitle)); -+ set_xterm_title_bar(buf); -+ menu_status_line (buf, sizeof (buf), menu, NONULL (XtermIcon)); -+ set_xterm_icon_name(buf); -+ } - } - - menu->redraw = 0; -diff --git a/globals.h b/globals.h -index 6fefe5b..584cd0c 100644 ---- a/globals.h -+++ b/globals.h -@@ -141,6 +141,8 @@ WHERE char *Tempdir; - WHERE char *Tochars; - WHERE char *Username; - WHERE char *Visual; -+WHERE char *XtermTitle; -+WHERE char *XtermIcon; - - WHERE char *CurrentFolder; - WHERE char *LastFolder; -diff --git a/init.c b/init.c -index cc3cf4b..81bb9e7 100644 ---- a/init.c -+++ b/init.c -@@ -1877,6 +1877,26 @@ static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err) - toggle_option (MuttVars[idx].data); - else - set_option (MuttVars[idx].data); -+ -+ /* sanity check for xterm */ -+ if ((mutt_strcmp (MuttVars[idx].option, "xterm_set_titles") == 0) -+ && option (OPTXTERMSETTITLES)) -+ { -+ char *ep = getenv ("TERM"); -+ /* Make sure that the terminal can take the control codes */ -+ if (ep == NULL) unset_option (MuttVars[idx].data); -+ else if (mutt_strncasecmp (ep, "xterm", 5) && -+ mutt_strncasecmp (ep, "color-xterm", 11) && -+ mutt_strncasecmp (ep, "eterm", 5) && -+ mutt_strncasecmp (ep, "kterm", 5) && -+ mutt_strncasecmp (ep, "nxterm", 6) && -+ mutt_strncasecmp (ep, "putty", 5) && -+ mutt_strncasecmp (ep, "screen", 6) && -+ mutt_strncasecmp (ep, "cygwin", 6) && -+ mutt_strncasecmp (ep, "rxvt", 4) ) -+ unset_option (MuttVars[idx]. data); -+ -+ } - } - else if (myvar || DTYPE (MuttVars[idx].type) == DT_STR || - DTYPE (MuttVars[idx].type) == DT_PATH || -diff --git a/init.h b/init.h -index 80d05ce..cf8e75a 100644 ---- a/init.h -+++ b/init.h -@@ -3412,6 +3412,27 @@ struct option_t MuttVars[] = { - ** Also see the $$read_inc, $$net_inc and $$time_inc variables and the - ** ``$tuning'' section of the manual for performance considerations. - */ -+ {"xterm_icon", DT_STR, R_BOTH, UL &XtermIcon, UL "M%?n?AIL&ail?"}, -+ /* -+ ** .pp -+ ** Controls the format of the icon title, as long as xterm_set_titles -+ ** is enabled. This string is identical in formatting to the one used by -+ ** ``$$status_format''. -+ */ -+ {"xterm_set_titles", DT_BOOL, R_BOTH, OPTXTERMSETTITLES, 0}, -+ /* The default must be off to force in the validity checking. */ -+ /* -+ ** .pp -+ ** Controls whether mutt sets the xterm title bar and icon name -+ ** (as long as you are in an appropriate terminal). -+ */ -+ {"xterm_title", DT_STR, R_BOTH, UL &XtermTitle, UL "Mutt with %?m?%m messages&no messages?%?n? [%n NEW]?"}, -+ /* -+ ** .pp -+ ** Controls the format of the title bar of the xterm provided that -+ ** xterm_set_titles has been set. This string is identical in formatting -+ ** to the one used by ``$$status_format''. -+ */ - /*--*/ - { NULL, 0, 0, 0, 0 } - }; -diff --git a/mutt.h b/mutt.h -index dcd7dc5..1d7e177 100644 ---- a/mutt.h -+++ b/mutt.h -@@ -449,6 +449,7 @@ enum - OPTWRAPSEARCH, - OPTWRITEBCC, /* write out a bcc header? */ - OPTXMAILER, -+ OPTXTERMSETTITLES, - - OPTCRYPTUSEGPGME, - OPTCRYPTUSEPKA, -diff --git a/mutt_menu.h b/mutt_menu.h -index d459bef..82abecd 100644 ---- a/mutt_menu.h -+++ b/mutt_menu.h -@@ -103,6 +103,8 @@ void menu_current_middle (MUTTMENU *); - void menu_current_bottom (MUTTMENU *); - void menu_check_recenter (MUTTMENU *); - void menu_status_line (char *, size_t, MUTTMENU *, const char *); -+void set_xterm_title_bar (char *title); -+void set_xterm_icon_name (char *name); - - MUTTMENU *mutt_new_menu (int); - void mutt_menuDestroy (MUTTMENU **); -diff --git a/pager.c b/pager.c -index 486d8c8..23eb8ca 100644 ---- a/pager.c -+++ b/pager.c -@@ -1812,6 +1812,13 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra) - mutt_paddstr (COLS, bn); - } - NORMAL_COLOR; -+ if (option(OPTXTERMSETTITLES)) -+ { -+ menu_status_line (buffer, sizeof (buffer), index, NONULL (XtermTitle)); -+ set_xterm_title_bar(buffer); -+ menu_status_line (buffer, sizeof (buffer), index, NONULL (XtermIcon)); -+ set_xterm_icon_name(buffer); -+ } - } - - if ((redraw & REDRAW_INDEX) && index) -diff --git a/status.c b/status.c -index 1bb9a5a..6051e3a 100644 ---- a/status.c -+++ b/status.c -@@ -195,6 +195,8 @@ status_format_str (char *buf, size_t buflen, size_t col, char op, const char *sr - break; - - case 'P': -+ if (!menu) -+ break; - if (menu->top + menu->pagelen >= menu->max) - cp = menu->top ? "end" : "all"; - else diff --git a/patch-1.5.24.rr.compressed.bz2 b/patch-1.5.24.rr.compressed.bz2 new file mode 100644 index 0000000..deadb93 --- /dev/null +++ b/patch-1.5.24.rr.compressed.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b1e63f051e53cb84faa541635df295c0a1e04a1f5a8cf3747f3b1eadb4561a9 +size 9696 diff --git a/patch-1.5.24.sidebar.20140412.patch b/patch-1.5.24.sidebar.20140412.patch new file mode 100644 index 0000000..18dbbd0 --- /dev/null +++ b/patch-1.5.24.sidebar.20140412.patch @@ -0,0 +1,1937 @@ +--- + Makefile.am | 1 + Makefile.in | 8 - + OPS | 5 + PATCHES | 1 + buffy.c | 152 ++++++++++++++++++++- + buffy.h | 6 + color.c | 2 + compose.c | 26 +-- + configure.ac | 2 + curs_main.c | 37 ++++- + doc/Muttrc | 20 ++ + flags.c | 3 + functions.h | 10 + + globals.h | 6 + handler.c | 30 ++++ + imap/command.c | 7 + imap/imap.c | 2 + init.h | 48 ++++++ + mailbox.h | 1 + main.c | 11 + + mbox.c | 2 + menu.c | 20 +- + mh.c | 26 +++ + mutt.h | 6 + mutt_curses.h | 3 + mutt_menu.h | 1 + muttlib.c | 48 ++++++ + mx.c | 24 +++ + mx.h | 1 + pager.c | 43 +++++- + pattern.c | 38 +++++ + protos.h | 7 + sidebar.c | 405 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + sidebar.h | 36 +++++ + 34 files changed, 995 insertions(+), 43 deletions(-) + +--- Makefile.am ++++ Makefile.am 2014-04-11 15:14:01.000000000 +0000 +@@ -34,6 +34,7 @@ mutt_SOURCES = \ + rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \ + score.c send.c sendlib.c signal.c sort.c \ + status.c system.c thread.c charset.c history.c lib.c \ ++ sidebar.c \ + muttlib.c editmsg.c mbyte.c \ + url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c + +--- Makefile.in ++++ Makefile.in 2015-09-11 14:21:58.526018901 +0000 +@@ -134,7 +134,8 @@ am_mutt_OBJECTS = addrbook.$(OBJEXT) ali + system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ + history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ + editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ +- ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) ++ ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) \ ++ sidebar.$(OBJEXT) + am__objects_1 = + am__objects_2 = patchlist.$(OBJEXT) conststrings.$(OBJEXT) \ + $(am__objects_1) +@@ -479,7 +480,8 @@ mutt_SOURCES = \ + score.c send.c sendlib.c signal.c sort.c \ + status.c system.c thread.c charset.c history.c lib.c \ + muttlib.c editmsg.c mbyte.c \ +- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c ++ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c \ ++ sidebar.c + + nodist_mutt_SOURCES = $(BUILT_SOURCES) + mutt_LDADD = $(MUTT_LIB_OBJECTS) $(LIBOBJS) $(LIBIMAP) $(MUTTLIBS) \ +@@ -511,7 +513,7 @@ EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP O + README.SSL smime.h group.h \ + muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ + ChangeLog mkchangelog.sh mutt_idna.h \ +- snprintf.c regex.c crypt-gpgme.h hcachever.sh.in \ ++ snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in \ + txt2c.c txt2c.sh version.sh check_sec.sh + + EXTRA_SCRIPTS = smime_keys +--- OPS ++++ OPS 2014-04-11 15:14:01.000000000 +0000 +@@ -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" +--- PATCHES ++++ PATCHES 2014-04-12 17:36:35.000000000 +0000 +@@ -1 +1,2 @@ ++patch-1.5.23.sidebar.20140412.txt + rr.compressed +--- buffy.c ++++ buffy.c 2015-09-11 14:23:43.438018482 +0000 +@@ -161,6 +161,49 @@ void mutt_buffy_cleanup (const char *buf + } + } + ++static int buffy_compare_name(const void *a, const void *b) { ++ const BUFFY *b1 = * (BUFFY * const *) a; ++ const BUFFY *b2 = * (BUFFY * const *) b; ++ ++ return mutt_strcoll(b1->path, b2->path); ++} ++ ++static BUFFY *buffy_sort(BUFFY *b) ++{ ++ BUFFY *tmp = b; ++ int buffycount = 0; ++ BUFFY **ary; ++ int i; ++ ++ if (!option(OPTSIDEBARSORT)) ++ return b; ++ ++ for (; tmp != NULL; tmp = tmp->next) ++ buffycount++; ++ ++ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary)); ++ ++ tmp = b; ++ for (i = 0; tmp != NULL; tmp = tmp->next, i++) { ++ ary[i] = tmp; ++ } ++ ++ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name); ++ ++ for (i = 0; i < buffycount - 1; i++) { ++ ary[i]->next = ary[i+1]; ++ } ++ ary[buffycount - 1]->next = NULL; ++ for (i = 1; i < buffycount; i++) { ++ ary[i]->prev = ary[i-1]; ++ } ++ ary[0]->prev = NULL; ++ ++ tmp = ary[0]; ++ free(ary); ++ return tmp; ++} ++ + BUFFY *mutt_find_mailbox (const char *path) + { + BUFFY *tmp = NULL; +@@ -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, + 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, + else + (*tmp)->size = 0; + } ++ Incoming = buffy_sort(Incoming); + return 0; + } + +@@ -306,6 +354,11 @@ static int buffy_maildir_dir_hasnew(BUFF + 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* + + return 0; + } ++ ++/* update message counts for the sidebar */ ++void buffy_maildir_update (BUFFY* mailbox) ++{ ++ char path[_POSIX_PATH_MAX]; ++ DIR *dirp; ++ struct dirent *de; ++ char *p; ++ ++ if(!option(OPTSIDEBAR)) ++ return; ++ ++ mailbox->msgcount = 0; ++ mailbox->msg_unread = 0; ++ mailbox->msg_flagged = 0; ++ ++ snprintf (path, sizeof (path), "%s/new", mailbox->path); ++ ++ if ((dirp = opendir (path)) == NULL) ++ { ++ mailbox->magic = 0; ++ return; ++ } ++ ++ while ((de = readdir (dirp)) != NULL) ++ { ++ if (*de->d_name == '.') ++ continue; ++ ++ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { ++ mailbox->new = 1; ++ mailbox->msgcount++; ++ mailbox->msg_unread++; ++ } ++ } ++ ++ closedir (dirp); ++ snprintf (path, sizeof (path), "%s/cur", mailbox->path); ++ ++ if ((dirp = opendir (path)) == NULL) ++ { ++ mailbox->magic = 0; ++ return; ++ } ++ ++ while ((de = readdir (dirp)) != NULL) ++ { ++ if (*de->d_name == '.') ++ continue; ++ ++ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { ++ mailbox->msgcount++; ++ if ((p = strstr (de->d_name, ":2,"))) { ++ if (!strchr (p + 3, 'T')) { ++ if (!strchr (p + 3, 'S')) ++ mailbox->msg_unread++; ++ if (strchr(p + 3, 'F')) ++ mailbox->msg_flagged++; ++ } ++ } ++ } ++ } ++ ++ mailbox->sb_last_checked = time(NULL); ++ closedir (dirp); ++} ++ + /* returns 1 if mailbox has new mail */ + static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb) + { +@@ -368,7 +488,7 @@ static int buffy_mbox_hasnew (BUFFY* mai + 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* mai + return rc; + } + ++/* update message counts for the sidebar */ ++void buffy_mbox_update (BUFFY* mailbox, struct stat *sb) ++{ ++ CONTEXT *ctx = NULL; ++ ++ if(!option(OPTSIDEBAR)) ++ return; ++ if(mailbox->sb_last_checked > sb->st_mtime && mailbox->msgcount != 0) ++ return; /* no check necessary */ ++ ++ ctx = mx_open_mailbox(mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL); ++ if(ctx) ++ { ++ mailbox->msgcount = ctx->msgcount; ++ mailbox->msg_unread = ctx->unread; ++ mailbox->msg_flagged = ctx->flagged; ++ mailbox->sb_last_checked = time(NULL); ++ mx_close_mailbox(ctx, 0); ++ } ++} ++ + int mutt_buffy_check (int force) + { + BUFFY *tmp; +@@ -461,17 +602,20 @@ int mutt_buffy_check (int force) + { + case M_MBOX: + case M_MMDF: ++ buffy_mbox_update (tmp, &sb); + if (buffy_mbox_hasnew (tmp, &sb) > 0) + BuffyCount++; + break; + + case M_MAILDIR: ++ buffy_maildir_update (tmp); + if (buffy_maildir_hasnew (tmp) > 0) + BuffyCount++; + break; + + case M_MH: +- mh_buffy(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; +--- buffy.h ++++ buffy.h 2014-04-11 15:14:01.000000000 +0000 +@@ -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; + short new; /* mailbox has new mail */ ++ int msgcount; /* total number of messages */ ++ int msg_unread; /* number of unread messages */ ++ int msg_flagged; /* number of flagged messages */ + short notified; /* user has been notified */ + short magic; /* mailbox type */ + short newly_created; /* mbox or mmdf just popped into existence */ + time_t last_visited; /* time of last exit from this mailbox */ ++ time_t sb_last_checked; /* time of last buffy check from sidebar */ + } + BUFFY; + +--- color.c ++++ color.c 2015-09-11 14:25:20.109819549 +0000 +@@ -93,6 +93,8 @@ static const struct mapping_t Fields[] = + { "bold", MT_COLOR_BOLD }, + { "underline", MT_COLOR_UNDERLINE }, + { "index", MT_COLOR_INDEX }, ++ { "sidebar_new", MT_COLOR_NEW }, ++ { "sidebar_flagged", MT_COLOR_FLAGGED }, + { "prompt", MT_COLOR_PROMPT }, + { NULL, 0 } + }; +--- compose.c ++++ compose.c 2015-09-11 14:26:05.873518387 +0000 +@@ -72,7 +72,7 @@ enum + + #define HDR_XOFFSET 10 + #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ +-#define W (COLS - HDR_XOFFSET) ++#define W (COLS - HDR_XOFFSET - SidebarWidth) + + static const char * const Prompts[] = + { +@@ -110,7 +110,7 @@ static void snd_entry (char *b, size_t b + + static void redraw_crypt_lines (HEADER *msg) + { +- mvaddstr (HDR_CRYPT, 0, "Security: "); ++ mvaddstr (HDR_CRYPT, SidebarWidth, "Security: "); + + if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) + { +@@ -145,7 +145,7 @@ static void redraw_crypt_lines (HEADER * + addstr (_(" (OppEnc mode)")); + + clrtoeol (); +- move (HDR_CRYPTINFO, 0); ++ move (HDR_CRYPTINFO, SidebarWidth); + clrtoeol (); + + if ((WithCrypto & APPLICATION_PGP) +@@ -162,7 +162,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)); + } + } +@@ -175,7 +175,7 @@ static void redraw_mix_line (LIST *chain + int c; + char *t; + +- mvaddstr (HDR_MIX, 0, " Mix: "); ++ mvaddstr (HDR_MIX, SidebarWidth, " Mix: "); + + if (!chain) + { +@@ -190,7 +190,7 @@ static void redraw_mix_line (LIST *chain + if (t && t[0] == '0' && t[1] == '\0') + t = ""; + +- if (c + mutt_strlen (t) + 2 >= COLS) ++ if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth) + break; + + addstr (NONULL(t)); +@@ -242,7 +242,7 @@ static void draw_envelope_addr (int line + + buf[0] = 0; + rfc822_write_address (buf, sizeof (buf), addr, 1); +- mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]); ++ mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]); + mutt_paddstr (W, buf); + } + +@@ -252,10 +252,10 @@ static void draw_envelope (HEADER *msg, + draw_envelope_addr (HDR_TO, msg->env->to); + draw_envelope_addr (HDR_CC, msg->env->cc); + draw_envelope_addr (HDR_BCC, msg->env->bcc); +- mvprintw (HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); ++ mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); + mutt_paddstr (W, NONULL (msg->env->subject)); + draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); +- mvprintw (HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]); ++ mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]); + mutt_paddstr (W, fcc); + + if (WithCrypto) +@@ -266,7 +266,7 @@ static void draw_envelope (HEADER *msg, + #endif + + SETCOLOR (MT_COLOR_STATUS); +- mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); ++ mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments")); + clrtoeol (); + + NORMAL_COLOR; +@@ -302,7 +302,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; +@@ -562,7 +562,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); + if (msg->env->subject) + mutt_paddstr (W, msg->env->subject); + else +@@ -580,7 +580,7 @@ int mutt_compose_menu (HEADER *msg, /* + { + strfcpy (fcc, buf, fcclen); + mutt_pretty_mailbox (fcc, fcclen); +- move (HDR_FCC, HDR_XOFFSET); ++ move (HDR_FCC, HDR_XOFFSET + SidebarWidth); + mutt_paddstr (W, fcc); + fccSet = 1; + } +--- configure.ac ++++ configure.ac 2014-04-11 15:14:01.000000000 +0000 +@@ -1315,6 +1315,8 @@ if test $mutt_cv_langinfo_yesexpr = yes; + AC_DEFINE(HAVE_LANGINFO_YESEXPR,1,[ Define if you have and nl_langinfo(YESEXPR). ]) + fi + ++AC_CHECK_FUNCS(fmemopen open_memstream) ++ + dnl Documentation tools + have_openjade="no" + AC_PATH_PROG([OSPCAT], [ospcat], [none]) +--- curs_main.c ++++ curs_main.c 2014-04-13 02:45:21.000000000 +0000 +@@ -26,7 +26,9 @@ + #include "mailbox.h" + #include "mapping.h" + #include "sort.h" ++#include "buffy.h" + #include "mx.h" ++#include "sidebar.h" + + #ifdef USE_POP + #include "pop.h" +@@ -596,20 +598,31 @@ 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_STATUS; ++ if (option (OPTBEEPNEW)) ++ beep (); ++ } + } + else + do_buffy_notify = 1; + } + ++ if(option(OPTSIDEBAR)) ++ menu->redraw |= REDRAW_SIDEBAR; ++ + if (op != -1) + mutt_curs_set (0); + + if (menu->redraw & REDRAW_FULL) + { + menu_redraw_full (menu); ++ draw_sidebar(menu->menu); + mutt_show_error (); ++ } else if(menu->redraw & REDRAW_SIDEBAR) { ++ draw_sidebar(menu->menu); ++ menu->redraw &= ~REDRAW_SIDEBAR; + } + + if (menu->menu == MENU_MAIN) +@@ -631,9 +644,12 @@ int mutt_index_menu (void) + + if (menu->redraw & REDRAW_STATUS) + { ++ DrawFullLine = 1; + menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); ++ DrawFullLine = 0; + move (option (OPTSTATUSONTOP) ? 0 : LINES-2, 0); + SETCOLOR (MT_COLOR_STATUS); ++ set_buffystats(Context); + mutt_paddstr (COLS, buf); + NORMAL_COLOR; + menu->redraw &= ~REDRAW_STATUS; +@@ -653,7 +669,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 +@@ -1095,6 +1111,7 @@ int mutt_index_menu (void) + break; + + CHECK_MSGCOUNT; ++ CHECK_VISIBLE; + CHECK_READONLY; + { + int oldvcount = Context->vcount; +@@ -1154,6 +1171,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: + +@@ -1185,7 +1203,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) + { +@@ -1203,6 +1225,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); +@@ -2298,6 +2321,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); +--- doc/Muttrc ++++ doc/Muttrc 2014-04-11 15:14:01.000000000 +0000 +@@ -657,6 +657,26 @@ set check_mbox_size=yes + # $crypt_autosign, $crypt_replysign and $smime_is_default. + # + # ++# set sidebar_visible=no ++# ++# Name: sidebar_visible ++# Type: boolean ++# Default: no ++# ++# ++# This specifies whether or not to show sidebar (left-side list of folders). ++# ++# ++# set sidebar_width=0 ++# ++# Name: sidebar_width ++# Type: number ++# Default: 0 ++# ++# ++# The width of the sidebar. ++# ++# + # set crypt_autosign=no + # + # Name: crypt_autosign +--- flags.c ++++ flags.c 2014-04-11 15:14:01.000000000 +0000 +@@ -22,8 +22,10 @@ + + #include "mutt.h" + #include "mutt_curses.h" ++#include "mutt_menu.h" + #include "sort.h" + #include "mx.h" ++#include "sidebar.h" + + void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx) + { +@@ -263,6 +265,7 @@ void _mutt_set_flag (CONTEXT *ctx, HEADE + */ + if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged)) + h->searched = 0; ++ draw_sidebar(0); + } + + void mutt_tag_set_flag (int flag, int bf) +--- functions.h ++++ functions.h 2014-04-11 15:14:01.000000000 +0000 +@@ -169,6 +169,11 @@ const struct binding_t OpMain[] = { /* m + { "decrypt-save", OP_DECRYPT_SAVE, NULL }, + + ++ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, ++ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, ++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, ++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, ++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, + { NULL, 0, NULL } + }; + +@@ -272,6 +277,11 @@ const struct binding_t OpPager[] = { /* + + { "what-key", OP_WHAT_KEY, NULL }, + ++ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, ++ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, ++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, ++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, ++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, + { NULL, 0, NULL } + }; + +--- globals.h ++++ globals.h 2014-04-11 15:14:01.000000000 +0000 +@@ -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 +@@ -213,6 +216,9 @@ WHERE short ScoreThresholdDelete; + WHERE short ScoreThresholdRead; + WHERE short ScoreThresholdFlag; + ++WHERE struct buffy_t *CurBuffy INITVAL(0); ++WHERE short DrawFullLine INITVAL(0); ++WHERE short SidebarWidth; + #ifdef USE_IMAP + WHERE short ImapKeepalive; + WHERE short ImapPipelineDepth; +--- handler.c ++++ handler.c 2015-09-11 14:33:57.576024053 +0000 +@@ -1601,6 +1601,11 @@ static int run_decode_and_handler (BODY + int decode = 0; + int rc = 0; + ++#ifdef HAVE_FMEMOPEN ++ char *temp; ++ size_t tempsize; ++#endif ++ + fseeko (s->fpin, b->offset, 0); + + /* see if we need to decode this part before processing it */ +@@ -1618,6 +1623,14 @@ static int run_decode_and_handler (BODY + { + /* 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 + 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,8 +1667,20 @@ static int run_decode_and_handler (BODY + /* 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 +1706,10 @@ static int run_decode_and_handler (BODY + + /* restore the original source stream */ + safe_fclose (&s->fpin); ++#ifdef HAVE_FMEMOPEN ++ if(tempsize) ++ FREE(&temp); ++#endif + s->fpin = fp; + } + } +--- imap/command.c ++++ imap/command.c 2014-04-11 15:14:01.000000000 +0000 +@@ -1012,6 +1012,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; + } +--- imap/imap.c ++++ imap/imap.c 2014-04-11 15:14:01.000000000 +0000 +@@ -1523,7 +1523,7 @@ int imap_buffy_check (int force) + + imap_munge_mbox_name (munged, sizeof (munged), name); + snprintf (command, sizeof (command), +- "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged); ++ "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged); + + if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) + { +--- init.h ++++ init.h 2014-04-11 15:14:01.000000000 +0000 +@@ -2016,6 +2016,54 @@ struct option_t MuttVars[] = { + ** not used. + ** (PGP only) + */ ++ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, UL "|"}, ++ /* ++ ** .pp ++ ** This specifies the delimiter between the sidebar (if visible) and ++ ** other screens. ++ */ ++ {"sidebar_indentstr", DT_STR, R_BOTH, UL &SidebarIndentStr, UL " "}, ++ /* ++ ** .pp ++ ** This specifies the string that is used to indent items ++ ** with sidebar_folderindent= yes ++ */ ++ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 }, ++ /* ++ ** .pp ++ ** This specifies whether or not to show sidebar (left-side list of folders). ++ */ ++ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 }, ++ /* ++ ** .pp ++ ** This specifies whether or not to sort the sidebar alphabetically. ++ */ ++ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 }, ++ /* ++ ** .pp ++ ** The width of the sidebar. ++ */ ++ { "sidebar_shortpath", DT_BOOL, R_BOTH, OPTSIDEBARSHORTPATH, 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 +--- mailbox.h ++++ mailbox.h 2015-09-11 14:35:24.349518988 +0000 +@@ -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<<0) /* add a From_ line */ +--- main.c ++++ main.c 2014-04-11 15:14:01.000000000 +0000 +@@ -50,6 +50,7 @@ + #include + #include + #include ++#include + #include + + #ifdef HAVE_GETOPT_H +@@ -561,7 +562,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; +@@ -1042,6 +1043,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); + +@@ -1064,6 +1072,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); +--- mbox.c ++++ mbox.c 2014-04-11 15:14:01.000000000 +0000 +@@ -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) +--- menu.c ++++ menu.c 2014-04-13 02:31:16.000000000 +0000 +@@ -24,6 +24,7 @@ + #include "mutt_curses.h" + #include "mutt_menu.h" + #include "mbyte.h" ++#include "sidebar.h" + + extern size_t UngetCount; + +@@ -186,7 +187,7 @@ static void menu_pad_string (char *s, si + { + char *scratch = safe_strdup (s); + int shift = option (OPTARROWCURSOR) ? 3 : 0; +- int cols = COLS - shift; ++ int cols = COLS - shift - SidebarWidth; + + mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); + s[n - 1] = 0; +@@ -239,6 +240,7 @@ void menu_redraw_index (MUTTMENU *menu) + int do_color; + int attr; + ++ draw_sidebar(1); + for (i = menu->top; i < menu->top + menu->pagelen; i++) + { + if (i < menu->max) +@@ -249,7 +251,7 @@ void menu_redraw_index (MUTTMENU *menu) + menu_pad_string (buf, sizeof (buf)); + + ATTRSET(attr); +- move(i - menu->top + menu->offset, 0); ++ move(i - menu->top + menu->offset, SidebarWidth); + do_color = 1; + + if (i == menu->current) +@@ -272,7 +274,7 @@ void menu_redraw_index (MUTTMENU *menu) + else + { + NORMAL_COLOR; +- CLEARLINE(i - menu->top + menu->offset); ++ CLEARLINE_WIN (i - menu->top + menu->offset); + } + } + NORMAL_COLOR; +@@ -289,7 +291,7 @@ void menu_redraw_motion (MUTTMENU *menu) + return; + } + +- move (menu->oldcurrent + menu->offset - menu->top, 0); ++ move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); + ATTRSET(menu->color (menu->oldcurrent)); + + if (option (OPTARROWCURSOR)) +@@ -301,13 +303,13 @@ void menu_redraw_motion (MUTTMENU *menu) + { + menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); + menu_pad_string (buf, sizeof (buf)); +- move (menu->oldcurrent + menu->offset - menu->top, 3); ++ move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3); + print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); + } + + /* now draw it in the new location */ + SETCOLOR(MT_COLOR_INDICATOR); +- mvaddstr(menu->current + menu->offset - menu->top, 0, "->"); ++ mvaddstr(menu->current + menu->offset - menu->top, SidebarWidth, "->"); + } + else + { +@@ -320,7 +322,7 @@ void menu_redraw_motion (MUTTMENU *menu) + menu_make_entry (buf, sizeof (buf), menu, menu->current); + menu_pad_string (buf, sizeof (buf)); + SETCOLOR(MT_COLOR_INDICATOR); +- move(menu->current - menu->top + menu->offset, 0); ++ move(menu->current - menu->top + menu->offset, SidebarWidth); + print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); + } + menu->redraw &= REDRAW_STATUS; +@@ -332,7 +334,7 @@ void menu_redraw_current (MUTTMENU *menu + char buf[LONG_STRING]; + int attr = menu->color (menu->current); + +- move (menu->current + menu->offset - menu->top, 0); ++ move (menu->current + menu->offset - menu->top, SidebarWidth); + menu_make_entry (buf, sizeof (buf), menu, menu->current); + menu_pad_string (buf, sizeof (buf)); + +@@ -872,7 +874,7 @@ int mutt_menuLoop (MUTTMENU *menu) + + + if (option (OPTARROWCURSOR)) +- move (menu->current - menu->top + menu->offset, 2); ++ move (menu->current - menu->top + menu->offset, SidebarWidth + 2); + else if (option (OPTBRAILLEFRIENDLY)) + move (menu->current - menu->top + menu->offset, 0); + else +--- mh.c ++++ mh.c 2014-04-11 16:04:59.000000000 +0000 +@@ -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, time_t *sb_last_checked) ++{ ++ int i; ++ struct mh_sequences mhs; ++ memset (&mhs, 0, sizeof (mhs)); ++ ++ if(!option(OPTSIDEBAR)) ++ return; ++ ++ if (mh_read_sequences (&mhs, path) < 0) ++ return; ++ ++ msgcount = 0; ++ msg_unread = 0; ++ msg_flagged = 0; ++ for (i = 0; i <= mhs.max; i++) ++ msgcount++; ++ if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) { ++ msg_unread++; ++ } ++ if (mhs_check (&mhs, i) & MH_SEQ_FLAGGED) ++ msg_flagged++; ++ mhs_free_sequences (&mhs); ++ *sb_last_checked = time(NULL); ++} ++ + static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) + { + int fd; +--- mutt.h ++++ mutt.h 2015-01-26 15:01:48.000000000 +0000 +@@ -429,6 +429,10 @@ enum + OPTSAVENAME, + OPTSENDGROUPREPLYTO, + OPTSCORE, ++ OPTSIDEBAR, ++ OPTSIDEBARSHORTPATH, ++ OPTSIDEBARSORT, ++ OPTSIDEBARFOLDERINDENT, + OPTSIGDASHES, + OPTSIGONTOP, + OPTSORTRE, +@@ -872,6 +876,7 @@ typedef struct _context + { + char *path; + FILE *fp; ++ time_t atime; + time_t mtime; + off_t size; + off_t vsize; +@@ -911,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 */ +--- mutt_curses.h ++++ mutt_curses.h 2015-09-11 14:35:48.925520615 +0000 +@@ -64,6 +64,7 @@ + #undef lines + #endif /* lines */ + ++#define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol() + #define CLEARLINE(x) move(x,0), clrtoeol() + #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x) + #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0) +@@ -120,6 +121,8 @@ enum + MT_COLOR_BOLD, + MT_COLOR_UNDERLINE, + MT_COLOR_INDEX, ++ MT_COLOR_NEW, ++ MT_COLOR_FLAGGED, + MT_COLOR_PROMPT, + MT_COLOR_MAX + }; +--- mutt_menu.h ++++ mutt_menu.h 2014-04-11 15:14:01.000000000 +0000 +@@ -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" + +--- muttlib.c ++++ muttlib.c 2014-04-11 15:14:01.000000000 +0000 +@@ -1276,6 +1276,8 @@ void mutt_FormatString (char *dest, /* + pl = pw = 1; + + /* see if there's room to add content, else ignore */ ++ if ( DrawFullLine ) ++ { + if ((col < COLS && wlen < destlen) || soft) + { + int pad; +@@ -1319,6 +1321,52 @@ void mutt_FormatString (char *dest, /* + col += wid; + src += pl; + } ++ } ++ else ++ { ++ if ((col < COLS-SidebarWidth && wlen < destlen) || soft) ++ { ++ int pad; ++ ++ /* get contents after padding */ ++ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags); ++ len = mutt_strlen (buf); ++ wid = mutt_strwidth (buf); ++ ++ /* try to consume as many columns as we can, if we don't have ++ * memory for that, use as much memory as possible */ ++ pad = (COLS - SidebarWidth - col - wid) / pw; ++ if (pad > 0 && wlen + (pad * pl) + len > destlen) ++ pad = ((signed)(destlen - wlen - len)) / pl; ++ if (pad > 0) ++ { ++ while (pad--) ++ { ++ memcpy (wptr, src, pl); ++ wptr += pl; ++ wlen += pl; ++ col += pw; ++ } ++ } ++ else if (soft && pad < 0) ++ { ++ /* \0-terminate dest for length computation in mutt_wstr_trunc() */ ++ *wptr = 0; ++ /* make sure right part is at most as wide as display */ ++ len = mutt_wstr_trunc (buf, destlen, COLS, &wid); ++ /* truncate left so that right part fits completely in */ ++ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col); ++ wptr = dest + wlen; ++ } ++ if (len + wlen > destlen) ++ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL); ++ memcpy (wptr, buf, len); ++ wptr += len; ++ wlen += len; ++ col += wid; ++ src += pl; ++ } ++ } + break; /* skip rest of input */ + } + else if (ch == '|') +--- mx.c ++++ mx.c 2015-01-26 15:02:43.000000000 +0000 +@@ -596,6 +596,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) +@@ -618,6 +619,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)) + { +@@ -722,13 +725,26 @@ CONTEXT *mx_open_mailbox (const char *pa + void mx_fastclose_mailbox (CONTEXT *ctx) + { + int i; ++#ifndef BUFFY_SIZE ++ struct utimbuf ut; ++#endif + + if(!ctx) + return; ++#ifndef BUFFY_SIZE ++ /* fix up the times so buffy won't get confused */ ++ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime) ++ { ++ ut.actime = ctx->atime; ++ ut.modtime = ctx->mtime; ++ utime (ctx->path, &ut); ++ } ++#endif + + /* never announce that a mailbox we've just left has new mail. #3290 + * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ +- mutt_buffy_setnotified(ctx->path); ++ if(!ctx->peekonly) ++ mutt_buffy_setnotified(ctx->path); + + if (ctx->mx_close) + ctx->mx_close (ctx); +@@ -740,6 +756,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 +@@ -843,6 +861,10 @@ int mx_close_mailbox (CONTEXT *ctx, int + 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) +--- mx.h ++++ mx.h 2014-04-11 16:11:47.000000000 +0000 +@@ -60,6 +60,7 @@ void mbox_reset_atime (CONTEXT *, struct + int mh_read_dir (CONTEXT *, const char *); + int mh_sync_mailbox (CONTEXT *, int *); + int mh_check_mailbox (CONTEXT *, int *); ++void mh_buffy_update (const char *, int *, int *, int *, time_t *); + int mh_check_empty (const char *); + + int maildir_read_dir (CONTEXT *); +--- pager.c ++++ pager.c 2015-09-11 14:38:26.933518856 +0000 +@@ -29,6 +29,7 @@ + #include "pager.h" + #include "attach.h" + #include "mbyte.h" ++#include "sidebar.h" + + #include "mutt_crypt.h" + +@@ -1095,6 +1096,7 @@ static int format_line (struct line_t ** + wchar_t wc; + mbstate_t mbstate; + int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap); ++ wrap_cols -= SidebarWidth; + + if (check_attachment_marker ((char *)buf) == 0) + wrap_cols = COLS; +@@ -1572,6 +1574,7 @@ mutt_pager (const char *banner, const ch + + int bodyoffset = 1; /* offset of first line of real text */ + int statusoffset = 0; /* offset for the status bar */ ++ int statuswidth; + int helpoffset = LINES - 2; /* offset for the help bar. */ + int bodylen = LINES - 2 - bodyoffset; /* length of displayable area */ + +@@ -1746,7 +1749,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; +@@ -1759,6 +1762,7 @@ mutt_pager (const char *banner, const ch + &QuoteList, &q_level, &force_redraw, &SearchRE) > 0) + lines++; + curline++; ++ move(lines + bodyoffset, SidebarWidth); + } + last_offset = lineInfo[curline].offset; + } while (force_redraw); +@@ -1771,6 +1775,7 @@ mutt_pager (const char *banner, const ch + addch ('~'); + addch ('\n'); + lines++; ++ move(lines + bodyoffset, SidebarWidth); + } + NORMAL_COLOR; + +@@ -1788,29 +1793,40 @@ mutt_pager (const char *banner, const ch + 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 = 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 (statuswidth, buffer); + } + else + { + char bn[STRING]; + snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); +- mutt_paddstr (COLS, bn); ++ mutt_paddstr (statuswidth, bn); + } ++ if (!option(OPTSTATUSONTOP) || PagerIndexLines == 0) ++ DrawFullLine = 0; /* reset */ + NORMAL_COLOR; + if (option(OPTTSENABLED) && TSSupported) + { +@@ -1826,16 +1842,22 @@ 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)), ++ (option(OPTSTATUSONTOP) ? 0: SidebarWidth)); + SETCOLOR (MT_COLOR_STATUS); +- mutt_paddstr (COLS, buffer); ++ mutt_paddstr (COLS - (option(OPTSTATUSONTOP) ? 0 : SidebarWidth), buffer); + NORMAL_COLOR; + } + ++ /* if we're not using the index, update every time */ ++ if ( index == 0 ) ++ draw_sidebar(MENU_PAGER); ++ + redraw = 0; + + if (option(OPTBRAILLEFRIENDLY)) { +@@ -2770,6 +2792,13 @@ search_next: + mutt_what_key (); + break; + ++ case OP_SIDEBAR_SCROLL_UP: ++ case OP_SIDEBAR_SCROLL_DOWN: ++ case OP_SIDEBAR_NEXT: ++ case OP_SIDEBAR_PREV: ++ scroll_sidebar(ch, MENU_PAGER); ++ break; ++ + default: + ch = -1; + break; +--- pattern.c ++++ pattern.c 2014-04-11 15:14:01.000000000 +0000 +@@ -154,6 +154,10 @@ msg_search (CONTEXT *ctx, pattern_t* pat + 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 + 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 + 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 + 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 + if (option (OPTTHOROUGHSRC)) + { + safe_fclose (&fp); ++#ifdef HAVE_FMEMOPEN ++ if(tempsize) ++ FREE (&temp); ++#else + unlink (tempfile); ++#endif + } + } + +--- protos.h ++++ protos.h 2014-04-11 15:14:01.000000000 +0000 +@@ -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); +--- sidebar.c ++++ sidebar.c 2014-04-11 15:14:01.000000000 +0000 +@@ -0,0 +1,405 @@ ++/* ++ * Copyright (C) ????-2004 Justin Hibbits ++ * Copyright (C) 2004 Thomer M. Gil ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. ++ */ ++ ++ ++#if HAVE_CONFIG_H ++# include "config.h" ++#endif ++ ++#include "mutt.h" ++#include "mutt_menu.h" ++#include "mutt_curses.h" ++#include "sidebar.h" ++#include "buffy.h" ++#include ++#include "keymap.h" ++#include ++ ++/*BUFFY *CurBuffy = 0;*/ ++static BUFFY *TopBuffy = 0; ++static BUFFY *BottomBuffy = 0; ++static int known_lines = 0; ++ ++void calc_boundaries() { ++ ++ BUFFY *tmp = Incoming; ++ ++ int count = LINES - 2 - (option(OPTHELP) ? 1 : 0); ++ ++ if ( known_lines != LINES ) { ++ TopBuffy = BottomBuffy = 0; ++ known_lines = LINES; ++ } ++ for ( ; tmp->next != 0; tmp = tmp->next ) ++ tmp->next->prev = tmp; ++ ++ if ( TopBuffy == 0 && BottomBuffy == 0 ) ++ TopBuffy = Incoming; ++ if ( BottomBuffy == 0 ) { ++ BottomBuffy = TopBuffy; ++ while ( --count && BottomBuffy->next ) ++ BottomBuffy = BottomBuffy->next; ++ } ++ else if ( TopBuffy == CurBuffy->next ) { ++ BottomBuffy = CurBuffy; ++ tmp = BottomBuffy; ++ while ( --count && tmp->prev) ++ tmp = tmp->prev; ++ TopBuffy = tmp; ++ } ++ else if ( BottomBuffy == CurBuffy->prev ) { ++ TopBuffy = CurBuffy; ++ tmp = TopBuffy; ++ while ( --count && tmp->next ) ++ tmp = tmp->next; ++ BottomBuffy = tmp; ++ } ++} ++ ++static const char * ++sidebar_format_str (char *dest, ++ size_t destlen, ++ size_t col, ++ char op, ++ const char *src, ++ const char *prefix, ++ const char *ifstring, ++ const char *elsestring, ++ unsigned long data, ++ format_flag flags) ++{ ++/* casting from unsigned long - srsly?! */ ++struct sidebar_entry *sbe = (struct sidebar_entry *) data; ++unsigned int optional; ++char fmt[SHORT_STRING], buf[SHORT_STRING]; ++ ++optional = flags & M_FORMAT_OPTIONAL; ++ ++switch(op) { ++ case 'F': ++ if(!optional) { ++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); ++ snprintf (dest, destlen, fmt, sbe->flagged); ++ } else if(sbe->flagged == 0) { ++ optional = 0; ++ } ++ break; ++ ++ case '!': ++ if(sbe->flagged == 0) ++ mutt_format_s(dest, destlen, prefix, ""); ++ if(sbe->flagged == 1) ++ mutt_format_s(dest, destlen, prefix, "!"); ++ if(sbe->flagged == 2) ++ mutt_format_s(dest, destlen, prefix, "!!"); ++ if(sbe->flagged > 2) { ++ snprintf (buf, sizeof (buf), "%d!", sbe->flagged); ++ mutt_format_s(dest, destlen, prefix, buf); ++ } ++ break; ++ ++ case 'S': ++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); ++ snprintf (dest, destlen, fmt, sbe->size); ++ break; ++ ++ case 'N': ++ if(!optional) { ++ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); ++ snprintf (dest, destlen, fmt, sbe->new); ++ } else if(sbe->new == 0) { ++ optional = 0; ++ } ++ break; ++ ++ case 'B': ++ mutt_format_s(dest, destlen, prefix, sbe->box); ++ break; ++ } ++ ++ if(optional) ++ mutt_FormatString (dest, destlen, col, ifstring, sidebar_format_str, (unsigned long) sbe, flags); ++ else if (flags & M_FORMAT_OPTIONAL) ++ mutt_FormatString (dest, destlen, col, elsestring, sidebar_format_str, (unsigned long) sbe, flags); ++ ++ return (src); ++} ++ ++char *make_sidebar_entry(char *box, unsigned int size, unsigned int new, unsigned int flagged) { ++ static char *entry = 0; ++ struct sidebar_entry sbe; ++ int SBvisual; ++ ++ SBvisual = SidebarWidth - strlen(SidebarDelim); ++ if (SBvisual < 1) ++ return NULL; ++ ++ sbe.new = new; ++ sbe.flagged = flagged; ++ sbe.size = size; ++ strncpy(sbe.box, box, 31); ++ ++ safe_realloc(&entry, SBvisual + 2); ++ entry[SBvisual + 1] = '\0'; ++ ++ mutt_FormatString (entry, SBvisual+1, 0, SidebarFormat, sidebar_format_str, (unsigned long) &sbe, 0); ++ ++ return entry; ++} ++ ++void set_curbuffy(char buf[LONG_STRING]) ++{ ++ BUFFY* tmp = CurBuffy = Incoming; ++ ++ if (!Incoming) ++ return; ++ ++ while(1) { ++ if(!strcmp(tmp->path, buf) || !strcmp(tmp->realpath, buf)) { ++ CurBuffy = tmp; ++ break; ++ } ++ ++ if(tmp->next) ++ tmp = tmp->next; ++ else ++ break; ++ } ++} ++ ++int draw_sidebar(int menu) { ++ ++ BUFFY *tmp; ++#ifndef USE_SLANG_CURSES ++ attr_t attrs; ++#endif ++ short delim_len = strlen(SidebarDelim); ++ short color_pair; ++ ++ static bool initialized = false; ++ static int prev_show_value; ++ static short saveSidebarWidth; ++ int lines = 0; ++ int SidebarHeight; ++ ++ if(option(OPTSTATUSONTOP) || option(OPTHELP)) ++ lines++; /* either one will occupy the first line */ ++ ++ /* initialize first time */ ++ if(!initialized) { ++ prev_show_value = option(OPTSIDEBAR); ++ saveSidebarWidth = SidebarWidth; ++ if(!option(OPTSIDEBAR)) SidebarWidth = 0; ++ initialized = true; ++ } ++ ++ /* save or restore the value SidebarWidth */ ++ if(prev_show_value != option(OPTSIDEBAR)) { ++ if(prev_show_value && !option(OPTSIDEBAR)) { ++ saveSidebarWidth = SidebarWidth; ++ SidebarWidth = 0; ++ } else if(!prev_show_value && option(OPTSIDEBAR)) { ++ mutt_buffy_check(1); /* we probably have bad or no numbers */ ++ SidebarWidth = saveSidebarWidth; ++ } ++ prev_show_value = option(OPTSIDEBAR); ++ } ++ ++ ++/* if ( SidebarWidth == 0 ) return 0; */ ++ if (SidebarWidth > 0 && option (OPTSIDEBAR) ++ && delim_len >= SidebarWidth) { ++ unset_option (OPTSIDEBAR); ++ /* saveSidebarWidth = SidebarWidth; */ ++ if (saveSidebarWidth > delim_len) { ++ SidebarWidth = saveSidebarWidth; ++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar.")); ++ sleep (2); ++ } else { ++ SidebarWidth = 0; ++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value.")); ++ sleep (4); /* the advise to set a sane value should be seen long enough */ ++ } ++ saveSidebarWidth = 0; ++ return (0); ++ } ++ ++ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) { ++ if (SidebarWidth > 0) { ++ saveSidebarWidth = SidebarWidth; ++ SidebarWidth = 0; ++ } ++ unset_option(OPTSIDEBAR); ++ return 0; ++ } ++ ++ /* get attributes for divider */ ++ SETCOLOR(MT_COLOR_STATUS); ++#ifndef USE_SLANG_CURSES ++ attr_get(&attrs, &color_pair, 0); ++#else ++ color_pair = attr_get(); ++#endif ++ SETCOLOR(MT_COLOR_NORMAL); ++ ++ /* draw the divider */ ++ ++ SidebarHeight = LINES - 1; ++ if(option(OPTHELP) || !option(OPTSTATUSONTOP)) ++ SidebarHeight--; ++ ++ for ( ; lines < SidebarHeight; lines++ ) { ++ move(lines, SidebarWidth - delim_len); ++ addstr(NONULL(SidebarDelim)); ++#ifndef USE_SLANG_CURSES ++ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); ++#endif ++ } ++ ++ if ( Incoming == 0 ) return 0; ++ lines = 0; ++ if(option(OPTSTATUSONTOP) || option(OPTHELP)) ++ lines++; /* either one will occupy the first line */ ++ ++ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) ++ calc_boundaries(menu); ++ if ( CurBuffy == 0 ) CurBuffy = Incoming; ++ ++ tmp = TopBuffy; ++ ++ SETCOLOR(MT_COLOR_NORMAL); ++ ++ for ( ; tmp && lines < SidebarHeight; tmp = tmp->next ) { ++ if ( tmp == CurBuffy ) ++ SETCOLOR(MT_COLOR_INDICATOR); ++ else if ( tmp->msg_unread > 0 ) ++ SETCOLOR(MT_COLOR_NEW); ++ else if ( tmp->msg_flagged > 0 ) ++ SETCOLOR(MT_COLOR_FLAGGED); ++ else ++ SETCOLOR(MT_COLOR_NORMAL); ++ ++ move( lines, 0 ); ++ if ( Context && (!strcmp(tmp->path, Context->path)|| ++ !strcmp(tmp->realpath, Context->path)) ) { ++ tmp->msg_unread = Context->unread; ++ tmp->msgcount = Context->msgcount; ++ tmp->msg_flagged = Context->flagged; ++ } ++ /* check whether Maildir is a prefix of the current folder's path */ ++ short maildir_is_prefix = 0; ++ if ( (strlen(tmp->path) > strlen(Maildir)) && ++ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) ++ maildir_is_prefix = 1; ++ /* calculate depth of current folder and generate its display name with indented spaces */ ++ int sidebar_folder_depth = 0; ++ char *sidebar_folder_name; ++ sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir) + 1); ++ if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) { ++ char *tmp_folder_name; ++ int i; ++ tmp_folder_name = tmp->path + strlen(Maildir) + 1; ++ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { ++ if (tmp_folder_name[i] == '/' || tmp_folder_name[i] == '.') sidebar_folder_depth++; ++ } ++ if (sidebar_folder_depth > 0) { ++ if (option(OPTSIDEBARSHORTPATH)) { ++ tmp_folder_name = strrchr(tmp->path, '.'); ++ if (tmp_folder_name == NULL) ++ tmp_folder_name = mutt_basename(tmp->path); ++ else ++ tmp_folder_name++; ++ } ++ else ++ tmp_folder_name = tmp->path + strlen(Maildir) + 1; ++ sidebar_folder_name = malloc(strlen(tmp_folder_name) + sidebar_folder_depth*strlen(NONULL(SidebarIndentStr)) + 1); ++ sidebar_folder_name[0]=0; ++ for (i=0; i < sidebar_folder_depth; i++) ++ strncat(sidebar_folder_name, NONULL(SidebarIndentStr), strlen(NONULL(SidebarIndentStr))); ++ strncat(sidebar_folder_name, tmp_folder_name, strlen(tmp_folder_name)); ++ } ++ } ++ printw( "%.*s", SidebarWidth - delim_len + 1, ++ make_sidebar_entry(sidebar_folder_name, tmp->msgcount, ++ tmp->msg_unread, tmp->msg_flagged)); ++ if (sidebar_folder_depth > 0) ++ free(sidebar_folder_name); ++ lines++; ++ } ++ SETCOLOR(MT_COLOR_NORMAL); ++ for ( ; lines < SidebarHeight; lines++ ) { ++ int i = 0; ++ move( lines, 0 ); ++ for ( ; i < SidebarWidth - delim_len; i++ ) ++ addch(' '); ++ } ++ return 0; ++} ++ ++ ++void set_buffystats(CONTEXT* Context) ++{ ++ BUFFY *tmp = Incoming; ++ while(tmp) { ++ if(Context && (!strcmp(tmp->path, Context->path) || ++ !strcmp(tmp->realpath, Context->path))) { ++ tmp->msg_unread = Context->unread; ++ tmp->msgcount = Context->msgcount; ++ tmp->msg_flagged = Context->flagged; ++ break; ++ } ++ tmp = tmp->next; ++ } ++} ++ ++void scroll_sidebar(int op, int menu) ++{ ++ if(!SidebarWidth) return; ++ if(!CurBuffy) return; ++ ++ switch (op) { ++ case OP_SIDEBAR_NEXT: ++ if ( CurBuffy->next == NULL ) return; ++ CurBuffy = CurBuffy->next; ++ break; ++ case OP_SIDEBAR_PREV: ++ if ( CurBuffy->prev == NULL ) return; ++ CurBuffy = CurBuffy->prev; ++ break; ++ case OP_SIDEBAR_SCROLL_UP: ++ CurBuffy = TopBuffy; ++ if ( CurBuffy != Incoming ) { ++ calc_boundaries(menu); ++ CurBuffy = CurBuffy->prev; ++ } ++ break; ++ case OP_SIDEBAR_SCROLL_DOWN: ++ CurBuffy = BottomBuffy; ++ if ( CurBuffy->next ) { ++ calc_boundaries(menu); ++ CurBuffy = CurBuffy->next; ++ } ++ break; ++ default: ++ return; ++ } ++ calc_boundaries(menu); ++ draw_sidebar(menu); ++} ++ +--- sidebar.h ++++ sidebar.h 2014-04-11 15:14:01.000000000 +0000 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (C) ????-2004 Justin Hibbits ++ * Copyright (C) 2004 Thomer M. Gil ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. ++ */ ++ ++#ifndef SIDEBAR_H ++#define SIDEBAR_H ++ ++struct MBOX_LIST { ++ char *path; ++ int msgcount; ++ int new; ++} MBLIST; ++ ++/* parameter is whether or not to go to the status line */ ++/* used for omitting the last | that covers up the status bar in the index */ ++int draw_sidebar(int); ++void scroll_sidebar(int, int); ++void set_curbuffy(char*); ++void set_buffystats(CONTEXT*); ++ ++#endif /* SIDEBAR_H */ diff --git a/patch-1.5.21.vk.pgp_verbose_mime b/patch-1.5.24.vk.pgp_verbose_mime similarity index 62% rename from patch-1.5.21.vk.pgp_verbose_mime rename to patch-1.5.24.vk.pgp_verbose_mime index 7e318c4..cee67d4 100644 --- a/patch-1.5.21.vk.pgp_verbose_mime +++ b/patch-1.5.24.vk.pgp_verbose_mime @@ -1,7 +1,20 @@ -diff -rupN a/globals.h b/globals.h ---- a/globals.h 2009-08-26 03:08:52.000000000 +0800 -+++ b/globals.h 2012-04-11 12:52:44.826523028 +0800 -@@ -227,6 +227,8 @@ WHERE REGEXP PgpGoodSign; +--- + PATCHES | 1 + + globals.h | 2 ++ + init.h | 12 ++++++++++++ + pgp.c | 3 ++- + 4 files changed, 17 insertions(+), 1 deletion(-) + +--- PATCHES ++++ PATCHES 2012-04-11 04:52:45.000000000 +0000 +@@ -1,3 +1,4 @@ ++patch-1.5.3.vk.pgp_verbose_mime + patch-1.5.9.aw.listreply.1 + patch-1.5.23.sidebar.20140412.txt + rr.compressed +--- globals.h ++++ globals.h 2012-04-11 04:52:45.000000000 +0000 +@@ -239,6 +239,8 @@ WHERE REGEXP PgpGoodSign; WHERE char *PgpSignAs; WHERE short PgpTimeout; WHERE char *PgpEntryFormat; @@ -10,10 +23,9 @@ diff -rupN a/globals.h b/globals.h WHERE char *PgpClearSignCommand; WHERE char *PgpDecodeCommand; WHERE char *PgpVerifyCommand; -diff -rupN a/init.h b/init.h ---- a/init.h 2010-09-15 23:39:31.000000000 +0800 -+++ b/init.h 2012-04-11 12:52:44.825523029 +0800 -@@ -2556,6 +2556,18 @@ struct option_t MuttVars[] = { +--- init.h ++++ init.h 2012-04-11 04:52:45.000000000 +0000 +@@ -2719,6 +2719,18 @@ struct option_t MuttVars[] = { ** a line quoted text if it also matches $$smileys. This mostly ** happens at the beginning of a line. */ @@ -32,18 +44,13 @@ diff -rupN a/init.h b/init.h -diff -rupN a/PATCHES b/PATCHES ---- a/PATCHES 2008-03-20 04:07:06.000000000 +0800 -+++ b/PATCHES 2012-04-11 12:52:44.824523030 +0800 -@@ -0,0 +1 @@ -+patch-1.5.3.vk.pgp_verbose_mime -diff -rupN a/pgp.c b/pgp.c ---- a/pgp.c 2010-09-14 01:19:55.000000000 +0800 -+++ b/pgp.c 2012-04-11 12:52:44.825523029 +0800 -@@ -1129,6 +1129,8 @@ BODY *pgp_sign_message (BODY *a) +--- pgp.c ++++ pgp.c 2015-09-11 14:47:19.817518523 +0000 +@@ -1213,7 +1213,8 @@ BODY *pgp_sign_message (BODY *a) t->disposition = DISPNONE; t->encoding = ENC7BIT; t->unlink = 1; /* ok to remove this file after sending. */ +- mutt_set_parameter ("name", "signature.asc", &t->parameter); + mutt_set_parameter ("name", PgpMimeSignatureFilename, &t->parameter); + t->description = safe_strdup (PgpMimeSignatureDescription); diff --git a/widechar.sidebar.dif b/widechar.sidebar.dif index a1fe972..907c8dd 100644 --- a/widechar.sidebar.dif +++ b/widechar.sidebar.dif @@ -1,6 +1,10 @@ +--- + handler.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + --- handler.c -+++ handler.c 2013-04-22 00:00:00.000000000 +0000 -@@ -778,7 +778,7 @@ static void enriched_set_flags (const wc ++++ handler.c 2015-09-11 14:52:40.778018507 +0000 +@@ -780,7 +780,7 @@ static void enriched_set_flags (const wc static int text_enriched_handler (BODY *a, STATE *s) { enum { @@ -9,7 +13,7 @@ } state = TEXT; long bytes = a->length; -@@ -807,7 +807,7 @@ static int text_enriched_handler (BODY * +@@ -809,7 +809,7 @@ static int text_enriched_handler (BODY * { if (state != ST_EOF) { @@ -18,7 +22,7 @@ state = ST_EOF; else bytes--; -@@ -815,6 +815,8 @@ static int text_enriched_handler (BODY * +@@ -817,6 +817,8 @@ static int text_enriched_handler (BODY * switch (state) { @@ -27,7 +31,7 @@ case TEXT : switch (wc) { -@@ -875,9 +877,8 @@ static int text_enriched_handler (BODY * +@@ -877,9 +879,8 @@ static int text_enriched_handler (BODY * enriched_flush (&stte, 1); else { @@ -38,7 +42,7 @@ } break; -@@ -1490,7 +1491,7 @@ void mutt_decode_attachment (BODY *b, ST +@@ -1567,7 +1568,7 @@ void mutt_decode_attachment (BODY *b, ST * strip all trailing spaces to improve interoperability; * if $text_flowed is unset, simply verbatim copy input */ @@ -47,15 +51,15 @@ { char *buf = NULL; size_t l = 0, sz = 0; -@@ -1518,7 +1519,6 @@ int mutt_body_handler (BODY *b, STATE *s - int decode = 0; - int plaintext = 0; +@@ -1595,7 +1596,6 @@ static int run_decode_and_handler (BODY + int origType; + char *savePrefix = NULL; FILE *fp = NULL; - char tempfile[_POSIX_PATH_MAX]; - handler_t handler = NULL; - LOFF_T tmpoffset = 0; size_t tmplength = 0; -@@ -1528,6 +1528,8 @@ int mutt_body_handler (BODY *b, STATE *s + LOFF_T tmpoffset = 0; + int decode = 0; +@@ -1604,6 +1604,8 @@ static int run_decode_and_handler (BODY #ifdef HAVE_FMEMOPEN char *temp; size_t tempsize; @@ -63,4 +67,4 @@ + char tempfile[_POSIX_PATH_MAX]; #endif - int oflags = s->flags; + fseeko (s->fpin, b->offset, 0); From 35a1dd6d8fb6ff86953a7a7a05f78bf8852536b9 Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Fri, 11 Sep 2015 18:59:46 +0000 Subject: [PATCH 2/2] . OBS-URL: https://build.opensuse.org/package/show/server:mail/mutt?expand=0&rev=110 --- mutt-1.5.23-patches.tar.bz2 | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 mutt-1.5.23-patches.tar.bz2 diff --git a/mutt-1.5.23-patches.tar.bz2 b/mutt-1.5.23-patches.tar.bz2 deleted file mode 100644 index 9811e40..0000000 --- a/mutt-1.5.23-patches.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa4453d1fe2d5bc2fd78b71779594de2f5998c5921fad03195f28ae0a29b4d6f -size 243