]> code.delx.au - gnu-emacs/blobdiff - src/keymap.c
Regenerated
[gnu-emacs] / src / keymap.c
index 67b0ed3a8462d124a473c55dcb96cec1e7658876..6b4b8536fe19f0532ede5e8e6ff9dab12159e0ef 100644 (file)
@@ -1,7 +1,7 @@
 /* Manipulation of keymaps
    Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995,
                  1998, 1999, 2000, 2001, 2002, 2003, 2004,
-                 2005, 2006 Free Software Foundation, Inc.
+                 2005, 2006, 2007 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -1124,7 +1124,8 @@ DEF is anything that can be a key's definition:
     or another symbol whose function definition is used, etc.),
  a cons (STRING . DEFN), meaning that DEFN is the definition
     (DEFN should be a valid definition in its own right),
- or a cons (MAP . CHAR), meaning use definition of CHAR in keymap MAP.
+ or a cons (MAP . CHAR), meaning use definition of CHAR in keymap MAP,
+ or an extended menu item definition.  (See info node `Extended Menu Items'.)
 
 If KEYMAP is a sparse keymap with a binding for KEY, the existing
 binding is altered.  If there is no binding for KEY, the new pair
@@ -1156,7 +1157,7 @@ binding KEY to DEF is added at the front of KEYMAP.  */)
 
   meta_bit = VECTORP (key) ? meta_modifier : 0x80;
 
-  if (VECTORP (def) && ASIZE (def) > 0 && CONSP (AREF (def, make_number (0))))
+  if (VECTORP (def) && ASIZE (def) > 0 && CONSP (AREF (def, 0)))
     { /* DEF is apparently an XEmacs-style keyboard macro.  */
       Lisp_Object tmp = Fmake_vector (make_number (ASIZE (def)), Qnil);
       int i = ASIZE (def);
@@ -1247,7 +1248,8 @@ buffer position instead of point are used. */)
 
 DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 3, 0,
        doc: /* In keymap KEYMAP, look up key sequence KEY.  Return the definition.
-nil means undefined.  See doc of `define-key' for kinds of definitions.
+A value of nil means undefined.  See doc of `define-key'
+for kinds of definitions.
 
 A number as value means KEY is "too long";
 that is, characters or symbols in it except for the last one
@@ -1610,26 +1612,25 @@ specified buffer position instead of point are used.
 
       /* We are not interested in locations without event data */
 
-      if (EVENT_HAS_PARAMETERS (event)) {
-       Lisp_Object kind;
-
-       kind = EVENT_HEAD_KIND (EVENT_HEAD (event));
-       if (EQ (kind, Qmouse_click))
-         position = EVENT_START (event);
-      }
+      if (EVENT_HAS_PARAMETERS (event))
+       {
+         Lisp_Object kind = EVENT_HEAD_KIND (EVENT_HEAD (event));
+         if (CONSP (XCDR (event)) && EQ (kind, Qmouse_click))
+           position = EVENT_START (event);
+       }
     }
 
   /* Key sequences beginning with mouse clicks
      are read using the keymaps of 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)
@@ -1641,13 +1642,13 @@ specified buffer position instead of point are used.
             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));
        }
     }
-  
+
   if (! NILP (current_kboard->Voverriding_terminal_local_map))
     {
       value = Flookup_key (current_kboard->Voverriding_terminal_local_map,
@@ -1670,8 +1671,8 @@ specified buffer position instead of point are used.
        : MARKERP (position) ? marker_position (position)
        : PT;
 
-      local_map = get_local_map (pt, current_buffer, Qlocal_map); 
-      keymap = get_local_map (pt, current_buffer, Qkeymap); 
+      local_map = get_local_map (pt, current_buffer, Qlocal_map);
+      keymap = get_local_map (pt, current_buffer, Qkeymap);
 
       if (CONSP (position))
        {
@@ -1679,7 +1680,7 @@ specified buffer position instead of point are used.
 
          /* 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;
@@ -1690,7 +1691,7 @@ specified buffer position instead of point are used.
                {
                  local_map = get_local_map (XINT (pos),
                                             current_buffer, Qlocal_map);
-                 
+
                  keymap = get_local_map (XINT (pos),
                                          current_buffer, Qkeymap);
                }
@@ -1701,15 +1702,16 @@ specified buffer position instead of point are used.
             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
+             if (INTEGERP (pos)
+                 && XINT (pos) >= 0
                  && XINT (pos) < SCHARS (string))
                {
                  map = Fget_text_property (pos, Qlocal_map, string);
@@ -1721,7 +1723,7 @@ specified buffer position instead of point are used.
                    keymap = map;
                }
            }
-         
+
        }
 
       if (! NILP (keymap))
@@ -2385,9 +2387,15 @@ around function keys and event symbols.  */)
       else
        SPLIT_CHAR (without_bits, charset, c1, c2);
 
-      if (charset
-         && CHAR_VALID_P (charset, 1)
-         && (c1 == 0 || c2 == 0))
+      if (! CHAR_VALID_P (without_bits, 1))
+       {
+         char buf[256];
+
+         sprintf (buf, "Invalid char code %d", XINT (key));
+         return build_string (buf);
+       }
+      else if (charset
+              && ((c1 == 0 && c2 == -1) || c2 == 0))
        {
          /* Handle a generic character.  */
          Lisp_Object name;
@@ -3447,9 +3455,13 @@ describe_map (map, prefix, elt_describer, partial, shadow,
              tem = shadow_lookup (shadow, kludge, Qt);
              if (!NILP (tem))
                {
+                 /* If both bindings are keymaps, this key is a prefix key,
+                    so don't say it is shadowed.  */
+                 if (KEYMAPP (definition) && KEYMAPP (tem))
+                   ;
                  /* Avoid generating duplicate entries if the
-                    shadowed binding has the same definition. */
-                 if (mention_shadow && !EQ (tem, definition))
+                    shadowed binding has the same definition.  */
+                 else if (mention_shadow && !EQ (tem, definition))
                    this_shadowed = 1;
                  else
                    continue;