NeoMutt  2024-11-14-34-g5aaf0d
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
lib.h File Reference

Select a Mailbox from a list. More...

#include "config.h"
#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>
#include "mutt/lib.h"
+ Include dependency graph for lib.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  Folder
 A folder/dir in the browser. More...
 
struct  FolderFile
 Browser entry representing a folder/dir. More...
 
struct  BrowserState
 State of the file/mailbox browser. More...
 

Macros

#define MUTT_SEL_NO_FLAGS   0
 No flags are set.
 
#define MUTT_SEL_MAILBOX   (1 << 0)
 Select a mailbox.
 
#define MUTT_SEL_MULTI   (1 << 1)
 Multi-selection is enabled.
 
#define MUTT_SEL_FOLDER   (1 << 2)
 Select a local directory.
 

Typedefs

typedef uint8_t SelectFileFlags
 Flags for mutt_select_file(), e.g. MUTT_SEL_MAILBOX.
 

Enumerations

enum  ExpandoDataFolder {
  ED_FOL_DATE = 1 , ED_FOL_DATE_FORMAT , ED_FOL_DESCRIPTION , ED_FOL_FILENAME ,
  ED_FOL_FILE_GROUP , ED_FOL_FILE_MODE , ED_FOL_FILE_OWNER , ED_FOL_FILE_SIZE ,
  ED_FOL_FLAGS , ED_FOL_FLAGS2 , ED_FOL_HARD_LINKS , ED_FOL_MESSAGE_COUNT ,
  ED_FOL_NEWSGROUP , ED_FOL_NEW_COUNT , ED_FOL_NEW_MAIL , ED_FOL_NOTIFY ,
  ED_FOL_NUMBER , ED_FOL_POLL , ED_FOL_STRF , ED_FOL_TAGGED ,
  ED_FOL_UNREAD_COUNT
}
 Expando UIDs for the File Browser. More...
 

Functions

 ARRAY_HEAD (BrowserEntryArray, struct FolderFile)
 
void dlg_browser (struct Buffer *file, SelectFileFlags flags, struct Mailbox *m, char ***files, int *numfiles)
 Let the user select a file -.
 
void mutt_browser_select_dir (const char *f)
 Remember the last directory selected.
 
void mutt_browser_cleanup (void)
 Clean up working Buffers.
 
void browser_sort (struct BrowserState *state)
 Sort the entries in the browser.
 
void browser_add_folder (const struct Menu *menu, struct BrowserState *state, const char *name, const char *desc, const struct stat *st, struct Mailbox *m, void *data)
 Add a folder to the browser list.
 
void browser_highlight_default (struct BrowserState *state, struct Menu *menu)
 Decide which browser item should be highlighted.
 
int examine_directory (struct Mailbox *m, struct Menu *menu, struct BrowserState *state, const char *d, const char *prefix)
 Get list of all files/newsgroups with mask.
 
int examine_mailboxes (struct Mailbox *m, struct Menu *menu, struct BrowserState *state)
 Get list of mailboxes/subscribed newsgroups.
 
void init_menu (struct BrowserState *state, struct Menu *menu, struct Mailbox *m, struct MuttWindow *sbar)
 Set up a new menu.
 
void init_state (struct BrowserState *state)
 Initialise a browser state.
 
bool link_is_dir (const char *folder, const char *path)
 Does this symlink point to a directory?
 
void destroy_state (struct BrowserState *state)
 Free the BrowserState.
 
void dump_state (struct BrowserState *state)
 

Variables

struct Buffer LastDir
 Browser: previous selected directory.
 
struct Buffer LastDirBackup
 Browser: backup copy of the current directory.
 
const struct CompleteOps CompleteFileOps
 Auto-Completion of Files.
 
const struct CompleteOps CompleteMailboxOps
 Auto-Completion of Files / Mailboxes.
 

Detailed Description

Select a Mailbox from a list.

Authors
  • Richard Russon

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 lib.h.

Macro Definition Documentation

◆ MUTT_SEL_NO_FLAGS

#define MUTT_SEL_NO_FLAGS   0

No flags are set.

Definition at line 56 of file lib.h.

◆ MUTT_SEL_MAILBOX

#define MUTT_SEL_MAILBOX   (1 << 0)

Select a mailbox.

Definition at line 57 of file lib.h.

◆ MUTT_SEL_MULTI

#define MUTT_SEL_MULTI   (1 << 1)

Multi-selection is enabled.

Definition at line 58 of file lib.h.

◆ MUTT_SEL_FOLDER

#define MUTT_SEL_FOLDER   (1 << 2)

Select a local directory.

Definition at line 59 of file lib.h.

Typedef Documentation

◆ SelectFileFlags

typedef uint8_t SelectFileFlags

Flags for mutt_select_file(), e.g. MUTT_SEL_MAILBOX.

