NeoMutt  2021-10-29-225-gb9986f
Teaching an old dog new tricks
DOXYGEN
mutt_window.c File Reference

Window management. More...

#include "config.h"
#include <stdarg.h>
#include <string.h>
#include "mutt/lib.h"
#include "config/lib.h"
#include "mutt_window.h"
#include "curs_lib.h"
#include "mutt_curses.h"
#include "options.h"
#include "reflow.h"
#include "rootwin.h"
+ Include dependency graph for mutt_window.c:

Go to the source code of this file.

Functions

static bool window_was_visible (struct MuttWindow *win)
 Was the Window visible? More...
 
static void window_notify (struct MuttWindow *win)
 Notify observers of changes to a Window. More...
 
void window_notify_all (struct MuttWindow *win)
 Notify observers of changes to a Window and its children. More...
 
void window_set_visible (struct MuttWindow *win, bool visible)
 Set a Window visible or hidden. More...
 
struct MuttWindowmutt_window_new (enum WindowType type, enum MuttWindowOrientation orient, enum MuttWindowSize size, int cols, int rows)
 Create a new Window. More...
 
void mutt_window_free (struct MuttWindow **ptr)
 Free a Window and its children. More...
 
void mutt_window_clearline (struct MuttWindow *win, int row)
 Clear a row of a Window. More...
 
void mutt_window_clrtoeol (struct MuttWindow *win)
 Clear to the end of the line. More...
 
void mutt_window_get_coords (struct MuttWindow *win, int *col, int *row)
 Get the cursor position in the Window. More...
 
int mutt_window_move (struct MuttWindow *win, int col, int row)
 Move the cursor in a Window. More...
 
int mutt_window_mvaddstr (struct MuttWindow *win, int col, int row, const char *str)
 Move the cursor and write a fixed string to a Window. More...
 
int mutt_window_mvprintw (struct MuttWindow *win, int col, int row, const char *fmt,...)
 Move the cursor and write a formatted string to a Window. More...
 
void mutt_window_reflow (struct MuttWindow *win)
 Resize a Window and its children. More...
 
int mutt_window_wrap_cols (int width, short wrap)
 Calculate the wrap column for a given screen width. More...
 
int mutt_window_addch (struct MuttWindow *win, int ch)
 Write one character to a Window. More...
 
int mutt_window_addnstr (struct MuttWindow *win, const char *str, int num)
 Write a partial string to a Window. More...
 
int mutt_window_addstr (struct MuttWindow *win, const char *str)
 Write a string to a Window. More...
 
int mutt_window_printf (struct MuttWindow *win, const char *fmt,...)
 Write a formatted string to a Window. More...
 
void mutt_window_add_child (struct MuttWindow *parent, struct MuttWindow *child)
 Add a child to Window. More...
 
struct MuttWindowmutt_window_remove_child (struct MuttWindow *parent, struct MuttWindow *child)
 Remove a child from a Window. More...
 
void mutt_winlist_free (struct MuttWindowList *head)
 Free a tree of Windows. More...
 
bool mutt_window_is_visible (struct MuttWindow *win)
 Is the Window visible? More...
 
struct MuttWindowwindow_find_child (struct MuttWindow *win, enum WindowType type)
 Recursively find a child Window of a given type. More...
 
struct MuttWindowwindow_find_parent (struct MuttWindow *win, enum WindowType type)
 Find a (grand-)parent of a Window by type. More...
 
static void window_recalc (struct MuttWindow *win)
 Recalculate a tree of Windows. More...
 
static void window_repaint (struct MuttWindow *win)
 Repaint a tree of Windows. More...
 
void window_redraw (struct MuttWindow *win)
 Reflow, recalc and repaint a tree of Windows. More...
 
bool window_is_focused (struct MuttWindow *win)
 Does the given Window have the focus? More...
 
struct MuttWindowwindow_get_focus (void)
 Get the currently focused Window. More...
 
struct MuttWindowwindow_set_focus (struct MuttWindow *win)
 Set the Window focus. More...
 
void mutt_window_clear (struct MuttWindow *win)
 Clear a Window. More...
 
const char * mutt_window_win_name (const struct MuttWindow *win)
 Get the name of a Window. More...
 
