diff options
| author | Richard M. Stallman | 1994-02-21 06:46:09 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1994-02-21 06:46:09 +0000 |
| commit | b5b4d63605f95a2890f911fc200f3f29c3f8bc8f (patch) | |
| tree | 60399e09f50f1a11ccc2c865bf08a71bef852d8b /src | |
| parent | 47bad81c75be3eb3e9c02c965db17bfede274d36 (diff) | |
| download | emacs-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.c | 80 |
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 | ||
| 4 | This file is part of GNU Emacs. | 4 | This 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. */ |