NeoMutt  2025-12-11-58-g09398d
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:87
void(* mdata_free)(struct Menu *menu, void **ptr)
Definition lib.h:162
int(* tag)(struct Menu *menu, int sel, int act)
Definition lib.h:132
int(* make_entry)(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Definition lib.h:107
void * mdata
Private data.
Definition lib.h:148
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 struct Alias *a_best = NULL;
340 int count = 0;
341
342 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
343 mdata.limit = buf_strdup(buf);
344 mdata.search_state = search_state_new();
345
346 if (buf_at(buf, 0) != '\0')
347 {
348 TAILQ_FOREACH(np, &Aliases, entries)
349 {
350 if (np->name && mutt_strn_equal(np->name, buf_string(buf), buf_len(buf)))
351 {
352 a_best = np;
353 count++;
354
355 if (bestname[0] == '\0') /* init */
356 {
357 mutt_str_copy(bestname, np->name,
358 MIN(mutt_str_len(np->name) + 1, sizeof(bestname)));
359 }
360 else
361 {
362 int i;
363 for (i = 0; np->name[i] && (np->name[i] == bestname[i]); i++)
364 ; // do nothing
365
366 bestname[i] = '\0';
367 }
368 }
369 }
370
371 // Exactly one match, so expand the Alias and return
372 if (count == 1)
373 {
374 buf_reset(buf);
375 mutt_addrlist_write(&a_best->addr, buf, true);
376 buf_addstr(buf, ", ");
377 FREE(&mdata.limit);
378 search_state_free(&mdata.search_state);
379 return 1;
380 }
381
382 if (bestname[0] == '\0')
383 {
384 // Create a View Array of all the Aliases
385 FREE(&mdata.limit);
386 TAILQ_FOREACH(np, &Aliases, entries)
387 {
389 }
390 }
391 else
392 {
393 /* fake the pattern for menu title */
394 char *mtitle = NULL;
395 mutt_str_asprintf(&mtitle, "~f ^%s", buf_string(buf));
396 FREE(&mdata.limit);
397 mdata.limit = mtitle;
398
399 if (!mutt_str_equal(bestname, buf_string(buf)))
400 {
401 /* we are adding something to the completion */
402 buf_strcpy_n(buf, bestname, mutt_str_len(bestname) + 1);
403 FREE(&mdata.limit);
404 search_state_free(&mdata.search_state);
405 return 1;
406 }
407
408 /* build alias list and show it */
409 TAILQ_FOREACH(np, &Aliases, entries)
410 {
411 int aasize = alias_array_alias_add(&mdata.ava, np);
412
413 struct AliasView *av = ARRAY_GET(&mdata.ava, aasize - 1);
414
415 if (np->name && !mutt_strn_equal(np->name, buf_string(buf), buf_len(buf)))
416 {
417 av->is_visible = false;
418 }
419 }
420 }
421 }
422
423 if (ARRAY_EMPTY(&mdata.ava))
424 {
425 TAILQ_FOREACH(np, &Aliases, entries)
426 {
427 alias_array_alias_add(&mdata.ava, np);
428 }
429
430 mutt_pattern_alias_func(NULL, &mdata, PAA_VISIBLE, NULL);
431 }
432
433 if (!dlg_alias(&mdata))
434 goto done;
435
436 buf_reset(buf);
437
438 // Extract the selected aliases
439 struct Buffer *tmpbuf = buf_pool_get();
440 struct AliasView *avp = NULL;
441 ARRAY_FOREACH(avp, &mdata.ava)
442 {
443 if (!avp->is_tagged)
444 continue;
445
446 mutt_addrlist_write(&avp->alias->addr, tmpbuf, true);
447 buf_addstr(tmpbuf, ", ");
448 }
449 buf_copy(buf, tmpbuf);
450 buf_pool_release(&tmpbuf);
451
452done:
453 // Process any deleted aliases
454 ARRAY_FOREACH(avp, &mdata.ava)
455 {
456 if (!avp->is_deleted)
457 continue;
458
459 TAILQ_REMOVE(&Aliases, avp->alias, entries);
460 alias_free(&avp->alias);
461 }
462
463 ARRAY_FREE(&mdata.ava);
464 FREE(&mdata.limit);
465 FREE(&mdata.title);
467
468 return 0;
469}
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 476 of file dlg_alias.c.

477{
478 struct Alias *np = NULL;
479
480 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
482
483 // Create a View Array of all the Aliases
484 TAILQ_FOREACH(np, &Aliases, entries)
485 {
487 }
488
489 if (!dlg_alias(&mdata))
490 goto done;
491
492 // Prepare the "To:" field of a new email
493 struct Email *e = email_new();
494 e->env = mutt_env_new();
495
496 struct AliasView *avp = NULL;
497 ARRAY_FOREACH(avp, &mdata.ava)
498 {
499 if (!avp->is_tagged)
500 continue;
501
502 struct AddressList al_copy = TAILQ_HEAD_INITIALIZER(al_copy);
503 if (alias_to_addrlist(&al_copy, avp->alias))
504 {
505 mutt_addrlist_copy(&e->env->to, &al_copy, false);
506 mutt_addrlist_clear(&al_copy);
507 }
508 }
509
510 mutt_send_message(SEND_REVIEW_TO, e, NULL, m, NULL, sub);
511
512done:
513 // Process any deleted aliases
514 ARRAY_FOREACH(avp, &mdata.ava)
515 {
516 if (avp->is_deleted)
517 {
518 TAILQ_REMOVE(&Aliases, avp->alias, entries);
519 alias_free(&avp->alias);
520 }
521 }
522
523 ARRAY_FREE(&mdata.ava);
524 FREE(&mdata.limit);
525 FREE(&mdata.title);
527}
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:2035
#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};