--- curs_main.c Sat Oct 13 09:06:52 2001 +++ curs_main.c Sat Oct 13 08:32:27 2001 @@ -540,7 +540,7 @@ int mutt_index_menu (void) menu_redraw_current (menu); } - if (menu->redraw & REDRAW_STATUS) + if ((menu->redraw & REDRAW_STATUS) || update_status_time ()) { menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2); --- globals.h Sat Oct 13 09:06:52 2001 +++ globals.h Sat Oct 13 08:35:11 2001 @@ -144,6 +144,7 @@ WHERE short PagerIndexLines; WHERE short ReadInc; WHERE short SendmailWait; WHERE short SleepTime INITVAL (1); +WHERE short StatusUpdate; WHERE short Timeout; WHERE short WriteInc; WHERE short ScoreThresholdDelete; --- init.h Wed Nov 21 08:56:40 2001 +++ init.h Sun Dec 9 07:56:52 2001 @@ -2119,6 +2119,9 @@ ** .dt %u .dd number of unread messages * ** .dt %v .dd Mutt version string ** .dt %V .dd currently active limit pattern, if any * + ** .dt %[fmt] .dd the current date and time. ``fmt'' is + ** expanded by the system call ``strftime''; + ** a leading bang disables locales ** .dt %>X .dd right justify the rest of the string and pad with "X" ** .dt %|X .dd pad to the end of the line with "X" ** .de @@ -2160,6 +2163,16 @@ ** Setting this variable causes the ``status bar'' to be displayed on ** the first line of the screen rather than near the bottom. */ + { "status_update", DT_NUM, R_NONE, UL &StatusUpdate, -1 }, + /* + ** .pp + ** This variable controls, if positive, the maximum interval in seconds + ** before the time in the status line is updated. It is checked at + ** every key press and after a keyboard $$timeout. + ** If the value is zero, the status line will be updated at every check. + ** If it is negative, the status time will only be updated + ** if it necessary to update to the status line for some other reason. + */ { "strict_threads", DT_BOOL, R_RESORT|R_RESORT_INIT|R_INDEX, OPTSTRICTTHREADS, 0 }, /* ** .pp --- menu.c Sat Oct 13 09:06:52 2001 +++ menu.c Sat Oct 13 08:32:27 2001 @@ -1023,3 +1023,23 @@ int mutt_menuLoop (MUTTMENU *menu) } /* not reached */ } + +int update_status_time () +{ + static time_t Last; + time_t now; + + if (StatusUpdate < 0) + return 0; + else if (StatusUpdate == 0) + return 1; + + now = time (NULL); + if (now - Last >= StatusUpdate) + { + Last = now; + return 1; + } + else + return 0; +} --- mutt_menu.h Sat Oct 13 09:06:52 2001 +++ mutt_menu.h Sat Oct 13 08:32:27 2001 @@ -107,3 +107,5 @@ int mutt_menuLoop (MUTTMENU *); /* used in both the index and pager index to make an entry. */ void index_make_entry (char *, size_t, struct menu_t *, int); int index_color (int); + +int update_status_time (void); --- pager.c Sat Oct 13 09:06:53 2001 +++ pager.c Sat Oct 13 08:32:27 2001 @@ -1657,7 +1657,7 @@ mutt_pager (const char *banner, const ch SETCOLOR (MT_COLOR_NORMAL); } - if ((redraw & REDRAW_INDEX) && index) + if (index && ((redraw & REDRAW_INDEX) || update_status_time ())) { /* redraw the pager_index indicator, because the * flags for this message might have changed. */ --- status.c Fri Mar 3 11:10:14 2000 +++ status.c Sat Oct 13 08:32:27 2001 @@ -26,6 +26,7 @@ #include #include #include +#include static char *get_sort_str (char *buf, size_t buflen, int method) { @@ -275,6 +276,61 @@ status_format_str (char *buf, size_t buf case 0: *buf = 0; return (src); + + case '[': + { + int do_locales; + int len = sizeof (fmt) - 1; + + cp = fmt; + if (*src == '!') + { + do_locales = 0; + src++; + } + else + do_locales = 1; + + while (len > 0 && *src != ']') + { + if (*src == '%') + { + src++; + if (len >= 2) + { + *cp++ = '%'; + *cp++ = *src; + len -= 2; + } + else + break; /* not enough space */ + src++; + } + else + { + *cp++ = *src++; + len--; + } + } + *cp = 0; + src++; + + if (do_locales && Locale) + setlocale (LC_TIME, Locale); + + { + time_t now = time (NULL); + + strftime (tmp, sizeof (tmp), fmt, localtime (&now)); + } + + if (do_locales && Locale) + setlocale (LC_TIME, "C"); + + snprintf (fmt, sizeof (fmt), "%%%ss", prefix); + snprintf (buf, buflen, fmt, tmp); + } + break; default: snprintf (buf, buflen, "%%%s%c", prefix, op);