Definition at line 55 of file lib.h.

Enumeration Type Documentation

◆ ExpandoDataFolder

Expando UIDs for the File Browser.

See also
ED_FOLDER, ExpandoDomain
Enumerator
ED_FOL_DATE 

FolderFile.mtime.

ED_FOL_DATE_FORMAT 

FolderFile.mtime.

ED_FOL_DESCRIPTION 

FolderFile.desc, FolderFile.name.

ED_FOL_FILENAME 

FolderFile.name.

ED_FOL_FILE_GROUP 

FolderFile.gid.

ED_FOL_FILE_MODE 

FolderFile.move.

ED_FOL_FILE_OWNER 

FolderFile.uid.

ED_FOL_FILE_SIZE 

FolderFile.size.

ED_FOL_FLAGS 

FolderFile.nd (NntpMboxData)

ED_FOL_FLAGS2 

FolderFile.nd (NntpMboxData)

ED_FOL_HARD_LINKS 

FolderFile.nlink.

ED_FOL_MESSAGE_COUNT 

FolderFile.msg_count.

ED_FOL_NEWSGROUP 

FolderFile.name.

ED_FOL_NEW_COUNT 

FolderFile.nd (NntpMboxData)

ED_FOL_NEW_MAIL 

FolderFile.has_new_mail.

ED_FOL_NOTIFY 

FolderFile.notify_user.

ED_FOL_NUMBER 

Folder.num.

ED_FOL_POLL 

FolderFile.poll_new_mail.

ED_FOL_STRF 

FolderFile.mtime.

ED_FOL_TAGGED 

FolderFile.tagged.

ED_FOL_UNREAD_COUNT 

FolderFile.msg_unread.

Definition at line 114 of file lib.h.

115{
116 ED_FOL_DATE = 1,
137};
@ ED_FOL_POLL
FolderFile.poll_new_mail.
Definition: lib.h:133
@ ED_FOL_NOTIFY
FolderFile.notify_user.
Definition: lib.h:131
@ ED_FOL_NEW_COUNT
FolderFile.nd (NntpMboxData)
Definition: lib.h:129
@ ED_FOL_FILE_OWNER
FolderFile.uid.
Definition: lib.h:122
@ ED_FOL_FILE_GROUP
FolderFile.gid.
Definition: lib.h:120
@ ED_FOL_FILENAME
FolderFile.name.
Definition: lib.h:119
@ ED_FOL_DATE_FORMAT
FolderFile.mtime.
Definition: lib.h:117
@ ED_FOL_UNREAD_COUNT
FolderFile.msg_unread.
Definition: lib.h:136
@ ED_FOL_FLAGS2
FolderFile.nd (NntpMboxData)
Definition: lib.h:125
@ ED_FOL_FILE_MODE
FolderFile.move.
Definition: lib.h:121
@ ED_FOL_NEW_MAIL
FolderFile.has_new_mail.
Definition: lib.h:130
@ ED_FOL_FILE_SIZE
FolderFile.size.
Definition: lib.h:123
@ ED_FOL_HARD_LINKS
FolderFile.nlink.
Definition: lib.h:126
@ ED_FOL_DATE
FolderFile.mtime.
Definition: lib.h:116
@ ED_FOL_STRF
FolderFile.mtime.
Definition: lib.h:134
@ ED_FOL_TAGGED
FolderFile.tagged.
Definition: lib.h:135
@ ED_FOL_NUMBER
Folder.num.
Definition: lib.h:132
@ ED_FOL_DESCRIPTION
FolderFile.desc, FolderFile.name.
Definition: lib.h:118
@ ED_FOL_MESSAGE_COUNT
FolderFile.msg_count.
Definition: lib.h:127
@ ED_FOL_NEWSGROUP
FolderFile.name.
Definition: lib.h:128
@ ED_FOL_FLAGS
FolderFile.nd (NntpMboxData)
Definition: lib.h:124

Function Documentation

◆ ARRAY_HEAD()

ARRAY_HEAD ( BrowserEntryArray  ,
struct FolderFile   
)

◆ mutt_browser_select_dir()

void mutt_browser_select_dir ( const char *  f)

Remember the last directory selected.

Parameters
fDirectory name to save

This function helps the browser to know which directory has been selected. It should be called anywhere a confirm hit is done to open a new directory/file which is a maildir/mbox.

We could check if the sort method is appropriate with this feature.

Definition at line 1264 of file dlg_browser.c.

