changeset 83226:9ea0f6980511

Merged in changes from CVS trunk. Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-672 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-266
author Karoly Lorentey <lorentey@elte.hu>
date Sat, 13 Nov 2004 18:21:48 +0000
parents 07964164a825 (current diff) da879b3ac5c4 (diff)
children 3ec251523b3e
files ChangeLog lisp/ChangeLog lisp/recentf.el src/config.in src/frame.c src/print.c src/xmenu.c
diffstat 25 files changed, 292 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Nov 06 17:57:15 2004 +0000
+++ b/ChangeLog	Sat Nov 13 18:21:48 2004 +0000
@@ -1,3 +1,8 @@
+2004-11-06  Lars Brinkhoff  <lars@nocrew.org>
+
+	* configure.in: Add check for getrusage.
+	* configure: Regenerate.
+
 2004-11-02  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
 
 	* configure.in (HAVE_GTK_FILE_CHOOSER, $HAVE_GTK_FILE_SELECTION): New
--- a/configure	Sat Nov 06 17:57:15 2004 +0000
+++ b/configure	Sat Nov 13 18:21:48 2004 +0000
@@ -13704,8 +13704,9 @@
 
 
 
+
 for ac_func in gethostname getdomainname dup2 \
-rename closedir mkdir rmdir sysinfo \
+rename closedir mkdir rmdir sysinfo getrusage \
 random lrand48 bcopy bcmp logb frexp fmod rint cbrt ftime res_init setsid \
 strerror fpathconf select mktime euidaccess getpagesize tzset setlocale \
 utimes setrlimit setpgid getcwd getwd shutdown getaddrinfo \
