X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=keymap.c;h=e41d6d715e96e6a3539fe7b15eb7e5eefd5c894f;hp=493b2dee5402ca0950177fd0369472413ac5391b;hb=709596677d75e57812cc6bcaa85b844b4b32ca36;hpb=cfd46a622a446af8a5fa286637cd88259f1b50a5 diff --git a/keymap.c b/keymap.c index 493b2de..e41d6d7 100644 --- a/keymap.c +++ b/keymap.c @@ -16,6 +16,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif + #include "mutt.h" #include "mutt_menu.h" #include "mutt_curses.h" @@ -40,6 +44,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 }, @@ -266,12 +276,9 @@ static char *get_func (struct binding_t *bindings, int op) { int i; - fprintf(stderr,"get_func: op = %d\n",op); - for (i = 0; bindings[i].name; i++) { if (bindings[i].op == op) { - fprintf(stderr,"get_func: name = %s\n",bindings[i].name); return bindings[i].name; } } @@ -391,8 +398,6 @@ int km_dokey (int menu) if (LastKey == -1) return -1; - fprintf(stderr,"km_dokey got %d (%c) tmp.op = %d\n",LastKey,LastKey,tmp.op); - /* do we have an op already? */ if (tmp.op) { @@ -564,6 +569,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); @@ -694,38 +704,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) - { - snprintf (err->data, err->dsize, _("%s: no such menu"), buf.data); - } - else + while (i < maxmenus) { - /* 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); } @@ -772,6 +797,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; @@ -786,9 +818,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 */ @@ -799,19 +832,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; + } } } } @@ -822,11 +864,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); @@ -848,16 +890,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);