NeoMutt  2025-01-09-117-gace867
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
lib.h File Reference

Manage keymappings. More...

#include "config.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "mutt/lib.h"
#include "core/lib.h"
#include "menu/lib.h"
+ Include dependency graph for lib.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  Keymap
 A keyboard mapping. More...
 
struct  KeyEvent
 An event such as a keypress. More...
 
struct  BindingInfo
 Info about one keybinding. More...
 
struct  MenuFuncOp
 Mapping between a function and an operation. More...
 
struct  MenuOpSeq
 Mapping between an operation and a key sequence. More...
 
struct  EventBinding
 A key binding Event. More...
 

Macros

#define MUTT_UNBIND   (1 << 0)
 Parse 'unbind' command.
 
#define MUTT_UNMACRO   (1 << 1)
 Parse 'unmacro' command.
 
#define GETCH_NO_FLAGS   0
 No flags are set.
 
#define GETCH_IGNORE_MACRO   (1 << 0)
 Don't use MacroEvents.
 

Typedefs

typedef uint8_t GetChFlags
 Flags for mutt_getch(), e.g. GETCH_NO_FLAGS.
 
typedef short keycode_t
 Type for key storage, the rest of neomutt works fine with int type.
 

Enumerations

enum  NotifyBinding {
  NT_BINDING_ADD = 1 , NT_BINDING_DELETE , NT_BINDING_DELETE_ALL , NT_MACRO_ADD ,
  NT_MACRO_DELETE , NT_MACRO_DELETE_ALL
}
 Key Binding notification types. More...
 

Functions

 STAILQ_HEAD (KeymapList, Keymap)
 
 ARRAY_HEAD (KeyEventArray, struct KeyEvent)
 
 ARRAY_HEAD (BindingInfoArray, struct BindingInfo)
 
void km_init (void)
 Initialise all the menu keybindings.
 
void init_extended_keys (void)
 Initialise map of ncurses extended keys.
 
int main_config_observer (struct NotifyCallback *nc)
 Notification that a Config Variable has changed - Implements observer_t -.
 
void mutt_init_abort_key (void)
 Parse the abort_key config string.
 
void mutt_keys_cleanup (void)
 Free the key maps.
 
enum CommandResult km_bind (char *s, enum MenuType menu, int op, char *macro, char *desc)
 Bind a key to a macro.
 
enum CommandResult parse_bind (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'bind' command - Implements Command::parse() -.
 
enum CommandResult parse_exec (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'exec' command - Implements Command::parse() -.
 
enum CommandResult parse_macro (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'macro' command - Implements Command::parse() -.
 
enum CommandResult parse_push (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'push' command - Implements Command::parse() -.
 
enum CommandResult parse_unbind (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse the 'unbind' command - Implements Command::parse() -.
 
int km_dokey (enum MenuType menu, GetChFlags flags)
 Determine what a keypress should do.
 
struct KeyEvent km_dokey_event (enum MenuType menu, GetChFlags flags)
 Determine what a keypress should do.
 
void km_error_key (enum MenuType menu)
 Handle an unbound key sequence.
 
void mutt_flush_macro_to_endcond (void)
 Drop a macro from the input buffer.
 
bool km_expand_key (struct Keymap *map, struct Buffer *buf)
 Get the key string bound to a Keymap.
 
void km_expand_key_string (char *str, struct Buffer *buf)
 Get a human-readable key string.
 
struct Keymapkm_find_func (enum MenuType menu, int func)
 Find a function's mapping in a Menu.
 
const struct MenuFuncOpkm_get_table (enum MenuType mtype)
 Lookup a Menu's functions.
 
void km_keyname (int c, struct Buffer *buf)
 Get the human name for a key.
 
struct Keymapalloc_keys (size_t len, keycode_t *keys)
 Allocate space for a sequence of keys.
 
enum CommandResult dump_bind_macro (struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
 Parse 'bind' and 'macro' commands - Implements Command::parse() -.
 
void generic_tokenize_push_string (char *s)
 Parse and queue a 'push' command.
 
int get_op (const struct MenuFuncOp *funcs, const char *start, size_t len)
 Get the function by its name.
 
enum CommandResult km_bindkey (const char *s, enum MenuType mtype, int op)
 Bind a key in a Menu to an operation.
 
struct Keymapkm_compare_keys (struct Keymap *k1, struct Keymap *k2, size_t *pos)
 Compare two keymaps' keyscodes and return the bigger one.
 
const char * mutt_get_func (const struct MenuFuncOp *bindings, int op)
 Get the name of a function.
 
void mutt_keymap_free (struct Keymap **ptr)
 Free a Keymap.
 
int parse_fkey (char *s)
 Parse a function key string.
 
size_t parsekeys (const char *str, keycode_t *d, size_t max)
 Parse a key string into key codes.
 
int measure_column (struct BindingInfoArray *bia, int col)
 Measure one column of a table.
 
void gather_menu (enum MenuType menu, struct BindingInfoArray *bia_bind, struct BindingInfoArray *bia_macro)
 Gather info about one menu.
 
int gather_unbound (const struct MenuFuncOp *funcs, const struct KeymapList *km_menu, const struct KeymapList *km_aux, struct BindingInfoArray *bia_unbound)
 Gather info about unbound functions for one menu.
 
int binding_sort (const void *a, const void *b, void *sdata)
 Compare two BindingInfo by their keybinding - Implements sort_t -.
 

Variables

struct KeyEventArray MacroEvents
 These are used for macros and exec/push commands.
 
struct KeymapList Keymaps []
 Array of Keymap keybindings, one for each Menu.
 
struct Mapping KeyNames []
 Key name lookup table.
 
keycode_t AbortKey
 key to abort edits etc, normally Ctrl-G
 
const struct Mapping Menus []
 

Detailed Description

Manage keymappings.

Authors
  • Richard Russon

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 lib.h.

Macro Definition Documentation

◆ MUTT_UNBIND

#define MUTT_UNBIND   (1 << 0)

Parse 'unbind' command.

Definition at line 48 of file lib.h.

◆ MUTT_UNMACRO

#define MUTT_UNMACRO   (1 << 1)

Parse 'unmacro' command.

Definition at line 49 of file lib.h.

◆ GETCH_NO_FLAGS

#define GETCH_NO_FLAGS   0

No flags are set.

Definition at line 52 of file lib.h.

◆ GETCH_IGNORE_MACRO

#define GETCH_IGNORE_MACRO   (1 << 0)

Don't use MacroEvents.

Definition at line 53 of file lib.h.

Typedef Documentation

◆ GetChFlags

typedef uint8_t GetChFlags

Flags for mutt_getch(), e.g. GETCH_NO_FLAGS.

Definition at line 51 of file lib.h.

◆ keycode_t

typedef short keycode_t

Type for key storage, the rest of neomutt works fine with int type.

Definition at line 56 of file lib.h.

Enumeration Type Documentation

◆ NotifyBinding

Key Binding notification types.

Observers of NT_BINDING will be passed an EventBinding.

Note
Notifications are sent after the event.
Enumerator
NT_BINDING_ADD 

Key binding has been added.

NT_BINDING_DELETE 

Key binding has been deleted.

NT_BINDING_DELETE_ALL 

All key bindings have been deleted.

NT_MACRO_ADD 

Key macro has been added.

NT_MACRO_DELETE 

Key macro has been deleted.

NT_MACRO_DELETE_ALL 

All key macros have been deleted.

Definition at line 143 of file lib.h.

144{
145 NT_BINDING_ADD = 1,
148
152};
@ NT_MACRO_ADD
Key macro has been added.
Definition: lib.h:149
@ NT_MACRO_DELETE
Key macro has been deleted.
Definition: lib.h:150
@ NT_MACRO_DELETE_ALL
All key macros have been deleted.
Definition: lib.h:151
@ NT_BINDING_DELETE
Key binding has been deleted.
Definition: lib.h:146
@ NT_BINDING_ADD
Key binding has been added.
Definition: lib.h:145
@ NT_BINDING_DELETE_ALL
All key bindings have been deleted.
Definition: lib.h:147

Function Documentation

◆ STAILQ_HEAD()

STAILQ_HEAD ( KeymapList  ,
Keymap   
)

◆ ARRAY_HEAD() [1/2]

ARRAY_HEAD ( KeyEventArray  ,
struct KeyEvent   
)

◆ ARRAY_HEAD() [2/2]

ARRAY_HEAD ( BindingInfoArray  ,
struct BindingInfo   
)

◆ km_init()

void km_init ( void  )

Initialise all the menu keybindings.

Definition at line 176 of file init.c.

177{
178 memset(Keymaps, 0, sizeof(struct KeymapList) * MENU_MAX);
179
182#ifdef USE_AUTOCRYPT
184#endif
196}
const struct MenuOpSeq GenericDefaultBindings[]
Key bindings for the Generic Menu.
Definition: functions.c:139
const struct MenuOpSeq DialogDefaultBindings[]
Key bindings for Simple Dialogs.
Definition: functions.c:131
const struct MenuOpSeq AttachmentDefaultBindings[]
Key bindings for the Attachment Menu.
Definition: functions.c:98
const struct MenuOpSeq EditorDefaultBindings[]
Key bindings for the Editor Menu.
Definition: functions.c:88
const struct MenuOpSeq QueryDefaultBindings[]
Key bindings for the external Query Menu.
Definition: functions.c:110
const struct MenuOpSeq PostponedDefaultBindings[]
Key bindings for the Postpone Menu.
Definition: functions.c:62
const struct MenuOpSeq BrowserDefaultBindings[]
Key bindings for the file Browser Menu.
Definition: functions.c:106
const struct MenuOpSeq AliasDefaultBindings[]
Key bindings for the Alias Menu.
Definition: functions.c:93
const struct MenuOpSeq PagerDefaultBindings[]
Key bindings for the Pager Menu.
Definition: functions.c:229
const struct MenuOpSeq IndexDefaultBindings[]
Key bindings for the Index Menu.
Definition: functions.c:235
const struct MenuOpSeq AutocryptDefaultBindings[]
Key bindings for the Autocrypt Account.
Definition: functions.c:68
static void create_bindings(const struct MenuOpSeq *map, enum MenuType mtype)
Attach a set of keybindings to a Menu.
Definition: init.c:164
const struct MenuOpSeq PgpDefaultBindings[]
Key bindings for the Pgp Menu.
Definition: functions.c:64
const struct MenuOpSeq ComposeDefaultBindings[]
Key bindings for the Compose Menu.
Definition: functions.c:155
const struct MenuOpSeq SmimeDefaultBindings[]
Key bindings for the Smime Menu.
Definition: functions.c:74
struct KeymapList Keymaps[MENU_MAX]
Array of key mappings, one for each MenuType.
Definition: lib.c:124
@ MENU_INDEX
Index panel (list of emails)
Definition: type.h:47
@ MENU_DIALOG
Simple Dialog.
Definition: type.h:43
@ MENU_QUERY
Select from results of external query.
Definition: type.h:51
@ MENU_AUTOCRYPT
Autocrypt Account menu.
Definition: type.h:40
@ MENU_COMPOSE
Compose an email.
Definition: type.h:42
@ MENU_ATTACHMENT
Select an attachment.
Definition: type.h:38
@ MENU_PGP
PGP encryption menu.
Definition: type.h:49
@ MENU_GENERIC
Generic selection list.
Definition: type.h:46
@ MENU_PAGER
Pager pager (email viewer)
Definition: type.h:48
@ MENU_SMIME
SMIME encryption menu.
Definition: type.h:52
@ MENU_MAX
Definition: type.h:53
@ MENU_EDITOR
Text entry area.
Definition: type.h:44
@ MENU_ALIAS
Select an email address by its alias.
Definition: type.h:37
@ MENU_FOLDER
General file/mailbox browser.
Definition: type.h:45
@ MENU_POSTPONED
Select a postponed email.
Definition: type.h:50
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_extended_keys()

void init_extended_keys ( void  )

Initialise map of ncurses extended keys.

Determine the keycodes for ncurses extended keys and fill in the KeyNames array.

This function must be called after initscr(), or mutt_tigetstr() fails. This creates a bit of a chicken-and-egg problem because km_init() is called prior to start_curses(). This means that the default keybindings can't include any of the extended keys because they won't be defined until later.

Definition at line 133 of file init.c.

134{
135#ifdef HAVE_USE_EXTENDED_NAMES
136 use_extended_names(true);
137
138 for (int j = 0; KeyNames[j].name; j++)
139 {
140 if (KeyNames[j].value == -1)
141 {
142 const char *keyname = find_ext_name(KeyNames[j].name);
143
144 if (keyname)
145 {
146 const char *s = mutt_tigetstr((char *) keyname);
147 if (s && ((long) (s) != -1))
148 {
149 int code = key_defined(s);
150 if (code > 0)
151 KeyNames[j].value = code;
152 }
153 }
154 }
155 }
156#endif
157}
static const char * find_ext_name(const char *key)
Find the curses name for a key.
Definition: init.c:113
struct Mapping KeyNames[]
Key name lookup table.
Definition: lib.c:59
int value
Integer value.
Definition: mapping.h:35
const char * name
String value.
Definition: mapping.h:34
const char * mutt_tigetstr(const char *name)
Get terminal capabilities.
Definition: terminal.c:57
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_init_abort_key()

void mutt_init_abort_key ( void  )

Parse the abort_key config string.

Parse the string into $abort_key and put the keycode into AbortKey.

Definition at line 228 of file init.c.

229{
230 keycode_t buf[2];
231 const char *const c_abort_key = cs_subset_string(NeoMutt->sub, "abort_key");
232 size_t len = parsekeys(c_abort_key, buf, mutt_array_size(buf));
233 if (len == 0)
234 {
235 mutt_error(_("Abort key is not set, defaulting to Ctrl-G"));
236 AbortKey = ctrl('G');
237 return;
238 }
239 if (len > 1)
240 {
241 mutt_warning(_("Specified abort key sequence (%s) will be truncated to first key"),
242 c_abort_key);
243 }
244 AbortKey = buf[0];
245}
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:291
#define mutt_warning(...)
Definition: logging2.h:91
#define mutt_error(...)
Definition: logging2.h:93
keycode_t AbortKey
code of key to abort prompts, normally Ctrl-G
Definition: lib.c:121
size_t parsekeys(const char *str, keycode_t *d, size_t max)
Parse a key string into key codes.
Definition: lib.c:215
short keycode_t
Type for key storage, the rest of neomutt works fine with int type.
Definition: lib.h:56
#define mutt_array_size(x)
Definition: memory.h:38
#define _(a)
Definition: message.h:28
#define ctrl(ch)
Definition: mutt_curses.h:52
Container for Accounts, Notifications.
Definition: neomutt.h:43
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_keys_cleanup()

void mutt_keys_cleanup ( void  )

Free the key maps.

Definition at line 215 of file init.c.

216{
217 for (enum MenuType i = 1; i < MENU_MAX; i++)
218 {
220 }
221}
static void mutt_keymaplist_free(struct KeymapList *km_list)
Free a List of Keymaps.
Definition: init.c:202
MenuType
Types of GUI selections.
Definition: type.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_bind()

enum CommandResult km_bind ( char *  s,
enum MenuType  mtype,
int  op,
char *  macro,
char *  desc 
)

Bind a key to a macro.

Parameters
sKey string
mtypeMenu type, e.g. MENU_EDITOR
opOperation, e.g. OP_DELETE
macroMacro string
descDescription of macro (OPTIONAL)
Return values
CommandResultResult e.g. MUTT_CMD_SUCCESS

Definition at line 165 of file parse.c.

166{
167 return km_bind_err(s, mtype, op, macro, desc, NULL);
168}
static enum CommandResult km_bind_err(const char *s, enum MenuType mtype, int op, char *macro, char *desc, struct Buffer *err)
Set up a key binding.
Definition: parse.c:58
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_dokey()

int km_dokey ( enum MenuType  mtype,
GetChFlags  flags 
)

Determine what a keypress should do.

Parameters
mtypeMenu type, e.g. MENU_EDITOR
flagsFlags, e.g. GETCH_IGNORE_MACRO
Return values
>0Function to execute
OP_NULLNo function bound to key sequence
-1Error occurred while reading input
-2A timeout or sigwinch occurred

Definition at line 537 of file get.c.

538{
539 return km_dokey_event(mtype, flags).op;
540}
struct KeyEvent km_dokey_event(enum MenuType mtype, GetChFlags flags)
Determine what a keypress should do.
Definition: get.c:419
int op
Function opcode, e.g. OP_HELP.
Definition: lib.h:83
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_dokey_event()

struct KeyEvent km_dokey_event ( enum MenuType  mtype,
GetChFlags  flags 
)

Determine what a keypress should do.

Parameters
mtypeMenu type, e.g. MENU_EDITOR
flagsFlags, e.g. GETCH_IGNORE_MACRO
Return values
ptrEvent

Definition at line 419 of file get.c.

420{
421 struct KeyEvent event = { 0, OP_NULL };
422 struct Keymap *map = STAILQ_FIRST(&Keymaps[mtype]);
423 int pos = 0;
424 int n = 0;
425
426 if (!map && (mtype != MENU_EDITOR))
427 return retry_generic(mtype, NULL, 0, 0, flags);
428
429 while (true)
430 {
431 event = mutt_getch(flags);
432
433 // abort, timeout, repaint
434 if (event.op < OP_NULL)
435 return event;
436
437 /* do we have an op already? */
438 if (event.op != OP_NULL)
439 {
440 const char *func = NULL;
441 const struct MenuFuncOp *funcs = NULL;
442
443 /* is this a valid op for this menu type? */
444 if ((funcs = km_get_table(mtype)) && (func = mutt_get_func(funcs, event.op)))
445 return event;
446
447 if ((mtype != MENU_EDITOR) && (mtype != MENU_PAGER) && (mtype != MENU_GENERIC))
448 {
449 /* check generic menu type */
450 funcs = OpGeneric;
451 func = mutt_get_func(funcs, event.op);
452 if (func)
453 return event;
454 }
455
456 /* Sigh. Valid function but not in this context.
457 * Find the literal string and push it back */
458 for (int i = 0; MenuNames[i].name; i++)
459 {
460 funcs = km_get_table(MenuNames[i].value);
461 if (funcs)
462 {
463 func = mutt_get_func(funcs, event.op);
464 if (func)
465 {
466 mutt_unget_ch('>');
467 mutt_unget_string(func);
468 mutt_unget_ch('<');
469 break;
470 }
471 }
472 }
473 /* continue to chew */
474 if (func)
475 continue;
476 }
477
478 if (!map)
479 return event;
480
481 /* Nope. Business as usual */
482 while (event.ch > map->keys[pos])
483 {
484 if ((pos > map->eq) || !STAILQ_NEXT(map, entries))
485 return retry_generic(mtype, map->keys, pos, event.ch, flags);
486 map = STAILQ_NEXT(map, entries);
487 }
488
489 if (event.ch != map->keys[pos])
490 return retry_generic(mtype, map->keys, pos, event.ch, flags);
491
492 if (++pos == map->len)
493 {
494 if (map->op != OP_MACRO)
495 return (struct KeyEvent) { event.ch, map->op };
496
497 /* #GETCH_IGNORE_MACRO turns off processing the MacroEvents buffer
498 * in mutt_getch(). Generating new macro events during that time would
499 * result in undesired behavior once the option is turned off.
500 *
501 * Originally this returned -1, however that results in an unbuffered
502 * username or password prompt being aborted. Returning OP_NULL allows
503 * mw_get_field() to display the keybinding pressed instead.
504 *
505 * It may be unexpected for a macro's keybinding to be returned,
506 * but less so than aborting the prompt. */
507 if (flags & GETCH_IGNORE_MACRO)
508 {
509 return (struct KeyEvent) { event.ch, OP_NULL };
510 }
511
512 if (n++ == 10)
513 {
515 mutt_error(_("Macro loop detected"));
516 return (struct KeyEvent) { '\0', OP_ABORT };
517 }
518
520 map = STAILQ_FIRST(&Keymaps[mtype]);
521 pos = 0;
522 }
523 }
524
525 /* not reached */
526}
void generic_tokenize_push_string(char *s)
Parse and queue a 'push' command.
Definition: get.c:348
void mutt_flushinp(void)
Empty all the keyboard buffers.
Definition: get.c:58
void mutt_unget_string(const char *s)
Return a string to the input buffer.
Definition: get.c:137
struct KeyEvent mutt_getch(GetChFlags flags)
Read a character from the input buffer.
Definition: get.c:210
void mutt_unget_ch(int ch)
Return a keystroke to the input buffer.
Definition: get.c:115
static struct KeyEvent retry_generic(enum MenuType mtype, keycode_t *keys, int keyslen, int lastkey, GetChFlags flags)
Try to find the key in the generic menu bindings.
Definition: get.c:321
const struct MenuFuncOp OpGeneric[]
Functions for the Generic Menu.
Definition: functions.c:69
const char * mutt_get_func(const struct MenuFuncOp *funcs, int op)
Get the name of a function.
Definition: lib.c:320
const struct MenuFuncOp * km_get_table(enum MenuType mtype)
Lookup a Menu's functions.
Definition: lib.c:557
#define GETCH_IGNORE_MACRO
Don't use MacroEvents.
Definition: lib.h:53
#define OP_ABORT
$abort_key pressed (Ctrl-G)
Definition: opcodes.h:37
#define STAILQ_FIRST(head)
Definition: queue.h:388
#define STAILQ_NEXT(elm, field)
Definition: queue.h:439
An event such as a keypress.
Definition: lib.h:81
int ch
Raw key pressed.
Definition: lib.h:82
A keyboard mapping.
Definition: lib.h:66
keycode_t * keys
key sequence
Definition: lib.h:72
char * macro
Macro expansion (op == OP_MACRO)
Definition: lib.h:67
short eq
Number of leading keys equal to next entry.
Definition: lib.h:70
short len
Length of key sequence (unit: sizeof (keycode_t))
Definition: lib.h:71
short op
Operation to perform.
Definition: lib.h:69
Mapping between a function and an operation.
Definition: lib.h:112
const struct Mapping MenuNames[]
Menu name lookup table.
Definition: type.c:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_error_key()

void km_error_key ( enum MenuType  mtype)

Handle an unbound key sequence.

Parameters
mtypeMenu type, e.g. MENU_PAGER

Definition at line 294 of file get.c.

295{
296 struct Keymap *key = km_find_func(mtype, OP_HELP);
297 if (!key && (mtype != MENU_EDITOR) && (mtype != MENU_PAGER))
298 key = km_find_func(MENU_GENERIC, OP_HELP);
299
300 if (!key)
301 {
302 mutt_error(_("Key is not bound"));
303 return;
304 }
305
306 struct Buffer *buf = buf_pool_get();
307 km_expand_key(key, buf);
308 mutt_error(_("Key is not bound. Press '%s' for help."), buf_string(buf));
309 buf_pool_release(&buf);
310}
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
struct Keymap * km_find_func(enum MenuType mtype, int func)
Find a function's mapping in a Menu.
Definition: lib.c:541
bool km_expand_key(struct Keymap *map, struct Buffer *buf)
Get the key string bound to a Keymap.
Definition: lib.c:509
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
String manipulation buffer.
Definition: buffer.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_flush_macro_to_endcond()

void mutt_flush_macro_to_endcond ( void  )

Drop a macro from the input buffer.

All the macro text is deleted until an OP_END_COND command, or the buffer is empty.

Definition at line 166 of file get.c.

167{
169}
struct KeyEventArray MacroEvents
These are used for macros and exec/push commands.
Definition: get.c:49
static void array_to_endcond(struct KeyEventArray *a)
Clear the array until an OP_END_COND.
Definition: get.c:98
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_expand_key()

bool km_expand_key ( struct Keymap map,
struct Buffer buf 
)

Get the key string bound to a Keymap.

Parameters
[in]mapKeybinding map
[out]bufBuffer for the result
Return values
trueSuccess

Definition at line 509 of file lib.c.

510{
511 if (!map || !buf)
512 return false;
513
514 for (int i = 0; i < map->len; i++)
515 {
516 km_keyname(map->keys[i], buf);
517 }
518
519 return true;
520}
void km_keyname(int c, struct Buffer *buf)
Get the human name for a key.
Definition: lib.c:465
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_expand_key_string()

void km_expand_key_string ( char *  str,
struct Buffer buf 
)

Get a human-readable key string.

Parameters
[in]strRaw key string
[out]bufBuffer for the key string

Definition at line 527 of file lib.c.

528{
529 for (; *str; str++)
530 {
531 km_keyname(*str, buf);
532 }
533}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_find_func()

struct Keymap * km_find_func ( enum MenuType  mtype,
int  func 
)

Find a function's mapping in a Menu.

Parameters
mtypeMenu type, e.g. MENU_PAGER
funcFunction, e.g. OP_DELETE
Return values
ptrKeymap for the function

Definition at line 541 of file lib.c.

542{
543 struct Keymap *np = NULL;
544 STAILQ_FOREACH(np, &Keymaps[mtype], entries)
545 {
546 if (np->op == func)
547 break;
548 }
549 return np;
550}
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:390
+ Here is the caller graph for this function:

◆ km_get_table()

const struct MenuFuncOp * km_get_table ( enum MenuType  mtype)

Lookup a Menu's functions.

Parameters
mtypeMenu type, e.g. MENU_EDITOR
Return values
ptrArray of functions

Definition at line 557 of file lib.c.

558{
559 switch (mtype)
560 {
561 case MENU_ALIAS:
562 return OpAlias;
563 case MENU_ATTACHMENT:
564 return OpAttachment;
565#ifdef USE_AUTOCRYPT
566 case MENU_AUTOCRYPT:
567 return OpAutocrypt;
568#endif
569 case MENU_COMPOSE:
570 return OpCompose;
571 case MENU_DIALOG:
572 return OpDialog;
573 case MENU_EDITOR:
574 return OpEditor;
575 case MENU_FOLDER:
576 return OpBrowser;
577 case MENU_GENERIC:
578 return OpGeneric;
579 case MENU_INDEX:
580 return OpIndex;
581 case MENU_PAGER:
582 return OpPager;
583 case MENU_PGP:
584 return OpPgp;
585 case MENU_POSTPONED:
586 return OpPostponed;
587 case MENU_QUERY:
588 return OpQuery;
589 case MENU_SMIME:
590 return OpSmime;
591 default:
592 return NULL;
593 }
594}
const struct MenuFuncOp OpDialog[]
Functions for Simple Dialogs.
Definition: functions.c:60
const struct MenuFuncOp OpQuery[]
Functions for the external Query Menu.
Definition: functions.c:76
const struct MenuFuncOp OpPostponed[]
Functions for the Postpone Menu.
Definition: functions.c:52
const struct MenuFuncOp OpIndex[]
Functions for the Index Menu.
Definition: functions.c:90
const struct MenuFuncOp OpCompose[]
Functions for the Compose Menu.
Definition: functions.c:87
const struct MenuFuncOp OpSmime[]
Functions for the Smime Menu.
Definition: functions.c:52
const struct MenuFuncOp OpBrowser[]
Functions for the file Browser Menu.
Definition: functions.c:72
const struct MenuFuncOp OpAutocrypt[]
Functions for the Autocrypt Account.
Definition: functions.c:54
const struct MenuFuncOp OpPager[]
Functions for the Pager Menu.
Definition: functions.c:71
const struct MenuFuncOp OpEditor[]
Functions for the Editor Menu.
Definition: functions.c:53
const struct MenuFuncOp OpAttachment[]
Functions for the Attachment Menu.
Definition: functions.c:62
const struct MenuFuncOp OpPgp[]
Functions for the Pgp Menu.
Definition: functions.c:42
const struct MenuFuncOp OpAlias[]
Functions for the Alias Menu.
Definition: functions.c:60
+ Here is the caller graph for this function:

◆ km_keyname()

void km_keyname ( int  c,
struct Buffer buf 
)

Get the human name for a key.

Parameters
[in]cKey code
[out]bufBuffer for the result

Definition at line 465 of file lib.c.

466{
467 const char *name = mutt_map_get_name(c, KeyNames);
468 if (name)
469 {
470 buf_addstr(buf, name);
471 return;
472 }
473
474 if ((c < 256) && (c > -128) && iscntrl((unsigned char) c))
475 {
476 if (c < 0)
477 c += 256;
478
479 if (c < 128)
480 {
481 buf_addch(buf, '^');
482 buf_addch(buf, (c + '@') & 0x7f);
483 }
484 else
485 {
486 buf_add_printf(buf, "\\%d%d%d", c >> 6, (c >> 3) & 7, c & 7);
487 }
488 }
489 else if ((c >= KEY_F0) && (c < KEY_F(256))) /* this maximum is just a guess */
490 {
491 buf_add_printf(buf, "<F%d>", c - KEY_F0);
492 }
493 else if ((c < 256) && (c >= -128) && IsPrint(c))
494 {
495 buf_add_printf(buf, "%c", (unsigned char) c);
496 }
497 else
498 {
499 buf_add_printf(buf, "<%ho>", (unsigned short) c);
500 }
501}
int buf_add_printf(struct Buffer *buf, const char *fmt,...)
Format a string appending a Buffer.
Definition: buffer.c:204
size_t buf_addch(struct Buffer *buf, char c)
Add a single character to a Buffer.
Definition: buffer.c:241
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition: buffer.c:226
const char * mutt_map_get_name(int val, const struct Mapping *map)
Lookup a string for a constant.
Definition: mapping.c:42
#define IsPrint(ch)
Definition: mbyte.h:40
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ alloc_keys()

struct Keymap * alloc_keys ( size_t  len,
keycode_t keys 
)

Allocate space for a sequence of keys.

Parameters
lenNumber of keys
keysArray of keys
Return values
ptrSequence of keys

Definition at line 149 of file lib.c.

150{
151 struct Keymap *p = MUTT_MEM_CALLOC(1, struct Keymap);
152 p->len = len;
154 memcpy(p->keys, keys, len * sizeof(keycode_t));
155 return p;
156}
#define MUTT_MEM_CALLOC(n, type)
Definition: memory.h:40
+ Here is the caller graph for this function:

◆ generic_tokenize_push_string()

void generic_tokenize_push_string ( char *  s)

Parse and queue a 'push' command.

Parameters
sString to push into the key queue

Parses s for <function> syntax and adds the whole sequence the macro buffer.

Definition at line 348 of file get.c.

349{
350 char *pp = NULL;
351 char *p = s + mutt_str_len(s) - 1;
352 size_t l;
353 int i, op = OP_NULL;
354
355 while (p >= s)
356 {
357 /* if we see something like "<PageUp>", look to see if it is a real
358 * function name and return the corresponding value */
359 if (*p == '>')
360 {
361 for (pp = p - 1; pp >= s && *pp != '<'; pp--)
362 ; // do nothing
363
364 if (pp >= s)
365 {
366 i = parse_fkey(pp);
367 if (i > 0)
368 {
369 mutt_push_macro_event(KEY_F(i), 0);
370 p = pp - 1;
371 continue;
372 }
373
374 l = p - pp + 1;
375 for (i = 0; KeyNames[i].name; i++)
376 {
377 if (mutt_istrn_equal(pp, KeyNames[i].name, l))
378 break;
379 }
380 if (KeyNames[i].name)
381 {
382 /* found a match */
383 mutt_push_macro_event(KeyNames[i].value, 0);
384 p = pp - 1;
385 continue;
386 }
387
388 /* See if it is a valid command
389 * skip the '<' and the '>' when comparing */
390 for (enum MenuType j = 0; MenuNames[j].name; j++)
391 {
392 const struct MenuFuncOp *funcs = km_get_table(MenuNames[j].value);
393 if (funcs)
394 {
395 op = get_op(funcs, pp + 1, l - 2);
396 if (op != OP_NULL)
397 break;
398 }
399 }
400
401 if (op != OP_NULL)
402 {
404 p = pp - 1;
405 continue;
406 }
407 }
408 }
409 mutt_push_macro_event((unsigned char) *p--, 0); /* independent 8 bits chars */
410 }
411}
void mutt_push_macro_event(int ch, int op)
Add the character/operation to the macro buffer.
Definition: get.c:155
int parse_fkey(char *s)
Parse a function key string.
Definition: lib.c:165
int get_op(const struct MenuFuncOp *funcs, const char *start, size_t len)
Get the function by its name.
Definition: lib.c:298
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition: string.c:497
bool mutt_istrn_equal(const char *a, const char *b, size_t num)
Check for equality of two strings ignoring case (to a maximum), safely.
Definition: string.c:454
int op
Operation, e.g. OP_DELETE.
Definition: lib.h:114
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_op()

int get_op ( const struct MenuFuncOp funcs,
const char *  start,
size_t  len 
)

Get the function by its name.

Parameters
funcsFunctions table
startName of function to find
lenLength of string to match
Return values
numOperation, e.g. OP_DELETE

Definition at line 298 of file lib.c.

299{
300 for (int i = 0; funcs[i].name; i++)
301 {
302 if (mutt_istrn_equal(start, funcs[i].name, len) && (mutt_str_len(funcs[i].name) == len))
303 {
304 return funcs[i].op;
305 }
306 }
307
308 return OP_NULL;
309}
const char * name
Name of the function.
Definition: lib.h:113
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_bindkey()

enum CommandResult km_bindkey ( const char *  s,
enum MenuType  mtype,
int  op 
)

Bind a key in a Menu to an operation.

Parameters
sKey string
mtypeMenu type, e.g. MENU_PAGER
opOperation, e.g. OP_DELETE
Return values
CommandResultResult e.g. MUTT_CMD_SUCCESS

Definition at line 191 of file parse.c.

192{
193 return km_bindkey_err(s, mtype, op, NULL);
194}
static enum CommandResult km_bindkey_err(const char *s, enum MenuType mtype, int op, struct Buffer *err)
Bind a key in a Menu to an operation (with error message)
Definition: parse.c:178
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_compare_keys()

struct Keymap * km_compare_keys ( struct Keymap k1,
struct Keymap k2,
size_t *  pos 
)

Compare two keymaps' keyscodes and return the bigger one.

Parameters
k1first keymap to compare
k2second keymap to compare
posposition where the two keycodes differ
Return values
ptrKeymap with a bigger ASCII keycode

Definition at line 274 of file lib.c.

275{
276 *pos = 0;
277
278 while (*pos < k1->len && *pos < k2->len)
279 {
280 if (k1->keys[*pos] < k2->keys[*pos])
281 return k2;
282 else if (k1->keys[*pos] > k2->keys[*pos])
283 return k1;
284 else
285 *pos = *pos + 1;
286 }
287
288 return NULL;
289}
+ Here is the caller graph for this function:

◆ mutt_get_func()

const char * mutt_get_func ( const struct MenuFuncOp funcs,
int  op 
)

Get the name of a function.

Parameters
funcsFunctions table
opOperation, e.g. OP_DELETE
Return values
ptrName of function
NULLOperation not found
Note
This returns a static string.

Definition at line 320 of file lib.c.

321{
322 for (int i = 0; funcs[i].name; i++)
323 {
324 if (funcs[i].op == op)
325 return funcs[i].name;
326 }
327
328 return NULL;
329}
+ Here is the caller graph for this function:

◆ mutt_keymap_free()

void mutt_keymap_free ( struct Keymap **  ptr)

Free a Keymap.

Parameters
ptrKeymap to free

Definition at line 130 of file lib.c.

131{
132 if (!ptr || !*ptr)
133 return;
134
135 struct Keymap *km = *ptr;
136 FREE(&km->macro);
137 FREE(&km->desc);
138 FREE(&km->keys);
139
140 FREE(ptr);
141}
#define FREE(x)
Definition: memory.h:55
char * desc
Description of a macro for the help menu.
Definition: lib.h:68
+ Here is the caller graph for this function:

◆ parse_fkey()

int parse_fkey ( char *  s)

Parse a function key string.

Parameters
sString to parse
Return values
numNumber of the key

Given "<f8>", it will return 8.

Definition at line 165 of file lib.c.

166{
167 char *t = NULL;
168 int n = 0;
169
170 if ((s[0] != '<') || (tolower(s[1]) != 'f'))
171 return -1;
172
173 for (t = s + 2; *t && isdigit((unsigned char) *t); t++)
174 {
175 n *= 10;
176 n += *t - '0';
177 }
178
179 if (*t != '>')
180 return -1;
181 return n;
182}
+ Here is the caller graph for this function:

◆ parsekeys()

size_t parsekeys ( const char *  str,
keycode_t d,
size_t  max 
)

Parse a key string into key codes.

Parameters
strKey string
dArray for key codes
maxMaximum length of key sequence
Return values
numLength of key sequence

Definition at line 215 of file lib.c.

216{
217 int n;
218 size_t len = max;
219 char buf[128] = { 0 };
220 char c;
221 char *t = NULL;
222
223 mutt_str_copy(buf, str, sizeof(buf));
224 char *s = buf;
225
226 while (*s && len)
227 {
228 *d = '\0';
229 if ((*s == '<') && (t = strchr(s, '>')))
230 {
231 t++;
232 c = *t;
233 *t = '\0';
234
236 if (n != -1)
237 {
238 s = t;
239 *d = n;
240 }
241 else if ((n = parse_fkey(s)) > 0)
242 {
243 s = t;
244 *d = KEY_F(n);
245 }
246 else if ((n = parse_keycode(s)) > 0)
247 {
248 s = t;
249 *d = n;
250 }
251
252 *t = c;
253 }
254
255 if (!*d)
256 {
257 *d = (unsigned char) *s;
258 s++;
259 }
260 d++;
261 len--;
262 }
263
264 return max - len;
265}
static int parse_keycode(const char *s)
Parse a numeric keycode.
Definition: lib.c:192
int mutt_map_get_value(const char *name, const struct Mapping *map)
Lookup the constant for a string.
Definition: mapping.c:85
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:582
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ measure_column()

int measure_column ( struct BindingInfoArray *  bia,
int  col 
)

Measure one column of a table.

Parameters
biaArray of binding info
colColumn to measure
Return values
numWidth of widest column

Definition at line 419 of file lib.c.

420{
421 int max_width = 0;
422
423 struct BindingInfo *bi = NULL;
424 ARRAY_FOREACH(bi, bia)
425 {
426 const int col_width = mutt_strwidth(bi->a[col]);
427 max_width = MAX(max_width, col_width);
428 }
429
430 return max_width;
431}
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition: array.h:214
size_t mutt_strwidth(const char *s)
Measure a string's width in screen cells.
Definition: curs_lib.c:445
#define MAX(a, b)
Definition: memory.h:31
Info about one keybinding.
Definition: lib.h:94
const char * a[3]
Array of info.
Definition: lib.h:95
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ gather_menu()

void gather_menu ( enum MenuType  menu,
struct BindingInfoArray *  bia_bind,
struct BindingInfoArray *  bia_macro 
)

Gather info about one menu.

Parameters
menuMenu type
bia_bindArray for bind results (may be NULL)
bia_macroArray for macro results (may be NULL)

Definition at line 624 of file lib.c.

626{
627 struct Buffer *key_binding = buf_pool_get();
628 struct Buffer *macro = buf_pool_get();
629
630 struct Keymap *map = NULL;
631 STAILQ_FOREACH(map, &Keymaps[menu], entries)
632 {
633 struct BindingInfo bi = { 0 };
634
635 buf_reset(key_binding);
636 km_expand_key(map, key_binding);
637
638 if (map->op == OP_MACRO)
639 {
640 if (!bia_macro || (map->op == OP_NULL))
641 continue;
642
643 buf_reset(macro);
644 escape_macro(map->macro, macro);
645 bi.a[0] = buf_strdup(key_binding);
646 bi.a[1] = buf_strdup(macro);
647 bi.a[2] = map->desc;
648 ARRAY_ADD(bia_macro, bi);
649 }
650 else
651 {
652 if (!bia_bind)
653 continue;
654
655 if (map->op == OP_NULL)
656 {
657 bi.a[0] = buf_strdup(key_binding);
658 bi.a[1] = "noop";
659 ARRAY_ADD(bia_bind, bi);
660 continue;
661 }
662
663 bi.a[0] = buf_strdup(key_binding);
664 bi.a[1] = help_lookup_function(map->op, menu);
665 bi.a[2] = _(opcodes_get_description(map->op));
666 ARRAY_ADD(bia_bind, bi);
667 }
668 }
669
670 buf_pool_release(&key_binding);
671 buf_pool_release(&macro);
672}
#define ARRAY_ADD(head, elem)
Add an element at the end of the array.
Definition: array.h:156
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:76
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
Definition: buffer.c:571
const char * help_lookup_function(int op, enum MenuType menu)
Find a keybinding for an operation.
Definition: lib.c:603
void escape_macro(const char *macro, struct Buffer *buf)
Escape any special characters in a macro.
Definition: lib.c:338
const char * opcodes_get_description(int op)
Get the description of an opcode.
Definition: opcodes.c:70
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ gather_unbound()

int gather_unbound ( const struct MenuFuncOp funcs,
const struct KeymapList *  km_menu,
const struct KeymapList *  km_aux,
struct BindingInfoArray *  bia_unbound 
)

Gather info about unbound functions for one menu.

Parameters
funcsList of functions
km_menuKeymaps for the menu
km_auxKeymaps for generic
bia_unboundUnbound functions
Return values
numNumber of unbound functions

Definition at line 441 of file lib.c.

443{
444 for (int i = 0; funcs[i].name; i++)
445 {
446 if (!is_bound(km_menu, funcs[i].op) &&
447 (!km_aux || !is_bound(km_aux, funcs[i].op)))
448 {
449 struct BindingInfo bi = { 0 };
450 bi.a[0] = NULL;
451 bi.a[1] = funcs[i].name;
452 bi.a[2] = _(opcodes_get_description(funcs[i].op));
453 ARRAY_ADD(bia_unbound, bi);
454 }
455 }
456
457 return ARRAY_SIZE(bia_unbound);
458}
#define ARRAY_SIZE(head)
The number of elements stored.
Definition: array.h:87
bool is_bound(const struct KeymapList *km_list, int op)
Does a function have a keybinding?
Definition: lib.c:391
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ MacroEvents

struct KeyEventArray MacroEvents
extern

These are used for macros and exec/push commands.

They can be temporarily ignored by passing GETCH_IGNORE_MACRO

Definition at line 49 of file get.c.

◆ Keymaps

struct KeymapList Keymaps[]
extern

Array of Keymap keybindings, one for each Menu.

Array of Keymap keybindings, one for each Menu.

Definition at line 124 of file lib.c.

◆ KeyNames

struct Mapping KeyNames[]
extern

Key name lookup table.

Definition at line 59 of file lib.c.

◆ AbortKey

keycode_t AbortKey
extern

key to abort edits etc, normally Ctrl-G

key to abort edits etc, normally Ctrl-G

Definition at line 121 of file lib.c.

◆ Menus

const struct Mapping Menus[]
extern