NeoMutt  2024-04-25-91-gb0e085
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
lib.c File Reference

Key helper functions. More...

#include "config.h"
#include <ctype.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mutt/lib.h"
#include "gui/lib.h"
#include "key/lib.h"
#include "menu/lib.h"
#include "ncrypt/lib.h"
+ Include dependency graph for lib.c:

Go to the source code of this file.

Functions

void mutt_keymap_free (struct Keymap **ptr)
 Free a Keymap.
 
struct Keymapalloc_keys (size_t len, keycode_t *keys)
 Allocate space for a sequence of keys.
 
static int parse_fkey (char *s)
 Parse a function key string.
 
static int parse_keycode (const char *s)
 Parse a numeric keycode.
 
size_t parsekeys (const char *str, keycode_t *d, size_t max)
 Parse a key string into key codes.
 
struct Keymapkm_compare_keys (struct Keymap *k1, struct Keymap *k2, size_t *pos)
 Compare two keymaps' keyscodes and return the bigger one.
 
int get_op (const struct MenuFuncOp *funcs, const char *start, size_t len)
 Get the function by its name.
 
const char * mutt_get_func (const struct MenuFuncOp *funcs, int op)
 Get the name of a function.
 
void generic_tokenize_push_string (char *s)
 Parse and queue a 'push' command.
 
const char * km_keyname (int c)
 Get the human name for a key.
 
int km_expand_key (char *s, size_t len, struct Keymap *map)
 Get the key string bound to a Keymap.
 
int km_expand_key_string (char *str, char *buf, size_t buflen)
 Get a human-readable key string.
 
struct Keymapkm_find_func (enum MenuType mtype, int func)
 Find a function's mapping in a Menu.
 
const struct MenuFuncOpkm_get_table (enum MenuType mtype)
 Lookup a Menu's functions.
 

Variables

const struct MenuFuncOp OpAlias []
 Functions for the Alias Menu.
 
const struct MenuFuncOp OpAttachment []
 Functions for the Attachment Menu.
 
const struct MenuFuncOp OpAutocrypt []
 Functions for the Autocrypt Account.
 
const struct MenuFuncOp OpBrowser []
 Functions for the file Browser Menu.
 
const struct MenuFuncOp OpCompose []
 Functions for the Compose Menu.
 
const struct MenuFuncOp OpEditor []
 Functions for the Editor Menu.
 
const struct MenuFuncOp OpIndex []
 Functions for the Index Menu.
 
const struct MenuFuncOp OpPager []
 Functions for the Pager Menu.
 
const struct MenuFuncOp OpPgp []
 Functions for the Pgp Menu.
 
const struct MenuFuncOp OpPostponed []
 Functions for the Postpone Menu.
 
const struct MenuFuncOp OpQuery []
 Functions for the external Query Menu.
 
const struct MenuFuncOp OpSmime []
 Functions for the Smime Menu.
 
struct Mapping KeyNames []
 Key name lookup table.
 
keycode_t AbortKey
 code of key to abort prompts, normally Ctrl-G
 
struct KeymapList Keymaps [MENU_MAX]
 Array of key mappings, one for each MenuType.
 

Detailed Description

Key helper functions.

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.c.

Function Documentation

◆ mutt_keymap_free()

void mutt_keymap_free ( struct Keymap **  ptr)

Free a Keymap.

Parameters
ptrKeymap to free

Definition at line 131 of file lib.c.

132{
133 if (!ptr || !*ptr)
134 return;
135
136 struct Keymap *km = *ptr;
137 FREE(&km->macro);
138 FREE(&km->desc);
139 FREE(&km->keys);
140
141 FREE(ptr);
142}
#define FREE(x)
Definition: memory.h:45
A keyboard mapping.
Definition: lib.h:65
keycode_t * keys
key sequence
Definition: lib.h:71
char * macro
Macro expansion (op == OP_MACRO)
Definition: lib.h:66
char * desc
Description of a macro for the help menu.
Definition: lib.h:67
+ 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 150 of file lib.c.

151{
152 struct Keymap *p = mutt_mem_calloc(1, sizeof(struct Keymap));
153 p->len = len;
154 p->keys = mutt_mem_calloc(len, sizeof(keycode_t));
155 memcpy(p->keys, keys, len * sizeof(keycode_t));
156 return p;
157}
short keycode_t
Type for key storage, the rest of neomutt works fine with int type.
Definition: lib.h:55
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:51
short len
Length of key sequence (unit: sizeof (keycode_t))
Definition: lib.h:70
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ parse_fkey()

