NeoMutt  2024-11-14-138-ge5ca67
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
dlg_index.c File Reference

Index Dialog. More...

#include "config.h"
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include "private.h"
#include "mutt/lib.h"
#include "config/lib.h"
#include "email/lib.h"
#include "core/lib.h"
#include "conn/lib.h"
#include "gui/lib.h"
#include "color/lib.h"
#include "expando/lib.h"
#include "index/lib.h"
#include "key/lib.h"
#include "menu/lib.h"
#include "nntp/lib.h"
#include "pager/lib.h"
#include "pattern/lib.h"
#include "sidebar/lib.h"
#include "expando_index.h"
#include "functions.h"
#include "globals.h"
#include "hook.h"
#include "mutt_logging.h"
#include "mutt_mailbox.h"
#include "mutt_thread.h"
#include "mview.h"
#include "mx.h"
#include "nntp/adata.h"
#include "private_data.h"
#include "protos.h"
#include "shared_data.h"
#include "status.h"
#include "notmuch/lib.h"
#include "monitor.h"
+ Include dependency graph for dlg_index.c:

Go to the source code of this file.

Functions

bool check_acl (struct Mailbox *m, AclFlags acl, const char *msg)
 Check the ACLs for a function.
 
void collapse_all (struct MailboxView *mv, struct Menu *menu, int toggle)
 Collapse/uncollapse all threads.
 
static void uncollapse_thread (struct MailboxView *mv, int index)
 Open a collapsed thread.
 
int find_next_undeleted (struct MailboxView *mv, int msgno, bool uncollapse)
 Find the next undeleted email.
 
int find_previous_undeleted (struct MailboxView *mv, int msgno, bool uncollapse)
 Find the previous undeleted email.
 
int find_first_message (struct MailboxView *mv)
 Get index of first new message.
 
void resort_index (struct MailboxView *mv, struct Menu *menu)
 Resort the index.
 
static void update_index_threaded (struct MailboxView *mv, enum MxStatus check, int oldcount)
 Update the index (if threaded)
 
static void update_index_unthreaded (struct MailboxView *mv, enum MxStatus check)
 Update the index (if unthreaded)
 
void update_index (struct Menu *menu, struct MailboxView *mv, enum MxStatus check, int oldcount, const struct IndexSharedData *shared)
 Update the index.
 
static int index_mailbox_observer (struct NotifyCallback *nc)
 Notification that a Mailbox has changed - Implements observer_t -.
 
void change_folder_mailbox (struct Menu *menu, struct Mailbox *m, int *oldcount, struct IndexSharedData *shared, bool read_only)
 Change to a different Mailbox by pointer.
 
struct Mailboxchange_folder_notmuch (struct Menu *menu, char *buf, int buflen, int *oldcount, struct IndexSharedData *shared, bool read_only)
 Change to a different Notmuch Mailbox by string.
 
void change_folder_string (struct Menu *menu, struct Buffer *buf, int *oldcount, struct IndexSharedData *shared, bool read_only)
 Change to a different Mailbox by string.
 
int mutt_make_string (struct Buffer *buf, size_t max_cols, const struct Expando *exp, struct Mailbox *m, int inpgr, struct Email *e, MuttFormatFlags flags, const char *progress)
 Create formatted strings using mailbox expandos.
 
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() -.
 
const struct AttrColorindex_color (struct Menu *menu, int line)
 Calculate the colour for a line of the index - Implements Menu::color() -.
 
void mutt_draw_statusline (struct MuttWindow *win, int max_cols, const char *buf, size_t buflen)
 Draw a highlighted status bar.
 
struct Mailboxdlg_index (struct MuttWindow *dlg, struct Mailbox *m_init)
 Display a list of emails -.
 
void email_set_color (struct Mailbox *m, struct Email *e)
 Select an Index colour for an Email.
 
struct MuttWindowindex_pager_init (void)
 Allocate the Windows for the Index/Pager.
 
void index_change_folder (struct MuttWindow *dlg, struct Mailbox *m)
 Change the current folder, cautiously.
 

Variables

static const struct Mapping IndexHelp []
 Help Bar for the Index dialog.
 
const struct Mapping IndexNewsHelp []
 Help Bar for the News Index dialog.
 

Detailed Description

Index Dialog.

Authors
  • Pietro Cerutti
  • Richard Russon
  • R Primus
  • Eric Blake
  • Igor Serebryany
  • Dennis Schön
  • Tóth János

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file dlg_index.c.

Function Documentation

◆ check_acl()

bool check_acl ( struct Mailbox m,
AclFlags  acl,
const char *  msg 
)

Check the ACLs for a function.

Parameters
mMailbox
aclACL, see AclFlags
msgError message for failure
Return values
trueThe function is permitted

Definition at line 138 of file dlg_index.c.

139{
140 if (!m)
141 return false;
142
143 if (!(m->rights & acl))
144 {
145 /* L10N: %s is one of the CHECK_ACL entries below. */
146 mutt_error(_("%s: Operation not permitted by ACL"), msg);
147 return false;
148 }
149
150 return true;
151}
#define mutt_error(...)
Definition: logging2.h:92
#define _(a)
Definition: message.h:28
AclFlags rights
ACL bits, see AclFlags.
Definition: mailbox.h:119
+ Here is the caller graph for this function:

◆ collapse_all()

void collapse_all ( struct MailboxView mv,
struct Menu menu,
int  toggle 
)

Collapse/uncollapse all threads.

Parameters
mvMailbox View
menucurrent menu
toggletoggle collapsed state

This function is called by the OP_MAIN_COLLAPSE_ALL command and on folder enter if the $collapse_all option is set. In the first case, the toggle parameter is 1 to actually toggle collapsed/uncollapsed state on all threads. In the second case, the toggle parameter is 0, actually turning this function into a one-way collapse.

Definition at line 165 of file dlg_index.c.

