mirror of
https://git.FreeBSD.org/ports.git
synced 2025-01-04 06:15:24 +00:00
- Fix the WITH_MUTT_SIGNATURE_MENU patch.
PR: ports/94542 Submitted by: maintainer
This commit is contained in:
parent
d0933c6485
commit
69a5865211
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=157486
@ -187,16 +187,10 @@ AC_PATCH_VERSION= ${PORTVERSION}
|
||||
.if defined(WITH_MUTT_MAILDIR_HEADER_CACHE)
|
||||
WITH_MUTT_IMAP_HEADER_CACHE= yes
|
||||
.endif
|
||||
.if defined(WITH_MUTT_SIGNATURE_MENU)
|
||||
IGNORE= cannot install: the WITH_MUTT_SIGNATURE_MENU does not work at the moment
|
||||
.endif
|
||||
.if defined(WITH_MUTT_SIDEBAR_PATCH)
|
||||
.if defined(WITH_MUTT_NNTP)
|
||||
IGNORE= cannot install: the WITH_MUTT_SIDEBAR_PATCH and WITH_MUTT_NNTP are not compatible
|
||||
.endif
|
||||
.if defined(WITH_MUTT_SIGNATURE_MENU)
|
||||
IGNORE= cannot install: the WITH_MUTT_SIDEBAR_PATCH and WITH_MUTT_SIGNATURE_MENU are not compatible
|
||||
.endif
|
||||
.endif
|
||||
.if defined(WITH_MUTT_ASSUMED_CHARSET_PATCH)
|
||||
.if defined(WITH_MUTT_NNTP)
|
||||
@ -311,6 +305,11 @@ post-patch::
|
||||
post-patch::
|
||||
@${PATCH} ${PATCH_ARGS} -p1 < ${PATCHDIR}/extra-patch-maildir-header-cache
|
||||
.endif
|
||||
.if defined(WITH_MUTT_SIGNATURE_MENU)
|
||||
XML_NEEDED= yes
|
||||
post-patch::
|
||||
@${PATCH} ${PATCH_ARGS} -p1 < ${PATCHDIR}/extra-patch-signature-menu
|
||||
.endif
|
||||
.if defined(WITH_MUTT_MAILDIR_MTIME_PATCH)
|
||||
post-patch::
|
||||
.if defined(WITH_MUTT_NNTP)
|
||||
@ -392,10 +391,6 @@ PATCHFILES+= patch-${VVV_PATCH_VERSION}.vvv.initials.gz:vvv \
|
||||
patch-${VVV_PATCH_VERSION}.vvv.quote.gz:vvv
|
||||
XML_NEEDED= yes
|
||||
.endif
|
||||
.if defined(WITH_MUTT_SIGNATURE_MENU)
|
||||
PATCHFILES+= patch-${CD_PATCH_VERSION}.cd.signatures_menu.2.1:cd
|
||||
XML_NEEDED= yes
|
||||
.endif
|
||||
.if defined(WITH_MUTT_IFDEF_PATCH)
|
||||
DISTFILES+= patch-${CD_IFDEF_PATCH_VERSION}.cd.ifdef.1:cd
|
||||
#XML_NEEDED= yes
|
||||
|
729
mail/mutt-devel/files/extra-patch-signature-menu
Normal file
729
mail/mutt-devel/files/extra-patch-signature-menu
Normal file
@ -0,0 +1,729 @@
|
||||
--- mutt-1.5.11/PATCHES Dec 2002 17:44:54 -0000 3.6
|
||||
+++ mutt-1.5.11/PATCHES Feb 2004 13:19:42 -0000
|
||||
@@ -0,0 +1 @@
|
||||
+patch-1.5.11.cd.signatures_menu.2.1
|
||||
--- mutt-1.5.11/Makefile.am.orig Thu Aug 11 23:27:28 2005
|
||||
+++ mutt-1.5.11/Makefile.am Sat Mar 11 21:47:55 2006
|
||||
@@ -25,7 +25,7 @@
|
||||
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 mutt_idna.c crypt-mod.c crypt-mod.h
|
||||
--- mutt-1.5.11/Makefile.in.orig Thu Sep 15 16:22:50 2005
|
||||
+++ mutt-1.5.11/Makefile.in Sat Mar 11 21:50:27 2006
|
||||
@@ -89,7 +89,7 @@
|
||||
recvattach.$(OBJEXT) recvcmd.$(OBJEXT) rfc822.$(OBJEXT) \
|
||||
rfc1524.$(OBJEXT) rfc2047.$(OBJEXT) rfc2231.$(OBJEXT) \
|
||||
score.$(OBJEXT) send.$(OBJEXT) sendlib.$(OBJEXT) \
|
||||
- signal.$(OBJEXT) sort.$(OBJEXT) status.$(OBJEXT) \
|
||||
+ signal.$(OBJEXT) signature.${OBJEXT} sort.$(OBJEXT) status.$(OBJEXT) \
|
||||
system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \
|
||||
history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \
|
||||
editmsg.$(OBJEXT) utf8.$(OBJEXT) mbyte.$(OBJEXT) \
|
||||
@@ -307,7 +307,7 @@
|
||||
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 mutt_idna.c crypt-mod.c crypt-mod.h
|
||||
--- mutt-1.5.11/OPS.orig Sun Jul 24 18:56:42 2005
|
||||
+++ mutt-1.5.11/OPS Sat Mar 11 21:47:55 2006
|
||||
@@ -38,6 +38,7 @@
|
||||
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"
|
||||
@@ -131,6 +132,7 @@
|
||||
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"
|
||||
@@ -139,10 +141,12 @@
|
||||
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}"
|
||||
@@ -156,6 +160,7 @@
|
||||
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"
|
||||
--- mutt-1.5.11/compose.c.orig Thu Aug 11 21:37:23 2005
|
||||
+++ mutt-1.5.11/compose.c Sat Mar 11 21:47:55 2006
|
||||
@@ -1128,6 +1128,12 @@
|
||||
/* no send2hook, since this doesn't modify the message */
|
||||
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;
|
||||
--- mutt-1.5.11/doc/manual.xml.head.orig Tue Sep 6 18:46:44 2005
|
||||
+++ mutt-1.5.11/doc/manual.xml.head Sat Mar 11 21:48:05 2006
|
||||
@@ -908,6 +908,7 @@
|
||||
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
|
||||
S smime-menu select S/MIME options
|
||||
f edit-fcc specify an ``Fcc'' mailbox
|
||||
--- mutt-1.5.11/functions.h.orig Sun Jul 24 18:56:42 2005
|
||||
+++ mutt-1.5.11/functions.h Sat Mar 11 21:48:05 2006
|
||||
@@ -311,6 +311,7 @@
|
||||
{ "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" },
|
||||
|
||||
{ "attach-key", OP_COMPOSE_ATTACH_KEY, "\033k" },
|
||||
{ "pgp-menu", OP_COMPOSE_PGP_MENU, "p" },
|
||||
@@ -368,6 +369,19 @@
|
||||
{ "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 }
|
||||
};
|
||||
|
||||
--- mutt-1.5.11/globals.h.orig Thu Sep 15 16:19:54 2005
|
||||
+++ mutt-1.5.11/globals.h Sat Mar 11 21:48:05 2006
|
||||
@@ -109,6 +109,7 @@
|
||||
WHERE char *Sendmail;
|
||||
WHERE char *Shell;
|
||||
WHERE char *Signature;
|
||||
+WHERE char *SigDirectory;
|
||||
WHERE char *SimpleSearch;
|
||||
WHERE char *Spoolfile;
|
||||
WHERE char *SpamSep;
|
||||
--- mutt-1.5.11/init.h.orig Thu Sep 15 16:19:54 2005
|
||||
+++ mutt-1.5.11/init.h Sat Mar 11 21:48:05 2006
|
||||
@@ -2457,6 +2457,14 @@
|
||||
** 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
|
||||
--- mutt-1.5.11/keymap.c.orig Wed Sep 7 10:19:43 2005
|
||||
+++ mutt-1.5.11/keymap.c Sat Mar 11 21:48:05 2006
|
||||
@@ -55,6 +55,8 @@
|
||||
|
||||
|
||||
{ "query", MENU_QUERY },
|
||||
+ { "signature", MENU_SIG },
|
||||
+ { "sig_directory", MENU_SIG_DIR },
|
||||
{ "generic", MENU_GENERIC },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
@@ -560,6 +562,8 @@
|
||||
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);
|
||||
|
||||
|
||||
if ((WithCrypto & APPLICATION_PGP))
|
||||
@@ -658,6 +662,9 @@
|
||||
km_bindkey ("<enter>", MENU_ATTACH, OP_VIEW_ATTACH);
|
||||
km_bindkey ("<enter>", MENU_COMPOSE, OP_VIEW_ATTACH);
|
||||
|
||||
+ km_bindkey ("<up>", MENU_SIG, OP_PREV_SIG);
|
||||
+ km_bindkey ("<down>", 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);
|
||||
@@ -793,6 +800,10 @@
|
||||
return OpEditor;
|
||||
case MENU_QUERY:
|
||||
return OpQuery;
|
||||
+ case MENU_SIG:
|
||||
+ return OpSig;
|
||||
+ case MENU_SIG_DIR:
|
||||
+ return OpSigDir;
|
||||
|
||||
case MENU_PGP:
|
||||
return (WithCrypto & APPLICATION_PGP)? OpPgp:NULL;
|
||||
--- mutt-1.5.11/keymap.h.orig Thu Jun 17 22:33:04 2004
|
||||
+++ mutt-1.5.11/keymap.h Sat Mar 11 21:48:05 2006
|
||||
@@ -62,6 +62,8 @@
|
||||
MENU_PAGER,
|
||||
MENU_POST,
|
||||
MENU_QUERY,
|
||||
+ MENU_SIG,
|
||||
+ MENU_SIG_DIR,
|
||||
|
||||
|
||||
MENU_PGP,
|
||||
@@ -108,6 +110,8 @@
|
||||
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[];
|
||||
|
||||
extern struct binding_t OpPgp[];
|
||||
|
||||
--- mutt-1.5.11/protos.h.orig Wed Sep 7 10:19:43 2005
|
||||
+++ mutt-1.5.11/protos.h Sat Mar 11 21:48:05 2006
|
||||
@@ -242,6 +242,7 @@
|
||||
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);
|
||||
--- mutt-1.5.11/signature.c.orig Sat Mar 11 21:58:38 2006
|
||||
+++ mutt-1.5.11/signature.c Sat Mar 11 22:07:31 2006
|
||||
@@ -0,0 +1,499 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2001 Cedric Duval <cedricduval@free.fr>
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#if HAVE_CONFIG_H
|
||||
+# include "config.h"
|
||||
+#endif
|
||||
+
|
||||
+#include "mutt.h"
|
||||
+#include "mutt_menu.h"
|
||||
+#include "mapping.h"
|
||||
+#include "mutt_curses.h"
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <dirent.h>
|
||||
+#include <sys/stat.h>
|
||||
+
|
||||
+#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);
|
||||
+}
|
Loading…
Reference in New Issue
Block a user