--- a/configure.in	Sat Nov 06 17:57:15 2004 +0000
+++ b/configure.in	Sat Nov 13 18:21:48 2004 +0000
@@ -2370,7 +2370,7 @@
 AC_CHECK_HEADERS(maillock.h)
 
 AC_CHECK_FUNCS(gethostname getdomainname dup2 \
-rename closedir mkdir rmdir sysinfo \
+rename closedir mkdir rmdir sysinfo getrusage \
 random lrand48 bcopy bcmp logb frexp fmod rint cbrt ftime res_init setsid \
 strerror fpathconf select mktime euidaccess getpagesize tzset setlocale \
 utimes setrlimit setpgid getcwd getwd shutdown getaddrinfo \
--- a/etc/NEWS	Sat Nov 06 17:57:15 2004 +0000
+++ b/etc/NEWS	Sat Nov 13 18:21:48 2004 +0000
@@ -98,6 +98,9 @@
 
 * Changes in Emacs 21.4
 
+** In Outline mode, hide-body no longer hides lines at the top
+of the file that precede the first header line.
+
 +++
 ** `set-auto-mode' now gives the interpreter magic line (if present)
 precedence over the file name.  Likewise an <?xml or <!DOCTYPE declaration
@@ -2324,6 +2327,10 @@
 * Lisp Changes in Emacs 21.4
 
 +++
+** The new primitive `get-internal-run-time' returns the processor
+run time used by Emacs since start-up.
+
++++
 ** The new function `called-interactively-p' does what many people
 have mistakenly believed `interactively-p' did: it returns t if the
 calling function was called through `call-interactively'.
--- a/lisp/ChangeLog	Sat Nov 06 17:57:15 2004 +0000
+++ b/lisp/ChangeLog	Sat Nov 13 18:21:48 2004 +0000
@@ -1,3 +1,54 @@
+2004-11-06  Kai Grossjohann  <kai.grossjohann@gmx.net>
+
+	* net/tramp.el (tramp-coding-commands): Additionally try "uudecode
+	-o /dev/stdout" before trying "uudecode -o -".  Suggested by Han
+	Boetes.
+	(tramp-uudecode): Mention `uudecode -o /dev/stdout'.
+
+2004-11-06  David Ponce  <david@dponce.com>
+
+	* recentf.el (recentf-menu-path): Use menu item name.
+
+2004-11-06  Eli Zaretskii  <eliz@gnu.org>
+
+	* progmodes/gdb-ui.el: Don't call define-fringe-bitmap if the
+	display doesn't support images.
+
+2004-11-06  Andreas Schwab  <schwab@suse.de>
+
+	* tempo.el (tempo-match-finder): Doc fix.
+
+	* emacs-lisp/easymenu.el (easy-menu-get-map): Fix last change.
+
+2004-11-06  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* emacs-lisp/easymenu.el (easy-menu-get-map-look-for-name): Remove.
+	(easy-menu-lookup-name): New fun to replace it.
+	(easy-menu-get-map): Use it to obey menu item names (rather than just
+	keys) when looking up `path'.
+	(easy-menu-always-true-p): Rename from easy-menu-always-true.
+	(easy-menu-convert-item-1): Adjust to new name.
+
+2004-11-06  Peter Heslin  <pj@heslin.eclipse.co.uk>  (tiny change)
+
+	* outline.el (hide-body): Don't hide lines at the top of the file
+	that precede the first header line.
+
+2004-11-06  Paul Pogonyshev  <pogonyshev@gmx.net>
+
+	* align.el (align-areas): Delete whitespace before reindenting, so
+	that tabs are never placed after spaces.
+
+2004-11-06  Alan Shutko  <ats@acm.org>
+
+	* macros.el (insert-kbd-macro): Do completions based on macros,
+	rather than all commands.
+
+2004-11-06  David Hansen  <david.hansen@gmx.net>  (tiny change)
+
+	* tempo.el (tempo-match-finder): Use [:word:] instead of "^\\b",
+	to solve a bug whereby tags with 'b' don't match.
+
 2004-11-05  Juri Linkov  <juri@jurta.org>
 
 	* info.el (Info-search): Don't search in node header lines
--- a/lisp/align.el	Sat Nov 06 17:57:15 2004 +0000
+++ b/lisp/align.el	Sat Nov 13 18:21:48 2004 +0000
@@ -1212,6 +1212,14 @@
 	      (cond ((< gocol 0) t)     ; don't do anything
 		    ((= cur gocol) t)   ; don't need to
 		    ((< cur gocol)      ; just add space
+		     ;; FIXME: It is stated above that "...the
+		     ;;	       whitespace to be modified was already
+		     ;;	       deleted by `align-region', all we have
+		     ;;	       to do here is indent."  However, this
+		     ;;	       doesn't seem to be true, so we first
+		     ;;	       delete the whitespace to avoid tabs
+		     ;;	       after spaces.
+		     (delete-horizontal-space t)
 		     (indent-to gocol))
 		    (t
 		     ;; This code works around an oddity in the
--- a/lisp/emacs-lisp/easymenu.el	Sat Nov 06 17:57:15 2004 +0000
+++ b/lisp/emacs-lisp/easymenu.el	Sat Nov 13 18:21:48 2004 +0000
@@ -242,9 +242,9 @@
 	(setq visible (or arg ''nil)))))
     (if (equal visible ''nil)
 	nil				; Invisible menu entry, return nil.
-      (if (and visible (not (easy-menu-always-true visible)))
+      (if (and visible (not (easy-menu-always-true-p visible)))
 	  (setq prop (cons :visible (cons visible prop))))
-      (if (and enable (not (easy-menu-always-true enable)))
+      (if (and enable (not (easy-menu-always-true-p enable)))
 	  (setq prop (cons :enable (cons enable prop))))
       (if filter (setq prop (cons :filter (cons filter prop))))
       (if help (setq prop (cons :help (cons help prop))))
@@ -363,12 +363,12 @@
 				  (cons cmd keys))))
 		   (setq cache-specified nil))
 		 (if keys (setq prop (cons :keys (cons keys prop)))))
-	      (if (and visible (not (easy-menu-always-true visible)))
+	      (if (and visible (not (easy-menu-always-true-p visible)))
 		  (if (equal visible ''nil)
 		      ;; Invisible menu item. Don't insert into keymap.
 		      (setq remove t)
 		    (setq prop (cons :visible (cons visible prop)))))))
