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 }