diff -pruN mutt-1.5.1.orig/Makefile.am mutt-1.5.1/Makefile.am --- mutt-1.5.1.orig/Makefile.am Thu Feb 7 10:14:11 2002 +++ mutt-1.5.1/Makefile.am Thu May 2 19:53:49 2002 @@ -24,7 +24,7 @@ mutt_SOURCES = $(BUILT_SOURCES) \ main.c mbox.c menu.c mh.c mx.c pager.c parse.c pattern.c \ postpone.c query.c recvattach.c recvcmd.c \ rfc822.c rfc1524.c rfc2047.c rfc2231.c \ - score.c send.c sendlib.c signal.c sort.c \ + score.c send.c sendlib.c signal.c signature.c sort.c \ status.c system.c thread.c charset.c history.c lib.c \ muttlib.c editmsg.c utf8.c mbyte.c wcwidth.c \ url.c ascii.c diff -pruN mutt-1.5.1.orig/Makefile.in mutt-1.5.1/Makefile.in --- mutt-1.5.1.orig/Makefile.in Thu May 2 01:23:23 2002 +++ mutt-1.5.1/Makefile.in Thu May 2 19:55:29 2002 @@ -118,7 +118,7 @@ bin_SCRIPTS = muttbug flea BUILT_SOURCES = keymap_defs.h patchlist.c bin_PROGRAMS = mutt @DOTLOCK_TARGET@ @PGPAUX_TARGET@ @SMIMEAUX_TARGET@ -mutt_SOURCES = $(BUILT_SOURCES) addrbook.c alias.c attach.c base64.c browser.c buffy.c color.c commands.c complete.c compose.c copy.c curs_lib.c curs_main.c date.c edit.c enter.c flags.c init.c filter.c from.c getdomain.c handler.c hash.c hdrline.c headers.c help.c hook.c keymap.c main.c mbox.c menu.c mh.c mx.c pager.c parse.c pattern.c postpone.c query.c recvattach.c recvcmd.c rfc822.c rfc1524.c rfc2047.c rfc2231.c 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 utf8.c mbyte.c wcwidth.c url.c ascii.c +mutt_SOURCES = $(BUILT_SOURCES) addrbook.c alias.c attach.c base64.c browser.c buffy.c color.c commands.c complete.c compose.c copy.c curs_lib.c curs_main.c date.c edit.c enter.c flags.c init.c filter.c from.c getdomain.c handler.c hash.c hdrline.c headers.c help.c hook.c keymap.c main.c mbox.c menu.c mh.c mx.c pager.c parse.c pattern.c postpone.c query.c recvattach.c recvcmd.c rfc822.c rfc1524.c rfc2047.c rfc2231.c score.c send.c sendlib.c signal.c signature.c sort.c status.c system.c thread.c charset.c history.c lib.c muttlib.c editmsg.c utf8.c mbyte.c wcwidth.c url.c ascii.c mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) $(INTLLIBS) $(LIBICONV) @@ -190,9 +190,9 @@ curs_lib.o curs_main.o date.o edit.o ent from.o getdomain.o handler.o hash.o hdrline.o headers.o help.o hook.o \ keymap.o main.o mbox.o menu.o mh.o mx.o pager.o parse.o pattern.o \ postpone.o query.o recvattach.o recvcmd.o rfc822.o rfc1524.o rfc2047.o \ -rfc2231.o score.o send.o sendlib.o signal.o sort.o status.o system.o \ -thread.o charset.o history.o lib.o muttlib.o editmsg.o utf8.o mbyte.o \ -wcwidth.o url.o ascii.o +rfc2231.o score.o send.o sendlib.o signal.o signature.o sort.o status.o \ +system.o thread.o charset.o history.o lib.o muttlib.o editmsg.o utf8.o \ +mbyte.o wcwidth.o url.o ascii.o mutt_LDFLAGS = SCRIPTS = $(bin_SCRIPTS) diff -pruN mutt-1.5.1.orig/OPS mutt-1.5.1/OPS --- mutt-1.5.1.orig/OPS Thu Apr 25 15:26:01 2002 +++ mutt-1.5.1/OPS Thu May 2 19:53:49 2002 @@ -36,6 +36,7 @@ OP_COMPOSE_TOGGLE_RECODE "toggle recodin OP_COMPOSE_POSTPONE_MESSAGE "save this message to send later" OP_COMPOSE_RENAME_FILE "rename/move an attached file" OP_COMPOSE_SEND_MESSAGE "send the message" +OP_COMPOSE_SIG "choose a signature" OP_COMPOSE_TOGGLE_DISPOSITION "toggle disposition between inline/attachment" OP_COMPOSE_TOGGLE_UNLINK "toggle whether to delete file after sending it" OP_COMPOSE_UPDATE_ENCODING "update an attachment's encoding info" @@ -125,6 +126,7 @@ OP_MIDDLE_PAGE "move to the middle of th OP_NEXT_ENTRY "move to the next entry" OP_NEXT_LINE "scroll down one line" OP_NEXT_PAGE "move to the next page" +OP_NEXT_SIG "move to the next signature" OP_PAGER_BOTTOM "jump to the bottom of the message" OP_PAGER_HIDE_QUOTED "toggle display of quoted text" OP_PAGER_SKIP_QUOTED "skip beyond quoted text" @@ -133,10 +135,12 @@ OP_PIPE "pipe message/attachment to a sh OP_PREV_ENTRY "move to the previous entry" OP_PREV_LINE "scroll up one line" OP_PREV_PAGE "move to the previous page" +OP_PREV_SIG "move to the previous signature" OP_PRINT "print the current entry" OP_QUERY "query external program for addresses" OP_QUERY_APPEND "append new query results to current results" OP_QUIT "save changes to mailbox and quit" +OP_RANDOM_SIG "pick a signature at random" OP_RECALL_MESSAGE "recall a postponed message" OP_REDRAW "clear and redraw the screen" OP_REFORMAT_WINCH "{internal}" @@ -149,6 +153,7 @@ OP_SEARCH_NEXT "search for next match" OP_SEARCH_OPPOSITE "search for next match in opposite direction" OP_SEARCH_TOGGLE "toggle search pattern coloring" OP_SHELL_ESCAPE "invoke a command in a subshell" +OP_SIG_SEARCH "search signatures matching a pattern" OP_SORT "sort messages" OP_SORT_REVERSE "sort messages in reverse order" OP_TAG "tag the current entry" diff -pruN mutt-1.5.1.orig/compose.c mutt-1.5.1/compose.c --- mutt-1.5.1.orig/compose.c Tue Mar 26 23:03:26 2002 +++ mutt-1.5.1/compose.c Thu May 2 19:53:49 2002 @@ -1226,6 +1226,12 @@ int mutt_compose_menu (HEADER *msg, /* mutt_print_attachment_list (NULL, menu->tagprefix, menu->tagprefix ? msg->content : idx[menu->current]->content); break; + case OP_COMPOSE_SIG: + mutt_signature(msg->content->filename); + MAYBE_REDRAW (menu->redraw); + mutt_update_encoding (msg->content); + break; + case OP_PIPE: case OP_FILTER: CHECK_COUNT; diff -pruN mutt-1.5.1.orig/doc/manual.sgml.head mutt-1.5.1/doc/manual.sgml.head --- mutt-1.5.1.orig/doc/manual.sgml.head Thu Apr 25 15:28:03 2002 +++ mutt-1.5.1/doc/manual.sgml.head Thu May 2 19:53:49 2002 @@ -525,6 +525,7 @@ r edit-reply-to edit the c edit-cc edit the Cc field b edit-bcc edit the Bcc field y send-message send the message +ESC s signature-menu select a signature and append it to your mail s edit-subject edit the Subject f edit-fcc specify an ``Fcc'' mailbox p pgp-menu select PGP options (``i'' version only) diff -pruN mutt-1.5.1.orig/functions.h mutt-1.5.1/functions.h --- mutt-1.5.1.orig/functions.h Thu Jan 24 22:12:15 2002 +++ mutt-1.5.1/functions.h Thu May 2 19:53:49 2002 @@ -314,6 +314,7 @@ struct binding_t OpCompose[] = { { "view-attach", OP_VIEW_ATTACH, M_ENTER_S }, { "send-message", OP_COMPOSE_SEND_MESSAGE, "y" }, { "pipe-entry", OP_PIPE, "|" }, + { "signature-menu", OP_COMPOSE_SIG, "\033s" }, #ifdef HAVE_PGP { "attach-key", OP_COMPOSE_ATTACH_KEY, "\033k" }, @@ -375,6 +376,19 @@ struct binding_t OpQuery[] = { { "mail", OP_MAIL, "m" }, { "query", OP_QUERY, "Q" }, { "query-append", OP_QUERY_APPEND, "A" }, + { NULL, 0, NULL } +}; + +/* Signature Menu */ +struct binding_t OpSig[] = { + { "next-sig", OP_NEXT_SIG, "j" }, + { "previous-sig", OP_PREV_SIG, "k" }, + { "random-sig", OP_RANDOM_SIG, "r" }, + { NULL, 0, NULL } +}; + +struct binding_t OpSigDir[] = { + { "search-sig", OP_SIG_SEARCH, "/" }, { NULL, 0, NULL } }; diff -pruN mutt-1.5.1.orig/globals.h mutt-1.5.1/globals.h --- mutt-1.5.1.orig/globals.h Thu Jan 24 22:12:15 2002 +++ mutt-1.5.1/globals.h Thu May 2 19:53:49 2002 @@ -99,6 +99,7 @@ WHERE char *SendCharset; WHERE char *Sendmail; WHERE char *Shell; WHERE char *Signature; +WHERE char *SigDirectory; WHERE char *SimpleSearch; WHERE char *Spoolfile; #if defined(USE_SSL) || defined(USE_NSS) diff -pruN mutt-1.5.1.orig/init.h mutt-1.5.1/init.h --- mutt-1.5.1.orig/init.h Thu Apr 25 15:26:01 2002 +++ mutt-1.5.1/init.h Thu May 2 19:53:49 2002 @@ -2175,6 +2175,14 @@ struct option_t MuttVars[] = { ** assumed that filename is a shell command and input should be read from ** its stdout. */ + { "signatures_directory", DT_PATH, R_NONE, UL &SigDirectory, UL "" }, + /* + ** .pp + ** Specifies the path where your signatures are located. In the files of + ** this directory, the signatures are separated by blank lines and/or + ** sig_dashes (``-- ''). + ** You can choose between these signatures from the compose menu. + */ { "simple_search", DT_STR, R_NONE, UL &SimpleSearch, UL "~f %s | ~s %s" }, /* ** .pp diff -pruN mutt-1.5.1.orig/keymap.c mutt-1.5.1/keymap.c --- mutt-1.5.1.orig/keymap.c Thu Jan 24 22:12:15 2002 +++ mutt-1.5.1/keymap.c Thu May 2 19:53:49 2002 @@ -53,6 +53,8 @@ struct mapping_t Menus[] = { { "query", MENU_QUERY }, + { "signature", MENU_SIG }, + { "sig_directory", MENU_SIG_DIR }, { "generic", MENU_GENERIC }, { NULL, 0 } }; @@ -531,6 +533,8 @@ void km_init (void) create_bindings (OpPost, MENU_POST); create_bindings (OpQuery, MENU_QUERY); create_bindings (OpAlias, MENU_ALIAS); + create_bindings (OpSig, MENU_SIG); + create_bindings (OpSigDir, MENU_SIG_DIR); #ifdef HAVE_PGP @@ -626,6 +630,9 @@ void km_init (void) km_bindkey ("", MENU_ATTACH, OP_VIEW_ATTACH); km_bindkey ("", MENU_COMPOSE, OP_VIEW_ATTACH); + km_bindkey ("", MENU_SIG, OP_PREV_SIG); + km_bindkey ("", MENU_SIG, OP_NEXT_SIG); + /* edit-to (default "t") hides generic tag-entry in Compose menu This will bind tag-entry to "T" in the Compose menu */ km_bindkey ("T", MENU_COMPOSE, OP_TAG); @@ -746,6 +753,10 @@ struct binding_t *km_get_table (int menu return OpEditor; case MENU_QUERY: return OpQuery; + case MENU_SIG: + return OpSig; + case MENU_SIG_DIR: + return OpSigDir; diff -pruN mutt-1.5.1.orig/keymap.h mutt-1.5.1/keymap.h --- mutt-1.5.1.orig/keymap.h Thu Jan 24 22:12:15 2002 +++ mutt-1.5.1/keymap.h Thu May 2 19:53:49 2002 @@ -59,6 +59,8 @@ enum MENU_PAGER, MENU_POST, MENU_QUERY, + MENU_SIG, + MENU_SIG_DIR, #ifdef HAVE_PGP @@ -105,6 +107,8 @@ extern struct binding_t OpBrowser[]; extern struct binding_t OpEditor[]; extern struct binding_t OpQuery[]; extern struct binding_t OpAlias[]; +extern struct binding_t OpSig[]; +extern struct binding_t OpSigDir[]; #ifdef HAVE_PGP extern struct binding_t OpPgp[]; diff -pruN mutt-1.5.1.orig/protos.h mutt-1.5.1/protos.h --- mutt-1.5.1.orig/protos.h Mon Apr 29 19:09:16 2002 +++ mutt-1.5.1/protos.h Thu May 2 19:53:49 2002 @@ -220,6 +220,7 @@ void mutt_set_followup_to (ENVELOPE *); void mutt_shell_escape (void); void mutt_show_error (void); void mutt_signal_init (void); +void mutt_signature (char *); void mutt_stamp_attachment (BODY *a); void mutt_tabs_to_spaces (char *); void mutt_tag_set_flag (int, int); diff -pruN mutt-1.5.1.orig/signature.c mutt-1.5.1/signature.c --- mutt-1.5.1.orig/signature.c Thu Jan 1 01:00:00 1970 +++ mutt-1.5.1/signature.c Thu May 2 19:53:49 2002 @@ -0,0 +1,495 @@ +/* + * Copyright (C) 2001 Cedric Duval + * + * 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. + */ + +#include "mutt.h" +#include "mutt_menu.h" +#include "mapping.h" +#include "mutt_curses.h" + +#include +#include +#include +#include +#include + +#define SIG_DISPLAY_LINES 4 +#define SEPARATOR(x) ((*x == '\n') || (mutt_strcmp (x, "-- \n") == 0)) +#define SIG_ADD_LINE(x,y) mutt_add_list (x, strtok (y, "\n")) + +typedef struct sig_list +{ + struct sig_list *next; + LIST *sig; +} SIG_LIST; + +typedef struct sig_dir +{ + struct sig_dir *next; + char *name; +} SIG_DIR; + +typedef LIST * ENTRY; + +typedef struct entry_dir +{ + int tagged; + SIG_DIR *data; +} ENTRY_DIR; + +static struct mapping_t SigHelp[] = { + { N_("Exit"), OP_EXIT }, + { N_("Search"), OP_SEARCH }, + { N_("Random"), OP_RANDOM_SIG }, + { N_("Help"), OP_HELP }, + { NULL } +}; + +static struct mapping_t SigDirHelp[] = { + { N_("Exit"), OP_EXIT }, + { N_("Search signature"), OP_SIG_SEARCH }, + { N_("Help"), OP_HELP }, + { NULL } +}; + +void menu_next_entry (MUTTMENU *menu); +void menu_prev_entry (MUTTMENU *menu); + + +static int sig_match (LIST *s, regex_t *re) +{ + while (s) + { + if (regexec (re, s->data, (size_t)0, NULL, (int)0) == 0) + return 1; + s = s->next; + } + return 0; +} + +static void read_sig_file (char *name, SIG_LIST **begin, regex_t *re) +{ + FILE *fp; + char buf[STRING]; + LIST *sig = NULL; + SIG_LIST *first, *cur; + int append = 0; + + if (!(fp = safe_fopen (name, "r"))) + { + mutt_error (_("Can't open signature file %s"), name); + return; + } + + for (first = *begin; first && first->next; first = first->next, append++) + ; /* append results to an existing list */ + cur = first; + + while (fgets (buf, sizeof (buf), fp)) + { + if (buf[0] && !SEPARATOR (buf)) + { + sig = SIG_ADD_LINE (NULL, buf); + + while (fgets (buf, sizeof (buf), fp) && buf[0] && !SEPARATOR (buf)) + SIG_ADD_LINE (sig, buf); + + if (re && !sig_match (sig, re)) + mutt_free_list (&sig); /* previous sig didn't match the regexp */ + else + { + /* add signature */ + if (first == NULL) + first = cur = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST)); + else + { + cur->next = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST)); + cur = cur->next; + } + + cur->sig = sig; + cur->next = NULL; + } + } + } + + if (!append) + *begin = first; + + safe_fclose (&fp); +} + +static void sig_make_entry (char *s, size_t slen, MUTTMENU *menu, int num) +{ + ENTRY *table = (ENTRY *) menu->data; + + snprintf (s, slen, "%3d %s", + num + 1, + table[num]->data); +} + +static int sig_menu_search (MUTTMENU *menu, regex_t *re, int num) +{ + return (sig_match (((ENTRY *)menu->data)[num], re) ? 0 : REG_NOMATCH); +} + +static void draw_sig_frame (LIST *s) +{ + int i; + + for (i = 1; i <= SIG_DISPLAY_LINES; i++) + { + if (s) + { + mvaddstr (i, 0, s->data); + s = s->next; + } + else + move (i, 0); + + clrtoeol (); + } + + SETCOLOR (MT_COLOR_STATUS); + mvaddstr (SIG_DISPLAY_LINES + 1, 0, _("-- Signature")); + BKGDSET (MT_COLOR_STATUS); + clrtoeol (); + + BKGDSET (MT_COLOR_NORMAL); + SETCOLOR (MT_COLOR_NORMAL); +} + +static void free_sig_list (SIG_LIST **sigs) +{ + SIG_LIST *cur; + + while (*sigs) + { + cur = *sigs; + *sigs = (*sigs)->next; + mutt_free_list (&cur->sig); + safe_free ((void **)&cur); + } +} + +static void append_signature (char *msg_file, LIST *s) +{ + FILE *fp; + + if ((fp = safe_fopen (msg_file, "a")) == 0) + mutt_perror (msg_file); + else + { + if (option (OPTSIGDASHES)) + fputs ("\n-- \n", fp); + + for (; s; s = s->next) + fprintf (fp, "%s\n", s->data); + + mutt_message (_("Signature appended to your mail")); + safe_fclose (&fp); + } +} + +static LIST *sig_list_menu (char *file, SIG_LIST *list) +{ + LIST *result = NULL; + SIG_LIST *sigl; + MUTTMENU *menu; + ENTRY *SigTable; + char helpstr[SHORT_STRING], title[SHORT_STRING]; + int i, done = 0; + + snprintf (title, sizeof (title), _("Signature : %s"), file); + + menu = mutt_new_menu (); + menu->make_entry = sig_make_entry; + menu->tag = NULL; + menu->search = sig_menu_search; + menu->menu = MENU_SIG; + menu->title = title; + menu->help = mutt_compile_help (helpstr, sizeof (helpstr), + MENU_SIG, SigHelp); + menu->offset = SIG_DISPLAY_LINES + 2; + menu->pagelen = LINES - SIG_DISPLAY_LINES - 4; + + for (sigl = list; sigl; sigl = sigl->next) + menu->max++; + + menu->data = SigTable = (ENTRY *) safe_calloc (menu->max, sizeof (ENTRY)); + + for (i = 0, sigl = list; sigl; i++, sigl = sigl->next) + SigTable[i] = sigl->sig; + + while (!done) + { + switch (mutt_menuLoop (menu)) + { + case OP_GENERIC_SELECT_ENTRY: + result = SigTable[menu->current]; + done = 1; + break; + + case OP_PREV_SIG: + menu_prev_entry (menu); + draw_sig_frame (SigTable[menu->current]); + break; + + case OP_NEXT_SIG: + menu_next_entry (menu); + draw_sig_frame (SigTable[menu->current]); + break; + + case OP_REDRAW: + menu->offset = SIG_DISPLAY_LINES + 2; + menu->pagelen = LINES - SIG_DISPLAY_LINES - 4; + draw_sig_frame (SigTable[menu->current]); + break; + + case OP_RANDOM_SIG: + menu->current = LRAND () % menu->max; + draw_sig_frame (SigTable[menu->current]); + menu->redraw |= REDRAW_MOTION; + break; + + case OP_EXIT: + set_option (OPTNEEDREDRAW); + done = 1; + break; + } + } + + mutt_menuDestroy (&menu); + safe_free ((void **)&SigTable); + return result; +} + +static SIG_LIST *sig_search_filter (MUTTMENU *menu, char *path) +{ + regex_t re; + char buf[STRING]; + SIG_LIST *result = NULL; + int i; + + snprintf (buf, sizeof(buf), menu->searchBuf ? menu->searchBuf : ""); + if (mutt_get_field (_("Search for: "), buf, + sizeof (buf), M_CLEAR) != 0 || !buf[0]) + return (NULL); + mutt_str_replace (&menu->searchBuf, buf); + + if ((i = regcomp (&re, menu->searchBuf, REG_NOSUB | REG_EXTENDED | REG_WORDS + | mutt_which_case (menu->searchBuf))) != 0) + { + regerror (i, &re, buf, sizeof (buf)); + regfree (&re); + mutt_error ("%s", buf); + return (NULL); + } + + /* building list of sigs matching the regexp */ + for (i = 0; i < menu->max; i++) + { + /* search in every file if none is tagged */ + if (((ENTRY_DIR *) menu->data)[i].tagged || (menu->tagged == 0)) + { + snprintf (buf, sizeof (buf), "%s/%s", path, + ((ENTRY_DIR *) menu->data)[i].data->name); + read_sig_file (buf, &result, &re); + } + } + + regfree (&re); + if (!result) + mutt_error (_("Not found.")); + + return (result); +} + +/* returns the list of files in this directory */ +static SIG_DIR *sig_directory (char *path) +{ + DIR *dp; + struct dirent *de; + struct stat s; + SIG_DIR *first = NULL, *cur = NULL; + char file[_POSIX_PATH_MAX + SHORT_STRING]; + + if ((dp = opendir (path)) == NULL) + { + mutt_perror (path); + return (NULL); + } + + while ((de = readdir (dp))) + { + if ((de->d_name)[0] == '.') /* no hidden files */ + continue; + + snprintf (file, sizeof (file), "%s/%s", path, de->d_name); + if (lstat (file, &s) == -1) + continue; + + if ((!S_ISREG (s.st_mode)) && (!S_ISLNK (s.st_mode))) + continue; + + if (first == NULL) + cur = first = safe_calloc (1, sizeof (SIG_DIR)); + else + { + cur->next = safe_calloc (1, sizeof (SIG_DIR)); + cur = cur->next; + } + cur->name = safe_strdup (de->d_name); + cur->next = NULL; + } + closedir (dp); + return first; +} + +static void sig_dir_make_entry (char *s, size_t slen, MUTTMENU *menu, int num) +{ + ENTRY_DIR *table = (ENTRY_DIR *) menu->data; + + snprintf (s, slen, "%c %3d - %s", + table[num].tagged ? '*' : ' ', + num + 1, + table[num].data->name); +} + +static int sig_dir_tag (MUTTMENU *menu, int n, int m) +{ + ENTRY_DIR *cur = &((ENTRY_DIR *) menu->data)[n]; + int ot = cur->tagged; + + cur->tagged = m >= 0 ? m : !cur->tagged; + return cur->tagged - ot; + +} + +static int sig_dir_sort (const void *a, const void *b) +{ + ENTRY_DIR *pa = (ENTRY_DIR *) a; + ENTRY_DIR *pb = (ENTRY_DIR *) b; + + return (mutt_strcmp (pa->data->name, pb->data->name)); +} + +static int sig_dir_menu (char *path, char *msg_file) +{ + MUTTMENU *menu; + SIG_LIST *sigl; + LIST *result = NULL; + ENTRY_DIR *FileTable; + SIG_DIR *list, *files; + char buf[STRING], helpstr[SHORT_STRING], title[SHORT_STRING]; + int i, done = 0; + + if ((list = sig_directory (path)) == NULL) + return -1; + + snprintf (title, sizeof (title), "Signature directory : %s", path); + + menu = mutt_new_menu (); + menu->make_entry = sig_dir_make_entry; + menu->search = NULL; /* search within files with sig_search_filter() */ + menu->tag = sig_dir_tag; + menu->menu = MENU_SIG_DIR; + menu->title = title; + menu->help = mutt_compile_help (helpstr, sizeof (helpstr), + MENU_SIG_DIR, SigDirHelp); + + for (files = list; files; files = files->next) + menu->max++; + + menu->data = FileTable = (ENTRY_DIR *) safe_calloc (menu->max, + sizeof (ENTRY_DIR)); + + for (i = 0, files = list; files; i++, files = files->next) + FileTable[i].data = files; + + qsort (FileTable, menu->max, sizeof (ENTRY_DIR), sig_dir_sort); + + while (!done) + { + switch (mutt_menuLoop (menu)) + { + case OP_SIG_SEARCH: + sigl = sig_search_filter (menu, path); + + if (sigl) + { + if ((result = sig_list_menu (_("query results"), sigl)) != NULL) + { + append_signature (msg_file, result); + done = 1; + } + + MAYBE_REDRAW (menu->redraw); + free_sig_list (&sigl); + } + break; + + case OP_GENERIC_SELECT_ENTRY: + snprintf (buf, sizeof (buf), "%s/%s", path, + FileTable[menu->current].data->name); + sigl = NULL; + read_sig_file (buf, &sigl, NULL); + + if (sigl) + { + if ((result = sig_list_menu (buf, sigl)) != NULL) + { + append_signature (msg_file, result); + done = 1; + } + + MAYBE_REDRAW (menu->redraw); + free_sig_list (&sigl); + } + break; + + case OP_EXIT: + done = 1; + break; + } + } + + while (list) + { + safe_free ((void **)&list->name); + files = list; + list = list->next; + safe_free ((void **)&files); + } + safe_free ((void **)&FileTable); + mutt_menuDestroy (&menu); + return 0; +} + +void mutt_signature (char *msg_file) +{ + if (!SigDirectory) + { + mutt_error (_("variable 'signatures_directory' is unset")); + return; + } + + if (sig_dir_menu (SigDirectory, msg_file) == -1) + mutt_error (_("%s: no files in this directory"), SigDirectory); + else + set_option (OPTNEEDREDRAW); +} diff -pruN mutt-1.5.1.orig/PATCHES mutt-1.5.1/PATCHES --- mutt-1.5.1.orig/PATCHES Sun Feb 3 10:58:30 2002 +++ mutt-1.5.1/PATCHES Thu May 2 19:53:49 2002 @@ -1,0 +1 @@ +patch-1.5.1.cd.signatures_menu.2.1