NeoMutt  2025-09-05-55-g97fc89
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
dlg_alias.c File Reference

Address book. More...

#include "config.h"
#include <stdbool.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 "expando/lib.h"
#include "key/lib.h"
#include "menu/lib.h"
#include "pattern/lib.h"
#include "send/lib.h"
#include "alias.h"
#include "expando.h"
#include "functions.h"
#include "gui.h"
#include "mutt_logging.h"
+ Include dependency graph for dlg_alias.c:

Go to the source code of this file.

Functions

static int alias_make_entry (struct Menu *menu, int line, int max_cols, struct Buffer *buf)
 Format an Alias for the Menu - 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 SimpleDialogWindows alias_dialog_new (struct AliasMenuData *mdata)
 Create an Alias Selection Dialog.
 
static bool dlg_alias (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.
 

Variables

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

Detailed Description

Address book.

Authors
  • Richard Russon
  • Romeu Vieira
  • Pietro Cerutti
  • Anna Figueiredo Gomes
  • Dennis Schön
  • Tóth János

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

Function Documentation

◆ alias_dialog_new()

static struct SimpleDialogWindows alias_dialog_new ( struct AliasMenuData * mdata)
static

Create an Alias Selection Dialog.

Parameters
mdataMenu data holding Aliases
Return values
objSimpleDialogWindows Tuple containing Dialog, SimpleBar and Menu pointers

Definition at line 231 of file dlg_alias.c.

232{
234
235 struct Menu *menu = sdw.menu;
236
238 menu->tag = alias_tag;
239 menu->max = alias_array_count_visible(&mdata->ava);
240 menu->mdata = mdata;
241 menu->mdata_free = NULL; // Menu doesn't own the data
242
243 struct MuttWindow *win_menu = menu->win;
244
245 // Override the Simple Dialog's recalc()
246 win_menu->recalc = alias_recalc;
247
248 alias_set_title(sdw.sbar, mdata->title, mdata->limit);
249
250 // NT_COLOR is handled by the SimpleDialog
254
255 return sdw;
256}
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:99
static int alias_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Format an Alias for the Menu - Implements Menu::make_entry() -.
Definition dlg_alias.c:117
static int alias_tag(struct Menu *menu, int sel, int act)
Tag some aliases - Implements Menu::tag() -.
Definition dlg_alias.c:139
static int alias_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition dlg_alias.c:202
static int alias_alias_observer(struct NotifyCallback *nc)
Notification that an Alias has changed - Implements observer_t -.
Definition dlg_alias.c:155
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:92
struct SimpleDialogWindows 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:72
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
@ WT_DLG_ALIAS
Alias Dialog, dlg_alias()
Definition mutt_window.h:78
@ NT_WINDOW
MuttWindow has changed, NotifyWindow, EventWindow.
Definition notify_type.h:57
@ NT_CONFIG
Config has changed, NotifyConfig, EventConfig.
Definition notify_type.h:43
@ NT_ALIAS
Alias has changed, NotifyAlias, EventAlias.
Definition notify_type.h:37
char * limit
Limit being used.
Definition gui.h:60
char * title
Title for the status bar.
Definition gui.h:62
struct Notify * notify
Notifications: NotifyConfig, EventConfig.
Definition subset.h:51
Definition lib.h:79
struct MuttWindow * win
Window holding the Menu.
Definition lib.h:86
void(* mdata_free)(struct Menu *menu, void **ptr)
Definition lib.h:161
int(* tag)(struct Menu *menu, int sel, int act)
Definition lib.h:131
int(* make_entry)(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Definition lib.h:106
void * mdata
Private data.
Definition lib.h:147
int max
Number of entries in the menu.
Definition lib.h:81
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
int(* recalc)(struct MuttWindow *win)
Container for Accounts, Notifications.
Definition neomutt.h:43
struct Notify * notify
Notifications handler.
Definition neomutt.h:44
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:47
Tuple for the results of simple_dialog_new()
Definition simple.h:35
struct MuttWindow * sbar
Simple Bar.
Definition simple.h:37
struct Menu * menu
Menu.
Definition simple.h:38
@ MENU_ALIAS
Select an email address by its alias.
Definition type.h:36
+ 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.

Parameters
bufPartial Alias to complete
subConfig items
Return values
1Success
0Error

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 335 of file dlg_alias.c.

336{
337 struct Alias *np = NULL;
338 char bestname[8192] = { 0 };
339
340 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
341 mdata.limit = buf_strdup(buf);
342 mdata.search_state = search_state_new();
343
344 if (buf_at(buf, 0) != '\0')
345 {
346 TAILQ_FOREACH(np, &Aliases, entries)
347 {
348 if (np->name && mutt_strn_equal(np->name, buf_string(buf), buf_len(buf)))
349 {
350 if (bestname[0] == '\0') /* init */
351 {
352 mutt_str_copy(bestname, np->name,
353 MIN(mutt_str_len(np->name) + 1, sizeof(bestname)));
354 }
355 else
356 {
357 int i;
358 for (i = 0; np->name[i] && (np->name[i] == bestname[i]); i++)
359 ; // do nothing
360
361 bestname[i] = '\0';
362 }
363 }
364 }
365
366 if (bestname[0] == '\0')
367 {
368 // Create a View Array of all the Aliases
369 FREE(&mdata.limit);
370 TAILQ_FOREACH(np, &Aliases, entries)
371 {
373 }
374 }
375 else
376 {
377 /* fake the pattern for menu title */
378 char *mtitle = NULL;
379 mutt_str_asprintf(&mtitle, "~f ^%s", buf_string(buf));
380 FREE(&mdata.limit);
381 mdata.limit = mtitle;
382
383 if (!mutt_str_equal(bestname, buf_string(buf)))
384 {
385 /* we are adding something to the completion */
386 buf_strcpy_n(buf, bestname, mutt_str_len(bestname) + 1);
387 FREE(&mdata.limit);
388 search_state_free(&mdata.search_state);
389 return 1;
390 }
391
392 /* build alias list and show it */
393 TAILQ_FOREACH(np, &Aliases, entries)
394 {
395 int aasize = alias_array_alias_add(&mdata.ava, np);
396
397 struct AliasView *av = ARRAY_GET(&mdata.ava, aasize - 1);
398
399 if (np->name && !mutt_strn_equal(np->name, buf_string(buf), buf_len(buf)))
400 {
401 av->is_visible = false;
402 }
403 }
404 }
405 }
406
407 if (ARRAY_EMPTY(&mdata.ava))
408 {
409 TAILQ_FOREACH(np, &Aliases, entries)
410 {
411 alias_array_alias_add(&mdata.ava, np);
412 }
413
414 mutt_pattern_alias_func(NULL, &mdata, PAA_VISIBLE, NULL);
415 }
416
417 if (!dlg_alias(&mdata))
418 goto done;
419
420 buf_reset(buf);
421
422 // Extract the selected aliases
423 struct Buffer *tmpbuf = buf_pool_get();
424 struct AliasView *avp = NULL;
425 ARRAY_FOREACH(avp, &mdata.ava)
426 {
427 if (!avp->is_tagged)
428 continue;
429
430 mutt_addrlist_write(&avp->alias->addr, tmpbuf, true);
431 buf_addstr(tmpbuf, ", ");
432 }
433 buf_copy(buf, tmpbuf);
434 buf_pool_release(&tmpbuf);
435
436done:
437 // Process any deleted aliases
438 ARRAY_FOREACH(avp, &mdata.ava)
439 {
440 if (!avp->is_deleted)
441 continue;
442
443 TAILQ_REMOVE(&Aliases, avp->alias, entries);
444 alias_free(&avp->alias);
445 }
446
447 ARRAY_FREE(&mdata.ava);
448 FREE(&mdata.limit);
449 FREE(&mdata.title);
451
452 return 0;
453}
size_t mutt_addrlist_write(const struct AddressList *al, struct Buffer *buf, bool display)
Write an Address to a buffer.
Definition address.c:1206
void alias_free(struct Alias **ptr)
Free an Alias.
Definition alias.c:668
struct AliasList Aliases
List of all the user's email aliases.
Definition alias.c:61
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:214
#define ARRAY_EMPTY(head)
Check if an array is empty.
Definition array.h:74
#define ARRAY_FREE(head)
Release all memory.
Definition array.h:204
#define ARRAY_GET(head, idx)
Return the element at index.
Definition array.h:109
#define ARRAY_HEAD_INITIALIZER
Static initializer for arrays.
Definition array.h:58
size_t buf_len(const struct Buffer *buf)
Calculate the length of a Buffer.
Definition buffer.c:491
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition buffer.c:76
char buf_at(const struct Buffer *buf, size_t offset)
Return the character at the given offset.
Definition buffer.c:668
size_t buf_strcpy_n(struct Buffer *buf, const char *s, size_t len)
Copy a string into a Buffer.
Definition buffer.c:416
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition buffer.c:226
size_t buf_copy(struct Buffer *dst, const struct Buffer *src)
Copy a Buffer's contents to another Buffer.
Definition buffer.c:601
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
Definition buffer.c:571
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
static bool dlg_alias(struct AliasMenuData *mdata)
Display a menu of Aliases -.
Definition dlg_alias.c:266
#define FREE(x)
Definition memory.h:62
#define MIN(a, b)
Definition memory.h:37
int mutt_str_asprintf(char **strp, const char *fmt,...)
Definition string.c:803
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:660
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:427
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition string.c:498
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:581
@ PAA_VISIBLE
Set AliasView.is_visible and hide the rest.
Definition lib.h:190
int mutt_pattern_alias_func(char *prompt, struct AliasMenuData *mdata, enum PatternAlias action, struct Menu *menu)
Perform some Pattern matching for Alias.
Definition pattern.c:188
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:82
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:96
#define TAILQ_FOREACH(var, head, field)
Definition queue.h:782
#define TAILQ_REMOVE(head, elm, field)
Definition queue.h:901
void search_state_free(struct SearchState **ptr)
Free a SearchState.
struct SearchState * search_state_new(void)
Create a new SearchState.
AliasView array wrapper with Pattern information -.
Definition gui.h:54
struct AliasViewArray ava
All Aliases/Queries.
Definition gui.h:55
struct SearchState * search_state
State of the current search.
Definition gui.h:63
struct ConfigSubset * sub
Config items.
Definition gui.h:57
GUI data wrapping an Alias.
Definition gui.h:38
bool is_visible
Is visible?
Definition gui.h:45
struct Alias * alias
Alias.
Definition gui.h:46
bool is_deleted
Is it deleted?
Definition gui.h:44
bool is_tagged
Is it tagged?
Definition gui.h:43
A shortcut for an email address or addresses.
Definition alias.h:35
char * name
Short name.
Definition alias.h:36
struct AddressList addr
List of Addresses the Alias expands to.
Definition alias.h:37
String manipulation buffer.
Definition buffer.h:36
+ 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.

Parameters
mMailbox
subConfig item

Definition at line 460 of file dlg_alias.c.

461{
462 struct Alias *np = NULL;
463
464 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
466
467 // Create a View Array of all the Aliases
468 TAILQ_FOREACH(np, &Aliases, entries)
469 {
471 }
472
473 if (!dlg_alias(&mdata))
474 goto done;
475
476 // Prepare the "To:" field of a new email
477 struct Email *e = email_new();
478 e->env = mutt_env_new();
479
480 struct AliasView *avp = NULL;
481 ARRAY_FOREACH(avp, &mdata.ava)
482 {
483 if (!avp->is_tagged)
484 continue;
485
486 struct AddressList al_copy = TAILQ_HEAD_INITIALIZER(al_copy);
487 if (alias_to_addrlist(&al_copy, avp->alias))
488 {
489 mutt_addrlist_copy(&e->env->to, &al_copy, false);
490 mutt_addrlist_clear(&al_copy);
491 }
492 }
493
494 mutt_send_message(SEND_REVIEW_TO, e, NULL, m, NULL, sub);
495
496done:
497 // Process any deleted aliases
498 ARRAY_FOREACH(avp, &mdata.ava)
499 {
500 if (avp->is_deleted)
501 {
502 TAILQ_REMOVE(&Aliases, avp->alias, entries);
503 alias_free(&avp->alias);
504 }
505 }
506
507 ARRAY_FREE(&mdata.ava);
508 FREE(&mdata.limit);
509 FREE(&mdata.title);
511}
void mutt_addrlist_copy(struct AddressList *dst, const struct AddressList *src, bool prune)
Copy a list of addresses into another list.
Definition address.c:765
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
Definition address.c:1460
bool alias_to_addrlist(struct AddressList *al, struct Alias *alias)
Turn an Alias into an AddressList.
Definition dlg_query.c:119
struct Email * email_new(void)
Create a new Email.
Definition email.c:77
struct Envelope * mutt_env_new(void)
Create a new Envelope.
Definition envelope.c:45
#define TAILQ_HEAD_INITIALIZER(head)
Definition queue.h:694
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:2034
#define SEND_REVIEW_TO
Allow the user to edit the To field.
Definition send.h:56
The envelope/body of an email.
Definition email.h:39
struct Envelope * env
Envelope information.
Definition email.h:68
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[]
static
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_("Select"), OP_GENERIC_SELECT_ENTRY },
{ N_("Help"), OP_HELP },
{ NULL, 0 },
}
#define N_(a)
Definition message.h:32

Help Bar for the Alias dialog (address book)

Definition at line 99 of file dlg_alias.c.

99 {
100 // clang-format off
101 { N_("Exit"), OP_EXIT },
102 { N_("Del"), OP_DELETE },
103 { N_("Undel"), OP_UNDELETE },
104 { N_("Sort"), OP_SORT },
105 { N_("Rev-Sort"), OP_SORT_REVERSE },
106 { N_("Select"), OP_GENERIC_SELECT_ENTRY },
107 { N_("Help"), OP_HELP },
108 { NULL, 0 },
109 // clang-format on
110};