Index: src/keymap.h =================================================================== RCS file: /sources/emacs/emacs/src/keymap.h,v retrieving revision 1.15 diff -u -r1.15 keymap.h *** src/keymap.h 15 Sep 2006 07:19:14 -0000 1.15 --- src/keymap.h 15 Sep 2006 23:46:07 -0000 *************** *** 34,40 **** EXFUN (Fkey_description, 2); EXFUN (Fsingle_key_description, 2); EXFUN (Fwhere_is_internal, 5); ! EXFUN (Fcurrent_active_maps, 1); extern Lisp_Object access_keymap P_ ((Lisp_Object, Lisp_Object, int, int, int)); extern Lisp_Object get_keyelt P_ ((Lisp_Object, int)); extern Lisp_Object get_keymap P_ ((Lisp_Object, int, int)); --- 34,40 ---- EXFUN (Fkey_description, 2); EXFUN (Fsingle_key_description, 2); EXFUN (Fwhere_is_internal, 5); ! EXFUN (Fcurrent_active_maps, 2); extern Lisp_Object access_keymap P_ ((Lisp_Object, Lisp_Object, int, int, int)); extern Lisp_Object get_keyelt P_ ((Lisp_Object, int)); extern Lisp_Object get_keymap P_ ((Lisp_Object, int, int)); Index: src/keymap.c =================================================================== RCS file: /sources/emacs/emacs/src/keymap.c,v retrieving revision 1.334 diff -u -r1.334 keymap.c *** src/keymap.c 15 Sep 2006 07:19:14 -0000 1.334 --- src/keymap.c 15 Sep 2006 23:46:10 -0000 *************** *** 1510,1523 **** } DEFUN ("current-active-maps", Fcurrent_active_maps, Scurrent_active_maps, ! 0, 1, 0, doc: /* Return a list of the currently active keymaps. OLP if non-nil indicates that we should obey `overriding-local-map' and ! `overriding-terminal-local-map'. */) ! (olp) ! Lisp_Object olp; { ! Lisp_Object keymaps = Fcons (current_global_map, Qnil); if (!NILP (olp)) { --- 1510,1556 ---- } DEFUN ("current-active-maps", Fcurrent_active_maps, Scurrent_active_maps, ! 0, 2, 0, doc: /* Return a list of the currently active keymaps. OLP if non-nil indicates that we should obey `overriding-local-map' and ! `overriding-terminal-local-map'. POSITION can specify a click position ! like in the respective argument of `key-binding'. */) ! (olp, position) ! Lisp_Object olp, position; { ! int count = SPECPDL_INDEX (); ! ! Lisp_Object keymaps; ! ! /* If a mouse click position is given, our variables are based on ! the buffer clicked on, not the current buffer. So we may have to ! switch the buffer here. */ ! ! if (CONSP (position)) ! { ! Lisp_Object window; ! ! window = POSN_WINDOW (position); ! ! if (WINDOWP (window) ! && BUFFERP (XWINDOW (window)->buffer) ! && XBUFFER (XWINDOW (window)->buffer) != current_buffer) ! { ! /* Arrange to go back to the original buffer once we're done ! processing the key sequence. We don't use ! save_excursion_{save,restore} here, in analogy to ! `read-key-sequence' to avoid saving point. Maybe this ! would not be a problem here, but it is easier to keep ! things the same. ! */ ! ! record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); ! ! set_buffer_internal (XBUFFER (XWINDOW (window)->buffer)); ! } ! } ! ! keymaps = Fcons (current_global_map, Qnil); if (!NILP (olp)) { *************** *** 1531,1545 **** } if (NILP (XCDR (keymaps))) { - Lisp_Object local; Lisp_Object *maps; int nmaps, i; ! /* This usually returns the buffer's local map, ! but that can be overridden by a `local-map' property. */ ! local = get_local_map (PT, current_buffer, Qlocal_map); ! if (!NILP (local)) ! keymaps = Fcons (local, keymaps); /* Now put all the minor mode keymaps on the list. */ nmaps = current_minor_maps (0, &maps); --- 1564,1640 ---- } if (NILP (XCDR (keymaps))) { Lisp_Object *maps; int nmaps, i; ! Lisp_Object keymap, local_map; ! EMACS_INT pt; ! ! pt = INTEGERP (position) ? XINT (position) ! : MARKERP (position) ? marker_position (position) ! : PT; ! ! /* Get the buffer local maps, possibly overriden by text or ! overlay properties */ ! ! local_map = get_local_map (pt, current_buffer, Qlocal_map); ! keymap = get_local_map (pt, current_buffer, Qkeymap); ! ! if (CONSP (position)) ! { ! Lisp_Object string, window; ! ! window = POSN_WINDOW (position); ! ! /* For a mouse click, get the local text-property keymap ! of the place clicked on, rather than point. */ ! ! if (POSN_INBUFFER_P (position)) ! { ! Lisp_Object pos; ! ! pos = POSN_BUFFER_POSN (position); ! if (INTEGERP (pos) ! && XINT (pos) >= BEG && XINT (pos) <= Z) ! { ! local_map = get_local_map (XINT (pos), ! current_buffer, Qlocal_map); ! ! keymap = get_local_map (XINT (pos), ! current_buffer, Qkeymap); ! } ! } ! ! /* If on a mode line string with a local keymap, ! or for a click on a string, i.e. overlay string or a ! string displayed via the `display' property, ! consider `local-map' and `keymap' properties of ! that string. */ ! ! if (string = POSN_STRING (position), ! (CONSP (string) && STRINGP (XCAR (string)))) ! { ! Lisp_Object pos, map; ! ! pos = XCDR (string); ! string = XCAR (string); ! if (XINT (pos) >= 0 ! && XINT (pos) < SCHARS (string)) ! { ! map = Fget_text_property (pos, Qlocal_map, string); ! if (!NILP (map)) ! local_map = map; ! ! map = Fget_text_property (pos, Qkeymap, string); ! if (!NILP (map)) ! keymap = map; ! } ! } ! ! } ! ! if (!NILP (local_map)) ! keymaps = Fcons (local_map, keymaps); /* Now put all the minor mode keymaps on the list. */ nmaps = current_minor_maps (0, &maps); *************** *** 1548,1559 **** if (!NILP (maps[i])) keymaps = Fcons (maps[i], keymaps); ! /* This returns nil unless there is a `keymap' property. */ ! local = get_local_map (PT, current_buffer, Qkeymap); ! if (!NILP (local)) ! keymaps = Fcons (local, keymaps); } return keymaps; } --- 1643,1654 ---- if (!NILP (maps[i])) keymaps = Fcons (maps[i], keymaps); ! if (!NILP (keymap)) ! keymaps = Fcons (keymap, keymaps); } + unbind_to (count, Qnil); + return keymaps; } *************** *** 2805,2811 **** else if (!NILP (keymap)) keymaps = Fcons (keymap, Fcons (current_global_map, Qnil)); else ! keymaps = Fcurrent_active_maps (Qnil); /* Only use caching for the menubar (i.e. called with (def nil t nil). We don't really need to check `keymap'. */ --- 2900,2906 ---- else if (!NILP (keymap)) keymaps = Fcons (keymap, Fcons (current_global_map, Qnil)); else ! keymaps = Fcurrent_active_maps (Qnil, Qnil); /* Only use caching for the menubar (i.e. called with (def nil t nil). We don't really need to check `keymap'. */ Index: src/doc.c =================================================================== RCS file: /sources/emacs/emacs/src/doc.c,v retrieving revision 1.120 diff -u -r1.120 doc.c *** src/doc.c 18 Jul 2006 13:26:24 -0000 1.120 --- src/doc.c 15 Sep 2006 23:46:12 -0000 *************** *** 883,889 **** struct buffer *oldbuf; int start_idx; /* This is for computing the SHADOWS arg for describe_map_tree. */ ! Lisp_Object active_maps = Fcurrent_active_maps (Qnil); Lisp_Object earlier_maps; changed = 1; --- 883,889 ---- struct buffer *oldbuf; int start_idx; /* This is for computing the SHADOWS arg for describe_map_tree. */ ! Lisp_Object active_maps = Fcurrent_active_maps (Qnil, Qnil); Lisp_Object earlier_maps; changed = 1; Index: src/ChangeLog =================================================================== RCS file: /sources/emacs/emacs/src/ChangeLog,v retrieving revision 1.5302 diff -u -r1.5302 ChangeLog *** src/ChangeLog 15 Sep 2006 21:01:03 -0000 1.5302 --- src/ChangeLog 15 Sep 2006 23:46:40 -0000 *************** *** 1,3 **** --- 1,14 ---- + 2006-09-16 David Kastrup + + * keymap.c (Fcurrent_active_maps): Add `position' argument. + (Fwhere_is_internal): Adjust call to `current-active-maps' to + cater for additional parameter. + + * keymap.h: Adjust number of parameters to `current-active-maps'. + + * doc.c (Fsubstitute_command_keys): Adjust call of + `current-active-maps'. + 2006-09-15 Kim F. Storm * window.c (Fwindow_line_visibility): New defun for line-move-partial.