NeoMutt  2022-04-29-145-g9b6a0e
Teaching an old dog new tricks
DOXYGEN
menu.c
Go to the documentation of this file.
1 
30 #include "config.h"
31 #include <stdio.h>
32 #include "private.h"
33 #include "mutt/lib.h"
34 #include "gui/lib.h"
35 #include "color/lib.h"
36 #include "menu/lib.h"
37 #include "type.h"
38 
39 struct ConfigSubset;
40 
42 
46 static struct AttrColor *default_color(struct Menu *menu, int line)
47 {
49 }
50 
54 static int generic_search(struct Menu *menu, regex_t *rx, int line)
55 {
56  char buf[1024];
57 
58  menu->make_entry(menu, buf, sizeof(buf), line);
59  return regexec(rx, buf, 0, NULL, 0);
60 }
61 
65 void menu_cleanup(void)
66 {
67  for (int i = 0; i < MENU_MAX; i++)
68  FREE(&SearchBuffers[i]);
69 }
70 
74 void menu_init(void)
75 {
76  for (int i = 0; i < MENU_MAX; i++)
77  SearchBuffers[i] = NULL;
78 }
79 
85 {
86  struct MuttWindow *win = alldialogs_get_current();
87  while (win && win->focus)
88  win = win->focus;
89 
90  // This should only happen before the first window is created
91  if (!win)
92  return MENU_INDEX;
93 
94  if ((win->type == WT_CUSTOM) && (win->parent->type == WT_PAGER))
95  return MENU_PAGER;
96 
97  if (win->type != WT_MENU)
98  return MENU_GENERIC;
99 
100  struct Menu *menu = win->wdata;
101  if (!menu)
102  return MENU_GENERIC;
103 
104  return menu->type;
105 }
106 
111 void menu_free(struct Menu **ptr)
112 {
113  struct Menu *menu = *ptr;
114 
115  notify_free(&menu->notify);
116 
117  if (menu->mdata_free && menu->mdata)
118  menu->mdata_free(menu, &menu->mdata); // Custom function to free private data
119 
120  FREE(ptr);
121 }
122 
130 struct Menu *menu_new(enum MenuType type, struct MuttWindow *win, struct ConfigSubset *sub)
131 {
132  struct Menu *menu = mutt_mem_calloc(1, sizeof(struct Menu));
133 
134  menu->type = type;
135  menu->redraw = MENU_REDRAW_FULL;
136  menu->color = default_color;
137  menu->search = generic_search;
138  menu->notify = notify_new();
139  menu->win = win;
140  menu->page_len = win->state.rows;
141  menu->sub = sub;
142 
144  menu_add_observers(menu);
145 
146  return menu;
147 }
148 
154 int menu_get_index(struct Menu *menu)
155 {
156  if (!menu)
157  return -1;
158 
159  return menu->current;
160 }
161 
168 MenuRedrawFlags menu_set_index(struct Menu *menu, int index)
169 {
170  return menu_move_selection(menu, index);
171 }
172 
179 {
180  if (!menu)
181  return;
182 
183  menu->redraw |= redraw;
184  menu->win->actions |= WA_RECALC;
185 }
Color and attribute parsing.
struct AttrColor * simple_color_get(enum ColorId cid)
Get the colour of an object by its ID.
Definition: simple.c:74
@ MT_COLOR_NORMAL
Plain text.
Definition: color.h:53
struct MuttWindow * alldialogs_get_current(void)
Get the currently active Dialog.
Definition: dialog.c:222
static struct AttrColor * default_color(struct Menu *menu, int line)
Get the default colour for a line of the menu - Implements Menu::color() -.
Definition: menu.c:46
static int generic_search(struct Menu *menu, regex_t *rx, int line)
Search a menu for a item matching a regex - Implements Menu::search() -.
Definition: menu.c:54
Convenience wrapper for the gui headers.
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
#define FREE(x)
Definition: memory.h:43
GUI present the user with a selectable list.
#define MENU_REDRAW_FULL
Redraw everything.
Definition: lib.h:59
uint8_t MenuRedrawFlags
Flags, e.g. MENU_REDRAW_INDEX.
Definition: lib.h:51
MenuRedrawFlags menu_move_selection(struct Menu *menu, int index)
Move the selection, keeping within between [0, menu->max].
Definition: move.c:236
void menu_add_observers(struct Menu *menu)
Add the notification observers.
Definition: observer.c:127
enum MenuType menu_get_current_type(void)
Get the type of the current Window.
Definition: menu.c:84
void menu_init(void)
Initialise all the Menus.
Definition: menu.c:74
void menu_cleanup(void)
Free the saved Menu searches.
Definition: menu.c:65
void menu_queue_redraw(struct Menu *menu, MenuRedrawFlags redraw)
Queue a request for a redraw.
Definition: menu.c:178
int menu_get_index(struct Menu *menu)
Get the current selection in the Menu.
Definition: menu.c:154
void menu_free(struct Menu **ptr)
Free a Menu.
Definition: menu.c:111
struct Menu * menu_new(enum MenuType type, struct MuttWindow *win, struct ConfigSubset *sub)
Create a new Menu.
Definition: menu.c:130
char * SearchBuffers[MENU_MAX]
Definition: menu.c:39
MenuRedrawFlags menu_set_index(struct Menu *menu, int index)
Set the current selection in the Menu.
Definition: menu.c:168
Convenience wrapper for the library headers.
struct Notify * notify_new(void)
Create a new notifications handler.
Definition: notify.c:60
void notify_set_parent(struct Notify *notify, struct Notify *parent)
Set the parent notification handler.
Definition: notify.c:93
void notify_free(struct Notify **ptr)
Free a notification handler.
Definition: notify.c:73
#define WA_RECALC
Recalculate the contents of the Window.
Definition: mutt_window.h:110
@ WT_CUSTOM
Window with a custom drawing function.
Definition: mutt_window.h:95
@ WT_PAGER
A panel containing the Pager Window.
Definition: mutt_window.h:100
@ WT_MENU
An Window containing a Menu.
Definition: mutt_window.h:98
GUI display the mailboxes in a side panel.
A curses colour and its attributes.
Definition: attr.h:35
A set of inherited config items.
Definition: subset.h:47
Definition: lib.h:69
struct MuttWindow * win
Window holding the Menu.
Definition: lib.h:76
void(* make_entry)(struct Menu *menu, char *buf, size_t buflen, int line)
Definition: lib.h:96
int current
Current entry.
Definition: lib.h:70
struct AttrColor *(* color)(struct Menu *menu, int line)
Definition: lib.h:133
MenuRedrawFlags redraw
When to redraw the screen.
Definition: lib.h:72
void(* mdata_free)(struct Menu *menu, void **ptr)
Definition: lib.h:152
int(* search)(struct Menu *menu, regex_t *rx, int line)
Definition: lib.h:109
enum MenuType type
Menu definition for keymap entries.
Definition: lib.h:73
struct ConfigSubset * sub
Inherited config items.
Definition: lib.h:77
struct Notify * notify
Notifications.
Definition: lib.h:135
void * mdata
Private data.
Definition: lib.h:137
int page_len
Number of entries per screen.
Definition: lib.h:74
struct WindowState state
Current state of the Window.
Definition: mutt_window.h:127
struct MuttWindow * focus
Focused Window.
Definition: mutt_window.h:140
void * wdata
Private data.
Definition: mutt_window.h:145
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:138
struct MuttWindow * parent
Parent Window.
Definition: mutt_window.h:135
WindowActionFlags actions
Actions to be performed, e.g. WA_RECALC.
Definition: mutt_window.h:132
enum WindowType type
Window type, e.g. WT_SIDEBAR.
Definition: mutt_window.h:144
short rows
Number of rows, can be MUTT_WIN_SIZE_UNLIMITED.
Definition: mutt_window.h:61
Menu types.
MenuType
Types of GUI selections.
Definition: type.h:36
@ MENU_INDEX
Index panel (list of emails)
Definition: type.h:50
@ MENU_GENERIC
Generic selection list.
Definition: type.h:45
@ MENU_PAGER
Pager pager (email viewer)
Definition: type.h:54
@ MENU_MAX
Definition: type.h:59