X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-ui%2Fstatus.c;fp=lib-ui%2Fstatus.c;h=1f756a5f0f61f3dae2e821a00c027042da356d6e;hp=0000000000000000000000000000000000000000;hb=96e4b6de291b2195b26289fb03536acd101c6650;hpb=3692b834c97c9933088d7082464fec5ae903920f diff --git a/lib-ui/status.c b/lib-ui/status.c new file mode 100644 index 0000000..1f756a5 --- /dev/null +++ b/lib-ui/status.c @@ -0,0 +1,312 @@ +/* + * Copyright notice from original mutt: + * Copyright (C) 1996-2000 Michael R. Elkins + * + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include +#include + +#include "mutt.h" +#include "sort.h" +#include "mx.h" +#include "buffy.h" + + +#include +#include +#include + +#define SW (option(OPTMBOXPANE)?SidebarWidth:0) + +static char *get_sort_str (char *buf, ssize_t buflen, int method) +{ + snprintf (buf, buflen, "%s%s%s", + (method & SORT_REVERSE) ? "reverse-" : "", + (method & SORT_LAST) ? "last-" : "", + mutt_getnamebyvalue (method & SORT_MASK, SortMethods)); + return buf; +} + +/* %b = number of incoming folders with unread messages [option] + * %B = short mailbox path + * %d = number of deleted messages [option] + * %f = full mailbox path + * %F = number of flagged messages [option] + * %h = hostname + * %l = length of mailbox (in bytes) [option] + * %m = total number of messages [option] + * %M = number of messages shown (virutal message count when limiting) [option] + * %n = number of new messages [option] + * %p = number of postponed messages [option] + * %P = percent of way through index + * %r = readonly/wontwrite/changed flag + * %s = current sorting method ($sort) + * %S = current aux sorting method ($sort_aux) + * %t = # of tagged messages [option] + * %v = Madmutt version + * %V = currently active limit pattern [option] */ +static const char *status_format_str (char *buf, ssize_t buflen, char op, + const char *src, const char *prefix, + const char *ifstring, + const char *elsestring, + unsigned long data, format_flag flags) +{ + char fmt[SHORT_STRING], tmp[SHORT_STRING]; + const char *cp, *p; + int count, optional = (flags & M_FORMAT_OPTIONAL); + MUTTMENU *menu = (MUTTMENU *) data; + + *buf = 0; + switch (op) { + case 'b': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, buffy_check (0)); + } + else if (!buffy_check (0)) + optional = 0; + break; + + case 'B': + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + if (Context && Context->compressinfo && Context->realpath) { + if ((p = strrchr (Context->realpath, '/'))) + m_strcpy(tmp, sizeof(tmp), p + 1); + else + m_strcpy(tmp, sizeof(tmp), Context->realpath); + } + else + if (Context && Context->path) { + if ((p = strrchr (Context->path, '/'))) + m_strcpy(tmp, sizeof(tmp), p + 1); + else + m_strcpy(tmp, sizeof(tmp), Context->path); + } + else + m_strcpy(tmp, sizeof(tmp), _("no mailbox")); + snprintf (buf, buflen, fmt, tmp); + break; + + case 'd': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, Context ? Context->deleted : 0); + } + else if (!Context || !Context->deleted) + optional = 0; + break; + + case 'h': + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (buf, buflen, fmt, NONULL (Hostname)); + break; + + case 'f': + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + if (Context && Context->compressinfo && Context->realpath) { + m_strcpy(tmp, sizeof(tmp), Context->realpath); + mutt_pretty_mailbox (tmp); + } + else + if (Context && Context->path) { + m_strcpy(tmp, sizeof(tmp), Context->path); + mutt_pretty_mailbox (tmp); + } + else + m_strcpy(tmp, sizeof(tmp), _("(no mailbox)")); + snprintf (buf, buflen, fmt, tmp); + break; + + case 'F': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, Context ? Context->flagged : 0); + } + else if (!Context || !Context->flagged) + optional = 0; + break; + + case 'l': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + mutt_pretty_size (tmp, sizeof (tmp), Context ? Context->size : 0); + snprintf (buf, buflen, fmt, tmp); + } + else if (!Context || !Context->size) + optional = 0; + break; + + case 'L': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + mutt_pretty_size (tmp, sizeof (tmp), Context ? Context->vsize : 0); + snprintf (buf, buflen, fmt, tmp); + } + else if (!Context || !Context->pattern) + optional = 0; + break; + + case 'm': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, Context ? Context->msgcount : 0); + } + else if (!Context || !Context->msgcount) + optional = 0; + break; + + case 'M': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, Context ? Context->vcount : 0); + } + else if (!Context || !Context->pattern) + optional = 0; + break; + + case 'n': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, Context ? Context->new : 0); + } + else if (!Context || Context->new <= 0) + optional = 0; + break; + + case 'o': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, + Context ? Context->unread - Context->new : 0); + } + else if (!Context || !(Context->unread - Context->new)) + optional = 0; + break; + + case 'p': + count = mutt_num_postponed (0); + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, count); + } + else if (!count) + optional = 0; + break; + + case 'P': + if (menu->top + menu->pagelen >= menu->max) + cp = menu->top ? "end" : "all"; + else { + count = (100 * (menu->top + menu->pagelen)) / menu->max; + snprintf (tmp, sizeof (tmp), "%d%%", count); + cp = tmp; + } + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (buf, buflen, fmt, cp); + break; + + case 'r': + { + int i = 0; + + if (Context) { + /* XXX: deleted doesn't necessarily mean changed in IMAP */ + i = option (OPTATTACHMSG) ? 3 + : ((Context->readonly || Context->dontwrite) ? 2 + : (Context->changed || (Context-> magic != M_IMAP && Context-> + deleted)) ? 1 : 0); + } + + if (!StChars) + buf[0] = 0; + else if (i >= m_strlen(StChars)) + buf[0] = StChars[0]; + else + buf[0] = StChars[i]; + + buf[1] = 0; + break; + } + + case 's': + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (buf, buflen, fmt, get_sort_str (tmp, sizeof (tmp), Sort)); + break; + + case 'S': + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (buf, buflen, fmt, get_sort_str (tmp, sizeof (tmp), SortAux)); + break; + + case 't': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, Context ? Context->tagged : 0); + } + else if (!Context || !Context->tagged) + optional = 0; + break; + + case 'u': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (buf, buflen, fmt, Context ? Context->unread : 0); + } + else if (!Context || !Context->unread) + optional = 0; + break; + + case 'v': + m_strcpy(buf, buflen, mutt_make_version(0)); + break; + + case 'V': + if (!optional) { + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (buf, buflen, fmt, + (Context && Context->pattern) ? Context->pattern : ""); + } + else if (!Context || !Context->pattern) + optional = 0; + break; + + case 0: + *buf = 0; + return (src); + + default: + snprintf (buf, buflen, "%%%s%c", prefix, op); + break; + } + + if (optional) + menu_status_line (buf, buflen, menu, ifstring); + else if (flags & M_FORMAT_OPTIONAL) + menu_status_line (buf, buflen, menu, elsestring); + + return (src); +} + +void menu_status_line (char* buf, ssize_t len, MUTTMENU* menu, const char* p) { + /* + * if we have enough space for buffer, format lines to $COLS-$SidebarWidth + * only to not wrap past end of screen + */ + int width = COLS - SW; + mutt_FormatString (buf, (width >= len ? len : (width + 1)), + p, status_format_str, + (unsigned long) menu, 0); +}