166{
167 if (!mv || !mv->mailbox || (mv->mailbox->msg_count == 0) || !menu)
168 return;
169
170 struct Email *e_cur = mutt_get_virt_email(mv->mailbox, menu_get_index(menu));
171 if (!e_cur)
172 return;
173
174 int final;
175
176 /* Figure out what the current message would be after folding / unfolding,
177 * so that we can restore the cursor in a sane way afterwards. */
178 if (e_cur->collapsed && toggle)
179 final = mutt_uncollapse_thread(e_cur);
180 else if (mutt_thread_can_collapse(e_cur))
181 final = mutt_collapse_thread(e_cur);
182 else
183 final = e_cur->vnum;
184
185 if (final == -1)
186 return;
187
188 struct Email *base = mutt_get_virt_email(mv->mailbox, final);
189 if (!base)
190 return;
191
192 /* Iterate all threads, perform collapse/uncollapse as needed */
193 mv->collapsed = toggle ? !mv->collapsed : true;
195
196 /* Restore the cursor */
198 menu->max = mv->mailbox->vcount;
199 for (int i = 0; i < mv->mailbox->vcount; i++)
200 {
201 struct Email *e = mutt_get_virt_email(mv->mailbox, i);
202 if (!e)
203 break;
204 if (e->index == base->index)
205 {
206 menu_set_index(menu, i);
207 break;
208 }
209 }
210
212}
#define MENU_REDRAW_INDEX
Redraw the index.
Definition: lib.h:56
void menu_queue_redraw(struct Menu *menu, MenuRedrawFlags redraw)
Queue a request for a redraw.
Definition: menu.c:184
int menu_get_index(struct Menu *menu)
Get the current selection in the Menu.
Definition: menu.c:160
MenuRedrawFlags menu_set_index(struct Menu *menu, int index)
Set the current selection in the Menu.
Definition: menu.c:174
void mutt_thread_collapse(struct ThreadsContext *tctx, bool collapse)
Toggle collapse.
Definition: mutt_thread.c:1791
off_t mutt_set_vnum(struct Mailbox *m)
Set the virtual index number of all the messages in a mailbox.
Definition: mutt_thread.c:1406
bool mutt_thread_can_collapse(struct Email *e)
Check whether a thread can be collapsed.
Definition: mutt_thread.c:1819
#define mutt_uncollapse_thread(e)
Definition: mutt_thread.h:108
#define mutt_collapse_thread(e)
Definition: mutt_thread.h:107
struct Email * mutt_get_virt_email(struct Mailbox *m, int vnum)
Get a virtual Email.
Definition: mview.c:417
The envelope/body of an email.
Definition: email.h:39
bool collapsed
Is this message part of a collapsed thread?
Definition: email.h:120
int vnum
Virtual message number.
Definition: email.h:114
int index
The absolute (unsorted) message number.
Definition: email.h:110
bool collapsed
Are all threads collapsed?
Definition: mview.h:49
struct ThreadsContext * threads
Threads context.
Definition: mview.h:44
struct Mailbox * mailbox
Current Mailbox.
Definition: mview.h:51
int vcount
The number of virtual messages.
Definition: mailbox.h:99
int msg_count
Total number of messages.
Definition: mailbox.h:88
int max
Number of entries in the menu.
Definition: lib.h:81
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ uncollapse_thread()

static void uncollapse_thread ( struct MailboxView mv,
int  index 
)
static

Open a collapsed thread.

Parameters
mvMailbox View
indexMessage number

Definition at line 219 of file dlg_index.c.

220{
221 if (!mv || !mv->mailbox)
222 return;
223
224 struct Mailbox *m = mv->mailbox;
225 struct Email *e = mutt_get_virt_email(m, index);
226 if (e && e->collapsed)
227 {
229 mutt_set_vnum(m);
230 }
231}
A mailbox.
Definition: mailbox.h:79
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ find_next_undeleted()

int find_next_undeleted ( struct MailboxView mv,
int  msgno,
bool  uncollapse 
)

Find the next undeleted email.

Parameters
mvMailbox view
msgnoMessage number to start at
uncollapseOpen collapsed threads
Return values
>=0Message number of next undeleted email
-1No more undeleted messages

Definition at line 241 of file dlg_index.c.

242{
243 if (!mv || !mv->mailbox)
244 return -1;
245
246 struct Mailbox *m = mv->mailbox;
247
248 int index = -1;
249 for (int i = msgno + 1; i < m->vcount; i++)
250 {
251 struct Email *e = mutt_get_virt_email(m, i);
252 if (!e)
253 continue;
254 if (!e->deleted)
255 {
256 index = i;
257 break;
258 }
259 }
260
261 if (uncollapse)
263
264 return index;
265}
static void uncollapse_thread(struct MailboxView *mv, int index)
Open a collapsed thread.
Definition: dlg_index.c:219
bool deleted
Email is deleted.
Definition: email.h:78
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ find_previous_undeleted()

int find_previous_undeleted ( struct MailboxView mv,
int  msgno,
bool  uncollapse 
)

Find the previous undeleted email.

Parameters
mvMailbox View
msgnoMessage number to start at
uncollapseOpen collapsed threads
Return values
>=0Message number of next undeleted email
-1No more undeleted messages

Definition at line 275 of file dlg_index.c.

276{
277 if (!mv || !mv->mailbox)
278 return -1;
279
280 struct Mailbox *m = mv->mailbox;
281
282 int index = -1;
283 for (int i = msgno - 1; i >= 0; i--)
284 {
285 struct Email *e = mutt_get_virt_email(m, i);
286 if (!e)
287 continue;
288 if (!e->deleted)
289 {
290 index = i;
291 break;
292 }
293 }
294
295 if (uncollapse)
297
298 return index;
299}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ find_first_message()

int find_first_message ( struct MailboxView mv)

Get index of first new message.

Parameters
mvMailbox view
Return values
numIndex of first new message

Return the index of the first new message, or failing that, the first unread message.

Definition at line 309 of file dlg_index.c.

