NeoMutt  2024-10-02-37-gfa9146
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
sidebar.c File Reference

GUI display the mailboxes in a side panel. More...

#include "config.h"
#include <stdbool.h>
#include <stdio.h>
#include "private.h"
#include "mutt/lib.h"
#include "config/lib.h"
#include "core/lib.h"
#include "gui/lib.h"
#include "lib.h"
#include "index/lib.h"
+ Include dependency graph for sidebar.c:

Go to the source code of this file.

Functions

struct Mailboxsb_get_highlight (struct MuttWindow *win)
 Get the Mailbox that's highlighted in the sidebar.
 
void sb_add_mailbox (struct SidebarWindowData *wdata, struct Mailbox *m)
 Add a Mailbox to the Sidebar.
 
void sb_remove_mailbox (struct SidebarWindowData *wdata, const struct Mailbox *m)
 Remove a Mailbox from the Sidebar.
 
void sb_set_current_mailbox (struct SidebarWindowData *wdata, struct Mailbox *m)
 Set the current Mailbox.
 
void sb_init (void)
 Set up the Sidebar.
 
void sb_cleanup (void)
 Clean up the Sidebar.
 

Variables

struct ListHead SidebarPinned = STAILQ_HEAD_INITIALIZER(SidebarPinned)
 List of mailboxes to always display in the sidebar.
 
static const struct Command SbCommands []
 Sidebar Commands.
 

Detailed Description

GUI display the mailboxes in a side panel.

Authors
  • Kevin J. McCarthy
  • Richard Russon
  • Pietro Cerutti
  • Whitney Cumber

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 sidebar.c.

Function Documentation

◆ sb_get_highlight()

struct Mailbox * sb_get_highlight ( struct MuttWindow win)

Get the Mailbox that's highlighted in the sidebar.

Parameters
winSidebar Window
Return values
ptrMailbox

Definition at line 63 of file sidebar.c.

64{
65 const bool c_sidebar_visible = cs_subset_bool(NeoMutt->sub, "sidebar_visible");
66 if (!c_sidebar_visible)
67 return NULL;
68
70 if (wdata->hil_index < 0)
71 return NULL;
72
73 struct SbEntry **sbep = ARRAY_GET(&wdata->entries, wdata->hil_index);
74 if (!sbep)
75 return NULL;
76
77 return (*sbep)->mailbox;
78}
#define ARRAY_GET(head, idx)
Return the element at index.
Definition: array.h:109
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:47
struct SidebarWindowData * sb_wdata_get(struct MuttWindow *win)
Get the Sidebar data for this window.
Definition: wdata.c:77
void * wdata
Private data.
Definition: mutt_window.h:144
Container for Accounts, Notifications.
Definition: neomutt.h:42
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:46
Info about folders in the sidebar.
Definition: private.h:41
Sidebar private Window data -.
Definition: private.h:88
int hil_index
Highlighted mailbox.
Definition: private.h:95
struct MuttWindow * win
Sidebar Window.
Definition: private.h:89
struct SbEntryArray entries
Items to display in the sidebar.
Definition: private.h:91
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sb_add_mailbox()

void sb_add_mailbox ( struct SidebarWindowData wdata,
struct Mailbox m 
)

Add a Mailbox to the Sidebar.

Parameters
wdataSidebar data
mMailbox to add

The Sidebar will be re-sorted, and the indices updated, when sb_recalc() is called.

Definition at line 88 of file sidebar.c.

89{
90 if (!m)
91 return;
92
93 struct SbEntry **sbep = NULL;
94 ARRAY_FOREACH(sbep, &wdata->entries)
95 {
96 if ((*sbep)->mailbox == m)
97 return;
98 }
99
100 /* Any new/deleted mailboxes will cause a refresh. As long as
101 * they're valid, our pointers will be updated in prepare_sidebar() */
102
103 struct IndexSharedData *shared = wdata->shared;
104 struct SbEntry *entry = mutt_mem_calloc(1, sizeof(struct SbEntry));
105 entry->mailbox = m;
106
107 if (wdata->top_index < 0)
108 wdata->top_index = ARRAY_SIZE(&wdata->entries);
109 if (wdata->bot_index < 0)
110 wdata->bot_index = ARRAY_SIZE(&wdata->entries);
111 if ((wdata->opn_index < 0) && shared->mailbox &&
113 {
114 wdata->opn_index = ARRAY_SIZE(&wdata->entries);
115 }
116
117 ARRAY_ADD(&wdata->entries, entry);
118}
#define ARRAY_ADD(head, elem)
Add an element at the end of the array.
Definition: array.h:156
#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
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:51
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:660
Data shared between Index, Pager and Sidebar.
Definition: shared_data.h:37
struct Mailbox * mailbox
Current Mailbox.
Definition: shared_data.h:41
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
Definition: mailbox.h:81
struct Mailbox * mailbox
Mailbox this represents.
Definition: private.h:45
int top_index
First mailbox visible in sidebar.
Definition: private.h:93
int bot_index
Last mailbox visible in sidebar.
Definition: private.h:96
struct IndexSharedData * shared
Shared Index Data.
Definition: private.h:90
int opn_index
Current (open) mailbox.
Definition: private.h:94
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sb_remove_mailbox()

void sb_remove_mailbox ( struct SidebarWindowData wdata,
const struct Mailbox m 
)

Remove a Mailbox from the Sidebar.

Parameters
wdataSidebar data
mMailbox to remove

Definition at line 125 of file sidebar.c.

126{
127 struct SbEntry **sbep = NULL;
128 ARRAY_FOREACH(sbep, &wdata->entries)
129 {
130 if ((*sbep)->mailbox != m)
131 continue;
132
133 struct SbEntry *sbe_remove = *sbep;
134 ARRAY_REMOVE(&wdata->entries, sbep);
135 FREE(&sbe_remove);
136
137 if (wdata->opn_index == ARRAY_FOREACH_IDX)
138 {
139 // Open item was deleted
140 wdata->opn_index = -1;
141 }
142 else if ((wdata->opn_index > 0) && (wdata->opn_index > ARRAY_FOREACH_IDX))
143 {
144 // Open item is still visible, so adjust the index
145 wdata->opn_index--;
146 }
147
148 if (wdata->hil_index == ARRAY_FOREACH_IDX)
149 {
150 // If possible, keep the highlight where it is
151 struct SbEntry **sbep_cur = ARRAY_GET(&wdata->entries, ARRAY_FOREACH_IDX);
152 if (!sbep_cur)
153 {
154 // The last entry was deleted, so backtrack
155 sb_prev(wdata);
156 }
157 else if ((*sbep)->is_hidden)
158 {
159 // Find the next unhidden entry, or the previous
160 if (!sb_next(wdata) && !sb_prev(wdata))
161 wdata->hil_index = -1;
162 }
163 }
164 else if ((wdata->hil_index > 0) && (wdata->hil_index > ARRAY_FOREACH_IDX))
165 {
166 // Highlighted item is still visible, so adjust the index
167 wdata->hil_index--;
168 }
169 break;
170 }
171}
#define ARRAY_REMOVE(head, elem)
Remove an entry from the array, shifting down the subsequent entries.
Definition: array.h:267
#define FREE(x)
Definition: memory.h:45
bool sb_prev(struct SidebarWindowData *wdata)
Find the previous unhidden Mailbox.
Definition: functions.c:86
bool sb_next(struct SidebarWindowData *wdata)
Find the next unhidden Mailbox.
Definition: functions.c:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sb_set_current_mailbox()

void sb_set_current_mailbox ( struct SidebarWindowData wdata,
struct Mailbox m 
)

Set the current Mailbox.

Parameters
wdataSidebar data
mMailbox

Definition at line 178 of file sidebar.c.

179{
180 wdata->opn_index = -1;
181
182 struct SbEntry **sbep = NULL;
183 ARRAY_FOREACH(sbep, &wdata->entries)
184 {
185 if (m && m->visible)
186 {
187 if (mutt_str_equal((*sbep)->mailbox->realpath, m->realpath))
188 {
189 wdata->opn_index = ARRAY_FOREACH_IDX;
190 wdata->hil_index = ARRAY_FOREACH_IDX;
191 break;
192 }
193 }
194 (*sbep)->is_hidden = !(*sbep)->mailbox->visible;
195 }
196}
bool visible
True if a result of "mailboxes".
Definition: mailbox.h:130
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sb_init()

void sb_init ( void  )

Set up the Sidebar.

Definition at line 201 of file sidebar.c.

202{
204
205 // Listen for dialog creation events
208}
void commands_register(const struct Command *cmds, const size_t num_cmds)
Add commands to Commands array.
Definition: command.c:53
struct MuttWindow * AllDialogsWindow
Parent of all Dialogs.
Definition: dialog.c:80
int sb_insertion_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition: observer.c:466
#define mutt_array_size(x)
Definition: memory.h:38
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
@ NT_WINDOW
MuttWindow has changed, NotifyWindow, EventWindow.
Definition: notify_type.h:57
static const struct Command SbCommands[]
Sidebar Commands.
Definition: sidebar.c:48
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:137
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sb_cleanup()

void sb_cleanup ( void  )

Clean up the Sidebar.

Definition at line 213 of file sidebar.c.

214{
218}
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
Definition: list.c:123
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
struct ListHead SidebarPinned
List of mailboxes to always display in the sidebar.
Definition: sidebar.c:43
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ SidebarPinned

struct ListHead SidebarPinned = STAILQ_HEAD_INITIALIZER(SidebarPinned)

List of mailboxes to always display in the sidebar.

Definition at line 43 of file sidebar.c.

◆ SbCommands

const struct Command SbCommands[]
static
Initial value:
= {
{ "sidebar_pin", sb_parse_sidebar_pin, 0 },
{ "sidebar_unpin", sb_parse_sidebar_unpin, 0 },
{ "sidebar_whitelist", sb_parse_sidebar_pin, 0 },
{ "unsidebar_whitelist", sb_parse_sidebar_unpin, 0 },
}
enum CommandResult sb_parse_sidebar_pin(struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
Parse the 'sidebar_pin' command - Implements Command::parse() -.
Definition: commands.c:41
enum CommandResult sb_parse_sidebar_unpin(struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
Parse the 'sidebar_unpin' command - Implements Command::parse() -.
Definition: commands.c:60

Sidebar Commands.

Definition at line 48 of file sidebar.c.