Andreas Krennmair:
[apps/madmutt.git] / keymap.c
index 89711b2..a763d2e 100644 (file)
--- 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: <menu-string> <key-string> */
-char *parse_keymap (int *menu, BUFFER *s, BUFFER *err)
+/* expects to see: <menu-string>,<menu-string>,... <key-string> */
+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 <menu> <key> <macro> <description> */
 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);