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