NeoMutt  2024-04-25-91-gb0e085
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
mutt_window.h File Reference

Window management. More...

#include "config.h"
#include <stdbool.h>
#include <stdint.h>
#include "mutt/lib.h"
+ Include dependency graph for mutt_window.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  WindowState
 The current, or old, state of a Window. More...
 
struct  MuttWindow
 
struct  EventWindow
 An Event that happened to a Window. More...
 

Macros

#define MUTT_WIN_SIZE_UNLIMITED   -1
 Use as much space as possible.
 
#define WA_NO_FLAGS   0
 No flags are set.
 
#define WA_REFLOW   (1 << 0)
 Reflow the Window and its children.
 
#define WA_RECALC   (1 << 1)
 Recalculate the contents of the Window.
 
#define WA_REPAINT   (1 << 2)
 Redraw the contents of the Window.
 
#define WN_NO_FLAGS   0
 No flags are set.
 
#define WN_TALLER   (1 << 0)
 Window became taller.
 
#define WN_SHORTER   (1 << 1)
 Window became shorter.
 
#define WN_WIDER   (1 << 2)
 Window became wider.
 
#define WN_NARROWER   (1 << 3)
 Window became narrower.
 
#define WN_MOVED   (1 << 4)
 Window moved.
 
#define WN_VISIBLE   (1 << 5)
 Window became visible.
 
#define WN_HIDDEN   (1 << 6)
 Window became hidden.
 

Typedefs

typedef uint8_t WindowActionFlags
 Flags for Actions waiting to be performed on a MuttWindow, e.g. WA_REFLOW.
 
typedef uint8_t WindowNotifyFlags
 Flags for Changes to a MuttWindow, e.g. WN_TALLER.
 

Enumerations

enum  MuttWindowOrientation { MUTT_WIN_ORIENT_VERTICAL = 1 , MUTT_WIN_ORIENT_HORIZONTAL }
 Which way does the Window expand? More...
 
enum  MuttWindowSize { MUTT_WIN_SIZE_FIXED = 1 , MUTT_WIN_SIZE_MAXIMISE , MUTT_WIN_SIZE_MINIMISE }
 Control the allocation of Window space. More...
 
enum  WindowType {
  WT_ROOT , WT_CONTAINER , WT_ALL_DIALOGS , WT_DLG_ALIAS ,
  WT_DLG_ATTACHMENT , WT_DLG_AUTOCRYPT , WT_DLG_BROWSER , WT_DLG_CERTIFICATE ,
  WT_DLG_COMPOSE , WT_DLG_GPGME , WT_DLG_PAGER , WT_DLG_HISTORY ,
  WT_DLG_INDEX , WT_DLG_PATTERN , WT_DLG_PGP , WT_DLG_POSTPONED ,
  WT_DLG_QUERY , WT_DLG_SMIME , WT_CUSTOM , WT_HELP_BAR ,
  WT_INDEX , WT_MENU , WT_MESSAGE , WT_PAGER ,
  WT_SIDEBAR , WT_STATUS_BAR
}
 Type of Window. More...
 
enum  NotifyWindow {
  NT_WINDOW_ADD = 1 , NT_WINDOW_DELETE , NT_WINDOW_STATE , NT_WINDOW_DIALOG ,
  NT_WINDOW_FOCUS
}
 Window notification types. More...
 

Functions

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

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.h.

Macro Definition Documentation

◆ MUTT_WIN_SIZE_UNLIMITED

#define MUTT_WIN_SIZE_UNLIMITED   -1

Use as much space as possible.

Definition at line 52 of file mutt_window.h.

◆ WA_NO_FLAGS

#define WA_NO_FLAGS   0

No flags are set.

Definition at line 107 of file mutt_window.h.

◆ WA_REFLOW

#define WA_REFLOW   (1 << 0)

Reflow the Window and its children.

Definition at line 108 of file mutt_window.h.

◆ WA_RECALC

#define WA_RECALC   (1 << 1)

Recalculate the contents of the Window.

Definition at line 109 of file mutt_window.h.