static int parse_fkey ( char *  s)
static

Parse a function key string.

Parameters
sString to parse
Return values
numNumber of the key

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

Definition at line 166 of file lib.c.

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

◆ parse_keycode()

static int parse_keycode ( const char *  s)
static

Parse a numeric keycode.

Parameters
sString to parse
Return values
numNumber of the key

This function parses the string <NNN> and uses the octal value as the key to bind.

Definition at line 193 of file lib.c.

194{
195 char *end_char = NULL;
196 long int result = strtol(s + 1, &end_char, 8);
197 /* allow trailing whitespace, eg. < 1001 > */
198 while (isspace(*end_char))
199 end_char++;
200 /* negative keycodes don't make sense, also detect overflow */
201 if ((*end_char != '>') || (result < 0) || (result == LONG_MAX))
202 {
203 return -1;
204 }
205
206 return result;
207}
+ 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 216 of file lib.c.

217{
218 int n;
219 size_t len = max;
220 char buf[128] = { 0 };
221 char c;
222 char *t = NULL;
223
224 mutt_str_copy(buf, str, sizeof(buf));
225 char *s = buf;
226
227 while (*s && len)
228 {
229 *d = '\0';
230 if ((*s == '<') && (t = strchr(s, '>')))
231 {
232 t++;
233 c = *t;
234 *t = '\0';
235
237 if (n != -1)
238 {
239 s = t;
240 *d = n;
241 }
242 else if ((n = parse_fkey(s)) > 0)
243 {
244 s = t;
245 *d = KEY_F(n);
246 }
247 else if ((n = parse_keycode(s)) > 0)
248 {
249 s = t;
250 *d = n;
251 }
252
253 *t = c;
254 }
255
256 if (!*d)
257 {
258 *d = (unsigned char) *s;
259 s++;
260 }
261 d++;
262 len--;
263 }
264
265 return max - len;
266}
static int parse_keycode(const char *s)
Parse a numeric keycode.
Definition: lib.c:193
struct Mapping KeyNames[]
Key name lookup table.
Definition: lib.c:60
static int parse_fkey(char *s)
Parse a function key string.
Definition: lib.c:166
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:581
+ 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 275 of file lib.c.

276{
277 *pos = 0;
278
279 while (*pos < k1->len && *pos < k2->len)
280 {
281 if (k1->keys[*pos] < k2->keys[*pos])
282 return k2;
283 else if (k1->keys[*pos] > k2->keys[*pos])
284 return k1;
285 else
286 *pos = *pos + 1;
287 }
288
289 return NULL;
290}
+ 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 299 of file lib.c.

300{
301 for (int i = 0; funcs[i].name; i++)
302 {
303 if (mutt_istrn_equal(start, funcs[i].name, len) && (mutt_str_len(funcs[i].name) == len))
304 {
305 return funcs[i].op;
306 }
307 }
308
309 return OP_NULL;
310}
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition: string.c:496
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:453
const char * name
Name of the function.
Definition: lib.h:102
int op
Operation, e.g. OP_DELETE.
Definition: lib.h:103
+ Here is the call graph for this function:
+ 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 321 of file lib.c.

322{
323 for (int i = 0; funcs[i].name; i++)
324 {
325 if (funcs[i].op == op)
326 return funcs[i].name;
327 }
328
329 return NULL;
330}
+ 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 338 of file lib.c.

