NeoMutt  2025-12-11-435-g4ac674
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
message.c File Reference

Process a message for display in the pager. More...

#include "config.h"
#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include "mutt/lib.h"
#include "config/lib.h"
#include "email/lib.h"
#include "core/lib.h"
#include "gui/lib.h"
#include "mutt.h"
#include "lib.h"
#include "attach/lib.h"
#include "expando/lib.h"
#include "index/lib.h"
#include "key/lib.h"
#include "menu/lib.h"
#include "ncrypt/lib.h"
#include "question/lib.h"
#include "functions.h"
#include "globals.h"
#include "mx.h"
#include "autocrypt/lib.h"
+ Include dependency graph for message.c:

Go to the source code of this file.

Functions

static void process_protected_headers (struct Mailbox *m, struct Email *e)
 Get the protected header and update the index.
 
static int email_to_file (struct Message *msg, struct Buffer *tempfile, struct Mailbox *m, struct Email *e, const char *header, int wrap_len, CopyMessageFlags *cmflags)
 Decrypt, decode and weed an Email into a file.
 
int external_pager (struct MailboxView *mv, struct Email *e, const char *command)
 Display a message in an external program.
 
static void notify_crypto (struct Email *e, struct Message *msg, CopyMessageFlags cmflags)
 Notify the user about the crypto status of the Email.
 
static void squash_index_panel (struct Mailbox *m, struct MuttWindow *win_index, struct MuttWindow *win_pager)
 Shrink or hide the Index Panel.
 
static void expand_index_panel (struct MuttWindow *win_index, struct MuttWindow *win_pager)
 Restore the Index Panel.
 
int mutt_display_message (struct MuttWindow *win_index, struct IndexSharedData *shared)
 Display a message in the pager.
 

Variables

static const char * ExtPagerProgress = N_("all")
 Status bar message when entire message is visible in the Pager.
 

Detailed Description

Process a message for display in the pager.

Authors
  • Richard Russon
  • Pietro Cerutti

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, see http://www.gnu.org/licenses/.

Definition in file message.c.

Function Documentation

◆ process_protected_headers()

static void process_protected_headers ( struct Mailbox * m,
struct Email * e )
static

Get the protected header and update the index.

Parameters
mMailbox
eEmail to update

Definition at line 65 of file message.c.

66{
67 struct Envelope *prot_headers = NULL;
68
69 const bool c_crypt_protected_headers_read = cs_subset_bool(NeoMutt->sub, "crypt_protected_headers_read");
70#ifdef USE_AUTOCRYPT
71 const bool c_autocrypt = cs_subset_bool(NeoMutt->sub, "autocrypt");
72 if (!c_crypt_protected_headers_read && !c_autocrypt)
73 return;
74#else
75 if (!c_crypt_protected_headers_read)
76 return;
77#endif
78
79 /* Grab protected headers to update in the index */
80 if (e->security & SEC_SIGN)
81 {
82 /* Don't update on a bad signature.
83 *
84 * This is a simplification. It's possible the headers are in the
85 * encrypted part of a nested encrypt/signed. But properly handling that
86 * case would require more complexity in the decryption handlers, which
87 * I'm not sure is worth it. */
88 if (!(e->security & SEC_GOODSIGN))
89 return;
90
92 {
93 prot_headers = e->body->parts->mime_headers;
94 }
96 {
97 prot_headers = e->body->mime_headers;
98 }
99 }
100 if (!prot_headers && (e->security & SEC_ENCRYPT))
101 {
102 if (((WithCrypto & APPLICATION_PGP) != 0) &&
105 {
106 prot_headers = e->body->mime_headers;
107 }
109 {
110 prot_headers = e->body->mime_headers;
111 }
112 }
113
114 /* Update protected headers in the index and header cache. */
115 if (c_crypt_protected_headers_read && prot_headers && prot_headers->subject &&
116 !mutt_str_equal(e->env->subject, prot_headers->subject))
117 {
118 if (m->subj_hash && e->env->real_subj)
120
121 mutt_env_set_subject(e->env, prot_headers->subject);
122 FREE(&e->env->disp_subj);
123
124 if (m->subj_hash)
126
127 mx_save_hcache(m, e);
128
129 /* Also persist back to the message headers if this is set */
130 const bool c_crypt_protected_headers_save = cs_subset_bool(NeoMutt->sub, "crypt_protected_headers_save");
131 if (c_crypt_protected_headers_save)
132 {
134 e->changed = true;
135 m->changed = true;
136 }
137 }
138
139#ifdef USE_AUTOCRYPT
140 if (c_autocrypt && (e->security & SEC_ENCRYPT) && prot_headers && prot_headers->autocrypt_gossip)
141 {
143 }
144#endif
145}
int mutt_autocrypt_process_gossip_header(struct Email *e, struct Envelope *prot_headers)
Parse an Autocrypt email gossip header.
Definition autocrypt.c:404
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
SecurityFlags mutt_is_multipart_signed(struct Body *b)
Is a message signed?
Definition crypt.c:408
SecurityFlags mutt_is_application_smime(struct Body *b)
Does the message use S/MIME?
Definition crypt.c:609
int mutt_is_valid_multipart_pgp_encrypted(struct Body *b)
Is this a valid multi-part encrypted message?
Definition crypt.c:467
SecurityFlags mutt_is_malformed_multipart_pgp_encrypted(struct Body *b)
Check for malformed layout.
Definition crypt.c:504
void mutt_env_set_subject(struct Envelope *env, const char *subj)
Set both subject and real_subj to subj.
Definition envelope.c:68
#define MUTT_ENV_CHANGED_SUBJECT
Protected header update.
Definition envelope.h:37
struct HashElem * mutt_hash_insert(struct HashTable *table, const char *strkey, void *data)
Add a new element to the Hash Table (with string keys)
Definition hash.c:337
void mutt_hash_delete(struct HashTable *table, const char *strkey, const void *data)
Remove an element from a Hash Table.
Definition hash.c:429
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:662
int mx_save_hcache(struct Mailbox *m, struct Email *e)
Save message to the header cache - Wrapper for MxOps::msg_save_hcache()
Definition mx.c:1797
#define SEC_GOODSIGN
Email has a valid signature.
Definition lib.h:88
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition lib.h:98
#define APPLICATION_SMIME
Use SMIME to encrypt/sign.
Definition lib.h:99
#define SEC_ENCRYPT
Email is encrypted.
Definition lib.h:86
#define WithCrypto
Definition lib.h:124
#define SEC_SIGN
Email is signed.
Definition lib.h:87
struct Body * parts
parts of a multipart or message/rfc822
Definition body.h:73
struct Envelope * mime_headers
Memory hole protected headers.
Definition body.h:76
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 Body * body
List of MIME parts.
Definition email.h:69
bool changed
Email has been edited.
Definition email.h:77
The header of an Email.
Definition envelope.h:57
char *const subject
Email's subject.
Definition envelope.h:70
unsigned char changed
Changed fields, e.g. MUTT_ENV_CHANGED_SUBJECT.
Definition envelope.h:90
struct AutocryptHeader * autocrypt_gossip
Autocrypt Gossip header.
Definition envelope.h:88
char *const real_subj
Offset of the real subject.
Definition envelope.h:71
char * disp_subj
Display subject (modified copy of subject)
Definition envelope.h:72
bool changed
Mailbox has been modified.
Definition mailbox.h:109
struct HashTable * subj_hash
Hash Table: "subject" -> Email.
Definition mailbox.h:123
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ email_to_file()

static int email_to_file ( struct Message * msg,
struct Buffer * tempfile,
struct Mailbox * m,
struct Email * e,
const char * header,
int wrap_len,
CopyMessageFlags * cmflags )
static

Decrypt, decode and weed an Email into a file.

Parameters
msgRaw Email
tempfileTemporary filename for result
mMailbox
eEmail to display
headerHeader to prefix output (OPTIONAL)
wrap_lenWidth to wrap lines
cmflagsMessage flags, e.g. MUTT_CM_DECODE
Return values
0Success
-1Error
Note
Flags may be added to cmflags

Definition at line 161 of file message.c.

164{
165 int rc = 0;
166 pid_t filterpid = -1;
167
169
170 char columns[16] = { 0 };
171 // win_pager might not be visible and have a size yet, so use win_index
172 snprintf(columns, sizeof(columns), "%d", wrap_len);
173 envlist_set(&NeoMutt->env, "COLUMNS", columns, true);
174
175 /* see if crypto is needed for this message. if so, we should exit curses */
176 if ((WithCrypto != 0) && e->security)
177 {
178 if (e->security & SEC_ENCRYPT)
179 {
183 goto cleanup;
184
185 *cmflags |= MUTT_CM_VERIFY;
186 }
187 else if (e->security & SEC_SIGN)
188 {
189 /* find out whether or not the verify signature */
190 /* L10N: Used for the $crypt_verify_sig prompt */
191 if (query_quadoption(_("Verify signature?"), NeoMutt->sub, "crypt_verify_sig") == MUTT_YES)
192 {
193 *cmflags |= MUTT_CM_VERIFY;
194 }
195 }
196 }
197
198 if (*cmflags & MUTT_CM_VERIFY || e->security & SEC_ENCRYPT)
199 {
200 if (e->security & APPLICATION_PGP)
201 {
202 if (!TAILQ_EMPTY(&e->env->from))
204
206 }
207
210 }
211
212 FILE *fp_filter_out = NULL;
213 buf_mktemp(tempfile);
214 FILE *fp_out = mutt_file_fopen(buf_string(tempfile), "w");
215 if (!fp_out)
216 {
217 mutt_error(_("Could not create temporary file"));
218 goto cleanup;
219 }
220
221 const char *const c_display_filter = cs_subset_string(NeoMutt->sub, "display_filter");
222 if (c_display_filter)
223 {
224 fp_filter_out = fp_out;
225 fp_out = NULL;
226 filterpid = filter_create_fd(c_display_filter, &fp_out, NULL, NULL, -1,
227 fileno(fp_filter_out), -1, NeoMutt->env);
228 if (filterpid < 0)
229 {
230 mutt_error(_("Can't create display filter"));
231 mutt_file_fclose(&fp_filter_out);
232 unlink(buf_string(tempfile));
233 goto cleanup;
234 }
235 }
236
237 if (header)
238 {
239 fputs(header, fp_out);
240 fputs("\n\n", fp_out);
241 }
242
243 const bool c_weed = cs_subset_bool(NeoMutt->sub, "weed");
244 CopyHeaderFlags chflags = (c_weed ? (CH_WEED | CH_REORDER) : CH_NO_FLAGS) |
246#ifdef USE_NOTMUCH
247 if (m->type == MUTT_NOTMUCH)
248 chflags |= CH_VIRTUAL;
249#endif
250 rc = mutt_copy_message(fp_out, e, msg, *cmflags, chflags, wrap_len);
251
252 if (((mutt_file_fclose(&fp_out) != 0) && (errno != EPIPE)) || (rc < 0))
253 {
254 mutt_error(_("Could not copy message"));
255 if (fp_filter_out)
256 {
257 filter_wait(filterpid);
258 mutt_file_fclose(&fp_filter_out);
259 }
260 mutt_file_unlink(buf_string(tempfile));
261 goto cleanup;
262 }
263
264 if (fp_filter_out && (filter_wait(filterpid) != 0))
266
267 mutt_file_fclose(&fp_filter_out); /* XXX - check result? */
268
269 if (WithCrypto)
270 {
271 /* update crypto information for this message */
273 e->security |= crypt_query(e->body);
274
275 /* Remove color cache for this message, in case there
276 * are color patterns for both ~g and ~V */
277 e->attr_color = NULL;
278
279 /* Process protected headers and autocrypt gossip headers */
281 }
282
283cleanup:
284 envlist_unset(&NeoMutt->env, "COLUMNS");
285 return rc;
286}
void mutt_parse_mime_message(struct Email *e, FILE *fp)
Parse a MIME email.
Definition commands.c:627
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition helpers.c:291
int mutt_copy_message(FILE *fp_out, struct Email *e, struct Message *msg, CopyMessageFlags cmflags, CopyHeaderFlags chflags, int wraplen)
Copy a message from a Mailbox.
Definition copy_email.c:917
#define CH_DECODE
Do RFC2047 header decoding.
Definition copy_email.h:58
#define MUTT_CM_VERIFY
Do signature verification.
Definition copy_email.h:49
#define CH_FROM
Retain the "From " message separator?
Definition copy_email.h:60
#define CH_WEED
Weed the headers?
Definition copy_email.h:57
#define CH_REORDER
Re-order output of headers (specified by 'header-order')
Definition copy_email.h:63
#define CH_DISPLAY
Display result to user.
Definition copy_email.h:74
uint32_t CopyHeaderFlags
Flags for mutt_copy_header(), e.g. CH_UPDATE.
Definition copy_email.h:54
#define CH_VIRTUAL
Write virtual header lines too.
Definition copy_email.h:77
#define CH_NO_FLAGS
No flags are set.
Definition copy_email.h:55
@ MUTT_NOTMUCH
'Notmuch' (virtual) Mailbox type
Definition mailbox.h:50
bool crypt_valid_passphrase(SecurityFlags flags)
Check that we have a usable passphrase, ask if not.
Definition crypt.c:131
SecurityFlags crypt_query(struct Body *b)
Check out the type of encryption used.
Definition crypt.c:687
void crypt_invoke_message(SecurityFlags type)
Display an informative message.
Definition cryptglue.c:156
void crypt_smime_getkeys(struct Envelope *env)
Wrapper for CryptModuleSpecs::smime_getkeys()
Definition cryptglue.c:454
void crypt_pgp_invoke_getkeys(struct Address *addr)
Wrapper for CryptModuleSpecs::pgp_invoke_getkeys()
Definition cryptglue.c:273
int mutt_any_key_to_continue(const char *s)
Prompt the user to 'press any key' and wait.
Definition curs_lib.c:173
bool envlist_set(char ***envp, const char *name, const char *value, bool overwrite)
Set an environment variable.
Definition envlist.c:88
bool envlist_unset(char ***envp, const char *name)
Unset an environment variable.
Definition envlist.c:136
void mutt_file_unlink(const char *s)
Delete a file, carefully.
Definition file.c:156
#define mutt_file_fclose(FP)
Definition file.h:139
#define mutt_file_fopen(PATH, MODE)
Definition file.h:138
#define mutt_error(...)
Definition logging2.h:94
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
Definition filter.c:220
pid_t filter_create_fd(const char *cmd, FILE **fp_in, FILE **fp_out, FILE **fp_err, int fdin, int fdout, int fderr, char **envlist)
Run a command on a pipe (optionally connect stdin/stdout)
Definition filter.c:62
#define _(a)
Definition message.h:28
#define SEC_BADSIGN
Email has a bad signature.
Definition lib.h:89
static void process_protected_headers(struct Mailbox *m, struct Email *e)
Get the protected header and update the index.
Definition message.c:65
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
Definition quad.h:39
enum QuadOption query_quadoption(const char *prompt, struct ConfigSubset *sub, const char *name)
Ask the user a quad-question.
Definition question.c:378
#define TAILQ_FIRST(head)
Definition queue.h:780
#define TAILQ_EMPTY(head)
Definition queue.h:778
const struct AttrColor * attr_color
Color-pair to use when displaying in the index.
Definition email.h:112
struct AddressList from
Email's 'From' list.
Definition envelope.h:59
enum MailboxType type
Mailbox type.
Definition mailbox.h:101
FILE * fp
pointer to the message data
Definition message.h:35
char ** env
Private copy of the environment variables.
Definition neomutt.h:58
#define buf_mktemp(buf)
Definition tmp.h:33
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ external_pager()

int external_pager ( struct MailboxView * mv,
struct Email * e,
const char * command )

Display a message in an external program.

Parameters
mvMailbox view
eEmail to display
commandExternal command to run
Return values
0Success
-1Error

Definition at line 296 of file message.c.

297{
298 if (!mv || !mv->mailbox)
299 return -1;
300
301 struct Mailbox *m = mv->mailbox;
302 struct Message *msg = mx_msg_open(m, e);
303 if (!msg)
304 return -1;
305
306 struct Buffer *buf = buf_pool_get();
307 const struct Expando *c_pager_format = cs_subset_expando(NeoMutt->sub, "pager_format");
308 const int screen_width = RootWindow->state.cols;
309 mutt_make_string(buf, screen_width, c_pager_format, m, -1, e,
311
312 struct Buffer *tempfile = buf_pool_get();
313
315 int rc = email_to_file(msg, tempfile, m, e, buf_string(buf), screen_width, &cmflags);
316 if (rc < 0)
317 goto cleanup;
318
319 mutt_endwin();
320
321 struct Buffer *cmd = buf_pool_get();
322 buf_printf(cmd, "%s %s", command, buf_string(tempfile));
323 int r = mutt_system(buf_string(cmd));
324 if (r == -1)
325 mutt_error(_("Error running \"%s\""), buf_string(cmd));
326 unlink(buf_string(tempfile));
327 buf_pool_release(&cmd);
328
329 if (OptGui)
330 keypad(stdscr, true);
331 if (r != -1)
332 mutt_set_flag(m, e, MUTT_READ, true, true);
333 const bool c_prompt_after = cs_subset_bool(NeoMutt->sub, "prompt_after");
334 if ((r != -1) && c_prompt_after)
335 {
337 struct KeyEvent event = km_dokey(MdPager, GETCH_NO_FLAGS);
338 rc = event.op;
339 }
340 else
341 {
342 rc = 0;
343 }
344
345cleanup:
346 buf_pool_release(&buf);
347 mx_msg_close(m, &msg);
348 buf_pool_release(&tempfile);
349 return rc;
350}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition buffer.c:161
const struct Expando * cs_subset_expando(const struct ConfigSubset *sub, const char *name)
Get an Expando config item by name.
#define MUTT_CM_DECODE
Decode the message body into text/plain.
Definition copy_email.h:40
#define MUTT_CM_CHARCONV
Perform character set conversions.
Definition copy_email.h:44
uint16_t CopyMessageFlags
Flags for mutt_copy_message(), e.g. MUTT_CM_NOHEADER.
Definition copy_email.h:36
#define MUTT_CM_DISPLAY
Output is displayed to the user.
Definition copy_email.h:41
void mutt_endwin(void)
Shutdown curses.
Definition curs_lib.c:151
int mutt_make_string(struct Buffer *buf, size_t max_cols, const struct Expando *exp, struct Mailbox *m, int inpgr, struct Email *e, MuttFormatFlags flags, const char *progress)
Create formatted strings using mailbox expandos.
Definition dlg_index.c:802
void mutt_set_flag(struct Mailbox *m, struct Email *e, enum MessageType flag, bool bf, bool upd_mbox)
Set a flag on an email.
Definition flags.c:54
struct KeyEvent km_dokey(const struct MenuDefinition *md, GetChFlags flags)
Determine what a keypress should do.
Definition get.c:434
void mutt_unget_ch(int ch)
Return a keystroke to the input buffer.
Definition get.c:122
#define GETCH_NO_FLAGS
No flags are set.
Definition get.h:34
bool OptGui
(pseudo) when the gui (and curses) are started
Definition globals.c:48
int mutt_system(const char *cmd)
Run an external command.
Definition system.c:51
@ MUTT_READ
Messages that have been read.
Definition mutt.h:92
int mx_msg_close(struct Mailbox *m, struct Message **ptr)
Close a message.
Definition mx.c:1182
struct Message * mx_msg_open(struct Mailbox *m, struct Email *e)
Return a stream pointer for a message.
Definition mx.c:1136
struct MenuDefinition * MdPager
Pager Menu Definition.
Definition functions.c:64
static int email_to_file(struct Message *msg, struct Buffer *tempfile, struct Mailbox *m, struct Email *e, const char *header, int wrap_len, CopyMessageFlags *cmflags)
Decrypt, decode and weed an Email into a file.
Definition message.c:161
static const char * ExtPagerProgress
Status bar message when entire message is visible in the Pager.
Definition message.c:58
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
#define MUTT_FORMAT_NO_FLAGS
No flags are set.
Definition render.h:33
struct MuttWindow * RootWindow
Parent of all Windows.
Definition rootwin.c:106
String manipulation buffer.
Definition buffer.h:36
Parsed Expando trees.
Definition expando.h:41
An event such as a keypress.
Definition get.h:50
struct Mailbox * mailbox
Current Mailbox.
Definition mview.h:51
A mailbox.
Definition mailbox.h:78
A local copy of an email.
Definition message.h:34
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ notify_crypto()

static void notify_crypto ( struct Email * e,
struct Message * msg,
CopyMessageFlags cmflags )
static

Notify the user about the crypto status of the Email.

Parameters
eEmail to display
msgRaw Email
cmflagsMessage flags, e.g. MUTT_CM_DECODE

Definition at line 358 of file message.c.

359{
360 if ((WithCrypto != 0) && (e->security & APPLICATION_SMIME) && (cmflags & MUTT_CM_VERIFY))
361 {
362 if (e->security & SEC_GOODSIGN)
363 {
364 if (crypt_smime_verify_sender(e, msg) == 0)
365 mutt_message(_("S/MIME signature successfully verified"));
366 else
367 mutt_error(_("S/MIME certificate owner does not match sender"));
368 }
369 else if (e->security & SEC_PARTSIGN)
370 {
371 mutt_message(_("Warning: Part of this message has not been signed"));
372 }
373 else if (e->security & SEC_SIGN || e->security & SEC_BADSIGN)
374 {
375 mutt_error(_("S/MIME signature could NOT be verified"));
376 }
377 }
378
379 if ((WithCrypto != 0) && (e->security & APPLICATION_PGP) && (cmflags & MUTT_CM_VERIFY))
380 {
381 if (e->security & SEC_GOODSIGN)
382 mutt_message(_("PGP signature successfully verified"));
383 else if (e->security & SEC_PARTSIGN)
384 mutt_message(_("Warning: Part of this message has not been signed"));
385 else if (e->security & SEC_SIGN)
386 mutt_message(_("PGP signature could NOT be verified"));
387 }
388}
int crypt_smime_verify_sender(struct Email *e, struct Message *msg)
Wrapper for CryptModuleSpecs::smime_verify_sender()
Definition cryptglue.c:463
#define mutt_message(...)
Definition logging2.h:93
#define SEC_PARTSIGN
Not all parts of the email is signed.
Definition lib.h:90
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ squash_index_panel()

static void squash_index_panel ( struct Mailbox * m,
struct MuttWindow * win_index,
struct MuttWindow * win_pager )
static

Shrink or hide the Index Panel.

Parameters
mMailbox
win_indexIndex Window
win_pagerPager Window

Definition at line 396 of file message.c.

398{
399 const short c_pager_index_lines = cs_subset_number(NeoMutt->sub, "pager_index_lines");
400 if (c_pager_index_lines > 0)
401 {
402 win_index->size = MUTT_WIN_SIZE_FIXED;
403 win_index->req_rows = c_pager_index_lines;
404 win_index->parent->size = MUTT_WIN_SIZE_MINIMISE;
405 }
406 window_set_visible(win_index->parent, (c_pager_index_lines > 0));
407
408 window_set_visible(win_pager->parent, true);
409
410 struct MuttWindow *dlg = dialog_find(win_index);
412
413 // Force the menu to reframe itself
414 struct Menu *menu = win_index->wdata;
415 menu_set_index(menu, menu_get_index(menu));
416}
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition helpers.c:143
struct MuttWindow * dialog_find(struct MuttWindow *win)
Find the parent Dialog of a Window.
Definition dialog.c:89
int menu_get_index(struct Menu *menu)
Get the current selection in the Menu.
Definition menu.c:164
MenuRedrawFlags menu_set_index(struct Menu *menu, int index)
Set the current selection in the Menu.
Definition menu.c:178
void mutt_window_reflow(struct MuttWindow *win)
Resize a Window and its children.
void window_set_visible(struct MuttWindow *win, bool visible)
Set a Window visible or hidden.
@ MUTT_WIN_SIZE_FIXED
Window has a fixed size.
Definition mutt_window.h:47
@ MUTT_WIN_SIZE_MINIMISE
Window size depends on its children.
Definition mutt_window.h:49
Definition lib.h:80
void * wdata
Private data.
short req_rows
Number of rows required.
struct MuttWindow * parent
Parent Window.
enum MuttWindowSize size
Type of Window, e.g. MUTT_WIN_SIZE_FIXED.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ expand_index_panel()

static void expand_index_panel ( struct MuttWindow * win_index,
struct MuttWindow * win_pager )
static

Restore the Index Panel.

Parameters
win_indexIndex Window
win_pagerPager Window

Definition at line 423 of file message.c.

424{
425 win_index->size = MUTT_WIN_SIZE_MAXIMISE;
427 win_index->parent->size = MUTT_WIN_SIZE_MAXIMISE;
429 window_set_visible(win_index->parent, true);
430
431 window_set_visible(win_pager->parent, false);
432
433 struct MuttWindow *dlg = dialog_find(win_index);
435}
#define MUTT_WIN_SIZE_UNLIMITED
Use as much space as possible.
Definition mutt_window.h:52
@ MUTT_WIN_SIZE_MAXIMISE
Window wants as much space as possible.
Definition mutt_window.h:48
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_display_message()

int mutt_display_message ( struct MuttWindow * win_index,
struct IndexSharedData * shared )

Display a message in the pager.

Parameters
win_indexIndex Window
sharedShared Index data
Return values
0Success
-1Error

Definition at line 444 of file message.c.

445{
446 struct MuttWindow *dlg = dialog_find(win_index);
447 struct MuttWindow *win_pager = window_find_child(dlg, WT_CUSTOM);
448 struct MuttWindow *win_pbar = window_find_child(dlg, WT_STATUS_BAR);
449 struct Buffer *tempfile = buf_pool_get();
450 struct Message *msg = NULL;
451
452 squash_index_panel(shared->mailbox, win_index, win_pager);
453
454 int rc = PAGER_LOOP_QUIT;
455 do
456 {
457 msg = mx_msg_open(shared->mailbox, shared->email);
458 if (!msg)
459 break;
460
462
463 buf_reset(tempfile);
464 // win_pager might not be visible and have a size yet, so use win_index
465 rc = email_to_file(msg, tempfile, shared->mailbox, shared->email, NULL,
466 win_index->state.cols, &cmflags);
467 if (rc < 0)
468 break;
469
470 notify_crypto(shared->email, msg, cmflags);
471
472 /* Invoke the built-in pager */
473 struct PagerData pdata = { 0 };
474 struct PagerView pview = { &pdata };
475
476 pdata.fp = msg->fp;
477 pdata.fname = buf_string(tempfile);
478
479 pview.mode = PAGER_MODE_EMAIL;
480 pview.banner = NULL;
481 pview.flags = MUTT_PAGER_MESSAGE |
482 (shared->email->body->nowrap ? MUTT_PAGER_NOWRAP : 0);
483 pview.win_index = win_index;
484 pview.win_pbar = win_pbar;
485 pview.win_pager = win_pager;
486
487 rc = dlg_pager(&pview);
488 mx_msg_close(shared->mailbox, &msg);
489 } while (rc == PAGER_LOOP_RELOAD);
490
492
493 mx_msg_close(shared->mailbox, &msg);
494 buf_pool_release(&tempfile);
495 return rc;
496}
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition buffer.c:76
int dlg_pager(struct PagerView *pview)
Display an email, attachment, or help, in a window -.
Definition dlg_pager.c:215
struct MuttWindow * window_find_child(struct MuttWindow *win, enum WindowType type)
Recursively find a child Window of a given type.
@ WT_CUSTOM
Window with a custom drawing function.
Definition mutt_window.h:94
@ WT_STATUS_BAR
Status Bar containing extra info about the Index/Pager/etc.
@ PAGER_LOOP_RELOAD
Reload the Pager from scratch.
Definition lib.h:154
@ PAGER_LOOP_QUIT
Quit the Pager.
Definition lib.h:153
#define MUTT_PAGER_NOWRAP
Format for term width, ignore $wrap.
Definition lib.h:73
@ PAGER_MODE_EMAIL
Pager is invoked via 1st path. The mime part is selected automatically.
Definition lib.h:138
#define MUTT_PAGER_MESSAGE
Definition lib.h:77
static void expand_index_panel(struct MuttWindow *win_index, struct MuttWindow *win_pager)
Restore the Index Panel.
Definition message.c:423
static void notify_crypto(struct Email *e, struct Message *msg, CopyMessageFlags cmflags)
Notify the user about the crypto status of the Email.
Definition message.c:358
static void squash_index_panel(struct Mailbox *m, struct MuttWindow *win_index, struct MuttWindow *win_pager)
Shrink or hide the Index Panel.
Definition message.c:396
bool nowrap
Do not wrap the output in the pager.
Definition body.h:89
struct Email * email
Currently selected Email.
Definition shared_data.h:42
struct Mailbox * mailbox
Current Mailbox.
Definition shared_data.h:41
struct WindowState state
Current state of the Window.
Data to be displayed by PagerView.
Definition lib.h:161
const char * fname
Name of the file to read.
Definition lib.h:165
FILE * fp
Source stream.
Definition lib.h:163
Paged view into some data.
Definition lib.h:172
struct MuttWindow * win_index
Index Window.
Definition lib.h:178
struct PagerData * pdata
Data that pager displays. NOTNULL.
Definition lib.h:173
enum PagerMode mode
Pager mode.
Definition lib.h:174
PagerFlags flags
Additional settings to tweak pager's function.
Definition lib.h:175
const char * banner
Title to display in status bar.
Definition lib.h:176
struct MuttWindow * win_pbar
Pager Bar Window.
Definition lib.h:179
struct MuttWindow * win_pager
Pager Window.
Definition lib.h:180
short cols
Number of columns, can be MUTT_WIN_SIZE_UNLIMITED.
Definition mutt_window.h:60
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ ExtPagerProgress

const char* ExtPagerProgress = N_("all")
static

Status bar message when entire message is visible in the Pager.

Definition at line 58 of file message.c.