310{
311 if (!mv)
312 return 0;
313
314 struct Mailbox *m = mv->mailbox;
315 if (!m || (m->msg_count == 0))
316 return 0;
317
318 int old = -1;
319 for (int i = 0; i < m->vcount; i++)
320 {
321 struct Email *e = mutt_get_virt_email(m, i);
322 if (!e)
323 continue;
324 if (!e->read && !e->deleted)
325 {
326 if (!e->old)
327 return i;
328 if (old == -1)
329 old = i;
330 }
331 }
332 if (old != -1)
333 return old;
334
335 /* If `$use_threads` is not threaded and `$sort` is reverse, the latest
336 * message is first. Otherwise, the latest message is first if exactly
337 * one of `$use_threads` and `$sort` are reverse.
338 */
339 enum EmailSortType c_sort = cs_subset_sort(m->sub, "sort");
340 if ((c_sort & SORT_MASK) == EMAIL_SORT_THREADS)
341 c_sort = cs_subset_sort(m->sub, "sort_aux");
342 bool reverse = false;
343 switch (mutt_thread_style())
344 {
345 case UT_FLAT:
346 reverse = c_sort & SORT_REVERSE;
347 break;
348 case UT_THREADS:
349 reverse = c_sort & SORT_REVERSE;
350 break;
351 case UT_REVERSE:
352 reverse = !(c_sort & SORT_REVERSE);
353 break;
354 default:
355 ASSERT(false);
356 }
357
358 if (reverse || (m->vcount == 0))
359 return 0;
360
361 return m->vcount - 1;
362}
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:38
#define SORT_REVERSE
Reverse the order of the sort.
Definition: sort.h:39
EmailSortType
Methods for sorting Emails.
Definition: sort.h:53
@ EMAIL_SORT_THREADS
Sort by email threads.
Definition: sort.h:62
enum UseThreads mutt_thread_style(void)
Which threading style is active?
Definition: mutt_thread.c:81
@ UT_FLAT
Unthreaded.
Definition: mutt_thread.h:99
@ UT_THREADS
Normal threading (root above subthreads)
Definition: mutt_thread.h:100
@ UT_REVERSE
Reverse threading (subthreads above root)
Definition: mutt_thread.h:101
#define ASSERT(COND)
Definition: signal2.h:58
bool read
Email is read.
Definition: email.h:50
bool old
Email is seen, but unread.
Definition: email.h:49
struct ConfigSubset * sub
Inherited config items.
Definition: mailbox.h:83
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ resort_index()

void resort_index ( struct MailboxView mv,
struct Menu menu 
)

Resort the index.

Parameters
mvMailbox View
menuCurrent Menu

Definition at line 369 of file dlg_index.c.

370{
371 if (!mv || !mv->mailbox || !menu)
372 return;
373
374 struct Mailbox *m = mv->mailbox;
375 const int old_index = menu_get_index(menu);
376 struct Email *e_cur = mutt_get_virt_email(m, old_index);
377
378 int new_index = -1;
379 mutt_sort_headers(mv, false);
380
381 /* Restore the current message */
382 for (int i = 0; i < m->vcount; i++)
383 {
384 struct Email *e = mutt_get_virt_email(m, i);
385 if (!e)
386 continue;
387 if (e == e_cur)
388 {
389 new_index = i;
390 break;
391 }
392 }
393
394 if (mutt_using_threads() && (old_index < 0))
395 new_index = mutt_parent_message(e_cur, false);
396
397 if (old_index < 0)
398 new_index = find_first_message(mv);
399
400 menu->max = m->vcount;
401 menu_set_index(menu, new_index);
403}
int find_first_message(struct MailboxView *mv)
Get index of first new message.
Definition: dlg_index.c:309
void mutt_sort_headers(struct MailboxView *mv, bool init)
Sort emails by their headers.
Definition: sort.c:355
int mutt_parent_message(struct Email *e, bool find_root)
Find the parent of a message.
Definition: mutt_thread.c:1356
#define mutt_using_threads()
Definition: mutt_thread.h:114
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ update_index_threaded()

static void update_index_threaded ( struct MailboxView mv,
enum MxStatus  check,
int  oldcount 
)
static

Update the index (if threaded)

Parameters
mvMailbox
checkFlags, e.g. MX_STATUS_REOPENED
oldcountHow many items are currently in the index

Definition at line 411 of file dlg_index.c.

412{
413 struct Email **save_new = NULL;
414 const bool lmt = mview_has_limit(mv);
415
416 struct Mailbox *m = mv->mailbox;
417 int num_new = MAX(0, m->msg_count - oldcount);
418
419 const bool c_uncollapse_new = cs_subset_bool(m->sub, "uncollapse_new");
420 /* save the list of new messages */
421 if ((check != MX_STATUS_REOPENED) && (oldcount > 0) &&
422 (lmt || c_uncollapse_new) && (num_new > 0))
423 {
424 save_new = MUTT_MEM_MALLOC(num_new, struct Email *);
425 for (int i = oldcount; i < m->msg_count; i++)
426 save_new[i - oldcount] = m->emails[i];
427 }
428
429 /* Sort first to thread the new messages, because some patterns
430 * require the threading information.
431 *
432 * If the mailbox was reopened, need to rethread from scratch. */
434
435 if (lmt)
436 {
437 for (int i = 0; i < m->msg_count; i++)
438 {
439 struct Email *e = m->emails[i];
440
441 if ((e->limit_visited && e->visible) ||
443 MUTT_MATCH_FULL_ADDRESS, m, e, NULL))
444 {
445 /* vnum will get properly set by mutt_set_vnum(), which
446 * is called by mutt_sort_headers() just below. */
447 e->vnum = 1;
448 e->visible = true;
449 }
450 else
451 {
452 e->vnum = -1;
453 e->visible = false;
454 }
455
456 // mark email as visited so we don't re-apply the pattern next time
457 e->limit_visited = true;
458 }
459 /* Need a second sort to set virtual numbers and redraw the tree */
460 mutt_sort_headers(mv, false);
461 }
462
463 /* uncollapse threads with new mail */
464 if (c_uncollapse_new)
465 {
466 if (check == MX_STATUS_REOPENED)
467 {
468 mv->collapsed = false;
470 mutt_set_vnum(m);
471 }
472 else if (oldcount > 0)
473 {
474 for (int j = 0; j < num_new; j++)
475 {
476 if (save_new[j]->visible)
477 {
478 mutt_uncollapse_thread(save_new[j]);
479 }
480 }
481 mutt_set_vnum(m);
482 }
483 }
484
485 FREE(&save_new);
486}
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:47
bool mutt_pattern_exec(struct Pattern *pat, PatternExecFlags flags, struct Mailbox *m, struct Email *e, struct PatternCache *cache)
Match a pattern against an email header.
Definition: exec.c:1147
#define FREE(x)
Definition: memory.h:55
#define MUTT_MEM_MALLOC(n, type)
Definition: memory.h:41
#define MAX(a, b)
Definition: memory.h:31
bool mview_has_limit(const struct MailboxView *mv)
Is a limit active?
Definition: mview.c:438
@ MX_STATUS_REOPENED
Mailbox was reopened.
Definition: mxapi.h:68
#define MUTT_MATCH_FULL_ADDRESS
Match the full address.
Definition: lib.h:106
#define SLIST_FIRST(head)
Definition: queue.h:227
bool visible
Is this message part of the view?
Definition: email.h:121
bool limit_visited
Has the limit pattern been applied to this message?
Definition: email.h:122
struct PatternList * limit_pattern
Compiled limit pattern.
Definition: mview.h:43
struct Email ** emails
Array of Emails.
Definition: mailbox.h:96
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ update_index_unthreaded()

