NeoMutt  2025-12-11-911-gd8d604
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
keymap.h File Reference

Keymap handling. More...

#include <stdbool.h>
#include <stddef.h>
#include "mutt/lib.h"
+ Include dependency graph for keymap.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...
 

Typedefs

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

Functions

struct Mappingkeymap_get_key_names (void)
 Get the KeyNames lookup table.
 
 STAILQ_HEAD (KeymapList, Keymap)
 
struct Keymapkeymap_alloc (size_t len, keycode_t *keys)
 Allocate space for a sequence of keys.
 
void keymap_free (struct Keymap **pptr)
 Free a Keymap.
 
void keymaplist_free (struct KeymapList *kml)
 Free a List of Keymaps.
 
struct Keymapkeymap_compare (struct Keymap *km1, struct Keymap *km2, size_t *pos)
 Compare two keymaps' keyscodes and return the bigger one.
 
bool keymap_expand_key (struct Keymap *km, struct Buffer *buf)
 Get the key string bound to a Keymap.
 
void keymap_expand_string (const char *str, struct Buffer *buf)
 Get a human-readable key string.
 
void keymap_get_name (int c, struct Buffer *buf)
 Get the human name for a key.
 
int parse_fkey (char *str)
 Parse a function key string.
 
int parse_keycode (const char *str)
 Parse a numeric keycode.
 
size_t parse_keys (const char *str, keycode_t *d, size_t max)
 Parse a key string into key codes.
 

Detailed Description

Keymap handling.

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

Typedef Documentation

◆ keycode_t

typedef short keycode_t

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

Definition at line 31 of file keymap.h.

Function Documentation

◆ keymap_get_key_names()

struct Mapping * keymap_get_key_names ( void )

Get the KeyNames lookup table.

Return values
ptrKeyNames array

Definition at line 120 of file keymap.c.

121{
122 return KeyNames;
123}
static struct Mapping KeyNames[]
Key name lookup table.
Definition keymap.c:43
+ Here is the caller graph for this function:

◆ STAILQ_HEAD()

STAILQ_HEAD ( KeymapList ,
Keymap  )

◆ keymap_alloc()