339{
340 char *pp = NULL;
341 char *p = s + mutt_str_len(s) - 1;
342 size_t l;
343 int i, op = OP_NULL;
344
345 while (p >= s)
346 {
347 /* if we see something like "<PageUp>", look to see if it is a real
348 * function name and return the corresponding value */
349 if (*p == '>')
350 {
351 for (pp = p - 1; pp >= s && *pp != '<'; pp--)
352 ; // do nothing
353
354 if (pp >= s)
355 {
356 i = parse_fkey(pp);
357 if (i > 0)
358 {
359 mutt_push_macro_event(KEY_F(i), 0);
360 p = pp - 1;
361 continue;
362 }
363
364 l = p - pp + 1;
365 for (i = 0; KeyNames[i].name; i++)
366 {
367 if (mutt_istrn_equal(pp, KeyNames[i].name, l))
368 break;
369 }
370 if (KeyNames[i].name)
371 {
372 /* found a match */
373 mutt_push_macro_event(KeyNames[i].value, 0);
374 p = pp - 1;
375 continue;
376 }
377
378 /* See if it is a valid command
379 * skip the '<' and the '>' when comparing */
380 for (enum MenuType j = 0; MenuNames[j].name; j++)
381 {
382 const struct MenuFuncOp *funcs = km_get_table(MenuNames[j].value);
383 if (funcs)
384 {
385 op = get_op(funcs, pp + 1, l - 2);
386 if (op != OP_NULL)
387 break;
388 }
389 }
390
391 if (op != OP_NULL)
392 {
394 p = pp - 1;
395 continue;
396 }
397 }
398 }
399 mutt_push_macro_event((unsigned char) *p--, 0); /* independent 8 bits chars */
400 }
401}
void mutt_push_macro_event(int ch, int op)
Add the character/operation to the macro buffer.
Definition: get.c:155
const struct MenuFuncOp * km_get_table(enum MenuType mtype)
Lookup a Menu's functions.
Definition: lib.c:525
int get_op(const struct MenuFuncOp *funcs, const char *start, size_t len)
Get the function by its name.
Definition: lib.c:299
const char * name
String value.
Definition: mapping.h:34
Mapping between a function and an operation.
Definition: lib.h:101
const struct Mapping MenuNames[]
Menu name lookup table.
Definition: type.c:37
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_keyname()

const char * km_keyname ( int  c)

Get the human name for a key.

Parameters
cKey code
Return values
ptrName of the key
Note
This returns a pointer to a static buffer.

Definition at line 410 of file lib.c.

411{
412 static char buf[35];
413
414 const char *p = mutt_map_get_name(c, KeyNames);
415 if (p)
416 return p;
417
418 if ((c < 256) && (c > -128) && iscntrl((unsigned char) c))
419 {
420 if (c < 0)
421 c += 256;
422
423 if (c < 128)
424 {
425 buf[0] = '^';
426 buf[1] = (c + '@') & 0x7f;
427 buf[2] = '\0';
428 }
429 else
430 {
431 snprintf(buf, sizeof(buf), "\\%d%d%d", c >> 6, (c >> 3) & 7, c & 7);
432 }
433 }
434 else if ((c >= KEY_F0) && (c < KEY_F(256))) /* this maximum is just a guess */
435 {
436 snprintf(buf, sizeof(buf), "<F%d>", c - KEY_F0);
437 }
438 else if ((c < 256) && (c >= -128) && IsPrint(c))
439 {
440 snprintf(buf, sizeof(buf), "%c", (unsigned char) c);
441 }
442 else
443 {
444 snprintf(buf, sizeof(buf), "<%ho>", (unsigned short) c);
445 }
446 return buf;
447}
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:

◆ km_expand_key()

int km_expand_key ( char *  s,
size_t  len,
struct Keymap map 
)

Get the key string bound to a Keymap.

Parameters
sBuffer for the key string
lenLength of buffer
mapKeybinding map
Return values
1Success
0Error

Definition at line 457 of file lib.c.

458{
459 if (!map)
460 return 0;
461
462 int p = 0;
463
464 while (true)
465 {
466 mutt_str_copy(s, km_keyname(map->keys[p]), len);
467 const size_t l = mutt_str_len(s);
468 len -= l;
469
470 if ((++p >= map->len) || !len)
471 return 1;
472
473 s += l;
474 }
475
476 /* not reached */
477}
const char * km_keyname(int c)
Get the human name for a key.
Definition: lib.c:410
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ km_expand_key_string()

int km_expand_key_string ( char *  str,
char *  buf,
size_t  buflen 
)

Get a human-readable key string.

Parameters
strRaw key string
bufBuffer for the key string
buflenLength of buffer
Return values
numLength of string

Definition at line 486 of file lib.c.

487{
488 size_t len = 0;
489 for (; *str; str++)
490 {
491 const char *key = km_keyname(*str);
492 size_t keylen = mutt_str_len(key);
493
494 mutt_str_copy(buf, key, buflen);
495 buf += keylen;
496 buflen -= keylen;
497 len += keylen;
498 }
499
500 return len;
501}
+ 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 509 of file lib.c.

510{
511 struct Keymap *np = NULL;
512 STAILQ_FOREACH(np, &Keymaps[mtype], entries)
513 {
514 if (np->op == func)
515 break;
516 }
517 return np;
518}
struct KeymapList Keymaps[MENU_MAX]
Array of key mappings, one for each MenuType.
Definition: lib.c:125
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
short op
Operation to perform.
Definition: lib.h:68
+ 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 525 of file lib.c.

526{
527 switch (mtype)
528 {
529 case MENU_ALIAS:
530 return OpAlias;
531 case MENU_ATTACHMENT:
532 return OpAttachment;
533#ifdef USE_AUTOCRYPT
534 case MENU_AUTOCRYPT:
535 return OpAutocrypt;
536#endif
537 case MENU_COMPOSE:
538 return OpCompose;
539 case MENU_DIALOG:
540 return OpDialog;
541 case MENU_EDITOR:
542 return OpEditor;
543 case MENU_FOLDER:
544 return OpBrowser;
545 case MENU_GENERIC:
546 return OpGeneric;
547 case MENU_INDEX:
548 return OpIndex;
549#ifdef CRYPT_BACKEND_GPGME
551 return OpPgp;
553 return OpSmime;
554#endif
555 case MENU_PAGER:
556 return OpPager;
557 case MENU_PGP:
558 return (WithCrypto & APPLICATION_PGP) ? OpPgp : NULL;
559 case MENU_POSTPONED:
560 return OpPostponed;
561 case MENU_QUERY:
562 return OpQuery;
563 default:
564 return NULL;
565 }
566}
const struct MenuFuncOp OpGeneric[]
Functions for the Generic Menu.
Definition: functions.c:68
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:73
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:94
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:74
const struct MenuFuncOp OpAutocrypt[]
Functions for the Autocrypt Account.
Definition: functions.c:52
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:64
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:59
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition: lib.h:90
#define WithCrypto
Definition: lib.h:116
@ MENU_KEY_SELECT_PGP
Select a PGP key.
Definition: type.h:48
@ MENU_INDEX
Index panel (list of emails)
Definition: type.h:51
@ MENU_DIALOG
Simple Dialog.
Definition: type.h:43
@ MENU_KEY_SELECT_SMIME
Select a SMIME key.
Definition: type.h:49
@ MENU_QUERY
Select from results of external query.
Definition: type.h:55
@ 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:53
@ MENU_GENERIC
Generic selection list.
Definition: type.h:46
@ MENU_PAGER
Pager pager (email viewer)
Definition: type.h:52
@ 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:54
+ Here is the caller graph for this function:

Variable Documentation

◆ OpAlias

const struct MenuFuncOp OpAlias[]
extern

Functions for the Alias Menu.

Definition at line 59 of file functions.c.

◆ OpAttachment

const struct MenuFuncOp OpAttachment[]
extern

Functions for the Attachment Menu.

Definition at line 64 of file functions.c.

◆ OpAutocrypt

const struct MenuFuncOp OpAutocrypt[]
extern

Functions for the Autocrypt Account.

Definition at line 52 of file functions.c.

◆ OpBrowser

const struct MenuFuncOp OpBrowser[]
extern

Functions for the file Browser Menu.

Definition at line 74 of file functions.c.

◆ OpCompose

const struct MenuFuncOp OpCompose[]
extern

Functions for the Compose Menu.

Definition at line 87 of file functions.c.

◆ OpEditor

const struct MenuFuncOp OpEditor[]
extern

Functions for the Editor Menu.

Definition at line 53 of file functions.c.

◆ OpIndex

const struct MenuFuncOp OpIndex[]
extern

Functions for the Index Menu.

Definition at line 94 of file functions.c.

◆ OpPager

const struct MenuFuncOp OpPager[]
extern

Functions for the Pager Menu.

Definition at line 71 of file functions.c.

◆ OpPgp

const struct MenuFuncOp OpPgp[]
extern

Functions for the Pgp Menu.

Definition at line 42 of file functions.c.

◆ OpPostponed

const struct MenuFuncOp OpPostponed[]
extern

Functions for the Postpone Menu.

Definition at line 52 of file functions.c.

◆ OpQuery

const struct MenuFuncOp OpQuery[]
extern

Functions for the external Query Menu.

Definition at line 73 of file functions.c.

◆ OpSmime

const struct MenuFuncOp OpSmime[]
extern

Functions for the Smime Menu.

Definition at line 52 of file functions.c.

◆ KeyNames

struct Mapping KeyNames[]

Key name lookup table.

Definition at line 60 of file lib.c.

◆ AbortKey

keycode_t AbortKey

code of key to abort prompts, normally Ctrl-G

key to abort edits etc, normally Ctrl-G

Definition at line 122 of file lib.c.

◆ Keymaps

struct KeymapList Keymaps[MENU_MAX]

Array of key mappings, one for each MenuType.

Array of Keymap keybindings, one for each Menu.

Definition at line 125 of file lib.c.