NeoMutt  2025-12-11-694-ga89709
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
GUI: Dialog Windows

A Dialog is an interactive set of windows allowing the user to perform some task. More...

Functions

static bool dlg_alias (struct AliasMenuData *mdata)
 Display a menu of Aliases -.
 
static bool dlg_query (struct Buffer *buf, struct AliasMenuData *mdata)
 Get the user to enter an Address Query -.
 
void dlg_attach (struct ConfigSubset *sub, struct MailboxView *mv, struct Email *e, FILE *fp, bool attach_msg)
 Show the attachments in a Menu -.
 
void dlg_autocrypt (void)
 Display the Autocrypt account Menu -.
 
void dlg_browser (struct Buffer *file, SelectFileFlags flags, struct Mailbox *m, char ***files, int *numfiles)
 Let the user select a file -.
 
int dlg_compose (struct Email *e, struct Buffer *fcc, uint8_t flags, struct ConfigSubset *sub)
 Allow the user to edit the message envelope -.
 
int dlg_certificate (const char *title, struct StringArray *carr, bool allow_always, bool allow_skip)
 Ask the user to validate the certificate -.
 
void dlg_history (struct Buffer *buf, struct StringArray *matches)
 Select an item from a history list -.
 
struct Mailboxdlg_index (struct MuttWindow *dlg, struct Mailbox *m_init)
 Display a list of emails -.
 
struct CryptKeyInfodlg_gpgme (struct CryptKeyInfo *keys, struct Address *p, const char *s, unsigned int app, bool *forced_valid)
 Get the user to select a key -.
 
struct PgpKeyInfodlg_pgp (struct PgpKeyInfo *keys, struct Address *p, const char *s)
 Let the user select a key to use -.
 
struct SmimeKeydlg_smime (struct SmimeKey *keys, const char *query)
 Get the user to select a key -.
 
int dlg_pager (struct PagerView *pview)
 Display an email, attachment, or help, in a window -.
 
bool dlg_pattern (struct Buffer *buf)
 Show menu to select a Pattern -.
 
struct Emaildlg_postpone (struct Mailbox *m)
 Create a Menu to select a postponed message -.
 

Detailed Description

A Dialog is an interactive set of windows allowing the user to perform some task.

The All Dialogs window is a container window and not visible. All active dialogs will be children of this window, though only one will be active at a time.

Windows

Name Type Constructor
All Dialogs WT_ALL_DIALOGS alldialogs_new()

Parent

Children

The All Dialogs window has many possible children, e.g.

Data

The All Dialogs window has no data.

Events

Once constructed, it is controlled by the following events:

Event Type Handler
NT_WINDOW alldialogs_window_observer()

The All Dialogs window does not implement MuttWindow::recalc() or MuttWindow::repaint().

Function Documentation

◆ dlg_alias()

static bool dlg_alias ( struct AliasMenuData * mdata)
static

Display a menu of Aliases -.

Parameters
mdataMenu data holding Aliases
Return values
trueSelection was made

The Alias Dialog is an Address Book. The user can select addresses to add to an Email.

Definition at line 267 of file dlg_alias.c.

268{
269 if (ARRAY_EMPTY(&mdata->ava))
270 {
271 mutt_warning(_("You have no aliases"));
272 return false;
273 }
274
275 mdata->title = mutt_str_dup(_("Aliases"));
276
277 struct SimpleDialogWindows sdw = alias_dialog_new(mdata);
278 struct Menu *menu = sdw.menu;
279 mdata->menu = menu;
280 mdata->sbar = sdw.sbar;
281
282 alias_array_sort(&mdata->ava, mdata->sub);
283
284 struct AliasView *avp = NULL;
285 ARRAY_FOREACH(avp, &mdata->ava)
286 {
287 avp->num = ARRAY_FOREACH_IDX_avp;
288 }
289
290 struct MuttWindow *old_focus = window_set_focus(menu->win);
291 // ---------------------------------------------------------------------------
292 // Event Loop
293 int rc = 0;
294 int op = OP_NULL;
295 struct KeyEvent event = { 0, OP_NULL };
296 do
297 {
298 menu_tagging_dispatcher(menu->win, &event);
299 window_redraw(NULL);
300
302 op = event.op;
303 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
304 if (op < 0)
305 continue;
306 if (op == OP_NULL)
307 {
309 continue;
310 }
312
313 rc = alias_function_dispatcher(sdw.dlg, &event);
314 if (rc == FR_UNKNOWN)
315 rc = menu_function_dispatcher(menu->win, &event);
316 if (rc == FR_UNKNOWN)
317 rc = global_function_dispatcher(menu->win, &event);
318 } while ((rc != FR_DONE) && (rc != FR_CONTINUE));
319 // ---------------------------------------------------------------------------
320
321 window_set_focus(old_focus);
323 window_redraw(NULL);
324 return (rc == FR_CONTINUE); // Was a selection made?
325}
struct MenuDefinition * MdAlias
Alias Menu Definition.
Definition functions.c:51
void alias_array_sort(struct AliasViewArray *ava, const struct ConfigSubset *sub)
Sort and reindex an AliasViewArray.
Definition sort.c:235
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition array.h:223
#define ARRAY_EMPTY(head)
Check if an array is empty.
Definition array.h:74
@ FR_DONE
Exit the Dialog.
Definition dispatcher.h:36
@ FR_UNKNOWN
Unknown function.
Definition dispatcher.h:34
@ FR_CONTINUE
Remain in the Dialog.
Definition dispatcher.h:35
static struct SimpleDialogWindows alias_dialog_new(struct AliasMenuData *mdata)
Create an Alias Selection Dialog.
Definition dlg_alias.c:232
struct KeyEvent km_dokey(const struct MenuDefinition *md, GetChFlags flags)
Determine what a keypress should do.
Definition get.c:434
void km_error_key(const struct MenuDefinition *md)
Handle an unbound key sequence.
Definition get.c:285
#define GETCH_NO_FLAGS
No flags are set.
Definition get.h:34
int alias_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Alias function - Implements function_dispatcher_t -.
Definition functions.c:501
int menu_tagging_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform tagging operations on the Menu - Implements function_dispatcher_t -.
Definition tagging.c:230
int global_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Global function - Implements function_dispatcher_t -.
Definition global.c:182
int menu_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Menu function - Implements function_dispatcher_t -.
Definition functions.c:320
#define mutt_warning(...)
Definition logging2.h:92
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
void simple_dialog_free(struct MuttWindow **ptr)
Destroy a simple index Dialog.
Definition simple.c:169
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
#define _(a)
Definition message.h:28
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition string.c:257
void mutt_clear_error(void)
Clear the message line (bottom line of screen)
void window_redraw(struct MuttWindow *win)
Reflow, recalc and repaint a tree of Windows.
struct MuttWindow * window_set_focus(struct MuttWindow *win)
Set the Window focus.
const char * opcodes_get_name(int op)
Get the name of an opcode.
Definition opcodes.c:48
struct AliasViewArray ava
All Aliases/Queries.
Definition gui.h:55
char * title
Title for the status bar.
Definition gui.h:62
GUI data wrapping an Alias.
Definition gui.h:38
int num
Index number in list.
Definition gui.h:39
An event such as a keypress.
Definition get.h:50
int op
Function opcode, e.g. OP_HELP.
Definition get.h:52
Definition lib.h:80
struct MuttWindow * win
Window holding the Menu.
Definition lib.h:88
void * mdata
Private data.
Definition lib.h:149
Tuple for the results of simple_dialog_new()
Definition simple.h:35
struct MuttWindow * sbar
Simple Bar.
Definition simple.h:37
struct Menu * menu
Menu.
Definition simple.h:38
struct MuttWindow * dlg
Main Dialog Window.
Definition simple.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_query()

static bool dlg_query ( struct Buffer * buf,
struct AliasMenuData * mdata )
static

Get the user to enter an Address Query -.

Parameters
bufBuffer for the query
mdataMenu data holding Aliases
Return values
trueSelection was made

The Select Query Dialog is an Address Book. It is dynamically created from an external source using $query_command.

The user can select addresses to add to an Email.

Definition at line 347 of file dlg_query.c.

348{
349 struct SimpleDialogWindows sdw = query_dialog_new(mdata, buf_string(buf));
350 struct Menu *menu = sdw.menu;
351 mdata->menu = menu;
352 mdata->sbar = sdw.sbar;
353 mdata->query = buf;
354
355 alias_array_sort(&mdata->ava, mdata->sub);
356
357 struct AliasView *avp = NULL;
358 ARRAY_FOREACH(avp, &mdata->ava)
359 {
360 avp->num = ARRAY_FOREACH_IDX_avp;
361 }
362
363 struct MuttWindow *old_focus = window_set_focus(menu->win);
364 // ---------------------------------------------------------------------------
365 // Event Loop
366 int rc = 0;
367 int op = OP_NULL;
368 struct KeyEvent event = { 0, OP_NULL };
369 do
370 {
371 menu_tagging_dispatcher(menu->win, &event);
372 window_redraw(NULL);
373
375 op = event.op;
376 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
377 if (op < 0)
378 continue;
379 if (op == OP_NULL)
380 {
382 continue;
383 }
385
386 rc = alias_function_dispatcher(sdw.dlg, &event);
387 if (rc == FR_UNKNOWN)
388 rc = menu_function_dispatcher(menu->win, &event);
389 if (rc == FR_UNKNOWN)
390 rc = global_function_dispatcher(menu->win, &event);
391 } while ((rc != FR_DONE) && (rc != FR_CONTINUE));
392 // ---------------------------------------------------------------------------
393
394 window_set_focus(old_focus);
396 window_redraw(NULL);
397 return (rc == FR_CONTINUE); // Was a selection made?
398}
struct MenuDefinition * MdQuery
Query Menu Definition.
Definition functions.c:53
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
static struct SimpleDialogWindows query_dialog_new(struct AliasMenuData *mdata, const char *query)
Create an Query Selection Dialog.
Definition dlg_query.c:306
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_attach()

void dlg_attach ( struct ConfigSubset * sub,
struct MailboxView * mv,
struct Email * e,
FILE * fp,
bool attach_msg )

Show the attachments in a Menu -.

Parameters
subConfig Subset
mvMailbox view
eEmail
fpFile with the content of the email, or NULL
attach_msgAre we in "attach message" mode?

The Select Attachment dialog shows an Email's attachments. They can be viewed using the Pager or Mailcap programs. They can also be saved, printed, deleted, etc.

Definition at line 207 of file dlg_attach.c.

