NeoMutt  2025-12-11-911-gd8d604
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
mutt_window.h File Reference

Window management. More...

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

Typedefs

typedef uint8_t WindowActionFlags
 
typedef uint8_t WindowNotifyFlags
 

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_ATTACH , 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_LIST , WT_DLG_PATTERN , WT_DLG_PGP ,
  WT_DLG_POSTPONE , 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  WindowActionFlag { WA_NONE = 0 , WA_REFLOW = 1U << 0 , WA_RECALC = 1U << 1 , WA_REPAINT = 1U << 2 }
 Flags for Actions waiting to be performed on a MuttWindow. More...
 
enum  WindowNotifyFlag {
  WN_NONE = 0 , WN_TALLER = 1U << 0 , WN_SHORTER = 1U << 1 , WN_WIDER = 1U << 2 ,
  WN_NARROWER = 1U << 3 , WN_MOVED = 1U << 4 , WN_VISIBLE = 1U << 5 , WN_HIDDEN = 1U << 6
}
 Flags for Changes to a MuttWindow. More...
 
enum  NotifyWindow {
  NT_WINDOW_ADD = 1 , NT_WINDOW_DELETE , NT_WINDOW_STATE , NT_WINDOW_DIALOG ,
  NT_WINDOW_FOCUS
}
 Window notification types. More...
 

Functions

 ARRAY_HEAD (MuttWindowArray, struct 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 *row, int *col)
 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 row, int col)
 Move the cursor in a Window.
 
int mutt_window_printf (struct MuttWindow *win, const char *format,...) __attribute__((__format__(__printf__
 
int bool mutt_window_is_visible (struct MuttWindow *win)
 Is the Window visible?
 
void mutt_winlist_free (struct MuttWindowArray *wa)
 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, const struct ConfigSubset *sub)
 Organise windows according to config variable.
 
bool mutt_window_swap (struct MuttWindow *parent, struct MuttWindow *win1, struct MuttWindow *win2)
 Swap the position of two windows.
 

Detailed Description

Window management.

Authors
  • Richard Russon
  • Dennis Schön

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.

Typedef Documentation

◆ WindowActionFlags

typedef uint8_t WindowActionFlags

Definition at line 117 of file mutt_window.h.

◆ WindowNotifyFlags

typedef uint8_t WindowNotifyFlags

Definition at line 227 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_ATTACH 

Attach Dialog, dlg_attach()

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_LIST 

List Dialog, dlg_list()

WT_DLG_PATTERN 

Pattern Dialog, dlg_pattern()

WT_DLG_PGP 

Pgp Dialog, dlg_pgp()

WT_DLG_POSTPONE 

Postpone Dialog, dlg_postpone()

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
93
94 // Common Windows
95 WT_CUSTOM,
97 WT_INDEX,
98 WT_MENU,
100 WT_PAGER,
101 WT_SIDEBAR,
103};
@ WT_DLG_LIST
List Dialog, dlg_list()
Definition mutt_window.h:87
@ WT_CUSTOM
Window with a custom drawing function.
Definition mutt_window.h:95
@ 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:99
@ WT_DLG_SMIME
Smime Dialog, dlg_smime()
Definition mutt_window.h:92
@ WT_DLG_QUERY
Query Dialog, dlg_query()
Definition mutt_window.h:91
@ WT_DLG_HISTORY
History Dialog, dlg_history()
Definition mutt_window.h:85
@ WT_DLG_PGP
Pgp Dialog, dlg_pgp()
Definition mutt_window.h:89
@ 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.
@ 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.
@ WT_HELP_BAR
Help Bar containing list of useful key bindings.
Definition mutt_window.h:96
@ WT_DLG_POSTPONE
Postpone Dialog, dlg_postpone()
Definition mutt_window.h:90
@ WT_INDEX
A panel containing the Index Window.
Definition mutt_window.h:97
@ WT_DLG_ATTACH
Attach Dialog, dlg_attach()
Definition mutt_window.h:78
@ WT_SIDEBAR
Side panel containing Accounts or groups of data.
@ 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:98
@ WT_DLG_PATTERN
Pattern Dialog, dlg_pattern()
Definition mutt_window.h:88

◆ WindowActionFlag

Flags for Actions waiting to be performed on a MuttWindow.

Enumerator
WA_NONE 

No flags are set.

WA_REFLOW 

Reflow the Window and its children.

WA_RECALC 

Recalculate the contents of the Window.

WA_REPAINT 

Redraw the contents of the Window.

Definition at line 110 of file mutt_window.h.

111{
112 WA_NONE = 0,
113 WA_REFLOW = 1U << 0,
114 WA_RECALC = 1U << 1,
115 WA_REPAINT = 1U << 2,
116};
@ WA_REPAINT
Redraw the contents of the Window.
@ WA_NONE
No flags are set.
@ WA_RECALC
Recalculate the contents of the Window.
@ WA_REFLOW
Reflow the Window and its children.

◆ WindowNotifyFlag

Flags for Changes to a MuttWindow.

Enumerator
WN_NONE 

No flags are set.

WN_TALLER 

Window became taller.

WN_SHORTER 

Window became shorter.

WN_WIDER 

Window became wider.

WN_NARROWER 

Window became narrower.

WN_MOVED 

Window moved.

WN_VISIBLE 

Window became visible.

WN_HIDDEN 

Window became hidden.

Definition at line 216 of file mutt_window.h.

217{
218 WN_NONE = 0,
219 WN_TALLER = 1U << 0,
220 WN_SHORTER = 1U << 1,
221 WN_WIDER = 1U << 2,
222 WN_NARROWER = 1U << 3,
223 WN_MOVED = 1U << 4,
224 WN_VISIBLE = 1U << 5,
225 WN_HIDDEN = 1U << 6,
226};
@ WN_WIDER
Window became wider.
@ WN_HIDDEN
Window became hidden.
@ WN_NARROWER
Window became narrower.
@ WN_VISIBLE
Window became visible.
@ WN_TALLER
Window became taller.
@ WN_MOVED
Window moved.
@ WN_SHORTER
Window became shorter.
@ WN_NONE
No flags are set.

◆ 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 237 of file mutt_window.h.

238{
239 NT_WINDOW_ADD = 1,
244};
@ NT_WINDOW_DIALOG
A new Dialog Window has been created, e.g. WT_DLG_INDEX.
@ NT_WINDOW_STATE
Window state has changed, e.g. WN_VISIBLE.
@ NT_WINDOW_DELETE
Window is about to be deleted.
@ NT_WINDOW_FOCUS
Window focus has changed.
@ NT_WINDOW_ADD
New Window has been added.

Function Documentation

◆ ARRAY_HEAD()

ARRAY_HEAD ( MuttWindowArray ,
struct 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 428 of file mutt_window.c.

429{
430 if (!parent || !child)
431 return;
432
433 ARRAY_ADD(&parent->children, child);
434 child->parent = parent;
435
436 notify_set_parent(child->notify, parent->notify);
437
438 mutt_debug(LL_NOTIFY, "NT_WINDOW_NEW: %s, %p\n", mutt_window_win_name(child),
439 (void *) child);
440 struct EventWindow ev_w = { child, WN_NONE };
441 notify_send(child->notify, NT_WINDOW, NT_WINDOW_ADD, &ev_w);
442}
#define ARRAY_ADD(head, elem)
Add an element at the end of the array.
Definition array.h:157
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
@ LL_NOTIFY
Log of notifications.
Definition logging2.h:50
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.
@ NT_WINDOW
MuttWindow has changed, NotifyWindow, EventWindow.
Definition notify_type.h:58
An Event that happened to a Window.
struct MuttWindowArray children
Children Windows.
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
struct MuttWindow * parent
Parent Window.
+ 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 217 of file mutt_window.c.

218{
219 if (!ptr || !*ptr)
220 return;
221
222 struct MuttWindow *win = *ptr;
223
224 if (win->parent && (win->parent->focus == win))
225 win->parent->focus = NULL;
226
227 mutt_debug(LL_NOTIFY, "NT_WINDOW_DELETE: %s, %p\n", mutt_window_win_name(win),
228 (void *) win);
229 struct EventWindow ev_w = { win, WN_NONE };
231
233
234 if (win->wdata_free && win->wdata)
235 win->wdata_free(win, &win->wdata); // Custom function to free private data
236
238
239 FREE(ptr);
240}
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
void notify_free(struct Notify **ptr)
Free a notification handler.
Definition notify.c:75
void mutt_winlist_free(struct MuttWindowArray *wa)
Free a tree of Windows.
struct MuttWindow * win
Window that changed.
struct MuttWindow * focus
Focused Window.
void * wdata
Private data.
void(* wdata_free)(struct MuttWindow *win, void **ptr)
+ 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 * row,
int * col )

Get the cursor position in the Window.

Parameters
[in]winWindow
[out]rowRow in Window
[out]colColumn 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 292 of file mutt_window.c.

293{
294 int x = 0;
295 int y = 0;
296
297 getyx(stdscr, y, x);
298 if (col)
299 *col = x - win->state.col_offset;
300 if (row)
301 *row = y - win->state.row_offset;
302}
struct WindowState state
Current state of the Window.
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 194 of file mutt_window.c.

196{
197 struct MuttWindow *win = MUTT_MEM_CALLOC(1, struct MuttWindow);
198
199 win->type = type;
200 win->orient = orient;
201 win->size = size;
202 win->req_rows = rows;
203 win->req_cols = cols;
204 win->state.visible = true;
205 win->notify = notify_new();
206 ARRAY_INIT(&win->children);
207
208 win->actions |= WA_RECALC | WA_REPAINT;
209
210 return win;
211}
#define ARRAY_INIT(head)
Initialize an array.
Definition array.h:65
#define MUTT_MEM_CALLOC(n, type)
Definition memory.h:52
struct Notify * notify_new(void)
Create a new notifications handler.
Definition notify.c:62
short req_cols
Number of columns required.
enum MuttWindowOrientation orient
Which direction the Window will expand.
short req_rows
Number of rows required.
WindowActionFlags actions
Actions to be performed, e.g. WA_RECALC.
enum MuttWindowSize size
Type of Window, e.g. MUTT_WIN_SIZE_FIXED.
enum WindowType type
Window type, e.g. WT_SIDEBAR.
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 321 of file mutt_window.c.

322{
323 if (!OptGui)
324 return;
325
326 if (!win)
327 {
329 win = mod_data ? mod_data->root_window : NULL;
330 }
331 if (!win)
332 return;
333
334 window_reflow(win);
336
337 // Allow Windows to resize themselves based on the first reflow
338 window_reflow(win);
340
341#ifdef USE_DEBUG_WINDOW
343#endif
344}
void debug_win_dump(void)
Dump all windows to debug output.
Definition window.c:116
bool OptGui
(pseudo) when the gui (and curses) are started
Definition globals.c:48
@ MODULE_ID_GUI
ModuleGui, Graphical code
Definition module_api.h:45
void window_notify_all(struct MuttWindow *win)
Notify observers of changes to a Window and its children.
void * neomutt_get_module_data(struct NeoMutt *n, enum ModuleId id)
Get the private data for a Module.
Definition neomutt.c:663
void window_reflow(struct MuttWindow *win)
Reflow Windows.
Definition reflow.c:234
Gui private Module data.
Definition module_data.h:32
struct MuttWindow * root_window
Parent of all Windows.
Definition module_data.h:41
Container for Accounts, Notifications.
Definition neomutt.h:41
+ 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 450 of file mutt_window.c.

451{
452 if (!parent || !child)
453 return NULL;
454
455 // A notification will be sent when the Window is freed
456 struct MuttWindow **wp = NULL;
458 {
459 if (*wp == child)
460 {
462 break;
463 }
464 }
465 child->parent = NULL;
466
467 if (parent->focus == child)
468 parent->focus = NULL;
469
470 notify_set_parent(child->notify, NULL);
471
472 return child;
473}
#define ARRAY_REMOVE(head, elem)
Remove an entry from the array, shifting down the subsequent entries.
Definition array.h:355
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition array.h:223
+ 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 354 of file mutt_window.c.

355{
356 if (wrap < 0)
357 return (width > -wrap) ? (width + wrap) : width;
358 if (wrap)
359 return (wrap < width) ? wrap : width;
360 return width;
361}
+ 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 370 of file mutt_window.c.

371{
372 return addch(ch);
373}
+ 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 383 of file mutt_window.c.

384{
385 if (!str)
386 return -1;
387
388 return addnstr(str, num);
389}
+ 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 398 of file mutt_window.c.

399{
400 if (!str)
401 return -1;
402
403 return addstr(str);
404}
+ 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 247 of file mutt_window.c.

248{
249 mutt_window_move(win, row, 0);
251}
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.
+ 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 716 of file mutt_window.c.

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

260{
261 if (!win || !stdscr)
262 return;
263
264 if ((win->state.col_offset + win->state.cols) == COLS)
265 {
266 clrtoeol();
267 }
268 else
269 {
270 int row = 0;
271 int col = 0;
272 getyx(stdscr, row, col);
273 int curcol = col;
274 while (curcol < (win->state.col_offset + win->state.cols))
275 {
276 addch(' ');
277 curcol++;
278 }
279 move(row, col);
280 }
281}
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 row,
int col )