◆ WA_REPAINT

#define WA_REPAINT   (1 << 2)

Redraw the contents of the Window.

Definition at line 110 of file mutt_window.h.

◆ WN_NO_FLAGS

#define WN_NO_FLAGS   0

No flags are set.

Definition at line 208 of file mutt_window.h.

◆ WN_TALLER

#define WN_TALLER   (1 << 0)

Window became taller.

Definition at line 209 of file mutt_window.h.

◆ WN_SHORTER

#define WN_SHORTER   (1 << 1)

Window became shorter.

Definition at line 210 of file mutt_window.h.

◆ WN_WIDER

#define WN_WIDER   (1 << 2)

Window became wider.

Definition at line 211 of file mutt_window.h.

◆ WN_NARROWER

#define WN_NARROWER   (1 << 3)

Window became narrower.

Definition at line 212 of file mutt_window.h.

◆ WN_MOVED

#define WN_MOVED   (1 << 4)

Window moved.

Definition at line 213 of file mutt_window.h.

◆ WN_VISIBLE

#define WN_VISIBLE   (1 << 5)

Window became visible.

Definition at line 214 of file mutt_window.h.

◆ WN_HIDDEN

#define WN_HIDDEN   (1 << 6)

Window became hidden.

Definition at line 215 of file mutt_window.h.

Typedef Documentation

◆ WindowActionFlags

typedef uint8_t WindowActionFlags

Flags for Actions waiting to be performed on a MuttWindow, e.g. WA_REFLOW.

Definition at line 106 of file mutt_window.h.

◆ WindowNotifyFlags

typedef uint8_t WindowNotifyFlags

Flags for Changes to a MuttWindow, e.g. WN_TALLER.

Definition at line 207 of file mutt_window.h.

Enumeration Type Documentation

◆ MuttWindowOrientation

Which way does the Window expand?

Enumerator
MUTT_WIN_ORIENT_VERTICAL 

Window uses all available vertical space.

MUTT_WIN_ORIENT_HORIZONTAL 

Window uses all available horizontal space.

Definition at line 36 of file mutt_window.h.

37{
40};
@ MUTT_WIN_ORIENT_VERTICAL
Window uses all available vertical space.
Definition: mutt_window.h:38
@ MUTT_WIN_ORIENT_HORIZONTAL
Window uses all available horizontal space.
Definition: mutt_window.h:39

◆ MuttWindowSize

Control the allocation of Window space.

Enumerator
MUTT_WIN_SIZE_FIXED 

Window has a fixed size.

MUTT_WIN_SIZE_MAXIMISE 

Window wants as much space as possible.

MUTT_WIN_SIZE_MINIMISE 

Window size depends on its children.

Definition at line 45 of file mutt_window.h.

46{
50};
@ MUTT_WIN_SIZE_FIXED
Window has a fixed size.
Definition: mutt_window.h:47
@ MUTT_WIN_SIZE_MINIMISE
Window size depends on its children.
Definition: mutt_window.h:49
@ MUTT_WIN_SIZE_MAXIMISE
Window wants as much space as possible.
Definition: mutt_window.h:48

◆ WindowType

enum WindowType

Type of Window.

Enumerator
WT_ROOT 

Parent of All Windows.

WT_CONTAINER 

Invisible shaping container Window.

WT_ALL_DIALOGS 

Container for All Dialogs (nested Windows)

WT_DLG_ALIAS 

Alias Dialog, dlg_alias()

WT_DLG_ATTACHMENT 

Attachment Dialog, dlg_attachment()

WT_DLG_AUTOCRYPT 

Autocrypt Dialog, dlg_autocrypt()

WT_DLG_BROWSER 

Browser Dialog, dlg_browser()

WT_DLG_CERTIFICATE 

Certificate Dialog, dlg_certificate()

WT_DLG_COMPOSE 

Compose Dialog, dlg_compose()

WT_DLG_GPGME 

GPGME Dialog, dlg_gpgme()

WT_DLG_PAGER 

Pager Dialog, dlg_pager()

