Mercurial > emacs
comparison src/w32menu.c @ 40119:bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Protect unibyte stings created by replacing their multibyte
equivalents in menu_items.
(w32_menu_show): Don't overwrite an item's name with its key
description in case the description is a multibyte string.
(single_submenu): Some cleanup.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Sun, 21 Oct 2001 10:54:17 +0000 |
parents | 38c1890338cc |
children | 18b1b133e5c1 |
comparison
equal
deleted
inserted
replaced
40118:8526e3fdd0f0 | 40119:bf81460680f2 |
---|---|
1166 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) | 1166 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
1167 { | 1167 { |
1168 /* Create a new pane. */ | 1168 /* Create a new pane. */ |
1169 Lisp_Object pane_name, prefix; | 1169 Lisp_Object pane_name, prefix; |
1170 char *pane_string; | 1170 char *pane_string; |
1171 | |
1171 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; | 1172 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; |
1172 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; | 1173 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
1174 | |
1173 #ifndef HAVE_MULTILINGUAL_MENU | 1175 #ifndef HAVE_MULTILINGUAL_MENU |
1174 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) | 1176 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) |
1175 pane_name = ENCODE_SYSTEM (pane_name); | 1177 { |
1178 pane_name = ENCODE_SYSTEM (pane_name); | |
1179 AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; | |
1180 } | |
1176 #endif | 1181 #endif |
1177 pane_string = (NILP (pane_name) | 1182 pane_string = (NILP (pane_name) |
1178 ? "" : (char *) XSTRING (pane_name)->data); | 1183 ? "" : (char *) XSTRING (pane_name)->data); |
1179 /* If there is just one top-level pane, put all its items directly | 1184 /* If there is just one top-level pane, put all its items directly |
1180 under the top-level menu. */ | 1185 under the top-level menu. */ |
1208 { | 1213 { |
1209 /* Create a new item within current pane. */ | 1214 /* Create a new item within current pane. */ |
1210 Lisp_Object item_name, enable, descrip, def, type, selected; | 1215 Lisp_Object item_name, enable, descrip, def, type, selected; |
1211 Lisp_Object help; | 1216 Lisp_Object help; |
1212 | 1217 |
1213 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; | 1218 item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); |
1214 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; | 1219 enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); |
1215 descrip | 1220 descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); |
1216 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; | 1221 def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); |
1217 def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION]; | 1222 type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); |
1218 type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE]; | 1223 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); |
1219 selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED]; | 1224 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); |
1220 help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP]; | |
1221 | 1225 |
1222 #ifndef HAVE_MULTILINGUAL_MENU | 1226 #ifndef HAVE_MULTILINGUAL_MENU |
1223 if (STRING_MULTIBYTE (item_name)) | 1227 if (STRING_MULTIBYTE (item_name)) |
1224 item_name = ENCODE_SYSTEM (item_name); | 1228 { |
1229 item_name = ENCODE_SYSTEM (item_name); | |
1230 AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; | |
1231 } | |
1232 | |
1225 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) | 1233 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
1226 descrip = ENCODE_SYSTEM (descrip); | 1234 { |
1227 #endif | 1235 descrip = ENCODE_SYSTEM (descrip); |
1236 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; | |
1237 } | |
1238 #endif /* not HAVE_MULTILINGUAL_MENU */ | |
1228 | 1239 |
1229 wv = xmalloc_widget_value (); | 1240 wv = xmalloc_widget_value (); |
1230 if (prev_wv) | 1241 if (prev_wv) |
1231 prev_wv->next = wv; | 1242 prev_wv->next = wv; |
1232 else | 1243 else |
1520 HMENU old = GetMenu (FRAME_W32_WINDOW (f)); | 1531 HMENU old = GetMenu (FRAME_W32_WINDOW (f)); |
1521 SetMenu (FRAME_W32_WINDOW (f), NULL); | 1532 SetMenu (FRAME_W32_WINDOW (f), NULL); |
1522 f->output_data.w32->menubar_widget = NULL; | 1533 f->output_data.w32->menubar_widget = NULL; |
1523 DestroyMenu (old); | 1534 DestroyMenu (old); |
1524 } | 1535 } |
1525 | 1536 |
1526 UNBLOCK_INPUT; | 1537 UNBLOCK_INPUT; |
1527 } | 1538 } |
1528 | 1539 |
1529 | 1540 |
1530 /* w32_menu_show actually displays a menu using the panes and items in | 1541 /* w32_menu_show actually displays a menu using the panes and items in |
1611 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) | 1622 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
1612 { | 1623 { |
1613 /* Create a new pane. */ | 1624 /* Create a new pane. */ |
1614 Lisp_Object pane_name, prefix; | 1625 Lisp_Object pane_name, prefix; |
1615 char *pane_string; | 1626 char *pane_string; |
1616 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; | 1627 pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME); |
1617 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; | 1628 prefix = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX); |
1618 #ifndef HAVE_MULTILINGUAL_MENU | 1629 #ifndef HAVE_MULTILINGUAL_MENU |
1619 if (!NILP (pane_name) && STRING_MULTIBYTE (pane_name)) | 1630 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) |
1620 pane_name = ENCODE_SYSTEM (pane_name); | 1631 { |
1632 pane_name = ENCODE_SYSTEM (pane_name); | |
1633 AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; | |
1634 } | |
1621 #endif | 1635 #endif |
1622 pane_string = (NILP (pane_name) | 1636 pane_string = (NILP (pane_name) |
1623 ? "" : (char *) XSTRING (pane_name)->data); | 1637 ? "" : (char *) XSTRING (pane_name)->data); |
1624 /* If there is just one top-level pane, put all its items directly | 1638 /* If there is just one top-level pane, put all its items directly |
1625 under the top-level menu. */ | 1639 under the top-level menu. */ |
1656 else | 1670 else |
1657 { | 1671 { |
1658 /* Create a new item within current pane. */ | 1672 /* Create a new item within current pane. */ |
1659 Lisp_Object item_name, enable, descrip, def, type, selected, help; | 1673 Lisp_Object item_name, enable, descrip, def, type, selected, help; |
1660 | 1674 |
1661 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; | 1675 item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); |
1662 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; | 1676 enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); |
1663 descrip | 1677 descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); |
1664 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; | 1678 def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); |
1665 def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION]; | 1679 type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); |
1666 type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE]; | 1680 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); |
1667 selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED]; | 1681 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); |
1668 help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP]; | |
1669 | 1682 |
1670 #ifndef HAVE_MULTILINGUAL_MENU | 1683 #ifndef HAVE_MULTILINGUAL_MENU |
1671 if (STRINGP (item_name) && STRING_MULTIBYTE (item_name)) | 1684 if (STRINGP (item_name) && STRING_MULTIBYTE (item_name)) |
1672 item_name = ENCODE_SYSTEM (item_name); | 1685 { |
1686 item_name = ENCODE_SYSTEM (item_name); | |
1687 AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; | |
1688 } | |
1673 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) | 1689 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
1674 descrip = ENCODE_SYSTEM (descrip); | 1690 { |
1675 #endif | 1691 descrip = ENCODE_SYSTEM (descrip); |
1692 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; | |
1693 } | |
1694 #endif /* not HAVE_MULTILINGUAL_MENU */ | |
1676 | 1695 |
1677 wv = xmalloc_widget_value (); | 1696 wv = xmalloc_widget_value (); |
1678 if (prev_wv) | 1697 if (prev_wv) |
1679 prev_wv->next = wv; | 1698 prev_wv->next = wv; |
1680 else | 1699 else |
1696 wv->button_type = BUTTON_TYPE_RADIO; | 1715 wv->button_type = BUTTON_TYPE_RADIO; |
1697 else | 1716 else |
1698 abort (); | 1717 abort (); |
1699 | 1718 |
1700 wv->selected = !NILP (selected); | 1719 wv->selected = !NILP (selected); |
1701 | |
1702 if (STRINGP (help)) | 1720 if (STRINGP (help)) |
1703 wv->help = (char *) XSTRING (help)->data; | 1721 wv->help = XSTRING (help)->data; |
1704 else | |
1705 wv->help = NULL; | |
1706 | 1722 |
1707 prev_wv = wv; | 1723 prev_wv = wv; |
1708 | 1724 |
1709 i += MENU_ITEMS_ITEM_LENGTH; | 1725 i += MENU_ITEMS_ITEM_LENGTH; |
1710 } | 1726 } |