Move the cursor in a Window.

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

Definition at line 312 of file mutt_window.c.

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

◆ mutt_window_printf()

int mutt_window_printf ( struct MuttWindow * win,
const char * format,
... )
+ Here is the call graph for this function:

◆ mutt_window_is_visible()

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

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

◆ mutt_winlist_free()

void mutt_winlist_free ( struct MuttWindowArray * wa)

Free a tree of Windows.

Parameters
waWindowArray to free

Definition at line 479 of file mutt_window.c.

480{
481 if (!wa)
482 return;
483
484 struct MuttWindow **wp = NULL;
485 ARRAY_FOREACH(wp, wa)
486 {
487 struct MuttWindow *win = *wp;
489 mutt_window_free(&win);
490 }
491 ARRAY_FREE(wa);
492}
#define ARRAY_FREE(head)
Release all memory.
Definition array.h:209
void mutt_window_free(struct MuttWindow **ptr)
Free a Window and its children.
+ 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 523 of file mutt_window.c.

524{
525 if (!win)
526 return NULL;
527 if (win->type == type)
528 return win;
529
530 struct MuttWindow **wp = NULL;
531 struct MuttWindow *match = NULL;
532 ARRAY_FOREACH(wp, &win->children)
533 {
534 match = window_find_child(*wp, type);
535 if (match)
536 return match;
537 }
538
539 return NULL;
540}
struct MuttWindow * window_find_child(struct MuttWindow *win, enum WindowType type)
Recursively find a child Window of a given type.
+ 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 548 of file mutt_window.c.