WT_DLG_HISTORY 

History Dialog, dlg_history()

WT_DLG_INDEX 

Index Dialog, dlg_index()

WT_DLG_PATTERN 

Pattern Dialog, dlg_pattern()

WT_DLG_PGP 

Pgp Dialog, dlg_pgp()

WT_DLG_POSTPONED 

Postponed Dialog, dlg_postponed()

WT_DLG_QUERY 

Query Dialog, dlg_query()

WT_DLG_SMIME 

Smime Dialog, dlg_smime()

WT_CUSTOM 

Window with a custom drawing function.

WT_HELP_BAR 

Help Bar containing list of useful key bindings.

WT_INDEX 

A panel containing the Index Window.

WT_MENU 

An Window containing a Menu.

WT_MESSAGE 

Window for messages/errors.

WT_PAGER 

A panel containing the Pager Window.

WT_SIDEBAR 

Side panel containing Accounts or groups of data.

WT_STATUS_BAR 

Status Bar containing extra info about the Index/Pager/etc.

Definition at line 69 of file mutt_window.h.

70{
71 // Structural Windows
72 WT_ROOT,
75
76 // Dialogs (nested Windows) displayed to the user
92
93 // Common Windows
94 WT_CUSTOM,
96 WT_INDEX,
97 WT_MENU,
99 WT_PAGER,
100 WT_SIDEBAR,
102};
@ WT_CUSTOM
Window with a custom drawing function.
Definition: mutt_window.h:94
@ WT_ROOT
Parent of All Windows.
Definition: mutt_window.h:72
@ WT_DLG_ALIAS
Alias Dialog, dlg_alias()
Definition: mutt_window.h:77
@ WT_ALL_DIALOGS
Container for All Dialogs (nested Windows)
Definition: mutt_window.h:74
@ WT_DLG_BROWSER
Browser Dialog, dlg_browser()
Definition: mutt_window.h:80
@ WT_MESSAGE
Window for messages/errors.
Definition: mutt_window.h:98
@ WT_DLG_SMIME
Smime Dialog, dlg_smime()
Definition: mutt_window.h:91
@ WT_DLG_QUERY
Query Dialog, dlg_query()
Definition: mutt_window.h:90
@ WT_DLG_HISTORY
History Dialog, dlg_history()
Definition: mutt_window.h:85
@ WT_DLG_PGP
Pgp Dialog, dlg_pgp()
Definition: mutt_window.h:88
@ WT_CONTAINER
Invisible shaping container Window.
Definition: mutt_window.h:73
@ WT_DLG_CERTIFICATE
Certificate Dialog, dlg_certificate()
Definition: mutt_window.h:81
@ WT_DLG_COMPOSE
Compose Dialog, dlg_compose()
Definition: mutt_window.h:82
@ WT_DLG_INDEX
Index Dialog, dlg_index()
Definition: mutt_window.h:86
@ WT_PAGER
A panel containing the Pager Window.
Definition: mutt_window.h:99
@ WT_DLG_GPGME
GPGME Dialog, dlg_gpgme()
Definition: mutt_window.h:83
@ WT_STATUS_BAR
Status Bar containing extra info about the Index/Pager/etc.
Definition: mutt_window.h:101
@ WT_HELP_BAR
Help Bar containing list of useful key bindings.
Definition: mutt_window.h:95
@ WT_DLG_POSTPONED
Postponed Dialog, dlg_postponed()
Definition: mutt_window.h:89
@ WT_INDEX
A panel containing the Index Window.
Definition: mutt_window.h:96
@ WT_DLG_ATTACHMENT
Attachment Dialog, dlg_attachment()
Definition: mutt_window.h:78
@ WT_SIDEBAR
Side panel containing Accounts or groups of data.
Definition: mutt_window.h:100
@ WT_DLG_PAGER
Pager Dialog, dlg_pager()
Definition: mutt_window.h:84
@ WT_DLG_AUTOCRYPT
Autocrypt Dialog, dlg_autocrypt()
Definition: mutt_window.h:79
@ WT_MENU
An Window containing a Menu.
Definition: mutt_window.h:97
@ WT_DLG_PATTERN
Pattern Dialog, dlg_pattern()
Definition: mutt_window.h:87