1265{
1266 init_lastdir();
1267
1269
1270 /* Method that will fetch the parent path depending on the type of the path. */
1271 char buf[PATH_MAX] = { 0 };
1272 mutt_get_parent_path(buf_string(&LastDirBackup), buf, sizeof(buf));
1273 buf_strcpy(&LastDir, buf);
1274}
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition: buffer.c:395
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
static void init_lastdir(void)
Initialise the browser directories.
Definition: dlg_browser.c:148
struct Buffer LastDir
Browser: previous selected directory.
Definition: dlg_browser.c:139
struct Buffer LastDirBackup
Browser: backup copy of the current directory.
Definition: dlg_browser.c:141
#define PATH_MAX
Definition: mutt.h:42
void mutt_get_parent_path(const char *path, char *buf, size_t buflen)
Find the parent of a path (or mailbox)
Definition: muttlib.c:936
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_browser_cleanup()

void mutt_browser_cleanup ( void  )

Clean up working Buffers.

Definition at line 162 of file dlg_browser.c.

163{
166}
void buf_dealloc(struct Buffer *buf)
Release the memory allocated by a buffer.
Definition: buffer.c:377
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ browser_sort()

void browser_sort ( struct BrowserState state)

Sort the entries in the browser.

Parameters
stateBrowser state

Call to qsort using browser_sort_helper function. Some specific sort methods are not used via NNTP.

Definition at line 185 of file sort.c.

186{
187 const enum SortType c_sort_browser = cs_subset_sort(NeoMutt->sub, "sort_browser");
188 switch (c_sort_browser & SORT_MASK)
189 {
190 case SORT_SIZE:
191 case SORT_DATE:
192 if (OptNews)
193 return;
195 default:
196 break;
197 }
198
199 sort_t f = NULL;
200 switch (c_sort_browser & SORT_MASK)
201 {
202 case SORT_COUNT:
204 break;
205 case SORT_DATE:
207 break;
208 case SORT_DESC:
210 break;
211 case SORT_SIZE:
213 break;
214 case SORT_UNREAD:
216 break;
217 case SORT_SUBJECT:
219 break;
220 default:
221 case SORT_ORDER:
223 break;
224 }
225
226 struct CompareData cd = {
227 .sort_fn = f,
228 .sort_reverse = c_sort_browser & SORT_REVERSE,
229 .sort_dirs_first = cs_subset_bool(NeoMutt->sub, "browser_sort_dirs_first"),
230 };
231
232 ARRAY_SORT(&state->entry, browser_sort_helper, &cd);
233}
#define ARRAY_SORT(head, fn, sdata)
Sort an array.
Definition: array.h:279
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:47
short cs_subset_sort(const struct ConfigSubset *sub, const char *name)
Get a sort config item by name.
Definition: helpers.c:266
bool OptNews
(pseudo) used to change reader mode
Definition: globals.c:67
static int browser_sort_desc(const void *a, const void *b, void *sdata)
Compare two browser entries by their descriptions - Implements sort_t -.
Definition: sort.c:83
static int browser_sort_date(const void *a, const void *b, void *sdata)
Compare two browser entries by their date - Implements sort_t -.
Definition: sort.c:94
static int browser_sort_count(const void *a, const void *b, void *sdata)
Compare two browser entries by their message count - Implements sort_t -.
Definition: sort.c:116
static int browser_sort_size(const void *a, const void *b, void *sdata)
Compare two browser entries by their size - Implements sort_t -.
Definition: sort.c:105
static int browser_sort_count_new(const void *a, const void *b, void *sdata)
Compare two browser entries by their new count - Implements sort_t -.
Definition: sort.c:135
static int browser_sort_order(const void *a, const void *b, void *sdata)
Compare two browser entries by their order - Implements sort_t -.
Definition: sort.c:72
static int browser_sort_helper(const void *a, const void *b, void *sdata)
Helper to sort the items in the browser - Implements sort_t -.
Definition: sort.c:158
static int browser_sort_subject(const void *a, const void *b, void *sdata)
Compare two browser entries by their subject - Implements sort_t -.
Definition: sort.c:54
#define FALLTHROUGH
Definition: lib.h:111
int(* sort_t)(const void *a, const void *b, void *sdata)
Definition: qsort_r.h:41
#define SORT_MASK
Mask for the sort id.
Definition: sort2.h:70
SortType
Methods for sorting.
Definition: sort2.h:34
@ SORT_SUBJECT
Sort by the email's subject.
Definition: sort2.h:38
@ SORT_ORDER
Sort by the order the messages appear in the mailbox.
Definition: sort2.h:40
@ SORT_SIZE
Sort by the size of the email.
Definition: sort2.h:36
@ SORT_DESC
Sort by the folder's description.
Definition: sort2.h:55
@ SORT_DATE
Sort by the date the email was sent.
Definition: sort2.h:35
@ SORT_COUNT
Sort by number of emails in a folder.
Definition: sort2.h:50
@ SORT_UNREAD
Sort by the number of unread emails.
Definition: sort2.h:51
#define SORT_REVERSE
Reverse the order of the sort.
Definition: sort2.h:71
struct BrowserEntryArray entry
Array of files / dirs / mailboxes.
Definition: lib.h:144
Private data for browser_sort_helper()
Definition: sort.c:45
sort_t sort_fn
Function to perform $browser_sort.
Definition: sort.c:48
Container for Accounts, Notifications.
Definition: neomutt.h:42
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:

◆ browser_add_folder()

void browser_add_folder ( const struct Menu menu,
struct BrowserState state,
const char *  name,
const char *  desc,
const struct stat *  st,
struct Mailbox m,
void *  data 
)

Add a folder to the browser list.

Parameters
menuMenu to use
stateBrowser state
nameName of folder
descDescription of folder
ststat info for the folder
mMailbox
dataData to associate with the folder

Definition at line 632 of file dlg_browser.c.

635{
636 if ((!menu || state->is_mailbox_list) && m && !m->visible)
637 {
638 return;
639 }
640
641 struct FolderFile ff = { 0 };
642
643 if (st)
644 {
645 ff.mode = st->st_mode;
646 ff.mtime = st->st_mtime;
647 ff.size = st->st_size;
648 ff.gid = st->st_gid;
649 ff.uid = st->st_uid;
650 ff.nlink = st->st_nlink;
651 ff.local = true;
652 }
653 else
654 {
655 ff.local = false;
656 }
657
658 if (m)
659 {
660 ff.has_mailbox = true;
661 ff.gen = m->gen;
662 ff.has_new_mail = m->has_new;
663 ff.msg_count = m->msg_count;
664 ff.msg_unread = m->msg_unread;
665 ff.notify_user = m->notify_user;
667 }
668
669 ff.name = mutt_str_dup(name);
670 ff.desc = mutt_str_dup(desc ? desc : name);
671 ff.imap = false;
672 if (OptNews)
673 ff.nd = data;
674
675 ARRAY_ADD(&state->entry, ff);
676}
#define ARRAY_ADD(head, elem)
Add an element at the end of the array.
Definition: array.h:156
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:253
bool is_mailbox_list
Viewing mailboxes.
Definition: lib.h:147
Browser entry representing a folder/dir.
Definition: lib.h:77
bool imap
This is an IMAP folder.
Definition: lib.h:94
bool has_mailbox
This is a mailbox.
Definition: lib.h:97
char * name
Name of file/dir/mailbox.
Definition: lib.h:85
uid_t uid
File's User ID.
Definition: lib.h:81
gid_t gid
File's Group ID.
Definition: lib.h:82
bool has_new_mail
true if mailbox has "new mail"
Definition: lib.h:88
bool poll_new_mail
Check mailbox for new mail.
Definition: lib.h:100
bool notify_user
User will be notified of new mail.
Definition: lib.h:99
nlink_t nlink
Number of hard links.
Definition: lib.h:83
char * desc
Description of mailbox.
Definition: lib.h:86
struct NntpMboxData * nd
Extra NNTP data.
Definition: lib.h:102
off_t size
File size.
Definition: lib.h:79
int gen
Unique id, used for (un)sorting.
Definition: lib.h:104
time_t mtime
Modification time.
Definition: lib.h:80
int msg_count
total number of messages
Definition: lib.h:89
mode_t mode
File permissions.
Definition: lib.h:78
int msg_unread
number of unread messages
Definition: lib.h:90
bool has_new
Mailbox has new mail.
Definition: mailbox.h:85
int msg_count
Total number of messages.
Definition: mailbox.h:88
bool poll_new_mail
Check for new mail.
Definition: mailbox.h:115
bool notify_user
Notify the user of new mail.
Definition: mailbox.h:113
bool visible
True if a result of "mailboxes".
Definition: mailbox.h:130
int msg_unread
Number of unread messages.
Definition: mailbox.h:89
int gen
Generation number, for sorting.
Definition: mailbox.h:147
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ browser_highlight_default()

void browser_highlight_default ( struct BrowserState state,
struct Menu menu 
)

Decide which browser item should be highlighted.

Parameters
stateBrowser state
menuCurrent Menu

This function takes a menu and a state and defines the current entry that should be highlighted.

Definition at line 993 of file dlg_browser.c.

994{
995 menu->top = 0;
996 /* Reset menu position to 1.
997 * We do not risk overflow as the init_menu function changes
998 * current if it is bigger than state->entrylen. */
999 if (!ARRAY_EMPTY(&state->entry) &&
1000 (mutt_str_equal(ARRAY_FIRST(&state->entry)->desc, "..") ||
1001 mutt_str_equal(ARRAY_FIRST(&state->entry)->desc, "../")))
1002 {
1003 /* Skip the first entry, unless there's only one entry. */
1004 menu_set_index(menu, (menu->max > 1));
1005 }
1006 else
1007 {
1008 menu_set_index(menu, 0);
1009 }
1010}
#define ARRAY_FIRST(head)
Convenience method to get the first element.
Definition: array.h:135
#define ARRAY_EMPTY(head)
Check if an array is empty.
Definition: array.h:74
MenuRedrawFlags menu_set_index(struct Menu *menu, int index)
Set the current selection in the Menu.
Definition: menu.c:174
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:660
int top
Entry that is the top of the current page.
Definition: lib.h:90
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:

