Mercurial > emacs
comparison src/keymap.c @ 93664:c7dd307b0ec5
* subr.el (keymap-canonicalize): New function.
* mouse.el (mouse-menu-non-singleton): Use it.
(mouse-major-mode-menu): Remove hack made unnecessary.
* keymap.c (Qkeymap_canonicalize): New var.
(Fmap_keymap_internal): New fun.
(describe_map): Use keymap-canonicalize.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Fri, 04 Apr 2008 17:31:20 +0000 |
parents | 29c57be95740 |
children | 9eaa3ee184e9 |
comparison
equal
deleted
inserted
replaced
93663:959f4471c16e | 93664:c7dd307b0ec5 |
---|---|
726 while (CONSP (map)) | 726 while (CONSP (map)) |
727 { | 727 { |
728 map = map_keymap_internal (map, fun, args, data); | 728 map = map_keymap_internal (map, fun, args, data); |
729 map = get_keymap (map, 0, autoload); | 729 map = get_keymap (map, 0, autoload); |
730 } | 730 } |
731 UNGCPRO; | |
732 } | |
733 | |
734 Lisp_Object Qkeymap_canonicalize; | |
735 | |
736 /* Same as map_keymap, but does it right, properly eliminating duplicate | |
737 bindings due to inheritance. */ | |
738 void | |
739 map_keymap_canonical (map, fun, args, data) | |
740 map_keymap_function_t fun; | |
741 Lisp_Object map, args; | |
742 void *data; | |
743 { | |
744 struct gcpro gcpro1; | |
745 GCPRO1 (args); | |
746 /* map_keymap_canonical may be used from redisplay (e.g. when building menus) | |
747 so be careful to ignore errors and to inhibit redisplay. */ | |
748 map = safe_call1 (Qkeymap_canonicalize, map); | |
749 /* No need to use `map_keymap' here because canonical map has no parent. */ | |
750 map_keymap_internal (map, fun, args, data); | |
731 UNGCPRO; | 751 UNGCPRO; |
732 } | 752 } |
733 | 753 |
734 DEFUN ("map-keymap-internal", Fmap_keymap_internal, Smap_keymap_internal, 2, 2, 0, | 754 DEFUN ("map-keymap-internal", Fmap_keymap_internal, Smap_keymap_internal, 2, 2, 0, |
735 doc: /* Call FUNCTION once for each event binding in KEYMAP. | 755 doc: /* Call FUNCTION once for each event binding in KEYMAP. |
3405 that is done once per keymap element, we don't want to cons up a | 3425 that is done once per keymap element, we don't want to cons up a |
3406 fresh vector every time. */ | 3426 fresh vector every time. */ |
3407 kludge = Fmake_vector (make_number (1), Qnil); | 3427 kludge = Fmake_vector (make_number (1), Qnil); |
3408 definition = Qnil; | 3428 definition = Qnil; |
3409 | 3429 |
3430 GCPRO3 (prefix, definition, kludge); | |
3431 | |
3432 map = call1 (Qkeymap_canonicalize, map); | |
3433 | |
3410 for (tail = map; CONSP (tail); tail = XCDR (tail)) | 3434 for (tail = map; CONSP (tail); tail = XCDR (tail)) |
3411 length_needed++; | 3435 length_needed++; |
3412 | 3436 |
3413 vect = ((struct describe_map_elt *) | 3437 vect = ((struct describe_map_elt *) |
3414 alloca (sizeof (struct describe_map_elt) * length_needed)); | 3438 alloca (sizeof (struct describe_map_elt) * length_needed)); |
3415 | |
3416 GCPRO3 (prefix, definition, kludge); | |
3417 | 3439 |
3418 for (tail = map; CONSP (tail); tail = XCDR (tail)) | 3440 for (tail = map; CONSP (tail); tail = XCDR (tail)) |
3419 { | 3441 { |
3420 QUIT; | 3442 QUIT; |
3421 | 3443 |
3847 staticpro (&Qkeymap); | 3869 staticpro (&Qkeymap); |
3848 staticpro (&apropos_predicate); | 3870 staticpro (&apropos_predicate); |
3849 staticpro (&apropos_accumulate); | 3871 staticpro (&apropos_accumulate); |
3850 apropos_predicate = Qnil; | 3872 apropos_predicate = Qnil; |
3851 apropos_accumulate = Qnil; | 3873 apropos_accumulate = Qnil; |
3874 | |
3875 Qkeymap_canonicalize = intern ("keymap-canonicalize"); | |
3876 staticpro (&Qkeymap_canonicalize); | |
3852 | 3877 |
3853 /* Now we are ready to set up this property, so we can | 3878 /* Now we are ready to set up this property, so we can |
3854 create char tables. */ | 3879 create char tables. */ |
3855 Fput (Qkeymap, Qchar_table_extra_slots, make_number (0)); | 3880 Fput (Qkeymap, Qchar_table_extra_slots, make_number (0)); |
3856 | 3881 |