◆ NotifyWindow

Window notification types.

Observers of NT_WINDOW will be passed an EventWindow.

Note
Delete notifications are sent before the object is deleted.
Other notifications are sent after the event.
Enumerator
NT_WINDOW_ADD 

New Window has been added.

NT_WINDOW_DELETE 

Window is about to be deleted.

NT_WINDOW_STATE 

Window state has changed, e.g. WN_VISIBLE.

NT_WINDOW_DIALOG 

A new Dialog Window has been created, e.g. WT_DLG_INDEX.

NT_WINDOW_FOCUS 

Window focus has changed.

Definition at line 225 of file mutt_window.h.

226{
227 NT_WINDOW_ADD = 1,
232};
@ NT_WINDOW_DIALOG
A new Dialog Window has been created, e.g. WT_DLG_INDEX.
Definition: mutt_window.h:230
@ NT_WINDOW_STATE
Window state has changed, e.g. WN_VISIBLE.
Definition: mutt_window.h:229
@ NT_WINDOW_DELETE
Window is about to be deleted.
Definition: mutt_window.h:228
@ NT_WINDOW_FOCUS
Window focus has changed.
Definition: mutt_window.h:231
@ NT_WINDOW_ADD
New Window has been added.
Definition: mutt_window.h:227

Function Documentation

◆ TAILQ_HEAD()

TAILQ_HEAD ( MuttWindowList  ,
MuttWindow   
)

◆ 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 445 of file mutt_window.c.

446{
447 if (!parent || !child)
448 return;
449
450 TAILQ_INSERT_TAIL(&parent->children, child, entries);
451 child->parent = parent;
452
453 notify_set_parent(child->notify, parent->notify);
454
455 mutt_debug(LL_NOTIFY, "NT_WINDOW_NEW: %s, %p\n", mutt_window_win_name(child),
456 (void *) child);
457 struct EventWindow ev_w = { child, WN_NO_FLAGS };
458 notify_send(child->notify, NT_WINDOW, NT_WINDOW_ADD, &ev_w);
459}
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
@ LL_NOTIFY
Log of notifications.
Definition: logging2.h:48
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition: notify.c:173
void notify_set_parent(struct Notify *notify, struct Notify *parent)
Set the parent notification handler.
Definition: notify.c:95
const char * mutt_window_win_name(const struct MuttWindow *win)
Get the name of a Window.
Definition: mutt_window.c:734
#define WN_NO_FLAGS
No flags are set.
Definition: mutt_window.h:208
@ NT_WINDOW
MuttWindow has changed, NotifyWindow, EventWindow.
Definition: notify_type.h:57
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:809
An Event that happened to a Window.
Definition: mutt_window.h:238
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:137
struct MuttWindowList children
Children Windows.
Definition: mutt_window.h:135
struct MuttWindow * parent
Parent Window.
Definition: mutt_window.h:134
+ 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 201 of file mutt_window.c.

202{
203 if (!ptr || !*ptr)
204 return;
205
206 struct MuttWindow *win = *ptr;
207
208 if (win->parent && (win->parent->focus == win))
209 win->parent->focus = NULL;
210
211 mutt_debug(LL_NOTIFY, "NT_WINDOW_DELETE: %s, %p\n", mutt_window_win_name(win),
212 (void *) win);
213 struct EventWindow ev_w = { win, WN_NO_FLAGS };
215
217
218 if (win->wdata_free && win->wdata)
219 win->wdata_free(win, &win->wdata); // Custom function to free private data
220
222
223 FREE(ptr);
224}
#define FREE(x)
Definition: memory.h:45
void notify_free(struct Notify **ptr)
Free a notification handler.
Definition: notify.c:75
void mutt_winlist_free(struct MuttWindowList *head)
Free a tree of Windows.
Definition: mutt_window.c:488
struct MuttWindow * win
Window that changed.
Definition: mutt_window.h:239
struct MuttWindow * focus
Focused Window.
Definition: mutt_window.h:139
void * wdata
Private data.
Definition: mutt_window.h:144
void(* wdata_free)(struct MuttWindow *win, void **ptr)
Definition: mutt_window.h:158
+ Here is the call graph for this function:
+ 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 276 of file mutt_window.c.