209{
210 if (!mv || !mv->mailbox || !e || !fp)
211 return;
212
213 struct Mailbox *m = mv->mailbox;
214
215 /* make sure we have parsed this message */
218
220 struct Menu *menu = sdw.menu;
222 menu->tag = attach_tag;
223
224 struct AttachCtx *actx = mutt_actx_new();
225 actx->email = e;
226 actx->fp_root = fp;
227 mutt_update_recvattach_menu(actx, menu, true);
228
230 priv->menu = menu;
231 priv->actx = actx;
232 priv->sub = sub;
233 priv->mailbox = m;
234 priv->attach_msg = attach_msg;
235 menu->mdata = priv;
237
238 // NT_COLOR is handled by the SimpleDialog
241
242 sbar_set_title(sdw.sbar, _("Attachments"));
243
244 struct MuttWindow *old_focus = window_set_focus(menu->win);
245 // ---------------------------------------------------------------------------
246 // Event Loop
247 int rc = 0;
248 int op = OP_NULL;
249 struct KeyEvent event = { 0, OP_NULL };
250 do
251 {
252 menu_tagging_dispatcher(menu->win, &event);
253 window_redraw(NULL);
254
256 op = event.op;
257 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
258 if (op < 0)
259 continue;
260 if (op == OP_NULL)
261 {
263 continue;
264 }
266
267 rc = attach_function_dispatcher(sdw.dlg, &event);
268 if (rc == FR_UNKNOWN)
269 rc = menu_function_dispatcher(menu->win, &event);
270 if (rc == FR_UNKNOWN)
271 rc = global_function_dispatcher(menu->win, &event);
272
273 if (rc == FR_CONTINUE)
274 {
275 event.op = priv->op;
276 }
277
278 } while (rc != FR_DONE);
279 // ---------------------------------------------------------------------------
280
281 window_set_focus(old_focus);
283}
struct AttachCtx * mutt_actx_new(void)
Create a new Attachment Context.
Definition attach.c:189
void mutt_parse_mime_message(struct Email *e, FILE *fp)
Parse a MIME email.
Definition commands.c:627
struct MenuDefinition * MdAttach
Attach Menu Definition.
Definition functions.c:55
struct AttachPrivateData * attach_private_data_new(void)
Create new Attach Data.
@ CMD_MESSAGE_HOOK
:message-hook
Definition command.h:94
static const struct Mapping AttachmentHelp[]
Help Bar for the Attachment selection dialog.
Definition dlg_attach.c:91
int attach_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Attach function - Implements function_dispatcher_t -.
Definition functions.c:733
static int attach_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format an Attachment for the Menu - Implements Menu::make_entry() -.
Definition dlg_attach.c:131
void attach_private_data_free(struct Menu *menu, void **ptr)
Free the Attach Data - Implements Menu::mdata_free() -.
static int attach_tag(struct Menu *menu, int sel, int act)
Tag an attachment - Implements Menu::tag() -.
Definition dlg_attach.c:153
static int attach_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
Definition dlg_attach.c:107
static int attach_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition dlg_attach.c:172
struct SimpleDialogWindows simple_dialog_new(const struct MenuDefinition *md, enum WindowType wtype, const struct Mapping *help_data)
Create a simple index Dialog.
Definition simple.c:132
void exec_message_hook(struct Mailbox *m, struct Email *e, enum CommandId id)
Perform a message hook.
Definition exec.c:135
bool notify_observer_add(struct Notify *notify, enum NotifyType type, observer_t callback, void *global_data)
Add an observer to an object.
Definition notify.c:191
@ WT_DLG_ATTACH
Attach Dialog, dlg_attach()
Definition mutt_window.h:78
@ NT_WINDOW
MuttWindow has changed, NotifyWindow, EventWindow.
Definition notify_type.h:57
@ NT_CONFIG
Config has changed, NotifyConfig, EventConfig.
Definition notify_type.h:43
void mutt_update_recvattach_menu(struct AttachCtx *actx, struct Menu *menu, bool init)
Update the Attachment Menu.
void sbar_set_title(struct MuttWindow *win, const char *title)
Set the title for the Simple Bar.
Definition sbar.c:227
A set of attachments.
Definition attach.h:63
FILE * fp_root
Used by recvattach for updating.
Definition attach.h:65
struct Email * email
Used by recvattach for updating.
Definition attach.h:64
Private state data for Attachments.
int op
Op returned from the Pager, e.g. OP_NEXT_ENTRY.
struct Menu * menu
Current Menu.
struct ConfigSubset * sub
Config subset.
struct AttachCtx * actx
List of all Attachments.
bool attach_msg
Are we in "attach message" mode?
struct Mailbox * mailbox
Current Mailbox.
struct Notify * notify
Notifications: NotifyConfig, EventConfig.
Definition subset.h:51
struct Mailbox * mailbox
Current Mailbox.
Definition mview.h:51
A mailbox.
Definition mailbox.h:78
void(* mdata_free)(struct Menu *menu, void **ptr)
Definition lib.h:163
int(* tag)(struct Menu *menu, int sel, int act)
Definition lib.h:133
int(* make_entry)(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Definition lib.h:108
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
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:

◆ dlg_autocrypt()

void dlg_autocrypt ( void )

Display the Autocrypt account Menu -.

The Autocrypt Dialog lets the user select an Autocrypt Account to use.

Definition at line 240 of file dlg_autocrypt.c.

241{
242 const bool c_autocrypt = cs_subset_bool(NeoMutt->sub, "autocrypt");
243 if (!c_autocrypt)
244 return;
245
246 if (mutt_autocrypt_init(false))
247 return;
248
250
251 struct Menu *menu = sdw.menu;
252
253 struct AutocryptData *ad = autocrypt_data_new();
254 ad->menu = menu;
255
257 menu->mdata = ad;
259
261
262 // L10N: Autocrypt Account Management Menu title
263 sbar_set_title(sdw.sbar, _("Autocrypt Accounts"));
264
265 // NT_COLOR is handled by the SimpleDialog
268
269 struct MuttWindow *old_focus = window_set_focus(menu->win);
270 // ---------------------------------------------------------------------------
271 // Event Loop
272 int op = OP_NULL;
273 struct KeyEvent event = { 0, OP_NULL };
274 do
275 {
276 menu_tagging_dispatcher(menu->win, &event);
277 window_redraw(NULL);
278
280 op = event.op;
281 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
282 if (op < 0)
283 continue;
284 if (op == OP_NULL)
285 {
287 continue;
288 }
290
291 int rc = autocrypt_function_dispatcher(sdw.dlg, &event);
292
293 if (rc == FR_UNKNOWN)
294 rc = menu_function_dispatcher(menu->win, &event);
295 if (rc == FR_UNKNOWN)
296 rc = global_function_dispatcher(menu->win, &event);
297 } while (!ad->done);
298 // ---------------------------------------------------------------------------
299
300 window_set_focus(old_focus);
302}
struct MenuDefinition * MdAutocrypt
Autocrypt Menu Definition.
Definition functions.c:46
int mutt_autocrypt_init(bool can_create)
Initialise Autocrypt.
Definition autocrypt.c:103
struct AutocryptData * autocrypt_data_new(void)
Create new Autocrypt Data.
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
static const struct Mapping AutocryptHelp[]
Help Bar for the Autocrypt Account selection dialog.
bool populate_menu(struct Menu *menu)
Add the Autocrypt data to a Menu.
int autocrypt_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Autocrypt function - Implements function_dispatcher_t -.
Definition functions.c:226
static int autocrypt_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format an Autocrypt Account for the Menu - Implements Menu::make_entry() -.
void autocrypt_data_free(struct Menu *menu, void **ptr)
Free Autocrypt Data - Implements Menu::mdata_free() -.
static int autocrypt_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
static int autocrypt_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
@ WT_DLG_AUTOCRYPT
Autocrypt Dialog, dlg_autocrypt()
Definition mutt_window.h:79
Data to pass to the Autocrypt Functions.
bool done
Should we close the Dialog?
struct Menu * menu
Autocrypt Menu.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_browser()

void dlg_browser ( struct Buffer * file,
SelectFileFlags flags,
struct Mailbox * m,
char *** files,
int * numfiles )

Let the user select a file -.

Parameters
[in]fileBuffer for the result
[in]flagsFlags, see SelectFileFlags
[in]mMailbox
[out]filesArray of selected files
[out]numfilesNumber of selected files

The Select File Dialog is a file browser. It allows the user to select a file or directory to use.

Definition at line 857 of file dlg_browser.c.

859{
861 priv->file = file;
862 priv->mailbox = m;
863 priv->files = files;
864 priv->numfiles = numfiles;
865 priv->multiple = (flags & MUTT_SEL_MULTI);
866 priv->folder = (flags & MUTT_SEL_FOLDER);
867 priv->state.is_mailbox_list = (flags & MUTT_SEL_MAILBOX) && priv->folder;
868 priv->last_selected_mailbox = -1;
869
870 init_lastdir();
871
872 if (OptNews)
873 {
874 if (buf_is_empty(file))
875 {
877
878 /* default state for news reader mode is browse subscribed newsgroups */
879 priv->state.is_mailbox_list = false;
880 for (size_t i = 0; i < adata->groups_num; i++)
881 {
882 struct NntpMboxData *mdata = adata->groups_list[i];
883 if (mdata && mdata->subscribed)
884 {
885 priv->state.is_mailbox_list = true;
886 break;
887 }
888 }
889 }
890 else
891 {
892 buf_copy(priv->prefix, file);
893 }
894 }
895 else if (!buf_is_empty(file))
896 {
897 expand_path(file, false);
898 if (imap_path_probe(buf_string(file), NULL) == MUTT_IMAP)
899 {
900 init_state(&priv->state);
901 priv->state.imap_browse = true;
902 if (imap_browse(buf_string(file), &priv->state) == 0)
903 {
904 buf_strcpy(&LastDir, priv->state.folder);
905 browser_sort(&priv->state);
906 }
907 }
908 else
909 {
910 int i = buf_len(file);
911 i--;
912 for (; (i > 0) && ((buf_string(file))[i] != '/'); i--)
913 {
914 ; // do nothing
915 }
916
917 if (i > 0)
918 {
919 if ((buf_string(file))[0] == '/')
920 {
921 buf_strcpy_n(&LastDir, buf_string(file), i);
922 }
923 else
924 {
926 buf_addch(&LastDir, '/');
927 buf_addstr_n(&LastDir, buf_string(file), i);
928 }
929 }
930 else
931 {
932 if ((buf_string(file))[0] == '/')
933 buf_strcpy(&LastDir, "/");
934 else
936 }
937
938 if ((i <= 0) && (buf_string(file)[0] != '/'))
939 buf_copy(priv->prefix, file);
940 else
941 buf_strcpy(priv->prefix, buf_string(file) + i + 1);
942 priv->kill_prefix = true;
943 }
944 }
945 else
946 {
947 if (priv->folder)
948 {
949 /* Whether we use the tracking feature of the browser depends
950 * on which sort method we chose to use. This variable is defined
951 * only to help readability of the code. */
952 bool browser_track = false;
953
954 const enum EmailSortType c_browser_sort = cs_subset_sort(NeoMutt->sub, "browser_sort");
955 switch (c_browser_sort & SORT_MASK)
956 {
960 browser_track = true;
961 break;
962 }
963
964 /* We use mutt_browser_select_dir to initialize the two
965 * variables (LastDir, LastDirBackup) at the appropriate
966 * values.
967 *
968 * We do it only when LastDir is not set (first pass there)
969 * or when CurrentFolder and LastDirBackup are not the same.
970 * This code is executed only when we list files, not when
971 * we press up/down keys to navigate in a displayed list.
972 *
973 * We only do this when CurrentFolder has been set (ie, not
974 * when listing folders on startup with "neomutt -y").
975 *
976 * This tracker is only used when browser_track is true,
977 * meaning only with sort methods SUBJECT/DESC for now. */
978 if (CurrentFolder)
979 {
980 if (buf_is_empty(&LastDir))
981 {
982 /* If browsing in "local"-mode, than we chose to define LastDir to
983 * MailDir */
985 {
986 case MUTT_IMAP:
987 case MUTT_MAILDIR:
988 case MUTT_MBOX:
989 case MUTT_MH:
990 case MUTT_MMDF:
991 {
992 const char *const c_folder = cs_subset_string(NeoMutt->sub, "folder");
993 const char *const c_spool_file = cs_subset_string(NeoMutt->sub, "spool_file");
994 if (c_folder)
995 buf_strcpy(&LastDir, c_folder);
996 else if (c_spool_file)
997 mutt_browser_select_dir(c_spool_file);
998 break;
999 }
1000 default:
1002 break;
1003 }
1004 }
1006 {
1008 }
1009 }
1010
1011 /* When browser tracking feature is disabled, clear LastDirBackup */
1012 if (!browser_track)
1014 }
1015 else
1016 {
1018 }
1019
1020 if (!priv->state.is_mailbox_list &&
1022 {
1023 init_state(&priv->state);
1024 priv->state.imap_browse = true;
1025 imap_browse(buf_string(&LastDir), &priv->state);
1026 browser_sort(&priv->state);
1027 }
1028 else
1029 {
1030 size_t i = buf_len(&LastDir);
1031 while ((i > 0) && (buf_string(&LastDir)[--i] == '/'))
1032 LastDir.data[i] = '\0';
1034 if (buf_is_empty(&LastDir))
1036 }
1037 }
1038
1039 buf_reset(file);
1040
1041 const struct Mapping *help_data = NULL;
1042
1043 if (OptNews)
1044 help_data = FolderNewsHelp;
1045 else
1046 help_data = FolderHelp;
1047
1049
1050 struct Menu *menu = sdw.menu;
1052 menu->search = select_file_search;
1053 menu->mdata = priv;
1054
1055 priv->menu = menu;
1056 if (priv->multiple)
1057 priv->menu->tag = file_tag;
1058
1059 priv->sbar = sdw.sbar;
1060
1061 struct MuttWindow *win_menu = priv->menu->win;
1062
1063 // NT_COLOR is handled by the SimpleDialog
1067
1068 struct MuttWindow *old_focus = window_set_focus(priv->menu->win);
1069
1070 if (priv->state.is_mailbox_list)
1071 {
1072 examine_mailboxes(m, NULL, &priv->state);
1073 }
1074 else if (!priv->state.imap_browse)
1075 {
1076 // examine_directory() calls browser_add_folder() which needs the menu
1077 if (examine_directory(m, priv->menu, &priv->state, buf_string(&LastDir),
1078 buf_string(priv->prefix)) == -1)
1079 {
1080 goto bail;
1081 }
1082 }
1083
1084 init_menu(&priv->state, priv->menu, m, priv->sbar);
1085
1086 // ---------------------------------------------------------------------------
1087 // Event Loop
1088 int op = OP_NULL;
1089 struct KeyEvent event = { 0, OP_NULL };
1090 do
1091 {
1092 menu_tagging_dispatcher(priv->menu->win, &event);
1093 window_redraw(NULL);
1094
1096 op = event.op;
1097 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
1098 if (op < 0)
1099 continue;
1100 if (op == OP_NULL)
1101 {
1103 continue;
1104 }
1106
1107 int rc = browser_function_dispatcher(sdw.dlg, &event);
1108
1109 if (rc == FR_UNKNOWN)
1110 rc = menu_function_dispatcher(menu->win, &event);
1111 if (rc == FR_UNKNOWN)
1112 rc = global_function_dispatcher(menu->win, &event);
1113 } while (!priv->done);
1114 // ---------------------------------------------------------------------------
1115
1116bail:
1117 window_set_focus(old_focus);
1118 simple_dialog_free(&sdw.dlg);
1120}
int imap_browse(const char *path, struct BrowserState *state)
IMAP hook into the folder browser.
Definition browse.c:196
struct MenuDefinition * MdBrowser
Browser Menu Definition.
Definition functions.c:64
int browser_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Browser function.
Definition functions.c:1161
#define MUTT_SEL_MAILBOX
Select a mailbox.
Definition lib.h:59
void browser_sort(struct BrowserState *state)
Sort the entries in the browser.
Definition sort.c:186
#define MUTT_SEL_FOLDER
Select a local directory.
Definition lib.h:61
#define MUTT_SEL_MULTI
Multi-selection is enabled.
Definition lib.h:60
struct BrowserPrivateData * browser_private_data_new(void)
Create new Browser Data.
@ BROWSER_SORT_ALPHA
Sort by name.
Definition sort.h:31
@ BROWSER_SORT_UNSORTED
Sort into the raw order.
Definition sort.h:37
@ BROWSER_SORT_DESC
Sort by description.
Definition sort.h:34
size_t buf_addstr_n(struct Buffer *buf, const char *s, size_t len)
Add a string to a Buffer, expanding it if necessary.
Definition buffer.c:96
size_t buf_len(const struct Buffer *buf)
Calculate the length of a Buffer.
Definition buffer.c:491
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition buffer.c:76
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
Definition buffer.c:291
void buf_fix_dptr(struct Buffer *buf)
Move the dptr to end of the Buffer.
Definition buffer.c:182
size_t buf_strcpy_n(struct Buffer *buf, const char *s, size_t len)
Copy a string into a Buffer.
Definition buffer.c:416
size_t buf_addch(struct Buffer *buf, char c)
Add a single character to a Buffer.
Definition buffer.c:241
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition buffer.c:395
size_t buf_copy(struct Buffer *dst, const struct Buffer *src)
Copy a Buffer's contents to another Buffer.
Definition buffer.c:601
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition helpers.c:291
short cs_subset_sort(const struct ConfigSubset *sub, const char *name)
Get a sort config item by name.
Definition helpers.c:266
#define SORT_MASK
Mask for the sort id.
Definition sort.h:39
@ MUTT_MMDF
'mmdf' Mailbox type
Definition mailbox.h:45
@ MUTT_MH
'MH' Mailbox type
Definition mailbox.h:46
@ MUTT_IMAP
'IMAP' Mailbox type
Definition mailbox.h:49
@ MUTT_MBOX
'mbox' Mailbox type
Definition mailbox.h:44
@ MUTT_MAILDIR
'Maildir' Mailbox type
Definition mailbox.h:47
int examine_directory(struct Mailbox *m, struct Menu *menu, struct BrowserState *state, const char *dirname, const char *prefix)
Get list of all files/newsgroups with mask.
void init_menu(struct BrowserState *state, struct Menu *menu, struct Mailbox *m, struct MuttWindow *sbar)
Set up a new menu.
static void init_lastdir(void)
Initialise the browser directories.
static const struct Mapping FolderNewsHelp[]
Help Bar for the NNTP Mailbox browser dialog.
struct Buffer LastDir
Browser: previous selected directory.
void mutt_browser_select_dir(const char *f)
Remember the last directory selected.
void init_state(struct BrowserState *state)
Initialise a browser state.
struct Buffer LastDirBackup
Browser: backup copy of the current directory.
static const struct Mapping FolderHelp[]
Help Bar for the File/Dir/Mailbox browser dialog.
int examine_mailboxes(struct Mailbox *m, struct Menu *menu, struct BrowserState *state)
Get list of mailboxes/subscribed newsgroups.
EmailSortType
Methods for sorting Emails.
Definition sort.h:53
bool OptNews
(pseudo) used to change reader mode
Definition globals.c:53
char * CurrentFolder
Currently selected mailbox.
Definition globals.c:38
static int folder_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format a Folder for the Menu - Implements Menu::make_entry() -.
static int select_file_search(struct Menu *menu, regex_t *rx, int line)
Menu search callback for matching files - Implements Menu::search() -.
static int file_tag(struct Menu *menu, int sel, int act)
Tag an entry in the menu - Implements Menu::tag() -.
enum MailboxType imap_path_probe(const char *path, const struct stat *st)
Is this an IMAP Mailbox?
Definition imap.c:2546
static int browser_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
static int browser_mailbox_observer(struct NotifyCallback *nc)
Notification that a Mailbox has changed - Implements observer_t -.
static int browser_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
void browser_private_data_free(struct BrowserPrivateData **ptr)
Free Private Browser Data - Implements MuttWindow::wdata_free() -.
const char * mutt_path_getcwd(struct Buffer *cwd)
Get the current working directory.
Definition path.c:476
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:665
@ WT_DLG_BROWSER
Browser Dialog, dlg_browser()
Definition mutt_window.h:80
void expand_path(struct Buffer *buf, bool regex)
Create the canonical path.
Definition muttlib.c:122
enum MailboxType mx_path_probe(const char *path)
Find a mailbox that understands a path.
Definition mx.c:1323
struct NntpAccountData * CurrentNewsSrv
Current NNTP news server.
Definition nntp.c:74
@ NT_MAILBOX
Mailbox has changed, NotifyMailbox, EventMailbox.
Definition notify_type.h:49
void * adata
Private data (for Mailbox backends)
Definition account.h:42
Private state data for the Browser.
char *** files
Array of selected files.
bool folder
Select folders.
int * numfiles
Number of selected files.
struct Mailbox * mailbox
Mailbox.
struct BrowserState state
State containing list of files/dir/mailboxes.
struct Buffer * file
Buffer for the result.
bool multiple
Allow multiple selections.
bool is_mailbox_list
Viewing mailboxes.
Definition lib.h:149
void * mdata
Driver specific data.
Definition mailbox.h:131
Mapping between user-readable string and a constant.
Definition mapping.h:33
int(* search)(struct Menu *menu, regex_t *rx, int line)
Definition lib.h:121
struct Notify * notify
Notifications handler.
Definition neomutt.h:45
NNTP-specific Account data -.
Definition adata.h:36
struct NntpMboxData ** groups_list
List of newsgroups.
Definition adata.h:60
NNTP-specific Mailbox data -.
Definition mdata.h:34
struct NntpAccountData * adata
Account data.
Definition mdata.h:48
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_compose()

int dlg_compose ( struct Email * e,
struct Buffer * fcc,
uint8_t flags,
struct ConfigSubset * sub )

Allow the user to edit the message envelope -.

Parameters
eEmail to fill
fccBuffer to save FCC
flagsFlags, e.g. MUTT_COMPOSE_NOFREEHEADER
subConfigSubset
Return values
1Message should be postponed
0Normal exit
-1Abort message

The Compose Dialog allows the user to edit the email envelope before sending.

Definition at line 408 of file dlg_compose.c.

409{
410 struct MuttWindow *dlg = compose_dlg_init(sub, e, fcc);
411 struct ComposeSharedData *shared = dlg->wdata;
412 shared->mailbox = get_current_mailbox();
413 shared->email = e;
414 shared->sub = sub;
415 shared->fcc = fcc;
416 shared->fcc_set = false;
417 shared->flags = flags;
418 shared->rc = -1;
419
423
424 if (OptNewsSend)
426 else
427 dlg->help_data = ComposeHelp;
428 dlg->help_md = MdCompose;
429
430 struct Menu *menu = shared->adata->menu;
431 update_menu(shared->adata->actx, menu, true);
433
434 struct MuttWindow *win_env = window_find_child(dlg, WT_CUSTOM);
435
436 dialog_push(dlg);
437 struct MuttWindow *old_focus = window_set_focus(menu->win);
438 // ---------------------------------------------------------------------------
439 // Event Loop
440 int rc = 0;
441 int op = OP_NULL;
442 struct KeyEvent event = { 0, OP_NULL };
443 do
444 {
445 OptNews = false; /* for any case */
446 menu_tagging_dispatcher(menu->win, &event);
447 window_redraw(NULL);
448
450 op = event.op;
451 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
452 if (op < 0)
453 continue;
454 if (op == OP_NULL)
455 {
457 continue;
458 }
460
461 rc = compose_function_dispatcher(dlg, &event);
462 if (rc == FR_UNKNOWN)
463 rc = env_function_dispatcher(win_env, &event);
464 if (rc == FR_UNKNOWN)
465 rc = preview_function_dispatcher(shared->win_preview, &event);
466 if (rc == FR_UNKNOWN)
467 rc = menu_function_dispatcher(menu->win, &event);
468 if (rc == FR_UNKNOWN)
469 rc = global_function_dispatcher(menu->win, &event);
470 } while (rc != FR_DONE);
471 // ---------------------------------------------------------------------------
472
473#ifdef USE_AUTOCRYPT
474 /* This is a fail-safe to make sure the bit isn't somehow turned
475 * on. The user could have disabled the option after setting SEC_AUTOCRYPT,
476 * or perhaps resuming or replying to an autocrypt message. */
477 const bool c_autocrypt = cs_subset_bool(sub, "autocrypt");
478 if (!c_autocrypt)
480#endif
481
482 if (shared->adata->actx->idxlen)
483 e->body = shared->adata->actx->idx[0]->body;
484 else
485 e->body = NULL;
486
487 rc = shared->rc;
488
489 window_set_focus(old_focus);
490 dialog_pop();
491 mutt_window_free(&dlg);
492
493 return rc;
494}
struct MenuDefinition * MdCompose
Compose Menu Definition.
Definition functions.c:74
void dialog_push(struct MuttWindow *dlg)
Display a Window to the user.
Definition dialog.c:109
void dialog_pop(void)
Hide a Window from the user.
Definition dialog.c:142
void update_menu(struct AttachCtx *actx, struct Menu *menu, bool init)
Redraw the compose window.
static const struct Mapping ComposeHelp[]
Help Bar for the Compose dialog.
Definition dlg_compose.c:93
static const struct Mapping ComposeNewsHelp[]
Help Bar for the News Compose dialog.
static struct MuttWindow * compose_dlg_init(struct ConfigSubset *sub, struct Email *e, struct Buffer *fcc)
Allocate the Windows for Compose.
@ NT_EMAIL_CHANGE
Email has changed.
Definition email.h:186
bool OptNewsSend
(pseudo) used to change behavior when posting
Definition globals.c:54
int compose_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Compose function - Implements function_dispatcher_t -.
Definition functions.c:2179
int preview_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a preview function - Implements function_dispatcher_t -.
Definition preview.c:412
int env_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform an Envelope function - Implements function_dispatcher_t -.
Definition functions.c:536
static int compose_email_observer(struct NotifyCallback *nc)
Notification that an Email has changed - Implements observer_t -.
static int compose_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
static int compose_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
struct Mailbox * get_current_mailbox(void)
Get the current Mailbox.
Definition index.c:721
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
void mutt_window_free(struct MuttWindow **ptr)
Free a Window and its children.
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
#define SEC_AUTOCRYPT
(Autocrypt) Message will be, or was Autocrypt encrypt+signed
Definition lib.h:95
@ NT_EMAIL
Email has changed, NotifyEmail, EventEmail.
Definition notify_type.h:44
@ NT_ENVELOPE
Envelope has changed, NotifyEnvelope.
Definition notify_type.h:45
struct AttachPtr ** idx
Array of attachments.
Definition attach.h:67
short idxlen
Number of attachmentes.
Definition attach.h:68
struct Body * body
Attachment.
Definition attach.h:36
struct Menu * menu
Menu displaying the attachments.
Definition attach_data.h:35
struct AttachCtx * actx
Set of attachments.
Definition attach_data.h:34
Shared Compose Data.
Definition shared_data.h:35
struct ConfigSubset * sub
Config set to use.
Definition shared_data.h:36
struct Mailbox * mailbox
Current Mailbox.
Definition shared_data.h:37
int flags
Flags, e.g. MUTT_COMPOSE_NOFREEHEADER.
Definition shared_data.h:45
struct MuttWindow * win_preview
Message preview window.
Definition shared_data.h:41
bool fcc_set
User has edited the Fcc: field.
Definition shared_data.h:46
int rc
Return code to leave compose.
Definition shared_data.h:47
struct ComposeAttachData * adata
Attachments.
Definition shared_data.h:39
struct Email * email
Email being composed.
Definition shared_data.h:38
struct Buffer * fcc
Buffer to save FCC.
Definition shared_data.h:44
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
struct Notify * notify
Notifications: NotifyEmail, EventEmail.
Definition email.h:73
const struct Mapping * help_data
Data for the Help Bar.
const struct MenuDefinition * help_md
Menu Definition for key bindings.
void * wdata
Private data.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_certificate()

int dlg_certificate ( const char * title,
struct StringArray * carr,
bool allow_always,
bool allow_skip )

Ask the user to validate the certificate -.

Parameters
titleMenu title
carrCertificate text to display
allow_alwaysIf true, allow the user to always accept the certificate
allow_skipIf true, allow the user to skip the verification
Return values
1Reject certificate (or menu aborted)
2Accept certificate once
3Accept certificate always/skip (see notes)
4Accept certificate skip

The Verify Certificate Dialog shows a list of signatures for a domain certificate. They can choose whether to accept or reject it.

The possible retvals will depend on the parameters. The options are given in the order: Reject, Once, Always, Skip. The retval represents the chosen option.

Definition at line 166 of file dlg_verifycert.c.

167{
169
170 struct CertMenuData mdata = { carr };
171
172 struct Menu *menu = sdw.menu;
173 menu->mdata = &mdata;
174 menu->mdata_free = NULL; // Menu doesn't own the data
176 menu->max = ARRAY_SIZE(carr);
177 menu->show_indicator = false;
178
179 sbar_set_title(sdw.sbar, title);
180
181 if (allow_always)
182 {
183 if (allow_skip)
184 {
185 mdata.prompt = _("(r)eject, accept (o)nce, (a)ccept always, (s)kip");
186 /* L10N: The letters correspond to the choices in the string:
187 "(r)eject, accept (o)nce, (a)ccept always, (s)kip"
188 This is an interactive certificate confirmation prompt for an SSL connection. */
189 mdata.keys = _("roas");
190 }
191 else
192 {
193 mdata.prompt = _("(r)eject, accept (o)nce, (a)ccept always");
194 /* L10N: The letters correspond to the choices in the string:
195 "(r)eject, accept (o)nce, (a)ccept always"
196 This is an interactive certificate confirmation prompt for an SSL connection. */
197 mdata.keys = _("roa");
198 }
199 }
200 else
201 {
202 if (allow_skip)
203 {
204 mdata.prompt = _("(r)eject, accept (o)nce, (s)kip");
205 /* L10N: The letters correspond to the choices in the string:
206 "(r)eject, accept (o)nce, (s)kip"
207 This is an interactive certificate confirmation prompt for an SSL connection. */
208 mdata.keys = _("ros");
209 }
210 else
211 {
212 mdata.prompt = _("(r)eject, accept (o)nce");
213 /* L10N: The letters correspond to the choices in the string:
214 "(r)eject, accept (o)nce"
215 This is an interactive certificate confirmation prompt for an SSL connection. */
216 mdata.keys = _("ro");
217 }
218 }
220
221 struct MuttWindow *old_focus = window_set_focus(menu->win);
222 // ---------------------------------------------------------------------------
223 // Event Loop
224 int choice = 0;
225 int op = OP_NULL;
226 struct KeyEvent event = { 0, OP_NULL };
227 do
228 {
229 window_redraw(NULL);
231
232 // Try to catch dialog keys before ops
233 if (menu_dialog_dokey(menu, &op) != 0)
234 {
236 op = event.op;
237 }
238
239 if (op == OP_TIMEOUT)
240 continue;
241
242 // Convert menubar movement to scrolling
244
245 if (op <= OP_MAX)
246 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
247 else
248 mutt_debug(LL_DEBUG1, "Got choice %d\n", op - OP_MAX);
249
250 switch (op)
251 {
252 case OP_ABORT: // Abort: Ctrl-G
253 case OP_QUIT: // Q)uit
254 case OP_MAX + 1: // R)eject
255 choice = 1;
256 break;
257 case OP_MAX + 2: // O)nce
258 choice = 2;
259 break;
260 case OP_MAX + 3: // A)lways / S)kip
261 choice = 3;
262 break;
263 case OP_MAX + 4: // S)kip
264 choice = 4;
265 break;
266
267 case OP_JUMP:
268 case OP_JUMP_1:
269 case OP_JUMP_2:
270 case OP_JUMP_3:
271 case OP_JUMP_4:
272 case OP_JUMP_5:
273 case OP_JUMP_6:
274 case OP_JUMP_7:
275 case OP_JUMP_8:
276 case OP_JUMP_9:
277 mutt_error(_("Jumping is not implemented for dialogs"));
278 continue;
279
280 case OP_SEARCH:
281 case OP_SEARCH_NEXT:
282 case OP_SEARCH_OPPOSITE:
283 case OP_SEARCH_REVERSE:
284 mutt_error(_("Search is not implemented for this menu"));
285 continue;
286 }
287
288 (void) menu_function_dispatcher(menu->win, &event);
289 } while (choice == 0);
290 // ---------------------------------------------------------------------------
291
292 window_set_focus(old_focus);
294
295 return choice;
296}
#define ARRAY_SIZE(head)
The number of elements stored.
Definition array.h:87
@ MT_COLOR_PROMPT
Question/user input.
Definition color.h:56
static int menu_dialog_dokey(struct Menu *menu, int *id)
Check if there are any menu key events to process.
static int menu_dialog_translate_op(int op)
Convert menubar movement to scrolling.
static const struct Mapping VerifyHelp[]
Help Bar for the Certificate Verification dialog.
#define GETCH_IGNORE_MACRO
Don't use MacroEvents.
Definition get.h:35
#define mutt_error(...)
Definition logging2.h:94
static int cert_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Create a Certificate for the Menu - Implements Menu::make_entry() -.
struct MenuDefinition * MdDialog
Dialog Menu Definition.
Definition functions.c:53
struct MenuDefinition * MdGeneric
Generic Menu Definition.
Definition functions.c:50
void msgwin_set_text(struct MuttWindow *win, const char *text, enum ColorId color)
Set the text for the Message Window.
Definition msgwin.c:483
@ WT_DLG_CERTIFICATE
Certificate Dialog, dlg_certificate()
Definition mutt_window.h:81
#define OP_TIMEOUT
1 second with no events
Definition opcodes.h:35
#define OP_ABORT
$abort_key pressed (Ctrl-G)
Definition opcodes.h:36
@ OP_MAX
Definition opcodes.h:1021
Certificate data to use in the Menu.
Definition ssl.h:37
char * prompt
Prompt for user, similar to mw_multi_choice.
Definition ssl.h:39
struct StringArray * carr
Lines of the Certificate.
Definition ssl.h:38
bool show_indicator
Show the Indicator colour.
Definition lib.h:87
int max
Number of entries in the menu.
Definition lib.h:82
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_history()

void dlg_history ( struct Buffer * buf,
struct StringArray * matches )

Select an item from a history list -.

Parameters
[in]bufBuffer in which to save string
[out]matchesItems to choose from

The History Dialog lets the user select from the history of commands, functions or files.

Definition at line 119 of file dlg_history.c.

120{
122 struct Menu *menu = sdw.menu;
123
124 struct HistoryData hd = { false, false, buf, menu, matches };
125
126 char title[256] = { 0 };
127 snprintf(title, sizeof(title), _("History '%s'"), buf_string(buf));
128 sbar_set_title(sdw.sbar, title);
129
132 menu->mdata = &hd;
133 menu->mdata_free = NULL; // Menu doesn't own the data
134
135 struct MuttWindow *old_focus = window_set_focus(menu->win);
136 // ---------------------------------------------------------------------------
137 // Event Loop
138 int op = OP_NULL;
139 struct KeyEvent event = { 0, OP_NULL };
140 do
141 {
142 menu_tagging_dispatcher(menu->win, &event);
143 window_redraw(NULL);
144
146 op = event.op;
147 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
148 if (op < 0)
149 continue;
150 if (op == OP_NULL)
151 {
153 continue;
154 }
156
157 int rc = history_function_dispatcher(sdw.dlg, &event);
158 if (rc == FR_UNKNOWN)
159 rc = menu_function_dispatcher(menu->win, &event);
160 if (rc == FR_UNKNOWN)
161 rc = global_function_dispatcher(menu->win, &event);
162 } while (!hd.done);
163 // ---------------------------------------------------------------------------
164
165 window_set_focus(old_focus);
167}
static const struct Mapping HistoryHelp[]
Help Bar for the History Selection dialog.
Definition dlg_history.c:75
int history_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a History function - Implements function_dispatcher_t -.
Definition functions.c:81
static int history_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format a History Item for the Menu - Implements Menu::make_entry() -.
Definition dlg_history.c:88
@ WT_DLG_HISTORY
History Dialog, dlg_history()
Definition mutt_window.h:85
Data to pass to the History Functions.
Definition functions.h:35
struct Menu * menu
History Menu.
Definition functions.h:39
struct Buffer * buf
Buffer for the results.
Definition functions.h:38
struct StringArray * matches
History entries.
Definition functions.h:40
bool done
Should we close the Dialog?
Definition functions.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_index()

struct Mailbox * dlg_index ( struct MuttWindow * dlg,
struct Mailbox * m_init )

Display a list of emails -.

Parameters
dlgDialog containing Windows to draw on
m_initInitial mailbox
Return values
ptrMailbox open in the index

The Index Dialog is the heart of NeoMutt. From here, the user can read and reply to emails, organise them into folders, set labels, etc.

Definition at line 1118 of file dlg_index.c.

1119{
1120 /* Make sure use_threads/sort/sort_aux are coherent */
1122
1123 struct IndexSharedData *shared = dlg->wdata;
1125
1126 struct MuttWindow *panel_index = window_find_child(dlg, WT_INDEX);
1127
1128 struct IndexPrivateData *priv = panel_index->wdata;
1129 priv->win_index = window_find_child(panel_index, WT_MENU);
1130
1131 int op = OP_NULL;
1132
1133 if (shared->mailbox && (shared->mailbox->type == MUTT_NNTP))
1134 dlg->help_data = IndexNewsHelp;
1135 else
1136 dlg->help_data = IndexHelp;
1137 dlg->help_md = MdIndex;
1138
1139 priv->menu = priv->win_index->wdata;
1141 priv->menu->color = index_color;
1142 priv->menu->max = shared->mailbox ? shared->mailbox->vcount : 0;
1144
1145 struct MuttWindow *old_focus = window_set_focus(priv->menu->win);
1146 mutt_window_reflow(NULL);
1147
1148 if (!shared->attach_msg)
1149 {
1150 /* force the mailbox check after we enter the folder */
1152 }
1153#ifdef USE_INOTIFY
1154 mutt_monitor_add(NULL);
1155#endif
1156
1157 const bool c_collapse_all = cs_subset_bool(shared->sub, "collapse_all");
1158 if (mutt_using_threads() && c_collapse_all)
1159 {
1162 }
1163
1164 int rc = 0;
1165 do
1166 {
1167 /* Clear the tag prefix unless we just started it.
1168 * Don't clear the prefix on a timeout, but do clear on an abort */
1169 if (priv->tag_prefix && (op != OP_TAG_PREFIX) &&
1170 (op != OP_TAG_PREFIX_COND) && (op != OP_TIMEOUT))
1171 {
1172 priv->tag_prefix = false;
1173 }
1174
1175 /* check if we need to resort the index because just about
1176 * any 'op' below could do mutt_enter_command(), either here or
1177 * from any new priv->menu launched, and change $sort/$sort_aux */
1178 if (OptNeedResort && shared->mailbox && (shared->mailbox->msg_count != 0) &&
1179 (menu_get_index(priv->menu) >= 0))
1180 {
1181 resort_index(shared->mailbox_view, priv->menu);
1182 }
1183
1184 priv->menu->max = shared->mailbox ? shared->mailbox->vcount : 0;
1185 priv->oldcount = shared->mailbox ? shared->mailbox->msg_count : 0;
1186
1187 if (shared->mailbox && shared->mailbox_view)
1188 {
1190
1191 shared->mailbox_view->menu = priv->menu;
1192 /* check for new mail in the mailbox. If nonzero, then something has
1193 * changed about the file (either we got new mail or the file was
1194 * modified underneath us.) */
1195 enum MxStatus check = mx_mbox_check(shared->mailbox);
1196
1197 if (check == MX_STATUS_ERROR)
1198 {
1199 if (buf_is_empty(&shared->mailbox->pathbuf))
1200 {
1201 /* fatal error occurred */
1202 mview_free(&shared->mailbox_view);
1204 }
1205
1207 }
1208 else if ((check == MX_STATUS_NEW_MAIL) || (check == MX_STATUS_REOPENED) ||
1209 (check == MX_STATUS_FLAGS))
1210 {
1211 /* notify the user of new mail */
1212 if (check == MX_STATUS_REOPENED)
1213 {
1214 mutt_error(_("Mailbox was externally modified. Flags may be wrong."));
1215 }
1216 else if (check == MX_STATUS_NEW_MAIL)
1217 {
1218 for (size_t i = 0; i < shared->mailbox->msg_count; i++)
1219 {
1220 const struct Email *e = shared->mailbox->emails[i];
1221 if (e && !e->read && !e->old)
1222 {
1223 mutt_message(_("New mail in this mailbox"));
1224 const bool c_beep_new = cs_subset_bool(shared->sub, "beep_new");
1225 if (c_beep_new)
1226 mutt_beep(true);
1227 const struct Expando *c_new_mail_command =
1228 cs_subset_expando(shared->sub, "new_mail_command");
1229 if (c_new_mail_command)
1230 {
1231 struct Buffer *cmd = buf_pool_get();
1232 menu_status_line(cmd, shared, NULL, -1, c_new_mail_command);
1233 if (mutt_system(buf_string(cmd)) != 0)
1234 mutt_error(_("Error running \"%s\""), buf_string(cmd));
1235 buf_pool_release(&cmd);
1236 }
1237 break;
1238 }
1239 }
1240 }
1241 else if (check == MX_STATUS_FLAGS)
1242 {
1243 mutt_message(_("Mailbox was externally modified"));
1244 }
1245
1246 /* avoid the message being overwritten by mailbox */
1247 priv->do_mailbox_notify = false;
1248
1249 bool verbose = shared->mailbox->verbose;
1250 shared->mailbox->verbose = false;
1251 update_index(priv->menu, shared->mailbox_view, check, priv->oldcount, shared);
1252 shared->mailbox->verbose = verbose;
1253 priv->menu->max = shared->mailbox->vcount;
1256 }
1257
1259 menu_get_index(priv->menu)));
1260 }
1261
1262 if (!shared->attach_msg)
1263 {
1264 /* check for new mail in the incoming folders */
1266 if (priv->do_mailbox_notify)
1267 {
1268 if (mutt_mailbox_notify(shared->mailbox))
1269 {
1270 const bool c_beep_new = cs_subset_bool(shared->sub, "beep_new");
1271 if (c_beep_new)
1272 mutt_beep(true);
1273 const struct Expando *c_new_mail_command = cs_subset_expando(shared->sub, "new_mail_command");
1274 if (c_new_mail_command)
1275 {
1276 struct Buffer *cmd = buf_pool_get();
1277 menu_status_line(cmd, shared, priv->menu, -1, c_new_mail_command);
1278 if (mutt_system(buf_string(cmd)) != 0)
1279 mutt_error(_("Error running \"%s\""), buf_string(cmd));
1280 buf_pool_release(&cmd);
1281 }
1282 }
1283 }
1284 else
1285 {
1286 priv->do_mailbox_notify = true;
1287 }
1288 }
1289
1290 window_redraw(NULL);
1291
1292 /* give visual indication that the next command is a tag- command */
1293 if (priv->tag_prefix)
1294 {
1295 msgwin_set_text(NULL, "tag-", MT_COLOR_NORMAL);
1296 }
1297
1298 const bool c_arrow_cursor = cs_subset_bool(shared->sub, "arrow_cursor");
1299 const bool c_braille_friendly = cs_subset_bool(shared->sub, "braille_friendly");
1300 const int index = menu_get_index(priv->menu);
1301 if (c_arrow_cursor)
1302 {
1303 const char *const c_arrow_string = cs_subset_string(shared->sub, "arrow_string");
1304 const int arrow_width = mutt_strwidth(c_arrow_string);
1305 mutt_window_move(priv->menu->win, index - priv->menu->top, arrow_width);
1306 }
1307 else if (c_braille_friendly)
1308 {
1309 mutt_window_move(priv->menu->win, index - priv->menu->top, 0);
1310 }
1311 else
1312 {
1313 mutt_window_move(priv->menu->win, index - priv->menu->top,
1314 priv->menu->win->state.cols - 1);
1315 }
1316 mutt_refresh();
1317
1318 window_redraw(NULL);
1319 struct KeyEvent event = km_dokey(MdIndex, GETCH_NO_FLAGS);
1320 op = event.op;
1321
1322 if (op == OP_REPAINT)
1323 {
1324 /* force a real complete redraw. clrtobot() doesn't seem to be able
1325 * to handle every case without this. */
1326 msgwin_clear_text(NULL);
1327 mutt_refresh();
1328 continue;
1329 }
1330
1331 /* either user abort or timeout */
1332 if (op < OP_NULL)
1333 {
1334 if (priv->tag_prefix)
1335 msgwin_clear_text(NULL);
1336 continue;
1337 }
1338
1339 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
1340
1341 /* special handling for the priv->tag-prefix function */
1342 const bool c_auto_tag = cs_subset_bool(shared->sub, "auto_tag");
1343 if ((op == OP_TAG_PREFIX) || (op == OP_TAG_PREFIX_COND))
1344 {
1345 /* A second priv->tag-prefix command aborts */
1346 if (priv->tag_prefix)
1347 {
1348 priv->tag_prefix = false;
1349 msgwin_clear_text(NULL);
1350 continue;
1351 }
1352
1353 if (!shared->mailbox)
1354 {
1355 mutt_error(_("No mailbox is open"));
1356 continue;
1357 }
1358
1359 if (shared->mailbox->msg_tagged == 0)
1360 {
1361 if (op == OP_TAG_PREFIX)
1362 {
1363 mutt_error(_("No tagged messages"));
1364 }
1365 else if (op == OP_TAG_PREFIX_COND)
1366 {
1368 mutt_message(_("Nothing to do"));
1369 }
1370 continue;
1371 }
1372
1373 /* get the real command */
1374 priv->tag_prefix = true;
1375 continue;
1376 }
1377 else if (c_auto_tag && shared->mailbox && (shared->mailbox->msg_tagged != 0))
1378 {
1379 priv->tag_prefix = true;
1380 }
1381
1383
1384 OptNews = false; /* for any case */
1385
1386#ifdef USE_NOTMUCH
1387 nm_db_debug_check(shared->mailbox);
1388#endif
1389
1390 rc = index_function_dispatcher(priv->win_index, &event);
1391
1392 if (rc == FR_UNKNOWN)
1393 rc = menu_function_dispatcher(priv->win_index, &event);
1394
1395 if (rc == FR_UNKNOWN)
1396 {
1397 struct MuttWindow *win_sidebar = window_find_child(dlg, WT_SIDEBAR);
1398 rc = sb_function_dispatcher(win_sidebar, &event);
1399 }
1400 if (rc == FR_UNKNOWN)
1401 rc = global_function_dispatcher(priv->menu->win, &event);
1402
1403 if (rc == FR_UNKNOWN)
1405
1406#ifdef USE_NOTMUCH
1407 nm_db_debug_check(shared->mailbox);
1408#endif
1409 } while (rc != FR_DONE);
1410
1411 mview_free(&shared->mailbox_view);
1412 window_set_focus(old_focus);
1413
1414 return shared->mailbox;
1415}
@ MT_COLOR_NORMAL
Plain text.
Definition color.h:53
void mutt_pattern_free(struct PatternList **pat)
Free a Pattern.
Definition compile.c:826
const struct Expando * cs_subset_expando(const struct ConfigSubset *sub, const char *name)
Get an Expando config item by name.
void mailbox_gc_run(void)
Run the garbage-collection.
Definition mailbox.c:311
@ MUTT_NNTP
'NNTP' (Usenet) Mailbox type
Definition mailbox.h:48
void mutt_refresh(void)
Force a refresh of the screen.
Definition curs_lib.c:78
void mutt_beep(bool force)
Irritate the user.
Definition curs_lib.c:68
size_t mutt_strwidth(const char *s)
Measure a string's width in screen cells.
Definition curs_lib.c:444
const struct Mapping IndexNewsHelp[]
Help Bar for the News Index dialog.
Definition dlg_index.c:114
void update_index(struct Menu *menu, struct MailboxView *mv, enum MxStatus check, int oldcount, const struct IndexSharedData *shared)
Update the index.
Definition dlg_index.c:560
int find_first_message(struct MailboxView *mv)
Get index of first new message.
Definition dlg_index.c:325
static const struct Mapping IndexHelp[]
Help Bar for the Index dialog.
Definition dlg_index.c:99
void resort_index(struct MailboxView *mv, struct Menu *menu)
Resort the index.
Definition dlg_index.c:385
void collapse_all(struct MailboxView *mv, struct Menu *menu, enum CollapseMode mode)
Collapse/uncollapse all threads.
Definition dlg_index.c:159
bool OptNeedResort
(pseudo) used to force a re-sort
Definition globals.c:52
void mutt_flush_macro_to_endcond(void)
Drop a macro from the input buffer.
Definition get.c:157
int sb_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Sidebar function - Implements function_dispatcher_t -.
Definition functions.c:605
int index_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform an Index function - Implements function_dispatcher_t -.
Definition functions.c:3448
#define mutt_message(...)
Definition logging2.h:93
const struct AttrColor * index_color(struct Menu *menu, int line)
Calculate the colour for a line of the index - Implements Menu::color() -.
Definition dlg_index.c:945
int index_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format an Email for the Menu - Implements Menu::make_entry() -.
Definition dlg_index.c:844
#define mutt_using_threads()
Definition thread.h:113
struct MenuDefinition * MdIndex
Index Menu Definition.
Definition functions.c:80
@ COLLAPSE_MODE_CLOSE
Collapse all threads.
Definition lib.h:92
void index_shared_data_set_email(struct IndexSharedData *shared, struct Email *e)
Set the current Email for the Index and friends.
void index_shared_data_set_mview(struct IndexSharedData *shared, struct MailboxView *mv)
Set the MailboxView for the Index and friends.
void index_adjust_sort_threads(const struct ConfigSubset *sub)
Adjust use_threads/sort/sort_aux.
Definition index.c:184
#define MENU_REDRAW_FULL
Redraw everything.
Definition lib.h:60
void menu_queue_redraw(struct Menu *menu, MenuRedrawFlags redraw)
Queue a request for a redraw.
Definition menu.c:188
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
int mutt_monitor_add(struct Mailbox *m)
Add a watch for a mailbox.
Definition monitor.c:484
void msgwin_clear_text(struct MuttWindow *win)
Clear the text in the Message Window.
Definition msgwin.c:518
int mutt_system(const char *cmd)
Run an external command.
Definition system.c:51
int mutt_mailbox_check(struct Mailbox *m_cur, CheckStatsFlags flags)
Check all all Mailboxes for new mail.
bool mutt_mailbox_notify(struct Mailbox *m_cur)
Notify the user if there's new mail.
void mutt_window_reflow(struct MuttWindow *win)
Resize a Window and its children.
int mutt_window_move(struct MuttWindow *win, int row, int col)
Move the cursor in a Window.
@ WT_INDEX
A panel containing the Index Window.
Definition mutt_window.h:96
@ WT_SIDEBAR
Side panel containing Accounts or groups of data.
@ WT_MENU
An Window containing a Menu.
Definition mutt_window.h:97
struct Email * mutt_get_virt_email(struct Mailbox *m, int vnum)
Get a virtual Email.
Definition mview.c:415
void mview_free(struct MailboxView **ptr)
Free a MailboxView.
Definition mview.c:47
struct MailboxView * mview_new(struct Mailbox *m, struct Notify *parent)
Create a new MailboxView.
Definition mview.c:88
enum MxStatus mx_mbox_check(struct Mailbox *m)
Check for new mail - Wrapper for MxOps::mbox_check()
Definition mx.c:1107
#define MUTT_MAILBOX_CHECK_NO_FLAGS
No flags are set.
Definition mxapi.h:49
#define MUTT_MAILBOX_CHECK_POSTPONED
Make sure the number of postponed messages is updated.
Definition mxapi.h:50
MxStatus
Return values from mbox_check(), mbox_check_stats(), mbox_sync(), and mbox_close()
Definition mxapi.h:59
@ MX_STATUS_ERROR
An error occurred.
Definition mxapi.h:60
@ MX_STATUS_FLAGS
Nondestructive flags change (IMAP)
Definition mxapi.h:65
@ MX_STATUS_REOPENED
Mailbox was reopened.
Definition mxapi.h:64
@ MX_STATUS_NEW_MAIL
New mail received in Mailbox.
Definition mxapi.h:62
void nm_db_debug_check(struct Mailbox *m)
Check if the database is open.
Definition db.c:397
#define OP_REPAINT
Repaint is needed.
Definition opcodes.h:34
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
void menu_status_line(struct Buffer *buf, struct IndexSharedData *shared, struct Menu *menu, int max_cols, const struct Expando *exp)
Create the status line.
Definition status.c:51
String manipulation buffer.
Definition buffer.h:36
The envelope/body of an email.
Definition email.h:39
bool read
Email is read.
Definition email.h:50
bool old
Email is seen, but unread.
Definition email.h:49
Parsed Expando trees.
Definition expando.h:41
Private state data for the Index.
struct MuttWindow * win_index
Window for the Index.
struct IndexSharedData * shared
Shared Index data.
bool tag_prefix
tag-prefix has been pressed
bool do_mailbox_notify
Do we need to notify the user of new mail?
struct Menu * menu
Menu controlling the index.
int oldcount
Old count of mails in the mailbox.
Data shared between Index, Pager and Sidebar.
Definition shared_data.h:37
struct Mailbox * mailbox
Current Mailbox.
Definition shared_data.h:41
bool attach_msg
Are we in "attach message" mode?
Definition shared_data.h:46
struct ConfigSubset * sub
Config set to use.
Definition shared_data.h:38
struct MailboxView * mailbox_view
Current Mailbox view.
Definition shared_data.h:40
struct SearchState * search_state
State of the current search.
Definition shared_data.h:45
struct Menu * menu
Needed for pattern compilation.
Definition mview.h:47
int vcount
The number of virtual messages.
Definition mailbox.h:98
int msg_count
Total number of messages.
Definition mailbox.h:87
enum MailboxType type
Mailbox type.
Definition mailbox.h:101
struct Email ** emails
Array of Emails.
Definition mailbox.h:95
struct Buffer pathbuf
Path of the Mailbox.
Definition mailbox.h:79
int msg_tagged
How many messages are tagged?
Definition mailbox.h:93
bool verbose
Display status messages?
Definition mailbox.h:116
const struct AttrColor *(* color)(struct Menu *menu, int line)
Definition lib.h:145
int top
Entry that is the top of the current page.
Definition lib.h:92
struct WindowState state
Current state of the Window.
struct PatternList * pattern
compiled search pattern
short cols
Number of columns, can be MUTT_WIN_SIZE_UNLIMITED.
Definition mutt_window.h:60
+ Here is the caller graph for this function:

◆ dlg_gpgme()

struct CryptKeyInfo * dlg_gpgme ( struct CryptKeyInfo * keys,
struct Address * p,
const char * s,
unsigned int app,
bool * forced_valid )

Get the user to select a key -.

Parameters
[in]keysList of keys to select from
[in]pAddress to match
[in]sReal name to display
[in]appFlags, e.g. APPLICATION_PGP
[out]forced_validSet to true if user overrode key's validity
Return values
ptrKey selected by user

The Select GPGME Key Dialog lets the user select a PGP Key to use.

Definition at line 196 of file dlg_gpgme.c.

198{
199 /* build the key table */
200 struct CryptKeyInfoArray ckia = ARRAY_HEAD_INITIALIZER;
201 const bool c_pgp_show_unusable = cs_subset_bool(NeoMutt->sub, "pgp_show_unusable");
202 bool unusable = false;
203 for (struct CryptKeyInfo *k = keys; k; k = k->next)
204 {
205 if (!c_pgp_show_unusable && (k->flags & KEYFLAG_CANTUSE))
206 {
207 unusable = true;
208 continue;
209 }
210
211 ARRAY_ADD(&ckia, k);
212 }
213
214 if ((ARRAY_SIZE(&ckia) == 0) && unusable)
215 {
216 mutt_error(_("All matching keys are marked expired/revoked"));
217 return NULL;
218 }
219
220 gpgme_sort_keys(&ckia);
221
222 struct MenuDefinition *md = NULL;
223 if (app & APPLICATION_PGP)
224 md = MdPgp;
225 else if (app & APPLICATION_SMIME)
226 md = MdSmime;
227
229
230 struct Menu *menu = sdw.menu;
231 struct GpgmeData gd = { false, menu, &ckia, NULL, forced_valid };
232
233 menu->max = ARRAY_SIZE(&ckia);
235 menu->mdata = &gd;
236 menu->mdata_free = NULL; // Menu doesn't own the data
237
238 // NT_COLOR is handled by the SimpleDialog
241
242 const char *ts = NULL;
243
244 if ((app & APPLICATION_PGP) && (app & APPLICATION_SMIME))
245 ts = _("PGP and S/MIME keys matching");
246 else if ((app & APPLICATION_PGP))
247 ts = _("PGP keys matching");
248 else if ((app & APPLICATION_SMIME))
249 ts = _("S/MIME keys matching");
250 else
251 ts = _("keys matching");
252
253 char buf[1024] = { 0 };
254 if (p)
255 {
256 /* L10N: 1$s is one of the previous four entries.
257 %2$s is an address.
258 e.g. "S/MIME keys matching <john.doe@example.com>" */
259 snprintf(buf, sizeof(buf), _("%s <%s>"), ts, buf_string(p->mailbox));
260 }
261 else
262 {
263 /* L10N: e.g. 'S/MIME keys matching "John Doe".' */
264 snprintf(buf, sizeof(buf), _("%s \"%s\""), ts, s);
265 }
266
267 sbar_set_title(sdw.sbar, buf);
268
270
271 struct MuttWindow *old_focus = window_set_focus(menu->win);
272 // ---------------------------------------------------------------------------
273 // Event Loop
274 int op = OP_NULL;
275 struct KeyEvent event = { 0, OP_NULL };
276 do
277 {
278 menu_tagging_dispatcher(menu->win, &event);
279 window_redraw(NULL);
280
281 event = km_dokey(md, GETCH_NO_FLAGS);
282 op = event.op;
283 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
284 if (op < 0)
285 continue;
286 if (op == OP_NULL)
287 {
288 km_error_key(md);
289 continue;
290 }
292
293 int rc = gpgme_function_dispatcher(sdw.dlg, &event);
294
295 if (rc == FR_UNKNOWN)
296 rc = menu_function_dispatcher(menu->win, &event);
297 if (rc == FR_UNKNOWN)
298 rc = global_function_dispatcher(menu->win, &event);
299 } while (!gd.done);
300 // ---------------------------------------------------------------------------
301
302 ARRAY_FREE(&ckia);
303 window_set_focus(old_focus);
305 return gd.key;
306}
#define ARRAY_ADD(head, elem)
Add an element at the end of the array.
Definition array.h:157
#define ARRAY_FREE(head)
Release all memory.
Definition array.h:209
#define ARRAY_HEAD_INITIALIZER
Static initializer for arrays.
Definition array.h:58
static const struct Mapping GpgmeHelp[]
Help Bar for the GPGME key selection dialog.
Definition dlg_gpgme.c:93
int gpgme_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Gpgme function - Implements function_dispatcher_t -.
static int crypt_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format a PGP Key for the Menu - Implements Menu::make_entry() -.
Definition dlg_gpgme.c:108
static int gpgme_key_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
Definition dlg_gpgme.c:133
static int gpgme_key_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition dlg_gpgme.c:162
@ WT_DLG_GPGME
GPGME Dialog, dlg_gpgme()
Definition mutt_window.h:83
struct MenuDefinition * MdPgp
Pgp Menu Definition.
Definition functions.c:37
struct MenuDefinition * MdSmime
Smime Menu Definition.
Definition functions.c:40
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition lib.h:98
#define KEYFLAG_CANTUSE
Definition lib.h:147
#define APPLICATION_SMIME
Use SMIME to encrypt/sign.
Definition lib.h:99
void gpgme_sort_keys(struct CryptKeyInfoArray *ckia)
Sort an array of GPGME keys.
Definition sort_gpgme.c:175
struct Buffer * mailbox
Mailbox and host address.
Definition address.h:37
A stored PGP key.
Definition crypt_gpgme.h:44
struct CryptKeyInfo * next
Linked list.
Definition crypt_gpgme.h:45
Data to pass to the Gpgme Functions.
bool * forced_valid
User insists on out-of-date key.
struct CryptKeyInfo * key
Selected Key.
bool done
Should we close the Dialog?
struct Menu * menu
Gpgme Menu.
Functions for a Dialog or Window.
Definition menu.h:80
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_pgp()

struct PgpKeyInfo * dlg_pgp ( struct PgpKeyInfo * keys,
struct Address * p,
const char * s )

Let the user select a key to use -.

Parameters
keysList of PGP keys
pAddress to match
sString to match
Return values
ptrSelected PGP key

The Select PGP Key Dialog lets the user select an PGP Key to use.

Definition at line 191 of file dlg_pgp.c.

192{
193 struct Menu *menu = NULL;
194 char buf[1024] = { 0 };
195 bool unusable = false;
196 struct PgpUidArray pua = ARRAY_HEAD_INITIALIZER;
197
198 const bool c_pgp_show_unusable = cs_subset_bool(NeoMutt->sub, "pgp_show_unusable");
199 for (struct PgpKeyInfo *kp = keys; kp; kp = kp->next)
200 {
201 if (!c_pgp_show_unusable && (kp->flags & KEYFLAG_CANTUSE))
202 {
203 unusable = true;
204 continue;
205 }
206
207 for (struct PgpUid *a = kp->address; a; a = a->next)
208 {
209 if (!c_pgp_show_unusable && (a->flags & KEYFLAG_CANTUSE))
210 {
211 unusable = true;
212 continue;
213 }
214
215 ARRAY_ADD(&pua, a);
216 }
217 }
218
219 if ((ARRAY_SIZE(&pua) == 0) && unusable)
220 {
221 mutt_error(_("All matching keys are expired, revoked, or disabled"));
222 return NULL;
223 }
224
225 pgp_sort_keys(&pua);
226
228 menu = sdw.menu;
229 struct PgpData pd = { false, menu, &pua, NULL };
230
231 menu->max = ARRAY_SIZE(&pua);
233 menu->mdata = &pd;
234 menu->mdata_free = NULL; // Menu doesn't own the data
235
236 // NT_COLOR is handled by the SimpleDialog
239
240 if (p)
241 snprintf(buf, sizeof(buf), _("PGP keys matching <%s>"), buf_string(p->mailbox));
242 else
243 snprintf(buf, sizeof(buf), _("PGP keys matching \"%s\""), s);
244
245 sbar_set_title(sdw.sbar, buf);
246
248
249 struct MuttWindow *old_focus = window_set_focus(menu->win);
250 // ---------------------------------------------------------------------------
251 // Event Loop
252 int op = OP_NULL;
253 struct KeyEvent event = { 0, OP_NULL };
254 do
255 {
256 menu_tagging_dispatcher(menu->win, &event);
257 window_redraw(NULL);
258
259 event = km_dokey(MdPgp, GETCH_NO_FLAGS);
260 op = event.op;
261 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
262 if (op < 0)
263 continue;
264 if (op == OP_NULL)
265 {
267 continue;
268 }
270
271 int rc = pgp_function_dispatcher(sdw.dlg, &event);
272
273 if (rc == FR_UNKNOWN)
274 rc = menu_function_dispatcher(menu->win, &event);
275 if (rc == FR_UNKNOWN)
276 rc = global_function_dispatcher(menu->win, &event);
277 } while (!pd.done);
278 // ---------------------------------------------------------------------------
279
280 ARRAY_FREE(&pua);
281 window_set_focus(old_focus);
283 return pd.key;
284}
static const struct Mapping PgpHelp[]
Help Bar for the PGP key selection dialog.
Definition dlg_pgp.c:90
int pgp_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Pgp function - Implements function_dispatcher_t -.
static int pgp_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format a PGP Key for the Menu - Implements Menu::make_entry() -.
Definition dlg_pgp.c:105
static int pgp_key_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition dlg_pgp.c:159
static int pgp_key_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
Definition dlg_pgp.c:130
@ WT_DLG_PGP
Pgp Dialog, dlg_pgp()
Definition mutt_window.h:88
void pgp_sort_keys(struct PgpUidArray *pua)
Sort an array of PGP keys.
Definition sort_pgp.c:142
Data to pass to the Pgp Functions.
struct Menu * menu
Pgp Menu.
bool done
Should we close the Dialog?
struct PgpKeyInfo * key
Selected Key.
Information about a PGP key.
Definition pgplib.h:49
struct PgpKeyInfo * next
Linked list.
Definition pgplib.h:59
PGP User ID.
Definition pgplib.h:36
struct PgpUid * next
Linked list.
Definition pgplib.h:41
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_smime()

struct SmimeKey * dlg_smime ( struct SmimeKey * keys,
const char * query )

Get the user to select a key -.

Parameters
keysList of keys to select from
queryString to match
Return values
ptrKey selected by user

The Select SMIME Key Dialog lets the user select an SMIME Key to use.

Definition at line 194 of file dlg_smime.c.

195{
196 struct SmimeKeyArray ska = ARRAY_HEAD_INITIALIZER;
197 for (struct SmimeKey *key = keys; key; key = key->next)
198 {
199 ARRAY_ADD(&ska, key);
200 }
201 /* sorting keys might be done later - TODO */
202
204 struct Menu *menu = sdw.menu;
205
206 struct SmimeData sd = { false, menu, &ska, NULL };
207
208 menu->max = ARRAY_SIZE(&ska);
210 menu->mdata = &sd;
211 menu->mdata_free = NULL; // Menu doesn't own the data
212
213 char title[256] = { 0 };
214 snprintf(title, sizeof(title), _("S/MIME certificates matching \"%s\""), query);
215 sbar_set_title(sdw.sbar, title);
216
218
219 struct MuttWindow *old_focus = window_set_focus(menu->win);
220 // ---------------------------------------------------------------------------
221 // Event Loop
222 int op = OP_NULL;
223 struct KeyEvent event = { 0, OP_NULL };
224 do
225 {
226 menu_tagging_dispatcher(menu->win, &event);
227 window_redraw(NULL);
228
230 op = event.op;
231 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
232 if (op < 0)
233 continue;
234 if (op == OP_NULL)
235 {
237 continue;
238 }
240
241 int rc = smime_function_dispatcher(sdw.dlg, &event);
242
243 if (rc == FR_UNKNOWN)
244 rc = menu_function_dispatcher(menu->win, &event);
245 if (rc == FR_UNKNOWN)
246 rc = global_function_dispatcher(menu->win, &event);
247 } while (!sd.done);
248
249 window_set_focus(old_focus);
251 return sd.key;
252}
static const struct Mapping SmimeHelp[]
Help Bar for the Smime key selection dialog.
Definition dlg_smime.c:72
int smime_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Smime function - Implements function_dispatcher_t -.
static int smime_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format an S/MIME Key for the Menu - Implements Menu::make_entry() -.
Definition dlg_smime.c:110
@ WT_DLG_SMIME
Smime Dialog, dlg_smime()
Definition mutt_window.h:91
Data to pass to the Smime Functions.
struct SmimeKey * key
Selected Key.
bool done
Should we close the Dialog?
struct Menu * menu
Smime Menu.
struct SmimeKeyArray * ska
Array of Keys.
An SIME key.
Definition smime.h:42
struct SmimeKey * next
Linked list.
Definition smime.h:49
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_pager()

int dlg_pager ( struct PagerView * pview)

Display an email, attachment, or help, in a window -.

Parameters
pviewPager view settings
Return values
0Success
-1Error

The Pager Dialog displays an Email to the user.

They can navigate through the Email, search through it and user color commands to highlight it.

From the Pager, the user can also use some Index functions, such as <next-entry> or <delete>.

This pager is actually not so simple as it once was. But it will be again. Currently it operates in 3 modes:

  • viewing messages. (PAGER_MODE_EMAIL)
  • viewing attachments. (PAGER_MODE_ATTACH)
  • viewing other stuff (e.g. help). (PAGER_MODE_OTHER) These can be distinguished by PagerMode in PagerView. Data is not yet polymorphic and is fused into a single struct (PagerData). Different elements of PagerData are expected to be present depending on the mode:
  • PAGER_MODE_EMAIL expects data->email and not expects data->body
  • PAGER_MODE_ATTACH expects data->email and data->body special sub-case of this mode is viewing attached email message it is recognized by presence of data->fp and data->body->email
  • PAGER_MODE_OTHER does not expect data->email or data->body

Definition at line 215 of file dlg_pager.c.

216{
217 //===========================================================================
218 // ACT 1 - Ensure sanity of the caller and determine the mode
219 //===========================================================================
220 ASSERT(pview);
221 ASSERT((pview->mode > PAGER_MODE_UNKNOWN) && (pview->mode < PAGER_MODE_MAX));
222 ASSERT(pview->pdata); // view can't exist in a vacuum
223 ASSERT(pview->win_pager);
224 ASSERT(pview->win_pbar);
225
226 struct MuttWindow *dlg = dialog_find(pview->win_pager);
227 struct IndexSharedData *shared = dlg->wdata;
228 struct MuttWindow *win_sidebar = window_find_child(dlg, WT_SIDEBAR);
229
230 switch (pview->mode)
231 {
232 case PAGER_MODE_EMAIL:
233 // This case was previously identified by IsEmail macro
234 // we expect data to contain email and not contain body
235 // We also expect email to always belong to some mailbox
236 ASSERT(shared->mailbox_view);
237 ASSERT(shared->mailbox);
238 ASSERT(shared->email);
239 ASSERT(!pview->pdata->body);
240 break;
241
243 // this case was previously identified by IsAttach and IsMsgAttach
244 // macros, we expect data to contain:
245 // - body (viewing regular attachment)
246 // - fp and body->email in special case of viewing an attached email.
247 ASSERT(pview->pdata->body);
248 if (pview->pdata->fp && pview->pdata->body->email)
249 {
250 // Special case: attachment is a full-blown email message.
251 // Yes, emails can contain other emails.
252 pview->mode = PAGER_MODE_ATTACH_E;
253 }
254 break;
255
256 case PAGER_MODE_HELP:
257 case PAGER_MODE_OTHER:
258 ASSERT(!shared->mailbox_view);
259 ASSERT(!shared->email);
260 ASSERT(!pview->pdata->body);
261 break;
262
264 case PAGER_MODE_MAX:
265 default:
266 // Unexpected mode. Catch fire and explode.
267 // This *should* happen if mode is PAGER_MODE_ATTACH_E, since
268 // we do not expect any caller to pass it to us.
269 ASSERT(false);
270 break;
271 }
272
273 //===========================================================================
274 // ACT 2 - Declare, initialize local variables, read config, etc.
275 //===========================================================================
276
277 //---------- local variables ------------------------------------------------
278 int op = 0;
279 enum MailboxType mailbox_type = shared->mailbox ? shared->mailbox->type : MUTT_UNKNOWN;
280 struct PagerPrivateData *priv = pview->win_pager->parent->wdata;
281 priv->rc = -1;
282 priv->searchctx = 0;
283 priv->first = true;
284 priv->wrapped = false;
285 priv->delay_read_timestamp = 0;
286 priv->pager_redraw = false;
287
288 // Wipe any previous state info
289 struct Notify *notify = priv->notify;
290 int prc = priv->rc;
291 memset(priv, 0, sizeof(*priv));
292 priv->rc = prc;
293 priv->notify = notify;
294 TAILQ_INIT(&priv->ansi_list);
295
296 //---------- setup flags ----------------------------------------------------
297 if (!(pview->flags & MUTT_SHOWCOLOR))
298 pview->flags |= MUTT_SHOWFLAT;
299
300 if ((pview->mode == PAGER_MODE_EMAIL) && !shared->email->read)
301 {
302 if (shared->mailbox_view)
303 shared->mailbox_view->msg_in_pager = shared->email->msgno;
304 const short c_pager_read_delay = cs_subset_number(NeoMutt->sub, "pager_read_delay");
305 if (c_pager_read_delay == 0)
306 {
307 mutt_set_flag(shared->mailbox, shared->email, MUTT_READ, true, true);
308 }
309 else
310 {
311 priv->delay_read_timestamp = mutt_date_now_ms() + (1000 * c_pager_read_delay);
312 }
313 }
314 //---------- setup help menu ------------------------------------------------
315 pview->win_pager->help_data = pager_resolve_help_mapping(pview->mode, mailbox_type);
316 pview->win_pager->help_md = MdPager;
317
318 //---------- initialize redraw pdata -----------------------------------------
320 priv->lines_max = LINES; // number of lines on screen, from curses
321 priv->lines = MUTT_MEM_CALLOC(priv->lines_max, struct Line);
322 priv->fp = mutt_file_fopen(pview->pdata->fname, "r");
323 priv->has_types = ((pview->mode == PAGER_MODE_EMAIL) || (pview->flags & MUTT_SHOWCOLOR)) ?
324 MUTT_TYPES :
325 0; // main message or rfc822 attachment
326
327 for (size_t i = 0; i < priv->lines_max; i++)
328 {
329 priv->lines[i].cid = -1;
330 priv->lines[i].search_arr_size = -1;
331 priv->lines[i].syntax = MUTT_MEM_CALLOC(1, struct TextSyntax);
332 (priv->lines[i].syntax)[0].first = -1;
333 (priv->lines[i].syntax)[0].last = -1;
334 }
335
336 // ---------- try to open the pdata file -------------------------------------
337 if (!priv->fp)
338 {
339 mutt_perror("%s", pview->pdata->fname);
340 for (size_t i = 0; i < priv->lines_max; i++)
341 FREE(&priv->lines[i].syntax);
342 FREE(&priv->lines);
343 return -1;
344 }
345
346 if (stat(pview->pdata->fname, &priv->st) != 0)
347 {
348 mutt_perror("%s", pview->pdata->fname);
349 mutt_file_fclose(&priv->fp);
350 for (size_t i = 0; i < priv->lines_max; i++)
351 FREE(&priv->lines[i].syntax);
352 FREE(&priv->lines);
353 return -1;
354 }
355 unlink(pview->pdata->fname);
356 priv->pview = pview;
357
358 //---------- show windows, set focus and visibility --------------------------
359 window_set_visible(pview->win_pager->parent, true);
362
363 struct MuttWindow *old_focus = window_set_focus(pview->win_pager);
364
365 //---------- jump to the bottom if requested ------------------------------
366 if (pview->flags & MUTT_PAGER_BOTTOM)
367 {
368 jump_to_bottom(priv, pview);
369 }
370
371 //-------------------------------------------------------------------------
372 // ACT 3: Read user input and decide what to do with it
373 // ...but also do a whole lot of other things.
374 //-------------------------------------------------------------------------
375
376 // Force an initial paint, which will populate priv->lines
378 window_redraw(NULL);
379
381 do
382 {
383 window_redraw(NULL);
384
385 const bool c_braille_friendly = cs_subset_bool(NeoMutt->sub, "braille_friendly");
386 if (c_braille_friendly)
387 {
388 if (BrailleRow != -1)
389 {
391 BrailleRow = -1;
392 }
393 }
394 else
395 {
396 mutt_window_move(priv->pview->win_pbar, 0, priv->pview->win_pager->state.cols - 1);
397 }
398
399 // force redraw of the screen at every iteration of the event loop
400 mutt_refresh();
401
402 //-------------------------------------------------------------------------
403 // Check if information in the status bar needs an update
404 // This is done because pager is a single-threaded application, which
405 // tries to emulate concurrency.
406 //-------------------------------------------------------------------------
407 bool do_new_mail = false;
408 if (shared->mailbox && !shared->attach_msg)
409 {
410 int oldcount = shared->mailbox->msg_count;
411 /* check for new mail */
412 enum MxStatus check = mx_mbox_check(shared->mailbox);
413 if (check == MX_STATUS_ERROR)
414 {
415 if (!shared->mailbox || buf_is_empty(&shared->mailbox->pathbuf))
416 {
417 /* fatal error occurred */
419 break;
420 }
421 }
422 else if ((check == MX_STATUS_NEW_MAIL) || (check == MX_STATUS_REOPENED) ||
423 (check == MX_STATUS_FLAGS))
424 {
425 /* notify user of newly arrived mail */
426 if (check == MX_STATUS_NEW_MAIL)
427 {
428 for (size_t i = oldcount; i < shared->mailbox->msg_count; i++)
429 {
430 struct Email *e = shared->mailbox->emails[i];
431
432 if (e && !e->read)
433 {
434 mutt_message(_("New mail in this mailbox"));
435 do_new_mail = true;
436 break;
437 }
438 }
439 }
440
441 if ((check == MX_STATUS_NEW_MAIL) || (check == MX_STATUS_REOPENED))
442 {
445 }
446 }
447
448 if (mutt_mailbox_notify(shared->mailbox) || do_new_mail)
449 {
450 const bool c_beep_new = cs_subset_bool(NeoMutt->sub, "beep_new");
451 if (c_beep_new)
452 mutt_beep(true);
453 const struct Expando *c_new_mail_command = cs_subset_expando(NeoMutt->sub, "new_mail_command");
454 if (c_new_mail_command)
455 {
456 struct Buffer *cmd = buf_pool_get();
457 menu_status_line(cmd, shared, NULL, -1, c_new_mail_command);
458 if (mutt_system(buf_string(cmd)) != 0)
459 mutt_error(_("Error running \"%s\""), buf_string(cmd));
460 buf_pool_release(&cmd);
461 }
462 }
463 }
464 //-------------------------------------------------------------------------
465
466 if (priv->pager_redraw)
467 {
468 priv->pager_redraw = false;
470 clearok(stdscr, true); /* force complete redraw */
471 msgwin_clear_text(NULL);
472
474
475 /* note: mutt_resize_screen() -> mutt_window_reflow() sets
476 * PAGER_REDRAW_PAGER and PAGER_REDRAW_FLOW */
477 continue;
478 }
479
480 dump_pager(priv);
481
482 //-------------------------------------------------------------------------
483 // Finally, read user's key press
484 //-------------------------------------------------------------------------
485 // km_dokey() reads not only user's key strokes, but also a MacroBuffer
486 // MacroBuffer may contain OP codes of the operations.
487 // MacroBuffer is global
488 // OP codes inserted into the MacroBuffer by various functions.
489 // One of such functions is `mutt_enter_command()`
490 // Some OP codes are not handled by pager, they cause pager to quit returning
491 // OP code to index. Index handles the operation and then restarts pager
492 struct KeyEvent event = km_dokey(MdPager, GETCH_NO_FLAGS);
493 op = event.op;
494
495 // km_dokey() can block, so recheck the timer.
496 // Note: This check must occur before handling the operations of the index
497 // as those can change the currently selected message/entry yielding to
498 // marking the wrong message as read.
500 {
501 if (shared->mailbox && shared->email)
502 mutt_set_flag(shared->mailbox, shared->email, MUTT_READ, true, true);
503 }
504
505 if (SigWinch)
506 priv->pager_redraw = true;
507
508 if (op >= OP_NULL)
510
511 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
512
513 if (op < OP_NULL)
514 continue;
515
516 if (op == OP_NULL)
517 {
519 continue;
520 }
521
522 int rc = pager_function_dispatcher(priv->pview->win_pager, &event);
523
524 if (pview->mode == PAGER_MODE_EMAIL)
525 {
526 if ((rc == FR_UNKNOWN) && priv->pview->win_index)
527 rc = index_function_dispatcher(priv->pview->win_index, &event);
528 if (rc == FR_UNKNOWN)
529 rc = sb_function_dispatcher(win_sidebar, &event);
530 }
531 if (rc == FR_UNKNOWN)
532 rc = global_function_dispatcher(priv->pview->win_pager, &event);
533
534 if ((rc == FR_UNKNOWN) &&
535 ((pview->mode == PAGER_MODE_ATTACH) || (pview->mode == PAGER_MODE_ATTACH_E)))
536 {
537 // Some attachment functions still need to be delegated
538 priv->rc = op;
539 break;
540 }
541
542 if ((pview->mode != PAGER_MODE_EMAIL) && (rc == FR_UNKNOWN))
544
545 } while (priv->loop == PAGER_LOOP_CONTINUE);
546 window_set_focus(old_focus);
547
548 //-------------------------------------------------------------------------
549 // END OF ACT 3: Read user input loop - while (op != OP_ABORT)
550 //-------------------------------------------------------------------------
551
552 mutt_file_fclose(&priv->fp);
553 if (pview->mode == PAGER_MODE_EMAIL)
554 {
555 if (shared->mailbox_view)
556 shared->mailbox_view->msg_in_pager = -1;
557 }
558
560
561 for (size_t i = 0; i < priv->lines_max; i++)
562 {
563 FREE(&(priv->lines[i].syntax));
564 if (priv->search_compiled && priv->lines[i].search)
565 FREE(&(priv->lines[i].search));
566 }
567 if (priv->search_compiled)
568 {
569 regfree(&priv->search_re);
570 priv->search_compiled = false;
571 }
572 FREE(&priv->lines);
573 {
574 struct AttrColor *ac = NULL;
575 int count = 0;
576 TAILQ_FOREACH(ac, &priv->ansi_list, entries)
577 {
578 count++;
579 }
580 color_debug(LL_DEBUG5, "AnsiColors %d\n", count);
581 }
583
584 priv->pview = NULL;
585
586 if (priv->loop == PAGER_LOOP_RELOAD)
587 return PAGER_LOOP_RELOAD;
588
589 return (priv->rc != -1) ? priv->rc : 0;
590}
void attr_color_list_clear(struct AttrColorList *acl)
Free the contents of an AttrColorList.
Definition attr.c:116
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition helpers.c:143
MailboxType
Supported mailbox formats.
Definition mailbox.h:40
@ MUTT_UNKNOWN
Mailbox wasn't recognised.
Definition mailbox.h:43
static void dump_pager(struct PagerPrivateData *priv)
Definition lib.h:151
static int color_debug(enum LogLevel level, const char *format,...)
Definition debug.h:51
struct MuttWindow * dialog_find(struct MuttWindow *win)
Find the parent Dialog of a Window.
Definition dialog.c:89
int BrailleRow
Braille display: row to leave the cursor.
Definition dlg_pager.c:65
int BrailleCol
Braille display: column to leave the cursor.
Definition dlg_pager.c:67
static bool check_read_delay(uint64_t *timestamp)
Is it time to mark the message read?
Definition dlg_pager.c:176
void pager_queue_redraw(struct PagerPrivateData *priv, PagerRedrawFlags redraw)
Queue a request for a redraw.
Definition dlg_pager.c:125
static const struct Mapping * pager_resolve_help_mapping(enum PagerMode mode, enum MailboxType type)
Determine help mapping based on pager mode and mailbox type.
Definition dlg_pager.c:139
#define mutt_file_fclose(FP)
Definition file.h:139
#define mutt_file_fopen(PATH, MODE)
Definition file.h:138
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
void mutt_flushinp(void)
Empty all the keyboard buffers.
Definition get.c:65
int pager_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Pager function - Implements function_dispatcher_t -.
Definition functions.c:1145
#define mutt_perror(...)
Definition logging2.h:95
@ LL_DEBUG5
Log at debug level 5.
Definition logging2.h:49
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
#define MUTT_MEM_CALLOC(n, type)
Definition memory.h:52
uint64_t mutt_date_now_ms(void)
Return the number of milliseconds since the Unix epoch.
Definition date.c:466
@ MUTT_READ
Messages that have been read.
Definition mutt.h:92
void mutt_resize_screen(void)
Update NeoMutt's opinion about the window size.
Definition resize.c:76
void window_set_visible(struct MuttWindow *win, bool visible)
Set a Window visible or hidden.
void window_invalidate_all(void)
Mark all windows as in need of repaint.
@ MUTT_WIN_SIZE_MAXIMISE
Window wants as much space as possible.
Definition mutt_window.h:48
struct MenuDefinition * MdPager
Pager Menu Definition.
Definition functions.c:64
bool jump_to_bottom(struct PagerPrivateData *priv, struct PagerView *pview)
Make sure the bottom line is displayed.
Definition functions.c:381
@ PAGER_LOOP_RELOAD
Reload the Pager from scratch.
Definition lib.h:154
@ PAGER_LOOP_CONTINUE
Stay in the Pager Event Loop.
Definition lib.h:152
#define MUTT_TYPES
Compute line's type.
Definition lib.h:67
#define MUTT_SHOWCOLOR
Show characters in color otherwise don't show characters.
Definition lib.h:64
#define PAGER_REDRAW_FLOW
Reflow the pager.
Definition lib.h:192
#define MUTT_PAGER_BOTTOM
Start at the bottom.
Definition lib.h:75
@ PAGER_MODE_OTHER
Pager is invoked via 3rd path. Non-email content is likely to be shown.
Definition lib.h:142
@ PAGER_MODE_HELP
Pager is invoked via 3rd path to show help.
Definition lib.h:141
@ PAGER_MODE_ATTACH
Pager is invoked via 2nd path. A user-selected attachment (mime part or a nested email) will be shown...
Definition lib.h:139
@ PAGER_MODE_EMAIL
Pager is invoked via 1st path. The mime part is selected automatically.
Definition lib.h:138
@ PAGER_MODE_ATTACH_E
A special case of PAGER_MODE_ATTACH - attachment is a full-blown email message.
Definition lib.h:140
@ PAGER_MODE_UNKNOWN
A default and invalid mode, should never be used.
Definition lib.h:136
@ PAGER_MODE_MAX
Another invalid mode, should never be used.
Definition lib.h:144
#define PAGER_REDRAW_PAGER
Redraw the pager.
Definition lib.h:191
#define MUTT_SHOWFLAT
Show characters (used for displaying help)
Definition lib.h:63
void qstyle_free_tree(struct QuoteStyle **quote_list)
Free an entire tree of QuoteStyle.
Definition qstyle.c:58
#define TAILQ_FOREACH(var, head, field)
Definition queue.h:782
#define TAILQ_INIT(head)
Definition queue.h:822
#define ASSERT(COND)
Definition signal2.h:59
volatile sig_atomic_t SigWinch
true after SIGWINCH is received
Definition signal.c:69
A curses colour and its attributes.
Definition attr.h:65
struct Email * email
header information for message/rfc822
Definition body.h:74
int msgno
Number displayed to the user.
Definition email.h:111
struct Email * email
Currently selected Email.
Definition shared_data.h:42
A line of text in the pager.
Definition display.h:50
short search_arr_size
Number of items in search array.
Definition display.h:59
struct TextSyntax * search
Array of search text in the line.
Definition display.h:60
short cid
Default line colour, e.g. MT_COLOR_SIGNATURE.
Definition display.h:52
struct TextSyntax * syntax
Array of coloured text in the line.
Definition display.h:57
int msg_in_pager
Message currently shown in the pager.
Definition mview.h:45
struct MuttWindow * parent
Parent Window.
enum MuttWindowSize size
Type of Window, e.g. MUTT_WIN_SIZE_FIXED.
Notification API.
Definition notify.c:53
const char * fname
Name of the file to read.
Definition lib.h:165
FILE * fp
Source stream.
Definition lib.h:163
struct Body * body
Current attachment.
Definition lib.h:162
Private state data for the Pager.
int rc
Return code from functions.
bool wrapped
Has the search/next wrapped around?
bool pager_redraw
Force a complete redraw.
int lines_max
Capacity of lines array (total entries)
uint64_t delay_read_timestamp
Time that email was first shown.
enum PagerLoopMode loop
What the Event Loop should do next, e.g. PAGER_LOOP_CONTINUE.
struct Line * lines
Array of text lines in pager.
int has_types
Set to MUTT_TYPES for PAGER_MODE_EMAIL or MUTT_SHOWCOLOR.
struct Notify * notify
Notifications: NotifyPager, PagerPrivateData.
struct stat st
Stats about Email file.
bool first
First time flag for toggle-new.
struct QuoteStyle * quote_list
Tree of quoting levels.
struct PagerView * pview
Object to view in the pager.
struct AttrColorList ansi_list
List of ANSI colours used in the Pager.
int searchctx
Space to show around search matches.
regex_t search_re
Compiled search string.
FILE * fp
File containing decrypted/decoded/weeded Email.
bool search_compiled
Search regex is in use.
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
struct MuttWindow * win_pbar
Pager Bar Window.
Definition lib.h:179
struct MuttWindow * win_pager
Pager Window.
Definition lib.h:180
Highlighting for a piece of text.
Definition display.h:39
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_pattern()

