]> git.pld-linux.org Git - packages/mutt.git/blame - mutt-cd.signatures_menu.patch
up to 1.6.1
[packages/mutt.git] / mutt-cd.signatures_menu.patch
CommitLineData
68667aa0 1diff -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 \
11diff -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 "really 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"
44diff -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,10 @@ int mutt_compose_menu (HEADER *msg, /*
48 break;
49
50+ case OP_COMPOSE_SIG:
51+ mutt_signature(msg->content->filename);
52+ MAYBE_REDRAW (menu->redraw);
53+ mutt_update_encoding (msg->content);
54+ break;
55+
56 case OP_PIPE:
57 case OP_FILTER:
58diff -pruN2 mutt-1.3.27.orig/doc/manual.sgml.head mutt-1.3.27/doc/manual.sgml.head
68eeb855 59--- mutt-1.3.27.orig/doc/manual.xml.head Sat Jan 12 12:35:43 2002
60+++ mutt-1.3.27/doc/manual.xml.head Wed Jan 23 22:35:32 2002
68667aa0 61@@ -526,4 +526,5 @@ c edit-cc edit the
62 b edit-bcc edit the Bcc field
63 y send-message send the message
64+ESC s signature-menu select a signature and append it to your mail
65 s edit-subject edit the Subject
66 f edit-fcc specify an ``Fcc'' mailbox
67diff -pruN2 mutt-1.3.27.orig/functions.h mutt-1.3.27/functions.h
68--- mutt-1.3.27.orig/functions.h Tue Sep 11 12:51:39 2001
69+++ mutt-1.3.27/functions.h Wed Jan 23 22:35:32 2002
70@@ -309,4 +309,5 @@ struct binding_t OpCompose[] = {
71 { "send-message", OP_COMPOSE_SEND_MESSAGE, "y" },
72 { "pipe-entry", OP_PIPE, "|" },
73+ { "signature-menu", OP_COMPOSE_SIG, "\033s" },
74
75 #ifdef HAVE_PGP
76@@ -363,4 +364,17 @@ struct binding_t OpQuery[] = {
77 { "query", OP_QUERY, "Q" },
78 { "query-append", OP_QUERY_APPEND, "A" },
79+ { NULL, 0, NULL }
80+};
81+
82+/* Signature Menu */
83+struct binding_t OpSig[] = {
84+ { "next-sig", OP_NEXT_SIG, "j" },
85+ { "previous-sig", OP_PREV_SIG, "k" },
86+ { "random-sig", OP_RANDOM_SIG, "r" },
87+ { NULL, 0, NULL }
88+};
89+
90+struct binding_t OpSigDir[] = {
91+ { "search-sig", OP_SIG_SEARCH, "/" },
92 { NULL, 0, NULL }
93 };
94diff -pruN2 mutt-1.3.27.orig/globals.h mutt-1.3.27/globals.h
95--- mutt-1.3.27.orig/globals.h Thu Jan 3 21:56:46 2002
96+++ mutt-1.3.27/globals.h Wed Jan 23 22:35:32 2002
97@@ -100,4 +100,5 @@ WHERE char *Sendmail;
98 WHERE char *Shell;
99 WHERE char *Signature;
100+WHERE char *SigDirectory;
101 WHERE char *SimpleSearch;
102 WHERE char *Spoolfile;
103diff -pruN2 mutt-1.3.27.orig/init.h mutt-1.3.27/init.h
104--- mutt-1.3.27.orig/init.h Mon Dec 10 11:09:03 2001
105+++ mutt-1.3.27/init.h Wed Jan 23 22:35:32 2002
106@@ -1954,4 +1954,12 @@ struct option_t MuttVars[] = {
107 ** its stdout.
108 */
109+ { "signatures_directory", DT_PATH, R_NONE, UL &SigDirectory, UL "" },
110+ /*
111+ ** .pp
112+ ** Specifies the path where your signatures are located. In the files of
113+ ** this directory, the signatures are separated by blank lines and/or
114+ ** sig_dashes (``-- '').
115+ ** You can choose between these signatures from the compose menu.
116+ */
117 { "simple_search", DT_STR, R_NONE, UL &SimpleSearch, UL "~f %s | ~s %s" },
118 /*
119diff -pruN2 mutt-1.3.27.orig/keymap.c mutt-1.3.27/keymap.c
120--- mutt-1.3.27.orig/keymap.c Tue Oct 16 16:29:02 2001
121+++ mutt-1.3.27/keymap.c Wed Jan 23 22:35:32 2002
122@@ -50,4 +50,6 @@ struct mapping_t Menus[] = {
123
124 { "query", MENU_QUERY },
125+ { "signature", MENU_SIG },
126+ { "sig_directory", MENU_SIG_DIR },
127 { "generic", MENU_GENERIC },
128 { NULL, 0 }
129@@ -528,4 +530,6 @@ void km_init (void)
130 create_bindings (OpQuery, MENU_QUERY);
131 create_bindings (OpAlias, MENU_ALIAS);
132+ create_bindings (OpSig, MENU_SIG);
133+ create_bindings (OpSigDir, MENU_SIG_DIR);
134
135
136@@ -619,4 +623,7 @@ void km_init (void)
137 km_bindkey ("<enter>", MENU_COMPOSE, OP_VIEW_ATTACH);
138
139+ km_bindkey ("<up>", MENU_SIG, OP_PREV_SIG);
140+ km_bindkey ("<down>", MENU_SIG, OP_NEXT_SIG);
141+
142 /* edit-to (default "t") hides generic tag-entry in Compose menu
143 This will bind tag-entry to "T" in the Compose menu */
144@@ -739,4 +746,8 @@ struct binding_t *km_get_table (int menu
145 case MENU_QUERY:
146 return OpQuery;
147+ case MENU_SIG:
148+ return OpSig;
149+ case MENU_SIG_DIR:
150+ return OpSigDir;
151
152
153diff -pruN2 mutt-1.3.27.orig/keymap.h mutt-1.3.27/keymap.h
154--- mutt-1.3.27.orig/keymap.h Tue Sep 11 12:50:12 2001
155+++ mutt-1.3.27/keymap.h Wed Jan 23 22:35:32 2002
156@@ -60,4 +60,6 @@ enum
157 MENU_POST,
158 MENU_QUERY,
159+ MENU_SIG,
160+ MENU_SIG_DIR,
161
162
163@@ -102,4 +104,6 @@ extern struct binding_t OpEditor[];
164 extern struct binding_t OpQuery[];
165 extern struct binding_t OpAlias[];
166+extern struct binding_t OpSig[];
167+extern struct binding_t OpSigDir[];
168
169 #ifdef HAVE_PGP
170diff -pruN2 mutt-1.3.27.orig/protos.h mutt-1.3.27/protos.h
171--- mutt-1.3.27.orig/protos.h Wed Jan 16 21:43:58 2002
172+++ mutt-1.3.27/protos.h Wed Jan 23 22:35:32 2002
173@@ -225,4 +225,5 @@ void mutt_shell_escape (void);
174 void mutt_show_error (void);
175 void mutt_signal_init (void);
176+void mutt_signature (char *);
177 void mutt_stamp_attachment (BODY *a);
178 void mutt_tabs_to_spaces (char *);
179diff -pruN2 mutt-1.3.27.orig/signature.c mutt-1.3.27/signature.c
180--- mutt-1.3.27.orig/signature.c Thu Jan 1 01:00:00 1970
181+++ mutt-1.3.27/signature.c Wed Jan 23 22:35:32 2002
c59ea3a3 182@@ -0,0 +1,504 @@
68667aa0 183+/*
184+ * Copyright (C) 2001 Cedric Duval <cedricduval@free.fr>
185+ *
186+ * This program is free software; you can redistribute it and/or modify
187+ * it under the terms of the GNU General Public License as published by
188+ * the Free Software Foundation; either version 2 of the License, or
189+ * (at your option) any later version.
190+ *
191+ * This program is distributed in the hope that it will be useful,
192+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
193+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
194+ * GNU General Public License for more details.
195+ *
196+ * You should have received a copy of the GNU General Public License
197+ * along with this program; if not, write to the Free Software
198+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
199+ */
200+
68eeb855 201+#if HAVE_CONFIG_H
202+# include "config.h"
203+#endif
204+
68667aa0 205+#include "mutt.h"
206+#include "mutt_menu.h"
207+#include "mapping.h"
208+#include "mutt_curses.h"
209+
210+#include <stdio.h>
211+#include <string.h>
212+#include <stdlib.h>
213+#include <dirent.h>
214+#include <sys/stat.h>
215+
216+#define SIG_DISPLAY_LINES 4
217+#define SEPARATOR(x) ((*x == '\n') || (mutt_strcmp (x, "-- \n") == 0))
218+#define SIG_ADD_LINE(x,y) mutt_add_list (x, strtok (y, "\n"))
219+
220+typedef struct sig_list
221+{
222+ struct sig_list *next;
223+ LIST *sig;
224+} SIG_LIST;
225+
226+typedef struct sig_dir
227+{
228+ struct sig_dir *next;
229+ char *name;
230+} SIG_DIR;
231+
232+typedef LIST * ENTRY;
233+
234+typedef struct entry_dir
235+{
236+ int tagged;
237+ SIG_DIR *data;
238+} ENTRY_DIR;
239+
240+static struct mapping_t SigHelp[] = {
241+ { N_("Exit"), OP_EXIT },
242+ { N_("Search"), OP_SEARCH },
243+ { N_("Random"), OP_RANDOM_SIG },
244+ { N_("Help"), OP_HELP },
245+ { NULL }
246+};
247+
248+static struct mapping_t SigDirHelp[] = {
249+ { N_("Exit"), OP_EXIT },
250+ { N_("Search signature"), OP_SIG_SEARCH },
251+ { N_("Help"), OP_HELP },
252+ { NULL }
253+};
254+
255+void menu_next_entry (MUTTMENU *menu);
256+void menu_prev_entry (MUTTMENU *menu);
257+
258+
259+static int sig_match (LIST *s, regex_t *re)
260+{
261+ while (s)
262+ {
263+ if (regexec (re, s->data, (size_t)0, NULL, (int)0) == 0)
264+ return 1;
265+ s = s->next;
266+ }
267+ return 0;
268+}
269+
270+static void read_sig_file (char *name, SIG_LIST **begin, regex_t *re)
271+{
272+ FILE *fp;
273+ char buf[STRING];
274+ LIST *sig = NULL;
275+ SIG_LIST *first, *cur;
276+ int append = 0;
277+
278+ if (!(fp = safe_fopen (name, "r")))
279+ {
280+ mutt_error (_("Can't open signature file %s"), name);
281+ return;
282+ }
283+
284+ for (first = *begin; first && first->next; first = first->next, append++)
285+ ; /* append results to an existing list */
286+ cur = first;
287+
288+ while (fgets (buf, sizeof (buf), fp))
289+ {
290+ if (buf[0] && !SEPARATOR (buf))
291+ {
292+ sig = SIG_ADD_LINE (NULL, buf);
293+
294+ while (fgets (buf, sizeof (buf), fp) && buf[0] && !SEPARATOR (buf))
295+ SIG_ADD_LINE (sig, buf);
296+
297+ if (re && !sig_match (sig, re))
298+ mutt_free_list (&sig); /* previous sig didn't match the regexp */
299+ else
300+ {
301+ /* add signature */
302+ if (first == NULL)
303+ first = cur = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST));
304+ else
305+ {
306+ cur->next = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST));
307+ cur = cur->next;
308+ }
309+
310+ cur->sig = sig;
311+ cur->next = NULL;
312+ }
313+ }
314+ }
315+
316+ if (!append)
317+ *begin = first;
318+
319+ safe_fclose (&fp);
320+}
321+
322+static void sig_make_entry (char *s, size_t slen, MUTTMENU *menu, int num)
323+{
324+ ENTRY *table = (ENTRY *) menu->data;
325+
326+ snprintf (s, slen, "%3d %s",
327+ num + 1,
328+ table[num]->data);
329+}
330+
331+static int sig_menu_search (MUTTMENU *menu, regex_t *re, int num)
332+{
333+ return (sig_match (((ENTRY *)menu->data)[num], re) ? 0 : REG_NOMATCH);
334+}
335+
336+static void draw_sig_frame (LIST *s)
337+{
338+ int i;
339+
340+ for (i = 1; i <= SIG_DISPLAY_LINES; i++)
341+ {
342+ if (s)
343+ {
344+ mvaddstr (i, 0, s->data);
345+ s = s->next;
346+ }
347+ else
348+ move (i, 0);
349+
350+ clrtoeol ();
351+ }
352+
353+ SETCOLOR (MT_COLOR_STATUS);
354+ mvaddstr (SIG_DISPLAY_LINES + 1, 0, _("-- Signature"));
c59ea3a3 355+ SETCOLOR (MT_COLOR_STATUS);
68667aa0 356+ clrtoeol ();
357+
c59ea3a3 358+ NORMAL_COLOR;
68667aa0 359+}
360+
361+static void free_sig_list (SIG_LIST **sigs)
362+{
363+ SIG_LIST *cur;
364+
365+ while (*sigs)
366+ {
367+ cur = *sigs;
368+ *sigs = (*sigs)->next;
369+ mutt_free_list (&cur->sig);
370+ safe_free ((void **)&cur);
371+ }
372+}
373+
374+static void append_signature (char *msg_file, LIST *s)
375+{
376+ FILE *fp;
377+
378+ if ((fp = safe_fopen (msg_file, "a")) == 0)
379+ mutt_perror (msg_file);
380+ else
381+ {
382+ if (option (OPTSIGDASHES))
383+ fputs ("\n-- \n", fp);
384+
385+ for (; s; s = s->next)
386+ fprintf (fp, "%s\n", s->data);
387+
388+ mutt_message (_("Signature appended to your mail"));
389+ safe_fclose (&fp);
390+ }
391+}
392+
393+static LIST *sig_list_menu (char *file, SIG_LIST *list)
394+{
395+ LIST *result = NULL;
396+ SIG_LIST *sigl;
397+ MUTTMENU *menu;
398+ ENTRY *SigTable;
399+ char helpstr[SHORT_STRING], title[SHORT_STRING];
400+ int i, done = 0;
401+
402+ snprintf (title, sizeof (title), _("Signature : %s"), file);
403+
b3471c65 404+ menu = mutt_new_menu (MENU_SIG);
68667aa0 405+ menu->make_entry = sig_make_entry;
406+ menu->tag = NULL;
407+ menu->search = sig_menu_search;
68667aa0 408+ menu->title = title;
409+ menu->help = mutt_compile_help (helpstr, sizeof (helpstr),
410+ MENU_SIG, SigHelp);
411+ menu->offset = SIG_DISPLAY_LINES + 2;
412+ menu->pagelen = LINES - SIG_DISPLAY_LINES - 4;
413+
414+ for (sigl = list; sigl; sigl = sigl->next)
415+ menu->max++;
416+
417+ menu->data = SigTable = (ENTRY *) safe_calloc (menu->max, sizeof (ENTRY));
418+
419+ for (i = 0, sigl = list; sigl; i++, sigl = sigl->next)
420+ SigTable[i] = sigl->sig;
421+
422+ while (!done)
423+ {
424+ switch (mutt_menuLoop (menu))
425+ {
426+ case OP_GENERIC_SELECT_ENTRY:
427+ result = SigTable[menu->current];
428+ done = 1;
429+ break;
430+
431+ case OP_PREV_SIG:
432+ menu_prev_entry (menu);
433+ draw_sig_frame (SigTable[menu->current]);
434+ break;
435+
436+ case OP_NEXT_SIG:
437+ menu_next_entry (menu);
438+ draw_sig_frame (SigTable[menu->current]);
439+ break;
440+
441+ case OP_REDRAW:
442+ menu->offset = SIG_DISPLAY_LINES + 2;
443+ menu->pagelen = LINES - SIG_DISPLAY_LINES - 4;
444+ draw_sig_frame (SigTable[menu->current]);
445+ break;
446+
447+ case OP_RANDOM_SIG:
448+ menu->current = LRAND () % menu->max;
449+ draw_sig_frame (SigTable[menu->current]);
450+ menu->redraw |= REDRAW_MOTION;
451+ break;
452+
453+ case OP_EXIT:
454+ set_option (OPTNEEDREDRAW);
455+ done = 1;
456+ break;
457+ }
458+ }
459+
460+ mutt_menuDestroy (&menu);
461+ safe_free ((void **)&SigTable);
462+ return result;
463+}
464+
b3471c65
JR
465+extern char* SearchBuffers[MENU_MAX];
466+
68667aa0 467+static SIG_LIST *sig_search_filter (MUTTMENU *menu, char *path)
468+{
469+ regex_t re;
470+ char buf[STRING];
471+ SIG_LIST *result = NULL;
472+ int i;
eb755509
JR
473+ char* searchBuf = menu->menu >= 0 && menu->menu < MENU_MAX ?
474+ SearchBuffers[menu->menu] : NULL;
68667aa0 475+
eb755509 476+ snprintf (buf, sizeof(buf), searchBuf ? searchBuf : "");
68667aa0 477+ if (mutt_get_field (_("Search for: "), buf,
478+ sizeof (buf), M_CLEAR) != 0 || !buf[0])
479+ return (NULL);
eb755509
JR
480+ if (menu->menu >= 0 && menu->menu < MENU_MAX)
481+ {
482+ mutt_str_replace (&SearchBuffers[menu->menu], buf);
483+ searchBuf = SearchBuffers[menu->menu];
484+ }
68667aa0 485+
eb755509
JR
486+ if ((i = regcomp (&re, searchBuf, REG_NOSUB | REG_EXTENDED | REG_WORDS
487+ | mutt_which_case (searchBuf))) != 0)
68667aa0 488+ {
489+ regerror (i, &re, buf, sizeof (buf));
490+ regfree (&re);
491+ mutt_error ("%s", buf);
492+ return (NULL);
493+ }
494+
495+ /* building list of sigs matching the regexp */
496+ for (i = 0; i < menu->max; i++)
497+ {
498+ /* search in every file if none is tagged */
499+ if (((ENTRY_DIR *) menu->data)[i].tagged || (menu->tagged == 0))
500+ {
501+ snprintf (buf, sizeof (buf), "%s/%s", path,
502+ ((ENTRY_DIR *) menu->data)[i].data->name);
503+ read_sig_file (buf, &result, &re);
504+ }
505+ }
506+
507+ regfree (&re);
508+ if (!result)
509+ mutt_error (_("Not found."));
510+
511+ return (result);
512+}
513+
514+/* returns the list of files in this directory */
515+static SIG_DIR *sig_directory (char *path)
516+{
517+ DIR *dp;
518+ struct dirent *de;
519+ struct stat s;
520+ SIG_DIR *first = NULL, *cur = NULL;
521+ char file[_POSIX_PATH_MAX + SHORT_STRING];
522+
523+ if ((dp = opendir (path)) == NULL)
524+ {
525+ mutt_perror (path);
526+ return (NULL);
527+ }
528+
529+ while ((de = readdir (dp)))
530+ {
531+ if ((de->d_name)[0] == '.') /* no hidden files */
532+ continue;
533+
534+ snprintf (file, sizeof (file), "%s/%s", path, de->d_name);
535+ if (lstat (file, &s) == -1)
536+ continue;
537+
538+ if ((!S_ISREG (s.st_mode)) && (!S_ISLNK (s.st_mode)))
539+ continue;
540+
541+ if (first == NULL)
542+ cur = first = safe_calloc (1, sizeof (SIG_DIR));
543+ else
544+ {
545+ cur->next = safe_calloc (1, sizeof (SIG_DIR));
546+ cur = cur->next;
547+ }
548+ cur->name = safe_strdup (de->d_name);
549+ cur->next = NULL;
550+ }
551+ closedir (dp);
552+ return first;
553+}
554+
555+static void sig_dir_make_entry (char *s, size_t slen, MUTTMENU *menu, int num)
556+{
557+ ENTRY_DIR *table = (ENTRY_DIR *) menu->data;
558+
559+ snprintf (s, slen, "%c %3d - %s",
560+ table[num].tagged ? '*' : ' ',
561+ num + 1,
562+ table[num].data->name);
563+}
564+
565+static int sig_dir_tag (MUTTMENU *menu, int n, int m)
566+{
567+ ENTRY_DIR *cur = &((ENTRY_DIR *) menu->data)[n];
568+ int ot = cur->tagged;
569+
570+ cur->tagged = m >= 0 ? m : !cur->tagged;
571+ return cur->tagged - ot;
572+
573+}
574+
575+static int sig_dir_sort (const void *a, const void *b)
576+{
577+ ENTRY_DIR *pa = (ENTRY_DIR *) a;
578+ ENTRY_DIR *pb = (ENTRY_DIR *) b;
579+
580+ return (mutt_strcmp (pa->data->name, pb->data->name));
581+}
582+
583+static int sig_dir_menu (char *path, char *msg_file)
584+{
585+ MUTTMENU *menu;
586+ SIG_LIST *sigl;
587+ LIST *result = NULL;
588+ ENTRY_DIR *FileTable;
589+ SIG_DIR *list, *files;
590+ char buf[STRING], helpstr[SHORT_STRING], title[SHORT_STRING];
591+ int i, done = 0;
592+
593+ if ((list = sig_directory (path)) == NULL)
594+ return -1;
595+
596+ snprintf (title, sizeof (title), "Signature directory : %s", path);
597+
b3471c65 598+ menu = mutt_new_menu (MENU_SIG_DIR);
68667aa0 599+ menu->make_entry = sig_dir_make_entry;
600+ menu->search = NULL; /* search within files with sig_search_filter() */
601+ menu->tag = sig_dir_tag;
68667aa0 602+ menu->title = title;
603+ menu->help = mutt_compile_help (helpstr, sizeof (helpstr),
604+ MENU_SIG_DIR, SigDirHelp);
605+
606+ for (files = list; files; files = files->next)
607+ menu->max++;
608+
609+ menu->data = FileTable = (ENTRY_DIR *) safe_calloc (menu->max,
610+ sizeof (ENTRY_DIR));
611+
612+ for (i = 0, files = list; files; i++, files = files->next)
613+ FileTable[i].data = files;
614+
615+ qsort (FileTable, menu->max, sizeof (ENTRY_DIR), sig_dir_sort);
616+
617+ while (!done)
618+ {
619+ switch (mutt_menuLoop (menu))
620+ {
621+ case OP_SIG_SEARCH:
622+ sigl = sig_search_filter (menu, path);
623+
624+ if (sigl)
625+ {
626+ if ((result = sig_list_menu (_("query results"), sigl)) != NULL)
627+ {
628+ append_signature (msg_file, result);
629+ done = 1;
630+ }
631+
632+ MAYBE_REDRAW (menu->redraw);
633+ free_sig_list (&sigl);
634+ }
635+ break;
636+
637+ case OP_GENERIC_SELECT_ENTRY:
638+ snprintf (buf, sizeof (buf), "%s/%s", path,
639+ FileTable[menu->current].data->name);
640+ sigl = NULL;
641+ read_sig_file (buf, &sigl, NULL);
642+
643+ if (sigl)
644+ {
645+ if ((result = sig_list_menu (buf, sigl)) != NULL)
646+ {
647+ append_signature (msg_file, result);
648+ done = 1;
649+ }
650+
651+ MAYBE_REDRAW (menu->redraw);
652+ free_sig_list (&sigl);
653+ }
654+ break;
655+
656+ case OP_EXIT:
657+ done = 1;
658+ break;
659+ }
660+ }
661+
662+ while (list)
663+ {
664+ safe_free ((void **)&list->name);
665+ files = list;
666+ list = list->next;
667+ safe_free ((void **)&files);
668+ }
669+ safe_free ((void **)&FileTable);
670+ mutt_menuDestroy (&menu);
671+ return 0;
672+}
673+
674+void mutt_signature (char *msg_file)
675+{
676+ if (!SigDirectory)
677+ {
678+ mutt_error (_("variable 'signatures_directory' is unset"));
679+ return;
680+ }
681+
682+ if (sig_dir_menu (SigDirectory, msg_file) == -1)
683+ mutt_error (_("%s: no files in this directory"), SigDirectory);
684+ else
685+ set_option (OPTNEEDREDRAW);
686+}
687diff -pruN mutt-1.3.27.orig/PATCHES mutt-1.3.27/PATCHES
688--- mutt-1.3.27.orig/PATCHES Mon Nov 26 20:16:52 2001
689+++ mutt-1.3.27/PATCHES Thu Dec 6 16:27:55 2001
c59ea3a3 690@@ -1,0 +2 @@
68667aa0 691+patch-1.3.27.cd.signatures_menu.2.1
0dd9f701
JR
692diff --git a/menu.c b/menu.c
693--- a/menu.c
694+++ b/menu.c
c59ea3a3 695@@ -642,7 +642,7 @@
0dd9f701
JR
696 mutt_error _("No entries.");
697 }
698
699-static void menu_next_entry (MUTTMENU *menu)
700+void menu_next_entry (MUTTMENU *menu)
701 {
702 if (menu->current < menu->max - 1)
703 {
c59ea3a3 704@@ -653,7 +653,7 @@
0dd9f701
JR
705 mutt_error _("You are on the last entry.");
706 }
707
708-static void menu_prev_entry (MUTTMENU *menu)
709+void menu_prev_entry (MUTTMENU *menu)
710 {
711 if (menu->current)
712 {
This page took 0.140265 seconds and 4 git commands to generate.