summaryrefslogtreecommitdiff
path: root/alpine
diff options
context:
space:
mode:
authorEduardo Chappa <chappa@washington.edu>2013-02-05 00:59:30 -0700
committerEduardo Chappa <chappa@washington.edu>2013-02-08 21:03:59 -0700
commit640d8845bffdf13007a10929ad0f18375a9a2473 (patch)
tree2c3fa0bb9b5dfc435dbde151cedf7b4f8b7b6660 /alpine
parentdc6c0f8d846e14fc6841516ad772553fc5975bd6 (diff)
downloadalpine-640d8845bffdf13007a10929ad0f18375a9a2473.tar.xz
* Add color options for folders and index screen.
* Add silent token to display filter * Add option to preserve To: and Cc: fields on replies.
Diffstat (limited to 'alpine')
-rw-r--r--alpine/alpine.c1
-rw-r--r--alpine/colorconf.c182
-rw-r--r--alpine/colorconf.h3
-rw-r--r--alpine/confscroll.c4
-rw-r--r--alpine/dispfilt.c25
-rw-r--r--alpine/dispfilt.h2
-rw-r--r--alpine/folder.c153
-rw-r--r--alpine/keymenu.c8
-rw-r--r--alpine/keymenu.h1
-rw-r--r--alpine/reply.c37
-rw-r--r--alpine/send.c4
11 files changed, 355 insertions, 65 deletions
diff --git a/alpine/alpine.c b/alpine/alpine.c
index 76f66950..9e7298f2 100644
--- a/alpine/alpine.c
+++ b/alpine/alpine.c
@@ -196,6 +196,7 @@ main(int argc, char **argv)
#endif
status_message_lock_init();
+ inverse_itokens();
#if HAVE_SRANDOM
/*
diff --git a/alpine/colorconf.c b/alpine/colorconf.c
index e0aee596..e672778c 100644
--- a/alpine/colorconf.c
+++ b/alpine/colorconf.c
@@ -29,18 +29,20 @@ static char rcsid[] = "$Id: colorconf.c 934 2008-02-23 00:44:29Z hubert@u.washin
#include "../pith/color.h"
#include "../pith/icache.h"
#include "../pith/mailcmd.h"
+#include "../pith/mailindx.h"
#include "../pith/list.h"
/*
* Internal prototypes
*/
+char *colorindexrule(char *);
char *color_setting_text_line(struct pine *, struct variable *);
void revert_to_saved_color_config(struct pine *, SAVED_CONFIG_S *);
SAVED_CONFIG_S *save_color_config_vars(struct pine *);
void free_saved_color_config(struct pine *, SAVED_CONFIG_S **);
void color_config_init_display(struct pine *, CONF_S **, CONF_S **);
-void add_header_color_line(struct pine *, CONF_S **, char *, int);
+void add_header_color_line(struct pine *, CONF_S **, char *, int, int);
int is_rgb_color(char *);
char *new_color_line(char *, int, int, int);
int color_text_tool(struct pine *, int, CONF_S **, unsigned);
@@ -142,7 +144,8 @@ sample_text(struct pine *ps, struct variable *v)
if((v && v->name &&
srchstr(v->name, "-foreground-color") &&
pvalfg && pvalfg[0] && pvalbg && pvalbg[0]) ||
- (v == &ps->vars[V_VIEW_HDR_COLORS] || v == &ps->vars[V_KW_COLORS]))
+ (v == &ps->vars[V_INDEX_TOKEN_COLORS] ||
+ v == &ps->vars[V_VIEW_HDR_COLORS] || v == &ps->vars[V_KW_COLORS]))
ret = SAMP1;
return(ret);
@@ -487,6 +490,26 @@ color_config_init_display(struct pine *ps, CONF_S **ctmp, CONF_S **first_line)
}
/*
+ * custom index tokens colors
+ */
+ vtmp = &ps->vars[V_INDEX_TOKEN_COLORS];
+ lval = LVAL(vtmp, ew);
+
+ if(lval && lval[0] && lval[0][0]){
+ for(i = 0; lval && lval[i]; i++)
+ add_header_color_line(ps, ctmp, lval[i], i, V_INDEX_TOKEN_COLORS);
+ }
+ else{
+ new_confline(ctmp); /* Blank line */
+ (*ctmp)->flags |= CF_NOSELECT | CF_B_LINE;
+ new_confline(ctmp);
+ (*ctmp)->help = NO_HELP;
+ (*ctmp)->flags |= CF_NOSELECT;
+ (*ctmp)->value = cpystr(_(ADDINDEXTOKEN_COMMENT));
+ (*ctmp)->valoffset = COLOR_INDENT;
+ }
+
+ /*
* custom header colors
*/
new_confline(ctmp); /* Blank line */
@@ -498,7 +521,7 @@ color_config_init_display(struct pine *ps, CONF_S **ctmp, CONF_S **first_line)
new_confline(ctmp);
(*ctmp)->help = NO_HELP;
(*ctmp)->flags |= CF_NOSELECT;
- (*ctmp)->value = cpystr(_("HEADER COLORS"));
+ (*ctmp)->value = cpystr(_(HDR_COLORS));
new_confline(ctmp);
(*ctmp)->help = NO_HELP;
(*ctmp)->flags |= CF_NOSELECT;
@@ -527,7 +550,7 @@ color_config_init_display(struct pine *ps, CONF_S **ctmp, CONF_S **first_line)
if(lval && lval[0] && lval[0][0]){
for(i = 0; lval && lval[i]; i++)
- add_header_color_line(ps, ctmp, lval[i], i);
+ add_header_color_line(ps, ctmp, lval[i], i, V_VIEW_HDR_COLORS);
}
else{
new_confline(ctmp); /* Blank line */
@@ -697,6 +720,7 @@ color_parenthetical(struct variable *var)
char **lval, *ret = "";
if(var == &ps_global->vars[V_VIEW_HDR_COLORS]
+ || var == &ps_global->vars[V_INDEX_TOKEN_COLORS]
|| var == &ps_global->vars[V_KW_COLORS]){
norm = (LVAL(var, Main) != NULL);
exc = (LVAL(var, ps_global->ew_for_except_vars) != NULL);
@@ -723,15 +747,21 @@ color_parenthetical(struct variable *var)
void
-add_header_color_line(struct pine *ps, CONF_S **ctmp, char *val, int which)
+add_header_color_line(struct pine *ps, CONF_S **ctmp, char *val, int which, int varnum)
{
struct variable *vtmp;
SPEC_COLOR_S *hc;
char tmp[100+1];
int l;
- vtmp = &ps->vars[V_VIEW_HDR_COLORS];
- l = strlen(HEADER_WORD);
+ hc = spec_color_from_var(val, 0);
+ if(varnum == V_INDEX_TOKEN_COLORS){
+ if(hc == NULL || hc->spec == NULL
+ || itoktype(hc->spec, FOR_INDEX) == NULL)
+ return;
+ }
+ vtmp = &ps->vars[varnum];
+ l = strlen(varnum == V_VIEW_HDR_COLORS ? HEADER_WORD : TOKEN_WORD);
/* Blank line */
new_confline(ctmp);
@@ -749,7 +779,6 @@ add_header_color_line(struct pine *ps, CONF_S **ctmp, char *val, int which)
/* which is an index into the variable list */
(*ctmp)->varmem = CFC_SET_COLOR(which, 0);
- hc = spec_color_from_var(val, 0);
if(hc && hc->inherit)
(*ctmp)->flags = (CF_NOSELECT | CF_INHERIT);
else{
@@ -760,7 +789,7 @@ add_header_color_line(struct pine *ps, CONF_S **ctmp, char *val, int which)
* with all this. It probably doesn't happen in real life.
*/
utf8_snprintf(tmp, sizeof(tmp), "%s%c%.*w Color%*w %s%s",
- HEADER_WORD,
+ (varnum == V_VIEW_HDR_COLORS ? HEADER_WORD : TOKEN_WORD),
(hc && hc->spec) ? (islower((unsigned char)hc->spec[0])
? toupper((unsigned char)hc->spec[0])
: hc->spec[0]) : '?',
@@ -1140,6 +1169,7 @@ color_holding_var(struct pine *ps, struct variable *var)
return(var && var->name &&
(srchstr(var->name, "-foreground-color") ||
srchstr(var->name, "-background-color") ||
+ var == &ps->vars[V_INDEX_TOKEN_COLORS] ||
var == &ps->vars[V_VIEW_HDR_COLORS] ||
var == &ps->vars[V_KW_COLORS]));
}
@@ -1184,6 +1214,32 @@ offer_none_color_for_var(struct pine *ps, struct variable *var)
|| var == &ps->vars[V_KW_COLORS]));
}
+char *colorindexrule(char *s)
+{
+ char *conftext;
+ char ***alval, **t;
+
+ if(!strcmp(s, "SUBJECT") || !strcmp(s, "SUBJECTTEXT")
+ || !strcmp(s, "SUBJKEYTEXT") || !strcmp(s, "SUBJKEYINITTEXT")
+ || !strcmp(s, "FROMORTO") || !strcmp(s, "FROM"))
+ return s;
+
+ t = NULL;
+ if((conftext = add_viewerhdr_escapes(s)) != NULL){
+ if((alval = ALVAL(&ps_global->vars[V_INDEX_TOKEN_COLORS], ew)) != NULL){
+ if((t = *alval) && t[0] && !t[0][0] && !(t+1)[0])
+ free_list_array(alval);
+
+ for(t = *alval; t && t[0]; t++){
+ if(strstr(*t, conftext) != NULL)
+ break;
+ }
+ }
+ fs_give((void **)&conftext);
+ }
+ return t && *t ? *t : NULL;
+}
+
int
color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
@@ -1396,6 +1452,7 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
if(hcolors)
free_spec_colors(&hcolors);
+ fix_side_effects(ps, (*cl)->var, 0);
set_current_color_vals(ps);
ClearScreen();
rv = ps->mangled_screen = 1;
@@ -1804,6 +1861,7 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
/* get rid of all user set colors */
for(v = ps->vars; v->name; v++){
if(!color_holding_var(ps, v)
+ || v == &ps->vars[V_INDEX_TOKEN_COLORS]
|| v == &ps->vars[V_VIEW_HDR_COLORS]
|| v == &ps->vars[V_KW_COLORS])
continue;
@@ -1857,6 +1915,44 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
free_spec_colors(&hcolors);
}
+ /* same for index token colors */
+ alval = ALVAL(&ps->vars[V_INDEX_TOKEN_COLORS], ew);
+ if(alval && *alval){
+ SPEC_COLOR_S *global_hcolors = NULL, *hcg;
+
+ v = &ps->vars[V_INDEX_TOKEN_COLORS];
+ if(v->global_val.l && v->global_val.l[0])
+ global_hcolors = spec_colors_from_varlist(v->global_val.l, 0);
+
+ hcolors = spec_colors_from_varlist(*alval, 0);
+ for(hc = hcolors; hc; hc = hc->next){
+ if(hc->fg)
+ fs_give((void **)&hc->fg);
+ if(hc->bg)
+ fs_give((void **)&hc->bg);
+
+ for(hcg = global_hcolors; hcg; hcg = hcg->next){
+ if(hc->spec && hcg->spec && !strucmp(hc->spec, hcg->spec)){
+ hc->fg = hcg->fg;
+ hcg->fg = NULL;
+ hc->bg = hcg->bg;
+ hcg->bg = NULL;
+ if(hc->val && !hcg->val)
+ fs_give((void **) &hc->val);
+ }
+ }
+
+ if(global_hcolors)
+ free_spec_colors(&global_hcolors);
+ }
+
+ free_list_array(alval);
+ *alval = varlist_from_spec_colors(hcolors);
+
+ if(hcolors)
+ free_spec_colors(&hcolors);
+ }
+
/*
* Same for keyword colors.
*/
@@ -1899,15 +1995,29 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
rv = 1;
break;
+ case MC_ADDHEADER: /* add custom index token color */
case MC_ADD : /* add custom header color */
/* get header field name */
help = NO_HELP;
while(1){
i = optionally_enter(sval, -FOOTER_ROWS(ps), 0, sizeof(sval),
- _("Enter the name of the header field to be added: "),
+ (cmd == MC_ADD ? _("Enter the name of the header field to be added: ")
+ : _("Enter the name of the index token to be added: ")),
NULL, help, NULL);
- if(i == 0)
+ if(i == 0){
+ if(cmd == MC_ADDHEADER){
+ if(itoktype(sval, FOR_INDEX) == NULL){
+ q_status_message1(SM_ORDER, 1, 3,
+ _("token \"%s\" not recognized"), sval);
+ continue;
+ } else if(colorindexrule(sval) != NULL){
+ q_status_message1(SM_ORDER, 1, 3,
+ _("Color rule for token \"%s\" already exists"), sval);
+ continue;
+ }
+ }
break;
+ }
else if(i == 1){
cmd_cancelled("Add");
cancel = 1;
@@ -1938,7 +2048,7 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
confline = var_from_spec_color(new_hcolor);
/* add it to end of list */
- alval = ALVAL(&ps->vars[V_VIEW_HDR_COLORS], ew);
+ alval = ALVAL(&ps->vars[(cmd == MC_ADD ? V_VIEW_HDR_COLORS : V_INDEX_TOKEN_COLORS)], ew);
if(alval){
/* get rid of possible empty value first */
if((t = *alval) && t[0] && !t[0][0] && !(t+1)[0])
@@ -1963,7 +2073,7 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
;
/* back up to the KEYWORD COLORS title line */
- for(; ctmp && (!ctmp->value || strcmp(ctmp->value, KW_COLORS_HDR))
+ for(; ctmp && (!ctmp->value || strcmp(ctmp->value, (cmd == MC_ADD ? KW_COLORS_HDR : HDR_COLORS)))
&& ctmp->prev;
ctmp = prev_confline(ctmp))
;
@@ -2001,7 +2111,8 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
free_conflines(&beg);
}
- add_header_color_line(ps, cl, confline, i);
+ add_header_color_line(ps, cl, confline, i, cmd == MC_ADD
+ ? V_VIEW_HDR_COLORS : V_INDEX_TOKEN_COLORS);
/* be sure current is on selectable line */
for(; *cl && ((*cl)->flags & CF_NOSELECT); *cl = next_confline(*cl))
@@ -2013,13 +2124,16 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
break;
case MC_DELETE : /* delete custom header color */
- if((*cl)->var != &ps->vars[V_VIEW_HDR_COLORS]){
+ if((*cl)->var != &ps->vars[V_VIEW_HDR_COLORS]
+ && (*cl)->var != &ps->vars[V_INDEX_TOKEN_COLORS]){
q_status_message(SM_ORDER, 0, 2,
_("Can't delete this color setting"));
break;
}
- if(want_to(_("Really delete header color from config"),
+ if(want_to(((*cl)->var == &ps->vars[V_VIEW_HDR_COLORS]
+ ? _("Really delete header color from config")
+ : _("Really delete index token color from config")),
'y', 'n', NO_HELP, WT_NORM) != 'y'){
cmd_cancelled("Delete");
return(rv);
@@ -2055,19 +2169,22 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
another = 0;
/* reset current line */
if(end && end->next && end->next->next &&
- end->next->next->var == &ps->vars[V_VIEW_HDR_COLORS]){
+ end->next->next->var == &ps->vars[(*cl)->var == &ps->vars[V_VIEW_HDR_COLORS]
+ ? V_VIEW_HDR_COLORS : V_INDEX_TOKEN_COLORS]){
*cl = end->next->next; /* next Header Color */
another++;
}
else if(beg && beg->prev &&
- beg->prev->var == &ps->vars[V_VIEW_HDR_COLORS]){
+ beg->prev->var == &ps->vars[(*cl)->var == &ps->vars[V_VIEW_HDR_COLORS]
+ ? V_VIEW_HDR_COLORS : V_INDEX_TOKEN_COLORS]){
*cl = beg->prev; /* prev Header Color */
another++;
}
/* adjust SPEC_COLOR_S index (varmem) values */
for(ctmp = end; ctmp; ctmp = next_confline(ctmp))
- if(ctmp->var == &ps->vars[V_VIEW_HDR_COLORS])
+ if(ctmp->var == &ps->vars[(*cl)->var == &ps->vars[V_VIEW_HDR_COLORS]
+ ? V_VIEW_HDR_COLORS : V_INDEX_TOKEN_COLORS])
ctmp->varmem = CFC_ICUST_DEC(ctmp);
/*
@@ -2099,7 +2216,8 @@ color_setting_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
end->flags = CF_NOSELECT;
end->help = NO_HELP;
- end->value = cpystr(_(ADDHEADER_COMMENT));
+ end->value = cpystr((*cl)->var == &ps->vars[V_VIEW_HDR_COLORS]
+ ? _(ADDHEADER_COMMENT) : _(ADDINDEXTOKEN_COMMENT));
end->valoffset = COLOR_INDENT;
end->varnamep = NULL;
end->varmem = 0;
@@ -2557,7 +2675,7 @@ color_edit_screen(struct pine *ps, CONF_S **cl)
OPT_SCREEN_S screen, *saved_screen;
CONF_S *ctmp = NULL, *first_line = NULL, *ctmpb;
int rv, is_index = 0, is_hdrcolor = 0, indent = 12;
- int is_general = 0, is_keywordcol = 0;
+ int is_general = 0, is_keywordcol = 0, is_idxtokcol = 0;
char tmp[1200+1], name[1200], *p;
struct variable *vtmp, v;
int i, def;
@@ -2568,6 +2686,8 @@ color_edit_screen(struct pine *ps, CONF_S **cl)
vtmp = (*cl)->var;
if(vtmp == &ps->vars[V_VIEW_HDR_COLORS])
is_hdrcolor++;
+ else if(vtmp == &ps->vars[V_INDEX_TOKEN_COLORS])
+ is_idxtokcol++;
else if(vtmp == &ps->vars[V_KW_COLORS])
is_keywordcol++;
else if(color_holding_var(ps, vtmp)){
@@ -2619,6 +2739,24 @@ color_edit_screen(struct pine *ps, CONF_S **cl)
name[i] = toupper((unsigned char) name[i]);
}
}
+ else if(is_idxtokcol){
+ char **lval;
+
+ lval = LVAL(vtmp, ew);
+ hcolors = spec_colors_from_varlist(lval, 0);
+
+ for(hc = hcolors, i = 0; hc; hc = hc->next, i++)
+ if(CFC_ICUST(*cl) == i)
+ break;
+
+ if(hc){
+ snprintf(name, sizeof(name), "%s%s", TOKEN_WORD, hc->spec);
+ name[sizeof(name)-1] = '\0';
+ i = sizeof(TOKEN_WORD) - 1;
+ if(islower((unsigned char) name[i]))
+ name[i] = toupper((unsigned char) name[i]);
+ }
+ }
else if(is_keywordcol){
char **lval;
@@ -2664,7 +2802,7 @@ color_edit_screen(struct pine *ps, CONF_S **cl)
ctmp->flags |= (CF_STARTITEM | CF_NOSELECT);
ctmp->keymenu = &color_changing_keymenu;
- if(is_hdrcolor){
+ if(is_hdrcolor || is_idxtokcol){
char **apval;
def = !(hc && hc->fg && hc->fg[0] && hc->bg && hc->bg[0]);
diff --git a/alpine/colorconf.h b/alpine/colorconf.h
index 501e31e5..1be27871 100644
--- a/alpine/colorconf.h
+++ b/alpine/colorconf.h
@@ -24,8 +24,11 @@
#define HEADER_WORD "Header "
+#define TOKEN_WORD "Index Token "
#define KW_COLORS_HDR "KEYWORD COLORS"
+#define HDR_COLORS "HEADER COLORS"
#define ADDHEADER_COMMENT N_("[ Use the AddHeader command to add colored headers in MESSAGE TEXT screen ]")
+#define ADDINDEXTOKEN_COMMENT N_("[ Use the IndxHdr command to add colored tokens in MESSAGE INDEX screen ]")
#define EQ_COL 37
#define SPACE_BETWEEN_DOUBLEVARS 3
diff --git a/alpine/confscroll.c b/alpine/confscroll.c
index 0ada8a79..24829265 100644
--- a/alpine/confscroll.c
+++ b/alpine/confscroll.c
@@ -3373,7 +3373,8 @@ update_option_screen(struct pine *ps, OPT_SCREEN_S *screen, Pos *cursor_pos)
ptr = sample;
/* then the color sample */
- if(ctmp->var == &ps->vars[V_VIEW_HDR_COLORS]){
+ if(ctmp->var == &ps->vars[V_VIEW_HDR_COLORS]
+ || ctmp->var == &ps->vars[V_INDEX_TOKEN_COLORS]){
SPEC_COLOR_S *hc, *hcolors;
lastc = newc = NULL;
@@ -5611,6 +5612,7 @@ fix_side_effects(struct pine *ps, struct variable *var, int revert)
}
}
else if(var == &ps->vars[V_KW_COLORS] ||
+ var == &ps->vars[V_INDEX_TOKEN_COLORS] ||
var == &ps->vars[V_IND_PLUS_FORE_COLOR] ||
var == &ps->vars[V_IND_IMP_FORE_COLOR] ||
var == &ps->vars[V_IND_DEL_FORE_COLOR] ||
diff --git a/alpine/dispfilt.c b/alpine/dispfilt.c
index be46fe60..7c93938b 100644
--- a/alpine/dispfilt.c
+++ b/alpine/dispfilt.c
@@ -57,13 +57,15 @@ char *
dfilter(char *rawcmd, STORE_S *input_so, gf_io_t output_pc, FILTLIST_S *aux_filters)
{
char *status = NULL, *cmd, *resultf = NULL, *tmpfile = NULL;
- int key = 0;
+ int key = 0, silent = 0;
- if((cmd = expand_filter_tokens(rawcmd,NULL,&tmpfile,&resultf,NULL,&key,NULL)) != NULL){
+ if((cmd = expand_filter_tokens(rawcmd,NULL,&tmpfile,&resultf,NULL,&key,NULL, &silent)) != NULL){
suspend_busy_cue();
#ifndef _WINDOWS
- ps_global->mangled_screen = 1;
- ClearScreen();
+ if(!silent){
+ ps_global->mangled_screen = 1;
+ ClearScreen();
+ }
fflush(stdout);
#endif
@@ -100,7 +102,8 @@ dfilter(char *rawcmd, STORE_S *input_so, gf_io_t output_pc, FILTLIST_S *aux_filt
/* prepare the terminal in case the filter uses it */
if(status == NULL){
if((filter_pipe = open_system_pipe(cmd, NULL, NULL,
- PIPE_USER | PIPE_RESET,
+ PIPE_USER | (silent ? PIPE_SILENT :
+ (F_ON(F_DISABLE_TERM_RESET_DISP, ps_global) ? 0 : PIPE_RESET)),
0, pipe_callback, NULL)) != NULL){
if(close_system_pipe(&filter_pipe, NULL, pipe_callback) == 0){
/* pull result out of tmp file */
@@ -131,7 +134,7 @@ dfilter(char *rawcmd, STORE_S *input_so, gf_io_t output_pc, FILTLIST_S *aux_filt
status = "Can't open display filter tmp file";
}
else if((status = gf_filter(cmd, key ? filter_session_key() : NULL,
- input_so, output_pc, aux_filters,
+ input_so, output_pc, aux_filters, silent,
F_ON(F_DISABLE_TERM_RESET_DISP, ps_global),
pipe_callback)) != NULL){
unsigned long ch;
@@ -151,7 +154,8 @@ dfilter(char *rawcmd, STORE_S *input_so, gf_io_t output_pc, FILTLIST_S *aux_filt
resume_busy_cue(0);
#ifndef _WINDOWS
- ClearScreen();
+ if(!silent)
+ ClearScreen();
#endif
fs_give((void **)&cmd);
}
@@ -166,7 +170,7 @@ dfilter(char *rawcmd, STORE_S *input_so, gf_io_t output_pc, FILTLIST_S *aux_filt
*/
char *
expand_filter_tokens(char *filter, ENVELOPE *env, char **tmpf, char **resultf,
- char **mtypef, int *key, int *hdrs)
+ char **mtypef, int *key, int *hdrs, int *silent)
{
char **array, **q;
char *bp, *cmd = NULL, *p = NULL,
@@ -313,6 +317,11 @@ expand_filter_tokens(char *filter, ENVELOPE *env, char **tmpf, char **resultf,
if(hdrs)
*hdrs = 1;
}
+ else if(!strcmp(*q, "_SILENT_")){
+ (*q)[0] = '\0';
+ if(silent)
+ *silent = 1;
+ }
}
/* count up required length */
diff --git a/alpine/dispfilt.h b/alpine/dispfilt.h
index bac20821..0b42010d 100644
--- a/alpine/dispfilt.h
+++ b/alpine/dispfilt.h
@@ -21,7 +21,7 @@
/* exported protoypes */
char *dfilter(char *, STORE_S *, gf_io_t, FILTLIST_S *);
char *dfilter_trigger(BODY *, char *, size_t);
-char *expand_filter_tokens(char *, ENVELOPE *, char **, char **, char **, int *, int *);
+char *expand_filter_tokens(char *, ENVELOPE *, char **, char **, char **, int *, int *, int *);
char *filter_session_key(void);
char *filter_data_file(int);
diff --git a/alpine/folder.c b/alpine/folder.c
index 02a73b71..31d2031e 100644
--- a/alpine/folder.c
+++ b/alpine/folder.c
@@ -78,7 +78,12 @@ or search for a folder name.
#define FLW_LIST 0x04 /* Allow for ListMode for subscribing */
#define FLW_UNSEEN 0x08 /* Add (unseen) */
-
+/* folder colors */
+#define CLR_UNSEEN 0x01 /* color folder with unseen/new messages */
+#define CLR_FOLDER 0x02 /* color a name of folder or directory */
+#define CLR_DIRECT 0x04 /* color a separator of a directory */
+#define CLR_FLDRLT 0x08 /* color of explanatory text in list scrn*/
+#define CLR_NORMAL 0x10 /* use normal color */
/*----------------------------------------------------------------------
The data needed to redraw the folders screen, including the case where the
@@ -174,7 +179,10 @@ int folder_list_write(gf_io_t, HANDLE_S **, CONTEXT_S *, int, char *, in
int folder_list_write_prefix(FOLDER_S *, int, gf_io_t);
int folder_list_write_middle(FOLDER_S *fp, CONTEXT_S *ctxt, gf_io_t pc, HANDLE_S *);
int folder_list_write_suffix(FOLDER_S *, int, gf_io_t);
-int color_monitored_unseen(FOLDER_S *, int);
+int color_monitored(FOLDER_S *, int, int);
+int color_test_for_folder(char *, char *);
+int color_write_for_folder(gf_io_t pc, int testtype);
+int use_color_for_folder(FOLDER_S *fp);
int folder_list_ith(int, CONTEXT_S *);
char *folder_list_center_space(char *, int);
HANDLE_S *folder_list_handle(FSTATE_S *, HANDLE_S *);
@@ -1616,8 +1624,10 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
if(c_list->prev)
gf_puts("\n", pc); /* blank line */
+ color_write_for_folder(pc, CLR_FLDRLT);
gf_puts(repeat_char(cols, '-'), pc);
gf_puts("\n", pc);
+ color_write_for_folder(pc, CLR_NORMAL);
}
/* nickname or description */
@@ -1626,6 +1636,7 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
|| F_ON(F_CMBND_SUBDIR_DISP, ps_global))){
char buf[6*MAX_SCREEN_COLS + 1];
+ color_write_for_folder(pc, CLR_FLDRLT);
if(cols < 40){
snprintf(buf, sizeof(buf), "%.*s", cols,
strsquish(tmp_20k_buf, SIZEOF_20KBUF,
@@ -1652,6 +1663,7 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
gf_puts(buf, pc);
gf_puts("\n", pc);
+ color_write_for_folder(pc, CLR_NORMAL);
}
else if(c_list->label){
if(utf8_width(c_list->label) > ps_global->ttyo->screen_cols)
@@ -1661,9 +1673,11 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
lbuf[sizeof(lbuf)-1] = '\0';
+ color_write_for_folder(pc, CLR_FLDRLT);
gf_puts(folder_list_center_space(lbuf, cols), pc);
gf_puts(lbuf, pc);
gf_puts("\n", pc);
+ color_write_for_folder(pc, CLR_NORMAL);
}
if(c_list->comment){
@@ -1674,9 +1688,11 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
lbuf[sizeof(lbuf)-1] = '\0';
+ color_write_for_folder(pc, CLR_FLDRLT);
gf_puts(folder_list_center_space(lbuf, cols), pc);
gf_puts(lbuf, pc);
gf_puts("\n", pc);
+ color_write_for_folder(pc, CLR_NORMAL);
}
if(c_list->dir->desc){
@@ -1685,9 +1701,11 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
strncpy(buf, strsquish(tmp_20k_buf,SIZEOF_20KBUF,c_list->dir->desc,cols),
sizeof(buf)-1);
buf[sizeof(buf)-1] = '\0';
+ color_write_for_folder(pc, CLR_FLDRLT);
gf_puts(folder_list_center_space(buf, cols), pc);
gf_puts(buf, pc);
gf_puts("\n", pc);
+ color_write_for_folder(pc, CLR_NORMAL);
}
if(c_list->use & CNTXT_ZOOM){
@@ -1704,18 +1722,23 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
lbuf[sizeof(lbuf)-1] = '\0';
+ color_write_for_folder(pc, CLR_FLDRLT);
gf_puts(folder_list_center_space(lbuf, cols), pc);
gf_puts(lbuf, pc);
gf_puts("\n", pc);
+ color_write_for_folder(pc, CLR_NORMAL);
}
+ color_write_for_folder(pc, CLR_FLDRLT);
gf_puts(repeat_char(cols, '-'), pc);
gf_puts("\n\n", pc);
+ color_write_for_folder(pc, CLR_NORMAL);
}
if(shown){
/* Run thru list formatting as necessary */
if((ftotal = folder_total(FOLDERS(c_list))) != 0){
+ int use_color;
/* If previously selected, mark members of new list */
selected = selected_folders(c_list);
@@ -1732,6 +1755,7 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
fcount++;
+ use_color = use_color_for_folder(f);
fname = folder_name_decoded((unsigned char *)FLDR_NAME(f));
width = utf8_width(fname ? (char *)fname : FLDR_NAME(f));
@@ -1740,7 +1764,7 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
fs_give((void **)&fname);
if(f->isdir)
- width += (f->isfolder) ? 3 : 1;
+ width += (f->isfolder) ? (use_color ? 1 : 3) : (use_color ? 0 : 1);
if(NEWS_TEST(c_list) && (c_list->use & CNTXT_FINDALL))
/* assume listmode so we don't have to reformat */
@@ -1874,9 +1898,11 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
lbuf[sizeof(lbuf)-1] = '\0';
+ color_write_for_folder(pc, CLR_FLDRLT);
gf_puts(folder_list_center_space(lbuf, cols), pc);
(void) folder_list_write(pc, handlesp, c_list, -1, lbuf,
(handlesp) ? FLW_LUNK : FLW_NONE);
+ color_write_for_folder(pc, CLR_NORMAL);
}
}
else if(fp->fs->combined_view
@@ -1891,9 +1917,11 @@ folder_list_text(struct pine *ps, FPROC_S *fp, gf_io_t pc, HANDLE_S **handlesp,
lbuf[sizeof(lbuf)-1] = '\0';
+ color_write_for_folder(pc, CLR_FLDRLT);
gf_puts(folder_list_center_space(lbuf, cols), pc);
(void) folder_list_write(pc, handlesp, c_list, -1, lbuf,
(handlesp) ? FLW_LUNK : FLW_NONE);
+ color_write_for_folder(pc, CLR_NORMAL);
}
gf_puts("\n", pc); /* blank line */
@@ -1940,17 +1968,24 @@ folder_list_write(gf_io_t pc, HANDLE_S **handlesp, CONTEXT_S *ctxt, int fnum, ch
if(h1){
/* color unseen? */
- if(color_monitored_unseen(fp, flags)){
+ if(color_monitored(fp, flags, CLR_UNSEEN)){
h1->color_unseen = 1;
if(h2)
h2->color_unseen = 1;
}
+ /* color folder? */
+ if(color_monitored(fp, flags, CLR_FOLDER)){
+ h1->color_folder = 1;
+ if(h2)
+ h2->color_folder = 1;
+ }
}
/* embed handle pointer */
- if(((h1 && h1->color_unseen) ?
- gf_puts(color_embed(ps_global->VAR_INCUNSEEN_FORE_COLOR,
- ps_global->VAR_INCUNSEEN_BACK_COLOR), pc) : 1)
+ if(((h1 && h1->color_unseen) ? color_write_for_folder(pc, CLR_UNSEEN)
+ : ((h1 && h1->color_folder)
+ ? color_write_for_folder(pc, fp->isfolder ? CLR_FOLDER : CLR_DIRECT)
+ : 1))
&& (h1 ? ((*pc)(TAG_EMBED) && (*pc)(TAG_HANDLE)
&& (*pc)(strlen(buf)) && gf_puts(buf, pc)) : 1)
&& (fp ? ((lprefix = folder_list_write_prefix(fp, flags, pc)) >= 0
@@ -1959,9 +1994,8 @@ folder_list_write(gf_io_t pc, HANDLE_S **handlesp, CONTEXT_S *ctxt, int fnum, ch
: (alt_name ? gf_puts(alt_name, pc) : 0))
&& (h1 ? ((*pc)(TAG_EMBED) && (*pc)(TAG_BOLDOFF)
&& (*pc)(TAG_EMBED) && (*pc)(TAG_INVOFF)) : 1)
- && ((h1 && h1->color_unseen) ?
- gf_puts(color_embed(ps_global->VAR_NORM_FORE_COLOR,
- ps_global->VAR_NORM_BACK_COLOR), pc) : 1)){
+ && ((h1 && (h1->color_unseen || h1->color_folder)) ?
+ color_write_for_folder(pc, CLR_NORMAL): 1)){
if(fp)
width = lprefix + lmiddle + lsuffix;
else if(alt_name)
@@ -2000,11 +2034,10 @@ folder_list_write_prefix(FOLDER_S *f, int flags, gf_io_t pc)
return(rv);
}
-
int
folder_list_write_middle(FOLDER_S *fp, CONTEXT_S *ctxt, gf_io_t pc, HANDLE_S *h2)
{
- int rv = -1;
+ int rv = -1, use_color;
char buf[256];
unsigned char *fname;
@@ -2017,18 +2050,23 @@ folder_list_write_middle(FOLDER_S *fp, CONTEXT_S *ctxt, gf_io_t pc, HANDLE_S *h2
return(rv);
fname = folder_name_decoded((unsigned char *)FLDR_NAME(fp));
+ use_color = use_color_for_folder(fp);
if(gf_puts(fname ? (char *)fname : FLDR_NAME(fp), pc)
&& (h2 ? ((*pc)(TAG_EMBED) && (*pc)(TAG_BOLDOFF) /* tie off handle 1 */
&& (*pc)(TAG_EMBED) && (*pc)(TAG_INVOFF)) : 1)
+ && ((use_color && fp->isdir && fp->isfolder)
+ ? color_write_for_folder(pc, CLR_DIRECT) : 1)
&& (h2 ? ((*pc)(TAG_EMBED) && (*pc)(TAG_HANDLE) /* start handle 2 */
&& (*pc)(strlen(buf)) && gf_puts(buf, pc)) : 1)
- && ((fp->isdir && fp->isfolder) ? (*pc)('[') : 1)
- && ((fp->isdir) ? (*pc)(ctxt->dir->delim) : 1)
- && ((fp->isdir && fp->isfolder) ? (*pc)(']') : 1)){
+ && use_color
+ ? (fp->isdir && fp->isfolder ? (*pc)(ctxt->dir->delim) : 1)
+ : (((fp->isdir && fp->isfolder) ? (*pc)('[') : 1)
+ && ((fp->isdir) ? (*pc)(ctxt->dir->delim) : 1)
+ && ((fp->isdir && fp->isfolder) ? (*pc)(']') : 1))){
rv = utf8_width(fname ? (char *)fname : FLDR_NAME(fp));
if(fp->isdir)
- rv += (fp->isfolder) ? 3 : 1;
+ rv += (fp->isfolder) ? (use_color ? 1 : 3) : (use_color ? 0 : 1);
}
if(fname)
@@ -2079,20 +2117,85 @@ folder_list_write_suffix(FOLDER_S *f, int flags, gf_io_t pc)
return(rv);
}
+int
+color_write_for_folder(gf_io_t pc, int testtype)
+{
+ int rv;
+ if(!pico_usingcolor())
+ return 1;
+ switch (testtype){
+ case CLR_UNSEEN:
+ rv = gf_puts(color_embed(ps_global->VAR_INCUNSEEN_FORE_COLOR,
+ ps_global->VAR_INCUNSEEN_BACK_COLOR), pc);
+ break;
+ case CLR_FOLDER:
+ rv = gf_puts(color_embed(ps_global->VAR_FOLDER_FORE_COLOR,
+ ps_global->VAR_FOLDER_BACK_COLOR ), pc);
+ break;
+ case CLR_FLDRLT:
+ rv = gf_puts(color_embed(ps_global->VAR_FOLDER_LIST_FORE_COLOR,
+ ps_global->VAR_FOLDER_LIST_BACK_COLOR ), pc);
+ break;
+ case CLR_DIRECT:
+ rv = gf_puts(color_embed(ps_global->VAR_DIRECTORY_FORE_COLOR,
+ ps_global->VAR_DIRECTORY_BACK_COLOR), pc);
+ break;
+ case CLR_NORMAL:
+ rv = gf_puts(color_embed(ps_global->VAR_NORM_FORE_COLOR,
+ ps_global->VAR_NORM_BACK_COLOR), pc);
+ break;
+ default:
+ rv = 0; /* fail */
+ break;
+ }
+ return rv;
+}
+
+
+int
+color_test_for_folder(char *color_fore, char *color_back)
+{
+ return pico_usingcolor()
+ && pico_is_good_color(color_fore)
+ && pico_is_good_color(color_back)
+ && (colorcmp(color_fore, ps_global->VAR_NORM_FORE_COLOR)
+ || colorcmp(color_back,
+ ps_global->VAR_NORM_BACK_COLOR)) ? 1 : 0;
+
+}
+
int
-color_monitored_unseen(FOLDER_S *f, int flags)
+use_color_for_folder(FOLDER_S *fp)
{
- return((flags & FLW_UNSEEN) && f && f->unseen_valid
+ int test1, test2;
+ if(fp->isdir)
+ test1 = color_test_for_folder(ps_global->VAR_DIRECTORY_FORE_COLOR,
+ ps_global->VAR_DIRECTORY_BACK_COLOR);
+ if(fp->isfolder)
+ test2 = color_test_for_folder(ps_global->VAR_FOLDER_FORE_COLOR,
+ ps_global->VAR_FOLDER_BACK_COLOR);
+ return (fp->isdir && fp->isfolder) ? test1 + test2
+ : (fp->isdir ? test1 : (fp->isfolder? test2 : 0));
+}
+
+
+int
+color_monitored(FOLDER_S *f, int flags, int testtype)
+{
+ int rv;
+ switch(testtype){
+ case CLR_UNSEEN: rv = (flags & FLW_UNSEEN) && f && f->unseen_valid
&& ((F_ON(F_INCOMING_CHECKING_RECENT, ps_global) && f->new > 0L)
|| (F_OFF(F_INCOMING_CHECKING_RECENT, ps_global) && f->unseen > 0L))
- && pico_usingcolor()
- && pico_is_good_color(ps_global->VAR_INCUNSEEN_FORE_COLOR)
- && pico_is_good_color(ps_global->VAR_INCUNSEEN_BACK_COLOR)
- && (colorcmp(ps_global->VAR_INCUNSEEN_FORE_COLOR,
- ps_global->VAR_NORM_FORE_COLOR)
- || colorcmp(ps_global->VAR_INCUNSEEN_BACK_COLOR,
- ps_global->VAR_NORM_BACK_COLOR)));
+ && color_test_for_folder(ps_global->VAR_INCUNSEEN_FORE_COLOR,
+ ps_global->VAR_INCUNSEEN_BACK_COLOR) ? 1 : 0;
+ break;
+ case CLR_FOLDER: rv = f ? use_color_for_folder(f) : 0;
+ break;
+ default: rv = 0;
+ }
+ return rv;
}
diff --git a/alpine/keymenu.c b/alpine/keymenu.c
index 6234a2ac..195ae73c 100644
--- a/alpine/keymenu.c
+++ b/alpine/keymenu.c
@@ -1155,7 +1155,7 @@ struct key color_pattern_keys[] =
HELP_MENU,
OTHER_MENU,
- NULL_MENU,
+ {"I", N_("IndxHdr"), {MC_ADDHEADER,1,{'i'}}, KS_NONE},
NULL_MENU,
NULL_MENU,
NULL_MENU,
@@ -2452,7 +2452,7 @@ struct key color_setting_keys[] =
HELP_MENU,
OTHER_MENU,
- NULL_MENU,
+ {"I", N_("IndxHdr"), {MC_ADDHEADER,1,{'i'}}, KS_NONE},
NULL_MENU,
NULL_MENU,
NULL_MENU,
@@ -2481,7 +2481,7 @@ struct key custom_color_setting_keys[] =
HELP_MENU,
OTHER_MENU,
- NULL_MENU,
+ {"I", N_("IndxHdr"), {MC_ADDHEADER,1,{'i'}}, KS_NONE},
NULL_MENU,
{"D", N_("DeleteHdr"), {MC_DELETE,1,{'d'}}, KS_NONE},
/* TRANSLATORS: shuffle headers (change the order of headers) */
@@ -2527,7 +2527,7 @@ struct key kw_color_setting_keys[] =
HELP_MENU,
OTHER_MENU,
- NULL_MENU,
+ {"I", N_("IndxHdr"), {MC_ADDHEADER,1,{'i'}}, KS_NONE},
NULL_MENU,
NULL_MENU,
NULL_MENU,
diff --git a/alpine/keymenu.h b/alpine/keymenu.h
index 3b603fca..0e1f7618 100644
--- a/alpine/keymenu.h
+++ b/alpine/keymenu.h
@@ -214,6 +214,7 @@ struct key_menu {
#define MC_CHK_RECENT 801
#define MC_DECRYPT 802
#define MC_QUOTA 803
+#define MC_ADDHEADER 804
/*
* Some standard Key/Command Bindings
diff --git a/alpine/reply.c b/alpine/reply.c
index ee90ebd0..f0a40651 100644
--- a/alpine/reply.c
+++ b/alpine/reply.c
@@ -931,8 +931,36 @@ confirm_role(long int rflags, ACTION_S **role)
int
reply_to_all_query(int *flagp)
{
- switch(want_to("Reply to all recipients",
- 'n', 'x', NO_HELP, WT_SEQ_SENSITIVE)){
+ char prompt[80];
+ ESCKEY_S ekey[4];
+ char cmd;
+
+ ekey[0].name = "Y";
+ ekey[0].ch = 'y';
+ ekey[0].rval = 'y';
+ ekey[0].label = N_("Yes");
+ ekey[1].name = "N";
+ ekey[1].ch = 'n';
+ ekey[1].rval = 'n';
+ ekey[1].label = N_("No");
+ ekey[2].name = "P";
+ ekey[2].ch = 'p';
+ ekey[2].rval = 'p';
+ ekey[3].ch = -1;
+
+ ps_global->preserve = F_ON(F_PRESERVE_ORIGINAL_FIELD, ps_global);
+
+
+loop:
+ ekey[2].label = ps_global->preserve ? N_("Not Preserve") : N_("Preserve");
+ snprintf(prompt, sizeof(prompt), _("Reply to all recipients%s"),
+ ps_global->preserve ? _(" (preserving fields)? ") : "? ");
+
+ prompt[sizeof(prompt)-1] = '\0';
+
+ switch(cmd = radio_buttons(prompt, -FOOTER_ROWS(ps_global), ekey,
+ 'n', 'x', h_preserve_field, RB_NORM)){
+
case 'x' :
return(-1);
@@ -943,6 +971,11 @@ reply_to_all_query(int *flagp)
case 'n' : /* clear reply-all bit */
(*flagp) &= ~RSF_FORCE_REPLY_ALL;
break;
+
+ case 'p' :
+ ps_global->preserve = !ps_global->preserve;
+ goto loop; /* ugly, but saves me a variable */
+ break;
}
return(0);
diff --git a/alpine/send.c b/alpine/send.c
index 3d670f02..852b611c 100644
--- a/alpine/send.c
+++ b/alpine/send.c
@@ -5223,7 +5223,7 @@ filter_message_text(char *fcmd, ENVELOPE *outgoing, struct mail_bodystruct *body
if(fcmd
&& (cmd=expand_filter_tokens(fcmd, outgoing, &tmpf, &resultf, &mtf,
- &key, &include_hdrs))){
+ &key, &include_hdrs, NULL))){
if(tmpf){
/*
* We need WRITE_TO_LOCALE here because the user is going to
@@ -5330,7 +5330,7 @@ filter_message_text(char *fcmd, ENVELOPE *outgoing, struct mail_bodystruct *body
}
else
errstr = gf_filter(cmd, key ? filter_session_key() : NULL,
- readthis_so, pc, NULL, 0,
+ readthis_so, pc, NULL, 0, 0,
pipe_callback);
if(our_tmpf_so)