NeoMutt  2025-12-11-694-ga89709
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
sidebar.c
Go to the documentation of this file.
1
25
31
32#include "config.h"
33#include <stdbool.h>
34#include <stdio.h>
35#include "private.h"
36#include "mutt/lib.h"
37#include "config/lib.h"
38#include "core/lib.h"
39#include "gui/lib.h"
40#include "lib.h"
41#include "color/lib.h"
42#include "index/lib.h"
43
45
49const struct Command SbCommands[] = {
50 // clang-format off
51 { "sidebar-pin", CMD_SIDEBAR_PIN, parse_sidebar_pin,
52 N_("Pin a mailbox in the sidebar (keep visible)"),
53 N_("sidebar-pin <mailbox> [ <mailbox> ... ]"),
54 "optionalfeatures.html#sidebar-pin" },
55 { "sidebar-unpin", CMD_SIDEBAR_UNPIN, parse_sidebar_unpin,
56 N_("Unpin a previously pinned mailbox in the sidebar"),
57 N_("sidebar-unpin { * | <mailbox> ... }"),
58 "optionalfeatures.html#sidebar-pin" },
59
60 // Deprecated
61 { "sidebar_pin", CMD_NONE, NULL, "sidebar-pin", NULL, NULL, CF_SYNONYM },
62 { "sidebar_unpin", CMD_NONE, NULL, "sidebar-unpin", NULL, NULL, CF_SYNONYM },
63 { "sidebar_whitelist", CMD_NONE, NULL, "sidebar-pin", NULL, NULL, CF_SYNONYM },
64 { "unsidebar_whitelist", CMD_NONE, NULL, "sidebar-unpin", NULL, NULL, CF_SYNONYM },
65
66 { NULL, CMD_NONE, NULL, NULL, NULL, NULL, CF_NO_FLAGS },
67 // clang-format on
68};
69
76{
77 const bool c_sidebar_visible = cs_subset_bool(NeoMutt->sub, "sidebar_visible");
78 if (!c_sidebar_visible)
79 return NULL;
80
82 if (!wdata || (wdata->hil_index < 0))
83 return NULL;
84
85 struct SbEntry **sbep = ARRAY_GET(&wdata->entries, wdata->hil_index);
86 if (!sbep)
87 return NULL;
88
89 return (*sbep)->mailbox;
90}
91
100void sb_add_mailbox(struct SidebarWindowData *wdata, struct Mailbox *m)
101{
102 if (!m)
103 return;
104
105 struct SbEntry **sbep = NULL;
106 ARRAY_FOREACH(sbep, &wdata->entries)
107 {
108 if ((*sbep)->mailbox == m)
109 return;
110 }
111
112 /* Any new/deleted mailboxes will cause a refresh. As long as
113 * they're valid, our pointers will be updated in prepare_sidebar() */
114
115 struct IndexSharedData *shared = wdata->shared;
116 struct SbEntry *entry = MUTT_MEM_CALLOC(1, struct SbEntry);
117 entry->mailbox = m;
118 entry->score = -1;
119
120 if (wdata->top_index < 0)
121 wdata->top_index = ARRAY_SIZE(&wdata->entries);
122 if (wdata->bot_index < 0)
123 wdata->bot_index = ARRAY_SIZE(&wdata->entries);
124 if ((wdata->opn_index < 0) && shared->mailbox &&
126 {
127 wdata->opn_index = ARRAY_SIZE(&wdata->entries);
128 }
129
130 ARRAY_ADD(&wdata->entries, entry);
131}
132
138void sb_remove_mailbox(struct SidebarWindowData *wdata, const struct Mailbox *m)
139{
140 struct SbEntry **sbep = NULL;
141 ARRAY_FOREACH(sbep, &wdata->entries)
142 {
143 if ((*sbep)->mailbox != m)
144 continue;
145
146 struct SbEntry *sbe_remove = *sbep;
147 ARRAY_REMOVE(&wdata->entries, sbep);
148 FREE(&sbe_remove);
149
150 if (wdata->opn_index == ARRAY_FOREACH_IDX_sbep)
151 {
152 // Open item was deleted
153 wdata->opn_index = -1;
154 }
155 else if ((wdata->opn_index > 0) && (wdata->opn_index > ARRAY_FOREACH_IDX_sbep))
156 {
157 // Open item is still visible, so adjust the index
158 wdata->opn_index--;
159 }
160
161 if (wdata->hil_index == ARRAY_FOREACH_IDX_sbep)
162 {
163 // If possible, keep the highlight where it is
164 struct SbEntry **sbep_cur = ARRAY_GET(&wdata->entries, ARRAY_FOREACH_IDX_sbep);
165 if (!sbep_cur)
166 {
167 // The last entry was deleted, so backtrack
168 sb_prev(wdata);
169 }
170 else if ((*sbep_cur)->is_hidden)
171 {
172 // Find the next unhidden entry, or the previous
173 if (!sb_next(wdata) && !sb_prev(wdata))
174 wdata->hil_index = -1;
175 }
176 }
177 else if ((wdata->hil_index > 0) && (wdata->hil_index > ARRAY_FOREACH_IDX_sbep))
178 {
179 // Highlighted item is still visible, so adjust the index
180 wdata->hil_index--;
181 }
182 break;
183 }
184}
185
192{
193 wdata->opn_index = -1;
194
195 struct SbEntry **sbep = NULL;
196 ARRAY_FOREACH(sbep, &wdata->entries)
197 {
198 if (m && m->visible)
199 {
200 if (mutt_str_equal((*sbep)->mailbox->realpath, m->realpath))
201 {
202 wdata->opn_index = ARRAY_FOREACH_IDX_sbep;
203 wdata->hil_index = ARRAY_FOREACH_IDX_sbep;
204 break;
205 }
206 }
207 (*sbep)->is_hidden = !(*sbep)->mailbox->visible;
208 }
209}
210
214void sb_init(void)
215{
216 // Set a default style
218 ac->attrs = A_UNDERLINE;
219
220 // Listen for dialog creation events
223}
224
#define ARRAY_ADD(head, elem)
Add an element at the end of the array.
Definition array.h:157
#define ARRAY_REMOVE(head, elem)
Remove an entry from the array, shifting down the subsequent entries.
Definition array.h:355
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition array.h:223
#define ARRAY_SIZE(head)
The number of elements stored.
Definition array.h:87
#define ARRAY_GET(head, idx)
Return the element at index.
Definition array.h:109
Color and attribute parsing.
struct AttrColor * simple_color_get(enum ColorId cid)
Get the colour of an object by its ID.
Definition simple.c:95
@ MT_COLOR_SIDEBAR_HIGHLIGHT
Select cursor.
Definition color.h:71
#define CF_SYNONYM
Command is a synonym for another command.
Definition command.h:49
#define CF_NO_FLAGS
No flags are set.
Definition command.h:48
@ CMD_SIDEBAR_PIN
:sidebar-pin
Definition command.h:111
@ CMD_SIDEBAR_UNPIN
:sidebar-unpin
Definition command.h:112
@ CMD_NONE
No Command.
Definition command.h:59
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
struct MuttWindow * AllDialogsWindow
Parent of all Dialogs.
Definition dialog.c:80
enum CommandResult parse_sidebar_pin(const struct Command *cmd, struct Buffer *line, const struct ParseContext *pc, struct ParseError *pe)
Parse the 'sidebar-pin' command - Implements Command::parse() -.
Definition commands.c:44
enum CommandResult parse_sidebar_unpin(const struct Command *cmd, struct Buffer *line, const struct ParseContext *pc, struct ParseError *pe)
Parse the 'sidebar-unpin' command - Implements Command::parse() -.
Definition commands.c:74
int sb_insertion_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition observer.c:485
Convenience wrapper for the gui headers.
GUI manage the main index (list of emails)
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
Definition list.c:123
#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
Convenience wrapper for the library headers.
#define N_(a)
Definition message.h:32
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
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:665
@ NT_WINDOW
MuttWindow has changed, NotifyWindow, EventWindow.
Definition notify_type.h:57
#define STAILQ_HEAD_INITIALIZER(head)
Definition queue.h:324
bool sb_prev(struct SidebarWindowData *wdata)
Find the previous unhidden Mailbox.
Definition functions.c:155
bool sb_next(struct SidebarWindowData *wdata)
Find the next unhidden Mailbox.
Definition functions.c:116
GUI display the mailboxes in a side panel.
const struct Command SbCommands[]
Sidebar Commands.
Definition sidebar.c:49
GUI display the mailboxes in a side panel.
struct ListHead SidebarPinned
List of mailboxes to always display in the sidebar.
Definition sidebar.c:44
struct SidebarWindowData * sb_wdata_get(struct MuttWindow *win)
Get the Sidebar data for this window.
Definition wdata.c:77
void sb_init(void)
Set up the Sidebar.
Definition sidebar.c:214
void sb_remove_mailbox(struct SidebarWindowData *wdata, const struct Mailbox *m)
Remove a Mailbox from the Sidebar.
Definition sidebar.c:138
void sb_cleanup(void)
Clean up the Sidebar.
Definition sidebar.c:228
void sb_set_current_mailbox(struct SidebarWindowData *wdata, struct Mailbox *m)
Set the current Mailbox.
Definition sidebar.c:191
void sb_add_mailbox(struct SidebarWindowData *wdata, struct Mailbox *m)
Add a Mailbox to the Sidebar.
Definition sidebar.c:100
struct Mailbox * sb_get_highlight(struct MuttWindow *win)
Get the Mailbox that's highlighted in the sidebar.
Definition sidebar.c:75
A curses colour and its attributes.
Definition attr.h:65
int attrs
Text attributes, e.g. A_BOLD.
Definition attr.h:68
Data shared between Index, Pager and Sidebar.
Definition shared_data.h:37
struct Mailbox * mailbox
Current Mailbox.
Definition shared_data.h:41
A mailbox.
Definition mailbox.h:78
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
Definition mailbox.h:80
bool visible
True if a result of "mailboxes".
Definition mailbox.h:129
void * wdata
Private data.
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
Info about folders in the sidebar.
Definition private.h:42
int score
Fuzzy-match score.
Definition private.h:49
struct Mailbox * mailbox
Mailbox this represents.
Definition private.h:46
bool is_hidden
Don't show, e.g. $sidebar_new_mail_only.
Definition private.h:47
Sidebar private Window data -.
Definition private.h:91
int top_index
First mailbox visible in sidebar.
Definition private.h:96
int bot_index
Last mailbox visible in sidebar.
Definition private.h:99
int hil_index
Highlighted mailbox.
Definition private.h:98
struct IndexSharedData * shared
Shared Index Data.
Definition private.h:93
int opn_index
Current (open) mailbox.
Definition private.h:97
struct MuttWindow * win
Sidebar Window.
Definition private.h:92
struct SbEntryArray entries
Items to display in the sidebar.
Definition private.h:94