diff options
author | Eli Zaretskii <eliz@gnu.org> | 2007-06-16 18:19:42 +0000 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2007-06-16 18:19:42 +0000 |
commit | 96f6c17002cd4b4fb6649ed1dc592f3328d04922 (patch) | |
tree | 0e39f72bf7b429fcb8d8bf47e0ba6035dff0b17e /src/w32menu.c | |
parent | d6ff8a3029ca96d23fe84fdc7cd5d23a41a8fe5a (diff) | |
download | emacs-96f6c17002cd4b4fb6649ed1dc592f3328d04922.tar.gz |
(add_menu_item): Escape `&' characters in menu items and their keybindings.
Diffstat (limited to 'src/w32menu.c')
-rw-r--r-- | src/w32menu.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/w32menu.c b/src/w32menu.c index ba29c6ae433..bcd56c8c88e 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) |