-	(if (and active (not (easy-menu-always-true active)))
+	(if (and active (not (easy-menu-always-true-p active)))
 	    (setq prop (cons :enable (cons active prop))))
 	(if (and (or no-name cache-specified)
 		 (or (null cache) (stringp cache) (vectorp cache)))
@@ -426,7 +426,8 @@
 
 (defun easy-menu-name-match (name item)
   "Return t if NAME is the name of menu item ITEM.
-NAME can be either a string, or a symbol."
+NAME can be either a string, or a symbol.
+ITEM should be a keymap binding of the form (KEY . MENU-ITEM)."
   (if (consp item)
       (if (symbolp name)
 	  (eq (car-safe item) name)
@@ -439,7 +440,7 @@
 		(eq (car-safe item) (intern name))
 		(eq (car-safe item) (easy-menu-intern name)))))))
 
-(defun easy-menu-always-true (x)
+(defun easy-menu-always-true-p (x)
   "Return true if form X never evaluates to nil."
   (if (consp x) (and (eq (car x) 'quote) (cadr x))
     (or (eq x t) (not (symbolp x)))))
@@ -591,10 +592,24 @@
       (cons name item))			; Keymap or new menu format
      )))
 
-(defun easy-menu-get-map-look-for-name (name submap)
-  (while (and submap (not (easy-menu-name-match name (car submap))))
-    (setq submap (cdr submap)))
-  submap)
+(defun easy-menu-lookup-name (map name)
+  "Lookup menu item NAME in keymap MAP.
+Like `lookup-key' except that NAME is not an array but just a single key
+and that NAME can be a string representing the menu item's name."
+  (or (lookup-key map (vector (easy-menu-intern name)))
+      (when (stringp name)
+	;; `lookup-key' failed and we have a menu item name: look at the
+	;; actual menu entries's names.
+	(catch 'found
+	  (map-keymap (lambda (key item)
+			(if (condition-case nil (member name item)
+			      (error nil))
+			    ;; Found it!!  Look for it again with
+			    ;; `lookup-key' so as to handle inheritance and
+			    ;; to extract the actual command/keymap bound to
+			    ;; `name' from the item (via get_keyelt).
+			    (throw 'found (lookup-key map (vector key)))))
+		      map)))))
 
 (defun easy-menu-get-map (map path &optional to-modify)
   "Return a sparse keymap in which to add or remove an item.
@@ -605,34 +620,34 @@
 In some cases we use that to select between the local and global maps."
   (setq map
 	(catch 'found
-	  (let* ((key (vconcat (unless map '(menu-bar))
-			       (mapcar 'easy-menu-intern path)))
-		 (maps (mapcar (lambda (map)
-				 (setq map (lookup-key map key))
-				 (while (and (symbolp map) (keymapp map))
-				   (setq map (symbol-function map)))
-				 map)
-			       (if map
-				   (list (if (and (symbolp map)
-						  (not (keymapp map)))
-					     (symbol-value map) map))
-				 (current-active-maps)))))
+	  (if (and map (symbolp map) (not (keymapp map)))
+	      (setq map (symbol-value map)))
+	  (let ((maps (if map (list map) (current-active-maps))))
+	    ;; Look for PATH in each map.
+	    (unless map (push 'menu-bar path))
+	    (dolist (name path)
+	      (setq maps
+		    (delq nil (mapcar (lambda (map)
+					(setq map (easy-menu-lookup-name
+						   map name))
+					(and (keymapp map) map))
+				      maps))))
+
 	    ;; Prefer a map that already contains the to-be-modified entry.
 	    (when to-modify
 	      (dolist (map maps)
-		(when (and (keymapp map)
-			   (easy-menu-get-map-look-for-name to-modify map))
+		(when (easy-menu-lookup-name map to-modify)
 		  (throw 'found map))))
 	    ;; Use the first valid map.
-	    (dolist (map maps)
-	      (when (keymapp map)
-		(throw 'found map)))
+	    (when maps (throw 'found (car maps)))
+
 	    ;; Otherwise, make one up.
 	    ;; Hardcoding current-local-map is lame, but it's difficult
 	    ;; to know what the caller intended for us to do ;-(
 	    (let* ((name (if path (format "%s" (car (reverse path)))))
 		   (newmap (make-sparse-keymap name)))
-	      (define-key (or map (current-local-map)) key
+	      (define-key (or map (current-local-map))
+		(apply 'vector (mapcar 'easy-menu-intern path))
 		(if name (cons name newmap) newmap))
 	      newmap))))
   (or (keymapp map) (error "Malformed menu in easy-menu: (%s)" map))
@@ -640,5 +655,5 @@
 
 (provide 'easymenu)
 
-;;; arch-tag: 2a04020d-90d2-476d-a7c6-71e072007a4a
+;; arch-tag: 2a04020d-90d2-476d-a7c6-71e072007a4a
 ;;; easymenu.el ends here
--- a/lisp/macros.el	Sat Nov 06 17:57:15 2004 +0000
+++ b/lisp/macros.el	Sat Nov 13 18:21:48 2004 +0000
@@ -63,7 +63,14 @@
 
 To save a kbd macro, visit a file of Lisp code such as your `~/.emacs',
 use this command, and then save the file."
-  (interactive "CInsert kbd macro (name): \nP")
+  (interactive (list (intern (completing-read "Insert kbd macro (name): " 
+					      obarray 
+					      (lambda (elt)
+						(and (fboundp elt)
+						     (or (stringp (symbol-function elt))
+							 (vectorp (symbol-function elt)))))
+					      t))
+		     current-prefix-arg))
   (let (definition)
     (if (string= (symbol-name macroname) "")
 	(progn
--- a/lisp/net/tramp.el	Sat Nov 06 17:57:15 2004 +0000
+++ b/lisp/net/tramp.el	Sat Nov 13 18:21:48 2004 +0000
@@ -1535,8 +1535,9 @@
 rm -f /tmp/tramp.$$
 }"
   "Shell function to implement `uudecode' to standard output.
-Many systems support `uudecode -o -' for this or `uudecode -p', but
-some systems don't, and for them we have this shell function.")
+Many systems support `uudecode -o /dev/stdout' for this or
+`uudecode -o -' or `uudecode -p', but some systems don't, and for
+them we have this shell function.")
 
 ;; Perl script to implement `file-attributes' in a Lisp `read'able
 ;; output.  If you are hacking on this, note that you get *no* output
@@ -5970,6 +5971,8 @@
      base64-encode-region base64-decode-region)
     ("recode data..base64" "recode base64..data"
      base64-encode-region base64-decode-region)
+    ("uuencode xxx" "uudecode -o /dev/stdout"
+     tramp-uuencode-region uudecode-decode-region)
     ("uuencode xxx" "uudecode -o -"
      tramp-uuencode-region uudecode-decode-region)
     ("uuencode xxx" "uudecode -p"
--- a/lisp/outline.el	Sat Nov 06 17:57:15 2004 +0000
+++ b/lisp/outline.el	Sat Nov 13 18:21:48 2004 +0000
@@ -723,7 +723,7 @@
 			 (progn (outline-next-preface) (point)) nil)))
 
 (defun hide-body ()
-  "Hide all of buffer except headings."
+  "Hide all body lines in buffer, leaving all headings visible."
   (interactive)
   (hide-region-body (point-min) (point-max)))
 
@@ -738,7 +738,8 @@
 	(narrow-to-region start end)
 	(goto-char (point-min))
 	(if (outline-on-heading-p)
-	    (outline-end-of-heading))
+	    (outline-end-of-heading)
+	  (outline-next-preface))
 	(while (not (eobp))
 	  (outline-flag-region (point)
 			       (progn (outline-next-preface) (point)) t)
--- a/lisp/recentf.el	Sat Nov 06 17:57:15 2004 +0000
+++ b/lisp/recentf.el	Sat Nov 13 18:21:48 2004 +0000
@@ -98,7 +98,7 @@
   :type 'string
   :set 'recentf-menu-customization-changed)
 
-(defcustom recentf-menu-path '("files")
+(defcustom recentf-menu-path '("File")
   "*Path where to add the recentf menu.
 If nil add it at top level (see also `easy-menu-add-item')."
   :group 'recentf
--- a/lisp/tempo.el	Sat Nov 06 17:57:15 2004 +0000
+++ b/lisp/tempo.el	Sat Nov 13 18:21:48 2004 +0000
@@ -1,6 +1,6 @@
 ;;; tempo.el --- Flexible template insertion
 
-;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1995, 2004 Free Software Foundation, Inc.
 
 ;; Author: David K}gedal <davidk@lysator.liu.se>
 ;; Created: 16 Feb 1994
@@ -172,7 +172,7 @@
 (defvar tempo-marks nil
   "A list of marks to jump to with `\\[tempo-forward-mark]' and `\\[tempo-backward-mark]'.")
 
-(defvar tempo-match-finder "\\b\\([^\\b]+\\)\\="
+(defvar tempo-match-finder "\\b\\([[:word:]]+\\)\\="
   "The regexp or function used to find the string to match against tags.
 
 If `tempo-match-finder is a string, it should contain a regular
@@ -182,7 +182,7 @@
 each string in the tag list. If one is found, the whole text between
 the first \\( and the point is replaced with the inserted template.
 
-You will probably want to include \\ \= at the end of the regexp to
+You will probably want to include \\=\\= at the end of the regexp to
 make sure that the string is matched only against text adjacent to the
 point.
 
--- a/lispref/ChangeLog	Sat Nov 06 17:57:15 2004 +0000
+++ b/lispref/ChangeLog	Sat Nov 13 18:21:48 2004 +0000
@@ -1,3 +1,20 @@
+2004-11-06  Lars Brinkhoff  <lars@nocrew.org>
+
+	* os.texi (Processor Run Time): New section documenting
+	get-internal-run-time.
+
+2004-11-06  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.in (install, maintainer-clean): Don't use "elisp-*" as
+	it nukes elisp-cover.texi.
+	(dist): Change elisp-[0-9] to elisp-[1-9], as there could be no
+	elisp-0 etc.
+
+2004-11-05  Luc Teirlinck  <teirllm@auburn.edu>
+
+	* commands.texi (Keyboard Macros): Document `append' return value
+	of `defining-kbd-macro'.
+
 2004-11-01  Richard M. Stallman  <rms@gnu.org>
 
 	* commands.texi (Interactive Call): Add called-interactively-p.
--- a/lispref/Makefile.in	Sat Nov 06 17:57:15 2004 +0000
+++ b/lispref/Makefile.in	Sat Nov 13 18:21:48 2004 +0000
@@ -108,7 +108,7 @@
 
 install: elisp
 	$(srcdir)/mkinstalldirs $(infodir)
-	cp elisp elisp-* $(infodir)
+	cp elisp elisp-[1-9] elisp-[1-9][0-9] $(infodir)
 	${INSTALL_INFO} --info-dir=${infodir} ${infodir}/elisp
 
 clean:
@@ -119,7 +119,7 @@
 distclean: clean
 
 maintainer-clean: clean
-	rm -f elisp elisp-* elisp.dvi elisp.oaux
+	rm -f elisp elisp-[1-9] elisp-[1-9][0-9] elisp.dvi elisp.oaux
 
 dist: elisp elisp.dvi
 	-rm -rf temp
@@ -128,7 +128,7 @@
 	-ln $(srcdir)/README $(srcdir)/configure.in $(srcdir)/configure \
  $(srcdir)/Makefile.in $(srcs) \
  $(srcdir)/../man/texinfo.tex \
- elisp.dvi elisp.aux elisp.??s elisp elisp-[0-9] elisp-[0-9][0-9] \
+ elisp.dvi elisp.aux elisp.??s elisp elisp-[1-9] elisp-[1-9][0-9] \
  temp/$(manual)
 	-(cd temp/$(manual); rm -f mkinstalldirs)
 	cp $(srcdir)/mkinstalldirs temp/$(manual)
--- a/lispref/commands.texi	Sat Nov 06 17:57:15 2004 +0000
+++ b/lispref/commands.texi	Sat Nov 13 18:21:48 2004 +0000
@@ -420,7 +420,7 @@
 parentheses and brackets) do not do so here.  Prompt.
 
 @item U
-A key sequence or nil.  May be used after a @code{k} or @code{K}
+A key sequence or @code{nil}.  May be used after a @code{k} or @code{K}
 argument to get the up-event that was discarded in case the key
 sequence read for that argument was a down-event.  No I/O.
 
@@ -3023,9 +3023,10 @@
 @defvar defining-kbd-macro
 This variable is non-@code{nil} if and only if a keyboard macro is
 being defined.  A command can test this variable so as to behave
-differently while a macro is being defined.  The commands
-@code{start-kbd-macro} and @code{end-kbd-macro} set this variable---do
-not set it yourself.
+differently while a macro is being defined.  The value is
+@code{append} while appending to the definition of an existing macro.
+The commands @code{start-kbd-macro}, @code{kmacro-start-macro} and
+@code{end-kbd-macro} set this variable---do not set it yourself.
 
 The variable is always local to the current terminal and cannot be
 buffer-local.  @xref{Multiple Displays}.
--- a/lispref/os.texi	Sat Nov 06 17:57:15 2004 +0000
+++ b/lispref/os.texi	Sat Nov 13 18:21:48 2004 +0000
@@ -23,6 +23,7 @@
 * Time of Day::		Getting the current time.
 * Time Conversion::     Converting a time from numeric form to a string, or
                           to calendrical data (or vice versa).
+* Processor Run Time::  Getting the run time used by Emacs.
 * Time Calculations::   Adding, subtracting, comparing times, etc.
 * Timers::		Setting a timer to call a function at a certain time.
 * Terminal Input::      Recording terminal input for debugging.
@@ -1285,6 +1286,28 @@
 on others, years as early as 1901 do work.
 @end defun
 
+@node Processor Run Time
+@section Processor Run time
+
+@defun get-internal-run-time
+This function returns the processor run time used by Emacs as a list
+of three integers: @code{(@var{high} @var{low} @var{microsec})}.  The
+integers @var{high} and @var{low} combine to give the number of
+seconds, which is
+@ifnottex
+@var{high} * 2**16 + @var{low}.
+@end ifnottex
+@tex
+$high*2^{16}+low$.
+@end tex
+
+The third element, @var{microsec}, gives the microseconds (or 0 for
+systems that return time with the resolution of only one second).
+
+If the system doesn't provide a way to determine the processor run
+time, get-internal-run-time returns the same time as current-time.
+@end defun
+
 @node Time Calculations
 @section Time Calculations
 
--- a/src/ChangeLog	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/ChangeLog	Sat Nov 13 18:21:48 2004 +0000
@@ -1,5 +1,31 @@
+2004-11-06  Lars Brinkhoff  <lars@nocrew.org>
+
+	* config.in: Regenerate (add HAVE_GETRUSAGE).
+	* editfns.c (Fget_internal_run_time): New function.
+	(syms_of_data): Defsubr it.
+	* fns.c (sxhash): As far as possible, merge calculation of
+	hash code for symbols and strings.
+
+2004-11-06  Eli Zaretskii  <eliz@gnu.org>
+
+	* frame.c (syms_of_frame): Fix the example in the doc string.
+
+2004-11-06  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* eval.c (Feval): Remove check for INPUT_BLOCKED_P.
+
+	* xmenu.c (popup_get_selection, create_and_show_popup_menu)
+	(create_and_show_dialog): Revert change from 2004-10-31.
+	
+
+2004-11-05  Luc Teirlinck  <teirllm@auburn.edu>
+
+	* macros.c (syms_of_macros) <defining-kbd-macro>: Doc fix.
+
 2004-11-05  Kim F. Storm  <storm@cua.dk>
 
+	* print.c (print_object): Print Lisp_Misc_Save_Value objects.
+
 	* fileio.c (Ffile_modes): Doc fix.
 	(auto_save_1): Check for Ffile_modes nil value.
 
--- a/src/config.in	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/config.in	Sat Nov 13 18:21:48 2004 +0000
@@ -196,6 +196,9 @@
 /* Define to 1 if you have the `getpt' function. */
 #undef HAVE_GETPT
 
+/* Define to 1 if you have the `getrusage' function. */
+#undef HAVE_GETRUSAGE
+
 /* Define to 1 if you have the `getsockname' function. */
 #undef HAVE_GETSOCKNAME
 
--- a/src/editfns.c	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/editfns.c	Sat Nov 13 18:21:48 2004 +0000
@@ -39,6 +39,10 @@
 #include <stdio.h>
 #endif
 
+#if defined HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif
+
 #include <ctype.h>
 
 #include "lisp.h"
@@ -1375,6 +1379,47 @@
 
   return Flist (3, result);
 }
+
+DEFUN ("get-internal-run-time", Fget_internal_run_time, Sget_internal_run_time,
+       0, 0, 0,
+       doc: /* Return the current run time used by Emacs.
+The time is returned as a list of three integers.  The first has the
+most significant 16 bits of the seconds, while the second has the
+least significant 16 bits.  The third integer gives the microsecond
+count.
+
+On systems that can't determine the run time, get-internal-run-time
+does the same thing as current-time.  The microsecond count is zero on
+systems that do not provide resolution finer than a second.  */)
+     ()
+{
+#ifdef HAVE_GETRUSAGE
+  struct rusage usage;
+  Lisp_Object result[3];
+  int secs, usecs;
+
+  if (getrusage (RUSAGE_SELF, &usage) < 0)
+    /* This shouldn't happen.  What action is appropriate?  */
+    Fsignal (Qerror, Qnil);
+
+  /* Sum up user time and system time.  */
+  secs = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec;
+  usecs = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
+  if (usecs >= 1000000)
+    {
+      usecs -= 1000000;
+      secs++;
+    }
+
+  XSETINT (result[0], (secs >> 16) & 0xffff);
+  XSETINT (result[1], (secs >> 0)  & 0xffff);
+  XSETINT (result[2], usecs);
+
+  return Flist (3, result);
+#else
+  return Fcurrent_time ();
+#endif
+}
 
 
 int
@@ -4315,6 +4360,7 @@
   defsubr (&Suser_full_name);
   defsubr (&Semacs_pid);
   defsubr (&Scurrent_time);
+  defsubr (&Sget_internal_run_time);
   defsubr (&Sformat_time_string);
   defsubr (&Sfloat_time);
   defsubr (&Sdecode_time);
--- a/src/eval.c	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/eval.c	Sat Nov 13 18:21:48 2004 +0000
@@ -1996,7 +1996,7 @@
   struct backtrace backtrace;
   struct gcpro gcpro1, gcpro2, gcpro3;
 
-  if (handling_signal || INPUT_BLOCKED_P)
+  if (handling_signal)
     abort ();
 
   if (SYMBOLP (form))
--- a/src/fns.c	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/fns.c	Sat Nov 13 18:21:48 2004 +0000
@@ -5007,15 +5007,14 @@
       hash = XUINT (obj);
       break;
 
-    case Lisp_Symbol:
-      hash = sxhash_string (SDATA (SYMBOL_NAME (obj)),
-			    SCHARS (SYMBOL_NAME (obj)));
-      break;
-
     case Lisp_Misc:
       hash = XUINT (obj);
       break;
 
+    case Lisp_Symbol:
+      obj = SYMBOL_NAME (obj);
+      /* Fall through.  */
+
     case Lisp_String:
       hash = sxhash_string (SDATA (obj), SCHARS (obj));
       break;
--- a/src/frame.c	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/frame.c	Sat Nov 13 18:21:48 2004 +0000
@@ -4285,7 +4285,7 @@
   DEFVAR_LISP ("default-frame-alist", &Vdefault_frame_alist,
 	       doc: /* Alist of default values for frame creation.
 These may be set in your init file, like this:
-  (setq default-frame-alist '((width . 80) (height . 55) (menu-bar-lines . 1))
+  (setq default-frame-alist '((width . 80) (height . 55) (menu-bar-lines . 1)))
 These override values given in window system configuration data,
  including X Windows' defaults database.
 For values specific to the first Emacs frame, see `initial-frame-alist'.
--- a/src/macros.c	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/macros.c	Sat Nov 13 18:21:48 2004 +0000
@@ -392,7 +392,9 @@
   defsubr (&Sstore_kbd_macro_event);
 
   DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro,
-		 doc: /* Non-nil while a keyboard macro is being defined.  Don't set this!  */);
+		 doc: /* Non-nil while a keyboard macro is being defined.  Don't set this!
+The value is the symbol `append' while appending to the definition of
+an existing macro.  */);
 
   DEFVAR_LISP ("executing-macro", &Vexecuting_macro,
 	       doc: /* Currently executing keyboard macro (string or vector); nil if none executing.  */);
--- a/src/print.c	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/print.c	Sat Nov 13 18:21:48 2004 +0000
@@ -2085,6 +2085,15 @@
 	  PRINTCHAR ('>');
 	  break;
 
+	case Lisp_Misc_Save_Value:
+	  strout ("#<save_value ", -1, -1, printcharfun, 0);
+	  sprintf(buf, "ptr=0x%08x int=%d",
+		  (unsigned long) XSAVE_VALUE (obj)->pointer,
+		  XSAVE_VALUE (obj)->integer);
+	  strout (buf, -1, -1, printcharfun, 0);
+	  PRINTCHAR ('>');
+	  break;
+
 	default:
 	  goto badtype;
 	}
--- a/src/xmenu.c	Sat Nov 06 17:57:15 2004 +0000
+++ b/src/xmenu.c	Sat Nov 13 18:21:48 2004 +0000
@@ -115,7 +115,7 @@
 
 static Lisp_Object xdialog_show P_ ((FRAME_PTR, int, Lisp_Object, char **));
 static void popup_get_selection P_ ((XEvent *, struct x_display_info *,
-                                     LWLIB_ID, int));
+                                     LWLIB_ID, int, int));
 
 /* Define HAVE_BOXES if menus can handle radio and toggle buttons.  */
 
@@ -157,6 +157,8 @@
 static void list_of_panes P_ ((Lisp_Object));
 static void list_of_items P_ ((Lisp_Object));
 
+extern EMACS_TIME timer_check P_ ((int));
+
 
 /* This holds a Lisp vector that holds the results of decoding
    the keymaps or alist-of-alists that specify a menu.
@@ -1122,27 +1124,27 @@
 
    If DOWN_ON_KEYPRESS is nonzero, pop down if a key is pressed.
 
-   This function used to have a DO_TIMERS argument which was
-   1 in the dialog case, and caused it to run Lisp-level timers.
-   That was unsafe so we removed it, but does anyone remember
-   why menus and dialogs were treated differently?
-
    NOTE: All calls to popup_get_selection should be protected
    with BLOCK_INPUT, UNBLOCK_INPUT wrappers.  */
 
 #ifdef USE_X_TOOLKIT
 static void
-popup_get_selection (initial_event, dpyinfo, id, down_on_keypress)
+popup_get_selection (initial_event, dpyinfo, id, do_timers, down_on_keypress)
      XEvent *initial_event;
      struct x_display_info *dpyinfo;
      LWLIB_ID id;
+     int do_timers;
      int down_on_keypress;
 {
   XEvent event;
 
   while (popup_activated_flag)
     {
-      if (initial_event)
+       /* If we have no events to run, consider timers.  */ 	 
+       if (do_timers && !XtAppPending (Xt_app_con)) 	 
+         timer_check (1); 	 
+
+       if (initial_event)
         {
           event = *initial_event;
           initial_event = 0;
@@ -2488,7 +2490,7 @@
   popup_activated_flag = 1;
 
   /* Process events that apply to the menu.  */
-  popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id, 0);
+  popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id, 0, 0);
 
   /* fp turned off the following statement and wrote a comment
      that it is unnecessary--that the menu has already disappeared.
@@ -2882,7 +2884,8 @@
                            Fcons (make_number (dialog_id >> (fact)),
                                   make_number (dialog_id & ~(-1 << (fact)))));
 
-    popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), dialog_id, 1);
+    popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f),
+                         dialog_id, 1, 1);
 
     unbind_to (count, Qnil);
   }