NeoMutt  2021-02-05-666-ge300cd
Teaching an old dog new tricks
DOXYGEN
pbar.c
Go to the documentation of this file.
1 
64 #include "config.h"
65 #include <inttypes.h> // IWYU pragma: keep
66 #include <stdio.h>
67 #include <sys/stat.h>
68 #include "mutt/lib.h"
69 #include "config/lib.h"
70 #include "core/lib.h"
71 #include "gui/lib.h"
72 #include "pbar.h"
73 #include "lib.h"
74 #include "index/lib.h"
75 #include "context.h"
76 #include "format_flags.h"
77 #include "hdrline.h"
78 #include "private_data.h"
79 
84 {
87  char *pager_format;
88 };
89 
93 static int pbar_recalc(struct MuttWindow *win)
94 {
95  if (!mutt_window_is_visible(win))
96  return 0;
97 
98  char buf[1024] = { 0 };
99 
100  struct PBarPrivateData *pbar_data = win->wdata;
101  struct IndexSharedData *shared = pbar_data->shared;
102  struct PagerPrivateData *priv = pbar_data->priv;
103 
104  char pager_progress_str[65]; /* Lots of space for translations */
105  if (priv->last_pos < priv->sb.st_size - 1)
106  {
107  snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%",
108  (100 * priv->last_offset / priv->sb.st_size));
109  }
110  else
111  {
112  const char *msg = (priv->topline == 0) ?
113  /* L10N: Status bar message: the entire email is visible in the pager */
114  _("all") :
115  /* L10N: Status bar message: the end of the email is visible in the pager */
116  _("end");
117  mutt_str_copy(pager_progress_str, msg, sizeof(pager_progress_str));
118  }
119 
120  if ((priv->pview->mode == PAGER_MODE_EMAIL) || (priv->pview->mode == PAGER_MODE_ATTACH_E))
121  {
122  int msg_in_pager = shared->ctx ? shared->ctx->msg_in_pager : -1;
123 
124  const char *c_pager_format = cs_subset_string(shared->sub, "pager_format");
125  mutt_make_string(buf, sizeof(buf), win->state.cols, NONULL(c_pager_format),
126  shared->mailbox, msg_in_pager, shared->email,
127  MUTT_FORMAT_NO_FLAGS, pager_progress_str);
128  }
129  else
130  {
131  snprintf(buf, sizeof(buf), "%s (%s)", priv->pview->banner, pager_progress_str);
132  }
133 
134  if (!mutt_str_equal(buf, pbar_data->pager_format))
135  {
136  mutt_str_replace(&pbar_data->pager_format, buf);
137  win->actions |= WA_REPAINT;
138  }
139 
140  return 0;
141 }
142 
146 static int pbar_repaint(struct MuttWindow *win)
147 {
148  if (!mutt_window_is_visible(win))
149  return 0;
150 
151  struct PBarPrivateData *pbar_data = win->wdata;
152  // struct IndexSharedData *shared = pbar_data->shared;
153 
154  mutt_window_move(win, 0, 0);
157 
158  mutt_window_move(win, 0, 0);
159  mutt_draw_statusline(win, win->state.cols, pbar_data->pager_format,
160  mutt_str_len(pbar_data->pager_format));
162 
163  mutt_debug(LL_DEBUG5, "repaint done\n");
164  return 0;
165 }
166 
170 static int pbar_color_observer(struct NotifyCallback *nc)
171 {
172  if ((nc->event_type != NT_COLOR) || !nc->global_data || !nc->event_data)
173  return -1;
174 
175  struct EventColor *ev_c = nc->event_data;
176  enum ColorId color = ev_c->color;
177 
178  if (color != MT_COLOR_STATUS)
179  return 0;
180 
181  struct MuttWindow *win_pbar = nc->global_data;
182  win_pbar->actions |= WA_REPAINT;
183  mutt_debug(LL_DEBUG5, "color done, request WA_REPAINT\n");
184 
185  return 0;
186 }
187 
191 static int pbar_config_observer(struct NotifyCallback *nc)
192 {
193  if ((nc->event_type != NT_CONFIG) || !nc->global_data || !nc->event_data)
194  return -1;
195 
196  struct EventConfig *ev_c = nc->event_data;
197  if (!mutt_str_equal(ev_c->name, "pager_format"))
198  return 0;
199 
200  struct MuttWindow *win_pbar = nc->global_data;
201  win_pbar->actions |= WA_RECALC;
202  mutt_debug(LL_DEBUG5, "config done, request WA_RECALC\n");
203 
204  return 0;
205 }
206 
210 static int pbar_index_observer(struct NotifyCallback *nc)
211 {
212  if ((nc->event_type != NT_INDEX) || !nc->global_data)
213  return -1;
214 
215  struct MuttWindow *win_ibar = nc->global_data;
216  if (!win_ibar)
217  return 0;
218 
219  struct IndexSharedData *shared = nc->event_data;
220  if (!shared)
221  return 0;
222 
224  {
225  win_ibar->actions |= WA_RECALC;
226  mutt_debug(LL_DEBUG5, "index done, request WA_RECALC\n");
227  }
228 
229  if (nc->event_subtype & NT_INDEX_EMAIL)
230  {
231  win_ibar->actions |= WA_RECALC;
232  mutt_debug(LL_DEBUG5, "index done, request WA_RECALC\n");
233  }
234 
235  return 0;
236 }
237 
241 static int pbar_pager_observer(struct NotifyCallback *nc)
242 {
243  if ((nc->event_type != NT_PAGER) || !nc->global_data)
244  return -1;
245 
246  struct MuttWindow *win_pbar = nc->global_data;
247  if (!win_pbar)
248  return 0;
249 
250  struct IndexSharedData *shared = nc->event_data;
251  if (!shared)
252  return 0;
253 
255  {
256  win_pbar->actions |= WA_RECALC;
257  mutt_debug(LL_DEBUG5, "pager done, request WA_RECALC\n");
258  }
259 
260  if (nc->event_subtype & NT_PAGER_EMAIL)
261  {
262  win_pbar->actions |= WA_RECALC;
263  mutt_debug(LL_DEBUG5, "pager done, request WA_RECALC\n");
264  }
265 
266  return 0;
267 }
268 
272 static int pbar_window_observer(struct NotifyCallback *nc)
273 {
274  if ((nc->event_type != NT_WINDOW) || !nc->global_data || !nc->event_data)
275  return -1;
276 
277  struct MuttWindow *win_pbar = nc->global_data;
278  struct EventWindow *ev_w = nc->event_data;
279  if (ev_w->win != win_pbar)
280  return 0;
281 
282  if (nc->event_subtype == NT_WINDOW_STATE)
283  {
284  win_pbar->actions |= WA_RECALC;
285  mutt_debug(LL_NOTIFY, "window state done, request WA_RECALC\n");
286  }
287  else if (nc->event_subtype == NT_WINDOW_DELETE)
288  {
289  struct PBarPrivateData *pbar_data = win_pbar->wdata;
290  struct IndexSharedData *shared = pbar_data->shared;
291 
296  notify_observer_remove(win_pbar->notify, pbar_window_observer, win_pbar);
297 
298  mutt_debug(LL_DEBUG5, "window delete done\n");
299  }
300 
301  return 0;
302 }
303 
307 static void pbar_data_free(struct MuttWindow *win, void **ptr)
308 {
309  struct PBarPrivateData *pbar_data = *ptr;
310 
311  FREE(&pbar_data->pager_format);
312 
313  FREE(ptr);
314 }
315 
320  struct PagerPrivateData *priv)
321 {
322  struct PBarPrivateData *pbar_data = mutt_mem_calloc(1, sizeof(struct PBarPrivateData));
323 
324  pbar_data->shared = shared;
325  pbar_data->priv = priv;
326 
327  return pbar_data;
328 }
329 
338  struct PagerPrivateData *priv)
339 {
340  struct MuttWindow *win_pbar =
343 
344  win_pbar->wdata = pbar_data_new(shared, priv);
345  win_pbar->wdata_free = pbar_data_free;
346  win_pbar->recalc = pbar_recalc;
347  win_pbar->repaint = pbar_repaint;
348 
354 
355  return win_pbar;
356 }
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:904
Convenience wrapper for the gui headers.
static int pbar_recalc(struct MuttWindow *win)
Recalculate the Window data - Implements MuttWindow::recalc() -.
Definition: pbar.c:93
#define NONULL(x)
Definition: string2.h:37
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
int msg_in_pager
Message currently shown in the pager.
Definition: context.h:43
struct stat sb
Definition: private_data.h:67
void(* wdata_free)(struct MuttWindow *win, void **ptr)
Definition: mutt_window.h:160
#define WA_REPAINT
Redraw the contents of the Window.
Definition: mutt_window.h:111
Data passed to a notification function.
Definition: observer.h:39
struct MuttWindow * win
Window that changed.
Definition: mutt_window.h:217
Log of notifications.
Definition: logging.h:45
struct Email * email
Currently selected Email.
Definition: shared_data.h:42
String processing routines to generate the mail index.
An Event that happened to a Colour.
Definition: color.h:122
An Event that happened to a Window.
Definition: mutt_window.h:215
The "currently-open" mailbox.
Private state data for the Pager.
#define NT_PAGER_EMAIL
Email has changed.
Definition: lib.h:173
#define NT_INDEX_EMAIL
Email has changed.
Definition: lib.h:65
Window uses all available vertical space.
Definition: mutt_window.h:38
#define NT_PAGER_MAILBOX
Mailbox has changed.
Definition: lib.h:172
void mutt_curses_set_color(enum ColorId color)
Set the current colour for text.
Definition: mutt_curses.c:56
struct ConfigSubset * sub
Config set to use.
Definition: shared_data.h:38
void mutt_window_clrtoeol(struct MuttWindow *win)
Clear to the end of the line.
Definition: mutt_window.c:259
struct IndexSharedData * shared
Shared Index data.
Definition: pbar.c:85
A config-change event.
Definition: subset.h:69
#define _(a)
Definition: message.h:28
Window is about to be deleted.
Definition: mutt_window.h:206
Data shared between Index, Pager and Sidebar.
Definition: shared_data.h:36
static int pbar_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t.
Definition: pbar.c:191
#define NT_INDEX_MAILBOX
Mailbox has changed.
Definition: lib.h:64
A special case of PAGER_MODE_ATTACH - attachment is a full-blown email message.
Definition: lib.h:133
Flags to control mutt_expando_format()
Container for Accounts, Notifications.
Definition: neomutt.h:36
MuttWindow has changed, NotifyWindow, EventWindow.
Definition: notify_type.h:53
#define MUTT_FORMAT_NO_FLAGS
No flags are set.
Definition: format_flags.h:30
struct Notify * notify
Notifications: NotifyIndex, IndexSharedData.
Definition: shared_data.h:44
Status Bar containing extra info about the Index/Pager/etc.
Definition: mutt_window.h:102
Convenience wrapper for the config headers.
int mutt_window_move(struct MuttWindow *win, int col, int row)
Move the cursor in a Window.
Definition: mutt_window.c:310
int event_subtype
Send: Event subtype, e.g. NT_ACCOUNT_ADD.
Definition: observer.h:43
Private state data for the Pager.
Definition: private_data.h:39
enum NotifyType event_type
Send: Event type, e.g. NT_ACCOUNT.
Definition: observer.h:42
WindowActionFlags actions
Actions to be performed, e.g. WA_RECALC.
Definition: mutt_window.h:132
char * pager_format
Cached status string.
Definition: pbar.c:87
Index data has changed, NotifyIndex, IndexSharedData.
Definition: notify_type.h:47
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:138
void mutt_make_string(char *buf, size_t buflen, int cols, const char *s, struct Mailbox *m, int inpgr, struct Email *e, MuttFormatFlags flags, const char *progress)
Create formatted strings using mailbox expandos.
Definition: hdrline.c:1409
Convenience wrapper for the core headers.
ColorId
List of all colored objects.
Definition: color.h:39
Pager Bar.
static struct PBarPrivateData * pbar_data_new(struct IndexSharedData *shared, struct PagerPrivateData *priv)
Free the private data attached to the MuttWindow.
Definition: pbar.c:319
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:189
void * global_data
Data from notify_observer_add()
Definition: observer.h:45
Window has a fixed size.
Definition: mutt_window.h:47
Plain text.
Definition: color.h:58
struct Context * ctx
Current Mailbox view.
Definition: shared_data.h:39
Window state has changed, e.g. WN_VISIBLE.
Definition: mutt_window.h:207
enum PagerMode mode
Pager mode.
Definition: lib.h:157
short cols
Number of columns, can be MUTT_WIN_SIZE_UNLIMITED.
Definition: mutt_window.h:60
Pager is invoked via 1st path. The mime part is selected automatically.
Definition: lib.h:131
static void pbar_data_free(struct MuttWindow *win, void **ptr)
Free the private data attached to the MuttWindow - Implements MuttWindow::wdata_free() -...
Definition: pbar.c:307
Colour has changed, NotifyColor, EventColor.
Definition: notify_type.h:39
struct WindowState state
Current state of the Window.
Definition: mutt_window.h:127
bool mutt_window_is_visible(struct MuttWindow *win)
Is the Window visible?
Definition: mutt_window.c:529
Status bar (takes a pattern)
Definition: color.h:75
#define MUTT_WIN_SIZE_UNLIMITED
Use as much space as possible.
Definition: mutt_window.h:52
struct PagerPrivateData * priv
Private Pager data.
Definition: pbar.c:86
void mutt_draw_statusline(struct MuttWindow *win, int cols, const char *buf, size_t buflen)
Draw a highlighted status bar.
Definition: dlg_index.c:875
Pager data has changed, NotifyPager, IndexSharedData.
Definition: notify_type.h:50
enum ColorId color
Definition: color.h:124
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:317
Data to draw the Pager Bar.
Definition: pbar.c:83
static int pbar_color_observer(struct NotifyCallback *nc)
Notification that a Color has changed - Implements observer_t.
Definition: pbar.c:170
struct PagerView * pview
Definition: private_data.h:44
struct Notify * notify
Notifications handler.
Definition: neomutt.h:38
#define mutt_debug(LEVEL,...)
Definition: logging.h:85
static int pbar_repaint(struct MuttWindow *win)
Repaint the Window - Implements MuttWindow::repaint() -.
Definition: pbar.c:146
void * event_data
Data from notify_send()
Definition: observer.h:44
static int pbar_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t.
Definition: pbar.c:272
Config has changed, NotifyConfig, EventConfig.
Definition: notify_type.h:42
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition: string.c:664
struct MuttWindow * pbar_new(struct MuttWindow *parent, struct IndexSharedData *shared, struct PagerPrivateData *priv)
Create the Pager Bar.
Definition: pbar.c:337
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:749
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition: string.c:446
struct MuttWindow * parent
Parent Window.
Definition: mutt_window.h:135
static int pbar_pager_observer(struct NotifyCallback *nc)
Notification that the Pager has changed - Implements observer_t.
Definition: pbar.c:241
int(* repaint)(struct MuttWindow *win)
Definition: mutt_window.h:182
#define FREE(x)
Definition: memory.h:40
static int pbar_index_observer(struct NotifyCallback *nc)
Notification that the Index has changed - Implements observer_t.
Definition: pbar.c:210
bool notify_observer_remove(struct Notify *notify, observer_t callback, void *global_data)
Remove an observer from an object.
Definition: notify.c:228
int(* recalc)(struct MuttWindow *win)
Definition: mutt_window.h:171
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:180
struct Mailbox * mailbox
Current Mailbox.
Definition: shared_data.h:41
Log at debug level 5.
Definition: logging.h:44
Convenience wrapper for the library headers.
GUI manage the main index (list of emails)
const char * banner
Title to display in status bar.
Definition: lib.h:159
void * wdata
Private data.
Definition: mutt_window.h:145
const char * name
Name of config item that changed.
Definition: subset.h:72
#define WA_RECALC
Recalculate the contents of the Window.
Definition: mutt_window.h:110