static void window_invalidate (struct MuttWindow *win)
 Mark a window as in need of repaint. More...
 
void window_invalidate_all (void)
 Mark all windows as in need of repaint. More...
 
bool window_status_on_top (struct MuttWindow *panel, struct ConfigSubset *sub)
 Organise windows according to config variable. More...
 

Variables

static const struct Mapping WindowNames []
 Lookups for Window Names. More...
 

Detailed Description

Window management.

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

Function Documentation

◆ window_was_visible()

static bool window_was_visible ( struct MuttWindow win)
static

Was the Window visible?

Parameters
winWindow
Return values
trueThe Window was visible

Using the WindowState old, check if a Window used to be visible. For a Window to be visible, it must have been visible and its parent and grandparent, etc.

Definition at line 86 of file mutt_window.c.

87 {
88  if (!win)
89  return false;
90 
91  for (; win; win = win->parent)
92  {
93  if (!win->old.visible)
94  return false;
95  }
96 
97  return true;
98 }
struct WindowState old
Previous state of the Window.
Definition: mutt_window.h:128
struct MuttWindow * parent
Parent Window.
Definition: mutt_window.h:135
bool visible
Window is visible.
Definition: mutt_window.h:59
+ Here is the caller graph for this function:

◆ window_notify()

static void window_notify ( struct MuttWindow win)
static

Notify observers of changes to a Window.

Parameters
winWindow

Definition at line 104 of file mutt_window.c.

105 {
106  if (!win->notify)
107  return;
108 
109  const struct WindowState *old = &win->old;
110  const struct WindowState *state = &win->state;
112 
113  const bool was_visible = window_was_visible(win);
114  const bool is_visible = mutt_window_is_visible(win);
115  if (was_visible != is_visible)
116  flags |= is_visible ? WN_VISIBLE : WN_HIDDEN;
117 
118  if ((state->row_offset != old->row_offset) || (state->col_offset != old->col_offset))
119  flags |= WN_MOVED;
120 
121  if (state->rows > old->rows)
122  flags |= WN_TALLER;
123  else if (state->rows < old->rows)
124  flags |= WN_SHORTER;
125 
126  if (state->cols > old->cols)
127  flags |= WN_WIDER;
128  else if (state->cols < old->cols)
129  flags |= WN_NARROWER;
130 
131  if (flags == WN_NO_FLAGS)
132  return;
133 
134  mutt_debug(LL_NOTIFY, "NT_WINDOW_STATE: %s, %p\n", mutt_window_win_name(win), win);
135  struct EventWindow ev_w = { win, flags };
137 }
#define mutt_debug(LEVEL,...)
Definition: logging.h:84
@ LL_NOTIFY
Log of notifications.
Definition: logging.h:45
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition: notify.c:171
static bool is_visible(struct Email *e)
Is the message visible?
Definition: mutt_thread.c:132
bool mutt_window_is_visible(struct MuttWindow *win)
Is the Window visible?
Definition: mutt_window.c:500
const char * mutt_window_win_name(const struct MuttWindow *win)
Get the name of a Window.
Definition: mutt_window.c:702
static bool window_was_visible(struct MuttWindow *win)
Was the Window visible?
Definition: mutt_window.c:86
#define WN_MOVED
Window moved.
Definition: mutt_window.h:191
uint8_t WindowNotifyFlags
Flags for Changes to a MuttWindow, e.g. WN_TALLER.
Definition: mutt_window.h:185
#define WN_WIDER
Window became wider.
Definition: mutt_window.h:189
@ NT_WINDOW_STATE
Window state has changed, e.g. WN_VISIBLE.
Definition: mutt_window.h:207
#define WN_VISIBLE
Window became visible.
Definition: mutt_window.h:192
#define WN_HIDDEN
Window became hidden.
Definition: mutt_window.h:193
#define WN_NO_FLAGS
No flags are set.
Definition: mutt_window.h:186
#define WN_TALLER
Window became taller.
Definition: mutt_window.h:187
#define WN_NARROWER
Window became narrower.
Definition: mutt_window.h:190
#define WN_SHORTER
Window became shorter.
Definition: mutt_window.h:188
@ NT_WINDOW
MuttWindow has changed, NotifyWindow, EventWindow.
Definition: notify_type.h:53
An Event that happened to a Window.
Definition: mutt_window.h:216
struct MuttWindow * win
Window that changed.
Definition: mutt_window.h:217
WindowNotifyFlags flags
Attributes of Window that changed.
Definition: mutt_window.h:218
struct WindowState state
Current state of the Window.
Definition: mutt_window.h:127
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:138
The current, or old, state of a Window.
Definition: mutt_window.h:58
short cols
Number of columns, can be MUTT_WIN_SIZE_UNLIMITED.
Definition: mutt_window.h:60
short row_offset
Absolute on-screen row.
Definition: mutt_window.h:63
short col_offset
Absolute on-screen column.
Definition: mutt_window.h:62
short rows
Number of rows, can be MUTT_WIN_SIZE_UNLIMITED.
Definition: mutt_window.h:61
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ window_notify_all()