549{
550 for (; win; win = win->parent)
551 {
552 if (win->type == type)
553 return win;
554 }
555
556 return NULL;
557}
+ 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 147 of file mutt_window.c.

148{
149 if (!win)
150 {
152 win = mod_data ? mod_data->root_window : NULL;
153 }
154 if (!win)
155 return;
156
157 window_notify(win);
158
159 struct MuttWindow **wp = NULL;
160 ARRAY_FOREACH(wp, &win->children)
161 {
163 }
164 win->old = win->state;
165}
static void window_notify(struct MuttWindow *win)
Notify observers of changes to a Window.
struct WindowState old
Previous state of the Window.
+ 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 172 of file mutt_window.c.

173{
174 if (!win)
175 {
177 win = mod_data ? mod_data->root_window : NULL;
178 }
179 if (!win)
180 return;
181
182 win->state.visible = visible;
183}
+ Here is the call graph for this function:
+ 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 680 of file mutt_window.c.

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

664{
666 struct MuttWindow *win = mod_data ? mod_data->root_window : NULL;
667
668 while (win && win->focus)
669 win = win->focus;
670
671 return win;
672}
+ Here is the call graph for this function:
+ 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 649 of file mutt_window.c.

650{
651 if (!win)
652 return false;
653
654 struct MuttWindow *win_focus = window_get_focus();
655
656 return (win_focus == win);
657}
+ 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 624 of file mutt_window.c.