struct Keymap * keymap_alloc ( 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 131 of file keymap.c.

132{
133 struct Keymap *km = MUTT_MEM_CALLOC(1, struct Keymap);
134
135 km->len = len;
137 memcpy(km->keys, keys, len * sizeof(keycode_t));
138
139 return km;
140}
short keycode_t
Type for key storage, the rest of neomutt works fine with int type.
Definition keymap.h:31
#define MUTT_MEM_CALLOC(n, type)
Definition memory.h:52
A keyboard mapping.
Definition keymap.h:43
keycode_t * keys
Key sequence.
Definition keymap.h:49
short len
Length of key sequence (unit: sizeof (keycode_t))
Definition keymap.h:48
+ Here is the caller graph for this function:

◆ keymap_free()

void keymap_free ( struct Keymap ** pptr)

Free a Keymap.

Parameters
pptrKeymap to free

Definition at line 146 of file keymap.c.

147{
148 if (!pptr || !*pptr)
149 return;
150
151 struct Keymap *km = *pptr;
152 FREE(&km->macro);
153 FREE(&km->desc);
154 FREE(&km->keys);
155
156 FREE(pptr);
157}
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
char * macro
Macro expansion (op == OP_MACRO)
Definition keymap.h:44
char * desc
Description of a macro for the help menu.
Definition keymap.h:45
+ Here is the caller graph for this function:

◆ keymaplist_free()

void keymaplist_free ( struct KeymapList * kml)

Free a List of Keymaps.

Parameters
kmlList of Keymaps to free

Definition at line 163 of file keymap.c.

164{
165 struct Keymap *km = NULL;
166 struct Keymap *km_tmp = NULL;
167 STAILQ_FOREACH_SAFE(km, kml, entries, km_tmp)
168 {
169 STAILQ_REMOVE(kml, km, Keymap, entries);
170 keymap_free(&km);
171 }
172}
void keymap_free(struct Keymap **pptr)
Free a Keymap.
Definition keymap.c:146
#define STAILQ_REMOVE(head, elm, type, field)
Definition queue.h:441
#define STAILQ_FOREACH_SAFE(var, head, field, tvar)
Definition queue.h:400
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ keymap_compare()

struct Keymap * keymap_compare ( struct Keymap * km1,
struct Keymap * km2,
size_t * pos )

Compare two keymaps' keyscodes and return the bigger one.

Parameters
[in]km1First keymap to compare
[in]km2Second keymap to compare
[out]posPosition where the two keycodes differ
Return values
ptrKeymap with a bigger ASCII keycode

Definition at line 181 of file keymap.c.

182{
183 *pos = 0;
184
185 while ((*pos < km1->len) && (*pos < km2->len))
186 {
187 if (km1->keys[*pos] < km2->keys[*pos])
188 return km2;
189
190 if (km1->keys[*pos] > km2->keys[*pos])
191 return km1;
192
193 *pos = *pos + 1;
194 }
195
196 return NULL;
197}
+ Here is the caller graph for this function:

◆ keymap_expand_key()

bool keymap_expand_key ( struct Keymap * km,
struct Buffer * buf )

Get the key string bound to a Keymap.

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

Definition at line 248 of file keymap.c.

249{
250 if (!km || !buf)
251 return false;
252
253 for (int i = 0; i < km->len; i++)
254 {
255 keymap_get_name(km->keys[i], buf);
256 }
257
258 return true;
259}
void keymap_get_name(int c, struct Buffer *buf)
Get the human name for a key.
Definition keymap.c:204
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ keymap_expand_string()

void keymap_expand_string ( const 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 266 of file keymap.c.

267{
268 if (!str)
269 return;
270
271 for (; *str; str++)
272 {
273 keymap_get_name(*str, buf);
274 }
275}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ keymap_get_name()

void keymap_get_name ( int c,
struct Buffer * buf )

Get the human name for a key.

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

Definition at line 204 of file keymap.c.

205{
206 const char *name = mutt_map_get_name(c, KeyNames);
207 if (name)
208 {
209 buf_addstr(buf, name);
210 return;
211 }
212
213 if ((c < 256) && (c > -128) && iscntrl((unsigned char) c))
214 {
215 if (c < 0)
216 c += 256;
217
218 if (c < 128)
219 {
220 buf_addch(buf, '^');
221 buf_addch(buf, (c + '@') & 0x7f);
222 }
223 else
224 {
225 buf_add_printf(buf, "\\%d%d%d", c >> 6, (c >> 3) & 7, c & 7);
226 }
227 }
228 else if ((c >= KEY_F0) && (c < KEY_F(256))) /* this maximum is just a guess */
229 {
230 buf_add_printf(buf, "<F%d>", c - KEY_F0);
231 }
232 else if ((c < 256) && (c >= -128) && IsPrint(c))
233 {
234 buf_add_printf(buf, "%c", (unsigned char) c);
235 }
236 else
237 {
238 buf_add_printf(buf, "<%ho>", (unsigned short) c);
239 }
240}
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:39
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ parse_fkey()

int parse_fkey ( char * str)

Parse a function key string.

Parameters
strString to parse
Return values
numNumber of the key
-1Error

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

Definition at line 285 of file keymap.c.

286{
287 char *t = NULL;
288 int n = 0;
289
290 if ((str[0] != '<') || (mutt_tolower(str[1]) != 'f'))
291 return -1;
292
293 for (t = str + 2; *t && mutt_isdigit(*t); t++)
294 {
295 n *= 10;
296 n += *t - '0';
297 }
298
299 if (*t != '>')
300 return -1;
301 return n;
302}
int mutt_tolower(int arg)
Wrapper for tolower(3)
Definition ctype.c:126
bool mutt_isdigit(int arg)
Wrapper for isdigit(3)
Definition ctype.c:66
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ parse_keycode()

int parse_keycode ( const char * str)

Parse a numeric keycode.

Parameters
strString 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 312 of file keymap.c.

313{
314 char *end_char = NULL;
315 long int result = strtol(str + 1, &end_char, 8);
316
317 /* allow trailing whitespace, eg. < 1001 > */
318 while (mutt_isspace(*end_char))
319 end_char++;
320
321 /* negative keycodes don't make sense, also detect overflow */
322 if ((*end_char != '>') || (result < 0) || (result == LONG_MAX))
323 {
324 return -1;
325 }
326
327 return result;
328}
bool mutt_isspace(int arg)
Wrapper for isspace(3)
Definition ctype.c:96
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ parse_keys()

size_t parse_keys ( 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 337 of file keymap.c.

338{
339 int n;
340 size_t len = max;
341 char buf[128] = { 0 };
342 char c;
343 char *t = NULL;
344
345 mutt_str_copy(buf, str, sizeof(buf));
346 char *s = buf;
347
348 while (*s && len)
349 {
350 *d = '\0';
351 if ((*s == '<') && (t = strchr(s, '>')))
352 {
353 t++;
354 c = *t;
355 *t = '\0';
356
358 if (n != -1)
359 {
360 s = t;
361 *d = n;
362 }
363 else if ((n = parse_fkey(s)) > 0)
364 {
365 s = t;
366 *d = KEY_F(n);
367 }
368 else if ((n = parse_keycode(s)) > 0)
369 {
370 s = t;
371 *d = n;
372 }
373
374 *t = c;
375 }
376
377 if (!*d)
378 {
379 *d = (unsigned char) *s;
380 s++;
381 }
382 d++;
383 len--;
384 }
385
386 return max - len;
387}
int parse_fkey(char *str)
Parse a function key string.
Definition keymap.c:285
int parse_keycode(const char *str)
Parse a numeric keycode.
Definition keymap.c:312
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:586
+ Here is the call graph for this function:
+ Here is the caller graph for this function: