# HG changeset patch
# User Jiri Denemark <[email protected]>
# Date 1362434347 -3600
# Branch HEAD
# Node ID a5f8b3b34a5a1780850c85687d22a1883083aacb
# Parent 4c16c0d1ba9e0d81608a0fbccebd08daa28d76f5
Add support for changing X-Label
Mutt supports ~y pattern which matches X-Label content but does not provide an
easy way to change this header. This adds two new functions called set-label
and clear-label for index and pager for changing X-Label header.
diff --git a/OPS b/OPS
--- a/OPS
+++ b/OPS
@@ -172,6 +172,8 @@
OP_UNDELETE "undelete the current entry"
OP_UNDELETE_THREAD "undelete all messages in thread"
OP_UNDELETE_SUBTHREAD "undelete all messages in subthread"
+OP_SET_LABEL "set x-label header"
+OP_CLEAR_LABEL "clear x-label header"
OP_VERSION "show the Mutt version number and date"
OP_VIEW_ATTACH "view attachment using mailcap entry if necessary"
OP_VIEW_ATTACHMENTS "show MIME attachments"
diff --git a/commands.c b/commands.c
--- a/commands.c
+++ b/commands.c
@@ -502,6 +502,25 @@
PipeSep);
}
+void mutt_set_label (HEADER *h, int clear)
+{
+ char buffer[LONG_STRING];
+
+ if (clear)
+ FREE (&h->env->x_label);
+ else
+ {
+ buffer[0] = 0;
+ if (mutt_get_field (_("Label message: "), buffer, sizeof (buffer), 0) != 0
+ || !buffer[0])
+ return;
+
+ mutt_str_replace (&h->env->x_label, buffer);
+ }
+
+ h->env->label_changed = h->changed = 1;
+}
+
void mutt_print_message (HEADER *h)
{
diff --git a/copy.c b/copy.c
--- a/copy.c
+++ b/copy.c
@@ -98,6 +98,9 @@
(ascii_strncasecmp ("Status:", buf, 7) == 0 ||
ascii_strncasecmp ("X-Status:", buf, 9) == 0))
continue;
+ if ((flags & CH_UPDATE_LABEL) &&
+ ascii_strncasecmp ("X-Label:", buf, 8) == 0)
+ continue;
if ((flags & (CH_UPDATE_LEN | CH_XMIT | CH_NOLEN)) &&
(ascii_strncasecmp ("Content-Length:", buf, 15) == 0 ||
ascii_strncasecmp ("Lines:", buf, 6) == 0))
@@ -198,6 +201,9 @@
(ascii_strncasecmp ("Status:", buf, 7) == 0 ||
ascii_strncasecmp ("X-Status:", buf, 9) == 0))
continue;
+ if ((flags & CH_UPDATE_LABEL) &&
+ ascii_strncasecmp ("X-Label:", buf, 8) == 0)
+ continue;
if ((flags & (CH_UPDATE_LEN | CH_XMIT | CH_NOLEN)) &&
(ascii_strncasecmp ("Content-Length:", buf, 15) == 0 ||
ascii_strncasecmp ("Lines:", buf, 6) == 0))
@@ -333,6 +339,7 @@
CH_NOQFROM ignore ">From " line
CH_UPDATE_IRT update the In-Reply-To: header
CH_UPDATE_REFS update the References: header
+ CH_UPDATE_LABEL update the X-Label: header
prefix
string to use if CH_PREFIX is set
@@ -345,7 +352,8 @@
if (h->env)
flags |= (h->env->irt_changed ? CH_UPDATE_IRT : 0)
- | (h->env->refs_changed ? CH_UPDATE_REFS : 0);
+ | (h->env->refs_changed ? CH_UPDATE_REFS : 0)
+ | (h->env->label_changed ? CH_UPDATE_LABEL : 0);
if (mutt_copy_hdr (in, out, h->offset, h->content->offset, flags, prefix) ==
-1)
return -1;
@@ -404,6 +412,9 @@
}
}
+ if ((flags & CH_UPDATE_LABEL) && (h->env->x_label))
+ fprintf (out, "X-Label: %s\n", h->env->x_label);
+
if (flags & CH_UPDATE_LEN &&
(flags & CH_NOLEN) == 0)
{
diff --git a/copy.h b/copy.h
--- a/copy.h
+++ b/copy.h
@@ -53,6 +53,7 @@
#define CH_UPDATE_IRT (1<<16) /* update In-Reply-To: */
#define CH_UPDATE_REFS (1<<17) /* update References: */
#define CH_DISPLAY (1<<18) /* display result to user */
+#define CH_UPDATE_LABEL (1<<19) /* update X-Label: */
int mutt_copy_hdr (FILE *, FILE *, LOFF_T, LOFF_T, int, const char *);
diff --git a/curs_main.c b/curs_main.c
--- a/curs_main.c
+++ b/curs_main.c
@@ -2185,6 +2185,33 @@
}
break;
+ case OP_SET_LABEL:
+ case OP_CLEAR_LABEL:
+ CHECK_MSGCOUNT;
+ CHECK_VISIBLE;
+ CHECK_READONLY;
+
+ if (op == OP_CLEAR_LABEL)
+ {
+ mutt_set_label (CURHDR, 1);
+ mutt_message _("Label cleared");
+ }
+ else
+ {
+ mutt_set_label (CURHDR, 0);
+ mutt_message _("Label changed");
+ }
+ Context->changed = 1;
+
+ if (menu->menu == MENU_PAGER)
+ {
+ op = OP_DISPLAY_MESSAGE;
+ continue;
+ }
+ else
+ menu->redraw |= REDRAW_CURRENT;
+ break;
+
case OP_VERSION:
mutt_version ();
break;
diff --git a/functions.h b/functions.h
--- a/functions.h
+++ b/functions.h
@@ -159,6 +159,8 @@
{ "next-unread", OP_MAIN_NEXT_UNREAD, NULL },
{ "previous-unread", OP_MAIN_PREV_UNREAD, NULL },
{ "parent-message", OP_MAIN_PARENT_MESSAGE, "P" },
+ { "set-label", OP_SET_LABEL, NULL },
+ { "clear-label", OP_CLEAR_LABEL, NULL },
{ "extract-keys", OP_EXTRACT_KEYS, "\013" },
@@ -259,6 +261,8 @@
{ "previous-line", OP_PREV_LINE, NULL },
{ "bottom", OP_PAGER_BOTTOM, NULL },
{ "parent-message", OP_MAIN_PARENT_MESSAGE, "P" },
+ { "set-label", OP_SET_LABEL, NULL },
+ { "clear-label", OP_CLEAR_LABEL, NULL },
diff --git a/mh.c b/mh.c
--- a/mh.c
+++ b/mh.c
@@ -1613,7 +1613,8 @@
HEADER *h = ctx->hdrs[msgno];
if (h->attach_del ||
- (h->env && (h->env->refs_changed || h->env->irt_changed)))
+ (h->env &&
+ (h->env->refs_changed || h->env->irt_changed || h->env->label_changed)))
if (mh_rewrite_message (ctx, msgno) != 0)
return -1;
@@ -1625,7 +1626,8 @@
HEADER *h = ctx->hdrs[msgno];
if (h->attach_del ||
- (h->env && (h->env->refs_changed || h->env->irt_changed)))
+ (h->env &&
+ (h->env->refs_changed || h->env->irt_changed || h->env->label_changed)))
{
/* when doing attachment deletion/rethreading, fall back to the MH case. */
if (mh_rewrite_message (ctx, msgno) != 0)
diff --git a/mutt.h b/mutt.h
--- a/mutt.h
+++ b/mutt.h
@@ -595,6 +595,7 @@
unsigned int irt_changed : 1; /* In-Reply-To changed to link/break threads */
unsigned int refs_changed : 1; /* References changed to break thread */
+ unsigned int label_changed : 1; /* X-Label header changed */
} ENVELOPE;
typedef struct parameter
diff --git a/muttlib.c b/muttlib.c
--- a/muttlib.c
+++ b/muttlib.c
@@ -750,7 +750,10 @@
MOVE_ELEM(message_id);
MOVE_ELEM(supersedes);
MOVE_ELEM(date);
- MOVE_ELEM(x_label);
+ if (!base->label_changed)
+ {
+ MOVE_ELEM(x_label);
+ }
if (!base->refs_changed)
{
MOVE_ELEM(references);
diff --git a/protos.h b/protos.h
--- a/protos.h
+++ b/protos.h
@@ -372,6 +372,7 @@
void mutt_set_header_color(CONTEXT *, HEADER *);
void mutt_sleep (short);
int mutt_save_confirm (const char *, struct stat *);
+void mutt_set_label(HEADER *, int);
int mh_valid_message (const char *);