NeoMutt  2025-12-11-1039-g550ac6
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
functions.c
Go to the documentation of this file.
1
23
29
30#include "config.h"
31#include <stdbool.h>
32#include <stdio.h>
33#include "private.h"
34#include "mutt/lib.h"
35#include "address/lib.h"
36#include "config/lib.h"
37#include "email/lib.h"
38#include "core/lib.h"
39#include "alias/lib.h"
40#include "gui/lib.h"
41#include "functions.h"
42#include "lib.h"
43#include "browser/lib.h"
44#include "editor/lib.h"
45#include "history/lib.h"
46#include "hooks/lib.h"
47#include "key/lib.h"
48#include "ncrypt/lib.h"
49#include "question/lib.h"
50#include "mutt_logging.h"
51#include "muttlib.h"
52#include "wdata.h"
53#ifdef USE_AUTOCRYPT
54#include "autocrypt/lib.h"
55#endif
56
57#ifdef USE_AUTOCRYPT
63static void autocrypt_compose_menu(struct Email *e, const struct ConfigSubset *sub)
64{
65 /* L10N: The compose menu autocrypt prompt.
66 (e)ncrypt enables encryption via autocrypt.
67 (c)lear sets cleartext.
68 (a)utomatic defers to the recommendation. */
69 const char *prompt = _("Autocrypt: (e)ncrypt, (c)lear, (a)utomatic?");
70
72
73 /* L10N: The letter corresponding to the compose menu autocrypt prompt
74 (e)ncrypt, (c)lear, (a)utomatic */
75 const char *letters = _("eca");
76
77 int choice = mw_multi_choice(prompt, letters);
78 switch (choice)
79 {
80 case 1:
83 break;
84 case 2:
87 break;
88 case 3:
89 {
91 const bool c_crypt_opportunistic_encrypt = cs_subset_bool(sub, "crypt_opportunistic_encrypt");
92 if (c_crypt_opportunistic_encrypt)
94 break;
95 }
96
97 default:
98 break;
99 }
100}
101#endif
102
109static bool edit_address_list(enum HeaderField field, struct AddressList *al)
110{
111 struct Buffer *old_list = buf_pool_get();
112 struct Buffer *new_list = buf_pool_get();
113
114 /* need to be large for alias expansion */
115 buf_alloc(old_list, 8192);
116 buf_alloc(new_list, 8192);
117
119 mutt_addrlist_write(al, new_list, false);
120 buf_fix_dptr(new_list);
121 if (!buf_is_empty(new_list))
122 buf_addstr(new_list, ", ");
123
124 buf_copy(old_list, new_list);
125 if (mw_get_field(_(Prompts[field]), new_list, MUTT_COMP_NONE, HC_ALIAS,
126 &CompleteAliasOps, NULL) == 0)
127 {
129 mutt_addrlist_parse2(al, buf_string(new_list));
131 }
132
133 char *err = NULL;
134 if (mutt_addrlist_to_intl(al, &err) != 0)
135 {
136 mutt_error(_("Bad IDN: '%s'"), err);
137 mutt_refresh();
138 FREE(&err);
139 }
140
141 const bool rc = !mutt_str_equal(buf_string(new_list), buf_string(old_list));
142 buf_pool_release(&old_list);
143 buf_pool_release(&new_list);
144 return rc;
145}
146
152{
153 struct Email *e = wdata->email;
154
155 const bool c_crypt_opportunistic_encrypt = cs_subset_bool(wdata->sub, "crypt_opportunistic_encrypt");
156 if (c_crypt_opportunistic_encrypt)
158
159#ifdef USE_AUTOCRYPT
160 const bool c_autocrypt = cs_subset_bool(wdata->sub, "autocrypt");
161 if (c_autocrypt)
162 {
164
165 /* Anything that enables SEC_ENCRYPT or SEC_SIGN, or turns on SMIME
166 * overrides autocrypt, be it oppenc or the user having turned on
167 * those flags manually. */
169 {
171 }
172 else
173 {
175 {
176 if (wdata->autocrypt_rec == AUTOCRYPT_REC_YES)
177 {
180 }
181 else
182 {
184 }
185 }
186 }
187 }
188#endif
189}
190
191// -----------------------------------------------------------------------------
192
196static int op_envelope_edit_bcc(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
197{
198 if (wdata->is_news)
199 return FR_NO_ACTION;
200 if (!edit_address_list(HDR_BCC, &wdata->email->env->bcc))
201 return FR_NO_ACTION;
202
203 update_crypt_info(wdata);
205 return FR_SUCCESS;
206}
207
211static int op_envelope_edit_cc(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
212{
213 if (wdata->is_news)
214 return FR_NO_ACTION;
215 if (!edit_address_list(HDR_CC, &wdata->email->env->cc))
216 return FR_NO_ACTION;
217
218 update_crypt_info(wdata);
220 return FR_SUCCESS;
221}
222
226static int op_envelope_edit_fcc(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
227{
228 int rc = FR_NO_ACTION;
229 struct Buffer *fname = buf_pool_get();
230 buf_copy(fname, wdata->fcc);
231
232 struct FileCompletionData cdata = { false, NULL, NULL, NULL, NULL };
234 &CompleteMailboxOps, &cdata) != 0)
235 {
236 goto done; // aborted
237 }
238
239 if (mutt_str_equal(wdata->fcc->data, fname->data))
240 goto done; // no change
241
242 buf_copy(wdata->fcc, fname);
243 pretty_mailbox(wdata->fcc);
245 rc = FR_SUCCESS;
246
247done:
248 buf_pool_release(&fname);
249 return rc;
250}
251
255static int op_envelope_edit_from(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
256{
257 if (!edit_address_list(HDR_FROM, &wdata->email->env->from))
258 return FR_NO_ACTION;
259
260 update_crypt_info(wdata);
262 return FR_SUCCESS;
263}
264
269 const struct KeyEvent *event)
270{
272 return FR_NO_ACTION;
273
275 return FR_SUCCESS;
276}
277
282 const struct KeyEvent *event)
283{
284 int rc = FR_NO_ACTION;
285 struct Buffer *buf = buf_pool_get();
286
287 buf_strcpy(buf, wdata->email->env->subject);
288 if (mw_get_field(Prompts[HDR_SUBJECT], buf, MUTT_COMP_NONE, HC_OTHER, NULL, NULL) != 0)
289 {
290 goto done; // aborted
291 }
292
293 if (mutt_str_equal(wdata->email->env->subject, buf_string(buf)))
294 goto done; // no change
295
298 rc = FR_SUCCESS;
299
300done:
301 buf_pool_release(&buf);
302 return rc;
303}
304
308static int op_envelope_edit_to(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
309{
310 if (wdata->is_news)
311 return FR_NO_ACTION;
312 if (!edit_address_list(HDR_TO, &wdata->email->env->to))
313 return FR_NO_ACTION;
314
315 update_crypt_info(wdata);
317 return FR_SUCCESS;
318}
319
323static int op_compose_pgp_menu(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
324{
325 const SecurityFlags old_flags = wdata->email->security;
327 return FR_NOT_IMPL;
329 {
330 mutt_error(_("No PGP backend configured"));
331 return FR_ERROR;
332 }
333 if (((WithCrypto & APPLICATION_SMIME) != 0) && (wdata->email->security & APPLICATION_SMIME))
334 {
335 if (wdata->email->security & (SEC_ENCRYPT | SEC_SIGN))
336 {
337 if (query_yesorno(_("S/MIME already selected. Clear and continue?"), MUTT_YES) != MUTT_YES)
338 {
340 return FR_NO_ACTION;
341 }
342 wdata->email->security &= ~(SEC_ENCRYPT | SEC_SIGN);
343 }
345 wdata->email->security |= APPLICATION_PGP;
346 update_crypt_info(wdata);
347 }
348 wdata->email->security = crypt_pgp_send_menu(wdata->email);
349 update_crypt_info(wdata);
350 if (wdata->email->security == old_flags)
351 return FR_NO_ACTION;
352
355 return FR_SUCCESS;
356}
357
361static int op_compose_smime_menu(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
362{
363 const SecurityFlags old_flags = wdata->email->security;
365 return FR_NOT_IMPL;
367 {
368 mutt_error(_("No S/MIME backend configured"));
369 return FR_ERROR;
370 }
371
372 if (((WithCrypto & APPLICATION_PGP) != 0) && (wdata->email->security & APPLICATION_PGP))
373 {
374 if (wdata->email->security & (SEC_ENCRYPT | SEC_SIGN))
375 {
376 if (query_yesorno(_("PGP already selected. Clear and continue?"), MUTT_YES) != MUTT_YES)
377 {
379 return FR_NO_ACTION;
380 }
381 wdata->email->security &= ~(SEC_ENCRYPT | SEC_SIGN);
382 }
385 update_crypt_info(wdata);
386 }
387 wdata->email->security = crypt_smime_send_menu(wdata->email);
388 update_crypt_info(wdata);
389 if (wdata->email->security == old_flags)
390 return FR_NO_ACTION;
391
394 return FR_SUCCESS;
395}
396
397#ifdef USE_AUTOCRYPT
402 const struct KeyEvent *event)
403{
404 const SecurityFlags old_flags = wdata->email->security;
405 const bool c_autocrypt = cs_subset_bool(wdata->sub, "autocrypt");
406 if (!c_autocrypt)
407 return FR_NO_ACTION;
408
410 {
411 if (wdata->email->security & (SEC_ENCRYPT | SEC_SIGN))
412 {
413 if (query_yesorno(_("S/MIME already selected. Clear and continue?"), MUTT_YES) != MUTT_YES)
414 {
416 return FR_NO_ACTION;
417 }
418 wdata->email->security &= ~(SEC_ENCRYPT | SEC_SIGN);
419 }
421 wdata->email->security |= APPLICATION_PGP;
422 update_crypt_info(wdata);
423 }
424 autocrypt_compose_menu(wdata->email, wdata->sub);
425 update_crypt_info(wdata);
426 if (wdata->email->security == old_flags)
427 return FR_NO_ACTION;
428
431 return FR_SUCCESS;
432}
433#endif
434
435// -----------------------------------------------------------------------------
436
441 const struct KeyEvent *event)
442{
443 if (!wdata->is_news)
444 return FR_NO_ACTION;
445
446 int rc = FR_NO_ACTION;
447 struct Buffer *buf = buf_pool_get();
448
449 buf_strcpy(buf, wdata->email->env->followup_to);
450 if (mw_get_field(Prompts[HDR_FOLLOWUPTO], buf, MUTT_COMP_NONE, HC_OTHER, NULL, NULL) == 0)
451 {
454 rc = FR_SUCCESS;
455 }
456
457 buf_pool_release(&buf);
458 return rc;
459}
460
465 const struct KeyEvent *event)
466{
467 if (!wdata->is_news)
468 return FR_NO_ACTION;
469
470 int rc = FR_NO_ACTION;
471 struct Buffer *buf = buf_pool_get();
472
473 buf_strcpy(buf, wdata->email->env->newsgroups);
474 if (mw_get_field(Prompts[HDR_NEWSGROUPS], buf, MUTT_COMP_NONE, HC_OTHER, NULL, NULL) == 0)
475 {
478 rc = FR_SUCCESS;
479 }
480
481 buf_pool_release(&buf);
482 return rc;
483}
484
489 const struct KeyEvent *event)
490{
491 const bool c_x_comment_to = cs_subset_bool(wdata->sub, "x_comment_to");
492 if (!(wdata->is_news && c_x_comment_to))
493 return FR_NO_ACTION;
494
495 int rc = FR_NO_ACTION;
496 struct Buffer *buf = buf_pool_get();
497
498 buf_strcpy(buf, wdata->email->env->x_comment_to);
499 if (mw_get_field(Prompts[HDR_XCOMMENTTO], buf, MUTT_COMP_NONE, HC_OTHER, NULL, NULL) == 0)
500 {
503 rc = FR_SUCCESS;
504 }
505
506 buf_pool_release(&buf);
507 return rc;
508}
509
510// -----------------------------------------------------------------------------
511
515static const struct EnvelopeFunction EnvelopeFunctions[] = {
516// clang-format off
517#ifdef USE_AUTOCRYPT
518 { OP_COMPOSE_AUTOCRYPT_MENU, op_compose_autocrypt_menu },
519#endif
520 { OP_COMPOSE_PGP_MENU, op_compose_pgp_menu },
521 { OP_COMPOSE_SMIME_MENU, op_compose_smime_menu },
522 { OP_ENVELOPE_EDIT_BCC, op_envelope_edit_bcc },
523 { OP_ENVELOPE_EDIT_CC, op_envelope_edit_cc },
524 { OP_ENVELOPE_EDIT_FCC, op_envelope_edit_fcc },
525 { OP_ENVELOPE_EDIT_FOLLOWUP_TO, op_envelope_edit_followup_to },
526 { OP_ENVELOPE_EDIT_FROM, op_envelope_edit_from },
527 { OP_ENVELOPE_EDIT_NEWSGROUPS, op_envelope_edit_newsgroups },
528 { OP_ENVELOPE_EDIT_REPLY_TO, op_envelope_edit_reply_to },
529 { OP_ENVELOPE_EDIT_SUBJECT, op_envelope_edit_subject },
530 { OP_ENVELOPE_EDIT_TO, op_envelope_edit_to },
531 { OP_ENVELOPE_EDIT_X_COMMENT_TO, op_envelope_edit_x_comment_to },
532 { 0, NULL },
533 // clang-format on
534};
535
539int env_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
540{
541 if (!event || !win || !win->wdata)
542 return FR_UNKNOWN;
543
544 const int op = event->op;
545 int rc = FR_UNKNOWN;
546 for (size_t i = 0; EnvelopeFunctions[i].op != OP_NULL; i++)
547 {
548 const struct EnvelopeFunction *fn = &EnvelopeFunctions[i];
549 if (fn->op == op)
550 {
551 struct EnvelopeWindowData *wdata = win->wdata;
552 rc = fn->function(wdata, event);
553 break;
554 }
555 }
556
557 if (rc == FR_UNKNOWN) // Not our function
558 return rc;
559
560 const char *result = dispatcher_get_retval_name(rc);
561 mutt_debug(LL_DEBUG1, "Handled %s (%d) -> %s\n", opcodes_get_name(op), op, NONULL(result));
562
564 return rc;
565}
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
Definition address.c:1473
int mutt_addrlist_to_local(struct AddressList *al)
Convert an Address list from Punycode.
Definition address.c:1389
size_t mutt_addrlist_write(const struct AddressList *al, struct Buffer *buf, bool display)
Write an Address to a buffer.
Definition address.c:1217
int mutt_addrlist_parse2(struct AddressList *al, const char *s)
Parse a list of email addresses.
Definition address.c:651
int mutt_addrlist_to_intl(struct AddressList *al, char **err)
Convert an Address list to Punycode.
Definition address.c:1304
Email Address Handling.
const struct CompleteOps CompleteAliasOps
Auto-Completion of Aliases.
Definition complete.c:108
Email Aliases.
void mutt_expand_aliases(struct AddressList *al)
Expand aliases in a List of Addresses.
Definition alias.c:297
Autocrypt end-to-end encryption.
@ AUTOCRYPT_REC_YES
Autocrypt should be used.
Definition lib.h:171
enum AutocryptRec mutt_autocrypt_ui_recommendation(const struct Email *e, char **keylist)
Get the recommended action for an Email.
Definition autocrypt.c:578
const struct CompleteOps CompleteMailboxOps
Auto-Completion of Files / Mailboxes.
Definition complete.c:159
Select a Mailbox from a list.
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
Definition buffer.c:298
void buf_fix_dptr(struct Buffer *buf)
Move the dptr to end of the Buffer.
Definition buffer.c:189
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition buffer.c:233
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition buffer.c:401
size_t buf_copy(struct Buffer *dst, const struct Buffer *src)
Copy a Buffer's contents to another Buffer.
Definition buffer.c:607
void buf_alloc(struct Buffer *buf, size_t new_size)
Make sure a buffer can store at least new_size bytes.
Definition buffer.c:342
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
@ CMD_SEND2_HOOK
:send2-hook
Definition command.h:109
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
void crypt_opportunistic_encrypt(struct Email *e)
Can all recipients be determined.
Definition crypt.c:1052
bool crypt_has_module_backend(SecurityFlags type)
Is there a crypto backend for a given type?
Definition cryptglue.c:188
SecurityFlags crypt_smime_send_menu(struct Email *e)
Wrapper for CryptModuleSpecs::send_menu().
Definition cryptglue.c:632
SecurityFlags crypt_pgp_send_menu(struct Email *e)
Wrapper for CryptModuleSpecs::send_menu().
Definition cryptglue.c:446
void mutt_refresh(void)
Force a refresh of the screen.
Definition curs_lib.c:78
const char * dispatcher_get_retval_name(int rv)
Get the name of a return value.
Definition dispatcher.c:55
void dispatcher_flush_on_error(int rv)
Flush pending keys after a dispatch error.
Definition dispatcher.c:65
@ FR_SUCCESS
Valid function - successfully performed.
Definition dispatcher.h:40
@ FR_UNKNOWN
Unknown function.
Definition dispatcher.h:34
@ FR_ERROR
Valid function - error occurred.
Definition dispatcher.h:39
@ FR_NOT_IMPL
Invalid function - feature not enabled.
Definition dispatcher.h:37
@ FR_NO_ACTION
Valid function - no action performed.
Definition dispatcher.h:38
Edit a string.
@ MUTT_COMP_CLEAR
Clear input if printable character is pressed.
Definition wdata.h:47
@ MUTT_COMP_NONE
No flags are set.
Definition wdata.h:46
Structs that make up an email.
@ NT_EMAIL_CHANGE
Email has changed.
Definition email.h:186
static const struct EnvelopeFunction EnvelopeFunctions[]
All the NeoMutt functions that the Envelope supports.
Definition functions.c:515
static bool edit_address_list(enum HeaderField field, struct AddressList *al)
Let the user edit the address list.
Definition functions.c:109
static void autocrypt_compose_menu(struct Email *e, const struct ConfigSubset *sub)
Autocrypt compose settings.
Definition functions.c:63
void update_crypt_info(struct EnvelopeWindowData *wdata)
Update the crypto info.
Definition functions.c:151
Envelope functions.
Envelope-editing Window.
Private Envelope Data.
const char *const Prompts[]
Names of header fields used in the envelope, e.g. From:, To:
Definition window.c:89
HeaderField
Ordered list of headers for the compose screen.
Definition private.h:32
@ HDR_SUBJECT
"Subject:" field
Definition private.h:37
@ HDR_REPLYTO
"Reply-To:" field
Definition private.h:38
@ HDR_FCC
"Fcc:" (save folder) field
Definition private.h:39
@ HDR_CC
"Cc:" field
Definition private.h:35
@ HDR_TO
"To:" field
Definition private.h:34
@ HDR_BCC
"Bcc:" field
Definition private.h:36
@ HDR_FOLLOWUPTO
"Followup-To:" field
Definition private.h:46
@ HDR_XCOMMENTTO
"X-Comment-To:" field
Definition private.h:47
@ HDR_NEWSGROUPS
"Newsgroups:" field
Definition private.h:45
@ HDR_FROM
"From:" field
Definition private.h:33
Envelope Window Data.
void mutt_env_set_subject(struct Envelope *env, const char *subj)
Set both subject and real_subj to subj.
Definition envelope.c:68
bool mutt_env_notify_send(struct Email *e, enum NotifyEnvelope type)
Send an Envelope change notification.
Definition envelope.c:178
@ NT_ENVELOPE_SUBJECT
"Subject:" header has changed
Definition envelope.h:144
@ NT_ENVELOPE_BCC
"Bcc:" header has changed
Definition envelope.h:137
@ NT_ENVELOPE_TO
"To:" header has changed
Definition envelope.h:145
@ NT_ENVELOPE_FCC
"Fcc:" header has changed
Definition envelope.h:139
@ NT_ENVELOPE_CC
"Cc:" header has changed
Definition envelope.h:138
@ NT_ENVELOPE_REPLY_TO
"Reply-To:" header has changed
Definition envelope.h:143
@ NT_ENVELOPE_FROM
"From:" header has changed
Definition envelope.h:141
@ NT_ENVELOPE_X_COMMENT_TO
"X-Comment-To:" header has changed
Definition envelope.h:146
@ NT_ENVELOPE_FOLLOWUP_TO
"Followup-To:" header has changed
Definition envelope.h:140
@ NT_ENVELOPE_NEWSGROUPS
"Newsgroups:" header has changed
Definition envelope.h:142
int env_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform an Envelope function - Implements function_dispatcher_t -.
Definition functions.c:539
static int op_envelope_edit_followup_to(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the Followup-To field - Implements envelope_function_t -.
Definition functions.c:440
static int op_envelope_edit_cc(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the CC list - Implements envelope_function_t -.
Definition functions.c:211
static int op_compose_pgp_menu(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Show PGP options - Implements envelope_function_t -.
Definition functions.c:323
static int op_envelope_edit_fcc(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Enter a file to save a copy of this message in - Implements envelope_function_t -.
Definition functions.c:226
static int op_envelope_edit_reply_to(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the Reply-To field - Implements envelope_function_t -.
Definition functions.c:268
static int op_envelope_edit_from(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the from field - Implements envelope_function_t -.
Definition functions.c:255
static int op_envelope_edit_subject(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the subject of this message - Implements envelope_function_t -.
Definition functions.c:281
static int op_compose_smime_menu(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Show S/MIME options - Implements envelope_function_t -.
Definition functions.c:361
static int op_envelope_edit_x_comment_to(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the X-Comment-To field - Implements envelope_function_t -.
Definition functions.c:488
static int op_envelope_edit_to(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the TO list - Implements envelope_function_t -.
Definition functions.c:308
static int op_envelope_edit_newsgroups(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the newsgroups list - Implements envelope_function_t -.
Definition functions.c:464
static int op_compose_autocrypt_menu(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Show autocrypt compose menu options - Implements envelope_function_t -.
Definition functions.c:401
static int op_envelope_edit_bcc(struct EnvelopeWindowData *wdata, const struct KeyEvent *event)
Edit the BCC list - Implements envelope_function_t -.
Definition functions.c:196
int mw_get_field(const char *prompt, struct Buffer *buf, CompletionFlags complete, enum HistoryClass hclass, const struct CompleteOps *comp_api, void *cdata)
Ask the user for a string -.
Definition window.c:502
int mw_multi_choice(const char *prompt, const char *letters)
Offer the user a multiple choice question -.
Definition question.c:62
#define mutt_error(...)
Definition logging2.h:94
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
Convenience wrapper for the gui headers.
Read/write command history from/to a file.
@ HC_MAILBOX
Mailboxes.
Definition lib.h:62
@ HC_ALIAS
Aliases.
Definition lib.h:57
@ HC_OTHER
Miscellaneous strings.
Definition lib.h:61
void exec_message_hook(struct Mailbox *m, struct Email *e, enum CommandId id)
Perform a message hook.
Definition exec.c:137
Hook Commands.
Manage keymappings.
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
Convenience wrapper for the library headers.
#define _(a)
Definition message.h:28
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition notify.c:173
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:666
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition string.c:284
void mutt_clear_error(void)
Clear the message line (bottom line of screen).
NeoMutt Logging.
void pretty_mailbox(struct Buffer *buf)
Shorten a mailbox path using '~' or '='.
Definition muttlib.c:431
Some miscellaneous functions.
API for encryption/signing of emails.
uint16_t SecurityFlags
Definition lib.h:104
@ SEC_OPPENCRYPT
Opportunistic encrypt mode.
Definition lib.h:100
@ SEC_SIGN
Email is signed.
Definition lib.h:93
@ SEC_INLINE
Email has an inline signature.
Definition lib.h:99
@ SEC_ENCRYPT
Email is encrypted.
Definition lib.h:92
@ SEC_AUTOCRYPT
(Autocrypt) Message will be, or was Autocrypt encrypt+signed
Definition lib.h:101
@ SEC_AUTOCRYPT_OVERRIDE
(Autocrypt) Indicates manual set/unset of encryption
Definition lib.h:102
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition lib.h:106
#define APPLICATION_SMIME
Use SMIME to encrypt/sign.
Definition lib.h:107
#define WithCrypto
Definition lib.h:132
@ NT_EMAIL
Email has changed, NotifyEmail, EventEmail.
Definition notify_type.h:44
const char * opcodes_get_name(int op)
Get the name of an opcode.
Definition opcodes.c:48
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
Definition quad.h:39
Ask the user a question.
enum QuadOption query_yesorno(const char *prompt, enum QuadOption def)
Ask the user a Yes/No question.
Definition question.c:329
#define NONULL(x)
Definition string2.h:44
String manipulation buffer.
Definition buffer.h:36
char * data
Pointer to data.
Definition buffer.h:37
A set of inherited config items.
Definition subset.h:46
The envelope/body of an email.
Definition email.h:39
struct Envelope * env
Envelope information.
Definition email.h:68
SecurityFlags security
bit 0-10: flags, bit 11,12: application, bit 13: traditional pgp See: ncrypt/lib.h pgplib....
Definition email.h:43
struct Notify * notify
Notifications: NotifyEmail, EventEmail.
Definition email.h:73
A NeoMutt Envelope function.
Definition functions.h:49
int op
Op code, e.g. OP_ENVELOPE_EDIT_FROM.
Definition functions.h:50
envelope_function_t function
Function to call.
Definition functions.h:51
Data to fill the Envelope Window.
Definition wdata.h:38
bool is_news
Email is a news article.
Definition wdata.h:48
struct Buffer * fcc
Where the outgoing Email will be saved.
Definition wdata.h:41
struct Email * email
Email being composed.
Definition wdata.h:40
struct ConfigSubset * sub
Inherited config items.
Definition wdata.h:39
enum AutocryptRec autocrypt_rec
Autocrypt recommendation.
Definition wdata.h:50
char *const subject
Email's subject.
Definition envelope.h:70
struct AddressList to
Email's 'To' list.
Definition envelope.h:60
char * followup_to
List of 'followup-to' fields.
Definition envelope.h:80
struct AddressList reply_to
Email's 'reply-to'.
Definition envelope.h:64
char * x_comment_to
List of 'X-comment-to' fields.
Definition envelope.h:81
char * newsgroups
List of newsgroups.
Definition envelope.h:78
struct AddressList cc
Email's 'Cc' list.
Definition envelope.h:61
struct AddressList bcc
Email's 'Bcc' list.
Definition envelope.h:62
struct AddressList from
Email's 'From' list.
Definition envelope.h:59
Input for the file completion function.
Definition curs_lib.h:39
An event such as a keypress.
Definition get.h:75
void * wdata
Private data.