Teaching an old dog new tricks
No Matches
dlg_alias.c File Reference

Address book. More...

#include "config.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "mutt/lib.h"
#include "address/lib.h"
#include "config/lib.h"
#include "email/lib.h"
#include "core/lib.h"
#include "gui/lib.h"
#include "lib.h"
#include "key/lib.h"
#include "menu/lib.h"
#include "pattern/lib.h"
#include "send/lib.h"
#include "alias.h"
#include "format_flags.h"
#include "functions.h"
#include "gui.h"
#include "mutt_logging.h"
#include "muttlib.h"
+ Include dependency graph for dlg_alias.c:

Go to the source code of this file.


static const char * alias_format_str (char *buf, size_t buflen, size_t col, int cols, char op, const char *src, const char *prec, const char *if_str, const char *else_str, intptr_t data, MuttFormatFlags flags)
 Format a string for the alias list - Implements format_t -.
static void alias_make_entry (struct Menu *menu, char *buf, size_t buflen, int line)
 Format a menu item for the alias list - Implements Menu::make_entry() -.
static int alias_tag (struct Menu *menu, int sel, int act)
 Tag some aliases - Implements Menu::tag() -.
static int alias_alias_observer (struct NotifyCallback *nc)
 Notification that an Alias has changed - Implements observer_t -.
static int alias_window_observer (struct NotifyCallback *nc)
 Notification that a Window has changed - Implements observer_t -.
static struct MuttWindowalias_dialog_new (struct AliasMenuData *mdata)
 Create an Alias Selection Dialog.
static bool dlg_alias (struct Buffer *buf, struct AliasMenuData *mdata)
 Display a menu of Aliases -.
int alias_complete (struct Buffer *buf, struct ConfigSubset *sub)
 Alias completion routine.
void alias_dialog (struct Mailbox *m, struct ConfigSubset *sub)
 Open the aliases dialog.


static const struct Mapping AliasHelp []
 Help Bar for the Alias dialog (address book)

Detailed Description

Address book.

  • Michael R. Elkins
  • Pietro Cerutti
  • 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

Definition in file dlg_alias.c.

Function Documentation

◆ alias_dialog_new()

static struct MuttWindow * alias_dialog_new ( struct AliasMenuData mdata)

Create an Alias Selection Dialog.

mdataMenu data holding Aliases
Return values
ptrNew Dialog

Definition at line 277 of file dlg_alias.c.

