Mercurial > hg > xemacs-beta
comparison src/keymap.c @ 934:c925bacdda60
[xemacs-hg @ 2002-07-29 09:21:12 by michaels]
2002-07-17 Marcus Crestani <crestani@informatik.uni-tuebingen.de>
Markus Kaltenbach <makalten@informatik.uni-tuebingen.de>
Mike Sperber <mike@xemacs.org>
configure flag to turn these changes on: --use-kkcc
First we added a dumpable flag to lrecord_implementation. It shows,
if the object is dumpable and should be processed by the dumper.
* lrecord.h (struct lrecord_implementation): added dumpable flag
(MAKE_LRECORD_IMPLEMENTATION): fitted the different makro definitions
to the new lrecord_implementation and their calls.
Then we changed mark_object, that it no longer needs a mark method for
those types that have pdump descritions.
* alloc.c:
(mark_object): If the object has a description, the new mark algorithm
is called, and the object is marked according to its description.
Otherwise it uses the mark method like before.
These procedures mark objects according to their descriptions. They
are modeled on the corresponding pdumper procedures.
(mark_with_description):
(get_indirect_count):
(structure_size):
(mark_struct_contents):
These procedures still call mark_object, this is needed while there are
Lisp_Objects without descriptions left.
We added pdump descriptions for many Lisp_Objects:
* extents.c: extent_auxiliary_description
* database.c: database_description
* gui.c: gui_item_description
* scrollbar.c: scrollbar_instance_description
* toolbar.c: toolbar_button_description
* event-stream.c: command_builder_description
* mule-charset.c: charset_description
* device-msw.c: devmode_description
* dialog-msw.c: mswindows_dialog_id_description
* eldap.c: ldap_description
* postgresql.c: pgconn_description
pgresult_description
* tooltalk.c: tooltalk_message_description
tooltalk_pattern_description
* ui-gtk.c: emacs_ffi_description
emacs_gtk_object_description
* events.c:
* events.h:
* event-stream.c:
* event-Xt.c:
* event-gtk.c:
* event-tty.c:
To write a pdump description for Lisp_Event, we converted every struct
in the union event to a Lisp_Object. So we created nine new
Lisp_Objects: Lisp_Key_Data, Lisp_Button_Data, Lisp_Motion_Data,
Lisp_Process_Data, Lisp_Timeout_Data, Lisp_Eval_Data,
Lisp_Misc_User_Data, Lisp_Magic_Data, Lisp_Magic_Eval_Data.
We also wrote makro selectors and mutators for the fields of the new
designed Lisp_Event and added everywhere these new abstractions.
We implemented XD_UNION support in (mark_with_description), so
we can describe exspecially console/device specific data with XD_UNION.
To describe with XD_UNION, we added a field to these objects, which
holds the variant type of the object. This field is initialized in
the appendant constructor. The variant is an integer, it has also to
be described in an description, if XD_UNION is used.
XD_UNION is used in following descriptions:
* console.c: console_description
(get_console_variant): returns the variant
(create_console): added variant initialization
* console.h (console_variant): the different console types
* console-impl.h (struct console): added enum console_variant contype
* device.c: device_description
(Fmake_device): added variant initialization
* device-impl.h (struct device): added enum console_variant devtype
* objects.c: image_instance_description
font_instance_description
(Fmake_color_instance): added variant initialization
(Fmake_font_instance): added variant initialization
* objects-impl.h (struct Lisp_Color_Instance): added color_instance_type
* objects-impl.h (struct Lisp_Font_Instance): added font_instance_type
* process.c: process_description
(make_process_internal): added variant initialization
* process.h (process_variant): the different process types
author | michaels |
---|---|
date | Mon, 29 Jul 2002 09:21:25 +0000 |
parents | 79c6ff3eef26 |
children | 0dc7756a58c4 |
comparison
equal
deleted
inserted
replaced
933:f6bc42928b34 | 934:c925bacdda60 |
---|---|
279 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, name) }, | 279 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, name) }, |
280 { XD_END } | 280 { XD_END } |
281 }; | 281 }; |
282 | 282 |
283 /* No need for keymap_equal #### Why not? */ | 283 /* No need for keymap_equal #### Why not? */ |
284 #ifdef USE_KKCC | |
285 DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap, | |
286 1, /*dumpable-flag*/ | |
287 mark_keymap, print_keymap, 0, 0, 0, | |
288 keymap_description, | |
289 Lisp_Keymap); | |
290 #else /* not USE_KKCC */ | |
284 DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap, | 291 DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap, |
285 mark_keymap, print_keymap, 0, 0, 0, | 292 mark_keymap, print_keymap, 0, 0, 0, |
286 keymap_description, | 293 keymap_description, |
287 Lisp_Keymap); | 294 Lisp_Keymap); |
295 #endif /* not USE_KKCC */ | |
288 | 296 |
289 /************************************************************************/ | 297 /************************************************************************/ |
290 /* Traversing keymaps and their parents */ | 298 /* Traversing keymaps and their parents */ |
291 /************************************************************************/ | 299 /************************************************************************/ |
292 | 300 |
426 if (modifiers & XEMACS_MOD_META) frob = Fcons (Qmeta, frob); | 434 if (modifiers & XEMACS_MOD_META) frob = Fcons (Qmeta, frob); |
427 return frob; | 435 return frob; |
428 } | 436 } |
429 | 437 |
430 static Lisp_Object | 438 static Lisp_Object |
439 #ifdef USE_KKCC | |
440 make_key_description (const Lisp_Key_Data *key, int prettify) | |
441 { | |
442 Lisp_Object keysym = KEY_DATA_KEYSYM(key); | |
443 int modifiers = KEY_DATA_MODIFIERS (key); | |
444 #else /* not USE_KKCC */ | |
431 make_key_description (const struct key_data *key, int prettify) | 445 make_key_description (const struct key_data *key, int prettify) |
432 { | 446 { |
433 Lisp_Object keysym = key->keysym; | 447 Lisp_Object keysym = key->keysym; |
434 int modifiers = key->modifiers; | 448 int modifiers = key->modifiers; |
435 | 449 #endif /* not USE_KKCC */ |
436 if (prettify && CHARP (keysym)) | 450 if (prettify && CHARP (keysym)) |
437 { | 451 { |
438 /* This is a little slow, but (control a) is prettier than (control 65). | 452 /* This is a little slow, but (control a) is prettier than (control 65). |
439 It's now ok to do this for digit-chars too, since we've fixed the | 453 It's now ok to do this for digit-chars too, since we've fixed the |
440 bug where \9 read as the integer 9 instead of as the symbol with | 454 bug where \9 read as the integer 9 instead of as the symbol with |
454 /* Low-level keymap-store functions */ | 468 /* Low-level keymap-store functions */ |
455 /************************************************************************/ | 469 /************************************************************************/ |
456 | 470 |
457 static Lisp_Object | 471 static Lisp_Object |
458 raw_lookup_key (Lisp_Object keymap, | 472 raw_lookup_key (Lisp_Object keymap, |
473 #ifdef USE_KKCC | |
474 const Lisp_Key_Data *raw_keys, int raw_keys_count, | |
475 #else /* not USE_KKCC */ | |
459 const struct key_data *raw_keys, int raw_keys_count, | 476 const struct key_data *raw_keys, int raw_keys_count, |
477 #endif /* not USE_KKCC */ | |
460 int keys_so_far, int accept_default); | 478 int keys_so_far, int accept_default); |
461 | 479 |
462 /* Relies on caller to gc-protect args */ | 480 /* Relies on caller to gc-protect args */ |
463 static Lisp_Object | 481 static Lisp_Object |
464 keymap_lookup_directly (Lisp_Object keymap, | 482 keymap_lookup_directly (Lisp_Object keymap, |
638 } | 656 } |
639 | 657 |
640 | 658 |
641 /* Relies on caller to gc-protect keymap, keysym, value */ | 659 /* Relies on caller to gc-protect keymap, keysym, value */ |
642 static void | 660 static void |
661 #ifdef USE_KKCC | |
662 keymap_store (Lisp_Object keymap, const Lisp_Key_Data *key, | |
663 #else /* not USE_KKCC */ | |
643 keymap_store (Lisp_Object keymap, const struct key_data *key, | 664 keymap_store (Lisp_Object keymap, const struct key_data *key, |
665 #endif /* not USE_KKCC */ | |
644 Lisp_Object value) | 666 Lisp_Object value) |
645 { | 667 { |
668 #ifdef USE_KKCC | |
669 Lisp_Object keysym = KEY_DATA_KEYSYM (key); | |
670 int modifiers = KEY_DATA_MODIFIERS (key); | |
671 #else /* not USE_KKCC */ | |
646 Lisp_Object keysym = key->keysym; | 672 Lisp_Object keysym = key->keysym; |
647 int modifiers = key->modifiers; | 673 int modifiers = key->modifiers; |
674 #endif /* not USE_KKCC */ | |
648 Lisp_Keymap *k = XKEYMAP (keymap); | 675 Lisp_Keymap *k = XKEYMAP (keymap); |
649 | 676 |
650 modifiers &= ~(XEMACS_MOD_BUTTON1 | XEMACS_MOD_BUTTON2 | XEMACS_MOD_BUTTON3 | 677 modifiers &= ~(XEMACS_MOD_BUTTON1 | XEMACS_MOD_BUTTON2 | XEMACS_MOD_BUTTON3 |
651 | XEMACS_MOD_BUTTON4 | XEMACS_MOD_BUTTON5); | 678 | XEMACS_MOD_BUTTON4 | XEMACS_MOD_BUTTON5); |
652 assert ((modifiers & ~(XEMACS_MOD_CONTROL | XEMACS_MOD_META | 679 assert ((modifiers & ~(XEMACS_MOD_CONTROL | XEMACS_MOD_META |
1052 } | 1079 } |
1053 /* If the contents are (KEYMAP . ELEMENT), go indirect. */ | 1080 /* If the contents are (KEYMAP . ELEMENT), go indirect. */ |
1054 if (!NILP (map)) | 1081 if (!NILP (map)) |
1055 { | 1082 { |
1056 Lisp_Object idx = Fcdr (object); | 1083 Lisp_Object idx = Fcdr (object); |
1084 #ifdef USE_KKCC | |
1085 Lisp_Key_Data indirection; | |
1086 #else /* not USE_KKCC */ | |
1057 struct key_data indirection; | 1087 struct key_data indirection; |
1088 #endif /* not USE_KKCC */ | |
1058 if (CHARP (idx)) | 1089 if (CHARP (idx)) |
1059 { | 1090 { |
1091 #ifdef USE_KKCC | |
1092 Lisp_Object event = Fmake_event (Qnil, Qnil); | |
1093 struct gcpro gcpro1; | |
1094 GCPRO1 (event); | |
1095 XSET_EVENT_TYPE (event, empty_event); | |
1096 character_to_event (XCHAR (idx), XEVENT (event), | |
1097 XCONSOLE (Vselected_console), 0, 0); | |
1098 indirection = *XKEY_DATA (XEVENT_DATA (event)); | |
1099 #else /* not USE_KKCC */ | |
1060 Lisp_Event event; | 1100 Lisp_Event event; |
1061 event.event_type = empty_event; | 1101 event.event_type = empty_event; |
1062 character_to_event (XCHAR (idx), &event, | 1102 character_to_event (XCHAR (idx), &event, |
1063 XCONSOLE (Vselected_console), 0, 0); | 1103 XCONSOLE (Vselected_console), 0, 0); |
1064 indirection = event.event.key; | 1104 indirection = event.event.key; |
1105 #endif /* not USE_KKCC */ | |
1065 } | 1106 } |
1066 else if (CONSP (idx)) | 1107 else if (CONSP (idx)) |
1067 { | 1108 { |
1068 if (!INTP (XCDR (idx))) | 1109 if (!INTP (XCDR (idx))) |
1069 return Qnil; | 1110 return Qnil; |
1071 indirection.modifiers = (unsigned char) XINT (XCDR (idx)); | 1112 indirection.modifiers = (unsigned char) XINT (XCDR (idx)); |
1072 } | 1113 } |
1073 else if (SYMBOLP (idx)) | 1114 else if (SYMBOLP (idx)) |
1074 { | 1115 { |
1075 indirection.keysym = idx; | 1116 indirection.keysym = idx; |
1117 #ifdef USE_KKCC | |
1118 SET_KEY_DATA_MODIFIERS (&indirection, XINT (XCDR (idx))); | |
1119 #else /* not USE_KKCC */ | |
1076 indirection.modifiers = 0; | 1120 indirection.modifiers = 0; |
1121 #endif /* not USE_KKCC */ | |
1077 } | 1122 } |
1078 else | 1123 else |
1079 { | 1124 { |
1080 /* Random junk */ | 1125 /* Random junk */ |
1081 return Qnil; | 1126 return Qnil; |
1097 return object; | 1142 return object; |
1098 } | 1143 } |
1099 } | 1144 } |
1100 | 1145 |
1101 static Lisp_Object | 1146 static Lisp_Object |
1147 #ifdef USE_KKCC | |
1148 keymap_lookup_1 (Lisp_Object keymap, const Lisp_Key_Data *key, | |
1149 #else /* not USE_KKCC */ | |
1102 keymap_lookup_1 (Lisp_Object keymap, const struct key_data *key, | 1150 keymap_lookup_1 (Lisp_Object keymap, const struct key_data *key, |
1151 #endif /* not USE_KKCC */ | |
1103 int accept_default) | 1152 int accept_default) |
1104 { | 1153 { |
1105 /* This function can GC */ | 1154 /* This function can GC */ |
1155 #ifdef USE_KKCC | |
1156 return get_keyelt (keymap_lookup_directly (keymap, | |
1157 KEY_DATA_KEYSYM (key), | |
1158 KEY_DATA_MODIFIERS (key)), | |
1159 accept_default); | |
1160 #else /* not USE_KKCC */ | |
1106 return get_keyelt (keymap_lookup_directly (keymap, | 1161 return get_keyelt (keymap_lookup_directly (keymap, |
1107 key->keysym, key->modifiers), | 1162 key->keysym, key->modifiers), |
1108 accept_default); | 1163 accept_default); |
1164 #endif /* not USE_KKCC */ | |
1109 } | 1165 } |
1110 | 1166 |
1111 | 1167 |
1112 /************************************************************************/ | 1168 /************************************************************************/ |
1113 /* Copying keymaps */ | 1169 /* Copying keymaps */ |
1396 -- integers are converted into the equivalent characters. | 1452 -- integers are converted into the equivalent characters. |
1397 -- one-character strings are converted into the equivalent characters. | 1453 -- one-character strings are converted into the equivalent characters. |
1398 */ | 1454 */ |
1399 | 1455 |
1400 static void | 1456 static void |
1457 #ifdef USE_KKCC | |
1458 define_key_parser (Lisp_Object spec, Lisp_Key_Data *returned_value) | |
1459 #else /* not USE_KKCC */ | |
1401 define_key_parser (Lisp_Object spec, struct key_data *returned_value) | 1460 define_key_parser (Lisp_Object spec, struct key_data *returned_value) |
1461 #endif /* not USE_KKCC */ | |
1402 { | 1462 { |
1403 if (CHAR_OR_CHAR_INTP (spec)) | 1463 if (CHAR_OR_CHAR_INTP (spec)) |
1404 { | 1464 { |
1465 #ifdef USE_KKCC | |
1466 Lisp_Object event = Fmake_event (Qnil, Qnil); | |
1467 struct gcpro gcpro1; | |
1468 GCPRO1 (event); | |
1469 XSET_EVENT_TYPE (event, empty_event); | |
1470 character_to_event (XCHAR_OR_CHAR_INT (spec), XEVENT (event), | |
1471 XCONSOLE (Vselected_console), 0, 0); | |
1472 SET_KEY_DATA_KEYSYM (returned_value, XKEY_DATA_KEYSYM (XEVENT_DATA (event))); | |
1473 SET_KEY_DATA_MODIFIERS (returned_value, | |
1474 XKEY_DATA_MODIFIERS (XEVENT_DATA (event))); | |
1475 #else /* not USE_KKCC */ | |
1405 Lisp_Event event; | 1476 Lisp_Event event; |
1406 event.event_type = empty_event; | 1477 event.event_type = empty_event; |
1407 character_to_event (XCHAR_OR_CHAR_INT (spec), &event, | 1478 character_to_event (XCHAR_OR_CHAR_INT (spec), &event, |
1408 XCONSOLE (Vselected_console), 0, 0); | 1479 XCONSOLE (Vselected_console), 0, 0); |
1409 returned_value->keysym = event.event.key.keysym; | 1480 returned_value->keysym = event.event.key.keysym; |
1410 returned_value->modifiers = event.event.key.modifiers; | 1481 returned_value->modifiers = event.event.key.modifiers; |
1482 #endif /* not USE_KKCC */ | |
1411 } | 1483 } |
1412 else if (EVENTP (spec)) | 1484 else if (EVENTP (spec)) |
1413 { | 1485 { |
1486 #ifdef USE_KKCC | |
1487 switch (XEVENT_TYPE (spec)) | |
1488 #else /* not USE_KKCC */ | |
1414 switch (XEVENT (spec)->event_type) | 1489 switch (XEVENT (spec)->event_type) |
1490 #endif /* not USE_KKCC */ | |
1415 { | 1491 { |
1416 case key_press_event: | 1492 case key_press_event: |
1417 { | 1493 { |
1494 #ifdef USE_KKCC | |
1495 SET_KEY_DATA_KEYSYM (returned_value, XKEY_DATA_KEYSYM (XEVENT_DATA (spec))); | |
1496 SET_KEY_DATA_MODIFIERS (returned_value, XKEY_DATA_MODIFIERS (XEVENT_DATA (spec))); | |
1497 #else /* not USE_KKCC */ | |
1418 returned_value->keysym = XEVENT (spec)->event.key.keysym; | 1498 returned_value->keysym = XEVENT (spec)->event.key.keysym; |
1419 returned_value->modifiers = XEVENT (spec)->event.key.modifiers; | 1499 returned_value->modifiers = XEVENT (spec)->event.key.modifiers; |
1500 #endif /* not USE_KKCC */ | |
1420 break; | 1501 break; |
1421 } | 1502 } |
1422 case button_press_event: | 1503 case button_press_event: |
1423 case button_release_event: | 1504 case button_release_event: |
1424 { | 1505 { |
1506 #ifdef USE_KKCC | |
1507 int down = (XEVENT_TYPE (spec) == button_press_event); | |
1508 switch (XBUTTON_DATA_BUTTON (XEVENT_DATA (spec))) | |
1509 { | |
1510 case 1: | |
1511 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton1 : Qbutton1up)); | |
1512 break; | |
1513 case 2: | |
1514 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton2 : Qbutton2up)); | |
1515 break; | |
1516 case 3: | |
1517 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton3 : Qbutton3up)); | |
1518 break; | |
1519 case 4: | |
1520 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton4 : Qbutton4up)); | |
1521 break; | |
1522 case 5: | |
1523 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton5 : Qbutton5up)); | |
1524 break; | |
1525 case 6: | |
1526 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton6 : Qbutton6up)); | |
1527 break; | |
1528 case 7: | |
1529 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton7 : Qbutton7up)); | |
1530 break; | |
1531 default: | |
1532 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton0 : Qbutton0up)); | |
1533 break; | |
1534 } | |
1535 SET_KEY_DATA_MODIFIERS (returned_value, XBUTTON_DATA_MODIFIERS (XEVENT_DATA (spec))); | |
1536 #else /* not USE_KKCC */ | |
1425 int down = (XEVENT (spec)->event_type == button_press_event); | 1537 int down = (XEVENT (spec)->event_type == button_press_event); |
1426 switch (XEVENT (spec)->event.button.button) | 1538 switch (XEVENT (spec)->event.button.button) |
1427 { | 1539 { |
1428 case 1: | 1540 case 1: |
1429 returned_value->keysym = (down ? Qbutton1 : Qbutton1up); break; | 1541 returned_value->keysym = (down ? Qbutton1 : Qbutton1up); break; |
1441 returned_value->keysym = (down ? Qbutton7 : Qbutton7up); break; | 1553 returned_value->keysym = (down ? Qbutton7 : Qbutton7up); break; |
1442 default: | 1554 default: |
1443 returned_value->keysym = (down ? Qbutton0 : Qbutton0up); break; | 1555 returned_value->keysym = (down ? Qbutton0 : Qbutton0up); break; |
1444 } | 1556 } |
1445 returned_value->modifiers = XEVENT (spec)->event.button.modifiers; | 1557 returned_value->modifiers = XEVENT (spec)->event.button.modifiers; |
1558 #endif /* not USE_KKCC */ | |
1446 break; | 1559 break; |
1447 } | 1560 } |
1448 default: | 1561 default: |
1449 wtaerror ("unable to bind this type of event", spec); | 1562 wtaerror ("unable to bind this type of event", spec); |
1450 } | 1563 } |
1453 { | 1566 { |
1454 /* Be nice, allow = to mean (=) */ | 1567 /* Be nice, allow = to mean (=) */ |
1455 if (bucky_sym_to_bucky_bit (spec) != 0) | 1568 if (bucky_sym_to_bucky_bit (spec) != 0) |
1456 invalid_argument ("Key is a modifier name", spec); | 1569 invalid_argument ("Key is a modifier name", spec); |
1457 define_key_check_and_coerce_keysym (spec, &spec, 0); | 1570 define_key_check_and_coerce_keysym (spec, &spec, 0); |
1571 #ifdef USE_KKCC | |
1572 SET_KEY_DATA_KEYSYM (returned_value, spec); | |
1573 SET_KEY_DATA_MODIFIERS (returned_value, 0); | |
1574 #else /* not USE_KKCC */ | |
1458 returned_value->keysym = spec; | 1575 returned_value->keysym = spec; |
1459 returned_value->modifiers = 0; | 1576 returned_value->modifiers = 0; |
1577 #endif /* not USE_KKCC */ | |
1460 } | 1578 } |
1461 else if (CONSP (spec)) | 1579 else if (CONSP (spec)) |
1462 { | 1580 { |
1463 int modifiers = 0; | 1581 int modifiers = 0; |
1464 Lisp_Object keysym = Qnil; | 1582 Lisp_Object keysym = Qnil; |
1489 if (!NILP (rest)) | 1607 if (!NILP (rest)) |
1490 signal_error (Qlist_formation_error, | 1608 signal_error (Qlist_formation_error, |
1491 "List must be nil-terminated", spec); | 1609 "List must be nil-terminated", spec); |
1492 | 1610 |
1493 define_key_check_and_coerce_keysym (spec, &keysym, modifiers); | 1611 define_key_check_and_coerce_keysym (spec, &keysym, modifiers); |
1612 #ifdef USE_KKCC | |
1613 SET_KEY_DATA_KEYSYM(returned_value, keysym); | |
1614 SET_KEY_DATA_MODIFIERS (returned_value, modifiers); | |
1615 #else /* not USE_KKCC */ | |
1494 returned_value->keysym = keysym; | 1616 returned_value->keysym = keysym; |
1495 returned_value->modifiers = modifiers; | 1617 returned_value->modifiers = modifiers; |
1618 #endif /* not USE_KKCC */ | |
1496 } | 1619 } |
1497 else | 1620 else |
1498 { | 1621 { |
1499 invalid_argument ("Unknown key-sequence specifier", | 1622 invalid_argument ("Unknown key-sequence specifier", |
1500 spec); | 1623 spec); |
1504 /* Used by character-to-event */ | 1627 /* Used by character-to-event */ |
1505 void | 1628 void |
1506 key_desc_list_to_event (Lisp_Object list, Lisp_Object event, | 1629 key_desc_list_to_event (Lisp_Object list, Lisp_Object event, |
1507 int allow_menu_events) | 1630 int allow_menu_events) |
1508 { | 1631 { |
1632 #ifdef USE_KKCC | |
1633 Lisp_Key_Data raw_key; | |
1634 #else /* not USE_KKCC */ | |
1509 struct key_data raw_key; | 1635 struct key_data raw_key; |
1636 #endif /* not USE_KKCC */ | |
1510 | 1637 |
1511 if (allow_menu_events && | 1638 if (allow_menu_events && |
1512 CONSP (list) && | 1639 CONSP (list) && |
1513 /* #### where the hell does this come from? */ | 1640 /* #### where the hell does this come from? */ |
1514 EQ (XCAR (list), Qmenu_selection)) | 1641 EQ (XCAR (list), Qmenu_selection)) |
1519 arg = Fcar (Fcdr (list)); | 1646 arg = Fcar (Fcdr (list)); |
1520 if (SYMBOLP (arg)) | 1647 if (SYMBOLP (arg)) |
1521 fn = Qcall_interactively; | 1648 fn = Qcall_interactively; |
1522 else | 1649 else |
1523 fn = Qeval; | 1650 fn = Qeval; |
1651 #ifdef USE_KKCC | |
1652 XSET_EVENT_TYPE (event, misc_user_event); | |
1653 XSET_EVENT_CHANNEL (event, wrap_frame (selected_frame)); | |
1654 XSET_MISC_USER_DATA_FUNCTION (XEVENT_DATA (event), fn); | |
1655 XSET_MISC_USER_DATA_OBJECT (XEVENT_DATA (event), arg); | |
1656 #else /* not USE_KKCC */ | |
1524 XEVENT (event)->channel = wrap_frame (selected_frame ()); | 1657 XEVENT (event)->channel = wrap_frame (selected_frame ()); |
1525 XEVENT (event)->event_type = misc_user_event; | 1658 XEVENT (event)->event_type = misc_user_event; |
1526 XEVENT (event)->event.eval.function = fn; | 1659 XEVENT (event)->event.eval.function = fn; |
1527 XEVENT (event)->event.eval.object = arg; | 1660 XEVENT (event)->event.eval.object = arg; |
1661 #endif /* not USE_KKCC */ | |
1528 return; | 1662 return; |
1529 } | 1663 } |
1530 | 1664 |
1531 define_key_parser (list, &raw_key); | 1665 define_key_parser (list, &raw_key); |
1532 | 1666 |
1539 EQ (raw_key.keysym, Qbutton6) || EQ (raw_key.keysym, Qbutton6up) || | 1673 EQ (raw_key.keysym, Qbutton6) || EQ (raw_key.keysym, Qbutton6up) || |
1540 EQ (raw_key.keysym, Qbutton7) || EQ (raw_key.keysym, Qbutton7up)) | 1674 EQ (raw_key.keysym, Qbutton7) || EQ (raw_key.keysym, Qbutton7up)) |
1541 invalid_operation ("Mouse-clicks can't appear in saved keyboard macros", | 1675 invalid_operation ("Mouse-clicks can't appear in saved keyboard macros", |
1542 Qunbound); | 1676 Qunbound); |
1543 | 1677 |
1678 #ifdef USE_KKCC | |
1679 XSET_EVENT_CHANNEL (event, Vselected_console); | |
1680 XSET_EVENT_TYPE (event, key_press_event); | |
1681 XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), raw_key.keysym); | |
1682 XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (&raw_key)); | |
1683 #else /* not USE_KKCC */ | |
1544 XEVENT (event)->channel = Vselected_console; | 1684 XEVENT (event)->channel = Vselected_console; |
1545 XEVENT (event)->event_type = key_press_event; | 1685 XEVENT (event)->event_type = key_press_event; |
1546 XEVENT (event)->event.key.keysym = raw_key.keysym; | 1686 XEVENT (event)->event.key.keysym = raw_key.keysym; |
1547 XEVENT (event)->event.key.modifiers = raw_key.modifiers; | 1687 XEVENT (event)->event.key.modifiers = raw_key.modifiers; |
1688 #endif /* not USE_KKCC */ | |
1548 } | 1689 } |
1549 | 1690 |
1550 | 1691 |
1551 int | 1692 int |
1552 event_matches_key_specifier_p (Lisp_Event *event, Lisp_Object key_specifier) | 1693 event_matches_key_specifier_p (Lisp_Event *event, Lisp_Object key_specifier) |
1587 | 1728 |
1588 ch1 = event_to_character (event, 0, 0, 0); | 1729 ch1 = event_to_character (event, 0, 0, 0); |
1589 ch2 = event_to_character (XEVENT (event2), 0, 0, 0); | 1730 ch2 = event_to_character (XEVENT (event2), 0, 0, 0); |
1590 retval = (ch1 >= 0 && ch2 >= 0 && ch1 == ch2); | 1731 retval = (ch1 >= 0 && ch2 >= 0 && ch1 == ch2); |
1591 } | 1732 } |
1733 #ifdef USE_KKCC | |
1734 else if (EQ (XKEY_DATA_KEYSYM (EVENT_DATA (event)), XKEY_DATA_KEYSYM (XEVENT_DATA (event2))) && | |
1735 XKEY_DATA_MODIFIERS (EVENT_DATA (event)) == XKEY_DATA_MODIFIERS (XEVENT_DATA (event2))) | |
1736 #else /* not USE_KKCC */ | |
1592 else if (EQ (event->event.key.keysym, XEVENT (event2)->event.key.keysym) && | 1737 else if (EQ (event->event.key.keysym, XEVENT (event2)->event.key.keysym) && |
1593 event->event.key.modifiers == XEVENT (event2)->event.key.modifiers) | 1738 event->event.key.modifiers == XEVENT (event2)->event.key.modifiers) |
1739 #endif /* not USE_KKCC */ | |
1594 retval = 1; | 1740 retval = 1; |
1595 else | 1741 else |
1596 retval = 0; | 1742 retval = 0; |
1597 Fdeallocate_event (event2); | 1743 Fdeallocate_event (event2); |
1598 UNGCPRO; | 1744 UNGCPRO; |
1599 return retval; | 1745 return retval; |
1600 } | 1746 } |
1601 | 1747 |
1602 static int | 1748 static int |
1749 #ifdef USE_KKCC | |
1750 meta_prefix_char_p (const Lisp_Key_Data *key) | |
1751 #else /* not USE_KKCC */ | |
1603 meta_prefix_char_p (const struct key_data *key) | 1752 meta_prefix_char_p (const struct key_data *key) |
1604 { | 1753 #endif /* not USE_KKCC */ |
1754 { | |
1755 #ifdef USE_KKCC | |
1756 Lisp_Object event = Fmake_event (Qnil, Qnil); | |
1757 struct gcpro gcpro1; | |
1758 GCPRO1 (event); | |
1759 | |
1760 XSET_EVENT_TYPE (event, key_press_event); | |
1761 XSET_EVENT_CHANNEL (event, Vselected_console); | |
1762 XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), KEY_DATA_KEYSYM (key)); | |
1763 XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (key)); | |
1764 return event_matches_key_specifier_p (XEVENT(event), Vmeta_prefix_char); | |
1765 #else /* not USE_KKCC */ | |
1605 Lisp_Event event; | 1766 Lisp_Event event; |
1606 | 1767 |
1607 event.event_type = key_press_event; | 1768 event.event_type = key_press_event; |
1608 event.channel = Vselected_console; | 1769 event.channel = Vselected_console; |
1609 event.event.key.keysym = key->keysym; | 1770 event.event.key.keysym = key->keysym; |
1610 event.event.key.modifiers = key->modifiers; | 1771 event.event.key.modifiers = key->modifiers; |
1611 return event_matches_key_specifier_p (&event, Vmeta_prefix_char); | 1772 return event_matches_key_specifier_p (&event, Vmeta_prefix_char); |
1773 #endif /* not USE_KKCC */ | |
1612 } | 1774 } |
1613 | 1775 |
1614 DEFUN ("event-matches-key-specifier-p", Fevent_matches_key_specifier_p, 2, 2, 0, /* | 1776 DEFUN ("event-matches-key-specifier-p", Fevent_matches_key_specifier_p, 2, 2, 0, /* |
1615 Return non-nil if EVENT matches KEY-SPECIFIER. | 1777 Return non-nil if EVENT matches KEY-SPECIFIER. |
1616 This can be useful, e.g., to determine if the user pressed `help-char' or | 1778 This can be useful, e.g., to determine if the user pressed `help-char' or |
1620 { | 1782 { |
1621 CHECK_LIVE_EVENT (event); | 1783 CHECK_LIVE_EVENT (event); |
1622 return (event_matches_key_specifier_p (XEVENT (event), key_specifier) | 1784 return (event_matches_key_specifier_p (XEVENT (event), key_specifier) |
1623 ? Qt : Qnil); | 1785 ? Qt : Qnil); |
1624 } | 1786 } |
1625 | 1787 #ifdef USE_KKCC |
1788 #define MACROLET(k,m) do { \ | |
1789 SET_KEY_DATA_KEYSYM(returned_value, k); \ | |
1790 SET_KEY_DATA_MODIFIERS(returned_value, m); \ | |
1791 RETURN_SANS_WARNINGS; \ | |
1792 } while (0) | |
1793 #else /* not USE_KKCC */ | |
1626 #define MACROLET(k,m) do { \ | 1794 #define MACROLET(k,m) do { \ |
1627 returned_value->keysym = (k); \ | 1795 returned_value->keysym = (k); \ |
1628 returned_value->modifiers = (m); \ | 1796 returned_value->modifiers = (m); \ |
1629 RETURN_SANS_WARNINGS; \ | 1797 RETURN_SANS_WARNINGS; \ |
1630 } while (0) | 1798 } while (0) |
1631 | 1799 #endif /* not USE_KKCC */ |
1632 /* ASCII grunge. | 1800 /* ASCII grunge. |
1633 Given a keysym, return another keysym/modifier pair which could be | 1801 Given a keysym, return another keysym/modifier pair which could be |
1634 considered the same key in an ASCII world. Backspace returns ^H, for | 1802 considered the same key in an ASCII world. Backspace returns ^H, for |
1635 example. | 1803 example. |
1636 */ | 1804 */ |
1637 static void | 1805 static void |
1806 #ifdef USE_KKCC | |
1807 define_key_alternate_name (Lisp_Key_Data *key, | |
1808 Lisp_Key_Data *returned_value) | |
1809 #else /* not USE_KKCC */ | |
1638 define_key_alternate_name (struct key_data *key, | 1810 define_key_alternate_name (struct key_data *key, |
1639 struct key_data *returned_value) | 1811 struct key_data *returned_value) |
1640 { | 1812 #endif /* not USE_KKCC */ |
1813 { | |
1814 #ifdef USE_KKCC | |
1815 Lisp_Object keysym = KEY_DATA_KEYSYM (key); | |
1816 int modifiers = KEY_DATA_MODIFIERS (key); | |
1817 #else /* not USE_KKCC */ | |
1641 Lisp_Object keysym = key->keysym; | 1818 Lisp_Object keysym = key->keysym; |
1642 int modifiers = key->modifiers; | 1819 int modifiers = key->modifiers; |
1820 #endif /* not USE_KKCC */ | |
1643 int modifiers_sans_control = (modifiers & (~XEMACS_MOD_CONTROL)); | 1821 int modifiers_sans_control = (modifiers & (~XEMACS_MOD_CONTROL)); |
1644 int modifiers_sans_meta = (modifiers & (~XEMACS_MOD_META)); | 1822 int modifiers_sans_meta = (modifiers & (~XEMACS_MOD_META)); |
1823 #ifdef USE_KKCC | |
1824 SET_KEY_DATA_KEYSYM (returned_value, Qnil); /* By default, no "alternate" key */ | |
1825 SET_KEY_DATA_MODIFIERS (returned_value, 0); | |
1826 #else /* not USE_KKCC */ | |
1645 returned_value->keysym = Qnil; /* By default, no "alternate" key */ | 1827 returned_value->keysym = Qnil; /* By default, no "alternate" key */ |
1646 returned_value->modifiers = 0; | 1828 returned_value->modifiers = 0; |
1829 #endif /* not USE_KKCC */ | |
1647 if (modifiers_sans_meta == XEMACS_MOD_CONTROL) | 1830 if (modifiers_sans_meta == XEMACS_MOD_CONTROL) |
1648 { | 1831 { |
1649 if (EQ (keysym, QKspace)) | 1832 if (EQ (keysym, QKspace)) |
1650 MACROLET (make_char ('@'), modifiers); | 1833 MACROLET (make_char ('@'), modifiers); |
1651 else if (!CHARP (keysym)) | 1834 else if (!CHARP (keysym)) |
1692 { | 1875 { |
1693 /* This function can GC */ | 1876 /* This function can GC */ |
1694 Lisp_Object new_keys; | 1877 Lisp_Object new_keys; |
1695 int i; | 1878 int i; |
1696 Lisp_Object mpc_binding; | 1879 Lisp_Object mpc_binding; |
1880 #ifdef USE_KKCC | |
1881 Lisp_Key_Data meta_key; | |
1882 #else /* not USE_KKCC */ | |
1697 struct key_data meta_key; | 1883 struct key_data meta_key; |
1698 | 1884 #endif /* not USE_KKCC */ |
1699 if (NILP (Vmeta_prefix_char) || | 1885 if (NILP (Vmeta_prefix_char) || |
1700 (INTP (Vmeta_prefix_char) && !CHAR_INTP (Vmeta_prefix_char))) | 1886 (INTP (Vmeta_prefix_char) && !CHAR_INTP (Vmeta_prefix_char))) |
1701 return; | 1887 return; |
1702 | 1888 |
1703 define_key_parser (Vmeta_prefix_char, &meta_key); | 1889 define_key_parser (Vmeta_prefix_char, &meta_key); |
1894 | 2080 |
1895 idx = 0; | 2081 idx = 0; |
1896 while (1) | 2082 while (1) |
1897 { | 2083 { |
1898 Lisp_Object c; | 2084 Lisp_Object c; |
2085 #ifdef USE_KKCC | |
2086 Lisp_Key_Data raw_key1; | |
2087 Lisp_Key_Data raw_key2; | |
2088 #else /* not USE_KKCC */ | |
1899 struct key_data raw_key1; | 2089 struct key_data raw_key1; |
1900 struct key_data raw_key2; | 2090 struct key_data raw_key2; |
1901 | 2091 #endif /* not USE_KKCC */ |
1902 if (STRINGP (keys)) | 2092 if (STRINGP (keys)) |
1903 c = make_char (string_ichar (keys, idx)); | 2093 c = make_char (string_ichar (keys, idx)); |
1904 else | 2094 else |
1905 c = XVECTOR_DATA (keys) [idx]; | 2095 c = XVECTOR_DATA (keys) [idx]; |
1906 | 2096 |
2010 to make where-is-internal really fly. */ | 2200 to make where-is-internal really fly. */ |
2011 | 2201 |
2012 struct raw_lookup_key_mapper_closure | 2202 struct raw_lookup_key_mapper_closure |
2013 { | 2203 { |
2014 int remaining; | 2204 int remaining; |
2205 #ifdef USE_KKCC | |
2206 const Lisp_Key_Data *raw_keys; | |
2207 #else /* not USE_KKCC */ | |
2015 const struct key_data *raw_keys; | 2208 const struct key_data *raw_keys; |
2209 #endif /* not USE_KKCC */ | |
2016 int raw_keys_count; | 2210 int raw_keys_count; |
2017 int keys_so_far; | 2211 int keys_so_far; |
2018 int accept_default; | 2212 int accept_default; |
2019 }; | 2213 }; |
2020 | 2214 |
2021 static Lisp_Object raw_lookup_key_mapper (Lisp_Object k, void *); | 2215 static Lisp_Object raw_lookup_key_mapper (Lisp_Object k, void *); |
2022 | 2216 |
2023 /* Caller should gc-protect args (keymaps may autoload) */ | 2217 /* Caller should gc-protect args (keymaps may autoload) */ |
2024 static Lisp_Object | 2218 static Lisp_Object |
2025 raw_lookup_key (Lisp_Object keymap, | 2219 raw_lookup_key (Lisp_Object keymap, |
2220 #ifdef USE_KKCC | |
2221 const Lisp_Key_Data *raw_keys, int raw_keys_count, | |
2222 #else /* not USE_KKCC */ | |
2026 const struct key_data *raw_keys, int raw_keys_count, | 2223 const struct key_data *raw_keys, int raw_keys_count, |
2224 #endif /* not USE_KKCC */ | |
2027 int keys_so_far, int accept_default) | 2225 int keys_so_far, int accept_default) |
2028 { | 2226 { |
2029 /* This function can GC */ | 2227 /* This function can GC */ |
2030 struct raw_lookup_key_mapper_closure c; | 2228 struct raw_lookup_key_mapper_closure c; |
2031 c.remaining = raw_keys_count - 1; | 2229 c.remaining = raw_keys_count - 1; |
2044 struct raw_lookup_key_mapper_closure *c = | 2242 struct raw_lookup_key_mapper_closure *c = |
2045 (struct raw_lookup_key_mapper_closure *) arg; | 2243 (struct raw_lookup_key_mapper_closure *) arg; |
2046 int accept_default = c->accept_default; | 2244 int accept_default = c->accept_default; |
2047 int remaining = c->remaining; | 2245 int remaining = c->remaining; |
2048 int keys_so_far = c->keys_so_far; | 2246 int keys_so_far = c->keys_so_far; |
2247 #ifdef USE_KKCC | |
2248 const Lisp_Key_Data *raw_keys = c->raw_keys; | |
2249 #else /* not USE_KKCC */ | |
2049 const struct key_data *raw_keys = c->raw_keys; | 2250 const struct key_data *raw_keys = c->raw_keys; |
2251 #endif /* not USE_KKCC */ | |
2050 Lisp_Object cmd; | 2252 Lisp_Object cmd; |
2051 | 2253 |
2052 if (! meta_prefix_char_p (&(raw_keys[0]))) | 2254 if (! meta_prefix_char_p (&(raw_keys[0]))) |
2053 { | 2255 { |
2054 /* Normal case: every case except the meta-hack (see below). */ | 2256 /* Normal case: every case except the meta-hack (see below). */ |
2097 if (!NILP (cmd)) | 2299 if (!NILP (cmd)) |
2098 cmd = raw_lookup_key (cmd, raw_keys + 1, remaining, | 2300 cmd = raw_lookup_key (cmd, raw_keys + 1, remaining, |
2099 keys_so_far + 1, accept_default); | 2301 keys_so_far + 1, accept_default); |
2100 else if ((raw_keys[1].modifiers & XEMACS_MOD_META) == 0) | 2302 else if ((raw_keys[1].modifiers & XEMACS_MOD_META) == 0) |
2101 { | 2303 { |
2304 #ifdef USE_KKCC | |
2305 Lisp_Key_Data metified; | |
2306 #else /* not USE_KKCC */ | |
2102 struct key_data metified; | 2307 struct key_data metified; |
2308 #endif /* not USE_KKCC */ | |
2103 metified.keysym = raw_keys[1].keysym; | 2309 metified.keysym = raw_keys[1].keysym; |
2104 metified.modifiers = raw_keys[1].modifiers | | 2310 metified.modifiers = raw_keys[1].modifiers | |
2105 (unsigned char) XEMACS_MOD_META; | 2311 (unsigned char) XEMACS_MOD_META; |
2106 | 2312 |
2107 /* Search for meta-next-char sequence directly */ | 2313 /* Search for meta-next-char sequence directly */ |
2129 static Lisp_Object | 2335 static Lisp_Object |
2130 lookup_keys (Lisp_Object keymap, int nkeys, Lisp_Object *keys, | 2336 lookup_keys (Lisp_Object keymap, int nkeys, Lisp_Object *keys, |
2131 int accept_default) | 2337 int accept_default) |
2132 { | 2338 { |
2133 /* This function can GC */ | 2339 /* This function can GC */ |
2340 #ifdef USE_KKCC | |
2341 Lisp_Key_Data kkk[20]; | |
2342 Lisp_Key_Data *raw_keys; | |
2343 #else /* not USE_KKCC */ | |
2134 struct key_data kkk[20]; | 2344 struct key_data kkk[20]; |
2135 struct key_data *raw_keys; | 2345 struct key_data *raw_keys; |
2346 #endif /* not USE_KKCC */ | |
2136 int i; | 2347 int i; |
2137 | 2348 |
2138 if (nkeys == 0) | 2349 if (nkeys == 0) |
2139 return Qnil; | 2350 return Qnil; |
2140 | 2351 |
2141 if (nkeys < countof (kkk)) | 2352 if (nkeys < countof (kkk)) |
2142 raw_keys = kkk; | 2353 raw_keys = kkk; |
2143 else | 2354 else |
2355 #ifdef USE_KKCC | |
2356 raw_keys = alloca_array (Lisp_Key_Data, nkeys); | |
2357 #else /* not USE_KKCC */ | |
2144 raw_keys = alloca_array (struct key_data, nkeys); | 2358 raw_keys = alloca_array (struct key_data, nkeys); |
2359 #endif /* not USE_KKCC */ | |
2145 | 2360 |
2146 for (i = 0; i < nkeys; i++) | 2361 for (i = 0; i < nkeys; i++) |
2147 { | 2362 { |
2148 define_key_parser (keys[i], &(raw_keys[i])); | 2363 define_key_parser (keys[i], &(raw_keys[i])); |
2149 } | 2364 } |
2153 static Lisp_Object | 2368 static Lisp_Object |
2154 lookup_events (Lisp_Object event_head, int nmaps, Lisp_Object keymaps[], | 2369 lookup_events (Lisp_Object event_head, int nmaps, Lisp_Object keymaps[], |
2155 int accept_default) | 2370 int accept_default) |
2156 { | 2371 { |
2157 /* This function can GC */ | 2372 /* This function can GC */ |
2373 #ifdef USE_KKCC | |
2374 Lisp_Key_Data kkk[20]; | |
2375 #else /* not USE_KKCC */ | |
2158 struct key_data kkk[20]; | 2376 struct key_data kkk[20]; |
2377 #endif /* not USE_KKCC */ | |
2159 Lisp_Object event; | 2378 Lisp_Object event; |
2160 | 2379 |
2161 int nkeys; | 2380 int nkeys; |
2381 #ifdef USE_KKCC | |
2382 Lisp_Key_Data *raw_keys; | |
2383 #else /* not USE_KKCC */ | |
2162 struct key_data *raw_keys; | 2384 struct key_data *raw_keys; |
2385 #endif /* not USE_KKCC */ | |
2163 Lisp_Object tem = Qnil; | 2386 Lisp_Object tem = Qnil; |
2164 struct gcpro gcpro1, gcpro2; | 2387 struct gcpro gcpro1, gcpro2; |
2165 int iii; | 2388 int iii; |
2166 | 2389 |
2167 CHECK_LIVE_EVENT (event_head); | 2390 CHECK_LIVE_EVENT (event_head); |
2169 nkeys = event_chain_count (event_head); | 2392 nkeys = event_chain_count (event_head); |
2170 | 2393 |
2171 if (nkeys < countof (kkk)) | 2394 if (nkeys < countof (kkk)) |
2172 raw_keys = kkk; | 2395 raw_keys = kkk; |
2173 else | 2396 else |
2397 #ifdef USE_KKCC | |
2398 raw_keys = alloca_array (Lisp_Key_Data, nkeys); | |
2399 #else /* not USE_KKCC */ | |
2174 raw_keys = alloca_array (struct key_data, nkeys); | 2400 raw_keys = alloca_array (struct key_data, nkeys); |
2401 #endif /* not USE_KKCC */ | |
2175 | 2402 |
2176 nkeys = 0; | 2403 nkeys = 0; |
2177 EVENT_CHAIN_LOOP (event, event_head) | 2404 EVENT_CHAIN_LOOP (event, event_head) |
2178 define_key_parser (event, &(raw_keys[nkeys++])); | 2405 define_key_parser (event, &(raw_keys[nkeys++])); |
2179 GCPRO2 (keymaps[0], event_head); | 2406 GCPRO2 (keymaps[0], event_head); |
2218 return lookup_keys (keymap, 1, &keys, !NILP (accept_default)); | 2445 return lookup_keys (keymap, 1, &keys, !NILP (accept_default)); |
2219 else if (STRINGP (keys)) | 2446 else if (STRINGP (keys)) |
2220 { | 2447 { |
2221 int length = string_char_length (keys); | 2448 int length = string_char_length (keys); |
2222 int i; | 2449 int i; |
2450 #ifdef USE_KKCC | |
2451 Lisp_Key_Data *raw_keys = alloca_array (Lisp_Key_Data, length); | |
2452 #else /* not USE_KKCC */ | |
2223 struct key_data *raw_keys = alloca_array (struct key_data, length); | 2453 struct key_data *raw_keys = alloca_array (struct key_data, length); |
2454 #endif /* not USE_KKCC */ | |
2224 if (length == 0) | 2455 if (length == 0) |
2225 return Qnil; | 2456 return Qnil; |
2226 | 2457 |
2227 for (i = 0; i < length; i++) | 2458 for (i = 0; i < length; i++) |
2228 { | 2459 { |
2797 outside of this file doesn't need to know about. | 3028 outside of this file doesn't need to know about. |
2798 */ | 3029 */ |
2799 | 3030 |
2800 struct map_keymap_unsorted_closure | 3031 struct map_keymap_unsorted_closure |
2801 { | 3032 { |
3033 #ifdef USE_KKCC | |
3034 void (*fn) (const Lisp_Key_Data *, Lisp_Object binding, void *arg); | |
3035 #else /* not USE_KKCC */ | |
2802 void (*fn) (const struct key_data *, Lisp_Object binding, void *arg); | 3036 void (*fn) (const struct key_data *, Lisp_Object binding, void *arg); |
3037 #endif /* not USE_KKCC */ | |
2803 void *arg; | 3038 void *arg; |
2804 int modifiers; | 3039 int modifiers; |
2805 }; | 3040 }; |
2806 | 3041 |
2807 /* used by map_keymap() */ | 3042 /* used by map_keymap() */ |
2825 map_keymap_unsorted_closure); | 3060 map_keymap_unsorted_closure); |
2826 closure->modifiers = omod; | 3061 closure->modifiers = omod; |
2827 } | 3062 } |
2828 else | 3063 else |
2829 { | 3064 { |
3065 #ifdef USE_KKCC | |
3066 Lisp_Key_Data key; | |
3067 #else /* not USE_KKCC */ | |
2830 struct key_data key; | 3068 struct key_data key; |
3069 #endif /* not USE_KKCC */ | |
2831 key.keysym = keysym; | 3070 key.keysym = keysym; |
2832 key.modifiers = modifiers; | 3071 key.modifiers = modifiers; |
2833 ((*closure->fn) (&key, value, closure->arg)); | 3072 ((*closure->fn) (&key, value, closure->arg)); |
2834 } | 3073 } |
2835 return 0; | 3074 return 0; |
2932 | 3171 |
2933 /* used by map_keymap() */ | 3172 /* used by map_keymap() */ |
2934 static void | 3173 static void |
2935 map_keymap_sorted (Lisp_Object keymap_table, | 3174 map_keymap_sorted (Lisp_Object keymap_table, |
2936 int modifiers, | 3175 int modifiers, |
3176 #ifdef USE_KKCC | |
3177 void (*function) (const Lisp_Key_Data *key, | |
3178 #else /* not USE_KKCC */ | |
2937 void (*function) (const struct key_data *key, | 3179 void (*function) (const struct key_data *key, |
3180 #endif /* not USE_KKCC */ | |
2938 Lisp_Object binding, | 3181 Lisp_Object binding, |
2939 void *map_keymap_sorted_closure), | 3182 void *map_keymap_sorted_closure), |
2940 void *map_keymap_sorted_closure) | 3183 void *map_keymap_sorted_closure) |
2941 { | 3184 { |
2942 /* This function can GC */ | 3185 /* This function can GC */ |
2965 (modifiers | sub_bits), | 3208 (modifiers | sub_bits), |
2966 function, | 3209 function, |
2967 map_keymap_sorted_closure); | 3210 map_keymap_sorted_closure); |
2968 else | 3211 else |
2969 { | 3212 { |
3213 #ifdef USE_KKCC | |
3214 Lisp_Key_Data k; | |
3215 #else /* not USE_KKCC */ | |
2970 struct key_data k; | 3216 struct key_data k; |
3217 #endif /* not USE_KKCC */ | |
2971 k.keysym = keysym; | 3218 k.keysym = keysym; |
2972 k.modifiers = modifiers; | 3219 k.modifiers = modifiers; |
2973 ((*function) (&k, binding, map_keymap_sorted_closure)); | 3220 ((*function) (&k, binding, map_keymap_sorted_closure)); |
2974 } | 3221 } |
2975 } | 3222 } |
2977 } | 3224 } |
2978 | 3225 |
2979 | 3226 |
2980 /* used by Fmap_keymap() */ | 3227 /* used by Fmap_keymap() */ |
2981 static void | 3228 static void |
3229 #ifdef USE_KKCC | |
3230 map_keymap_mapper (const Lisp_Key_Data *key, | |
3231 #else /* not USE_KKCC */ | |
2982 map_keymap_mapper (const struct key_data *key, | 3232 map_keymap_mapper (const struct key_data *key, |
3233 #endif /* not USE_KKCC */ | |
2983 Lisp_Object binding, | 3234 Lisp_Object binding, |
2984 void *function) | 3235 void *function) |
2985 { | 3236 { |
2986 /* This function can GC */ | 3237 /* This function can GC */ |
2987 Lisp_Object fn; | 3238 Lisp_Object fn; |
2990 } | 3241 } |
2991 | 3242 |
2992 | 3243 |
2993 static void | 3244 static void |
2994 map_keymap (Lisp_Object keymap_table, int sort_first, | 3245 map_keymap (Lisp_Object keymap_table, int sort_first, |
3246 #ifdef USE_KKCC | |
3247 void (*function) (const Lisp_Key_Data *key, | |
3248 #else /* not USE_KKCC */ | |
2995 void (*function) (const struct key_data *key, | 3249 void (*function) (const struct key_data *key, |
3250 #endif /* not USE_KKCC */ | |
2996 Lisp_Object binding, | 3251 Lisp_Object binding, |
2997 void *fn_arg), | 3252 void *fn_arg), |
2998 void *fn_arg) | 3253 void *fn_arg) |
2999 { | 3254 { |
3000 /* This function can GC */ | 3255 /* This function can GC */ |
3089 Lisp_Object thisseq = Fcar (Fcar (closure->tail)); | 3344 Lisp_Object thisseq = Fcar (Fcar (closure->tail)); |
3090 Lisp_Object cmd = get_keyelt (contents, 1); | 3345 Lisp_Object cmd = get_keyelt (contents, 1); |
3091 Lisp_Object vec; | 3346 Lisp_Object vec; |
3092 int j; | 3347 int j; |
3093 int len; | 3348 int len; |
3349 #ifdef USE_KKCC | |
3350 Lisp_Key_Data key; | |
3351 #else /* not USE_KKCC */ | |
3094 struct key_data key; | 3352 struct key_data key; |
3353 #endif /* not USE_KKCC */ | |
3095 key.keysym = keysym; | 3354 key.keysym = keysym; |
3096 key.modifiers = modifiers; | 3355 key.modifiers = modifiers; |
3097 | 3356 |
3098 if (NILP (cmd)) | 3357 if (NILP (cmd)) |
3099 abort (); | 3358 abort (); |
3177 keymap = def; | 3436 keymap = def; |
3178 p = make_vector (len, Qnil); | 3437 p = make_vector (len, Qnil); |
3179 NGCPRO1 (p); | 3438 NGCPRO1 (p); |
3180 for (iii = 0; iii < len; iii++) | 3439 for (iii = 0; iii < len; iii++) |
3181 { | 3440 { |
3441 #ifdef USE_KKCC | |
3442 Lisp_Key_Data key; | |
3443 #else /* not USE_KKCC */ | |
3182 struct key_data key; | 3444 struct key_data key; |
3445 #endif /* not USE_KKCC */ | |
3183 define_key_parser (Faref (prefix, make_int (iii)), &key); | 3446 define_key_parser (Faref (prefix, make_int (iii)), &key); |
3184 XVECTOR_DATA (p)[iii] = make_key_description (&key, 1); | 3447 XVECTOR_DATA (p)[iii] = make_key_description (&key, 1); |
3185 } | 3448 } |
3186 NUNGCPRO; | 3449 NUNGCPRO; |
3187 prefix = p; | 3450 prefix = p; |
3273 DECLARE_EISTRING_MALLOC (buf); | 3536 DECLARE_EISTRING_MALLOC (buf); |
3274 Lisp_Object str; | 3537 Lisp_Object str; |
3275 | 3538 |
3276 if (!EVENTP (key)) | 3539 if (!EVENTP (key)) |
3277 { | 3540 { |
3541 #ifdef USE_KKCC | |
3542 Lisp_Object event = Fmake_event (Qnil, Qnil); | |
3543 XSET_EVENT_TYPE (event, empty_event); | |
3544 CHECK_CHAR_COERCE_INT (key); | |
3545 character_to_event (XCHAR (key), XEVENT(event), | |
3546 XCONSOLE (Vselected_console), 0, 1); | |
3547 format_event_object (buf, event, 1); | |
3548 } | |
3549 else | |
3550 format_event_object (buf, key, 1); | |
3551 #else /* not USE_KKCC */ | |
3278 Lisp_Event event; | 3552 Lisp_Event event; |
3279 event.event_type = empty_event; | 3553 event.event_type = empty_event; |
3280 CHECK_CHAR_COERCE_INT (key); | 3554 CHECK_CHAR_COERCE_INT (key); |
3281 character_to_event (XCHAR (key), &event, | 3555 character_to_event (XCHAR (key), &event, |
3282 XCONSOLE (Vselected_console), 0, 1); | 3556 XCONSOLE (Vselected_console), 0, 1); |
3283 format_event_object (buf, &event, 1); | 3557 format_event_object (buf, &event, 1); |
3284 } | 3558 } |
3285 else | 3559 else |
3286 format_event_object (buf, XEVENT (key), 1); | 3560 format_event_object (buf, XEVENT (key), 1); |
3561 #endif /* not USE_KKCC */ | |
3287 str = eimake_string (buf); | 3562 str = eimake_string (buf); |
3288 eifree (buf); | 3563 eifree (buf); |
3289 return str; | 3564 return str; |
3290 } | 3565 } |
3291 | 3566 |
3505 where_is_internal (definition, maps, nmaps, Qt, buffer); | 3780 where_is_internal (definition, maps, nmaps, Qt, buffer); |
3506 } | 3781 } |
3507 | 3782 |
3508 | 3783 |
3509 static Lisp_Object | 3784 static Lisp_Object |
3785 #ifdef USE_KKCC | |
3786 raw_keys_to_keys (Lisp_Key_Data *keys, int count) | |
3787 #else /* not USE_KKCC */ | |
3510 raw_keys_to_keys (struct key_data *keys, int count) | 3788 raw_keys_to_keys (struct key_data *keys, int count) |
3789 #endif /* not USE_KKCC */ | |
3511 { | 3790 { |
3512 Lisp_Object result = make_vector (count, Qnil); | 3791 Lisp_Object result = make_vector (count, Qnil); |
3513 while (count--) | 3792 while (count--) |
3514 XVECTOR_DATA (result) [count] = make_key_description (&(keys[count]), 1); | 3793 XVECTOR_DATA (result) [count] = make_key_description (&(keys[count]), 1); |
3515 return result; | 3794 return result; |
3516 } | 3795 } |
3517 | 3796 |
3518 | 3797 |
3519 static void | 3798 static void |
3799 #ifdef USE_KKCC | |
3800 format_raw_keys (Lisp_Key_Data *keys, int count, Eistring *buf) | |
3801 #else /* not USE_KKCC */ | |
3520 format_raw_keys (struct key_data *keys, int count, Eistring *buf) | 3802 format_raw_keys (struct key_data *keys, int count, Eistring *buf) |
3803 #endif /* not USE_KKCC */ | |
3521 { | 3804 { |
3522 int i; | 3805 int i; |
3806 #ifdef USE_KKCC | |
3807 Lisp_Object event = Fmake_event (Qnil, Qnil); | |
3808 XSET_EVENT_TYPE (event, key_press_event); | |
3809 XSET_EVENT_CHANNEL (event, Vselected_console); | |
3810 #else /* not USE_KKCC */ | |
3523 Lisp_Event event; | 3811 Lisp_Event event; |
3524 event.event_type = key_press_event; | 3812 event.event_type = key_press_event; |
3525 event.channel = Vselected_console; | 3813 event.channel = Vselected_console; |
3814 #endif /* not USE_KKCC */ | |
3526 for (i = 0; i < count; i++) | 3815 for (i = 0; i < count; i++) |
3527 { | 3816 { |
3817 #ifdef USE_KKCC | |
3818 XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), keys[i].keysym); | |
3819 XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (&keys[i])); | |
3820 format_event_object (buf, event, 1); | |
3821 #else /* not USE_KKCC */ | |
3528 event.event.key.keysym = keys[i].keysym; | 3822 event.event.key.keysym = keys[i].keysym; |
3529 event.event.key.modifiers = keys[i].modifiers; | 3823 event.event.key.modifiers = keys[i].modifiers; |
3530 format_event_object (buf, &event, 1); | 3824 format_event_object (buf, &event, 1); |
3825 #endif /* not USE_KKCC */ | |
3531 if (i < count - 1) | 3826 if (i < count - 1) |
3532 eicat_c (buf, " "); | 3827 eicat_c (buf, " "); |
3533 } | 3828 } |
3534 } | 3829 } |
3535 | 3830 |
3561 int shadow_count; | 3856 int shadow_count; |
3562 int firstonly; | 3857 int firstonly; |
3563 int keys_count; | 3858 int keys_count; |
3564 int modifiers_so_far; | 3859 int modifiers_so_far; |
3565 Eistring *target_buffer; | 3860 Eistring *target_buffer; |
3861 #ifdef USE_KKCC | |
3862 Lisp_Key_Data *keys_so_far; | |
3863 #else /* not USE_KKCC */ | |
3566 struct key_data *keys_so_far; | 3864 struct key_data *keys_so_far; |
3865 #endif /* not USE_KKCC */ | |
3567 int keys_so_far_total_size; | 3866 int keys_so_far_total_size; |
3568 int keys_so_far_malloced; | 3867 int keys_so_far_malloced; |
3569 }; | 3868 }; |
3570 | 3869 |
3571 static Lisp_Object where_is_recursive_mapper (Lisp_Object map, void *arg); | 3870 static Lisp_Object where_is_recursive_mapper (Lisp_Object map, void *arg); |
3590 { | 3889 { |
3591 /* One or more keys in this map match the definition we're looking for. | 3890 /* One or more keys in this map match the definition we're looking for. |
3592 Verify that these bindings aren't shadowed by other bindings | 3891 Verify that these bindings aren't shadowed by other bindings |
3593 in the shadow maps. Either nil or number as value from | 3892 in the shadow maps. Either nil or number as value from |
3594 raw_lookup_key() means undefined. */ | 3893 raw_lookup_key() means undefined. */ |
3894 #ifdef USE_KKCC | |
3895 Lisp_Key_Data *so_far = c->keys_so_far; | |
3896 #else /* not USE_KKCC */ | |
3595 struct key_data *so_far = c->keys_so_far; | 3897 struct key_data *so_far = c->keys_so_far; |
3898 #endif /* not USE_KKCC */ | |
3596 | 3899 |
3597 for (;;) /* loop over all keys that match */ | 3900 for (;;) /* loop over all keys that match */ |
3598 { | 3901 { |
3599 Lisp_Object k = CONSP (keys) ? XCAR (keys) : keys; | 3902 Lisp_Object k = CONSP (keys) ? XCAR (keys) : keys; |
3600 int i; | 3903 int i; |
3601 | 3904 |
3602 so_far [keys_count].keysym = k; | 3905 so_far [keys_count].keysym = k; |
3906 #ifdef USE_KKCC | |
3907 SET_KEY_DATA_MODIFIERS (&so_far [keys_count], modifiers_so_far); | |
3908 #else /* not USE_KKCC */ | |
3603 so_far [keys_count].modifiers = modifiers_so_far; | 3909 so_far [keys_count].modifiers = modifiers_so_far; |
3910 #endif /* not USE_KKCC */ | |
3604 | 3911 |
3605 /* now loop over all shadow maps */ | 3912 /* now loop over all shadow maps */ |
3606 for (i = 0; i < c->shadow_count; i++) | 3913 for (i = 0; i < c->shadow_count; i++) |
3607 { | 3914 { |
3608 Lisp_Object shadowed = raw_lookup_key (c->shadow[i], | 3915 Lisp_Object shadowed = raw_lookup_key (c->shadow[i], |
3679 bucky = MODIFIER_HASH_KEY_BITS (key); | 3986 bucky = MODIFIER_HASH_KEY_BITS (key); |
3680 if (bucky != 0) | 3987 if (bucky != 0) |
3681 lower_modifiers = (modifiers_so_far | bucky); | 3988 lower_modifiers = (modifiers_so_far | bucky); |
3682 else | 3989 else |
3683 { | 3990 { |
3991 #ifdef USE_KKCC | |
3992 Lisp_Key_Data *so_far = c->keys_so_far; | |
3993 #else /* not USE_KKCC */ | |
3684 struct key_data *so_far = c->keys_so_far; | 3994 struct key_data *so_far = c->keys_so_far; |
3995 #endif /* not USE_KKCC */ | |
3685 lower_modifiers = 0; | 3996 lower_modifiers = 0; |
3686 so_far [lower_keys_count].keysym = key; | 3997 so_far [lower_keys_count].keysym = key; |
3998 #ifdef USE_KKCC | |
3999 SET_KEY_DATA_MODIFIERS (&so_far [lower_keys_count], modifiers_so_far); | |
4000 #else /* not USE_KKCC */ | |
3687 so_far [lower_keys_count].modifiers = modifiers_so_far; | 4001 so_far [lower_keys_count].modifiers = modifiers_so_far; |
4002 #endif /* not USE_KKCC */ | |
3688 lower_keys_count++; | 4003 lower_keys_count++; |
3689 } | 4004 } |
3690 | 4005 |
3691 if (lower_keys_count >= c->keys_so_far_total_size) | 4006 if (lower_keys_count >= c->keys_so_far_total_size) |
3692 { | 4007 { |
3693 int size = lower_keys_count + 50; | 4008 int size = lower_keys_count + 50; |
3694 if (! c->keys_so_far_malloced) | 4009 if (! c->keys_so_far_malloced) |
3695 { | 4010 { |
4011 #ifdef USE_KKCC | |
4012 Lisp_Key_Data *new = xnew_array (Lisp_Key_Data, size); | |
4013 #else /* not USE_KKCC */ | |
3696 struct key_data *new = xnew_array (struct key_data, size); | 4014 struct key_data *new = xnew_array (struct key_data, size); |
4015 #endif /* not USE_KKCC */ | |
3697 memcpy ((void *)new, (const void *)c->keys_so_far, | 4016 memcpy ((void *)new, (const void *)c->keys_so_far, |
4017 #ifdef USE_KKCC | |
4018 c->keys_so_far_total_size * sizeof (Lisp_Key_Data)); | |
4019 #else /* not USE_KKCC */ | |
3698 c->keys_so_far_total_size * sizeof (struct key_data)); | 4020 c->keys_so_far_total_size * sizeof (struct key_data)); |
4021 #endif /* not USE_KKCC */ | |
3699 } | 4022 } |
3700 else | 4023 else |
4024 #ifdef USE_KKCC | |
4025 XREALLOC_ARRAY (c->keys_so_far, Lisp_Key_Data, size); | |
4026 #else /* not USE_KKCC */ | |
3701 XREALLOC_ARRAY (c->keys_so_far, struct key_data, size); | 4027 XREALLOC_ARRAY (c->keys_so_far, struct key_data, size); |
4028 #endif /* not USE_KKCC */ | |
3702 | 4029 |
3703 c->keys_so_far_total_size = size; | 4030 c->keys_so_far_total_size = size; |
3704 c->keys_so_far_malloced = 1; | 4031 c->keys_so_far_malloced = 1; |
3705 } | 4032 } |
3706 | 4033 |
3730 Lisp_Object firstonly, Eistring *target_buffer) | 4057 Lisp_Object firstonly, Eistring *target_buffer) |
3731 { | 4058 { |
3732 /* This function can GC */ | 4059 /* This function can GC */ |
3733 Lisp_Object result = Qnil; | 4060 Lisp_Object result = Qnil; |
3734 int i; | 4061 int i; |
4062 #ifdef USE_KKCC | |
4063 Lisp_Key_Data raw[20]; | |
4064 #else /* not USE_KKCC */ | |
3735 struct key_data raw[20]; | 4065 struct key_data raw[20]; |
4066 #endif /* not USE_KKCC */ | |
3736 struct where_is_closure c; | 4067 struct where_is_closure c; |
3737 | 4068 |
3738 c.definition = definition; | 4069 c.definition = definition; |
3739 c.shadow = maps; | 4070 c.shadow = maps; |
3740 c.firstonly = !NILP (firstonly); | 4071 c.firstonly = !NILP (firstonly); |
3945 int mice_only_p; /* whether we are to display only button bindings */ | 4276 int mice_only_p; /* whether we are to display only button bindings */ |
3946 }; | 4277 }; |
3947 | 4278 |
3948 struct describe_map_shadow_closure | 4279 struct describe_map_shadow_closure |
3949 { | 4280 { |
4281 #ifdef USE_KKCC | |
4282 const Lisp_Key_Data *raw_key; | |
4283 #else /* not USE_KKCC */ | |
3950 const struct key_data *raw_key; | 4284 const struct key_data *raw_key; |
4285 #endif /* not USE_KKCC */ | |
3951 Lisp_Object self; | 4286 Lisp_Object self; |
3952 }; | 4287 }; |
3953 | 4288 |
3954 static Lisp_Object | 4289 static Lisp_Object |
3955 describe_map_mapper_shadow_search (Lisp_Object map, void *arg) | 4290 describe_map_mapper_shadow_search (Lisp_Object map, void *arg) |
3958 (struct describe_map_shadow_closure *) arg; | 4293 (struct describe_map_shadow_closure *) arg; |
3959 | 4294 |
3960 if (EQ (map, c->self)) | 4295 if (EQ (map, c->self)) |
3961 return Qzero; /* Not shadowed; terminate search */ | 4296 return Qzero; /* Not shadowed; terminate search */ |
3962 | 4297 |
4298 #ifdef USE_KKCC | |
4299 return !NILP (keymap_lookup_directly (map, | |
4300 KEY_DATA_KEYSYM (c->raw_key), | |
4301 KEY_DATA_MODIFIERS (c->raw_key))) | |
4302 #else /* not USE_KKCC */ | |
3963 return !NILP (keymap_lookup_directly (map, | 4303 return !NILP (keymap_lookup_directly (map, |
3964 c->raw_key->keysym, | 4304 c->raw_key->keysym, |
3965 c->raw_key->modifiers)) | 4305 c->raw_key->modifiers)) |
4306 #endif /* not USE_KKCC */ | |
3966 ? Qt : Qnil; | 4307 ? Qt : Qnil; |
3967 } | 4308 } |
3968 | 4309 |
3969 | 4310 |
3970 static Lisp_Object | 4311 static Lisp_Object |
3971 keymap_lookup_inherited_mapper (Lisp_Object km, void *arg) | 4312 keymap_lookup_inherited_mapper (Lisp_Object km, void *arg) |
3972 { | 4313 { |
4314 #ifdef USE_KKCC | |
4315 Lisp_Key_Data *k = (Lisp_Key_Data *) arg; | |
4316 return keymap_lookup_directly (km, KEY_DATA_KEYSYM (k), KEY_DATA_MODIFIERS (k)); | |
4317 #else /* not USE_KKCC */ | |
3973 struct key_data *k = (struct key_data *) arg; | 4318 struct key_data *k = (struct key_data *) arg; |
3974 return keymap_lookup_directly (km, k->keysym, k->modifiers); | 4319 return keymap_lookup_directly (km, k->keysym, k->modifiers); |
4320 #endif /* not USE_KKCC */ | |
3975 } | 4321 } |
3976 | 4322 |
3977 | 4323 |
3978 static void | 4324 static void |
4325 #ifdef USE_KKCC | |
4326 describe_map_mapper (const Lisp_Key_Data *key, | |
4327 #else /* not USE_KKCC */ | |
3979 describe_map_mapper (const struct key_data *key, | 4328 describe_map_mapper (const struct key_data *key, |
4329 #endif /* not USE_KKCC */ | |
3980 Lisp_Object binding, | 4330 Lisp_Object binding, |
3981 void *describe_map_closure) | 4331 void *describe_map_closure) |
3982 { | 4332 { |
3983 /* This function can GC */ | 4333 /* This function can GC */ |
3984 struct describe_map_closure *closure = | 4334 struct describe_map_closure *closure = |
3985 (struct describe_map_closure *) describe_map_closure; | 4335 (struct describe_map_closure *) describe_map_closure; |
4336 #ifdef USE_KKCC | |
4337 Lisp_Object keysym = KEY_DATA_KEYSYM (key); | |
4338 int modifiers = KEY_DATA_MODIFIERS (key); | |
4339 #else /* not USE_KKCC */ | |
3986 Lisp_Object keysym = key->keysym; | 4340 Lisp_Object keysym = key->keysym; |
3987 int modifiers = key->modifiers; | 4341 int modifiers = key->modifiers; |
4342 #endif /* not USE_KKCC */ | |
3988 | 4343 |
3989 /* Don't mention suppressed commands. */ | 4344 /* Don't mention suppressed commands. */ |
3990 if (SYMBOLP (binding) | 4345 if (SYMBOLP (binding) |
3991 && !NILP (closure->partial) | 4346 && !NILP (closure->partial) |
3992 && !NILP (Fget (binding, closure->partial, Qnil))) | 4347 && !NILP (Fget (binding, closure->partial, Qnil))) |