aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman1994-02-19 06:29:10 +0000
committerRichard M. Stallman1994-02-19 06:29:10 +0000
commitfa6d54d9a08c0927d7da6b67b5f3f8c34f2b68d5 (patch)
treee2b32f40ce0152b7fabe82ed41aabaf27de2b36e /src
parent7cd96b42c523ce42841085b7f9005ca6bf498fac (diff)
downloademacs-fa6d54d9a08c0927d7da6b67b5f3f8c34f2b68d5.tar.gz
emacs-fa6d54d9a08c0927d7da6b67b5f3f8c34f2b68d5.zip
Find and display keyboard equivalents of menu items.
(menu_item_equiv_key): New function. (single_keymap_panes): Call it.
Diffstat (limited to 'src')
-rw-r--r--src/xmenu.c136
1 files changed, 128 insertions, 8 deletions
diff --git a/src/xmenu.c b/src/xmenu.c
index dc164117b47..d1f82181bad 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -1158,6 +1158,106 @@ syms_of_xmenu ()
1158 defsubr (&Sx_popup_menu); 1158 defsubr (&Sx_popup_menu);
1159} 1159}
1160 1160
1161/* Figure out the current keyboard equivalent of a menu item ITEM1.
1162 Store the equivalent key sequence in *SAVEDKEY_PTR
1163 and the textual description (to use in the menu display) in *DESCRIP_PTR.
1164 Also cache them in the item itself.
1165 Return the real definition to execute. */
1166
1167static Lisp_Object
1168menu_item_equiv_key (item1, savedkey_ptr, descrip_ptr)
1169 Lisp_Object item1;
1170 Lisp_Object *savedkey_ptr, *descrip_ptr;
1171{
1172 /* This is what is left after the menu item name. */
1173 Lisp_Object overdef;
1174 /* This is the real definition--the function to run. */
1175 Lisp_Object def;
1176 /* These are the saved equivalent keyboard key sequence
1177 and its key-description. */
1178 Lisp_Object savedkey, descrip;
1179 Lisp_Object def1;
1180 int changed = 0;
1181
1182 overdef = def = Fcdr (item1);
1183
1184 /* Get out the saved equivalent-keyboard-key info. */
1185 savedkey = descrip = Qnil;
1186 if (CONSP (overdef)
1187 && (STRINGP (XCONS (overdef)->car)
1188 || VECTORP (XCONS (overdef)->car)))
1189 {
1190 savedkey = XCONS (overdef)->car;
1191 def = XCONS (def)->cdr;
1192 if (CONSP (def)
1193 && (STRINGP (XCONS (def)->car)
1194 || VECTORP (XCONS (def)->car)))
1195 {
1196 descrip = XCONS (def)->car;
1197 def = XCONS (def)->cdr;
1198 }
1199 }
1200
1201 /* Is it still valid? */
1202 def1 = Qnil;
1203 if (!NILP (savedkey))
1204 def1 = Fkey_binding (savedkey, Qnil);
1205 /* If not, update it. */
1206 if (! EQ (def1, def))
1207 {
1208 changed = 1;
1209 descrip = Qnil;
1210 savedkey = Fwhere_is_internal (def, Qnil, Qt, Qnil);
1211 if (VECTORP (savedkey)
1212 && EQ (XVECTOR (savedkey)->contents[0], Qmenu_bar))
1213 savedkey = Qnil;
1214 if (!NILP (savedkey))
1215 {
1216 descrip = Fkey_description (savedkey);
1217 descrip = concat2 (make_string (" (", 3), descrip);
1218 descrip = concat2 (descrip, make_string (")", 1));
1219 }
1220 }
1221
1222 /* Store back the recorded keyboard key sequence
1223 if we changed it. */
1224 if (!NILP (savedkey)
1225 && CONSP (overdef)
1226 && (STRINGP (XCONS (overdef)->car)
1227 || VECTORP (XCONS (overdef)->car)))
1228 {
1229 if (changed)
1230 {
1231 XCONS (overdef)->car = savedkey;
1232 def1 = XCONS (overdef)->cdr;
1233 if (CONSP (def1)
1234 && (STRINGP (XCONS (def1)->car)
1235 || VECTORP (XCONS (def1)->car)))
1236 XCONS (def1)->car = descrip;
1237 }
1238 }
1239 /* If we had none but need one now, add it. */
1240 else if (!NILP (savedkey))
1241 XCONS (item1)->cdr
1242 = overdef = Fcons (savedkey, Fcons (descrip, def));
1243 /* If we had one but no longer should have one,
1244 delete it. */
1245 else if (CONSP (overdef)
1246 && (STRINGP (XCONS (overdef)->car)
1247 || VECTORP (XCONS (overdef)->car)))
1248 {
1249 XCONS (item1)->cdr = overdef = XCONS (overdef)->cdr;
1250 if (CONSP (overdef)
1251 && (STRINGP (XCONS (overdef)->car)
1252 || VECTORP (XCONS (overdef)->car)))
1253 XCONS (item1)->cdr = overdef = XCONS (overdef)->cdr;
1254 }
1255
1256 *savedkey_ptr = savedkey;
1257 *descrip_ptr = descrip;
1258 return def;
1259}
1260
1161/* Construct the vectors that describe a menu 1261/* Construct the vectors that describe a menu
1162 and store them in *VECTOR, *PANES, *NAMES, *ENABLES and *ITEMS. 1262 and store them in *VECTOR, *PANES, *NAMES, *ENABLES and *ITEMS.
1163 Each of those four values is a vector indexed by pane number. 1263 Each of those four values is a vector indexed by pane number.
@@ -1299,10 +1399,15 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1299 item2 = XCONS (item1)->car; 1399 item2 = XCONS (item1)->car;
1300 if (XTYPE (item2) == Lisp_String) 1400 if (XTYPE (item2) == Lisp_String)
1301 { 1401 {
1302 Lisp_Object def, tem; 1402 /* This is the real definition--the function to run. */
1303 Lisp_Object enabled; 1403 Lisp_Object def;
1404 /* These are the saved equivalent keyboard key sequence
1405 and its key-description. */
1406 Lisp_Object savedkey, descrip;
1407 Lisp_Object tem, enabled;
1408
1409 def = menu_item_equiv_key (item1, &savedkey, &descrip);
1304 1410
1305 def = Fcdr (item1);
1306 enabled = Qt; 1411 enabled = Qt;
1307 if (XTYPE (def) == Lisp_Symbol) 1412 if (XTYPE (def) == Lisp_Symbol)
1308 { 1413 {
@@ -1322,7 +1427,12 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1322 pending_maps); 1427 pending_maps);
1323 else 1428 else
1324 { 1429 {
1325 (*names)[*p_ptr][i] = (char *) XSTRING (item2)->data; 1430 Lisp_Object concat;
1431 if (!NILP (descrip))
1432 concat = concat2 (item2, descrip);
1433 else
1434 concat = item2;
1435 (*names)[*p_ptr][i] = (char *) XSTRING (concat)->data;
1326 /* The menu item "value" is the key bound here. */ 1436 /* The menu item "value" is the key bound here. */
1327 (*vector)[*p_ptr][i] = XCONS (item)->car; 1437 (*vector)[*p_ptr][i] = XCONS (item)->car;
1328 (*enables)[*p_ptr][i] 1438 (*enables)[*p_ptr][i]
@@ -1347,11 +1457,15 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1347 item2 = XCONS (item1)->car; 1457 item2 = XCONS (item1)->car;
1348 if (XTYPE (item2) == Lisp_String) 1458 if (XTYPE (item2) == Lisp_String)
1349 { 1459 {
1350 Lisp_Object tem;
1351 Lisp_Object def; 1460 Lisp_Object def;
1352 Lisp_Object enabled;
1353 1461
1354 def = Fcdr (item1); 1462 /* These are the saved equivalent keyboard key sequence
1463 and its key-description. */
1464 Lisp_Object savedkey, descrip;
1465 Lisp_Object tem, enabled;
1466
1467 def = menu_item_equiv_key (item1, &savedkey, &descrip);
1468
1355 enabled = Qt; 1469 enabled = Qt;
1356 if (XTYPE (def) == Lisp_Symbol) 1470 if (XTYPE (def) == Lisp_Symbol)
1357 { 1471 {
@@ -1372,7 +1486,13 @@ single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1372 pending_maps); 1486 pending_maps);
1373 else 1487 else
1374 { 1488 {
1375 (*names)[*p_ptr][i] = (char *) XSTRING (item2)->data; 1489 Lisp_Object concat;
1490 if (!NILP (descrip))
1491 concat = concat2 (item2, descrip);
1492 else
1493 concat = item2;
1494 (*names)[*p_ptr][i]
1495 = (char *) XSTRING (concat)->data;
1376 /* The menu item "value" is the key bound here. */ 1496 /* The menu item "value" is the key bound here. */
1377 (*vector)[*p_ptr][i] = character; 1497 (*vector)[*p_ptr][i] = character;
1378 (*enables)[*p_ptr][i] 1498 (*enables)[*p_ptr][i]