void window_notify_all ( struct MuttWindow win)

Notify observers of changes to a Window and its children.

Parameters
winWindow

Definition at line 143 of file mutt_window.c.

144 {
145  if (!win)
146  win = RootWindow;
147 
148  window_notify(win);
149 
150  struct MuttWindow *np = NULL;
151  TAILQ_FOREACH(np, &win->children, entries)
152  {
153  window_notify_all(np);
154  }
155  win->old = win->state;
156 }
void window_notify_all(struct MuttWindow *win)
Notify observers of changes to a Window and its children.
Definition: mutt_window.c:143
static void window_notify(struct MuttWindow *win)
Notify observers of changes to a Window.
Definition: mutt_window.c:104
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:725
struct MuttWindow * RootWindow
Parent of all Windows.
Definition: rootwin.c:103
struct MuttWindowList children
Children Windows.
Definition: mutt_window.h:136
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ window_set_visible()

void window_set_visible ( struct MuttWindow win,
bool  visible 
)

Set a Window visible or hidden.

Parameters
winWindow
visibleIf true, make Window visible, otherwise hidden

Definition at line 163 of file mutt_window.c.

164 {
165  if (!win)
166  win = RootWindow;
167 
168  win->state.visible = visible;
169 }
+ Here is the caller graph for this function:

◆ mutt_window_new()

struct MuttWindow* mutt_window_new ( enum WindowType  type,
enum MuttWindowOrientation  orient,
enum MuttWindowSize  size,
int  cols,
int  rows 
)

Create a new Window.

Parameters
typeWindow type, e.g. WT_ROOT
orientWindow orientation, e.g. MUTT_WIN_ORIENT_VERTICAL
sizeWindow size, e.g. MUTT_WIN_SIZE_MAXIMISE
colsInitial number of columns to allocate, can be MUTT_WIN_SIZE_UNLIMITED
rowsInitial number of rows to allocate, can be MUTT_WIN_SIZE_UNLIMITED
Return values
ptrNew Window

Definition at line 180 of file mutt_window.c.

182 {
183  struct MuttWindow *win = mutt_mem_calloc(1, sizeof(struct MuttWindow));
184 
185  win->type = type;
186  win->orient = orient;
187  win->size = size;
188  win->req_rows = rows;
189  win->req_cols = cols;
190  win->state.visible = true;
191  win->notify = notify_new();
192  TAILQ_INIT(&win->children);
193  return win;
194 }
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
struct Notify * notify_new(void)
Create a new notifications handler.
Definition: notify.c:60
#define TAILQ_INIT(head)
Definition: queue.h:765
short req_cols
Number of columns required.
Definition: mutt_window.h:124
enum MuttWindowOrientation orient
Which direction the Window will expand.
Definition: mutt_window.h:130
short req_rows
Number of rows required.
Definition: mutt_window.h:125
enum MuttWindowSize size
Type of Window, e.g. MUTT_WIN_SIZE_FIXED.
Definition: mutt_window.h:131
enum WindowType type
Window type, e.g. WT_SIDEBAR.
Definition: mutt_window.h:144
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_free()

void mutt_window_free ( struct MuttWindow **  ptr)

Free a Window and its children.

Parameters
ptrWindow to free

Definition at line 200 of file mutt_window.c.

