]> git.eshelyaron.com Git - emacs.git/commitdiff
(add_menu_item): Escape `&' characters in menu items and their keybindings.
authorEli Zaretskii <eliz@gnu.org>
Sat, 16 Jun 2007 18:13:15 +0000 (18:13 +0000)
committerEli Zaretskii <eliz@gnu.org>
Sat, 16 Jun 2007 18:13:15 +0000 (18:13 +0000)
src/ChangeLog
src/w32menu.c

index a99b18713bc39ac6b343da6dc48b19f3bf945e80..4d2e7ccb3753c120bb5c45a55776509d5a3f816d 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-16  Eli Zaretskii  <eliz@gnu.org>
+
+       * w32menu.c (add_menu_item): Escape `&' characters in menu items
+       and their keybindings.
+
 2007-06-15  Chong Yidong  <cyd@stupidchicken.com>
 
        * composite.c (update_compositions): Fix last fix.
index ba29c6ae43393131f21ef98b31f6479a77ddf2c3..bcd56c8c88e7072abf34ec3ad367b95e32109a38 100644 (file)
@@ -23,6 +23,7 @@ Boston, MA 02110-1301, USA.  */
 #include <signal.h>
 
 #include <stdio.h>
+#include <mbstring.h>
 #include "lisp.h"
 #include "termhooks.h"
 #include "keyboard.h"
@@ -2261,8 +2262,9 @@ static int
 add_menu_item (HMENU menu, widget_value *wv, HMENU item)
 {
   UINT fuFlags;
-  char *out_string;
+  char *out_string, *p, *q;
   int return_value;
+  size_t nlen, orig_len;
 
   if (name_is_separator (wv->name))
     {
@@ -2286,6 +2288,33 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
       else
        out_string = wv->name;
 
+      /* Quote any special characters within the menu item's text and
+        key binding.  */
+      nlen = orig_len = strlen (out_string);
+      for (p = out_string; *p; p = _mbsinc (p))
+       {
+         if (_mbsnextc (p) == '&')
+           nlen++;
+       }
+      if (nlen > orig_len)
+       {
+         p = out_string;
+         out_string = alloca (nlen + 1);
+         q = out_string;
+         while (*p)
+           {
+             if (_mbsnextc (p) == '&')
+               {
+                 _mbsncpy (q, p, 1);
+                 q = _mbsinc (q);
+               }
+             _mbsncpy (q, p, 1);
+             p = _mbsinc (p);
+             q = _mbsinc (q);
+           }
+         *q = '\0';
+       }
+
       if (item != NULL)
        fuFlags = MF_POPUP;
       else if (wv->title || wv->call_data == 0)