static void update_index_unthreaded ( struct MailboxView mv,
enum MxStatus  check 
)
static

Update the index (if unthreaded)

Parameters
mvMailbox
checkFlags, e.g. MX_STATUS_REOPENED

Definition at line 493 of file dlg_index.c.

494{
495 /* We are in a limited view. Check if the new message(s) satisfy
496 * the limit criteria. If they do, set their virtual msgno so that
497 * they will be visible in the limited view */
498 if (mview_has_limit(mv))
499 {
500 int padding = mx_msg_padding_size(mv->mailbox);
501 mv->mailbox->vcount = mv->vsize = 0;
502 for (int i = 0; i < mv->mailbox->msg_count; i++)
503 {
504 struct Email *e = mv->mailbox->emails[i];
505 if (!e)
506 break;
507
508 if ((e->limit_visited && e->visible) ||
510 MUTT_MATCH_FULL_ADDRESS, mv->mailbox, e, NULL))
511 {
513 e->vnum = mv->mailbox->vcount;
514 mv->mailbox->v2r[mv->mailbox->vcount] = i;
515 e->visible = true;
516 mv->mailbox->vcount++;
517 struct Body *b = e->body;
518 mv->vsize += b->length + b->offset - b->hdr_offset + padding;
519 }
520 else
521 {
522 e->visible = false;
523 }
524
525 // mark email as visited so we don't re-apply the pattern next time
526 e->limit_visited = true;
527 }
528 }
529
530 /* if the mailbox was reopened, need to rethread from scratch */
532}
int mx_msg_padding_size(struct Mailbox *m)
Bytes of padding between messages - Wrapper for MxOps::msg_padding_size()
Definition: mx.c:1505
The body of an email.
Definition: body.h:36
LOFF_T offset
offset where the actual data begins
Definition: body.h:52
LOFF_T length
length (in bytes) of attachment
Definition: body.h:53
long hdr_offset
Offset in stream where the headers begin.
Definition: body.h:81
struct Body * body
List of MIME parts.
Definition: email.h:69
off_t vsize
Size (in bytes) of the messages shown.
Definition: mview.h:41
int * v2r
Mapping from virtual to real msgno.
Definition: mailbox.h:98
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ update_index()

void update_index ( struct Menu menu,
struct MailboxView mv,
enum MxStatus  check,
int  oldcount,
const struct IndexSharedData shared 
)

Update the index.

Parameters
menuCurrent Menu
mvMailbox
checkFlags, e.g. MX_STATUS_REOPENED
oldcountHow many items are currently in the index
sharedShared Index data

Definition at line 542 of file dlg_index.c.

544{
545 if (!menu || !mv)
546 return;
547
548 struct Mailbox *m = mv->mailbox;
549 if (mutt_using_threads())
550 update_index_threaded(mv, check, oldcount);
551 else
552 update_index_unthreaded(mv, check);
553
554 menu->max = m->vcount;
555 const int old_index = menu_get_index(menu);
556 int index = -1;
557 if (oldcount)
558 {
559 /* restore the current message to the message it was pointing to */
560 for (int i = 0; i < m->vcount; i++)
561 {
562 struct Email *e = mutt_get_virt_email(m, i);
563 if (!e)
564 continue;
565 if (index_shared_data_is_cur_email(shared, e))
566 {
567 index = i;
568 break;
569 }
570 }
571 }
572
573 if (index < 0)
574 {
575 index = (old_index < m->vcount) ? old_index : find_first_message(mv);
576 }
577 menu_set_index(menu, index);
578}
static void update_index_threaded(struct MailboxView *mv, enum MxStatus check, int oldcount)
Update the index (if threaded)
Definition: dlg_index.c:411
static void update_index_unthreaded(struct MailboxView *mv, enum MxStatus check)
Update the index (if unthreaded)
Definition: dlg_index.c:493
bool index_shared_data_is_cur_email(const struct IndexSharedData *shared, const struct Email *e)
Check whether an email is the currently selected Email.
Definition: shared_data.c:264
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ change_folder_mailbox()

void change_folder_mailbox ( struct Menu menu,
struct Mailbox m,
int *  oldcount,
struct IndexSharedData shared,
bool  read_only 
)

Change to a different Mailbox by pointer.

Parameters
menuCurrent Menu
mMailbox
oldcountHow many items are currently in the index
sharedShared Index data
read_onlyOpen Mailbox in read-only mode

Definition at line 611 of file dlg_index.c.