277{
278 int x = 0;
279 int y = 0;
280
281 getyx(stdscr, y, x);
282 if (col)
283 *col = x - win->state.col_offset;
284 if (row)
285 *row = y - win->state.row_offset;
286}
struct WindowState state
Current state of the Window.
Definition: mutt_window.h:126
short row_offset
Absolute on-screen row.
Definition: mutt_window.h:63
short col_offset
Absolute on-screen column.
Definition: mutt_window.h:62
+ 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 181 of file mutt_window.c.

183{
184 struct MuttWindow *win = mutt_mem_calloc(1, sizeof(struct MuttWindow));
185
186 win->type = type;
187 win->orient = orient;
188 win->size = size;
189 win->req_rows = rows;
190 win->req_cols = cols;
191 win->state.visible = true;
192 win->notify = notify_new();
193 TAILQ_INIT(&win->children);
194 return win;
195}
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:51
struct Notify * notify_new(void)
Create a new notifications handler.
Definition: notify.c:62
#define TAILQ_INIT(head)
Definition: queue.h:765
short req_cols
Number of columns required.
Definition: mutt_window.h:123
enum MuttWindowOrientation orient
Which direction the Window will expand.
Definition: mutt_window.h:129
short req_rows
Number of rows required.
Definition: mutt_window.h:124
enum MuttWindowSize size
Type of Window, e.g. MUTT_WIN_SIZE_FIXED.
Definition: mutt_window.h:130
enum WindowType type
Window type, e.g. WT_SIDEBAR.
Definition: mutt_window.h:143
bool visible
Window is visible.
Definition: mutt_window.h:59
+ 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 343 of file mutt_window.c.

344{
345 if (OptNoCurses)
346 return;
347
348 if (!win)
349 win = RootWindow;
350
351 window_reflow(win);
353
354 // Allow Windows to resize themselves based on the first reflow
355 window_reflow(win);
357
358#ifdef USE_DEBUG_WINDOW
360#endif
361}
void debug_win_dump(void)
Definition: window.c:96
bool OptNoCurses
(pseudo) when sending in batch mode
Definition: globals.c:72
void window_notify_all(struct MuttWindow *win)
Notify observers of changes to a Window and its children.
Definition: mutt_window.c:144
void window_reflow(struct MuttWindow *win)
Reflow Windows.
Definition: reflow.c:220
struct MuttWindow * RootWindow
Parent of all Windows.
Definition: rootwin.c:106
+ 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 467 of file mutt_window.c.

468{
469 if (!parent || !child)
470 return NULL;
471
472 // A notification will be sent when the Window is freed
473 TAILQ_REMOVE(&parent->children, child, entries);
474 child->parent = NULL;
475
476 if (parent->focus == child)
477 parent->focus = NULL;
478
479 notify_set_parent(child->notify, NULL);
480
481 return child;
482}
#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_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 371 of file mutt_window.c.

372{
373 if (wrap < 0)
374 return (width > -wrap) ? (width + wrap) : width;
375 if (wrap)
376 return (wrap < width) ? wrap : width;
377 return width;
378}
+ 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 387 of file mutt_window.c.

388{
389 return addch(ch);
390}
+ 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 400 of file mutt_window.c.

401{
402 if (!str)
403 return -1;
404
405 return addnstr(str, num);
406}
+ 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 415 of file mutt_window.c.

416{
417 if (!str)
418 return -1;
419
420 return addstr(str);
421}
+ 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 231 of file mutt_window.c.

232{
233 mutt_window_move(win, 0, row);
235}
int mutt_window_move(struct MuttWindow *win, int col, int row)
Move the cursor in a Window.
Definition: mutt_window.c:296
void mutt_window_clrtoeol(struct MuttWindow *win)
Clear to the end of the line.
Definition: mutt_window.c:243
+ 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 719 of file mutt_window.c.

720{
721 if (!mutt_window_is_visible(win))
722 return;
723
724 for (int i = 0; i < win->state.rows; i++)
725 mutt_window_clearline(win, i);
726}
bool mutt_window_is_visible(struct MuttWindow *win)
Is the Window visible?
Definition: mutt_window.c:511
void mutt_window_clearline(struct MuttWindow *win, int row)
Clear a row of a Window.
Definition: mutt_window.c:231
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:

◆ 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 243 of file mutt_window.c.

244{
245 if (!win || !stdscr)
246 return;
247
248 if ((win->state.col_offset + win->state.cols) == COLS)
249 {
250 clrtoeol();
251 }
252 else
253 {
254 int row = 0;
255 int col = 0;
256 getyx(stdscr, row, col);
257 int curcol = col;
258 while (curcol < (win->state.col_offset + win->state.cols))
259 {
260 addch(' ');
261 curcol++;
262 }
263 move(row, col);
264 }
265}
short cols
Number of columns, can be MUTT_WIN_SIZE_UNLIMITED.
Definition: mutt_window.h:60
+ 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 296 of file mutt_window.c.

297{
298 return move(win->state.row_offset + row, win->state.col_offset + col);
299}
+ 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 310 of file mutt_window.c.

311{
312 return mvaddstr(win->state.row_offset + row, win->state.col_offset + col, str);
313}
+ 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,
  ... 
)

◆ mutt_window_printf()

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

◆ mutt_window_is_visible()

int int 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 511 of file mutt_window.c.

512{
513 if (!win)
514 return false;
515
516 for (; win; win = win->parent)
517 {
518 if (!win->state.visible)
519 return false;
520 }
521
522 return true;
523}
+ 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 488 of file mutt_window.c.

489{
490 if (!head)
491 return;
492
493 struct MuttWindow *np = NULL;
494 struct MuttWindow *tmp = NULL;
495 TAILQ_FOREACH_SAFE(np, head, entries, tmp)
496 {
497 TAILQ_REMOVE(head, np, entries);
499 mutt_window_free(&np);
500 }
501}
void mutt_window_free(struct MuttWindow **ptr)
Free a Window and its children.
Definition: mutt_window.c:201
#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:

◆ 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 532 of file mutt_window.c.

533{
534 if (!win)
535 return NULL;
536 if (win->type == type)
537 return win;
538
539 struct MuttWindow *np = NULL;
540 struct MuttWindow *match = NULL;
541 TAILQ_FOREACH(np, &win->children, entries)
542 {
543 match = window_find_child(np, type);
544 if (match)
545 return match;
546 }
547
548 return NULL;
549}
struct MuttWindow * window_find_child(struct MuttWindow *win, enum WindowType type)
Recursively find a child Window of a given type.
Definition: mutt_window.c:532
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:725
+ Here is the call graph for this function:
+ 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 557 of file mutt_window.c.

558{
559 for (; win; win = win->parent)
560 {
561 if (win->type == type)
562 return win;
563 }
564
565 return NULL;
566}
+ 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 144 of file mutt_window.c.

145{
146 if (!win)
147 win = RootWindow;
148
149 window_notify(win);
150
151 struct MuttWindow *np = NULL;
152 TAILQ_FOREACH(np, &win->children, entries)
153 {
155 }
156 win->old = win->state;
157}
static void window_notify(struct MuttWindow *win)
Notify observers of changes to a Window.
Definition: mutt_window.c:104
struct WindowState old
Previous state of the Window.
Definition: mutt_window.h:127
+ 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 164 of file mutt_window.c.

165{
166 if (!win)
167 win = RootWindow;
168
169 win->state.visible = visible;
170}
+ 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 683 of file mutt_window.c.

