NeoMutt  2025-12-11-435-g4ac674
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 "module_data.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 232 of file dlg_alias.c.

233{
235
236 struct Menu *menu = sdw.menu;
237
239 menu->tag = alias_tag;
240 menu->max = alias_array_count_visible(&mdata->ava);
241 menu->mdata = mdata;
242 menu->mdata_free = NULL; // Menu doesn't own the data
243
244 struct MuttWindow *win_menu = menu->win;
245
246 // Override the Simple Dialog's recalc()
247 win_menu->recalc = alias_recalc;
248
249 alias_set_title(sdw.sbar, mdata->title, mdata->limit);
250
251 // NT_COLOR is handled by the SimpleDialog
255
256 return sdw;
257}
struct MenuDefinition * MdAlias
Alias Menu Definition.
Definition functions.c:51
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:100
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:118
static int alias_tag(struct Menu *menu, int sel, int act)
Tag some aliases - Implements Menu::tag() -.
Definition dlg_alias.c:140
static int alias_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition dlg_alias.c:203
static int alias_alias_observer(struct NotifyCallback *nc)
Notification that an Alias has changed - Implements observer_t -.
Definition dlg_alias.c:156
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:96
struct SimpleDialogWindows simple_dialog_new(const struct MenuDefinition *md, 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:77
@ 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:41
struct Notify * notify
Notifications handler.
Definition neomutt.h:45
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
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
+ 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 338 of file dlg_alias.c.

339{
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
349 ASSERT(md);
350
351 if (buf_at(buf, 0) != '\0')
352 {
353 struct Alias **ap = NULL;
354 ARRAY_FOREACH(ap, &md->aliases)
355 {
356 struct Alias *a = *ap;
357 if (a->name && mutt_strn_equal(a->name, buf_string(buf), buf_len(buf)))
358 {
359 a_best = a;
360 count++;
361
362 if (bestname[0] == '\0') /* init */
363 {
364 mutt_str_copy(bestname, a->name, MIN(mutt_str_len(a->name) + 1, sizeof(bestname)));
365 }
366 else
367 {
368 int i;
369 for (i = 0; a->name[i] && (a->name[i] == bestname[i]); i++)
370 ; // do nothing
371
372 bestname[i] = '\0';
373 }
374 }
375 }
376
377 // Exactly one match, so expand the Alias and return
378 if (count == 1)
379 {
380 buf_reset(buf);
381 mutt_addrlist_write(&a_best->addr, buf, true);
382 buf_addstr(buf, ", ");
383 FREE(&mdata.limit);
385 return 1;
386 }
387
388 if (bestname[0] == '\0')
389 {
390 // Create a View Array of all the Aliases
391 FREE(&mdata.limit);
392 ARRAY_FOREACH(ap, &md->aliases)
393 {
394 alias_array_alias_add(&mdata.ava, *ap);
395 }
396 }
397 else
398 {
399 /* fake the pattern for menu title */
400 char *mtitle = NULL;
401 mutt_str_asprintf(&mtitle, "~f ^%s", buf_string(buf));
402 FREE(&mdata.limit);
403 mdata.limit = mtitle;
404
405 if (!mutt_str_equal(bestname, buf_string(buf)))
406 {
407 /* we are adding something to the completion */
408 buf_strcpy_n(buf, bestname, mutt_str_len(bestname) + 1);
409 FREE(&mdata.limit);
411 return 1;
412 }
413
414 /* build alias list and show it */
415 ARRAY_FOREACH(ap, &md->aliases)
416 {
417 struct Alias *a = *ap;
418 int aasize = alias_array_alias_add(&mdata.ava, a);
419
420 struct AliasView *av = ARRAY_GET(&mdata.ava, aasize - 1);
421
422 if (a->name && !mutt_strn_equal(a->name, buf_string(buf), buf_len(buf)))
423 {
424 av->is_visible = false;
425 }
426 }
427 }
428 }
429
430 if (ARRAY_EMPTY(&mdata.ava))
431 {
432 struct Alias **ap = NULL;
433 ARRAY_FOREACH(ap, &md->aliases)
434 {
435 alias_array_alias_add(&mdata.ava, *ap);
436 }
437
438 mutt_pattern_alias_func(NULL, &mdata, PAA_VISIBLE, NULL);
439 }
440
441 if (!dlg_alias(&mdata))
442 goto done;
443
444 buf_reset(buf);
445
446 // Extract the selected aliases
447 struct Buffer *tmpbuf = buf_pool_get();
448 struct AliasView *avp = NULL;
449 ARRAY_FOREACH(avp, &mdata.ava)
450 {
451 if (!avp->is_tagged)
452 continue;
453
454 mutt_addrlist_write(&avp->alias->addr, tmpbuf, true);
455 buf_addstr(tmpbuf, ", ");
456 }
457 buf_copy(buf, tmpbuf);
458 buf_pool_release(&tmpbuf);
459
460done:
461 // Process any deleted aliases
462 ARRAY_FOREACH(avp, &mdata.ava)
463 {
464 if (!avp->is_deleted)
465 continue;
466
467 // Find and remove the alias from the Aliases array
468 struct Alias **ap = NULL;
469 ARRAY_FOREACH(ap, &md->aliases)
470 {
471 if (*ap == avp->alias)
472 {
473 ARRAY_REMOVE(&md->aliases, ap);
474 break;
475 }
476 }
477 alias_free(&avp->alias);
478 }
479
480 ARRAY_FREE(&mdata.ava);
481 FREE(&mdata.limit);
482 FREE(&mdata.title);
484
485 return 0;
486}
size_t mutt_addrlist_write(const struct AddressList *al, struct Buffer *buf, bool display)
Write an Address to a buffer.
Definition address.c:1210
void alias_free(struct Alias **ptr)
Free an Alias.
Definition alias.c:673
int alias_array_alias_add(struct AliasViewArray *ava, struct Alias *alias)
Add an Alias to the AliasViewArray.
Definition array.c:47
#define ARRAY_REMOVE(head, elem)
Remove an entry from the array, shifting down the subsequent entries.
Definition array.h:355
#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:267
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
#define MIN(a, b)
Return the minimum of two values.
Definition memory.h:40
@ MODULE_ID_ALIAS
ModuleAlias, Alias
Definition module_api.h:48
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
void * neomutt_get_module_data(struct NeoMutt *n, enum ModuleId id)
Get the private data for a Module.
Definition neomutt.c:585
@ 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:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
void search_state_free(struct SearchState **ptr)
Free a SearchState.
struct SearchState * search_state_new(void)
Create a new SearchState.
#define ASSERT(COND)
Definition signal2.h:59
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
Alias private Module data.
Definition module_data.h:33
struct AliasArray aliases
User's email aliases.
Definition module_data.h:34
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 493 of file dlg_alias.c.

494{
495 struct Alias **ap = NULL;
496
497 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
499
501 ASSERT(md);
502
503 // Create a View Array of all the Aliases
504 ARRAY_FOREACH(ap, &md->aliases)
505 {
506 alias_array_alias_add(&mdata.ava, *ap);
507 }
508
509 if (!dlg_alias(&mdata))
510 goto done;
511
512 // Prepare the "To:" field of a new email
513 struct Email *e = email_new();
514 e->env = mutt_env_new();
515
516 struct AliasView *avp = NULL;
517 ARRAY_FOREACH(avp, &mdata.ava)
518 {
519 if (!avp->is_tagged)
520 continue;
521
522 struct AddressList al_copy = TAILQ_HEAD_INITIALIZER(al_copy);
523 if (alias_to_addrlist(&al_copy, avp->alias))
524 {
525 mutt_addrlist_copy(&e->env->to, &al_copy, false);
526 mutt_addrlist_clear(&al_copy);
527 }
528 }
529
530 mutt_send_message(SEND_REVIEW_TO, e, NULL, m, NULL, sub);
531
532done:
533 // Process any deleted aliases
534 ARRAY_FOREACH(avp, &mdata.ava)
535 {
536 if (avp->is_deleted)
537 {
538 // Find and remove the alias from the Aliases array
539 ARRAY_FOREACH(ap, &md->aliases)
540 {
541 if (*ap == avp->alias)
542 {
543 ARRAY_REMOVE(&md->aliases, ap);
544 break;
545 }
546 }
547 alias_free(&avp->alias);
548 }
549 }
550
551 ARRAY_FREE(&mdata.ava);
552 FREE(&mdata.limit);
553 FREE(&mdata.title);
555}
void mutt_addrlist_copy(struct AddressList *dst, const struct AddressList *src, bool prune)
Copy a list of addresses into another list.
Definition address.c:769
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
Definition address.c:1464
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:2037
#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 100 of file dlg_alias.c.

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