Mercurial > hg > xemacs-beta
diff src/menubar-msw.c @ 384:bbff43aa5eb7 r21-2-7
Import from CVS: tag r21-2-7
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:08:24 +0200 |
parents | 064ab7fed2e0 |
children | 6719134a07c2 |
line wrap: on
line diff
--- a/src/menubar-msw.c Mon Aug 13 11:07:40 2007 +0200 +++ b/src/menubar-msw.c Mon Aug 13 11:08:24 2007 +0200 @@ -130,11 +130,37 @@ and better be caught than displayed! */ static char buf[MAX_MENUITEM_LENGTH+2]; + char *ptr; unsigned int ll, lr; /* Left flush part of the string */ ll = gui_item_display_flush_left (pgui_item, buf, MAX_MENUITEM_LENGTH); + /* Escape '&' as '&&' */ + ptr = buf; + while ((ptr=memchr (ptr, '&', ll-(ptr-buf))) != NULL) + { + if (ll+2 >= MAX_MENUITEM_LENGTH) + signal_simple_error ("Menu item produces too long displayable string", + pgui_item->name); + memmove (ptr+1, ptr, ll-(ptr-buf)); + ll++; + ptr+=2; + } + + /* Replace XEmacs accelerator '%_' with Windows accelerator '&' */ + ptr = buf; + while ((ptr=memchr (ptr, '%', ll-(ptr-buf))) != NULL) + { + if (*(ptr+1) == '_') + { + *ptr = '&'; + memmove (ptr+1, ptr+2, ll-(ptr-buf+2)); + ll--; + } + ptr++; + } + /* Right flush part, unless we're at the top-level where it's not allowed */ if (!bar_p) {