684{
685 if (!win)
686 return NULL;
687
688 struct MuttWindow *old_focus = window_get_focus();
689
690 struct MuttWindow *parent = win->parent;
691 struct MuttWindow *child = win;
692
693 // Set the chain of focus, all the way to the root
694 for (; parent; child = parent, parent = parent->parent)
695 parent->focus = child;
696
697 win->focus = NULL;
698
699 if (win == old_focus)
700 return NULL;
701
702 mutt_debug(LL_NOTIFY, "NT_WINDOW_FOCUS: %s, %p\n", mutt_window_win_name(win),
703 (void *) win);
704 struct EventWindow ev_w = { win, WN_NO_FLAGS };
706#ifdef USE_DEBUG_WINDOW
708#endif
709
710 return old_focus;
711}
struct MuttWindow * window_get_focus(void)
Get the currently focused Window.
Definition: mutt_window.c:667
+ 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 667 of file mutt_window.c.

668{
669 struct MuttWindow *win = RootWindow;
670
671 while (win && win->focus)
672 win = win->focus;
673
674 return win;
675}
+ Here is the caller graph for this function:

◆ window_is_focused()

bool window_is_focused ( const struct MuttWindow win)

Does the given Window have the focus?

Parameters
winWindow to check
Return values
trueWindow has focus

Definition at line 653 of file mutt_window.c.

654{
655 if (!win)
656 return false;
657
658 struct MuttWindow *win_focus = window_get_focus();
659
660 return (win_focus == win);
661}
+ Here is the call graph for this function:
+ 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 633 of file mutt_window.c.

634{
635 if (!win)
636 win = RootWindow;
637
638 window_reflow(win);
640
641 window_recalc(win);
642 window_repaint(win);
644
645 mutt_refresh();
646}
void mutt_refresh(void)
Force a refresh of the screen.
Definition: curs_lib.c:78
static void window_recursor(void)
Recursor the focussed Window.
Definition: mutt_window.c:614
static void window_recalc(struct MuttWindow *win)
Recalculate a tree of Windows.
Definition: mutt_window.c:572
static void window_repaint(struct MuttWindow *win)
Repaint a tree of Windows.
Definition: mutt_window.c:592
+ Here is the call graph for this function:
+ 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 766 of file mutt_window.c.

767{
769 clearok(stdscr, true);
770 keypad(stdscr, true);
771}
static void window_invalidate(struct MuttWindow *win)
Mark a window as in need of repaint.
Definition: mutt_window.c:749
+ 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 734 of file mutt_window.c.

735{
736 if (!win)
737 return "UNKNOWN";
738
739 const char *name = mutt_map_get_name(win->type, WindowNames);
740 if (name)
741 return name;
742 return "UNKNOWN";
743}
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_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 783 of file mutt_window.c.

784{
785 const bool c_status_on_top = cs_subset_bool(sub, "status_on_top");
786
787 struct MuttWindow *win = TAILQ_FIRST(&panel->children);
788
789 if ((c_status_on_top && (win->type == WT_STATUS_BAR)) ||
790 (!c_status_on_top && (win->type != WT_STATUS_BAR)))
791 {
792 return false;
793 }
794
795 if (c_status_on_top)
796 {
797 win = TAILQ_LAST(&panel->children, MuttWindowList);
798 TAILQ_REMOVE(&panel->children, win, entries);
799 TAILQ_INSERT_HEAD(&panel->children, win, entries);
800 }
801 else
802 {
803 TAILQ_REMOVE(&panel->children, win, entries);
804 TAILQ_INSERT_TAIL(&panel->children, win, entries);
805 }
806
807 mutt_window_reflow(panel);
809 return true;
810}
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:47
void mutt_window_reflow(struct MuttWindow *win)
Resize a Window and its children.
Definition: mutt_window.c:343
void window_invalidate_all(void)
Mark all windows as in need of repaint.
Definition: mutt_window.c:766
#define TAILQ_FIRST(head)
Definition: queue.h:723
#define TAILQ_LAST(head, headname)
Definition: queue.h:819
#define TAILQ_INSERT_HEAD(head, elm, field)
Definition: queue.h:796
+ Here is the call graph for this function:
+ Here is the caller graph for this function: