X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=keymap.c;h=a763d2ef402af150e3aff719e3d854784bfedb78;hp=89711b2e50259f41e4dfe9355c3f8db81f5019a0;hb=3d937534e7b1ee723f86594b5e4c64c95158a933;hpb=d7c69d8f0180e24b9ee48088d08090df7b4e27c2 diff --git a/keymap.c b/keymap.c index 89711b2..a763d2e 100644 --- a/keymap.c +++ b/keymap.c @@ -40,6 +40,12 @@ struct mapping_t Menus[] = { { "postpone", MENU_POST }, { "pgp", MENU_PGP }, { "smime", MENU_SMIME }, + +#ifdef HAVE_GPGME + { "key_select_pgp", MENU_KEY_SELECT_PGP }, + { "key_select_smime", MENU_KEY_SELECT_SMIME }, +#endif + #ifdef MIXMASTER { "mix", MENU_MIX }, @@ -559,6 +565,11 @@ void km_init (void) if ((WithCrypto & APPLICATION_SMIME)) create_bindings (OpSmime, MENU_SMIME); +#ifdef CRYPT_BACKEND_GPGME + create_bindings (OpPgp, MENU_KEY_SELECT_PGP); + create_bindings (OpSmime, MENU_KEY_SELECT_SMIME); +#endif + #ifdef MIXMASTER create_bindings (OpMix, MENU_MIX); @@ -689,38 +700,53 @@ int mutt_parse_push (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err) return (r); } -/* expects to see: */ -char *parse_keymap (int *menu, BUFFER *s, BUFFER *err) +/* expects to see: ,,... */ +static char *parse_keymap (int *menu, BUFFER *s, int maxmenus, int *nummenus, BUFFER *err) { BUFFER buf; + int i=0; + char *p, *q; memset (&buf, 0, sizeof (buf)); /* menu name */ mutt_extract_token (&buf, s, 0); + p = buf.data; if (MoreArgs (s)) { - if ((*menu = mutt_check_menu (buf.data)) == -1) + while (i < maxmenus) { - snprintf (err->data, err->dsize, _("%s: no such menu"), buf.data); - } - else - { - /* key sequence */ - mutt_extract_token (&buf, s, 0); + q = strchr(p,','); + if (q) + *q = '\0'; - if (!*buf.data) + if ((menu[i] = mutt_check_menu (p)) == -1) { - strfcpy (err->data, _("null key sequence"), err->dsize); + snprintf (err->data, err->dsize, _("%s: no such menu"), p); + goto error; } - else if (MoreArgs (s)) - return (buf.data); + ++i; + if (q) + p = q+1; + else + break; + } + *nummenus=i; + /* key sequence */ + mutt_extract_token (&buf, s, 0); + + if (!*buf.data) + { + strfcpy (err->data, _("null key sequence"), err->dsize); } + else if (MoreArgs (s)) + return (buf.data); } else { strfcpy (err->data, _("too few arguments"), err->dsize); } +error: FREE (&buf.data); return (NULL); } @@ -767,6 +793,13 @@ struct binding_t *km_get_table (int menu) case MENU_PGP: return (WithCrypto & APPLICATION_PGP)? OpPgp:NULL; +#ifdef CRYPT_BACKEND_GPGME + case MENU_KEY_SELECT_PGP: + return OpPgp; + case MENU_KEY_SELECT_SMIME: + return OpSmime; +#endif + #ifdef MIXMASTER case MENU_MIX: return OpMix; @@ -781,9 +814,10 @@ int mutt_parse_bind (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err) { struct binding_t *bindings = NULL; char *key; - int menu, r = 0; + int menu[sizeof(Menus)/sizeof(struct mapping_t)-1], r = 0, nummenus, i; - if ((key = parse_keymap (&menu, s, err)) == NULL) + if ((key = parse_keymap (menu, s, sizeof (menu)/sizeof (menu[0]), + &nummenus, err)) == NULL) return (-1); /* function to execute */ @@ -794,19 +828,28 @@ int mutt_parse_bind (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err) r = -1; } else if (ascii_strcasecmp ("noop", buf->data) == 0) - km_bindkey (key, menu, OP_NULL); /* the `unbind' command */ + { + for (i = 0; i < nummenus; ++i) + { + km_bindkey (key, menu[i], OP_NULL); /* the `unbind' command */ + } + } else { - /* First check the "generic" list of commands */ - if (menu == MENU_PAGER || menu == MENU_EDITOR || menu == MENU_GENERIC || - try_bind (key, menu, buf->data, OpGeneric) != 0) + for (i = 0; i < nummenus; ++i) { - /* Now check the menu-specific list of commands (if they exist) */ - bindings = km_get_table (menu); - if (bindings && try_bind (key, menu, buf->data, bindings) != 0) + /* First check the "generic" list of commands */ + if (menu[i] == MENU_PAGER || menu[i] == MENU_EDITOR || + menu[i] == MENU_GENERIC || + try_bind (key, menu[i], buf->data, OpGeneric) != 0) { - snprintf (err->data, err->dsize, _("%s: no such function in map"), buf->data); - r = -1; + /* Now check the menu-specific list of commands (if they exist) */ + bindings = km_get_table (menu[i]); + if (bindings && try_bind (key, menu[i], buf->data, bindings) != 0) + { + snprintf (err->data, err->dsize, _("%s: no such function in map"), buf->data); + r = -1; + } } } } @@ -817,11 +860,11 @@ int mutt_parse_bind (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err) /* macro */ int mutt_parse_macro (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err) { - int menu, r = -1; + int menu[sizeof(Menus)/sizeof(struct mapping_t)-1], r = -1, nummenus, i; char *seq = NULL; char *key; - if ((key = parse_keymap (&menu, s, err)) == NULL) + if ((key = parse_keymap (menu, s, sizeof (menu) / sizeof (menu[0]), &nummenus, err)) == NULL) return (-1); mutt_extract_token (buf, s, M_TOKEN_CONDENSE); @@ -843,16 +886,22 @@ int mutt_parse_macro (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err) } else { - km_bind (key, menu, OP_MACRO, seq, buf->data); - r = 0; + for (i = 0; i < nummenus; ++i) + { + km_bind (key, menu[i], OP_MACRO, seq, buf->data); + r = 0; + } } FREE (&seq); } else { - km_bind (key, menu, OP_MACRO, buf->data, NULL); - r = 0; + for (i = 0; i < nummenus; ++i) + { + km_bind (key, menu[i], OP_MACRO, buf->data, NULL); + r = 0; + } } } FREE (&key);