NeoMutt  2025-12-11-872-g385a04
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
ibar.c
Go to the documentation of this file.
1
23
62
63#include "config.h"
64#include <stdbool.h>
65#include "mutt/lib.h"
66#include "config/lib.h"
67#include "core/lib.h"
68#include "gui/lib.h"
69#include "gui/module_data.h"
70#include "lib.h"
71#include "color/lib.h"
72#include "expando/lib.h"
73#include "private_data.h"
74#include "shared_data.h"
75#include "status.h"
76
88
92static int ibar_recalc(struct MuttWindow *win)
93{
94 struct Buffer *buf = buf_pool_get();
95
96 struct IBarPrivateData *ibar_data = win->wdata;
97 struct IndexSharedData *shared = ibar_data->shared;
98 struct IndexPrivateData *priv = ibar_data->priv;
100
101 const struct Expando *c_status_format = cs_subset_expando(shared->sub, "status_format");
102 menu_status_line(buf, shared, priv->menu, win->state.cols, c_status_format);
103
104 if (!mutt_str_equal(buf_string(buf), ibar_data->status_format))
105 {
106 mutt_str_replace(&ibar_data->status_format, buf_string(buf));
107 win->actions |= WA_REPAINT;
108 mutt_debug(LL_DEBUG5, "recalc done, request WA_REPAINT\n");
109 }
110
111 const bool c_ts_enabled = cs_subset_bool(shared->sub, "ts_enabled");
112 if (c_ts_enabled && mod_data && mod_data->ts_supported)
113 {
114 buf_reset(buf);
115 const struct Expando *c_ts_status_format = cs_subset_expando(shared->sub, "ts_status_format");
116 menu_status_line(buf, shared, priv->menu, -1, c_ts_status_format);
117 if (!mutt_str_equal(buf_string(buf), ibar_data->ts_status_format))
118 {
120 win->actions |= WA_REPAINT;
121 mutt_debug(LL_DEBUG5, "recalc done, request WA_REPAINT\n");
122 }
123
124 buf_reset(buf);
125 const struct Expando *c_ts_icon_format = cs_subset_expando(shared->sub, "ts_icon_format");
126 menu_status_line(buf, shared, priv->menu, -1, c_ts_icon_format);
127 if (!mutt_str_equal(buf_string(buf), ibar_data->ts_icon_format))
128 {
129 mutt_str_replace(&ibar_data->ts_icon_format, buf_string(buf));
130 win->actions |= WA_REPAINT;
131 mutt_debug(LL_DEBUG5, "recalc done, request WA_REPAINT\n");
132 }
133 }
134
135 buf_pool_release(&buf);
136 return 0;
137}
138
142static int ibar_repaint(struct MuttWindow *win)
143{
144 struct IBarPrivateData *ibar_data = win->wdata;
145 struct IndexSharedData *shared = ibar_data->shared;
146
147 mutt_window_move(win, 0, 0);
150
151 mutt_window_move(win, 0, 0);
152 mutt_draw_statusline(win, win->state.cols, ibar_data->status_format,
153 mutt_str_len(ibar_data->status_format));
155
156 const bool c_ts_enabled = cs_subset_bool(shared->sub, "ts_enabled");
158 if (c_ts_enabled && mod_data && mod_data->ts_supported)
159 {
161 mutt_ts_icon(ibar_data->ts_icon_format);
162 }
163
164 mutt_debug(LL_DEBUG5, "repaint done\n");
165 return 0;
166}
167
172{
173 if (nc->event_type != NT_COLOR)
174 return 0;
175 if (!nc->global_data || !nc->event_data)
176 return -1;
177
178 struct EventColor *ev_c = nc->event_data;
179
180 // MT_COLOR_MAX is sent on `uncolor *`
181 if ((ev_c->cid != MT_COLOR_STATUS) && (ev_c->cid != MT_COLOR_NORMAL) &&
182 (ev_c->cid != MT_COLOR_MAX))
183 {
184 return 0;
185 }
186
187 struct MuttWindow *win_ibar = nc->global_data;
188 win_ibar->actions |= WA_REPAINT;
189 mutt_debug(LL_DEBUG5, "color done, request WA_REPAINT\n");
190
191 return 0;
192}
193
198{
199 if (nc->event_type != NT_CONFIG)
200 return 0;
201 if (!nc->global_data || !nc->event_data)
202 return -1;
203
204 struct EventConfig *ev_c = nc->event_data;
205 if (!ev_c->name)
206 return 0;
207 if ((ev_c->name[0] != 's') && (ev_c->name[0] != 't'))
208 return 0;
209
210 if (!mutt_str_equal(ev_c->name, "status_format") &&
211 !mutt_str_equal(ev_c->name, "ts_enabled") &&
212 !mutt_str_equal(ev_c->name, "ts_icon_format") &&
213 !mutt_str_equal(ev_c->name, "ts_status_format"))
214 {
215 return 0;
216 }
217
218 struct MuttWindow *win_ibar = nc->global_data;
219 win_ibar->actions |= WA_RECALC;
220 mutt_debug(LL_DEBUG5, "config done, request WA_RECALC\n");
221
222 return 0;
223}
224
235{
236 if (!nc->global_data)
237 return -1;
238
239 struct MuttWindow *win_ibar = nc->global_data;
240 win_ibar->actions |= WA_RECALC;
241 mutt_debug(LL_DEBUG5, "index done, request WA_RECALC\n");
242
243 return 0;
244}
245
249static int ibar_menu_observer(struct NotifyCallback *nc)
250{
251 if (nc->event_type != NT_MENU)
252 return 0;
253 if (!nc->global_data)
254 return -1;
255
256 struct MuttWindow *win_ibar = nc->global_data;
257 win_ibar->actions |= WA_RECALC;
258 mutt_debug(LL_DEBUG5, "menu done, request WA_RECALC\n");
259
260 return 0;
261}
262
267{
268 if (nc->event_type != NT_WINDOW)
269 return 0;
270 if (!nc->global_data)
271 return -1;
272
273 struct MuttWindow *win_ibar = nc->global_data;
274 struct EventWindow *ev_w = nc->event_data;
275 if (ev_w->win != win_ibar)
276 return 0;
277
279 {
280 win_ibar->actions |= WA_REPAINT;
281 mutt_debug(LL_DEBUG5, "window state done, request WA_REPAINT\n");
282 }
283 else if (nc->event_subtype == NT_WINDOW_DELETE)
284 {
285 struct MuttWindow *dlg = window_find_parent(win_ibar, WT_DLG_INDEX);
286 if (!dlg)
287 return 0;
288 struct IndexSharedData *shared = dlg->wdata;
289
295
296 mutt_debug(LL_DEBUG5, "window delete done\n");
297 }
298
299 return 0;
300}
301
305static void ibar_data_free(struct MuttWindow *win, void **ptr)
306{
307 if (!ptr || !*ptr)
308 return;
309
310 struct IBarPrivateData *ibar_data = *ptr;
311
312 FREE(&ibar_data->status_format);
313 FREE(&ibar_data->ts_status_format);
314 FREE(&ibar_data->ts_icon_format);
315
316 FREE(ptr);
317}
318
326 struct IndexPrivateData *priv)
327{
328 struct IBarPrivateData *ibar_data = MUTT_MEM_CALLOC(1, struct IBarPrivateData);
329
330 ibar_data->shared = shared;
331 ibar_data->priv = priv;
332
333 return ibar_data;
334}
335
343struct MuttWindow *ibar_new(struct MuttWindow *parent, struct IndexSharedData *shared,
344 struct IndexPrivateData *priv)
345{
349
350 win_ibar->wdata = ibar_data_new(shared, priv);
351 win_ibar->wdata_free = ibar_data_free;
352 win_ibar->recalc = ibar_recalc;
353 win_ibar->repaint = ibar_repaint;
354
360
361 return win_ibar;
362}
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition buffer.c:76
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
Color and attribute parsing.
void mutt_color_observer_remove(observer_t callback, void *global_data)
Remove an observer.
Definition notify.c:73
void mutt_color_observer_add(observer_t callback, void *global_data)
Add an observer.
Definition notify.c:62
@ MT_COLOR_MAX
Definition color.h:97
@ MT_COLOR_STATUS
Status bar (takes a pattern)
Definition color.h:78
@ MT_COLOR_NORMAL
Plain text.
Definition color.h:53
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
const struct Expando * cs_subset_expando(const struct ConfigSubset *sub, const char *name)
Get an Expando config item by name.
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
void mutt_draw_statusline(struct MuttWindow *win, int max_cols, const char *buf, size_t buflen)
Draw a highlighted status bar.
Definition dlg_index.c:980
Parse Expando string.
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
static int ibar_menu_observer(struct NotifyCallback *nc)
Notification that a Menu has changed - Implements observer_t -.
Definition ibar.c:249
static int ibar_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition ibar.c:266
static int ibar_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
Definition ibar.c:197
static int ibar_color_observer(struct NotifyCallback *nc)
Notification that a Color has changed - Implements observer_t -.
Definition ibar.c:171
static int ibar_index_observer(struct NotifyCallback *nc)
Notification that the Index has changed - Implements observer_t -.
Definition ibar.c:234
static int ibar_recalc(struct MuttWindow *win)
Recalculate the Window data - Implements MuttWindow::recalc() -.
Definition ibar.c:92
static int ibar_repaint(struct MuttWindow *win)
Repaint the Window - Implements MuttWindow::repaint() -.
Definition ibar.c:142
static void ibar_data_free(struct MuttWindow *win, void **ptr)
Free the private data - Implements MuttWindow::wdata_free() -.
Definition ibar.c:305
Convenience wrapper for the gui headers.
Gui private Module data.
static struct IBarPrivateData * ibar_data_new(struct IndexSharedData *shared, struct IndexPrivateData *priv)
Create the private data for the Index Bar (status)
Definition ibar.c:325
struct MuttWindow * ibar_new(struct MuttWindow *parent, struct IndexSharedData *shared, struct IndexPrivateData *priv)
Create the Index Bar (status)
Definition ibar.c:343
GUI manage the main index (list of emails)
Private state data for the Index.
Data shared between Index, Pager and Sidebar.
@ LL_DEBUG5
Log at debug level 5.
Definition logging2.h:49
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
#define MUTT_MEM_CALLOC(n, type)
Definition memory.h:52
@ MODULE_ID_GUI
ModuleGui, Graphical code
Definition module_api.h:45
Convenience wrapper for the library headers.
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
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition string.c:503
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition string.c:284
const struct AttrColor * mutt_curses_set_normal_backed_color_by_id(enum ColorId cid)
Set the colour and attributes by the Colour ID.
Definition mutt_curses.c:63
const struct AttrColor * mutt_curses_set_color_by_id(enum ColorId cid)
Set the colour and attributes by the Colour ID.
Definition mutt_curses.c:79
struct MuttWindow * window_find_parent(struct MuttWindow *win, enum WindowType type)
Find a (grand-)parent of a Window by type.
struct MuttWindow * mutt_window_new(enum WindowType type, enum MuttWindowOrientation orient, enum MuttWindowSize size, int cols, int rows)
Create a new Window.
int mutt_window_move(struct MuttWindow *win, int row, int col)
Move the cursor in a Window.
void mutt_window_clrtoeol(struct MuttWindow *win)
Clear to the end of the line.
@ WT_DLG_INDEX
Index Dialog, dlg_index()
Definition mutt_window.h:86
@ WT_STATUS_BAR
Status Bar containing extra info about the Index/Pager/etc.
@ MUTT_WIN_ORIENT_VERTICAL
Window uses all available vertical space.
Definition mutt_window.h:38
@ WA_REPAINT
Redraw the contents of the Window.
@ WA_RECALC
Recalculate the contents of the Window.
@ NT_WINDOW_STATE
Window state has changed, e.g. WN_VISIBLE.
@ NT_WINDOW_DELETE
Window is about to be deleted.
#define MUTT_WIN_SIZE_UNLIMITED
Use as much space as possible.
Definition mutt_window.h:52
@ MUTT_WIN_SIZE_FIXED
Window has a fixed size.
Definition mutt_window.h:47
void * neomutt_get_module_data(struct NeoMutt *n, enum ModuleId id)
Get the private data for a Module.
Definition neomutt.c:663
@ NT_WINDOW
MuttWindow has changed, NotifyWindow, EventWindow.
Definition notify_type.h:58
@ NT_MENU
Menu has changed, MenuRedrawFlags.
Definition notify_type.h:52
@ NT_CONFIG
Config has changed, NotifyConfig, EventConfig.
Definition notify_type.h:43
@ NT_COLOR
Colour has changed, NotifyColor, EventColor.
Definition notify_type.h:41
@ NT_ALL
Register for all notifications.
Definition notify_type.h:35
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
void menu_status_line(struct Buffer *buf, struct IndexSharedData *shared, struct Menu *menu, int max_cols, const struct Expando *exp)
Create the status line.
Definition status.c:51
GUI display a user-configurable status line.
String manipulation buffer.
Definition buffer.h:36
struct Notify * notify
Notifications: NotifyConfig, EventConfig.
Definition subset.h:51
An Event that happened to a Colour.
Definition notify2.h:52
enum ColorId cid
Colour ID that has changed.
Definition notify2.h:53
A config-change event.
Definition subset.h:70
const char * name
Name of config item that changed.
Definition subset.h:72
An Event that happened to a Window.
struct MuttWindow * win
Window that changed.
Parsed Expando trees.
Definition expando.h:41
Gui private Module data.
Definition module_data.h:32
bool ts_supported
Terminal Setting is supported.
Definition module_data.h:43
Data to draw the Index Bar.
Definition ibar.c:81
char * ts_icon_format
Cached terminal icon string.
Definition ibar.c:86
struct IndexSharedData * shared
Shared Index data.
Definition ibar.c:82
char * ts_status_format
Cached terminal status string.
Definition ibar.c:85
char * status_format
Cached screen status string.
Definition ibar.c:84
struct IndexPrivateData * priv
Private Index data.
Definition ibar.c:83
Private state data for the Index.
struct Menu * menu
Menu controlling the index.
Data shared between Index, Pager and Sidebar.
Definition shared_data.h:37
struct ConfigSubset * sub
Config set to use.
Definition shared_data.h:38
struct Notify * notify
Notifications: NotifyIndex, IndexSharedData.
Definition shared_data.h:44
int(* repaint)(struct MuttWindow *win)
struct WindowState state
Current state of the Window.
void * wdata
Private data.
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
int(* recalc)(struct MuttWindow *win)
void(* wdata_free)(struct MuttWindow *win, void **ptr)
struct MuttWindow * parent
Parent Window.
WindowActionFlags actions
Actions to be performed, e.g. WA_RECALC.
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
Data passed to a notification function.
Definition observer.h:34
void * event_data
Data from notify_send()
Definition observer.h:38
enum NotifyType event_type
Send: Event type, e.g. NT_ACCOUNT.
Definition observer.h:36
int event_subtype
Send: Event subtype, e.g. NT_ACCOUNT_ADD.
Definition observer.h:37
void * global_data
Data from notify_observer_add()
Definition observer.h:39
short cols
Number of columns, can be MUTT_WIN_SIZE_UNLIMITED.
Definition mutt_window.h:60
void mutt_ts_icon(char *str)
Set the icon in the terminal title bar.
Definition terminal.c:142
void mutt_ts_status(char *str)
Set the text of the terminal title bar.
Definition terminal.c:128