613{
614 if (!m)
615 return;
616
617 /* keepalive failure in mutt_enter_fname may kill connection. */
618 if (shared->mailbox && (buf_is_empty(&shared->mailbox->pathbuf)))
619 {
620 mview_free(&shared->mailbox_view);
621 mailbox_free(&shared->mailbox);
622 }
623
624 if (shared->mailbox)
625 {
626 char *new_last_folder = NULL;
627#ifdef USE_INOTIFY
628 int monitor_remove_rc = mutt_monitor_remove(NULL);
629#endif
630 if (shared->mailbox->compress_info && (shared->mailbox->realpath[0] != '\0'))
631 new_last_folder = mutt_str_dup(shared->mailbox->realpath);
632 else
633 new_last_folder = mutt_str_dup(mailbox_path(shared->mailbox));
634 *oldcount = shared->mailbox->msg_count;
635
636 const enum MxStatus check = mx_mbox_close(shared->mailbox);
637 if (check == MX_STATUS_OK)
638 {
639 mview_free(&shared->mailbox_view);
640 if (shared->mailbox != m)
641 {
642 mailbox_free(&shared->mailbox);
643 }
644 }
645 else
646 {
647#ifdef USE_INOTIFY
648 if (monitor_remove_rc == 0)
649 mutt_monitor_add(NULL);
650#endif
651 if ((check == MX_STATUS_NEW_MAIL) || (check == MX_STATUS_REOPENED))
652 update_index(menu, shared->mailbox_view, check, *oldcount, shared);
653
654 FREE(&new_last_folder);
657 return;
658 }
660 LastFolder = new_last_folder;
661 }
663
664 /* If the `folder-hook` were to call `unmailboxes`, then the Mailbox (`m`)
665 * could be deleted, leaving `m` dangling. */
666 // TODO: Refactor this function to avoid the need for an observer
668 char *dup_path = mutt_str_dup(mailbox_path(m));
669 char *dup_name = mutt_str_dup(m->name);
670
671 mutt_folder_hook(dup_path, dup_name);
672 if (m)
673 {
674 /* `m` is still valid, but we won't need the observer again before the end
675 * of the function. */
677 }
678 else
679 {
680 // Recreate the Mailbox as the folder-hook might have invoked `mailboxes`
681 // and/or `unmailboxes`.
682 m = mx_path_resolve(dup_path);
683 }
684
685 FREE(&dup_path);
686 FREE(&dup_name);
687
688 if (!m)
689 return;
690
691 const OpenMailboxFlags flags = read_only ? MUTT_READONLY : MUTT_OPEN_NO_FLAGS;
692 if (mx_mbox_open(m, flags))
693 {
694 struct MailboxView *mv = mview_new(m, NeoMutt->notify);
695 index_shared_data_set_mview(shared, mv);
696
697 menu->max = m->msg_count;
699#ifdef USE_INOTIFY
700 mutt_monitor_add(NULL);
701#endif
702 }
703 else
704 {
705 index_shared_data_set_mview(shared, NULL);
707 }
708
709 const bool c_collapse_all = cs_subset_bool(shared->sub, "collapse_all");
710 if (mutt_using_threads() && c_collapse_all)
711 collapse_all(shared->mailbox_view, menu, 0);
712
714 /* force the mailbox check after we have changed the folder */
715 struct EventMailbox ev_m = { shared->mailbox };
719}
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
Definition: buffer.c:291
void mutt_pattern_free(struct PatternList **pat)
Free a Pattern.
Definition: compile.c:778
void mailbox_free(struct Mailbox **ptr)
Free a Mailbox.
Definition: mailbox.c:89
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
Definition: mailbox.h:223
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:542
void collapse_all(struct MailboxView *mv, struct Menu *menu, int toggle)
Collapse/uncollapse all threads.
Definition: dlg_index.c:165
char * LastFolder
Previously selected mailbox.
Definition: globals.c:43
char * CurrentFolder
Currently selected mailbox.
Definition: globals.c:42
static int index_mailbox_observer(struct NotifyCallback *nc)
Notification that a Mailbox has changed - Implements observer_t -.
Definition: dlg_index.c:585
void mutt_folder_hook(const char *path, const char *desc)
Perform a folder hook.
Definition: hook.c:630
void index_shared_data_set_mview(struct IndexSharedData *shared, struct MailboxView *mv)
Set the MailboxView for the Index and friends.
Definition: shared_data.c:160
#define MENU_REDRAW_FULL
Redraw everything.
Definition: lib.h:59
int mutt_monitor_add(struct Mailbox *m)
Add a watch for a mailbox.
Definition: monitor.c:484
int mutt_monitor_remove(struct Mailbox *m)
Remove a watch for a mailbox.
Definition: monitor.c:528
bool notify_observer_remove(struct Notify *notify, const observer_t callback, const void *global_data)
Remove an observer from an object.
Definition: notify.c:230
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
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:253
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition: string.c:280
void mutt_clear_error(void)
Clear the message line (bottom line of screen)
Definition: mutt_logging.c:74
int mutt_mailbox_check(struct Mailbox *m_cur, CheckStatsFlags flags)
Check all all Mailboxes for new mail.
Definition: mutt_mailbox.c:169
void mview_free(struct MailboxView **ptr)
Free a MailboxView.
Definition: mview.c:49
struct MailboxView * mview_new(struct Mailbox *m, struct Notify *parent)
Create a new MailboxView.
Definition: mview.c:90
bool mx_mbox_open(struct Mailbox *m, OpenMailboxFlags flags)
Open a mailbox and parse it.
Definition: mx.c:288
struct Mailbox * mx_path_resolve(const char *path)
Get a Mailbox for a path.
Definition: mx.c:1636
enum MxStatus mx_mbox_close(struct Mailbox *m)
Save changes and close mailbox.
Definition: mx.c:598
#define MUTT_READONLY
Open in read-only mode.
Definition: mxapi.h:43
uint8_t OpenMailboxFlags
Flags for mutt_open_mailbox(), e.g. MUTT_NOSORT.
Definition: mxapi.h:39
#define MUTT_OPEN_NO_FLAGS
No flags are set.
Definition: mxapi.h:40
#define MUTT_MAILBOX_CHECK_POSTPONED
Make sure the number of postponed messages is updated.
Definition: mxapi.h:54
MxStatus
Return values from mbox_check(), mbox_check_stats(), mbox_sync(), and mbox_close()
Definition: mxapi.h:63
@ MX_STATUS_OK
No changes.
Definition: mxapi.h:65
@ MX_STATUS_NEW_MAIL
New mail received in Mailbox.
Definition: mxapi.h:66
@ NT_MAILBOX
Mailbox has changed, NotifyMailbox, EventMailbox.
Definition: notify_type.h:49
An Event that happened to a Mailbox.
Definition: mailbox.h:199
struct Mailbox * mailbox
The Mailbox this Event relates to.
Definition: mailbox.h:200
struct Mailbox * mailbox
Current Mailbox.
Definition: shared_data.h:41
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
View of a Mailbox.
Definition: mview.h:40
struct Menu * menu
Needed for pattern compilation.
Definition: mview.h:47
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
Definition: mailbox.h:81
char * name
A short name for the Mailbox.
Definition: mailbox.h:82
struct Notify * notify
Notifications: NotifyMailbox, EventMailbox.
Definition: mailbox.h:145
struct Buffer pathbuf
Path of the Mailbox.
Definition: mailbox.h:80
void * compress_info
Compressed mbox module private data.
Definition: mailbox.h:121
Container for Accounts, Notifications.
Definition: neomutt.h:42
struct Notify * notify
Notifications handler.
Definition: neomutt.h:43
struct PatternList * pattern
compiled search pattern
Definition: search_state.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ change_folder_notmuch()

struct Mailbox * change_folder_notmuch ( struct Menu menu,
char *  buf,
int  buflen,
int *  oldcount,
struct IndexSharedData shared,
bool  read_only 
)

Change to a different Notmuch Mailbox by string.

Parameters
menuCurrent Menu
bufFolder to change to
buflenLength of buffer
oldcountHow many items are currently in the index
sharedShared Index data
read_onlyOpen Mailbox in read-only mode
Return values
ptrMailbox

Definition at line 732 of file dlg_index.c.

734{
735 if (!nm_url_from_query(NULL, buf, buflen))
736 {
737 mutt_message(_("Failed to create query, aborting"));
738 return NULL;
739 }
740
741 struct Mailbox *m_query = mx_path_resolve(buf);
742 change_folder_mailbox(menu, m_query, oldcount, shared, read_only);
743 if (!shared->mailbox_view)
744 mailbox_free(&m_query);
745 return m_query;
746}
void change_folder_mailbox(struct Menu *menu, struct Mailbox *m, int *oldcount, struct IndexSharedData *shared, bool read_only)
Change to a different Mailbox by pointer.
Definition: dlg_index.c:611
#define mutt_message(...)
Definition: logging2.h:91
char * nm_url_from_query(struct Mailbox *m, char *buf, size_t buflen)
Turn a query into a URL.
Definition: notmuch.c:1579
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ change_folder_string()

void change_folder_string ( struct Menu menu,
struct Buffer buf,
int *  oldcount,
struct IndexSharedData shared,
bool  read_only 
)

Change to a different Mailbox by string.

Parameters
menuCurrent Menu
bufFolder to change to
oldcountHow many items are currently in the index
sharedShared Index data
read_onlyOpen Mailbox in read-only mode

Definition at line 757 of file dlg_index.c.

759{
760 if (OptNews)
761 {
762 OptNews = false;
764 }
765 else
766 {
767 const char *const c_folder = cs_subset_string(shared->sub, "folder");
768 mx_path_canon(buf, c_folder, NULL);
769 }
770
771 enum MailboxType type = mx_path_probe(buf_string(buf));
772 if ((type == MUTT_MAILBOX_ERROR) || (type == MUTT_UNKNOWN))
773 {
774 // Look for a Mailbox by its description, before failing
775 struct Mailbox *m = mailbox_find_name(buf_string(buf));
776 if (m)
777 {
778 change_folder_mailbox(menu, m, oldcount, shared, read_only);
779 }
780 else
781 {
782 mutt_error(_("%s is not a mailbox"), buf_string(buf));
783 }
784 return;
785 }
786
787 struct Mailbox *m = mx_path_resolve(buf_string(buf));
788 change_folder_mailbox(menu, m, oldcount, shared, read_only);
789}
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:291
struct Mailbox * mailbox_find_name(const char *name)
Find the mailbox with a given name.
Definition: mailbox.c:187
MailboxType
Supported mailbox formats.
Definition: mailbox.h:41
@ MUTT_MAILBOX_ERROR
Error occurred examining Mailbox.
Definition: mailbox.h:43
@ MUTT_UNKNOWN
Mailbox wasn't recognised.
Definition: mailbox.h:44
bool OptNews
(pseudo) used to change reader mode
Definition: globals.c:67
int mx_path_canon(struct Buffer *path, const char *folder, enum MailboxType *type)
Canonicalise a mailbox path - Wrapper for MxOps::path_canon()
Definition: mx.c:1367
enum MailboxType mx_path_probe(const char *path)
Find a mailbox that understands a path.
Definition: mx.c:1321
void nntp_expand_path(char *buf, size_t buflen, struct ConnAccount *acct)
Make fully qualified url from newsgroup name.
Definition: newsrc.c:556
struct NntpAccountData * CurrentNewsSrv
Current NNTP news server.
Definition: nntp.c:77
size_t dsize
Length of data.
Definition: buffer.h:39
char * data
Pointer to data.
Definition: buffer.h:37
struct ConnAccount account
Account details: username, password, etc.
Definition: connection.h:49
struct Connection * conn
Connection to NNTP Server.
Definition: adata.h:62
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_make_string()

int mutt_make_string ( struct Buffer buf,
size_t  max_cols,
const struct Expando exp,
struct Mailbox m,
int  inpgr,
struct Email e,
MuttFormatFlags  flags,
const char *  progress 
)

Create formatted strings using mailbox expandos.

Parameters
bufBuffer for the result
max_colsNumber of screen columns (-1 means unlimited)
expExpando containing expando tree
mMailbox
inpgrMessage shown in the pager
eEmail
flagsFlags, see MuttFormatFlags
progressPager progress string
Return values
numNumber of screen columns used

Definition at line 803 of file dlg_index.c.