281 struct Menu *menu = dlg->wdata;
284 menu->tag = alias_tag;
285 menu->max = alias_array_count_visible(&mdata->ava);
286 menu->mdata = mdata;
287 menu->mdata_free = NULL; // Menu doesn't own the data
289 struct MuttWindow *win_menu = menu->win;
291 // Override the Simple Dialog's recalc()
292 win_menu->recalc = alias_recalc;
294 struct MuttWindow *sbar = window_find_child(dlg, WT_STATUS_BAR);
295 alias_set_title(sbar, mdata->title, mdata->limit);
297 // NT_COLOR is handled by the SimpleDialog
302 return dlg;
int alias_array_count_visible(struct AliasViewArray *ava)
Count number of visible Aliases.
Definition: array.c:95
static const struct Mapping AliasHelp[]
Help Bar for the Alias dialog (address book)
Definition: dlg_alias.c:97
static void alias_make_entry(struct Menu *menu, char *buf, size_t buflen, int line)
Format a menu item for the alias list - Implements Menu::make_entry() -.
Definition: dlg_alias.c:170
static int alias_tag(struct Menu *menu, int sel, int act)
Tag some aliases - Implements Menu::tag() -.
Definition: dlg_alias.c:185
static int alias_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition: dlg_alias.c:248
static int alias_alias_observer(struct NotifyCallback *nc)
Notification that an Alias has changed - Implements observer_t -.
Definition: dlg_alias.c:201
int alias_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
Definition: gui.c:43
int alias_recalc(struct MuttWindow *win)
Recalculate the display of the Alias Window - Implements MuttWindow::recalc() -.
Definition: gui.c:89
struct MuttWindow * simple_dialog_new(enum MenuType mtype, enum WindowType wtype, const struct Mapping *help_data)
Create a simple index Dialog.
Definition: simple.c:132
void alias_set_title(struct MuttWindow *sbar, char *menu_name, char *limit)
Create a title string for the Menu.
Definition: gui.c:69
bool notify_observer_add(struct Notify *notify, enum NotifyType type, observer_t callback, void *global_data)
Add an observer to an object.
Definition: notify.c:191
struct MuttWindow * window_find_child(struct MuttWindow *win, enum WindowType type)
Recursively find a child Window of a given type.
Definition: mutt_window.c:533
Alias Dialog, dlg_alias()
Definition: mutt_window.h:77
Status Bar containing extra info about the Index/Pager/etc.
Definition: mutt_window.h:102
MuttWindow has changed, NotifyWindow, EventWindow.
Definition: notify_type.h:57
Config has changed, NotifyConfig, EventConfig.
Definition: notify_type.h:43
Alias has changed, NotifyAlias, EventAlias.
Definition: notify_type.h:37
char * limit
Limit being used.
Definition: gui.h:58
char * title
Title for the status bar.
Definition: gui.h:60
struct Notify * notify
Notifications: NotifyConfig, EventConfig.
Definition: subset.h:52
Definition: lib.h:70
struct MuttWindow * win
Window holding the Menu.
Definition: lib.h:77
void(* make_entry)(struct Menu *menu, char *buf, size_t buflen, int line)
Definition: lib.h:96
void(* mdata_free)(struct Menu *menu, void **ptr)
Definition: lib.h:151
int(* tag)(struct Menu *menu, int sel, int act)
Definition: lib.h:121
void * mdata
Private data.
Definition: lib.h:137
int max
Number of entries in the menu.
Definition: lib.h:72
void * wdata
Private data.
Definition: mutt_window.h:145
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:138
int(* recalc)(struct MuttWindow *win)
Definition: mutt_window.h:173
Container for Accounts, Notifications.
Definition: neomutt.h:41
struct Notify * notify
Notifications handler.
Definition: neomutt.h:42
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:45
Select an email address by its alias.
Definition: type.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ alias_complete()

