]> 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:19:42 +0000 (18:19 +0000)
committerEli Zaretskii <eliz@gnu.org>
Sat, 16 Jun 2007 18:19:42 +0000 (18:19 +0000)
src/ChangeLog
src/w32menu.c

index e4b578d8de88e07bc294b0ca4c492cca3b0c59b9..3d303ac3c5f05569be94ceda377a248bc1e103f4 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-14  Chong Yidong  <cyd@stupidchicken.com>
 
        * composite.c (update_compositions): Check validity of compositions.
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)