◆ examine_directory()

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.

Parameters
mMailbox
menuCurrent Menu
stateState of browser
dirnameDirectory
prefixFiles/newsgroups must match this prefix
Return values
0Success
-1Error

Definition at line 699 of file dlg_browser.c.

701{
702 int rc = -1;
703 struct Buffer *buf = buf_pool_get();
704 if (OptNews)
705 {
707
708 init_state(state);
709
710 const struct Regex *c_mask = cs_subset_regex(NeoMutt->sub, "mask");
711 for (unsigned int i = 0; i < adata->groups_num; i++)
712 {
713 struct NntpMboxData *mdata = adata->groups_list[i];
714 if (!mdata)
715 continue;
716 if (prefix && *prefix && !mutt_str_startswith(mdata->group, prefix))
717 continue;
718 if (!mutt_regex_match(c_mask, mdata->group))
719 {
720 continue;
721 }
722 browser_add_folder(menu, state, mdata->group, NULL, NULL, NULL, mdata);
723 }
724 }
725 else
726 {
727 struct stat st = { 0 };
728 DIR *dir = NULL;
729 struct dirent *de = NULL;
730
731 while (stat(dirname, &st) == -1)
732 {
733 if (errno == ENOENT)
734 {
735 /* The last used directory is deleted, try to use the parent dir. */
736 char *c = strrchr(dirname, '/');
737
738 if (c && (c > dirname))
739 {
740 *c = '\0';
741 continue;
742 }
743 }
744 mutt_perror("%s", dirname);
745 goto ed_out;
746 }
747
748 if (!S_ISDIR(st.st_mode))
749 {
750 mutt_error(_("%s is not a directory"), dirname);
751 goto ed_out;
752 }
753
754 if (m)
756
757 dir = mutt_file_opendir(dirname, MUTT_OPENDIR_NONE);
758 if (!dir)
759 {
760 mutt_perror("%s", dirname);
761 goto ed_out;
762 }
763
764 init_state(state);
765
766 struct MailboxList ml = STAILQ_HEAD_INITIALIZER(ml);
768
769 const struct Regex *c_mask = cs_subset_regex(NeoMutt->sub, "mask");
770 while ((de = readdir(dir)))
771 {
772 if (mutt_str_equal(de->d_name, "."))
773 continue; /* we don't need . */
774
775 if (prefix && *prefix && !mutt_str_startswith(de->d_name, prefix))
776 {
777 continue;
778 }
779 if (!mutt_regex_match(c_mask, de->d_name))
780 {
781 continue;
782 }
783
784 buf_concat_path(buf, dirname, de->d_name);
785 if (lstat(buf_string(buf), &st) == -1)
786 continue;
787
788 /* No size for directories or symlinks */
789 if (S_ISDIR(st.st_mode) || S_ISLNK(st.st_mode))
790 st.st_size = 0;
791 else if (!S_ISREG(st.st_mode))
792 continue;
793
794 struct MailboxNode *np = NULL;
795 STAILQ_FOREACH(np, &ml, entries)
796 {
798 break;
799 }
800
801 if (np && m && m->poll_new_mail && mutt_str_equal(np->mailbox->realpath, m->realpath))
802 {
803 np->mailbox->msg_count = m->msg_count;
804 np->mailbox->msg_unread = m->msg_unread;
805 }
806 browser_add_folder(menu, state, de->d_name, NULL, &st, np ? np->mailbox : NULL, NULL);
807 }
809 closedir(dir);
810 }
811 browser_sort(state);
812 rc = 0;
813ed_out:
814 buf_pool_release(&buf);
815 return rc;
816}
void browser_sort(struct BrowserState *state)
Sort the entries in the browser.
Definition: sort.c:185
size_t buf_concat_path(struct Buffer *buf, const char *dir, const char *fname)
Join a directory name and a filename.
Definition: buffer.c:509
const struct Regex * cs_subset_regex(const struct ConfigSubset *sub, const char *name)
Get a regex config item by name.
Definition: helpers.c:217
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
Definition: mailbox.h:223
@ MUTT_MAILBOX_ANY
Match any Mailbox type.
Definition: mailbox.h:42
void init_state(struct BrowserState *state)
Initialise a browser state.
Definition: dlg_browser.c:682
void browser_add_folder(const struct Menu *menu, struct BrowserState *state, const char *name, const char *desc, const struct stat *st, struct Mailbox *m, void *data)
Add a folder to the browser list.
Definition: dlg_browser.c:632
DIR * mutt_file_opendir(const char *path, enum MuttOpenDirMode mode)
Open a directory.
Definition: file.c:642
@ MUTT_OPENDIR_NONE
Plain opendir()
Definition: file.h:63
#define mutt_error(...)
Definition: logging2.h:92
#define mutt_perror(...)
Definition: logging2.h:93
#define _(a)
Definition: message.h:28
bool mutt_regex_match(const struct Regex *regex, const char *str)
Shorthand to mutt_regex_capture()
Definition: regex.c:614
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
Definition: string.c:230
int mutt_mailbox_check(struct Mailbox *m_cur, CheckStatsFlags flags)
Check all all Mailboxes for new mail.
Definition: mutt_mailbox.c:169
#define MUTT_MAILBOX_CHECK_NO_FLAGS
No flags are set.
Definition: mxapi.h:53
void neomutt_mailboxlist_clear(struct MailboxList *ml)
Free a Mailbox List.
Definition: neomutt.c:168
size_t neomutt_mailboxlist_get_all(struct MailboxList *head, struct NeoMutt *n, enum MailboxType type)
Get a List of all Mailboxes.
Definition: neomutt.c:191
struct NntpAccountData * CurrentNewsSrv
Current NNTP news server.
Definition: nntp.c:77
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
#define STAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:324
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
void * adata
Private data (for Mailbox backends)
Definition: account.h:42
String manipulation buffer.
Definition: buffer.h:36
List of Mailboxes.
Definition: mailbox.h:166
struct Mailbox * mailbox
Mailbox in the list.
Definition: mailbox.h:167
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
Definition: mailbox.h:81
void * mdata
Driver specific data.
Definition: mailbox.h:132
NNTP-specific Account data -.
Definition: adata.h:36
struct NntpMboxData ** groups_list
Definition: adata.h:60
unsigned int groups_num
Definition: adata.h:58
NNTP-specific Mailbox data -.
Definition: mdata.h:34
struct NntpAccountData * adata
Definition: mdata.h:48
Cached regular expression.
Definition: regex3.h:86
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ examine_mailboxes()

int examine_mailboxes ( struct Mailbox m,
struct Menu menu,
struct BrowserState state 
)

Get list of mailboxes/subscribed newsgroups.

Parameters
mMailbox
menuCurrent menu
stateState of browser
Return values
0Success
-1Error

Definition at line 826 of file dlg_browser.c.

827{
828 struct stat st = { 0 };
829 struct Buffer *md = NULL;
830 struct Buffer *mailbox = NULL;
831
832 if (OptNews)
833 {
835
836 init_state(state);
837
838 const bool c_show_only_unread = cs_subset_bool(NeoMutt->sub, "show_only_unread");
839 for (unsigned int i = 0; i < adata->groups_num; i++)
840 {
841 struct NntpMboxData *mdata = adata->groups_list[i];
842 if (mdata && (mdata->has_new_mail ||
843 (mdata->subscribed && (mdata->unread || !c_show_only_unread))))
844 {
845 browser_add_folder(menu, state, mdata->group, NULL, NULL, NULL, mdata);
846 }
847 }
848 }
849 else
850 {
851 init_state(state);
852
854 return -1;
855 mailbox = buf_pool_get();
856 md = buf_pool_get();
857
859
860 struct MailboxList ml = STAILQ_HEAD_INITIALIZER(ml);
862 struct MailboxNode *np = NULL;
863 const bool c_browser_abbreviate_mailboxes = cs_subset_bool(NeoMutt->sub, "browser_abbreviate_mailboxes");
864
865 STAILQ_FOREACH(np, &ml, entries)
866 {
867 if (!np->mailbox)
868 continue;
869
870 if (m && m->poll_new_mail && mutt_str_equal(np->mailbox->realpath, m->realpath))
871 {
872 np->mailbox->msg_count = m->msg_count;
873 np->mailbox->msg_unread = m->msg_unread;
874 }
875
877 if (c_browser_abbreviate_mailboxes)
879
880 switch (np->mailbox->type)
881 {
882 case MUTT_IMAP:
883 case MUTT_POP:
885 np->mailbox->name, NULL, np->mailbox, NULL);
886 continue;
887 case MUTT_NOTMUCH:
888 case MUTT_NNTP:
889 browser_add_folder(menu, state, mailbox_path(np->mailbox),
890 np->mailbox->name, NULL, np->mailbox, NULL);
891 continue;
892 default: /* Continue */
893 break;
894 }
895
896 if (lstat(mailbox_path(np->mailbox), &st) == -1)
897 continue;
898
899 if ((!S_ISREG(st.st_mode)) && (!S_ISDIR(st.st_mode)) && (!S_ISLNK(st.st_mode)))
900 continue;
901
902 if (np->mailbox->type == MUTT_MAILDIR)
903 {
904 struct stat st2 = { 0 };
905
906 buf_printf(md, "%s/new", mailbox_path(np->mailbox));
907 if (stat(buf_string(md), &st) < 0)
908 st.st_mtime = 0;
909 buf_printf(md, "%s/cur", mailbox_path(np->mailbox));
910 if (stat(buf_string(md), &st2) < 0)
911 st2.st_mtime = 0;
912 if (st2.st_mtime > st.st_mtime)
913 st.st_mtime = st2.st_mtime;
914 }
915
916 browser_add_folder(menu, state, buf_string(mailbox), np->mailbox->name,
917 &st, np->mailbox, NULL);
918 }
920 }
921 browser_sort(state);
922
923 buf_pool_release(&mailbox);
924 buf_pool_release(&md);
925 return 0;
926}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition: buffer.c:161
@ MUTT_NOTMUCH
'Notmuch' (virtual) Mailbox type
Definition: mailbox.h:51
@ MUTT_POP
'POP3' Mailbox type
Definition: mailbox.h:52
@ MUTT_NNTP
'NNTP' (Usenet) Mailbox type
Definition: mailbox.h:49
@ MUTT_IMAP
'IMAP' Mailbox type
Definition: mailbox.h:50
@ MUTT_MAILDIR
'Maildir' Mailbox type
Definition: mailbox.h:48
void buf_pretty_mailbox(struct Buffer *buf)
Shorten a mailbox path using '~' or '='.
Definition: muttlib.c:519
#define TAILQ_EMPTY(head)
Definition: queue.h:721
enum MailboxType type
Mailbox type.
Definition: mailbox.h:102
char * name
A short name for the Mailbox.
Definition: mailbox.h:82
struct AccountList accounts
List of all Accounts.
Definition: neomutt.h:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_menu()

void init_menu ( struct BrowserState state,
struct Menu menu,
struct Mailbox m,
struct MuttWindow sbar 
)

Set up a new menu.

Parameters
stateBrowser state
menuCurrent menu
mMailbox
sbarStatus bar

Definition at line 1019 of file dlg_browser.c.

1021{
1022 char title[256] = { 0 };
1023 menu->max = ARRAY_SIZE(&state->entry);
1024
1025 int index = menu_get_index(menu);
1026 if (index >= menu->max)
1027 menu_set_index(menu, menu->max - 1);
1028 if (index < 0)
1029 menu_set_index(menu, 0);
1030 if (menu->top > index)
1031 menu->top = 0;
1032
1033 menu->num_tagged = 0;
1034
1035 if (OptNews)
1036 {
1037 if (state->is_mailbox_list)
1038 {
1039 snprintf(title, sizeof(title), _("Subscribed newsgroups"));
1040 }
1041 else
1042 {
1043 snprintf(title, sizeof(title), _("Newsgroups on server [%s]"),
1045 }
1046 }
1047 else
1048 {
1049 if (state->is_mailbox_list)
1050 {
1051 snprintf(title, sizeof(title), _("Mailboxes [%d]"),
1053 }
1054 else
1055 {
1056 struct Buffer *path = buf_pool_get();
1057 buf_copy(path, &LastDir);
1058 buf_pretty_mailbox(path);
1059 const struct Regex *c_mask = cs_subset_regex(NeoMutt->sub, "mask");
1060 const bool c_imap_list_subscribed = cs_subset_bool(NeoMutt->sub, "imap_list_subscribed");
1061 if (state->imap_browse && c_imap_list_subscribed)
1062 {
1063 snprintf(title, sizeof(title), _("Subscribed [%s], File mask: %s"),
1064 buf_string(path), NONULL(c_mask ? c_mask->pattern : NULL));
1065 }
1066 else
1067 {
1068 snprintf(title, sizeof(title), _("Directory [%s], File mask: %s"),
1069 buf_string(path), NONULL(c_mask ? c_mask->pattern : NULL));
1070 }
1071 buf_pool_release(&path);
1072 }
1073 }
1074 sbar_set_title(sbar, title);
1075
1076 /* Browser tracking feature.
1077 * The goal is to highlight the good directory if LastDir is the parent dir
1078 * of LastDirBackup (this occurs mostly when one hit "../"). It should also work
1079 * properly when the user is in examine_mailboxes-mode. */
1081 {
1082 char target_dir[PATH_MAX] = { 0 };
1083
1084 /* Check what kind of dir LastDirBackup is. */
1086 {
1087 mutt_str_copy(target_dir, buf_string(&LastDirBackup), sizeof(target_dir));
1088 imap_clean_path(target_dir, sizeof(target_dir));
1089 }
1090 else
1091 {
1092 mutt_str_copy(target_dir, strrchr(buf_string(&LastDirBackup), '/') + 1,
1093 sizeof(target_dir));
1094 }
1095
1096 /* If we get here, it means that LastDir is the parent directory of
1097 * LastDirBackup. I.e., we're returning from a subdirectory, and we want
1098 * to position the cursor on the directory we're returning from. */
1099 bool matched = false;
1100 struct FolderFile *ff = NULL;
1101 ARRAY_FOREACH(ff, &state->entry)
1102 {
1103 if (mutt_str_equal(ff->name, target_dir))
1104 {
1105 menu_set_index(menu, ARRAY_FOREACH_IDX);
1106 matched = true;
1107 break;
1108 }
1109 }
1110 if (!matched)
1111 browser_highlight_default(state, menu);
1112 }
1113 else
1114 {
1115 browser_highlight_default(state, menu);
1116 }
1117
1119}
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition: array.h:212
#define ARRAY_SIZE(head)
The number of elements stored.
Definition: array.h:87
size_t buf_copy(struct Buffer *dst, const struct Buffer *src)
Copy a Buffer's contents to another Buffer.
Definition: buffer.c:601
void browser_highlight_default(struct BrowserState *state, struct Menu *menu)
Decide which browser item should be highlighted.
Definition: dlg_browser.c:993
enum MailboxType imap_path_probe(const char *path, const struct stat *st)
Is this an IMAP Mailbox? - Implements MxOps::path_probe() -.
Definition: imap.c:2345
void imap_clean_path(char *path, size_t plen)
Cleans an IMAP path using imap_fix_path.
Definition: util.c:192
#define MENU_REDRAW_FULL
Redraw everything.
Definition: lib.h:59
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
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
Definition: string.c:581
void sbar_set_title(struct MuttWindow *win, const char *title)
Set the title for the Simple Bar.
Definition: sbar.c:227
#define NONULL(x)
Definition: string2.h:37
bool imap_browse
IMAP folder.
Definition: lib.h:145
char host[128]
Server to login to.
Definition: connaccount.h:54
struct ConnAccount account
Account details: username, password, etc.
Definition: connection.h:49
int num_tagged
Number of tagged entries.
Definition: lib.h:93
struct Connection * conn
Connection to NNTP Server.
Definition: adata.h:62
char * pattern
printable version
Definition: regex3.h:87
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_state()

void init_state ( struct BrowserState state)

Initialise a browser state.

Parameters
stateBrowserState to initialise

Definition at line 682 of file dlg_browser.c.

683{
684 ARRAY_INIT(&state->entry);
685 ARRAY_RESERVE(&state->entry, 256);
686 state->imap_browse = false;
687}
#define ARRAY_RESERVE(head, num)
Reserve memory for the array.
Definition: array.h:189
#define ARRAY_INIT(head)
Initialize an array.
Definition: array.h:65
+ Here is the caller graph for this function:

◆ link_is_dir()

bool link_is_dir ( const char *  folder,
const char *  path 
)

Does this symlink point to a directory?

Parameters
folderFolder
pathLink name
Return values
trueLinks to a directory
falseOtherwise

Definition at line 175 of file dlg_browser.c.

176{
177 struct stat st = { 0 };
178 bool rc = false;
179
180 struct Buffer *fullpath = buf_pool_get();
181 buf_concat_path(fullpath, folder, path);
182
183 if (stat(buf_string(fullpath), &st) == 0)
184 rc = S_ISDIR(st.st_mode);
185
186 buf_pool_release(&fullpath);
187
188 return rc;
189}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ destroy_state()

void destroy_state ( struct BrowserState state)

Free the BrowserState.

Parameters
stateState to free

Frees up the memory allocated for the local-global variables.

Definition at line 134 of file functions.c.

135{
136 struct FolderFile *ff = NULL;
137 ARRAY_FOREACH(ff, &state->entry)
138 {
139 FREE(&ff->name);
140 FREE(&ff->desc);
141 }
142 ARRAY_FREE(&state->entry);
143 FREE(&state->folder);
144}
#define ARRAY_FREE(head)
Release all memory.
Definition: array.h:204
#define FREE(x)
Definition: memory.h:55
char * folder
Folder name.
Definition: lib.h:146
+ Here is the caller graph for this function:

◆ dump_state()

void dump_state ( struct BrowserState state)

Variable Documentation

◆ LastDir

struct Buffer LastDir
extern

Browser: previous selected directory.

Definition at line 139 of file dlg_browser.c.

◆ LastDirBackup

struct Buffer LastDirBackup
extern

Browser: backup copy of the current directory.

Definition at line 141 of file dlg_browser.c.

◆ CompleteFileOps

const struct CompleteOps CompleteFileOps
extern

Auto-Completion of Files.

Definition at line 153 of file complete.c.

◆ CompleteMailboxOps

const struct CompleteOps CompleteMailboxOps
extern

Auto-Completion of Files / Mailboxes.

Definition at line 160 of file complete.c.