201 {
202  if (!ptr || !*ptr)
203  return;
204 
205  struct MuttWindow *win = *ptr;
206 
207  if (win->parent && (win->parent->focus == win))
208  win->parent->focus = NULL;
209 
210  mutt_debug(LL_NOTIFY, "NT_WINDOW_DELETE: %s, %p\n", mutt_window_win_name(win), win);
211  struct EventWindow ev_w = { win, WN_NO_FLAGS };
213 
215 
216  if (win->wdata_free && win->wdata)
217  win->wdata_free(win, &win->wdata); // Custom function to free private data
218 
220 
221  FREE(ptr);
222 }
#define FREE(x)
Definition: memory.h:40
void notify_free(struct Notify **ptr)
Free a notification handler.
Definition: notify.c:73
void mutt_winlist_free(struct MuttWindowList *head)
Free a tree of Windows.
Definition: mutt_window.c:477
@ NT_WINDOW_DELETE
Window is about to be deleted.
Definition: mutt_window.h:206
struct MuttWindow * focus
Focused Window.
Definition: mutt_window.h:140
void * wdata
Private data.
Definition: mutt_window.h:145
void(* wdata_free)(struct MuttWindow *win, void **ptr)
Definition: mutt_window.h:160
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_clearline()

void mutt_window_clearline ( struct MuttWindow win,
int  row 
)

Clear a row of a Window.

Parameters
winWindow
rowRow to clear

Definition at line 229 of file mutt_window.c.

230 {
231  mutt_window_move(win, 0, row);
233 }
int mutt_window_move(struct MuttWindow *win, int col, int row)
Move the cursor in a Window.
Definition: mutt_window.c:292
void mutt_window_clrtoeol(struct MuttWindow *win)
Clear to the end of the line.
Definition: mutt_window.c:241
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_clrtoeol()

void mutt_window_clrtoeol ( struct MuttWindow win)

Clear to the end of the line.

Parameters
winWindow
Note
Assumes the cursor has already been positioned within the window.

Definition at line 241 of file mutt_window.c.

242 {
243  if (!win || !stdscr)
244  return;
245 
246  if ((win->state.col_offset + win->state.cols) == COLS)
247  clrtoeol();
248  else
249  {
250  int row = 0;
251  int col = 0;
252  getyx(stdscr, row, col);
253  int curcol = col;
254  while (curcol < (win->state.col_offset + win->state.cols))
255  {
256  addch(' ');
257  curcol++;
258  }
259  move(row, col);
260  }
261 }
+ Here is the caller graph for this function:

◆ mutt_window_get_coords()

void mutt_window_get_coords ( struct MuttWindow win,
int *  col,
int *  row 
)

Get the cursor position in the Window.

Parameters
[in]winWindow
[out]colColumn in Window
[out]rowRow in Window

Assumes the current position is inside the window. Otherwise it will happily return negative or values outside the window boundaries

Definition at line 272 of file mutt_window.c.

273 {
274  int x = 0;
275  int y = 0;
276 
277  getyx(stdscr, y, x);
278  if (col)
279  *col = x - win->state.col_offset;
280  if (row)
281  *row = y - win->state.row_offset;
282 }
+ Here is the caller graph for this function:

◆ mutt_window_move()

int mutt_window_move ( struct MuttWindow win,
int  col,
int  row 
)

Move the cursor in a Window.

Parameters
winWindow
colColumn to move to
rowRow to move to
Return values
OKSuccess
ERRError

Definition at line 292 of file mutt_window.c.

293 {
294  return move(win->state.row_offset + row, win->state.col_offset + col);
295 }
+ Here is the caller graph for this function:

◆ mutt_window_mvaddstr()

int mutt_window_mvaddstr ( struct MuttWindow win,
int  col,
int  row,
const char *  str 
)

Move the cursor and write a fixed string to a Window.

Parameters
winWindow to write to
colColumn to move to
rowRow to move to
strString to write
Return values
OKSuccess
ERRError

Definition at line 306 of file mutt_window.c.

307 {
308  return mvaddstr(win->state.row_offset + row, win->state.col_offset + col, str);
309 }
+ Here is the caller graph for this function:

◆ mutt_window_mvprintw()

