1 diff -pruN2 mutt-1.3.27.orig/Makefile.am mutt-1.3.27/Makefile.am
2 --- mutt-1.3.27.orig/Makefile.am Fri Nov 9 01:18:28 2001
3 +++ mutt-1.3.27/Makefile.am Wed Jan 23 22:35:32 2002
4 @@ -25,5 +25,5 @@ mutt_SOURCES = $(BUILT_SOURCES) \
5 postpone.c query.c recvattach.c recvcmd.c \
6 rfc822.c rfc1524.c rfc2047.c rfc2231.c \
7 - score.c send.c sendlib.c signal.c sort.c \
8 + score.c send.c sendlib.c signal.c signature.c sort.c \
9 status.c system.c thread.c charset.c history.c lib.c \
10 muttlib.c editmsg.c utf8.c mbyte.c wcwidth.c \
11 diff -pruN2 mutt-1.3.27.orig/OPS mutt-1.3.27/OPS
12 --- mutt-1.3.27.orig/OPS Tue Sep 11 12:50:50 2001
13 +++ mutt-1.3.27/OPS Wed Jan 23 22:35:32 2002
14 @@ -37,4 +37,5 @@ OP_COMPOSE_POSTPONE_MESSAGE "save this m
15 OP_COMPOSE_RENAME_FILE "rename/move an attached file"
16 OP_COMPOSE_SEND_MESSAGE "send the message"
17 +OP_COMPOSE_SIG "choose a signature"
18 OP_COMPOSE_TOGGLE_DISPOSITION "toggle disposition between inline/attachment"
19 OP_COMPOSE_TOGGLE_UNLINK "toggle whether to delete file after sending it"
20 @@ -126,4 +127,5 @@ OP_NEXT_ENTRY "move to the next entry"
21 OP_NEXT_LINE "scroll down one line"
22 OP_NEXT_PAGE "move to the next page"
23 +OP_NEXT_SIG "move to the next signature"
24 OP_PAGER_BOTTOM "jump to the bottom of the message"
25 OP_PAGER_HIDE_QUOTED "toggle display of quoted text"
26 @@ -134,9 +136,11 @@ OP_PREV_ENTRY "move to the previous entr
27 OP_PREV_LINE "scroll up one line"
28 OP_PREV_PAGE "move to the previous page"
29 +OP_PREV_SIG "move to the previous signature"
30 OP_PRINT "print the current entry"
31 OP_PURGE_MESSAGE "delete the current entry, bypassing the trash folder"
32 OP_QUERY "query external program for addresses"
33 OP_QUERY_APPEND "append new query results to current results"
34 OP_QUIT "save changes to mailbox and quit"
35 +OP_RANDOM_SIG "pick a signature at random"
36 OP_RECALL_MESSAGE "recall a postponed message"
37 OP_REDRAW "clear and redraw the screen"
38 @@ -150,4 +154,5 @@ OP_SEARCH_OPPOSITE "search for next matc
39 OP_SEARCH_TOGGLE "toggle search pattern coloring"
40 OP_SHELL_ESCAPE "invoke a command in a subshell"
41 +OP_SIG_SEARCH "search signatures matching a pattern"
42 OP_SORT "sort messages"
43 OP_SORT_REVERSE "sort messages in reverse order"
44 diff -pruN2 mutt-1.3.27.orig/compose.c mutt-1.3.27/compose.c
45 --- mutt-1.3.27.orig/compose.c Mon Dec 3 11:17:57 2001
46 +++ mutt-1.3.27/compose.c Wed Jan 23 22:35:32 2002
47 @@ -1103,4 +1103,9 @@ int mutt_compose_menu (HEADER *msg, /*
50 + case OP_COMPOSE_SIG:
51 + mutt_signature(msg->content->filename);
52 + mutt_update_encoding (msg->content);
57 diff -pruN2 mutt-1.3.27.orig/doc/manual.sgml.head mutt-1.3.27/doc/manual.sgml.head
58 --- mutt-1.3.27.orig/doc/manual.xml.head Sat Jan 12 12:35:43 2002
59 +++ mutt-1.3.27/doc/manual.xml.head Wed Jan 23 22:35:32 2002
60 @@ -526,4 +526,5 @@ c edit-cc edit the
61 b edit-bcc edit the Bcc field
62 y send-message send the message
63 +ESC s signature-menu select a signature and append it to your mail
64 s edit-subject edit the Subject
65 f edit-fcc specify an ``Fcc'' mailbox
66 diff -pruN2 mutt-1.3.27.orig/functions.h mutt-1.3.27/functions.h
67 --- mutt-1.3.27.orig/functions.h Tue Sep 11 12:51:39 2001
68 +++ mutt-1.3.27/functions.h Wed Jan 23 22:35:32 2002
69 @@ -309,4 +309,5 @@ struct binding_t OpCompose[] = {
70 { "send-message", OP_COMPOSE_SEND_MESSAGE, "y" },
71 { "pipe-entry", OP_PIPE, "|" },
72 + { "signature-menu", OP_COMPOSE_SIG, "\033s" },
75 @@ -363,4 +364,17 @@ struct binding_t OpQuery[] = {
76 { "query", OP_QUERY, "Q" },
77 { "query-append", OP_QUERY_APPEND, "A" },
82 +struct binding_t OpSig[] = {
83 + { "next-sig", OP_NEXT_SIG, "j" },
84 + { "previous-sig", OP_PREV_SIG, "k" },
85 + { "random-sig", OP_RANDOM_SIG, "r" },
89 +struct binding_t OpSigDir[] = {
90 + { "search-sig", OP_SIG_SEARCH, "/" },
93 diff -pruN2 mutt-1.3.27.orig/globals.h mutt-1.3.27/globals.h
94 --- mutt-1.3.27.orig/globals.h Thu Jan 3 21:56:46 2002
95 +++ mutt-1.3.27/globals.h Wed Jan 23 22:35:32 2002
96 @@ -100,4 +100,5 @@ WHERE char *Sendmail;
98 WHERE char *Signature;
99 +WHERE char *SigDirectory;
100 WHERE char *SimpleSearch;
101 WHERE char *Spoolfile;
102 diff -pruN2 mutt-1.3.27.orig/init.h mutt-1.3.27/init.h
103 --- mutt-1.3.27.orig/init.h Mon Dec 10 11:09:03 2001
104 +++ mutt-1.3.27/init.h Wed Jan 23 22:35:32 2002
105 @@ -1954,4 +1954,12 @@ struct option_t MuttVars[] = {
108 + { "signatures_directory", DT_PATH, R_NONE, UL &SigDirectory, UL "" },
111 + ** Specifies the path where your signatures are located. In the files of
112 + ** this directory, the signatures are separated by blank lines and/or
113 + ** sig_dashes (``-- '').
114 + ** You can choose between these signatures from the compose menu.
116 { "simple_search", DT_STR, R_NONE, UL &SimpleSearch, UL "~f %s | ~s %s" },
118 diff -pruN2 mutt-1.3.27.orig/keymap.c mutt-1.3.27/keymap.c
119 --- mutt-1.3.27.orig/keymap.c Tue Oct 16 16:29:02 2001
120 +++ mutt-1.3.27/keymap.c Wed Jan 23 22:35:32 2002
121 @@ -50,4 +50,6 @@ struct mapping_t Menus[] = {
123 { "query", MENU_QUERY },
124 + { "signature", MENU_SIG },
125 + { "sig_directory", MENU_SIG_DIR },
126 { "generic", MENU_GENERIC },
128 @@ -528,4 +530,6 @@ void km_init (void)
129 create_bindings (OpQuery, MENU_QUERY);
130 create_bindings (OpAlias, MENU_ALIAS);
131 + create_bindings (OpSig, MENU_SIG);
132 + create_bindings (OpSigDir, MENU_SIG_DIR);
135 @@ -619,4 +623,7 @@ void km_init (void)
136 km_bindkey ("<enter>", MENU_COMPOSE, OP_VIEW_ATTACH);
138 + km_bindkey ("<up>", MENU_SIG, OP_PREV_SIG);
139 + km_bindkey ("<down>", MENU_SIG, OP_NEXT_SIG);
141 /* edit-to (default "t") hides generic tag-entry in Compose menu
142 This will bind tag-entry to "T" in the Compose menu */
143 @@ -739,4 +746,8 @@ struct binding_t *km_get_table (int menu
152 diff -pruN2 mutt-1.3.27.orig/keymap.h mutt-1.3.27/keymap.h
153 --- mutt-1.3.27.orig/keymap.h Tue Sep 11 12:50:12 2001
154 +++ mutt-1.3.27/keymap.h Wed Jan 23 22:35:32 2002
155 @@ -60,4 +60,6 @@ enum
162 @@ -102,4 +104,6 @@ extern struct binding_t OpEditor[];
163 extern struct binding_t OpQuery[];
164 extern struct binding_t OpAlias[];
165 +extern struct binding_t OpSig[];
166 +extern struct binding_t OpSigDir[];
169 diff -pruN2 mutt-1.3.27.orig/protos.h mutt-1.3.27/protos.h
170 --- mutt-1.3.27.orig/protos.h Wed Jan 16 21:43:58 2002
171 +++ mutt-1.3.27/protos.h Wed Jan 23 22:35:32 2002
172 @@ -225,4 +225,5 @@ void mutt_shell_escape (void);
173 void mutt_show_error (void);
174 void mutt_signal_init (void);
175 +void mutt_signature (char *);
176 void mutt_stamp_attachment (BODY *a);
177 void mutt_tabs_to_spaces (char *);
178 diff -pruN2 mutt-1.3.27.orig/signature.c mutt-1.3.27/signature.c
179 --- mutt-1.3.27.orig/signature.c Thu Jan 1 01:00:00 1970
180 +++ mutt-1.3.27/signature.c Wed Jan 23 22:35:32 2002
183 + * Copyright (C) 2001 Cedric Duval <cedricduval@free.fr>
185 + * This program is free software; you can redistribute it and/or modify
186 + * it under the terms of the GNU General Public License as published by
187 + * the Free Software Foundation; either version 2 of the License, or
188 + * (at your option) any later version.
190 + * This program is distributed in the hope that it will be useful,
191 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
192 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
193 + * GNU General Public License for more details.
195 + * You should have received a copy of the GNU General Public License
196 + * along with this program; if not, write to the Free Software
197 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
201 +# include "config.h"
205 +#include "mutt_menu.h"
206 +#include "mapping.h"
207 +#include "mutt_curses.h"
213 +#include <sys/stat.h>
215 +#define SIG_DISPLAY_LINES 4
216 +#define SEPARATOR(x) ((*x == '\n') || (mutt_strcmp (x, "-- \n") == 0))
217 +#define SIG_ADD_LINE(x,y) mutt_add_list (x, strtok (y, "\n"))
219 +typedef struct sig_list
221 + struct sig_list *next;
225 +typedef struct sig_dir
227 + struct sig_dir *next;
231 +typedef LIST * ENTRY;
233 +typedef struct entry_dir
239 +static struct mapping_t SigHelp[] = {
240 + { N_("Exit"), OP_EXIT },
241 + { N_("Search"), OP_SEARCH },
242 + { N_("Random"), OP_RANDOM_SIG },
243 + { N_("Help"), OP_HELP },
247 +static struct mapping_t SigDirHelp[] = {
248 + { N_("Exit"), OP_EXIT },
249 + { N_("Search signature"), OP_SIG_SEARCH },
250 + { N_("Help"), OP_HELP },
254 +void menu_next_entry (MUTTMENU *menu);
255 +void menu_prev_entry (MUTTMENU *menu);
258 +static int sig_match (LIST *s, regex_t *re)
262 + if (regexec (re, s->data, (size_t)0, NULL, (int)0) == 0)
269 +static void read_sig_file (char *name, SIG_LIST **begin, regex_t *re)
274 + SIG_LIST *first, *cur;
277 + if (!(fp = safe_fopen (name, "r")))
279 + mutt_error (_("Can't open signature file %s"), name);
283 + for (first = *begin; first && first->next; first = first->next, append++)
284 + ; /* append results to an existing list */
287 + while (fgets (buf, sizeof (buf), fp))
289 + if (buf[0] && !SEPARATOR (buf))
291 + sig = SIG_ADD_LINE (NULL, buf);
293 + while (fgets (buf, sizeof (buf), fp) && buf[0] && !SEPARATOR (buf))
294 + SIG_ADD_LINE (sig, buf);
296 + if (re && !sig_match (sig, re))
297 + mutt_free_list (&sig); /* previous sig didn't match the regexp */
300 + /* add signature */
302 + first = cur = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST));
305 + cur->next = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST));
321 +static void sig_make_entry (char *s, size_t slen, MUTTMENU *menu, int num)
323 + ENTRY *table = (ENTRY *) menu->data;
325 + snprintf (s, slen, "%3d %s",
330 +static int sig_menu_search (MUTTMENU *menu, regex_t *re, int num)
332 + return (sig_match (((ENTRY *)menu->data)[num], re) ? 0 : REG_NOMATCH);
335 +static void draw_sig_frame (LIST *s)
339 + for (i = 1; i <= SIG_DISPLAY_LINES; i++)
343 + mvaddstr (i, 0, s->data);
352 + SETCOLOR (MT_COLOR_STATUS);
353 + mvaddstr (SIG_DISPLAY_LINES + 1, 0, _("-- Signature"));
354 + SETCOLOR (MT_COLOR_STATUS);
360 +static void free_sig_list (SIG_LIST **sigs)
367 + *sigs = (*sigs)->next;
368 + mutt_free_list (&cur->sig);
369 + safe_free ((void **)&cur);
373 +static void append_signature (char *msg_file, LIST *s)
377 + if ((fp = safe_fopen (msg_file, "a")) == 0)
378 + mutt_perror (msg_file);
381 + if (option (OPTSIGDASHES))
382 + fputs ("\n-- \n", fp);
384 + for (; s; s = s->next)
385 + fprintf (fp, "%s\n", s->data);
387 + mutt_message (_("Signature appended to your mail"));
392 +static LIST *sig_list_menu (char *file, SIG_LIST *list)
394 + LIST *result = NULL;
398 + char helpstr[SHORT_STRING], title[SHORT_STRING];
401 + snprintf (title, sizeof (title), _("Signature : %s"), file);
403 + menu = mutt_new_menu (MENU_SIG);
404 + menu->make_entry = sig_make_entry;
406 + menu->search = sig_menu_search;
407 + menu->title = title;
408 + menu->help = mutt_compile_help (helpstr, sizeof (helpstr),
409 + MENU_SIG, SigHelp);
410 + menu->offset = SIG_DISPLAY_LINES + 2;
411 + menu->pagelen = LINES - SIG_DISPLAY_LINES - 4;
413 + for (sigl = list; sigl; sigl = sigl->next)
416 + menu->data = SigTable = (ENTRY *) safe_calloc (menu->max, sizeof (ENTRY));
418 + for (i = 0, sigl = list; sigl; i++, sigl = sigl->next)
419 + SigTable[i] = sigl->sig;
423 + switch (mutt_menuLoop (menu))
425 + case OP_GENERIC_SELECT_ENTRY:
426 + result = SigTable[menu->current];
431 + menu_prev_entry (menu);
432 + draw_sig_frame (SigTable[menu->current]);
436 + menu_next_entry (menu);
437 + draw_sig_frame (SigTable[menu->current]);
441 + menu->offset = SIG_DISPLAY_LINES + 2;
442 + menu->pagelen = LINES - SIG_DISPLAY_LINES - 4;
443 + draw_sig_frame (SigTable[menu->current]);
446 + case OP_RANDOM_SIG:
447 + menu->current = LRAND () % menu->max;
448 + draw_sig_frame (SigTable[menu->current]);
449 + menu->redraw |= REDRAW_MOTION;
458 + mutt_menuDestroy (&menu);
459 + safe_free ((void **)&SigTable);
463 +extern char* SearchBuffers[MENU_MAX];
465 +static SIG_LIST *sig_search_filter (MUTTMENU *menu, char *path)
469 + SIG_LIST *result = NULL;
471 + char* searchBuf = menu->menu >= 0 && menu->menu < MENU_MAX ?
472 + SearchBuffers[menu->menu] : NULL;
474 + snprintf (buf, sizeof(buf), searchBuf ? searchBuf : "");
475 + if (mutt_get_field (_("Search for: "), buf,
476 + sizeof (buf), MUTT_CLEAR) != 0 || !buf[0])
478 + if (menu->menu >= 0 && menu->menu < MENU_MAX)
480 + mutt_str_replace (&SearchBuffers[menu->menu], buf);
481 + searchBuf = SearchBuffers[menu->menu];
484 + if ((i = regcomp (&re, searchBuf, REG_NOSUB | REG_EXTENDED | REG_WORDS
485 + | mutt_which_case (searchBuf))) != 0)
487 + regerror (i, &re, buf, sizeof (buf));
489 + mutt_error ("%s", buf);
493 + /* building list of sigs matching the regexp */
494 + for (i = 0; i < menu->max; i++)
496 + /* search in every file if none is tagged */
497 + if (((ENTRY_DIR *) menu->data)[i].tagged || (menu->tagged == 0))
499 + snprintf (buf, sizeof (buf), "%s/%s", path,
500 + ((ENTRY_DIR *) menu->data)[i].data->name);
501 + read_sig_file (buf, &result, &re);
507 + mutt_error (_("Not found."));
512 +/* returns the list of files in this directory */
513 +static SIG_DIR *sig_directory (char *path)
518 + SIG_DIR *first = NULL, *cur = NULL;
519 + char file[_POSIX_PATH_MAX + SHORT_STRING];
521 + if ((dp = opendir (path)) == NULL)
523 + mutt_perror (path);
527 + while ((de = readdir (dp)))
529 + if ((de->d_name)[0] == '.') /* no hidden files */
532 + snprintf (file, sizeof (file), "%s/%s", path, de->d_name);
533 + if (lstat (file, &s) == -1)
536 + if ((!S_ISREG (s.st_mode)) && (!S_ISLNK (s.st_mode)))
540 + cur = first = safe_calloc (1, sizeof (SIG_DIR));
543 + cur->next = safe_calloc (1, sizeof (SIG_DIR));
546 + cur->name = safe_strdup (de->d_name);
553 +static void sig_dir_make_entry (char *s, size_t slen, MUTTMENU *menu, int num)
555 + ENTRY_DIR *table = (ENTRY_DIR *) menu->data;
557 + snprintf (s, slen, "%c %3d - %s",
558 + table[num].tagged ? '*' : ' ',
560 + table[num].data->name);
563 +static int sig_dir_tag (MUTTMENU *menu, int n, int m)
565 + ENTRY_DIR *cur = &((ENTRY_DIR *) menu->data)[n];
566 + int ot = cur->tagged;
568 + cur->tagged = m >= 0 ? m : !cur->tagged;
569 + return cur->tagged - ot;
573 +static int sig_dir_sort (const void *a, const void *b)
575 + ENTRY_DIR *pa = (ENTRY_DIR *) a;
576 + ENTRY_DIR *pb = (ENTRY_DIR *) b;
578 + return (mutt_strcmp (pa->data->name, pb->data->name));
581 +static int sig_dir_menu (char *path, char *msg_file)
585 + LIST *result = NULL;
586 + ENTRY_DIR *FileTable;
587 + SIG_DIR *list, *files;
588 + char buf[STRING], helpstr[SHORT_STRING], title[SHORT_STRING];
591 + if ((list = sig_directory (path)) == NULL)
594 + snprintf (title, sizeof (title), "Signature directory : %s", path);
596 + menu = mutt_new_menu (MENU_SIG_DIR);
597 + menu->make_entry = sig_dir_make_entry;
598 + menu->search = NULL; /* search within files with sig_search_filter() */
599 + menu->tag = sig_dir_tag;
600 + menu->title = title;
601 + menu->help = mutt_compile_help (helpstr, sizeof (helpstr),
602 + MENU_SIG_DIR, SigDirHelp);
604 + for (files = list; files; files = files->next)
607 + menu->data = FileTable = (ENTRY_DIR *) safe_calloc (menu->max,
608 + sizeof (ENTRY_DIR));
610 + for (i = 0, files = list; files; i++, files = files->next)
611 + FileTable[i].data = files;
613 + qsort (FileTable, menu->max, sizeof (ENTRY_DIR), sig_dir_sort);
617 + switch (mutt_menuLoop (menu))
619 + case OP_SIG_SEARCH:
620 + sigl = sig_search_filter (menu, path);
624 + if ((result = sig_list_menu (_("query results"), sigl)) != NULL)
626 + append_signature (msg_file, result);
630 + free_sig_list (&sigl);
634 + case OP_GENERIC_SELECT_ENTRY:
635 + snprintf (buf, sizeof (buf), "%s/%s", path,
636 + FileTable[menu->current].data->name);
638 + read_sig_file (buf, &sigl, NULL);
642 + if ((result = sig_list_menu (buf, sigl)) != NULL)
644 + append_signature (msg_file, result);
648 + free_sig_list (&sigl);
660 + safe_free ((void **)&list->name);
663 + safe_free ((void **)&files);
665 + safe_free ((void **)&FileTable);
666 + mutt_menuDestroy (&menu);
670 +void mutt_signature (char *msg_file)
674 + mutt_error (_("variable 'signatures_directory' is unset"));
678 + if (sig_dir_menu (SigDirectory, msg_file) == -1)
679 + mutt_error (_("%s: no files in this directory"), SigDirectory);
681 diff -pruN mutt-1.3.27.orig/PATCHES mutt-1.3.27/PATCHES
682 --- mutt-1.3.27.orig/PATCHES Mon Nov 26 20:16:52 2001
683 +++ mutt-1.3.27/PATCHES Thu Dec 6 16:27:55 2001
685 +patch-1.3.27.cd.signatures_menu.2.1
686 diff --git a/menu.c b/menu.c
690 mutt_error _("No entries.");
693 -static void menu_next_entry (MUTTMENU *menu)
694 +void menu_next_entry (MUTTMENU *menu)
696 if (menu->current < menu->max - 1)
699 mutt_error _("You are on the last entry.");
702 -static void menu_prev_entry (MUTTMENU *menu)
703 +void menu_prev_entry (MUTTMENU *menu)