625{
626 if (!win)
627 {
629 win = mod_data ? mod_data->root_window : NULL;
630 }
631 if (!win)
632 return;
633
634 window_reflow(win);
636
637 window_recalc(win);
638 window_repaint(win);
640
641 mutt_refresh();
642}
void mutt_refresh(void)
Force a refresh of the screen.
Definition curs_lib.c:79
static void window_recursor(void)
Recursor the focused Window.
static void window_recalc(struct MuttWindow *win)
Recalculate a tree of Windows.
static void window_repaint(struct MuttWindow *win)
Repaint a tree of Windows.
+ 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 763 of file mutt_window.c.

764{
766 window_invalidate(mod_data ? mod_data->root_window : NULL);
767 clearok(stdscr, true);
768 keypad(stdscr, true);
769}
static void window_invalidate(struct MuttWindow *win)
Mark a window as in need of repaint.
+ 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 731 of file mutt_window.c.

732{
733 if (!win)
734 return "UNKNOWN";
735
736 const char *name = mutt_map_get_name(win->type, WindowNames);
737 if (name)
738 return name;
739 return "UNKNOWN";
740}
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:47
+ 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,
const 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 781 of file mutt_window.c.

782{
783 const bool c_status_on_top = cs_subset_bool(sub, "status_on_top");
784
785 struct MuttWindow **wp_first = ARRAY_FIRST(&panel->children);
786 if (!wp_first)
787 return false;
788
789 struct MuttWindow *win = *wp_first;
790
791 if ((c_status_on_top && (win->type == WT_STATUS_BAR)) ||
792 (!c_status_on_top && (win->type != WT_STATUS_BAR)))
793 {
794 return false;
795 }
796
797 if (c_status_on_top)
798 {
799 // Move last window to front
800 struct MuttWindow **wp_last = ARRAY_LAST(&panel->children);
801 if (wp_last)
802 {
803 win = *wp_last;
804 ARRAY_REMOVE(&panel->children, wp_last);
805 ARRAY_INSERT(&panel->children, 0, win);
806 }
807 }
808 else
809 {
810 // Move first window to end
811 ARRAY_REMOVE(&panel->children, wp_first);
812 ARRAY_ADD(&panel->children, win);
813 }
814
815 mutt_window_reflow(panel);
817 return true;
818}
#define ARRAY_FIRST(head)
Convenience method to get the first element.
Definition array.h:136
#define ARRAY_INSERT(head, idx, elem)
Insert an element into the, shifting up the subsequent entries.
Definition array.h:338
#define ARRAY_LAST(head)
Convenience method to get the last element.
Definition array.h:145
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.
void window_invalidate_all(void)
Mark all windows as in need of repaint.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_window_swap()

bool mutt_window_swap ( struct MuttWindow * parent,
struct MuttWindow * win1,
struct MuttWindow * win2 )

Swap the position of two windows.

Parameters
parentParent Window
win1Window
win2Window
Return values
trueWindows were switched

Definition at line 827 of file mutt_window.c.

829{
830 if (!parent || !win1 || !win2)
831 return false;
832
833 // ensure both windows are children of the parent
834 if (win1->parent != parent || win2->parent != parent)
835 return false;
836
837 // Find indices of both windows
838 int idx1 = -1;
839 int idx2 = -1;
840 struct MuttWindow **wp = NULL;
841 int idx = 0;
843 {
844 if (*wp == win1)
845 idx1 = idx;
846 if (*wp == win2)
847 idx2 = idx;
848 if ((idx1 != -1) && (idx2 != -1))
849 break; // Early exit when both windows found
850 idx++;
851 }
852
853 if (idx1 == -1 || idx2 == -1)
854 return false;
855
856 // Swap the pointers in the array
857 struct MuttWindow **ptr1 = ARRAY_GET(&parent->children, idx1);
858 struct MuttWindow **ptr2 = ARRAY_GET(&parent->children, idx2);
859 if (ptr1 && ptr2)
860 {
861 struct MuttWindow *tmp = *ptr1;
862 *ptr1 = *ptr2;
863 *ptr2 = tmp;
864 }
865
866 return true;
867}
#define ARRAY_GET(head, idx)
Return the element at index.
Definition array.h:109
+ Here is the caller graph for this function: