diff options
author | Eduardo Chappa <chappa@washington.edu> | 2013-02-05 00:59:30 -0700 |
---|---|---|
committer | Eduardo Chappa <chappa@washington.edu> | 2013-02-08 21:03:59 -0700 |
commit | 640d8845bffdf13007a10929ad0f18375a9a2473 (patch) | |
tree | 2c3fa0bb9b5dfc435dbde151cedf7b4f8b7b6660 /alpine | |
parent | dc6c0f8d846e14fc6841516ad772553fc5975bd6 (diff) | |
download | alpine-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.c | 1 | ||||
-rw-r--r-- | alpine/colorconf.c | 182 | ||||
-rw-r--r-- | alpine/colorconf.h | 3 | ||||
-rw-r--r-- | alpine/confscroll.c | 4 | ||||
-rw-r--r-- | alpine/dispfilt.c | 25 | ||||
-rw-r--r-- | alpine/dispfilt.h | 2 | ||||
-rw-r--r-- | alpine/folder.c | 153 | ||||
-rw-r--r-- | alpine/keymenu.c | 8 | ||||
-rw-r--r-- | alpine/keymenu.h | 1 | ||||
-rw-r--r-- | alpine/reply.c | 37 | ||||
-rw-r--r-- | alpine/send.c | 4 |
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) |