aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Zaretskii <[email protected]>2007-06-16 18:13:15 +0000
committerEli Zaretskii <[email protected]>2007-06-16 18:13:15 +0000
commitaf41f8a8d6660ad1fefad5bda69d1acb8e40b4d1 (patch)
treef6004d2b27eee046cba409e787038be608663622
parent56dc064678fdb3aa9b38113288cbbdcd7f6e4fef (diff)
(add_menu_item): Escape `&' characters in menu items and their keybindings.
-rw-r--r--src/ChangeLog5
-rw-r--r--src/w32menu.c31
2 files changed, 35 insertions, 1 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index a99b18713b..4d2e7ccb37 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2007-06-16 Eli Zaretskii <[email protected]>
+
+ * w32menu.c (add_menu_item): Escape `&' characters in menu items
+ and their keybindings.
+
2007-06-15 Chong Yidong <[email protected]>
* composite.c (update_compositions): Fix last fix.
diff --git a/src/w32menu.c b/src/w32menu.c
index ba29c6ae43..bcd56c8c88 100644
--- a/src/w32menu.c
+++ b/src/w32menu.c
@@ -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)