806{
807 if (!exp)
808 return 0;
809
810 struct HdrFormatInfo hfi = { 0 };
811
812 hfi.email = e;
813 hfi.mailbox = m;
814 hfi.msg_in_pager = inpgr;
815 hfi.pager_progress = progress;
816
817 return expando_filter(exp, IndexRenderCallbacks, &hfi, flags, max_cols, buf);
818}
int expando_filter(const struct Expando *exp, const struct ExpandoRenderCallback *erc, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
Render an Expando and run the result through a filter.
Definition: filter.c:138
const struct ExpandoRenderCallback IndexRenderCallbacks[]
Callbacks for Index Expandos.
Data passed to index_format_str()
Definition: private.h:37
struct Email * email
Current Email.
Definition: private.h:40
int msg_in_pager
Index of Email displayed in the Pager.
Definition: private.h:39
struct Mailbox * mailbox
Current Mailbox.
Definition: private.h:38
const char * pager_progress
String representing Pager position through Email.
Definition: private.h:41
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_draw_statusline()

void mutt_draw_statusline ( struct MuttWindow win,
int  max_cols,
const char *  buf,
size_t  buflen 
)

Draw a highlighted status bar.

Parameters
winWindow
max_colsMaximum number of screen columns
bufMessage to be displayed
buflenLength of the buffer

Users configure the highlighting of the status bar, e.g. color status red default "[0-9][0-9]:[0-9][0-9]"

Where regexes overlap, the one nearest the start will be used. If two regexes start at the same place, the longer match will be used.

Colours of the status bar

< First character of that colour

< Last character of that colour

Definition at line 958 of file dlg_index.c.

959{
960 if (!buf || !stdscr)
961 return;
962
963 size_t i = 0;
964 size_t offset = 0;
965 bool found = false;
966 size_t chunks = 0;
967 size_t len = 0;
968
972 struct StatusSyntax
973 {
974 const struct AttrColor *attr_color;
975 int first;
976 int last;
977 } *syntax = NULL;
978
981 do
982 {
983 struct RegexColor *cl = NULL;
984 found = false;
985
986 if (!buf[offset])
987 break;
988
989 /* loop through each "color status regex" */
991 {
992 regmatch_t pmatch[cl->match + 1];
993 memset(pmatch, 0, (cl->match + 1) * sizeof(regmatch_t));
994
995 if (regexec(&cl->regex, buf + offset, cl->match + 1, pmatch, 0) != 0)
996 continue; /* regex doesn't match the status bar */
997
998 int first = pmatch[cl->match].rm_so + offset;
999 int last = pmatch[cl->match].rm_eo + offset;
1000
1001 if (first == last)
1002 continue; /* ignore an empty regex */
1003
1004 if (!found)
1005 {
1006 chunks++;
1007 MUTT_MEM_REALLOC(&syntax, chunks, struct StatusSyntax);
1008 }
1009
1010 i = chunks - 1;
1011 if (!found || (first < syntax[i].first) ||
1012 ((first == syntax[i].first) && (last > syntax[i].last)))
1013 {
1014 const struct AttrColor *ac_merge = merged_color_overlay(ac_base, &cl->attr_color);
1015
1016 syntax[i].attr_color = ac_merge;
1017 syntax[i].first = first;
1018 syntax[i].last = last;
1019 }
1020 found = true;
1021 }
1022
1023 if (syntax)
1024 {
1025 offset = syntax[i].last;
1026 }
1027 } while (found);
1028
1029 /* Only 'len' bytes will fit into 'max_cols' screen columns */
1030 len = mutt_wstr_trunc(buf, buflen, max_cols, NULL);
1031
1032 offset = 0;
1033
1034 if ((chunks > 0) && (syntax[0].first > 0))
1035 {
1036 /* Text before the first highlight */
1037 mutt_window_addnstr(win, buf, MIN(len, syntax[0].first));
1038 mutt_curses_set_color(ac_base);
1039 if (len <= syntax[0].first)
1040 goto dsl_finish; /* no more room */
1041
1042 offset = syntax[0].first;
1043 }
1044
1045 for (i = 0; i < chunks; i++)
1046 {
1047 /* Highlighted text */
1048 mutt_curses_set_color(syntax[i].attr_color);
1049 mutt_window_addnstr(win, buf + offset, MIN(len, syntax[i].last) - offset);
1050 if (len <= syntax[i].last)
1051 goto dsl_finish; /* no more room */
1052
1053 size_t next;
1054 if ((i + 1) == chunks)
1055 {
1056 next = len;
1057 }
1058 else
1059 {
1060 next = MIN(len, syntax[i + 1].first);
1061 }
1062
1063 mutt_curses_set_color(ac_base);
1064 offset = syntax[i].last;
1065 mutt_window_addnstr(win, buf + offset, next - offset);
1066
1067 offset = next;
1068 if (offset >= len)
1069 goto dsl_finish; /* no more room */
1070 }
1071
1072 mutt_curses_set_color(ac_base);
1073 if (offset < len)
1074 {
1075 /* Text after the last highlight */
1076 mutt_window_addnstr(win, buf + offset, len - offset);
1077 }
1078
1079 int width = mutt_strwidth(buf);
1080 if (width < max_cols)
1081 {
1082 /* Pad the rest of the line with whitespace */
1083 mutt_paddstr(win, max_cols - width, "");
1084 }
1085dsl_finish:
1086 FREE(&syntax);
1087}
struct RegexColorList * regex_colors_get_list(enum ColorId cid)
Return the RegexColorList for a colour id.
Definition: regex.c:182
struct AttrColor * simple_color_get(enum ColorId cid)
Get the colour of an object by its ID.
Definition: simple.c:88
@ MT_COLOR_STATUS
Status bar (takes a pattern)
Definition: color.h:75
@ MT_COLOR_NORMAL
Plain text.
Definition: color.h:59
size_t mutt_wstr_trunc(const char *src, size_t maxlen, size_t maxwid, size_t *width)
Work out how to truncate a widechar string.
Definition: curs_lib.c:383
void mutt_paddstr(struct MuttWindow *win, int n, const char *s)
Display a string on screen, padded if necessary.
Definition: curs_lib.c:341
size_t mutt_strwidth(const char *s)
Measure a string's width in screen cells.
Definition: curs_lib.c:443
#define MIN(a, b)
Definition: memory.h:32
#define MUTT_MEM_REALLOC(pptr, n, type)
Definition: memory.h:43
const struct AttrColor * merged_color_overlay(const struct AttrColor *base, const struct AttrColor *over)
Combine two colours.
Definition: merged.c:107
void mutt_curses_set_color(const struct AttrColor *ac)
Set the colour and attributes for text.
Definition: mutt_curses.c:38
int mutt_window_addnstr(struct MuttWindow *win, const char *str, int num)
Write a partial string to a Window.
Definition: mutt_window.c:401
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
A curses colour and its attributes.
Definition: attr.h:66
A regular expression and a color to highlight a line.
Definition: regex4.h:36
regex_t regex
Compiled regex.
Definition: regex4.h:39
struct AttrColor attr_color
Colour and attributes to apply.
Definition: regex4.h:37
int match
Substring to match, 0 for old behaviour.
Definition: regex4.h:40
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ email_set_color()

void email_set_color ( struct Mailbox m,
struct Email e 
)

Select an Index colour for an Email.

Parameters
mMailbox
eCurrent Email

Calculate the colour for an Email in the Index. Cache the colour in the Email.

Definition at line 1406 of file dlg_index.c.

1407{
1408 if (!e)
1409 return;
1410
1411 struct RegexColor *color = NULL;
1412 struct PatternCache cache = { 0 };
1413
1414 const struct AttrColor *ac_merge = NULL;
1416 {
1418 MUTT_MATCH_FULL_ADDRESS, m, e, &cache))
1419 {
1420 ac_merge = merged_color_overlay(ac_merge, &color->attr_color);
1421 }
1422 }
1423
1424 struct AttrColor *ac_normal = simple_color_get(MT_COLOR_NORMAL);
1425 if (ac_merge)
1426 ac_merge = merged_color_overlay(ac_normal, ac_merge);
1427 else
1428 ac_merge = ac_normal;
1429
1430 e->attr_color = ac_merge;
1431}
@ MT_COLOR_INDEX
Index: default colour.
Definition: color.h:83
const struct AttrColor * attr_color
Color-pair to use when displaying in the index.
Definition: email.h:112
Cache commonly-used patterns.
Definition: lib.h:117
struct PatternList * color_pattern
Compiled pattern to speed up index color calculation.
Definition: regex4.h:41
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ index_pager_init()

