NeoMutt  2024-04-25-102-g19653a
Teaching an old dog new tricks
No Matches
dlg_query.c File Reference

Routines for querying an external address book. More...

#include "config.h"
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.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 "mutt.h"
#include "lib.h"
#include "editor/lib.h"
#include "expando/lib.h"
#include "history/lib.h"
#include "key/lib.h"
#include "menu/lib.h"
#include "pattern/lib.h"
#include "send/lib.h"
#include "alias.h"
#include "functions.h"
#include "globals.h"
#include "gui.h"
#include "mutt_logging.h"
+ Include dependency graph for dlg_query.c:

Go to the source code of this file.


bool alias_to_addrlist (struct AddressList *al, struct Alias *alias)
 Turn an Alias into an AddressList.
void query_a (const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
 Query: Address - Implements ExpandoRenderData::get_string() -.
long query_c_num (const struct ExpandoNode *node, void *data, MuttFormatFlags flags)
 Query: Index number - Implements ExpandoRenderData::get_number() -.
void query_e (const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
 Query: Extra information - Implements ExpandoRenderData::get_string() -.
void query_n (const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
 Query: Name - Implements ExpandoRenderData::get_string() -.
long query_t_num (const struct ExpandoNode *node, void *data, MuttFormatFlags flags)
 Query: Tagged char - Implements ExpandoRenderData::get_number() -.
void query_t (const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
 Query: Tagged char - Implements ExpandoRenderData::get_string() -.
void query_Y (const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
 Query: Tags - Implements ExpandoRenderData::get_string() -.
static int query_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 query_tag (struct Menu *menu, int sel, int act)
 Tag an entry in the Query Menu - Implements Menu::tag() -.
int query_run (const char *s, bool verbose, struct AliasList *al, const struct ConfigSubset *sub)
 Run an external program to find Addresses.
static int query_window_observer (struct NotifyCallback *nc)
 Notification that a Window has changed - Implements observer_t -.
static struct MuttWindowquery_dialog_new (struct AliasMenuData *mdata, const char *query)
 Create an Query Selection Dialog.
static bool dlg_query (struct Buffer *buf, struct AliasMenuData *mdata)
 Get the user to enter an Address Query -.
int query_complete (struct Buffer *buf, struct ConfigSubset *sub)
 Perform auto-complete using an Address Query.
void query_index (struct Mailbox *m, struct ConfigSubset *sub)
 Perform an Alias Query and display the results.


const struct ExpandoRenderData QueryRenderData []
 Callbacks for Query Expandos.
static const struct Mapping QueryHelp []
 Help Bar for the Address Query dialog.

Detailed Description

Routines for querying an external address book.

  • Richard Russon
  • Pietro Cerutti
  • 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

Definition in file dlg_query.c.

Function Documentation

◆ alias_to_addrlist()

bool alias_to_addrlist ( struct AddressList *  al,
struct Alias alias 

Turn an Alias into an AddressList.

alAddressList to fill (must be empty)
aliasAlias to use
Return values

Definition at line 121 of file dlg_query.c.

123 if (!al || !TAILQ_EMPTY(al) || !alias)
124 return false;
126 mutt_addrlist_copy(al, &alias->addr, false);
127 if (!TAILQ_EMPTY(al))
128 {
129 struct Address *first = TAILQ_FIRST(al);
130 struct Address *second = TAILQ_NEXT(first, entries);
131 if (!second && !first->personal)
132 {
133 first->personal = buf_new(alias->name);
134 }
136 mutt_addrlist_to_intl(al, NULL);
137 }
139 return true;
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
int mutt_addrlist_to_intl(struct AddressList *al, char **err)
Convert an Address list to Punycode.
Definition: address.c:1293
struct Buffer * buf_new(const char *str)
Allocate a new Buffer.
Definition: buffer.c:304
#define TAILQ_FIRST(head)
Definition: queue.h:723
#define TAILQ_NEXT(elm, field)
Definition: queue.h:832
#define TAILQ_EMPTY(head)
Definition: queue.h:721
An email address.
Definition: address.h:36
struct Buffer * personal
Real name of address.
Definition: address.h:37
char * name
Short name.
Definition: alias.h:36
struct AddressList addr
List of Addresses the Alias expands to.
Definition: alias.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ query_run()

int query_run ( const char *  s,
bool  verbose,
struct AliasList *  al,
const struct ConfigSubset sub 

Run an external program to find Addresses.

sString to match
verboseIf true, print progress messages
alAlias list to fill
subConfig items
Return values

Definition at line 273 of file dlg_query.c.

275 FILE *fp = NULL;
276 char *buf = NULL;
277 size_t buflen;
278 char *msg = NULL;
279 size_t msglen = 0;
280 char *tok = NULL;
281 char *next_tok = NULL;
282 struct Buffer *cmd = buf_pool_get();
284 const char *const c_query_command = cs_subset_string(sub, "query_command");
285 buf_file_expand_fmt_quote(cmd, c_query_command, s);
287 pid_t pid = filter_create(buf_string(cmd), NULL, &fp, NULL, EnvList);
288 if (pid < 0)
289 {
290 mutt_debug(LL_DEBUG1, "unable to fork command: %s\n", buf_string(cmd));
291 buf_pool_release(&cmd);
292 return -1;
293 }
294 buf_pool_release(&cmd);
296 if (verbose)
297 mutt_message(_("Waiting for response..."));
299 /* The query protocol first reads one NL-terminated line. If an error
300 * occurs, this is assumed to be an error message. Otherwise it's ignored. */
301 msg = mutt_file_read_line(msg, &msglen, fp, NULL, MUTT_RL_NO_FLAGS);
302 while ((buf = mutt_file_read_line(buf, &buflen, fp, NULL, MUTT_RL_NO_FLAGS)))
303 {
304 tok = buf;
305 next_tok = strchr(tok, '\t');
306 if (next_tok)
307 *next_tok++ = '\0';
309 if (*tok == '\0')
310 continue;
312 struct Alias *alias = alias_new();
314 mutt_addrlist_parse(&alias->addr, tok);
316 if (next_tok)
317 {
318 tok = next_tok;
319 next_tok = strchr(tok, '\t');
320 if (next_tok)
321 *next_tok++ = '\0';
323 alias->name = mutt_str_dup(tok);
324 parse_alias_comments(alias, next_tok);
325 }
327 TAILQ_INSERT_TAIL(al, alias, entries);
328 }
330 FREE(&buf);
331 mutt_file_fclose(&fp);
332 if (filter_wait(pid))
333 {
334 mutt_debug(LL_DEBUG1, "Error: %s\n", msg);
335 if (verbose)
336 mutt_error("%s", msg);
337 }
338 else
339 {
340 if (verbose)
341 mutt_message("%s", msg);
342 }
343 FREE(&msg);
345 return 0;
int mutt_addrlist_parse(struct AddressList *al, const char *s)
Parse a list of email addresses.
Definition: address.c:480
void parse_alias_comments(struct Alias *alias, const char *com)
Parse the alias/query comment field.
Definition: commands.c:95
struct Alias * alias_new(void)
Create a new Alias.
Definition: alias.c:660
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:291
char * mutt_file_read_line(char *line, size_t *size, FILE *fp, int *line_num, ReadLineFlags flags)
Read a line from a file.
Definition: file.c:808
void buf_file_expand_fmt_quote(struct Buffer *dest, const char *fmt, const char *src)
Replace s in a string with a filename.
Definition: file.c:1456
#define mutt_file_fclose(FP)
Definition: file.h:149
No flags are set.
Definition: file.h:40
char ** EnvList
Private copy of the environment variables.
Definition: globals.c:76
#define mutt_error(...)
Definition: logging2.h:92
#define mutt_message(...)
Definition: logging2.h:91
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
Log at debug level 1.
Definition: logging2.h:43
#define FREE(x)
Definition: memory.h:45
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
Definition: filter.c:220
pid_t filter_create(const char *cmd, FILE **fp_in, FILE **fp_out, FILE **fp_err, char **envlist)
Set up filter program.
Definition: filter.c:209
#define _(a)
Definition: message.h:28
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:253
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_INSERT_TAIL(head, elm, field)
Definition: queue.h:809
A shortcut for an email address or addresses.
Definition: alias.h:35
String manipulation buffer.
Definition: buffer.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ query_dialog_new()

static struct MuttWindow * query_dialog_new ( struct AliasMenuData mdata,
const char *  query 

Create an Query Selection Dialog.

mdataMenu data holding Aliases
queryInitial query string
Return values
ptrNew Dialog

Definition at line 380 of file dlg_query.c.

384 struct Menu *menu = dlg->wdata;
387 menu->tag = query_tag;
388 menu->max = ARRAY_SIZE(&mdata->ava);
389 mdata->title = mutt_str_dup(_("Query"));
390 menu->mdata = mdata;
391 menu->mdata_free = NULL; // Menu doesn't own the data
393 struct MuttWindow *win_menu = menu->win;
395 // Override the Simple Dialog's recalc()
396 win_menu->recalc = alias_recalc;
398 char title[256] = { 0 };
399 snprintf(title, sizeof(title), "%s: %s", mdata->title, query);
400 struct MuttWindow *sbar = window_find_child(dlg, WT_STATUS_BAR);
401 sbar_set_title(sbar, title);
403 // NT_COLOR is handled by the SimpleDialog
407 return dlg;
#define ARRAY_SIZE(head)
The number of elements stored.
Definition: array.h:87
static const struct Mapping QueryHelp[]
Help Bar for the Address Query dialog.
Definition: dlg_query.c:101
static int query_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_query.c:231
static int query_tag(struct Menu *menu, int sel, int act)
Tag an entry in the Query Menu - Implements Menu::tag() -.
Definition: dlg_query.c:252
static int query_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition: dlg_query.c:351
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
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:532
Query Dialog, dlg_query()
Definition: mutt_window.h:90
Status Bar containing extra info about the Index/Pager/etc.
Definition: mutt_window.h:101
MuttWindow has changed, NotifyWindow, EventWindow.
Definition: notify_type.h:57
Config has changed, NotifyConfig, EventConfig.
Definition: notify_type.h:43
void sbar_set_title(struct MuttWindow *win, const char *title)
Set the title for the Simple Bar.
Definition: sbar.c:227
char * title
Title for the status bar.
Definition: gui.h:62
struct Notify * notify
Notifications: NotifyConfig, EventConfig.
Definition: subset.h:52
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
void * wdata
Private data.
Definition: mutt_window.h:144
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:137
int(* recalc)(struct MuttWindow *win)
Definition: mutt_window.h:172
Container for Accounts, Notifications.
Definition: neomutt.h:42
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:46
Select from results of external query.
Definition: type.h:55
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ query_complete()

int query_complete ( struct Buffer buf,
struct ConfigSubset sub 

Perform auto-complete using an Address Query.

bufBuffer for completion
subConfig item
Return values

Definition at line 480 of file dlg_query.c.

482 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
483 mdata.search_state = search_state_new();
485 struct AliasList al = TAILQ_HEAD_INITIALIZER(al);
486 const char *const c_query_command = cs_subset_string(sub, "query_command");
487 if (!c_query_command)
488 {
489 mutt_warning(_("Query command not defined"));
490 goto done;
491 }
493 query_run(buf_string(buf), true, &al, sub);
494 if (TAILQ_EMPTY(&al))
495 goto done;
497 = &al;
499 struct Alias *a_first = TAILQ_FIRST(&al);
500 if (!TAILQ_NEXT(a_first, entries)) // only one response?
501 {
502 struct AddressList addr = TAILQ_HEAD_INITIALIZER(addr);
503 if (alias_to_addrlist(&addr, a_first))
504 {
506 buf_reset(buf);
507 mutt_addrlist_write(&addr, buf, false);
508 mutt_addrlist_clear(&addr);
510 }
511 goto done;
512 }
514 struct Alias *np = NULL;
515 TAILQ_FOREACH(np,, entries)
516 {
517 alias_array_alias_add(&mdata.ava, np);
518 }
520 /* multiple results, choose from query menu */
521 if (!dlg_query(buf, &mdata))
522 goto done;
524 buf_reset(buf);
525 buf_alloc(buf, 8192);
526 bool first = true;
527 struct AliasView *avp = NULL;
528 ARRAY_FOREACH(avp, &mdata.ava)
529 {
530 if (!avp->is_tagged)
531 continue;
533 if (!first)
534 {
535 buf_addstr(buf, ", ");
536 }
538 first = false;
539 struct AddressList al_copy = TAILQ_HEAD_INITIALIZER(al_copy);
540 if (alias_to_addrlist(&al_copy, avp->alias))
541 {
542 mutt_addrlist_to_local(&al_copy);
543 mutt_addrlist_write(&al_copy, buf, false);
544 mutt_addrlist_clear(&al_copy);
545 }
546 }
549 ARRAY_FREE(&mdata.ava);
550 FREE(&mdata.title);
551 FREE(&mdata.limit);
553 aliaslist_clear(&al);
554 return 0;
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
Definition: address.c:1460
int mutt_addrlist_to_local(struct AddressList *al)
Convert an Address list from Punycode.
Definition: address.c:1378
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 aliaslist_clear(struct AliasList *al)
Empty a List of Aliases.
Definition: alias.c:697
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:212
#define ARRAY_FREE(head)
Release all memory.
Definition: array.h:204
Static initializer for arrays.
Definition: array.h:58
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:76
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition: buffer.c:226
void buf_alloc(struct Buffer *buf, size_t new_size)
Make sure a buffer can store at least new_size bytes.
Definition: buffer.c:337
int query_run(const char *s, bool verbose, struct AliasList *al, const struct ConfigSubset *sub)
Run an external program to find Addresses.
Definition: dlg_query.c:273
bool alias_to_addrlist(struct AddressList *al, struct Alias *alias)
Turn an Alias into an AddressList.
Definition: dlg_query.c:121
static bool dlg_query(struct Buffer *buf, struct AliasMenuData *mdata)
Get the user to enter an Address Query -.
Definition: dlg_query.c:421
#define mutt_warning(...)
Definition: logging2.h:90
void mutt_clear_error(void)
Clear the message line (bottom line of screen)
Definition: mutt_logging.c:74
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:725
Definition: queue.h:637
void search_state_free(struct SearchState **ptr)
Free a SearchState.
Definition: search_state.c:51
struct SearchState * search_state_new(void)
Create a new SearchState.
Definition: search_state.c:39
AliasView array wrapper with Pattern information -.
Definition: gui.h:54
char * limit
Limit being used.
Definition: gui.h:60
struct AliasViewArray ava
All Aliases/Queries.
Definition: gui.h:55
struct SearchState * search_state
State of the current search.
Definition: gui.h:63
struct AliasList * al
Alias data.
Definition: gui.h:56
struct ConfigSubset * sub
Config items.
Definition: gui.h:57
GUI data wrapping an Alias.
Definition: gui.h:38
struct Alias * alias
Definition: gui.h:46
bool is_tagged
Is it tagged?
Definition: gui.h:43
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ query_index()

void query_index ( struct Mailbox m,
struct ConfigSubset sub 

Perform an Alias Query and display the results.

subConfig item

Definition at line 562 of file dlg_query.c.

564 const char *const c_query_command = cs_subset_string(sub, "query_command");
565 if (!c_query_command)
566 {
567 mutt_warning(_("Query command not defined"));
568 return;
569 }
571 struct AliasList al = TAILQ_HEAD_INITIALIZER(al);
572 struct AliasMenuData mdata = { ARRAY_HEAD_INITIALIZER, NULL, sub };
573 = &al;
574 mdata.search_state = search_state_new();
576 struct Buffer *buf = buf_pool_get();
577 if ((mw_get_field(_("Query: "), buf, MUTT_COMP_NO_FLAGS, HC_OTHER, NULL, NULL) != 0) ||
578 buf_is_empty(buf))
579 {
580 goto done;
581 }
583 query_run(buf_string(buf), false, &al, sub);
584 if (TAILQ_EMPTY(&al))
585 goto done;
587 struct Alias *np = NULL;
588 TAILQ_FOREACH(np,, entries)
589 {
590 alias_array_alias_add(&mdata.ava, np);
591 }
593 if (!dlg_query(buf, &mdata))
594 goto done;
596 // Prepare the "To:" field of a new email
597 struct Email *e = email_new();
598 e->env = mutt_env_new();
600 struct AliasView *avp = NULL;
601 ARRAY_FOREACH(avp, &mdata.ava)
602 {
603 if (!avp->is_tagged)
604 continue;
606 struct AddressList al_copy = TAILQ_HEAD_INITIALIZER(al_copy);
607 if (alias_to_addrlist(&al_copy, avp->alias))
608 {
609 mutt_addrlist_copy(&e->env->to, &al_copy, false);
610 mutt_addrlist_clear(&al_copy);
611 }
612 }
614 mutt_send_message(SEND_REVIEW_TO, e, NULL, m, NULL, sub);
617 ARRAY_FREE(&mdata.ava);
618 FREE(&mdata.title);
619 FREE(&mdata.limit);
621 aliaslist_clear(&al);
622 buf_pool_release(&buf);
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
Definition: buffer.c:291
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:46
int mw_get_field(const char *prompt, struct Buffer *buf, CompletionFlags complete, enum HistoryClass hclass, const struct CompleteOps *comp_api, void *cdata)
Ask the user for a string -.
Definition: window.c:274
Miscellaneous strings.
Definition: lib.h:56
No flags are set.
Definition: mutt.h:56
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:2099
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

◆ QueryRenderData

const struct ExpandoRenderData QueryRenderData
Initial value:
= {
{ -1, -1, NULL, NULL },
Alias ED_ALI_ ExpandoDataAlias.
Definition: domain.h:35
long query_t_num(const struct ExpandoNode *node, void *data, MuttFormatFlags flags)
Query: Tagged char - Implements ExpandoRenderData::get_number() -.
Definition: dlg_query.c:196
long query_c_num(const struct ExpandoNode *node, void *data, MuttFormatFlags flags)
Query: Index number - Implements ExpandoRenderData::get_number() -.
Definition: dlg_query.c:160
void query_a(const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
Query: Address - Implements ExpandoRenderData::get_string() -.
Definition: dlg_query.c:145
void query_Y(const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
Query: Tags - Implements ExpandoRenderData::get_string() -.
Definition: dlg_query.c:218
void query_t(const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
Query: Tagged char - Implements ExpandoRenderData::get_string() -.
Definition: dlg_query.c:205
void query_n(const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
Query: Name - Implements ExpandoRenderData::get_string() -.
Definition: dlg_query.c:183
void query_e(const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
Query: Extra information - Implements ExpandoRenderData::get_string() -.
Definition: dlg_query.c:170
Definition: gui.h:77
Definition: gui.h:76
Definition: gui.h:73
Definition: gui.h:74
Definition: gui.h:78
Definition: gui.h:79

Callbacks for Query Expandos.

See also
QueryFormatDef, ExpandoDataAlias, ExpandoDataGlobal

Definition at line 98 of file dlg_query.c.

◆ QueryHelp

const struct Mapping QueryHelp[]
Initial value:
= {
{ N_("Exit"), OP_EXIT },
{ N_("Mail"), OP_MAIL },
{ N_("New Query"), OP_QUERY },
{ N_("Make Alias"), OP_CREATE_ALIAS },
{ N_("Sort"), OP_SORT },
{ N_("Rev-Sort"), OP_SORT_REVERSE },
{ N_("Search"), OP_SEARCH },
{ N_("Help"), OP_HELP },
{ NULL, 0 },
#define N_(a)
Definition: message.h:32

Help Bar for the Address Query dialog.

Definition at line 101 of file dlg_query.c.