int alias_complete ( struct Buffer buf,
struct ConfigSubset sub 

Alias completion routine.

bufPartial Alias to complete
subConfig items
Return values

Given a partial alias, this routine attempts to fill in the alias from the alias list as much as possible. if given empty search string or found nothing, present all aliases

Definition at line 385 of file dlg_alias.c.

387 struct Alias *np = NULL;
388 char bestname[8192] = { 0 };
390 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
391 mdata.limit = buf_strdup(buf);
392 mdata.search_state = search_state_new();
394 if (buf_at(buf, 0) != '\0')
395 {
396 TAILQ_FOREACH(np, &Aliases, entries)
397 {
398 if (np->name && mutt_strn_equal(np->name, buf_string(buf), buf_len(buf)))
399 {
400 if (bestname[0] == '\0') /* init */
401 {
402 mutt_str_copy(bestname, np->name,
403 MIN(mutt_str_len(np->name) + 1, sizeof(bestname)));
404 }
405 else
406 {
407 int i;
408 for (i = 0; np->name[i] && (np->name[i] == bestname[i]); i++)
409 ; // do nothing
411 bestname[i] = '\0';
412 }
413 }
414 }
416 if (bestname[0] == '\0')
417 {
418 // Create a View Array of all the Aliases
419 FREE(&mdata.limit);
420 TAILQ_FOREACH(np, &Aliases, entries)
421 {
423 }
424 }
425 else
426 {
427 /* fake the pattern for menu title */
428 char *mtitle = NULL;
429 mutt_str_asprintf(&mtitle, "~f ^%s", buf_string(buf));
430 FREE(&mdata.limit);
431 mdata.limit = mtitle;
433 if (!mutt_str_equal(bestname, buf_string(buf)))
434 {
435 /* we are adding something to the completion */
436 buf_strcpy_n(buf, bestname, mutt_str_len(bestname) + 1);
437 FREE(&mdata.limit);
438 return 1;
439 }
441 /* build alias list and show it */
442 TAILQ_FOREACH(np, &Aliases, entries)
443 {
444 int aasize = alias_array_alias_add(&mdata.ava, np);
446 struct AliasView *av = ARRAY_GET(&mdata.ava, aasize - 1);
448 if (np->name && !mutt_strn_equal(np->name, buf_string(buf), buf_len(buf)))
449 {
450 av->is_visible = false;
451 }
452 }
453 }
454 }
456 if (ARRAY_EMPTY(&mdata.ava))
457 {
458 TAILQ_FOREACH(np, &Aliases, entries)
459 {
460 alias_array_alias_add(&mdata.ava, np);
461 }
463 mutt_pattern_alias_func(NULL, &mdata, NULL);
464 }
466 if (!dlg_alias(NULL, &mdata))
467 goto done;
469 buf_reset(buf);
471 // Extract the selected aliases
472 struct Buffer *tmpbuf = buf_pool_get();
473 struct AliasView *avp = NULL;
474 ARRAY_FOREACH(avp, &mdata.ava)
475 {
476 if (!avp->is_tagged)
477 continue;
479 mutt_addrlist_write(&avp->alias->addr, tmpbuf, true);
480 buf_addstr(tmpbuf, ", ");
481 }
482 buf_copy(buf, tmpbuf);
483 buf_pool_release(&tmpbuf);
486 // Process any deleted aliases
487 ARRAY_FOREACH(avp, &mdata.ava)
488 {
489 if (!avp->is_deleted)
490 continue;
492 TAILQ_REMOVE(&Aliases, avp->alias, entries);
493 alias_free(&avp->alias);
494 }
496 ARRAY_FREE(&mdata.ava);
497 FREE(&mdata.limit);
498 FREE(&mdata.title);
501 return 0;
size_t mutt_addrlist_write(const struct AddressList *al, struct Buffer *buf, bool display)
Write an Address to a buffer.
Definition: address.c:1207
void alias_free(struct Alias **ptr)
Free an Alias.
Definition: alias.c:641
struct AliasList Aliases
List of all the user's email aliases.
Definition: alias.c:60
int alias_array_alias_add(struct AliasViewArray *ava, struct Alias *alias)
Add an Alias to the AliasViewArray.
Definition: array.c:47
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition: array.h:211
#define ARRAY_EMPTY(head)
Check if an array is empty.
Definition: array.h:73
#define ARRAY_FREE(head)
Release all memory.
Definition: array.h:203
#define ARRAY_GET(head, idx)
Return the element at index.
Definition: array.h:108
Static initializer for arrays.
Definition: array.h:57
size_t buf_len(const struct Buffer *buf)
Calculate the length of a Buffer.
Definition: buffer.c:466
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:88
char buf_at(const struct Buffer *buf, size_t offset)
Return the character at the given offset.
Definition: buffer.c:638
size_t buf_strcpy_n(struct Buffer *buf, const char *s, size_t len)
Copy a string into a Buffer.
Definition: buffer.c:422
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition: buffer.c:238
size_t buf_copy(struct Buffer *dst, const struct Buffer *src)
Copy a Buffer's contents to another Buffer.
Definition: buffer.c:572
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
Definition: buffer.c:542
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:93
static bool dlg_alias(struct Buffer *buf, struct AliasMenuData *mdata)
Display a menu of Aliases -.
Definition: dlg_alias.c:314
#define FREE(x)
Definition: memory.h:45
#define MIN(a, b)
Definition: memory.h:32
int mutt_str_asprintf(char **strp, const char *fmt,...)
Definition: string.c:1022
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:798
bool mutt_strn_equal(const char *a, const char *b, size_t num)
Check for equality of two strings (to a maximum), safely.
Definition: string.c:497
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition: string.c:568
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
Definition: string.c:653
int mutt_pattern_alias_func(char *prompt, struct AliasMenuData *mdata, struct Menu *menu)
Perform some Pattern matching for Alias.
Definition: pattern.c:191
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:725
#define TAILQ_REMOVE(head, elm, field)
Definition: queue.h:841
void search_state_free(struct SearchState **ptr)
Free a SearchState.
Definition: search_state.c:50
struct SearchState * search_state_new(void)
Create a new SearchState.
Definition: search_state.c:38
AliasView array wrapper with Pattern information -.
Definition: gui.h:52
struct AliasViewArray ava
All Aliases/Queries.
Definition: gui.h:53
struct SearchState * search_state
State of the current search.
Definition: gui.h:61
struct ConfigSubset * sub
Config items.
Definition: gui.h:55
GUI data wrapping an Alias.
Definition: gui.h:36
bool is_visible
Is visible?
Definition: gui.h:43
struct Alias * alias
Definition: gui.h:44
bool is_deleted
Is it deleted?
Definition: gui.h:42
bool is_tagged
Is it tagged?
Definition: gui.h:41
A shortcut for an email address or addresses.
Definition: alias.h:34
char * name
Short name.
Definition: alias.h:35
struct AddressList addr
List of Addresses the Alias expands to.
Definition: alias.h:36
String manipulation buffer.
Definition: buffer.h:34
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ alias_dialog()

void alias_dialog ( struct Mailbox m,
struct ConfigSubset sub 

Open the aliases dialog.

subConfig item

Definition at line 509 of file dlg_alias.c.

511 struct Alias *np = NULL;
513 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
514 mdata.search_state = search_state_new();
516 // Create a View Array of all the Aliases
517 TAILQ_FOREACH(np, &Aliases, entries)
518 {
520 }
522 if (!dlg_alias(NULL, &mdata))
523 goto done;
525 // Prepare the "To:" field of a new email
526 struct Email *e = email_new();
527 e->env = mutt_env_new();
529 struct AliasView *avp = NULL;
530 ARRAY_FOREACH(avp, &mdata.ava)
531 {
532 if (!avp->is_tagged)
533 continue;
535 struct AddressList al_copy = TAILQ_HEAD_INITIALIZER(al_copy);
536 if (alias_to_addrlist(&al_copy, avp->alias))
537 {
538 mutt_addrlist_copy(&e->env->to, &al_copy, false);
539 mutt_addrlist_clear(&al_copy);
540 }
541 }
543 mutt_send_message(SEND_REVIEW_TO, e, NULL, m, NULL, sub);
546 // Process any deleted aliases
547 ARRAY_FOREACH(avp, &mdata.ava)
548 {
549 if (avp->is_deleted)
550 {
551 TAILQ_REMOVE(&Aliases, avp->alias, entries);
552 alias_free(&avp->alias);
553 }
554 }
556 ARRAY_FREE(&mdata.ava);
557 FREE(&mdata.limit);
558 FREE(&mdata.title);
void mutt_addrlist_copy(struct AddressList *dst, const struct AddressList *src, bool prune)
Copy a list of addresses into another list.
Definition: address.c:762
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
Definition: address.c:1461
bool alias_to_addrlist(struct AddressList *al, struct Alias *alias)
Turn an Alias into an AddressList.
Definition: dlg_query.c:120
struct Email * email_new(void)
Create a new Email.
Definition: email.c:78
struct Envelope * mutt_env_new(void)
Create a new Envelope.
Definition: envelope.c:43
Definition: queue.h:637
int mutt_send_message(SendFlags flags, struct Email *e_templ, const char *tempfile, struct Mailbox *m, struct EmailArray *ea, struct ConfigSubset *sub)
Send an email.
Definition: send.c:2127
Allow the user to edit the To field.
Definition: send.h:54
The envelope/body of an email.
Definition: email.h:37
struct Envelope * env
Envelope information.
Definition: email.h:66
struct AddressList to
Email's 'To' list.
Definition: envelope.h:60
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ AliasHelp

const struct Mapping AliasHelp[]
Initial value:
= {
{ N_("Exit"), OP_EXIT },
{ N_("Del"), OP_DELETE },
{ N_("Undel"), OP_UNDELETE },
{ N_("Sort"), OP_SORT },
{ N_("Rev-Sort"), OP_SORT_REVERSE },
{ N_("Help"), OP_HELP },
{ NULL, 0 },
#define N_(a)
Definition: message.h:32

Help Bar for the Alias dialog (address book)

Definition at line 97 of file dlg_alias.c.