diff options
| author | Richard M. Stallman | 1994-02-19 06:29:10 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1994-02-19 06:29:10 +0000 |
| commit | fa6d54d9a08c0927d7da6b67b5f3f8c34f2b68d5 (patch) | |
| tree | e2b32f40ce0152b7fabe82ed41aabaf27de2b36e /src | |
| parent | 7cd96b42c523ce42841085b7f9005ca6bf498fac (diff) | |
| download | emacs-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.c | 136 |
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 | |||
| 1167 | static Lisp_Object | ||
| 1168 | menu_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] |