NeoMutt  2025-12-11-177-g48e272
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:80
struct MuttWindow * win
Window holding the Menu.
Definition lib.h:88
void(* mdata_free)(struct Menu *menu, void **ptr)
Definition lib.h:163
int(* tag)(struct Menu *menu, int sel, int act)
Definition lib.h:133
int(* make_entry)(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Definition lib.h:108
void * mdata
Private data.
Definition lib.h:149
int max
Number of entries in the menu.
Definition lib.h:82
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
int(* recalc)(struct MuttWindow *win)
Container for Accounts, Notifications.
Definition neomutt.h:128
struct Notify * notify
Notifications handler.
Definition neomutt.h:130
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:134
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:34
+ 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 337 of file dlg_alias.c.

338{
339 struct Alias *np = NULL;
340 char bestname[8192] = { 0 };
341 struct Alias *a_best = NULL;
342 int count = 0;
343
344 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
345 mdata.limit = buf_strdup(buf);
346 mdata.search_state = search_state_new();
347
348 if (buf_at(buf, 0) != '\0')
349 {
350 TAILQ_FOREACH(np, &Aliases, entries)
351 {
352 if (np->name && mutt_strn_equal(np->name, buf_string(buf), buf_len(buf)))
353 {
354 a_best = np;
355 count++;
356
357 if (bestname[0] == '\0') /* init */
358 {
359 mutt_str_copy(bestname, np->name,
360 MIN(mutt_str_len(np->name) + 1, sizeof(bestname)));
361 }
362 else
363 {
364 int i;
365 for (i = 0; np->name[i] && (np->name[i] == bestname[i]); i++)
366 ; // do nothing
367
368 bestname[i] = '\0';
369 }
370 }
371 }
372
373 // Exactly one match, so expand the Alias and return
374 if (count == 1)
375 {
376 buf_reset(buf);
377 mutt_addrlist_write(&a_best->addr, buf, true);
378 buf_addstr(buf, ", ");
379 FREE(&mdata.limit);
380 search_state_free(&mdata.search_state);
381 return 1;
382 }
383
384 if (bestname[0] == '\0')
385 {
386 // Create a View Array of all the Aliases
387 FREE(&mdata.limit);
388 TAILQ_FOREACH(np, &Aliases, entries)
389 {
391 }
392 }
393 else
394 {
395 /* fake the pattern for menu title */
396 char *mtitle = NULL;
397 mutt_str_asprintf(&mtitle, "~f ^%s", buf_string(buf));
398 FREE(&mdata.limit);
399 mdata.limit = mtitle;
400
401 if (!mutt_str_equal(bestname, buf_string(buf)))
402 {
403 /* we are adding something to the completion */
404 buf_strcpy_n(buf, bestname, mutt_str_len(bestname) + 1);
405 FREE(&mdata.limit);
406 search_state_free(&mdata.search_state);
407 return 1;
408 }
409
410 /* build alias list and show it */
411 TAILQ_FOREACH(np, &Aliases, entries)
412 {
413 int aasize = alias_array_alias_add(&mdata.ava, np);
414
415 struct AliasView *av = ARRAY_GET(&mdata.ava, aasize - 1);
416
417 if (np->name && !mutt_strn_equal(np->name, buf_string(buf), buf_len(buf)))
418 {
419 av->is_visible = false;
420 }
421 }
422 }
423 }
424
425 if (ARRAY_EMPTY(&mdata.ava))
426 {
427 TAILQ_FOREACH(np, &Aliases, entries)
428 {
429 alias_array_alias_add(&mdata.ava, np);
430 }
431
432 mutt_pattern_alias_func(NULL, &mdata, PAA_VISIBLE, NULL);
433 }
434
435 if (!dlg_alias(&mdata))
436 goto done;
437
438 buf_reset(buf);
439
440 // Extract the selected aliases
441 struct Buffer *tmpbuf = buf_pool_get();
442 struct AliasView *avp = NULL;
443 ARRAY_FOREACH(avp, &mdata.ava)
444 {
445 if (!avp->is_tagged)
446 continue;
447
448 mutt_addrlist_write(&avp->alias->addr, tmpbuf, true);
449 buf_addstr(tmpbuf, ", ");
450 }
451 buf_copy(buf, tmpbuf);
452 buf_pool_release(&tmpbuf);
453
454done:
455 // Process any deleted aliases
456 ARRAY_FOREACH(avp, &mdata.ava)
457 {
458 if (!avp->is_deleted)
459 continue;
460
461 TAILQ_REMOVE(&Aliases, avp->alias, entries);
462 alias_free(&avp->alias);
463 }
464
465 ARRAY_FREE(&mdata.ava);
466 FREE(&mdata.limit);
467 FREE(&mdata.title);
469
470 return 0;
471}
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:667
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:223
#define ARRAY_EMPTY(head)
Check if an array is empty.
Definition array.h:74
#define ARRAY_FREE(head)
Release all memory.
Definition array.h:209
#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:63
#define MIN(a, b)
Definition memory.h:38
int mutt_str_asprintf(char **strp, const char *fmt,...)
Definition string.c:805
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:662
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:429
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition string.c:500
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:583
@ PAA_VISIBLE
Set AliasView.is_visible and hide the rest.
Definition lib.h:191
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:186
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 478 of file dlg_alias.c.

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