int mutt_window_mvprintw ( struct MuttWindow win,
int  col,
int  row,
const char *  fmt,
  ... 
)

Move the cursor and write a formatted string to a Window.

Parameters
winWindow to write to
colColumn to move to
rowRow to move to
fmtprintf format string
...printf arguments
Return values
numSuccess, characters written
ERRError, move failed

Definition at line 321 of file mutt_window.c.

322 {
323  int rc = mutt_window_move(win, col, row);
324  if (rc == ERR)
325  return rc;
326 
327  va_list ap;
328  va_start(ap, fmt);
329  rc = vw_printw(stdscr, fmt, ap);
330  va_end(ap);
331 
332  return rc;
333 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_reflow()

void mutt_window_reflow ( struct MuttWindow win)

Resize a Window and its children.

Parameters
winWindow to resize

Definition at line 339 of file mutt_window.c.

340 {
341  if (OptNoCurses)
342  return;
343 
344  if (!win)
345  win = RootWindow;
346 
347  mutt_debug(LL_DEBUG2, "entering\n");
348  window_reflow(win);
349  window_notify_all(win);
350 
351 #ifdef USE_DEBUG_WINDOW
352  debug_win_dump();
353 #endif
354 }
void debug_win_dump(void)
Definition: window.c:91
@ LL_DEBUG2
Log at debug level 2.
Definition: logging.h:41
bool OptNoCurses
(pseudo) when sending in batch mode
Definition: options.h:53
void window_reflow(struct MuttWindow *win)
Reflow Windows.
Definition: reflow.c:222
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_wrap_cols()

int mutt_window_wrap_cols ( int  width,
short  wrap 
)

Calculate the wrap column for a given screen width.

Parameters
widthScreen width
wrapWrap config
Return values
numColumn that text should be wrapped at

The wrap variable can be negative, meaning there should be a right margin.

Definition at line 364 of file mutt_window.c.

365 {
366  if (wrap < 0)
367  return (width > -wrap) ? (width + wrap) : width;
368  if (wrap)
369  return (wrap < width) ? wrap : width;
370  return width;
371 }
+ Here is the caller graph for this function:

◆ mutt_window_addch()

int mutt_window_addch ( struct MuttWindow win,
int  ch 
)

Write one character to a Window.

Parameters
winWindow
chCharacter to write
Return values
0Success
-1Error

Definition at line 380 of file mutt_window.c.

381 {
382  return addch(ch);
383 }
+ Here is the caller graph for this function:

◆ mutt_window_addnstr()

int mutt_window_addnstr ( struct MuttWindow win,
const char *  str,
int  num 
)

Write a partial string to a Window.

Parameters
winWindow
strString
numMaximum number of characters to write
Return values
0Success
-1Error

Definition at line 393 of file mutt_window.c.

394 {
395  if (!str)
396  return -1;
397 
398  return addnstr(str, num);
399 }
+ Here is the caller graph for this function:

◆ mutt_window_addstr()

int mutt_window_addstr ( struct MuttWindow win,
const char *  str 
)

Write a string to a Window.

Parameters
winWindow
strString
Return values
0Success
-1Error

Definition at line 408 of file mutt_window.c.

409 {
410  if (!str)
411  return -1;
412 
413  return addstr(str);
414 }
+ Here is the caller graph for this function:

◆ mutt_window_printf()

int mutt_window_printf ( struct MuttWindow win,
const char *  fmt,
  ... 
)

Write a formatted string to a Window.

Parameters
winWindow
fmtFormat string
...Arguments
Return values
numNumber of characters written

Definition at line 423 of file mutt_window.c.

424 {
425  va_list ap;
426  va_start(ap, fmt);
427  int rc = vw_printw(stdscr, fmt, ap);
428  va_end(ap);
429 
430  return rc;
431 }
+ Here is the caller graph for this function:

◆ mutt_window_add_child()

void mutt_window_add_child ( struct MuttWindow parent,
struct MuttWindow child 
)

Add a child to Window.

Parameters
parentWindow to add to
childWindow to add

Definition at line 438 of file mutt_window.c.

439 {
440  if (!parent || !child)
441  return;
442 
443  TAILQ_INSERT_TAIL(&parent->children, child, entries);
444  child->parent = parent;
445 
446  notify_set_parent(child->notify, parent->notify);
447 
448  mutt_debug(LL_NOTIFY, "NT_WINDOW_NEW: %s, %p\n", mutt_window_win_name(child), child);
449  struct EventWindow ev_w = { child, WN_NO_FLAGS };
450  notify_send(child->notify, NT_WINDOW, NT_WINDOW_ADD, &ev_w);
451 }
void notify_set_parent(struct Notify *notify, struct Notify *parent)
Set the parent notification handler.
Definition: notify.c:93
@ NT_WINDOW_ADD
New Window has been added.
Definition: mutt_window.h:205
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:809
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_remove_child()

struct MuttWindow* mutt_window_remove_child ( struct MuttWindow parent,
struct MuttWindow child 
)

Remove a child from a Window.

Parameters
parentWindow to remove from
childWindow to remove
Return values
ptrChild Window

Definition at line 459 of file mutt_window.c.

460 {
461  if (!parent || !child)
462  return NULL;
463 
464  // A notification will be sent when the Window is freed
465  TAILQ_REMOVE(&parent->children, child, entries);
466  child->parent = NULL;
467 
468  notify_set_parent(child->notify, NULL);
469 
470  return child;
471 }
#define TAILQ_REMOVE(head, elm, field)
Definition: queue.h:841
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_winlist_free()

void mutt_winlist_free ( struct MuttWindowList *  head)

Free a tree of Windows.

Parameters
headWindowList to free

Definition at line 477 of file mutt_window.c.

478 {
479  if (!head)
480  return;
481 
482  struct MuttWindow *np = NULL;
483  struct MuttWindow *tmp = NULL;
484  TAILQ_FOREACH_SAFE(np, head, entries, tmp)
485  {
486  TAILQ_REMOVE(head, np, entries);
488  mutt_window_free(&np);
489  }
490 }
void mutt_window_free(struct MuttWindow **ptr)
Free a Window and its children.
Definition: mutt_window.c:200
#define TAILQ_FOREACH_SAFE(var, head, field, tvar)
Definition: queue.h:735
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_is_visible()

bool mutt_window_is_visible ( struct MuttWindow win)

Is the Window visible?

Parameters
winWindow
Return values
trueThe Window is visible

For a Window to be visible, it must be visible and its parent and grandparent, etc.

Definition at line 500 of file mutt_window.c.

501 {
502  if (!win)
503  return false;
504 
505  for (; win; win = win->parent)
506  {
507  if (!win->state.visible)
508  return false;
509  }
510 
511  return true;
512 }
+ Here is the caller graph for this function:

◆ window_find_child()

struct MuttWindow* window_find_child ( struct MuttWindow win,
enum WindowType  type 
)

Recursively find a child Window of a given type.

Parameters
winWindow to start searching
typeWindow type to find, e.g. WT_STATUS_BAR
Return values
ptrMatching Window
NULLNo match

Definition at line 521 of file mutt_window.c.

522 {
523  if (!win)
524  return NULL;
525  if (win->type == type)
526  return win;
527 
528  struct MuttWindow *np = NULL;
529  struct MuttWindow *match = NULL;
530  TAILQ_FOREACH(np, &win->children, entries)
531  {
532  match = window_find_child(np, type);
533  if (match)
534  return match;
535  }
536 
537  return NULL;
538 }
struct MuttWindow * window_find_child(struct MuttWindow *win, enum WindowType type)
Recursively find a child Window of a given type.
Definition: mutt_window.c:521
+ Here is the caller graph for this function:

◆ window_find_parent()

struct MuttWindow* window_find_parent ( struct MuttWindow win,
enum WindowType  type 
)

Find a (grand-)parent of a Window by type.

Parameters
winWindow
typeWindow type, e.g. WT_DLG_INDEX
Return values
ptrWindow

Definition at line 546 of file mutt_window.c.

547 {
548  for (; win; win = win->parent)
549  {
550  if (win->type == type)
551  return win;
552  }
553 
554  return NULL;
555 }
+ Here is the caller graph for this function:

◆ window_recalc()

static void window_recalc ( struct MuttWindow win)
static

Recalculate a tree of Windows.

Parameters
winWindow to start at

Definition at line 561 of file mutt_window.c.

562 {
563  if (!win || !win->state.visible)
564  return;
565 
566  if (win->recalc && (win->actions & WA_RECALC))
567  win->recalc(win);
568  win->actions &= ~WA_RECALC;
569 
570  struct MuttWindow *np = NULL;
571  TAILQ_FOREACH(np, &win->children, entries)
572  {
573  window_recalc(np);
574  }
575 }
static void window_recalc(struct MuttWindow *win)
Recalculate a tree of Windows.
Definition: mutt_window.c:561
#define WA_RECALC
Recalculate the contents of the Window.
Definition: mutt_window.h:110
int(* recalc)(struct MuttWindow *win)
Definition: mutt_window.h:171
WindowActionFlags actions
Actions to be performed, e.g. WA_RECALC.
Definition: mutt_window.h:132
+ Here is the caller graph for this function:

◆ window_repaint()

static void window_repaint ( struct MuttWindow win)
static

Repaint a tree of Windows.

Parameters
winWindow to start at

Definition at line 581 of file mutt_window.c.

582 {
583  if (!win || !win->state.visible)
584  return;
585 
586  if (win->repaint && (win->actions & WA_REPAINT))
587  win->repaint(win);
588  win->actions &= ~WA_REPAINT;
589 
590  struct MuttWindow *np = NULL;
591  TAILQ_FOREACH(np, &win->children, entries)
592  {
593  window_repaint(np);
594  }
595 }
static void window_repaint(struct MuttWindow *win)
Repaint a tree of Windows.
Definition: mutt_window.c:581
#define WA_REPAINT
Redraw the contents of the Window.
Definition: mutt_window.h:111
int(* repaint)(struct MuttWindow *win)
Definition: mutt_window.h:182
+ Here is the caller graph for this function:

◆ window_redraw()

void window_redraw ( struct MuttWindow win)

Reflow, recalc and repaint a tree of Windows.

Parameters
winWindow to start at
Note
If win is NULL, all windows will be redrawn

Definition at line 603 of file mutt_window.c.

604 {
605  if (!win)
606  win = RootWindow;
607 
608  window_reflow(win);
609  window_notify_all(win);
610 
611  window_recalc(win);
612  window_repaint(win);
613  mutt_refresh();
614 }
void mutt_refresh(void)
Force a refresh of the screen.
Definition: curs_lib.c:114
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ window_is_focused()

bool window_is_focused ( struct MuttWindow win)

Does the given Window have the focus?

Parameters
winWindow to check
Return values
trueWindow has focus

Definition at line 621 of file mutt_window.c.

622 {
623  if (!win)
624  return false;
625 
627 
628  return (win_focus == win);
629 }
static struct MuttWindow * win_focus
Definition: window.c:36
struct MuttWindow * window_get_focus(void)
Get the currently focused Window.
Definition: mutt_window.c:635
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ window_get_focus()

struct MuttWindow* window_get_focus ( void  )

Get the currently focused Window.

Return values
ptrWindow with focus

Definition at line 635 of file mutt_window.c.

636 {
637  struct MuttWindow *win = RootWindow;
638 
639  while (win && win->focus)
640  win = win->focus;
641 
642  return win;
643 }
+ Here is the caller graph for this function:

◆ window_set_focus()

struct MuttWindow* window_set_focus ( struct MuttWindow win)

Set the Window focus.

Parameters
winWindow to focus
Return values
ptrOld focused Window
NULLError, or focus not changed

Definition at line 651 of file mutt_window.c.

652 {
653  if (!win)
654  return NULL;
655 
656  struct MuttWindow *old_focus = window_get_focus();
657 
658  struct MuttWindow *parent = win->parent;
659  struct MuttWindow *child = win;
660 
661  // Set the chain of focus, all the way to the root
662  for (; parent; child = parent, parent = parent->parent)
663  parent->focus = child;
664 
665  // Find the most focused Window
666  while (win && win->focus)
667  win = win->focus;
668 
669  if (win == old_focus)
670  return NULL;
671 
672  mutt_debug(LL_NOTIFY, "NT_WINDOW_FOCUS: %s, %p\n", mutt_window_win_name(win), win);
673  struct EventWindow ev_w = { win, WN_NO_FLAGS };
675 #ifdef USE_DEBUG_WINDOW
676  debug_win_dump();
677 #endif
678  return old_focus;
679 }
@ NT_WINDOW_FOCUS
Window focus has changed.
Definition: mutt_window.h:209
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_clear()

void mutt_window_clear ( struct MuttWindow win)

Clear a Window.

Parameters
winWindow

If the Window isn't visible, it won't be cleared.

Definition at line 687 of file mutt_window.c.

688 {
689  if (!mutt_window_is_visible(win))
690  return;
691 
692  for (int i = 0; i < win->state.rows; i++)
693  mutt_window_clearline(win, i);
694 }
void mutt_window_clearline(struct MuttWindow *win, int row)
Clear a row of a Window.
Definition: mutt_window.c:229
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_win_name()

const char* mutt_window_win_name ( const struct MuttWindow win)

Get the name of a Window.

Parameters
winWindow
Return values
ptrString describing Window
NULLError, or unknown

Definition at line 702 of file mutt_window.c.

703 {
704  if (!win)
705  return "UNKNOWN";
706 
707  const char *name = mutt_map_get_name(win->type, WindowNames);
708  if (name)
709  return name;
710  return "UNKNOWN";
711 }
const char * mutt_map_get_name(int val, const struct Mapping *map)
Lookup a string for a constant.
Definition: mapping.c:42
static const struct Mapping WindowNames[]
Lookups for Window Names.
Definition: mutt_window.c:45
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ window_invalidate()

static void window_invalidate ( struct MuttWindow win)
static

Mark a window as in need of repaint.

Parameters
winWindow to start at

Definition at line 717 of file mutt_window.c.

718 {
719  if (!win)
720  return;
721 
722  win->actions |= WA_REPAINT;
723 
724  struct MuttWindow *np = NULL;
725  TAILQ_FOREACH(np, &win->children, entries)
726  {
727  window_invalidate(np);
728  }
729 }
static void window_invalidate(struct MuttWindow *win)
Mark a window as in need of repaint.
Definition: mutt_window.c:717
+ Here is the caller graph for this function:

◆ window_invalidate_all()

void window_invalidate_all ( void  )

Mark all windows as in need of repaint.

Definition at line 734 of file mutt_window.c.

735 {
737  clearok(stdscr, true);
738  keypad(stdscr, true);
739 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ window_status_on_top()

bool window_status_on_top ( struct MuttWindow panel,
struct ConfigSubset sub 
)

Organise windows according to config variable.

Parameters
panelWindow containing WT_MENU and WT_STATUS_BAR
subConfig Subset
Return values
trueWindow order was changed

Set the positions of two Windows based on a config variable $status_on_top.

Note
The children are expected to have types: WT_MENU, WT_STATUS_BAR

Definition at line 751 of file mutt_window.c.

752 {
753  const bool c_status_on_top = cs_subset_bool(sub, "status_on_top");
754 
755  struct MuttWindow *win_first = TAILQ_FIRST(&panel->children);
756 
757  if ((c_status_on_top && (win_first->type == WT_STATUS_BAR)) ||
758  (!c_status_on_top && (win_first->type != WT_STATUS_BAR)))
759  {
760  return false;
761  }
762 
763  TAILQ_REMOVE(&panel->children, win_first, entries);
764  TAILQ_INSERT_TAIL(&panel->children, win_first, entries);
765 
766  mutt_window_reflow(panel);
767  mutt_debug(LL_DEBUG5, "config done, request WA_REFLOW\n");
768  return true;
769 }
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:73
@ LL_DEBUG5
Log at debug level 5.
Definition: logging.h:44
void mutt_window_reflow(struct MuttWindow *win)
Resize a Window and its children.
Definition: mutt_window.c:339
@ WT_STATUS_BAR
Status Bar containing extra info about the Index/Pager/etc.
Definition: mutt_window.h:102
#define TAILQ_FIRST(head)
Definition: queue.h:723
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ WindowNames

const struct Mapping WindowNames[]
static

Lookups for Window Names.

Definition at line 1 of file mutt_window.c.