bool dlg_pattern ( struct Buffer * buf)

Show menu to select a Pattern -.

Parameters
bufBuffer for the selected Pattern
Return values
trueA selection was made

The Select Pattern Dialog shows the user a help page of Patterns. They can select one to auto-complete some functions, e.g. <limit>

Definition at line 302 of file dlg_pattern.c.

303{
304 struct PatternData *pd = pattern_data_new();
305
308
309 struct Menu *menu = sdw.menu;
310 pd->menu = menu;
311 pd->buf = buf;
312
313 menu->mdata = pd;
316 menu->max = ARRAY_SIZE(&pd->entries);
317
318 // L10N: Pattern completion menu title
319 sbar_set_title(sdw.sbar, _("Patterns"));
320
321 // NT_COLOR is handled by the SimpleDialog
324
325 struct MuttWindow *old_focus = window_set_focus(menu->win);
326 // ---------------------------------------------------------------------------
327 // Event Loop
328 int op = OP_NULL;
329 struct KeyEvent event = { 0, OP_NULL };
330 do
331 {
332 menu_tagging_dispatcher(menu->win, &event);
333 window_redraw(NULL);
334
336 op = event.op;
337 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
338 if (op < 0)
339 continue;
340 if (op == OP_NULL)
341 {
343 continue;
344 }
346
347 int rc = pattern_function_dispatcher(sdw.dlg, &event);
348 if (rc == FR_UNKNOWN)
349 rc = menu_function_dispatcher(menu->win, &event);
350 if (rc == FR_UNKNOWN)
351 rc = global_function_dispatcher(menu->win, &event);
352 } while (!pd->done);
353 // ---------------------------------------------------------------------------
354
355 bool rc = pd->selection;
356
357 window_set_focus(old_focus);
359
360 return rc;
361}
static const struct Mapping PatternHelp[]
Help Bar for the Pattern selection dialog.
Definition dlg_pattern.c:88
static void create_pattern_entries(struct PatternEntryArray *pea)
Create the Pattern Entries.
int pattern_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Pattern function - Implements function_dispatcher_t -.
Definition functions.c:83
static int pattern_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Create a Pattern for the Menu - Implements Menu::make_entry() -.
void pattern_data_free(struct Menu *menu, void **ptr)
Free Pattern Data - Implements Menu::mdata_free() -.
static int pattern_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
static int pattern_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
@ WT_DLG_PATTERN
Pattern Dialog, dlg_pattern()
Definition mutt_window.h:87
struct PatternData * pattern_data_new(void)
Create new Pattern Data.
Data to pass to the Pattern Functions.
struct Menu * menu
Pattern Menu.
struct PatternEntryArray entries
Patterns for the Menu.
bool done
Should we close the Dialog?
struct Buffer * buf
Buffer for the results.
bool selection
Was a selection made?
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dlg_postpone()

