aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman1994-02-21 06:46:09 +0000
committerRichard M. Stallman1994-02-21 06:46:09 +0000
commitb5b4d63605f95a2890f911fc200f3f29c3f8bc8f (patch)
tree60399e09f50f1a11ccc2c865bf08a71bef852d8b /src
parent47bad81c75be3eb3e9c02c965db17bfede274d36 (diff)
downloademacs-b5b4d63605f95a2890f911fc200f3f29c3f8bc8f.tar.gz
emacs-b5b4d63605f95a2890f911fc200f3f29c3f8bc8f.zip
(single_keymap_panes): Properly skip help-string if any.
Rename item2 to item_string. GCPRO some things. (menu_item_equiv_key): Use either VECTORP or STRINGP, not both.
Diffstat (limited to 'src')
-rw-r--r--src/xmenu.c80
1 files changed, 46 insertions, 34 deletions
diff --git a/src/xmenu.c b/src/xmenu.c
index d1f82181bad..6f879de2029 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -1,5 +1,5 @@
1/* X Communication module for terminals which understand the X protocol. 1/* X Communication module for terminals which understand the X protocol.
2 Copyright (C) 1986, 1988, 1993 Free Software Foundation, Inc. 2 Copyright (C) 1986, 1988, 1993, 1994 Free Software Foundation, Inc.
3 3
4This file is part of GNU Emacs. 4This file is part of GNU Emacs.
5 5
@@ -1183,15 +1183,11 @@ menu_item_equiv_key (item1, savedkey_ptr, descrip_ptr)
1183 1183
1184 /* Get out the saved equivalent-keyboard-key info. */ 1184 /* Get out the saved equivalent-keyboard-key info. */
1185 savedkey = descrip = Qnil; 1185 savedkey = descrip = Qnil;
1186 if (CONSP (overdef) 1186 if (CONSP (overdef) && VECTORP (XCONS (overdef)->car))
1187 && (STRINGP (XCONS (overdef)->car)
1188 || VECTORP (XCONS (overdef)->car)))
1189 { 1187 {
1190 savedkey = XCONS (overdef)->car; 1188 savedkey = XCONS (overdef)->car;
1191 def = XCONS (def)->cdr; 1189 def = XCONS (def)->cdr;
1192 if (CONSP (def) 1190 if (CONSP (def) && STRINGP (XCONS (def)->car))
1193 && (STRINGP (XCONS (def)->car)
1194 || VECTORP (XCONS (def)->car)))
1195 { 1191 {
1196 descrip = XCONS (def)->car; 1192 descrip = XCONS (def)->car;
1197 def = XCONS (def)->cdr; 1193 def = XCONS (def)->cdr;
@@ -1222,17 +1218,13 @@ menu_item_equiv_key (item1, savedkey_ptr, descrip_ptr)
1222 /* Store back the recorded keyboard key sequence 1218 /* Store back the recorded keyboard key sequence
1223 if we changed it. */ 1219 if we changed it. */
1224 if (!NILP (savedkey) 1220 if (!NILP (savedkey)
1225 && CONSP (overdef) 1221 && CONSP (overdef) && VECTORP (XCONS (overdef)->car))
1226 && (STRINGP (XCONS (overdef)->car)
1227 || VECTORP (XCONS (overdef)->car)))
1228 { 1222 {
1229 if (changed) 1223 if (changed)
1230 { 1224 {
1231 XCONS (overdef)->car = savedkey; 1225 XCONS (overdef)->car = savedkey;
1232 def1 = XCONS (overdef)->cdr; 1226 def1 = XCONS (overdef)->cdr;
1233 if (CONSP (def1) 1227 if (CONSP (def1) && STRINGP (XCONS (def1)->car))
1234 && (STRINGP (XCONS (def1)->car)
1235 || VECTORP (XCONS (def1)->car)))
1236 XCONS (def1)->car = descrip; 1228 XCONS (def1)->car = descrip;
1237 } 1229 }
1238 } 1230 }
@@ -1240,16 +1232,11 @@ menu_item_equiv_key (item1, savedkey_ptr, descrip_ptr)
1240 else if (!NILP (savedkey)) 1232 else if (!NILP (savedkey))
1241 XCONS (item1)->cdr 1233 XCONS (item1)->cdr
1242 = overdef = Fcons (savedkey, Fcons (descrip, def)); 1234 = overdef = Fcons (savedkey, Fcons (descrip, def));
1243 /* If we had one but no longer should have one, 1235 /* If we had one but no longer should have one, delete it. */
1244 delete it. */ 1236 else if (CONSP (overdef) && VECTORP (XCONS (overdef)->car))
1245 else if (CONSP (overdef)
1246 && (STRINGP (XCONS (overdef)->car)
1247 || VECTORP (XCONS (overdef)->car)))
1248 { 1237 {
1249 XCONS (item1)->cdr = overdef = XCONS (overdef)->cdr; 1238 XCONS (item1)->cdr = overdef = XCONS (overdef)->cdr;
1250 if (CONSP (overdef) 1239 if (CONSP (overdef) && STRINGP (XCONS (overdef)->car))
1251 && (STRINGP (XCONS (overdef)->car)
1252 || VECTORP (XCONS (overdef)->car)))
1253 XCONS (item1)->cdr = overdef = XCONS (overdef)->cdr; 1240 XCONS (item1)->cdr = overdef = XCONS (overdef)->cdr;
1254 } 1241 }
1255 1242
@@ -1333,7 +1320,8 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1333{ 1320{
1334 int i; 1321 int i;
1335 Lisp_Object pending_maps; 1322 Lisp_Object pending_maps;
1336 Lisp_Object tail, item, item1, item2, table; 1323 Lisp_Object tail, item, item1, item_string, table;
1324 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1337 1325
1338 pending_maps = Qnil; 1326 pending_maps = Qnil;
1339 1327
@@ -1396,8 +1384,8 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1396 item1 = XCONS (item)->cdr; 1384 item1 = XCONS (item)->cdr;
1397 if (XTYPE (item1) == Lisp_Cons) 1385 if (XTYPE (item1) == Lisp_Cons)
1398 { 1386 {
1399 item2 = XCONS (item1)->car; 1387 item_string = XCONS (item1)->car;
1400 if (XTYPE (item2) == Lisp_String) 1388 if (XTYPE (item_string) == Lisp_String)
1401 { 1389 {
1402 /* This is the real definition--the function to run. */ 1390 /* This is the real definition--the function to run. */
1403 Lisp_Object def; 1391 Lisp_Object def;
@@ -1406,6 +1394,12 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1406 Lisp_Object savedkey, descrip; 1394 Lisp_Object savedkey, descrip;
1407 Lisp_Object tem, enabled; 1395 Lisp_Object tem, enabled;
1408 1396
1397 /* If a help string follows the item string,
1398 skip it. */
1399 if (CONSP (XCONS (item1)->cdr)
1400 && STRINGP (XCONS (XCONS (item1)->cdr)->car))
1401 item1 = XCONS (item1)->cdr;
1402
1409 def = menu_item_equiv_key (item1, &savedkey, &descrip); 1403 def = menu_item_equiv_key (item1, &savedkey, &descrip);
1410 1404
1411 enabled = Qt; 1405 enabled = Qt;
@@ -1414,24 +1408,30 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1414 /* No property, or nil, means enable. 1408 /* No property, or nil, means enable.
1415 Otherwise, enable if value is not nil. */ 1409 Otherwise, enable if value is not nil. */
1416 tem = Fget (def, Qmenu_enable); 1410 tem = Fget (def, Qmenu_enable);
1411 /* GCPRO because we will call eval.
1412 Protecting KEYMAP preserves everything we use;
1413 aside from that, must protect whatever might be
1414 a string. */
1415 GCPRO3 (keymap, def, descrip, item_string);
1417 if (!NILP (tem)) 1416 if (!NILP (tem))
1418 /* (condition-case nil (eval tem) 1417 /* (condition-case nil (eval tem)
1419 (error nil)) */ 1418 (error nil)) */
1420 enabled = internal_condition_case_1 (Feval, tem, 1419 enabled = internal_condition_case_1 (Feval, tem,
1421 Qerror, 1420 Qerror,
1422 single_keymap_panes_1); 1421 single_keymap_panes_1);
1422 UNGCPRO;
1423 } 1423 }
1424 tem = Fkeymapp (def); 1424 tem = Fkeymapp (def);
1425 if (XSTRING (item2)->data[0] == '@' && !NILP (tem)) 1425 if (XSTRING (item_string)->data[0] == '@' && !NILP (tem))
1426 pending_maps = Fcons (Fcons (def, Fcons (item2, XCONS (item)->car)), 1426 pending_maps = Fcons (Fcons (def, Fcons (item_string, XCONS (item)->car)),
1427 pending_maps); 1427 pending_maps);
1428 else 1428 else
1429 { 1429 {
1430 Lisp_Object concat; 1430 Lisp_Object concat;
1431 if (!NILP (descrip)) 1431 if (!NILP (descrip))
1432 concat = concat2 (item2, descrip); 1432 concat = concat2 (item_string, descrip);
1433 else 1433 else
1434 concat = item2; 1434 concat = item_string;
1435 (*names)[*p_ptr][i] = (char *) XSTRING (concat)->data; 1435 (*names)[*p_ptr][i] = (char *) XSTRING (concat)->data;
1436 /* The menu item "value" is the key bound here. */ 1436 /* The menu item "value" is the key bound here. */
1437 (*vector)[*p_ptr][i] = XCONS (item)->car; 1437 (*vector)[*p_ptr][i] = XCONS (item)->car;
@@ -1454,8 +1454,8 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1454 item1 = XVECTOR (item)->contents[c]; 1454 item1 = XVECTOR (item)->contents[c];
1455 if (XTYPE (item1) == Lisp_Cons) 1455 if (XTYPE (item1) == Lisp_Cons)
1456 { 1456 {
1457 item2 = XCONS (item1)->car; 1457 item_string = XCONS (item1)->car;
1458 if (XTYPE (item2) == Lisp_String) 1458 if (XTYPE (item_string) == Lisp_String)
1459 { 1459 {
1460 Lisp_Object def; 1460 Lisp_Object def;
1461 1461
@@ -1464,12 +1464,23 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1464 Lisp_Object savedkey, descrip; 1464 Lisp_Object savedkey, descrip;
1465 Lisp_Object tem, enabled; 1465 Lisp_Object tem, enabled;
1466 1466
1467 /* If a help string follows the item string,
1468 skip it. */
1469 if (CONSP (XCONS (item1)->cdr)
1470 && STRINGP (XCONS (XCONS (item1)->cdr)->car))
1471 item1 = XCONS (item1)->cdr;
1472
1467 def = menu_item_equiv_key (item1, &savedkey, &descrip); 1473 def = menu_item_equiv_key (item1, &savedkey, &descrip);
1468 1474
1469 enabled = Qt; 1475 enabled = Qt;
1470 if (XTYPE (def) == Lisp_Symbol) 1476 if (XTYPE (def) == Lisp_Symbol)
1471 { 1477 {
1472 tem = Fget (def, Qmenu_enable); 1478 tem = Fget (def, Qmenu_enable);
1479 /* GCPRO because we will call eval.
1480 Protecting KEYMAP preserves everything we use;
1481 aside from that, must protect whatever might be
1482 a string. */
1483 GCPRO3 (keymap, def, descrip, item_string);
1473 /* No property, or nil, means enable. 1484 /* No property, or nil, means enable.
1474 Otherwise, enable if value is not nil. */ 1485 Otherwise, enable if value is not nil. */
1475 if (!NILP (tem)) 1486 if (!NILP (tem))
@@ -1478,19 +1489,20 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1478 enabled = internal_condition_case_1 (Feval, tem, 1489 enabled = internal_condition_case_1 (Feval, tem,
1479 Qerror, 1490 Qerror,
1480 single_keymap_panes_1); 1491 single_keymap_panes_1);
1492 UNGCPRO;
1481 } 1493 }
1482 1494
1483 tem = Fkeymapp (def); 1495 tem = Fkeymapp (def);
1484 if (XSTRING (item2)->data[0] == '@' && !NILP (tem)) 1496 if (XSTRING (item_string)->data[0] == '@' && !NILP (tem))
1485 pending_maps = Fcons (Fcons (def, Fcons (item2, character)), 1497 pending_maps = Fcons (Fcons (def, Fcons (item_string, character)),
1486 pending_maps); 1498 pending_maps);
1487 else 1499 else
1488 { 1500 {
1489 Lisp_Object concat; 1501 Lisp_Object concat;
1490 if (!NILP (descrip)) 1502 if (!NILP (descrip))
1491 concat = concat2 (item2, descrip); 1503 concat = concat2 (item_string, descrip);
1492 else 1504 else
1493 concat = item2; 1505 concat = item_string;
1494 (*names)[*p_ptr][i] 1506 (*names)[*p_ptr][i]
1495 = (char *) XSTRING (concat)->data; 1507 = (char *) XSTRING (concat)->data;
1496 /* The menu item "value" is the key bound here. */ 1508 /* The menu item "value" is the key bound here. */