struct MuttWindow * index_pager_init ( void  )

Allocate the Windows for the Index/Pager.

Return values
ptrDialog containing nested Windows

Definition at line 1437 of file dlg_index.c.

1438{
1442
1443 struct IndexSharedData *shared = index_shared_data_new();
1444 notify_set_parent(shared->notify, dlg->notify);
1445
1446 dlg->wdata = shared;
1448
1449 const bool c_status_on_top = cs_subset_bool(NeoMutt->sub, "status_on_top");
1450
1451 struct MuttWindow *panel_index = ipanel_new(c_status_on_top, shared);
1452 struct MuttWindow *panel_pager = ppanel_new(c_status_on_top, shared);
1453
1454 mutt_window_add_child(dlg, panel_index);
1455 mutt_window_add_child(dlg, panel_pager);
1456
1457 return dlg;
1458}
void index_shared_data_free(struct MuttWindow *win, void **ptr)
Free Shared Index Data - Implements MuttWindow::wdata_free() -.
Definition: shared_data.c:278
struct IndexSharedData * index_shared_data_new(void)
Create new Index Data.
Definition: shared_data.c:307
struct MuttWindow * ipanel_new(bool status_on_top, struct IndexSharedData *shared)
Create the Windows for the Index panel.
Definition: ipanel.c:121
void notify_set_parent(struct Notify *notify, struct Notify *parent)
Set the parent notification handler.
Definition: notify.c:95
void mutt_window_add_child(struct MuttWindow *parent, struct MuttWindow *child)
Add a child to Window.
Definition: mutt_window.c:446
struct MuttWindow * mutt_window_new(enum WindowType type, enum MuttWindowOrientation orient, enum MuttWindowSize size, int cols, int rows)
Create a new Window.
Definition: mutt_window.c:182
@ WT_DLG_INDEX
Index Dialog, dlg_index()
Definition: mutt_window.h:87
@ MUTT_WIN_ORIENT_HORIZONTAL
Window uses all available horizontal space.
Definition: mutt_window.h:40
#define MUTT_WIN_SIZE_UNLIMITED
Use as much space as possible.
Definition: mutt_window.h:53
@ MUTT_WIN_SIZE_MAXIMISE
Window wants as much space as possible.
Definition: mutt_window.h:49
struct MuttWindow * ppanel_new(bool status_on_top, struct IndexSharedData *shared)
Create the Windows for the Pager panel.
Definition: ppanel.c:133
Data shared between Index, Pager and Sidebar.
Definition: shared_data.h:37
struct Notify * notify
Notifications: NotifyIndex, IndexSharedData.
Definition: shared_data.h:44
void * wdata
Private data.
Definition: mutt_window.h:145
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:138
void(* wdata_free)(struct MuttWindow *win, void **ptr)
Definition: mutt_window.h:159
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:46
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ index_change_folder()

void index_change_folder ( struct MuttWindow dlg,
struct Mailbox m 
)

Change the current folder, cautiously.

Parameters
dlgDialog holding the Index
mMailbox to change to

Definition at line 1465 of file dlg_index.c.

1466{
1467 if (!dlg || !m)
1468 return;
1469
1470 struct IndexSharedData *shared = dlg->wdata;
1471 if (!shared)
1472 return;
1473
1474 struct MuttWindow *panel_index = window_find_child(dlg, WT_INDEX);
1475 if (!panel_index)
1476 return;
1477
1478 struct IndexPrivateData *priv = panel_index->wdata;
1479 if (!priv)
1480 return;
1481
1482 change_folder_mailbox(priv->menu, m, &priv->oldcount, shared, false);
1483}
struct MuttWindow * window_find_child(struct MuttWindow *win, enum WindowType type)
Recursively find a child Window of a given type.
Definition: mutt_window.c:533
@ WT_INDEX
A panel containing the Index Window.
Definition: mutt_window.h:97
Private state data for the Index.
Definition: private_data.h:35
struct IndexSharedData * shared
Shared Index data.
Definition: private_data.h:40
struct Menu * menu
Menu controlling the index.
Definition: private_data.h:41
int oldcount
Old count of mails in the mailbox.
Definition: private_data.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ IndexHelp

const struct Mapping IndexHelp[]
static
Initial value:
= {
{ N_("Quit"), OP_QUIT },
{ N_("Del"), OP_DELETE },
{ N_("Undel"), OP_UNDELETE },
{ N_("Save"), OP_SAVE },
{ N_("Mail"), OP_MAIL },
{ N_("Reply"), OP_REPLY },
{ N_("Group"), OP_GROUP_REPLY },
{ N_("Help"), OP_HELP },
{ NULL, 0 },
}
#define N_(a)
Definition: message.h:32

Help Bar for the Index dialog.

Definition at line 102 of file dlg_index.c.

◆ IndexNewsHelp

const struct Mapping IndexNewsHelp[]
Initial value:
= {
{ N_("Quit"), OP_QUIT },
{ N_("Del"), OP_DELETE },
{ N_("Undel"), OP_UNDELETE },
{ N_("Save"), OP_SAVE },
{ N_("Post"), OP_POST },
{ N_("Followup"), OP_FOLLOWUP },
{ N_("Catchup"), OP_CATCHUP },
{ N_("Help"), OP_HELP },
{ NULL, 0 },
}

Help Bar for the News Index dialog.

Definition at line 117 of file dlg_index.c.