struct Email * dlg_postpone ( struct Mailbox * m)

Create a Menu to select a postponed message -.

Parameters
mMailbox
Return values
ptrEmail

The Select Postponed Email Dialog shows the user a list of draft emails. They can select one to use in the Compose Dialog.

This dialog is only shown if there are two or more postponed emails.

Definition at line 209 of file dlg_postpone.c.

210{
212 // Required to number the emails
213 struct MailboxView *mv = mview_new(m, NeoMutt->notify);
214
215 struct Menu *menu = sdw.menu;
217 menu->color = post_color;
218 menu->max = m->msg_count;
219
220 struct PostponeData pd = { mv, menu, NULL, false, search_state_new() };
221 menu->mdata = &pd;
222 menu->mdata_free = NULL; // Menu doesn't own the data
223
224 // NT_COLOR is handled by the SimpleDialog
227
228 sbar_set_title(sdw.sbar, _("Postponed Messages"));
229
230 /* The postponed mailbox is setup to have sorting disabled, but the global
231 * `$sort` variable may indicate something different. Sorting has to be
232 * disabled while the postpone menu is being displayed. */
233 const enum EmailSortType c_sort = cs_subset_sort(NeoMutt->sub, "sort");
235
236 struct MuttWindow *old_focus = window_set_focus(menu->win);
237 // ---------------------------------------------------------------------------
238 // Event Loop
239 int op = OP_NULL;
240 struct KeyEvent event = { 0, OP_NULL };
241 do
242 {
243 menu_tagging_dispatcher(menu->win, &event);
244 window_redraw(NULL);
245
247 op = event.op;
248 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
249 if (op < 0)
250 continue;
251 if (op == OP_NULL)
252 {
254 continue;
255 }
257
258 int rc = postpone_function_dispatcher(sdw.dlg, &event);
259
260 if (rc == FR_UNKNOWN)
261 rc = menu_function_dispatcher(menu->win, &event);
262 if (rc == FR_UNKNOWN)
263 rc = global_function_dispatcher(menu->win, &event);
264 } while (!pd.done);
265 // ---------------------------------------------------------------------------
266
267 mview_free(&mv);
268 cs_subset_str_native_set(NeoMutt->sub, "sort", c_sort, NULL);
270 window_set_focus(old_focus);
272
273 return pd.email;
274}
static const struct Mapping PostponedHelp[]
Help Bar for the Postponed email selection dialog.
@ EMAIL_SORT_UNSORTED
Sort by the order the messages appear in the mailbox.
Definition sort.h:64
int postpone_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Postpone function - Implements function_dispatcher_t -.
Definition functions.c:191
static const struct AttrColor * post_color(struct Menu *menu, int line)
Calculate the colour for a line of the postpone index - Implements Menu::color() -.
static int post_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format an Email for the Menu - Implements Menu::make_entry() -.
static int postponed_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
static int postponed_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
@ WT_DLG_POSTPONE
Postpone Dialog, dlg_postpone()
Definition mutt_window.h:89
struct MenuDefinition * MdPostpone
Postpone Menu Definition.
Definition functions.c:43
void search_state_free(struct SearchState **ptr)
Free a SearchState.
struct SearchState * search_state_new(void)
Create a new SearchState.
View of a Mailbox.
Definition mview.h:40
Data to pass to the Postpone Functions.
Definition functions.h:37
struct Email * email
Selected Email.
Definition functions.h:40
struct SearchState * search_state
State of the current search.
Definition functions.h:42
bool done
Should we close the Dialog?
Definition functions.h:41
struct Menu * menu
Postponed Menu.
Definition functions.h:39
int cs_subset_str_native_set(const struct ConfigSubset *sub, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
Definition subset.c:303
+ Here is the call graph for this function:
+ Here is the caller graph for this function: