changeset 90299:9e490faa9f6b

Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-17 Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 85-96) - Update from CVS - Merge from erc--emacs--0 - Merge from gnus--rel--5.10 * gnus--rel--5.10 (patch 30-36) - Merge from emacs--devo--0 - Update from CVS
author Miles Bader <miles@gnu.org>
date Fri, 17 Feb 2006 09:10:23 +0000
parents 15363e44d751 (current diff) ab0fd996e480 (diff)
children 3f03e10f330e
files ChangeLog configure.in etc/ChangeLog etc/NEWS lisp/ChangeLog lisp/bs.el lisp/calc/calc-arith.el lisp/calc/calcalg2.el lisp/cus-edit.el lisp/cus-start.el lisp/cus-theme.el lisp/files.el lisp/gnus/ChangeLog lisp/gnus/gnus-art.el lisp/gnus/gnus-cus.el lisp/gnus/gnus-draft.el lisp/gnus/mm-decode.el lisp/gnus/mm-util.el lisp/gnus/nnoo.el lisp/gnus/rfc2231.el lisp/help.el lisp/mh-e/ChangeLog lisp/mh-e/mh-e.el lisp/mh-e/mh-mime.el lisp/mh-e/mh-utils.el lisp/mwheel.el lisp/progmodes/gdb-ui.el lisp/progmodes/gud.el lisp/speedbar.el lisp/wid-edit.el lispref/ChangeLog lispref/display.texi lispref/variables.texi man/ChangeLog man/building.texi man/custom.texi man/maintaining.texi src/ChangeLog src/frame.c src/gtkutil.c src/macfns.c src/macmenu.c src/xfns.c src/xterm.c src/xterm.h
diffstat 55 files changed, 1375 insertions(+), 635 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,7 @@
+2006-02-14  Richard M. Stallman  <rms@gnu.org>
+
+	* configure.in (s390x-*-linux-gnu*): New configuration.
+
 2006-01-31  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
 
 	* configure.in: Require GTK 2.4 or newer.
--- a/configure.in	Wed Feb 15 00:49:52 2006 +0000
+++ b/configure.in	Fri Feb 17 09:10:23 2006 +0000
@@ -654,6 +654,9 @@
   s390-*-linux-gnu* )
     machine=ibms390 opsys=gnu-linux
   ;;
+  s390x-*-linux-gnu* )
+    machine=ibms390x opsys=gnu-linux
+  ;;
   rs6000-ibm-aix3.1* | powerpc-ibm-aix3.1*  )
     machine=ibmrs6000 opsys=aix3-1
   ;;
--- a/etc/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/etc/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,11 @@
+2006-02-14  Chong Yidong  <cyd@stupidchicken.com>
+
+	* NEWS: Changes in handling of file local variables.
+
+2006-02-14  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* NEWS: Gtk+ 2.4 is required.
+
 2006-02-10  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
 	* PROBLEMS (Mac OS X): Add QuickTime 7.0.4 / Mac OS X 10.3.9 breakage.
--- a/etc/ERC-NEWS	Wed Feb 15 00:49:52 2006 +0000
+++ b/etc/ERC-NEWS	Fri Feb 17 09:10:23 2006 +0000
@@ -1,5 +1,41 @@
 ERC NEWS                                                       -*- outline -*-
 
+* Changes in ERC 5.1.2 (unreleased)
+
+** Fix compiler errors in erc-autojoin.el and erc-dcc.el.
+
+** Move to end of prompt when ERC reconnects to a server.
+
+** Changes and additions to modules
+
+*** Spell-checking (erc-spelling.el)
+
+**** Don't spell-check nicks or words that are prefixed with '/'.
+
+**** Remove flyspell properties from words we shouldn't spell-check.
+
+**** Fix an issue that caused the ispell process to reload every time
+we switch to an ERC buffer.
+
+*** Timestamps (erc-stamp.el)
+
+**** Fix an inconsistency in calculating width of right timestamps.
+
+**** Rename option `erc-timestamp-right-align-by-pixel' to
+`erc-timestamp-use-align-to'.  This controls whether to use the more
+fail-proof method of aligning right timestamps, as mentioned below.
+
+**** Fix a right timestamp spacing problem that used to occur when
+erc-stamp.el was byte-compiled.  Now that this is fixed, it is safe to
+use the method that aligns right timestamps perfectly in Emacs22 with
+X.  If the current version of Emacs doesn't support this method, use
+the simpler method, which is prone to alignment issues for math
+symbols and other variable-width text.
+
+A side effect of using this new method is that there will only be one
+space before a right timestamp in any saved logs.  If this is
+unacceptable, set `erc-timestamp-use-align-to' to nil.
+
 * Changes in ERC 5.1.1
 
 ** Fix a requirement on cl.el.
--- a/etc/NEWS	Wed Feb 15 00:49:52 2006 +0000
+++ b/etc/NEWS	Fri Feb 17 09:10:23 2006 +0000
@@ -102,7 +102,7 @@
 
 ---
 ** You can build Emacs with Gtk+ widgets by specifying `--with-x-toolkit=gtk'
-when you run configure.  This requires Gtk+ 2.0 or newer.  This port
+when you run configure.  This requires Gtk+ 2.4 or newer.  This port
 provides a way to display multilingual text in menus (with some caveats).
 
 ---
@@ -650,6 +650,21 @@
 suffix from every line before processing all the lines.
 
 +++
+*** If the local variables list contains any variable-value pairs that
+are not known to be safe, Emacs shows a prompt asking whether to apply
+the local variables list as a whole.  In earlier versions, a prompt
+was only issued for variables explicitly marked as risky (for the
+definition of risky variables, see `risky-local-variable-p').
+
+At the prompt, the user can choose to save the contents of this local
+variables list to `safe-local-variable-values'.  This new customizable
+option is a list of variable-value pairs that are known to be safe.
+Variables can also be marked as safe with the existing
+`safe-local-variable' property (see `safe-local-variable-p').
+However, risky variables will not be added to
+`safe-local-variable-values' in this way.
+
++++
 *** find-file-read-only visits multiple files in read-only mode,
 when the file name contains wildcard characters.
 
@@ -1017,7 +1032,7 @@
 ESC, like they do for Gtk+, Mac and W32.
 
 +++
-*** For Gtk+ version 2.4, you can make Emacs use the old file dialog
+*** For the Gtk+ version, you can make Emacs use the old file dialog
 by setting the variable `x-use-old-gtk-file-dialog' to t.  Default is to use
 the new dialog.
 
--- a/lisp/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,95 @@
+2006-02-17  Nick Roberts  <nickrob@snap.net.nz>
+
+	* speedbar.el (speedbar-frame-width): Make an inline function
+	instead of a macro.  Use frame-width.
+	(speedbar-try-completion, speedbar-update-contents) 
+	(speedbar-timer-fn): Use consp.
+	(speedbar-update-localized-contents): Try to preserve point.
+
+	* progmodes/gdb-ui.el (gdba, gdb-var-list): Improve doc strings.
+	(menu): Re-order menu items.
+	(gdb-var-update-regexp, gdb-var-update-regexp-1): Match "in_scope"
+	field.
+	(gdb-var-update-handler-1): Use it for GDB 6.4+.
+	(gdb-post-prompt): Speed things by not forcing update.
+
+2006-02-16  Chong Yidong  <cyd@stupidchicken.com>
+
+	* wid-edit.el (widget-button-click): For mouse-1, cancel button
+	press and perform default action if we get a mouse movement event.
+
+2006-02-16  Juanma Barranquero  <lekktu@gmail.com>
+
+	* calendar/icalendar.el (icalendar--get-event-property)
+	(icalendar--get-event-property-attributes): Fix typos in
+	docstrings.
+
+	* progmodes/flymake.el (flymake-fix-file-name): Fix typo in
+	docstring.
+
+2006-02-15  Juanma Barranquero  <lekktu@gmail.com>
+
+	* bs.el (bs-mode): Use `buffer-disable-undo'.
+	(bs--get-file-name): Simplify.
+	(bs-show-in-buffer): Mark the buffer as not modified.
+
+2006-02-14  Chong Yidong  <cyd@stupidchicken.com>
+
+	* wid-edit.el (widget-keymap): Bind down-mouse-1 to
+	widget-button-click.
+
+	* cus-edit.el (custom-mode-map): Remove mouse-1 binding.
+	(custom-mode): Update docstring.
+
+	* cus-theme.el (custom-new-theme-mode-map): Remove mouse-1
+	binding.
+
+	* files.el (hack-local-variables-confirm): Allow scrolling if the
+	file variable list is too long.  Kill temp buffer after use.
+
+2006-02-15  Nick Roberts  <nickrob@snap.net.nz>
+
+	* progmodes/gud.el (gdb): Improve doc string.
+	(gdb-script-font-lock-keywords): Expand allowed character set.
+
+	* progmodes/gdb-ui.el (gdb-use-separate-io-buffer)
+	(gdb-display-separate-io-buffer, gdb-frame-separate-io-buffer)
+	(gdb-separate-io-interrupt, gdb-separate-io-quit)
+	(gdb-separate-io-stop, gdb-separate-io-eof):
+	Rename from gdb-inferior-* to gdb-separate-*.
+	(gdb-set-gud-minor-mode-existing-buffers-1): Improve doc string.
+
+2006-02-14  Jay Belanger  <belanger@truman.edu>
+
+	* calc/calc-arith.el (math-check-known-scalarp): Make sure
+	expression is a symbol before checking that it is bound.
+
+	* calc/calcalg2.el (math-integrate-by-parts): Do a more careful
+	test to see if equation can be solved.
+
+2006-02-14  Chong Yidong  <cyd@stupidchicken.com>
+
+	* wid-edit.el (widget-button-click): Use :pressed-face property
+	for overlay face, if it exists.
+
+	* cus-edit.el (custom-manual, custom-add-see-also)
+	(custom-add-parent-links, custom-group-link): Add :pressed-face
+	property to links.
+
+	* files.el (hack-local-variables): Remove ignored variables before
+	checking if any variables need setting.
+
+2006-02-14  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* cus-start.el (all): Add x-gtk-whole-detached-tool-bar.
+
+2006-02-14  Juanma Barranquero  <lekktu@gmail.com>
+
+	* help.el (where-is): Fix message for remapped commands.
+
+	* mwheel.el (mouse-wheel-click-event, mouse-wheel-mode):
+	Fix typos in docstrings.
+
 2006-02-13  Chong Yidong  <cyd@stupidchicken.com>
 
 	* files.el (safe-local-variable-values): New option.
@@ -17,13 +109,13 @@
 	moved to safe-local-variable-p.
 	(hack-one-local-variable): Checks moved to hack-local-variables.
 
-	(byte-compile-dynamic, c-basic-offset, c-file-style,
-	c-indent-level, comment-column, fill-column, fill-prefix,
-	indent-tabs-mode, kept-new-versions, no-byte-compile,
-	no-update-autoloads, outline-regexp, page-delimiter,
-	paragraph-start, paragraph-separate, sentence-end,
-	sentence-end-double-space tab-width, version-control): Add
-	`safe-local-variable' property.
+	(byte-compile-dynamic, c-basic-offset, c-file-style)
+	(c-indent-level, comment-column, fill-column, fill-prefix)
+	(indent-tabs-mode, kept-new-versions, no-byte-compile)
+	(no-update-autoloads, outline-regexp, page-delimiter)
+	(paragraph-start, paragraph-separate, sentence-end)
+	(sentence-end-double-space tab-width, version-control):
+	Add `safe-local-variable' property.
 
 	* find-lisp.el: Delete nonexistent `autocompile' file variable.
 
@@ -49,7 +141,7 @@
 
 2006-02-13  Jay Belanger  <belanger@truman.edu>
 
-	* calc/calc-arith.el:  (math-check-known-matrixp): Make sure
+	* calc/calc-arith.el (math-check-known-matrixp): Make sure
 	expression is a symbol before checking that it is bound.
 
 2006-02-13  Richard M. Stallman  <rms@gnu.org>
@@ -61,7 +153,7 @@
 	inside `interactive' spec.
 	(describe-key-briefly-internal, describe-key-internal):
 	Functions merged back into their callers.
-	
+
 2006-02-13  Martin Rudalics  <rudalics@gmx.at>  (tiny change)
 
 	* info.el (info-xref-visited): Inherit from info-xref too.
@@ -179,7 +271,7 @@
 2006-02-11  Martin Rudalics  <rudalics@gmx.at>
 
 	* files.el (revert-buffer, recover-file): Replace buffer-read-only
-	with inhibit-read-only.	Suggested by Stefan Monnier.
+	with inhibit-read-only.  Suggested by Stefan Monnier.
 	(revert-buffer): Let insert-file-contents discard
 	buffer-undo-list.  Simplify code.
 	(find-file, find-file-existing, revert-buffer): Doc-string fixes.
--- a/lisp/bs.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/bs.el	Fri Feb 17 09:10:23 2006 +0000
@@ -652,6 +652,7 @@
   (use-local-map bs-mode-map)
   (make-local-variable 'font-lock-defaults)
   (make-local-variable 'font-lock-verbose)
+  (buffer-disable-undo)
   (setq major-mode 'bs-mode
 	mode-name "Buffer-Selection-Menu"
 	buffer-read-only t
@@ -1164,7 +1165,8 @@
     (bs--set-window-height)
     (bs--goto-current-buffer)
     (font-lock-fontify-buffer)
-    (bs-apply-sort-faces)))
+    (bs-apply-sort-faces)
+    (set-buffer-modified-p nil)))
 
 (defun bs-next-buffer (&optional buffer-list sorting-p)
   "Return next buffer and buffer list for buffer cycling in BUFFER-LIST.
@@ -1338,16 +1340,11 @@
 default directory.
 START-BUFFER is the buffer where we started buffer selection.
 ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
-  (let ((string (copy-sequence (if (member major-mode
-					   '(shell-mode dired-mode))
-				   default-directory
-				 (or buffer-file-name "")))))
-    (add-text-properties
-     0 (length string)
-     '(mouse-face highlight
-       help-echo "mouse-2: select this buffer, mouse-3: select in other frame")
-     string)
-    string))
+  (propertize (if (member major-mode '(shell-mode dired-mode))
+                  default-directory
+                (or buffer-file-name ""))
+              'mouse-face 'highlight
+              'help-echo "mouse-2: select this buffer, mouse-3: select in other frame"))
 
 (defun bs--insert-one-entry (buffer)
   "Generate one entry for buffer BUFFER in Buffer Selection Menu.
--- a/lisp/calc/calc-arith.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/calc/calc-arith.el	Fri Feb 17 09:10:23 2006 +0000
@@ -334,6 +334,7 @@
             ((memq 'scalar (nth 1 decl))
              t)
             ((and (eq (car a) 'var)
+                  (symbolp (nth 2 a))
                   (boundp (nth 2 a))
                   (setq val (symbol-value (nth 2 a))))
              (math-check-known-scalarp val))
--- a/lisp/calc/calcalg2.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/calc/calcalg2.el	Fri Feb 17 09:10:23 2006 +0000
@@ -1253,9 +1253,11 @@
 			(calcFunc-expand temp)
 		      (setq v (list 'var 'PARTS math-cur-record)
 			    temp (let (calc-next-why)
-				   (math-solve-for (math-sub v temp) 0 v nil)))
-		      (and temp (not (integerp temp))
-			   (math-simplify-extended temp)))))
+                                   (math-simplify-extended
+                                    (math-solve-for (math-sub v temp) 0 v nil)))
+                            temp (if (and (eq (car-safe temp) '/) 
+                                          (math-zerop (nth 2 temp))) 
+                                     nil temp)))))
 	   (setcar (cdr math-cur-record) 'busy)))))
 
 ;;; This tries two different formulations, hoping the algebraic simplifier
--- a/lisp/calendar/icalendar.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/calendar/icalendar.el	Fri Feb 17 09:10:23 2006 +0000
@@ -293,7 +293,7 @@
 ;;  (car (cddr event)))
 
 (defun icalendar--get-event-property (event prop)
-  "For the given EVENT return the value of the first occurence of PROP."
+  "For the given EVENT return the value of the first occurrence of PROP."
   (catch 'found
     (let ((props (car (cddr event))) pp)
       (while props
@@ -304,7 +304,7 @@
     nil))
 
 (defun icalendar--get-event-property-attributes (event prop)
-  "For the given EVENT return attributes of the first occurence of PROP."
+  "For the given EVENT return attributes of the first occurrence of PROP."
   (catch 'found
     (let ((props (car (cddr event))) pp)
       (while props
--- a/lisp/cus-edit.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/cus-edit.el	Fri Feb 17 09:10:23 2006 +0000
@@ -1720,6 +1720,7 @@
   :help-echo "Read the manual entry for this option."
   :button-face 'custom-link
   :mouse-face 'highlight
+  :pressed-face 'highlight
   :tag "Manual")
 
 ;;; The `custom-magic' Widget.
@@ -2201,7 +2202,8 @@
 	(push (widget-create-child-and-convert
 	       widget (car links)
 	       :button-face 'custom-link
-	       :mouse-face 'highlight)
+	       :mouse-face 'highlight
+	       :pressed-face 'highlight)
 	      buttons)
 	(setq links (cdr links))
 	(cond ((null links)
@@ -2247,7 +2249,8 @@
                (push (widget-create-child-and-convert
 		      widget (car links)
 		      :button-face 'custom-link
-		      :mouse-face 'highlight)
+		      :mouse-face 'highlight
+		      :pressed-face 'highlight)
                      buttons)
                (setq links (cdr links))
                (cond ((null links)
@@ -3590,6 +3593,7 @@
   "Show parent in other window when activated."
   :button-face 'custom-link
   :mouse-face 'highlight
+  :pressed-face 'highlight
   :help-echo "Create customization buffer for this group."
   :action 'custom-group-link-action)
 
@@ -4365,7 +4369,6 @@
     (define-key map "u" 'Custom-goto-parent)
     (define-key map "n" 'widget-forward)
     (define-key map "p" 'widget-backward)
-    (define-key map [mouse-1] 'widget-move-and-invoke)
     map)
   "Keymap for `custom-mode'.")
 
@@ -4421,7 +4424,7 @@
 \\<custom-field-keymap>\
 Complete content of editable text field.   \\[widget-complete]
 \\<custom-mode-map>\
-Invoke button under the mouse pointer.     \\[widget-move-and-invoke]
+Invoke button under the mouse pointer.     \\[widget-button-click]
 Invoke button under point.                 \\[widget-button-press]
 Set all options from current text.         \\[Custom-set]
 Make values in current text permanent.     \\[Custom-save]
--- a/lisp/cus-start.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/cus-start.el	Fri Feb 17 09:10:23 2006 +0000
@@ -362,6 +362,7 @@
 				 (repeat (directory :format "%v")))
 	     (x-use-old-gtk-file-dialog menu boolean "22.1")
 	     (x-gtk-show-hidden-files menu boolean "22.1")
+	     (x-gtk-whole-detached-tool-bar x boolean "22.1")
 	     ;; xterm.c
              (mouse-autoselect-window display boolean "21.3")
 	     (x-use-underline-position-properties display boolean "21.3")
--- a/lisp/cus-theme.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/cus-theme.el	Fri Feb 17 09:10:23 2006 +0000
@@ -38,7 +38,6 @@
     (suppress-keymap map)
     (define-key map "n" 'widget-forward)
     (define-key map "p" 'widget-backward)
-    (define-key map [mouse-1] 'widget-move-and-invoke)
     map)
   "Keymap for `custom-new-theme-mode'.")
 
--- a/lisp/erc/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/erc/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,25 @@
+2006-02-15  Michael Olson  <mwolson@gnu.org>
+
+	* erc.el (erc): Move to the end of the buffer when a continued
+	session is detected.  Thanks to e1f and indio for the report and
+	testing a potential fix.
+
+2006-02-14  Michael Olson  <mwolson@gnu.org>
+
+	* debian/changelog: Prepare a new Debian package.
+
+	* Makefile (debprepare): New rule that creates an ERC snapshot
+	directory for use in both new Debian releases and revisions for
+	Debian packages.
+	(debrelease, debrevision-mwolson): Use debprepare.
+
+	* NEWS: Bring up-to-date.
+
+	* erc-stamp.el (erc-insert-timestamp-right): For now, put
+	timestamps before rather than after erc-fill-column when
+	erc-timestamp-right-column is nil.  This way we won't surprise
+	anyone unpleasantly, or so it is hoped.
+
 2006-02-13  Michael Olson  <mwolson@gnu.org>
 
 	* erc-dcc.el: Use (eval-when-compile (require 'cl)).
--- a/lisp/erc/erc-stamp.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/erc/erc-stamp.el	Fri Feb 17 09:10:23 2006 +0000
@@ -240,19 +240,18 @@
     (goto-char (point-max))
     (forward-char -1);; before the last newline
     (let* ((current-window (get-buffer-window (current-buffer)))
+	   (str-width (string-width string))
 	   (pos (cond
 		 (erc-timestamp-right-column erc-timestamp-right-column)
 		 ((and (boundp 'erc-fill-mode)
 		       erc-fill-mode
 		       (boundp 'erc-fill-column)
 		       erc-fill-column)
-		  (1+ erc-fill-column))
+		  (1+ (- erc-fill-column str-width)))
 		 (fill-column
-		  (1+ fill-column))
+		  (1+ (- fill-column str-width)))
 		 (t
-		  (- (window-width)
-		     (string-width string)
-		     1))))
+		  (- (window-width) str-width 1))))
 	   (from (point))
 	   (col (current-column))
 	   indent)
--- a/lisp/erc/erc.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/erc/erc.el	Fri Feb 17 09:10:23 2006 +0000
@@ -1927,7 +1927,8 @@
       (goto-char (point-max))
       (insert "\n"))
     (set-marker (process-mark erc-server-process) (point))
-    (unless continued-session
+    (if continued-session
+	(goto-char (point-max))
       (set-marker erc-insert-marker (point))
       (erc-display-prompt)
       (goto-char (point-max)))
--- a/lisp/files.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/files.el	Fri Feb 17 09:10:23 2006 +0000
@@ -2225,58 +2225,68 @@
     (let ((name (if buffer-file-name
 		    (file-name-nondirectory buffer-file-name)
 		  (concat "buffer " (buffer-name))))
-	  char)
+	  prompt char)
       (save-window-excursion
-	(with-output-to-temp-buffer "*Local Variables*"
+	(let ((buf (get-buffer-create "*Local Variables*")))
+	  (pop-to-buffer buf)
+	  (set (make-local-variable 'cursor-type) nil)
+	  (erase-buffer)
 	  (if unsafe-vars
-	      (progn (princ "The local variables list in ")
-		     (princ name)
-		     (princ "\ncontains values that may not be safe (*)")
-		     (if risky-vars
-			 (princ ", and variables that are risky (**).")
-		       (princ ".")))
+	      (insert "The local variables list in " name
+		      "\ncontains values that may not be safe (*)"
+		      (if risky-vars
+			  ", and variables that are risky (**)."
+			"."))
 	    (if risky-vars
-		(progn (princ "The local variables list in ")
-		       (princ name)
-		       (princ "\ncontains variables that are risky (**)."))
-	      (princ "A local variables list is specified in ")
-	      (princ name)
-	      (princ ".")))
-	  (princ "\n\nDo you want to apply it?  You can type
+		(insert "The local variables list in " name
+			"\ncontains variables that are risky (**).")
+	      (insert "A local variables list is specified in " name ".")))
+	  (insert "\n\nDo you want to apply it?  You can type
 y  -- to apply the local variables list.
 n  -- to ignore the local variables list.
 !  -- to apply the local variables list, and mark these values (*) as
       safe (in the future, they can be set automatically.)\n\n")
 	  (dolist (elt vars)
 	    (cond ((member elt unsafe-vars)
-		   (princ "  * "))
+		   (insert "  * "))
 		  ((member elt risky-vars)
-		   (princ " ** "))
+		   (insert " ** "))
 		  (t
-		   (princ "    ")))
-	    (princ (car elt))
-	    (princ " : ")
-	    (princ (cdr elt))
-	    (princ "\n")))
-	(message "Please type y, n, or !: ")
-	(let ((inhibit-quit t)
-	      (cursor-in-echo-area t))
-	  (while (or (not (numberp (setq char (read-event))))
-		     (not (memq (downcase char)
-				'(?! ?y ?n ?\s ?\C-g))))
-	    (message "Please type y, n, or !: "))
-	  (if (= char ?\C-g)
-	      (setq quit-flag nil)))
-	(setq char (downcase char))
-	(when (and (= char ?!) unsafe-vars)
-	  (dolist (elt unsafe-vars)
-	    (push elt safe-local-variable-values))
-	  (customize-save-variable
-	   'safe-local-variable-values
-	   safe-local-variable-values))
-	(or (= char ?!)
-	    (= char ?\s)
-	    (= char ?y))))))
+		   (insert "    ")))
+	    (princ (car elt) buf)
+	    (insert " : ")
+	    (princ (cdr elt) buf)
+	    (insert "\n"))
+	  (if (< (line-number-at-pos) (window-body-height))
+	      (setq prompt "Please type y, n, or !: ")
+	    (goto-char (point-min))
+	    (setq prompt "Please type y, n, or !, or C-v to scroll: "))
+	  (let ((inhibit-quit t)
+		(cursor-in-echo-area t)
+		done)
+	    (while (not done)
+	      (message prompt)
+	      (setq char (read-event))
+	      (if (numberp char)
+		  (if (eq char ?\C-v)
+		      (condition-case nil
+			  (scroll-up)
+			(error (goto-char (point-min))))
+		    (setq done (memq (downcase char)
+				     '(?! ?y ?n ?\s ?\C-g))))))
+	    (if (= char ?\C-g)
+		(setq quit-flag nil)))
+	  (setq char (downcase char))
+	  (when (and (= char ?!) unsafe-vars)
+	    (dolist (elt unsafe-vars)
+	      (add-to-list 'safe-local-variable-values elt))
+	    (customize-save-variable
+	     'safe-local-variable-values
+	     safe-local-variable-values))
+	  (kill-buffer buf)
+	  (or (= char ?!)
+	      (= char ?\s)
+	      (= char ?y)))))))
 
 (defun hack-local-variables-prop-line (&optional mode-only)
   "Return local variables specified in the -*- line.
@@ -2439,12 +2449,12 @@
       ;; variables (if MODE-ONLY is nil.)
       (if mode-only
 	  result
+	(dolist (ignored ignored-local-variables)
+	  (setq result (assq-delete-all ignored result)))
+	(if (null enable-local-eval)
+	    (setq result (assq-delete-all 'eval result)))
 	(when result
 	  (setq result (nreverse result))
-	  (dolist (ignored ignored-local-variables)
-	    (setq result (assq-delete-all ignored result)))
-	  (if (null enable-local-eval)
-	      (setq result (assq-delete-all 'eval result)))
 	  ;; Find those variables that we may want to save to
 	  ;; `safe-local-variable-values'.
 	  (let (risky-vars unsafe-vars)
--- a/lisp/gnus/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,50 @@
+2006-02-16  Juanma Barranquero  <lekktu@gmail.com>
+
+	* html2text.el (html2text-remove-tag-list):
+	* spam-stat.el (spam-stat-buffer-words): Fix typo in docstring.
+
+2006-02-14  Chong Yidong  <cyd@stupidchicken.com>
+
+	* gnus-cus.el: Revert 2005-10-17 change.
+
+2006-02-17  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus-art.el (article-strip-banner): Call
+	article-really-strip-banner only when the regexp match is made.
+
+2006-02-16  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus-art.el (article-strip-banner): Use
+	gnus-extract-address-components instead of
+	mail-header-parse-addresses to make it work with non-ASCII text.
+
+	* rfc2231.el (rfc2231-parse-string): Attempt to parse parameter
+	values which are surrounded with \"...\"; make it never cause a
+	Lisp error; give up parsing of parameters if it failed in
+	extracting type.
+
+2006-02-15  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* mm-util.el (mm-make-temp-file): Import the Emacs 22 version of
+	make-temp-file; make it work with Emacs 20 and XEmacs as well.
+
+	* mm-decode.el (mm-display-external): Use the 3rd arg of
+	mm-make-temp-file.
+	(mm-create-image-xemacs): Ditto.
+
+2006-02-14  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus-draft.el (gnus-draft-send): Replace message-narrow-to-head
+	with message-narrow-to-headers.
+	(gnus-draft-setup): Narrow to header to run message-fetch-field.
+	(gnus-draft-check-draft-articles): New function.
+	(gnus-draft-edit-message, gnus-draft-send-message): Use it.
+
+2006-02-13  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* nnoo.el (nnoo-declare): Don't generate duplicate entries when
+	re-loading nn* modules.
+
 2006-02-10  Reiner Steib  <Reiner.Steib@gmx.de>
 
 	* gnus.el: Remove bogus comment.
--- a/lisp/gnus/gnus-art.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/gnus-art.el	Fri Feb 17 09:10:23 2006 +0000
@@ -2608,18 +2608,22 @@
 	  (article-really-strip-banner
 	   (gnus-parameter-banner gnus-newsgroup-name)))
 	(when gnus-article-address-banner-alist
-	  (article-really-strip-banner
-	   (let ((from (save-restriction
-			 (widen)
-			 (article-narrow-to-head)
-			 (mail-fetch-field "from"))))
-	     (when (and from
-			(setq from
-			      (caar (mail-header-parse-addresses from))))
-	       (catch 'found
-		 (dolist (pair gnus-article-address-banner-alist)
-		   (when (string-match (car pair) from)
-		     (throw 'found (cdr pair)))))))))))))
+	  ;; Note that the From header is decoded here, so it is
+	  ;; required that the *-extract-address-components function
+	  ;; supports non-ASCII text.
+	  (let ((from (save-restriction
+			(widen)
+			(article-narrow-to-head)
+			(mail-fetch-field "from"))))
+	    (when (and from
+		       (setq from
+			     (cadr (funcall gnus-extract-address-components
+					    from))))
+	      (catch 'found
+		(dolist (pair gnus-article-address-banner-alist)
+		  (when (string-match (car pair) from)
+		    (throw 'found
+			   (article-really-strip-banner (cdr pair)))))))))))))
 
 (defun article-really-strip-banner (banner)
   "Strip the banner specified by the argument."
--- a/lisp/gnus/gnus-cus.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/gnus-cus.el	Fri Feb 17 09:10:23 2006 +0000
@@ -36,14 +36,6 @@
 
 ;;; Widgets:
 
-(defvar gnus-custom-map
-  (let ((map (make-keymap)))
-    (set-keymap-parent map widget-keymap)
-    (suppress-keymap map)
-    (define-key map [mouse-1] 'widget-move-and-invoke)
-    map)
-  "Keymap for editing Gnus customization buffers.")
-
 (defun gnus-custom-mode ()
   "Major mode for editing Gnus customization buffers.
 
@@ -59,7 +51,7 @@
   (kill-all-local-variables)
   (setq major-mode 'gnus-custom-mode
 	mode-name "Gnus Customize")
-  (use-local-map gnus-custom-map)
+  (use-local-map widget-keymap)
   ;; Emacs 21 stuff:
   (when (and (facep 'custom-button-face)
 	     (facep 'custom-button-pressed-face))
@@ -490,7 +482,7 @@
 	    (widget-create 'sexp
 			   :tag "Method"
 			   :value (gnus-info-method info))))
-    (use-local-map gnus-custom-map)
+    (use-local-map widget-keymap)
     (widget-setup)
     (buffer-enable-undo)
     (goto-char (point-min))))
@@ -884,7 +876,7 @@
 			 '(repeat :inline t
 				  :tag "Unknown entries"
 				  sexp)))
-    (use-local-map gnus-custom-map)
+    (use-local-map widget-keymap)
     (widget-setup)))
 
 (defun gnus-score-customize-done (&rest ignore)
@@ -1061,7 +1053,7 @@
 
       (gnus-agent-cat-prepare-category-field agent-enable-undownloaded-faces)
 
-      (use-local-map gnus-custom-map)
+      (use-local-map widget-keymap)
       (widget-setup)
       (buffer-enable-undo))))
 
--- a/lisp/gnus/gnus-draft.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/gnus-draft.el	Fri Feb 17 09:10:23 2006 +0000
@@ -98,6 +98,7 @@
   (interactive)
   (let ((article (gnus-summary-article-number))
 	(group gnus-newsgroup-name))
+    (gnus-draft-check-draft-articles (list article))
     (gnus-summary-mark-as-read article gnus-canceled-mark)
     (gnus-draft-setup article group t)
     (set-buffer-modified-p t)
@@ -122,6 +123,7 @@
   (let* ((articles (gnus-summary-work-articles n))
 	 (total (length articles))
 	 article)
+    (gnus-draft-check-draft-articles articles)
     (while (setq article (pop articles))
       (gnus-summary-remove-process-mark article)
       (unless (memq article gnus-newsgroup-unsendable)
@@ -152,7 +154,7 @@
     ;; We read the meta-information that says how and where
     ;; this message is to be sent.
     (save-restriction
-      (message-narrow-to-head)
+      (message-narrow-to-headers)
       (when (re-search-forward
 	     (concat "^" (regexp-quote gnus-agent-target-move-group-header)
 		     ":") nil t)
@@ -258,9 +260,12 @@
 	    (goto-char (point-min))
 	    (search-forward "\n\n")
 	    (forward-char -1)
+	    (save-restriction
+	      (narrow-to-region (point-min) (point))
+	      (setq ga
+		    (message-fetch-field gnus-draft-meta-information-header)))
 	    (insert mail-header-separator)
 	    (forward-line 1)
-	    (setq ga (message-fetch-field gnus-draft-meta-information-header))
 	    (message-set-auto-save-file-name))))
       (gnus-backlog-remove-article group narticle)
       (when (and ga
@@ -285,6 +290,32 @@
   "Say whether ARTICLE is sendable."
   (not (memq article gnus-newsgroup-unsendable)))
 
+(defun gnus-draft-check-draft-articles (articles)
+  "Check whether the draft articles ARTICLES are under edit."
+  (when (equal gnus-newsgroup-name "nndraft:drafts")
+    (let ((buffers (buffer-list))
+	  file buffs buff)
+      (save-current-buffer
+	(while (and articles
+		    (not buff))
+	  (setq file (nndraft-article-filename (pop articles))
+		buffs buffers)
+	  (while buffs
+	    (set-buffer (setq buff (pop buffs)))
+	    (if (and buffer-file-name
+		     (string-equal (file-truename buffer-file-name)
+				   (file-truename file))
+		     (buffer-modified-p))
+		(setq buffs nil)
+	      (setq buff nil)))))
+      (when buff
+	(let* ((window (get-buffer-window buff t))
+	       (frame (and window (window-frame window))))
+	  (if frame
+	      (gnus-select-frame-set-input-focus frame)
+	    (pop-to-buffer buff t)))
+	(error "The draft %s is under edit" file)))))
+
 (provide 'gnus-draft)
 
 ;;; arch-tag: 3d92af58-8c97-4a5c-9db4-a98e85198022
--- a/lisp/gnus/html2text.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/html2text.el	Fri Feb 17 09:10:23 2006 +0000
@@ -59,7 +59,7 @@
 
 This is a list of tags which should be removed, without any
 formatting.  Note that tags in the list are presented *without*
-any \"<\" or \">\".  All occurences of a tag appearing in this
+any \"<\" or \">\".  All occurrences of a tag appearing in this
 list are removed, irrespective of whether it is a closing or
 opening tag, or if the tag has additional attributes.  The
 deletion is done by the function `html2text-remove-tags'.
--- a/lisp/gnus/mm-decode.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/mm-decode.el	Fri Feb 17 09:10:23 2006 +0000
@@ -769,19 +769,18 @@
 			  (gnus-map-function mm-file-name-rewrite-functions
 					     (file-name-nondirectory filename))
 			  dir))
-	    (setq file (mm-make-temp-file (expand-file-name "mm." dir)))
-	    (let ((newname
-		   ;; Use nametemplate (defined in RFC1524) if it is
-		   ;; specified in mailcap.
-		   (if (assoc "nametemplate" mime-info)
-		       (format (cdr (assoc "nametemplate" mime-info)) file)
-		     ;; Add a suffix according to `mailcap-mime-extensions'.
-		     (concat file (car (rassoc (mm-handle-media-type handle)
-					       mailcap-mime-extensions))))))
-	      (unless (string-equal file newname)
-		(when (file-exists-p file)
-		  (rename-file file newname))
-		(setq file newname))))
+	    ;; Use nametemplate (defined in RFC1524) if it is specified
+	    ;; in mailcap.
+	    (let ((suffix (cdr (assoc "nametemplate" mime-info))))
+	      (if (and suffix
+		       (string-match "\\`%s\\(\\..+\\)\\'" suffix))
+		  (setq suffix (match-string 1 suffix))
+		;; Otherwise, use a suffix according to
+		;; `mailcap-mime-extensions'.
+		(setq suffix (car (rassoc (mm-handle-media-type handle)
+					  mailcap-mime-extensions))))
+	      (setq file (mm-make-temp-file (expand-file-name "mm." dir)
+					    nil suffix))))
 	  (let ((coding-system-for-write mm-binary-coding-system))
 	    (write-region (point-min) (point-max) file nil 'nomesg))
 	  (message "Viewing with %s" method)
@@ -1312,8 +1311,8 @@
     ;; out to a file, and then create a file
     ;; specifier.
     (let ((file (mm-make-temp-file
-		 (expand-file-name "emm.xbm"
-				   mm-tmp-directory))))
+		 (expand-file-name "emm" mm-tmp-directory)
+		 nil ".xbm")))
       (unwind-protect
 	  (progn
 	    (write-region (point-min) (point-max) file)
--- a/lisp/gnus/mm-util.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/mm-util.el	Fri Feb 17 09:10:23 2006 +0000
@@ -99,16 +99,6 @@
 	   (lambda (ch) (mm-string-as-multibyte (char-to-string ch)))
 	   string "")))
      (multibyte-string-p . ignore)
-     ;; It is not a MIME function, but some MIME functions use it.
-     (make-temp-file . (lambda (prefix &optional dir-flag)
-			 (let ((file (expand-file-name
-				      (make-temp-name prefix)
-				      (if (fboundp 'temp-directory)
-					  (temp-directory)
-					temporary-file-directory))))
-			   (if dir-flag
-			       (make-directory file))
-			   file)))
      (insert-byte . insert-char)
      (multibyte-char-to-unibyte . identity))))
 
@@ -902,6 +892,77 @@
 	   inhibit-file-name-handlers)))
     (write-region start end filename append visit lockname)))
 
+;; It is not a MIME function, but some MIME functions use it.
+(if (and (fboundp 'make-temp-file)
+	 (ignore-errors
+	   (let ((def (symbol-function 'make-temp-file)))
+	     (and (byte-code-function-p def)
+		  (setq def (if (fboundp 'compiled-function-arglist)
+				;; XEmacs
+				(eval (list 'compiled-function-arglist def))
+			      (aref def 0)))
+		  (>= (length def) 4)
+		  (eq (nth 3 def) 'suffix)))))
+    (defalias 'mm-make-temp-file 'make-temp-file)
+  ;; Stolen (and modified for Emacs 20 and XEmacs) from Emacs 22.
+  (defun mm-make-temp-file (prefix &optional dir-flag suffix)
+    "Create a temporary file.
+The returned file name (created by appending some random characters at the end
+of PREFIX, and expanding against `temporary-file-directory' if necessary),
+is guaranteed to point to a newly created empty file.
+You can then use `write-region' to write new data into the file.
+
+If DIR-FLAG is non-nil, create a new empty directory instead of a file.
+
+If SUFFIX is non-nil, add that at the end of the file name."
+    (let ((umask (default-file-modes))
+	  file)
+      (unwind-protect
+	  (progn
+	    ;; Create temp files with strict access rights.  It's easy to
+	    ;; loosen them later, whereas it's impossible to close the
+	    ;; time-window of loose permissions otherwise.
+	    (set-default-file-modes 448)
+	    (while (condition-case err
+		       (progn
+			 (setq file
+			       (make-temp-name
+				(expand-file-name
+				 prefix
+				 (if (fboundp 'temp-directory)
+				     ;; XEmacs
+				     (temp-directory)
+				   temporary-file-directory))))
+			 (if suffix
+			     (setq file (concat file suffix)))
+			 (if dir-flag
+			     (make-directory file)
+			   (if (or (featurep 'xemacs)
+				   (= emacs-major-version 20))
+			       ;; NOTE: This is unsafe if Emacs 20
+			       ;; users and XEmacs users don't use
+			       ;; a secure temp directory.
+			       (if (file-exists-p file)
+				   (signal 'file-already-exists
+					   (list "File exists" file))
+				 (write-region "" nil file nil 'silent))
+			     (write-region "" nil file nil 'silent
+					   nil 'excl)))
+			 nil)
+		     (file-already-exists t)
+		     ;; The Emacs 20 and XEmacs versions of
+		     ;; `make-directory' issue `file-error'.
+		     (file-error (or (and (or (featurep 'xemacs)
+					      (= emacs-major-version 20))
+					  (file-exists-p file))
+				     (signal (car err) (cdr err)))))
+	      ;; the file was somehow created by someone else between
+	      ;; `make-temp-name' and `write-region', let's try again.
+	      nil)
+	    file)
+	;; Reset the umask.
+	(set-default-file-modes umask)))))
+
 (defun mm-image-load-path (&optional package)
   (let (dir result)
     (dolist (path load-path (nreverse result))
--- a/lisp/gnus/nnoo.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/nnoo.el	Fri Feb 17 09:10:23 2006 +0000
@@ -61,12 +61,16 @@
 
 (defmacro nnoo-declare (backend &rest parents)
   `(eval-and-compile
-     (push (list ',backend
-		 (mapcar (lambda (p) (list p)) ',parents)
-		 nil nil)
-	   nnoo-definition-alist)
-     (push (list ',backend "*internal-non-initialized-backend*")
-	   nnoo-state-alist)))
+     (if (assq ',backend nnoo-definition-alist)
+	 (setcar (cdr (assq ',backend nnoo-definition-alist))
+		 (mapcar 'list ',parents))
+       (push (list ',backend
+		   (mapcar 'list ',parents)
+		   nil nil)
+	     nnoo-definition-alist))
+     (unless (assq ',backend nnoo-state-alist)
+       (push (list ',backend "*internal-non-initialized-backend*")
+	     nnoo-state-alist))))
 (put 'nnoo-declare 'lisp-indent-function 1)
 
 (defun nnoo-parents (backend)
--- a/lisp/gnus/rfc2231.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/rfc2231.el	Fri Feb 17 09:10:23 2006 +0000
@@ -47,15 +47,45 @@
  `(name (attribute . value) (attribute . value)...)'.
 
 If the optional SIGNAL-ERROR is non-nil, signal an error when this
-function fails in parsing of parameters."
+function fails in parsing of parameters.  Otherwise, this function
+must never cause a Lisp error."
   (with-temp-buffer
     (let ((ttoken (ietf-drums-token-to-list ietf-drums-text-token))
 	  (stoken (ietf-drums-token-to-list ietf-drums-tspecials))
 	  (ntoken (ietf-drums-token-to-list "0-9"))
 	  c type attribute encoded number prev-attribute vals
 	  prev-encoded parameters value)
-      (ietf-drums-init (mail-header-remove-whitespace
-			(mail-header-remove-comments string)))
+      (ietf-drums-init
+       (condition-case nil
+	   (mail-header-remove-whitespace
+	    (mail-header-remove-comments string))
+	 ;; The most likely cause of an error is unbalanced parentheses
+	 ;; or double-quotes.  If all parentheses and double-quotes are
+	 ;; quoted meaninglessly with backslashes, removing them might
+	 ;; make it parseable.  Let's try...
+	 (error
+	  (let (mod)
+	    (when (and (string-match "\\\\\"" string)
+		       (not (string-match "\\`\"\\|[^\\]\"" string)))
+	      (setq string (mm-replace-in-string string "\\\\\"" "\"")
+		    mod t))
+	    (when (and (string-match "\\\\(" string)
+		       (string-match "\\\\)" string)
+		       (not (string-match "\\`(\\|[^\\][()]" string)))
+	      (setq string (mm-replace-in-string string "\\\\\\([()]\\)" "\\1")
+		    mod t))
+	    (or (and mod
+		     (ignore-errors
+		       (mail-header-remove-whitespace
+			(mail-header-remove-comments string))))
+		;; Finally, attempt to extract only type.
+		(if (string-match
+		     (concat "\\`[\t\n ]*\\([^" ietf-drums-tspecials "\t\n ]+"
+			     "\\(/[^" ietf-drums-tspecials
+			     "\t\n ]+\\)?\\)\\([\t\n ;]\\|\\'\\)")
+		     string)
+		    (match-string 1 string)
+		  ""))))))
       (let ((table (copy-syntax-table ietf-drums-syntax-table)))
 	(modify-syntax-entry ?\' "w" table)
 	(modify-syntax-entry ?* " " table)
@@ -67,9 +97,12 @@
 	(set-syntax-table table))
       (setq c (char-after))
       (when (and (memq c ttoken)
-		 (not (memq c stoken)))
-	(setq type (downcase (buffer-substring
-			      (point) (progn (forward-sexp 1) (point)))))
+		 (not (memq c stoken))
+		 (setq type (ignore-errors
+			      (downcase
+			       (buffer-substring (point) (progn
+							   (forward-sexp 1)
+							   (point)))))))
 	;; Do the params
 	(condition-case err
 	    (progn
@@ -180,8 +213,7 @@
 	     ;;(message "%s" (error-message-string err))
 	     )))
 
-	(when type
-	  `(,type ,@(nreverse parameters)))))))
+	(cons type (nreverse parameters))))))
 
 (defun rfc2231-decode-encoded-string (string)
   "Decode an RFC2231-encoded string.
--- a/lisp/gnus/spam-stat.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/gnus/spam-stat.el	Fri Feb 17 09:10:23 2006 +0000
@@ -323,7 +323,7 @@
      ,@body))
 
 (defun spam-stat-buffer-words ()
-  "Return a hash table of words and number of occurences in the buffer."
+  "Return a hash table of words and number of occurrences in the buffer."
   (with-spam-stat-max-buffer-size
    (with-syntax-table spam-stat-syntax-table
      (goto-char (point-min))
--- a/lisp/help.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/help.el	Fri Feb 17 09:10:23 2006 +0000
@@ -510,7 +510,7 @@
 		(if (> (length keys) 0)
 		    (if remapped
 			(format "%s is remapped to %s which is on %s"
-				definition symbol keys)
+				symbol remapped keys)
 		      (format "%s is on %s" symbol keys))
 		  ;; If this is the command the user asked about,
 		  ;; and it is not on any key, say so.
--- a/lisp/mh-e/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/mh-e/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,39 @@
+2006-02-16  Bill Wohler  <wohler@newt.com>
+
+	* mh-e.el (mh-inherit-face-flag): New variable. Non-nil means that
+	the defface :inherit keyword is available.
+	(mh-face-data): New variable (contains all face specs) and
+	function (accessor).
+	(mh-folder-address, mh-folder-body, mh-folder-cur-msg-number)
+	(mh-folder-date, mh-folder-deleted, mh-folder-followup)
+	(mh-folder-msg-number, mh-folder-refiled)
+	(mh-folder-sent-to-me-hint, mh-folder-sent-to-me-sender)
+	(mh-folder-subject, mh-folder-tick, mh-folder-to)
+	(mh-search-folder, mh-letter-header-field, mh-show-cc)
+	(mh-show-date, mh-show-from)
+	(mh-show-header, mh-show-pgg-bad, mh-show-pgg-good)
+	(mh-show-pgg-unknown, mh-show-signature, mh-show-subject)
+	(mh-show-to, mh-show-xface, mh-speedbar-folder)
+	(mh-speedbar-folder-with-unseen-messages)
+	(mh-speedbar-selected-folder)
+	(mh-speedbar-selected-folder-with-unseen-messages): Use
+	mh-face-data.
+
+	* mh-utils.el (mh-image-load-path): The variables image-load-path
+	or load-path would not get updated if user set mh-image-load-path.
+	Moved tests and add-to-list calls outside of cond so they are
+	applied consistently, even if they are redundant in some
+	circumstances. Efficiency isn't a concern here. Made error
+	messages more user-friendly.
+
+2006-02-15  Peter S Galbraith  <psg@debian.org>
+
+	* mh-compat.el (mh-image-search-load-path): Compatibility code.
+	Emacs 21 and XEmacs don't have `image-search-load-path'.
+
+	* mh-utils.el (mh-image-load-path): Don't bail out on error if the
+	images are already found.
+
 2006-02-10  Bill Wohler  <wohler@newt.com>
 
 	* mh-search.el (mh-search): Wrap code in (block mh-search ...)
--- a/lisp/mh-e/mh-compat.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/mh-e/mh-compat.el	Fri Feb 17 09:10:23 2006 +0000
@@ -115,6 +115,12 @@
       `(face-background ,face ,frame)
     `(face-background ,face ,frame ,inherit)))
 
+(mh-defun-compat mh-image-search-load-path
+  image-search-load-path (file &optional path)
+  "Emacs 21 and XEmacs don't have `image-search-load-path'.
+This function returns nil on those systems."
+  nil)
+
 ;; For XEmacs.
 (defalias 'mh-line-beginning-position
   (if (fboundp 'line-beginning-position)
@@ -131,7 +137,7 @@
 (mh-defun-compat mh-mail-abbrev-make-syntax-table
   mail-abbrev-make-syntax-table ()
   "Emacs 21 and XEmacs don't have `mail-abbrev-make-syntax-table'.
-This function does nothing on those systems."
+This function returns nil on those systems."
   nil)
 
 (mh-defun-compat mh-match-string-no-properties
--- a/lisp/mh-e/mh-e.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/mh-e/mh-e.el	Fri Feb 17 09:10:23 2006 +0000
@@ -2968,6 +2968,8 @@
 (if (boundp 'facemenu-unlisted-faces)
     (add-to-list 'facemenu-unlisted-faces "^mh-"))
 
+;; Temporary function and data structure used for defining faces.
+;; These will be unbound after the faces are defined.
 (defvar mh-min-colors-defined-flag (and (not mh-xemacs-flag)
                                         (>= emacs-major-version 22))
   "Non-nil means defface supports min-colors display requirement.")
@@ -2999,80 +3001,217 @@
                 (setq new-spec (cons entry new-spec)))))
       new-spec)))
 
-(defface mh-folder-address '((t (:inherit mh-folder-subject)))
+(defvar mh-inherit-face-flag (assq :inherit custom-face-attributes)
+  "Non-nil means that the `defface' :inherit keyword is available.
+The :inherit keyword is available on all supported versions of
+GNU Emacs and XEmacs from at least 21.5.23 on.")
+
+(defvar mh-face-data
+  '((mh-folder-followup
+     ((((class color) (background light))
+       (:foreground "blue3"))
+      (((class color) (background dark))
+       (:foreground "LightGoldenRod"))
+      (t
+       (:bold t))))
+    (mh-folder-msg-number
+     ((((class color) (min-colors 64) (background light))
+       (:foreground "snow4"))
+      (((class color) (min-colors 64) (background dark))
+       (:foreground "snow3"))
+      (((class color))
+       (:foreground "cyan"))))
+    (mh-folder-refiled
+     ((((class color) (min-colors 64) (background light))
+       (:foreground "DarkGoldenrod"))
+      (((class color) (min-colors 64) (background dark))
+       (:foreground "LightGoldenrod"))
+      (((class color))
+       (:foreground "yellow" :weight light))
+      (((class grayscale) (background light))
+       (:foreground "Gray90" :bold t :italic t))
+      (((class grayscale) (background dark))
+       (:foreground "DimGray" :bold t :italic t))
+      (t
+       (:bold t :italic t))))
+    (mh-folder-subject
+     ((((class color) (background light))
+       (:foreground "blue4"))
+      (((class color) (background dark))
+       (:foreground "yellow"))
+      (t
+       (:bold t))))
+    (mh-folder-tick
+     ((((class color) (background dark))
+       (:background "#dddf7e"))
+      (((class color) (background light))
+       (:background "#dddf7e"))
+      (t
+       (:underline t))))
+    (mh-folder-to
+     ((((class color) (min-colors 64) (background light))
+       (:foreground "RosyBrown"))
+      (((class color) (min-colors 64) (background dark))
+       (:foreground "LightSalmon"))
+      (((class color))
+       (:foreground "green"))
+      (((class grayscale) (background light))
+       (:foreground "DimGray" :italic t))
+      (((class grayscale) (background dark))
+       (:foreground "LightGray" :italic t))
+      (t
+       (:italic t))))
+    (mh-letter-header-field
+     ((((class color) (background light))
+       (:background "gray90"))
+      (((class color) (background dark))
+       (:background "gray10"))
+      (t
+       (:bold t))))
+    (mh-search-folder
+     ((((class color) (background light))
+       (:foreground "dark green" :bold t))
+      (((class color) (background dark))
+       (:foreground "indian red" :bold t))
+      (t
+       (:bold t))))
+    (mh-show-cc
+     ((((class color) (min-colors 64) (background light))
+       (:foreground "DarkGoldenrod"))
+      (((class color) (min-colors 64) (background dark))
+       (:foreground "LightGoldenrod"))
+      (((class color))
+       (:foreground "yellow" :weight light))
+      (((class grayscale) (background light))
+       (:foreground "Gray90" :bold t :italic t))
+      (((class grayscale) (background dark))
+       (:foreground "DimGray" :bold t :italic t))
+      (t
+       (:bold t :italic t))))
+    (mh-show-date
+     ((((class color) (min-colors 64) (background light))
+       (:foreground "ForestGreen"))
+      (((class color) (min-colors 64) (background dark))
+       (:foreground "PaleGreen"))
+      (((class color))
+       (:foreground "green"))
+      (((class grayscale) (background light))
+       (:foreground "Gray90" :bold t))
+      (((class grayscale) (background dark))
+       (:foreground "DimGray" :bold t))
+      (t
+       (:bold t :underline t))))
+    (mh-show-from
+     ((((class color) (background light))
+       (:foreground "red3"))
+      (((class color) (background dark))
+       (:foreground "cyan"))
+      (t
+       (:bold t))))
+    (mh-show-header
+     ((((class color) (min-colors 64) (background light))
+       (:foreground "RosyBrown"))
+      (((class color) (min-colors 64) (background dark))
+       (:foreground "LightSalmon"))
+      (((class color))
+       (:foreground "green"))
+      (((class grayscale) (background light))
+       (:foreground "DimGray" :italic t))
+      (((class grayscale) (background dark))
+       (:foreground "LightGray" :italic t))
+      (t
+       (:italic t))))
+    (mh-show-pgg-bad ((t (:bold t :foreground "DeepPink1"))))
+    (mh-show-pgg-good ((t (:bold t :foreground "LimeGreen"))))
+    (mh-show-pgg-unknown ((t (:bold t :foreground "DarkGoldenrod2"))))
+    (mh-show-signature ((t (:italic t))))
+    (mh-show-to
+     ((((class color) (background light))
+       (:foreground "SaddleBrown"))
+      (((class color) (background dark))
+       (:foreground "burlywood"))
+      (((class grayscale) (background light))
+       (:foreground "DimGray" :underline t))
+      (((class grayscale) (background dark))
+       (:foreground "LightGray" :underline t))
+      (t (:underline t))))
+    (mh-speedbar-folder
+     ((((class color) (background light))
+       (:foreground "blue4"))
+      (((class color) (background dark))
+       (:foreground "light blue"))))
+    (mh-speedbar-selected-folder
+     ((((class color) (background light))
+       (:foreground "red1" :underline t))
+      (((class color) (background dark))
+       (:foreground "red1" :underline t))
+      (t
+       (:underline t))))))
+
+(defun mh-face-data (face &optional inherit)
+  "Return spec for FACE.
+If INHERIT is non-nil and `defface' supports the :inherit
+keyword, return INHERIT literally; otherwise, return spec for FACE.
+
+This isn't a perfect implementation. In the case that
+the :inherit keyword is not supported, any additional attributes
+in the inherit parameter are not added to the returned spec."
+  (if (and inherit mh-inherit-face-flag)
+      inherit
+    (mh-defface-compat (cadr (assoc face mh-face-data)))))
+
+(defface mh-folder-address
+  (mh-face-data 'mh-folder-subject '((t (:inherit mh-folder-subject))))
   "Recipient face."
   :group 'mh-faces
   :group 'mh-folder)
 
 (defface mh-folder-body
-  '((((class color))
-     (:inherit mh-folder-msg-number))
-    (t
-     (:inherit mh-folder-msg-number :italic t)))
+  (mh-face-data 'mh-folder-msg-number
+                '((((class color))
+                   (:inherit mh-folder-msg-number))
+                  (t
+                   (:inherit mh-folder-msg-number :italic t))))
   "Body text face."
   :group 'mh-faces
   :group 'mh-folder)
 
 (defface mh-folder-cur-msg-number
-  '((t
-     (:inherit mh-folder-msg-number :bold t)))
+  (mh-face-data 'mh-folder-msg-number
+                '((t (:inherit mh-folder-msg-number :bold t))))
   "Current message number face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-date '((t (:inherit mh-folder-msg-number)))
+(defface mh-folder-date
+  (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-msg-number))))
   "Date face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-deleted '((t (:inherit mh-folder-msg-number)))
+(defface mh-folder-deleted
+  (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-msg-number))))
   "Deleted message face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-followup
-  '((((class color) (background light))
-     (:foreground "blue3"))
-    (((class color) (background dark))
-     (:foreground "LightGoldenRod"))
-    (t
-     (:bold t)))
+(defface mh-folder-followup (mh-face-data 'mh-folder-followup)
   "\"Re:\" face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-msg-number
-  (mh-defface-compat
-   '((((class color) (min-colors 64) (background light))
-      (:foreground "snow4"))
-     (((class color) (min-colors 64) (background dark))
-      (:foreground "snow3"))
-     (((class color))
-      (:foreground "cyan"))))
-
+(defface mh-folder-msg-number (mh-face-data 'mh-folder-msg-number)
   "Message number face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-refiled
-  (mh-defface-compat
-   '((((class color) (min-colors 64) (background light))
-      (:foreground "DarkGoldenrod"))
-     (((class color) (min-colors 64) (background dark))
-      (:foreground "LightGoldenrod"))
-     (((class color))
-      (:foreground "yellow" :weight light))
-     (((class grayscale) (background light))
-      (:foreground "Gray90" :bold t :italic t))
-     (((class grayscale) (background dark))
-      (:foreground "DimGray" :bold t :italic t))
-     (t
-      (:bold t :italic t))))
+(defface mh-folder-refiled (mh-face-data 'mh-folder-refiled)
   "Refiled message face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-sent-to-me-hint '((t (:inherit mh-folder-date)))
+(defface mh-folder-sent-to-me-hint
+  (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-date))))
   "Fontification hint face in messages sent directly to us.
 The detection of messages sent to us is governed by the scan
 format `mh-scan-format-nmh' and the regular expression
@@ -3080,7 +3219,8 @@
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-sent-to-me-sender '((t (:inherit mh-folder-followup)))
+(defface mh-folder-sent-to-me-sender
+  (mh-face-data 'mh-folder-followup '((t (:inherit mh-folder-followup))))
   "Sender face in messages sent directly to us.
 The detection of messages sent to us is governed by the scan
 format `mh-scan-format-nmh' and the regular expression
@@ -3088,212 +3228,122 @@
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-subject
-  '((((class color) (background light))
-     (:foreground "blue4"))
-    (((class color) (background dark))
-     (:foreground "yellow"))
-    (t
-     (:bold t)))
+(defface mh-folder-subject (mh-face-data 'mh-folder-subject)
   "Subject face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-tick
-  '((((class color) (background dark))
-     (:background "#dddf7e"))
-    (((class color) (background light))
-     (:background "#dddf7e"))
-    (t
-     (:underline t)))
+(defface mh-folder-tick (mh-face-data 'mh-folder-tick)
   "Ticked message face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-folder-to
-  (mh-defface-compat
-   '((((class color) (min-colors 64) (background light))
-      (:foreground "RosyBrown"))
-     (((class color) (min-colors 64) (background dark))
-      (:foreground "LightSalmon"))
-     (((class color))
-      (:foreground "green"))
-     (((class grayscale) (background light))
-      (:foreground "DimGray" :italic t))
-     (((class grayscale) (background dark))
-      (:foreground "LightGray" :italic t))
-     (t
-      (:italic t))))
+(defface mh-folder-to (mh-face-data 'mh-folder-to)
   "\"To:\" face."
   :group 'mh-faces
   :group 'mh-folder)
 
-(defface mh-search-folder
-  '((((class color) (background light))
-     (:foreground "dark green" :bold t))
-    (((class color) (background dark))
-     (:foreground "indian red" :bold t))
-    (t
-     (:bold t)))
+(defface mh-letter-header-field (mh-face-data 'mh-letter-header-field)
+  "Editable header field value face in draft buffers."
+  :group 'mh-faces
+  :group 'mh-letter)
+
+(defface mh-search-folder (mh-face-data 'mh-search-folder)
   "Folder heading face in MH-Folder buffers created by searches."
   :group 'mh-faces
   :group 'mh-search)
 
-(defface mh-letter-header-field
-  '((((class color) (background light))
-     (:background "gray90"))
-    (((class color) (background dark))
-     (:background "gray10"))
-    (t
-     (:bold t)))
-  "Editable header field value face in draft buffers."
-  :group 'mh-faces
-  :group 'mh-letter)
-
-(defface mh-show-cc
-  (mh-defface-compat
-   '((((class color) (min-colors 64) (background light))
-      (:foreground "DarkGoldenrod"))
-     (((class color) (min-colors 64) (background dark))
-      (:foreground "LightGoldenrod"))
-     (((class color))
-      (:foreground "yellow" :weight light))
-     (((class grayscale) (background light))
-      (:foreground "Gray90" :bold t :italic t))
-     (((class grayscale) (background dark))
-      (:foreground "DimGray" :bold t :italic t))
-     (t
-      (:bold t :italic t))))
+(defface mh-show-cc (mh-face-data 'mh-show-cc)
   "Face used to highlight \"cc:\" header fields."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-date
-  (mh-defface-compat
-   '((((class color) (min-colors 64) (background light))
-      (:foreground "ForestGreen"))
-     (((class color) (min-colors 64) (background dark))
-      (:foreground "PaleGreen"))
-     (((class color))
-      (:foreground "green"))
-     (((class grayscale) (background light))
-      (:foreground "Gray90" :bold t))
-     (((class grayscale) (background dark))
-      (:foreground "DimGray" :bold t))
-     (t
-      (:bold t :underline t))))
+(defface mh-show-date (mh-face-data 'mh-show-date)
   "Face used to highlight \"Date:\" header fields."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-from
-  '((((class color) (background light))
-     (:foreground "red3"))
-    (((class color) (background dark))
-     (:foreground "cyan"))
-    (t
-     (:bold t)))
+(defface mh-show-from (mh-face-data 'mh-show-from)
   "Face used to highlight \"From:\" header fields."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-header
-  (mh-defface-compat
-   '((((class color) (min-colors 64) (background light))
-      (:foreground "RosyBrown"))
-     (((class color) (min-colors 64) (background dark))
-      (:foreground "LightSalmon"))
-     (((class color))
-      (:foreground "green"))
-     (((class grayscale) (background light))
-      (:foreground "DimGray" :italic t))
-     (((class grayscale) (background dark))
-      (:foreground "LightGray" :italic t))
-     (t
-      (:italic t))))
+(defface mh-show-header (mh-face-data 'mh-show-header)
   "Face used to deemphasize less interesting header fields."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-pgg-bad '((t (:bold t :foreground "DeepPink1")))
+(defface mh-show-pgg-bad (mh-face-data 'mh-show-pgg-bad)
   "Bad PGG signature face."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-pgg-good '((t (:bold t :foreground "LimeGreen")))
+(defface mh-show-pgg-good (mh-face-data 'mh-show-pgg-good)
   "Good PGG signature face."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-pgg-unknown '((t (:bold t :foreground "DarkGoldenrod2")))
+(defface mh-show-pgg-unknown (mh-face-data 'mh-show-pgg-unknown)
   "Unknown or untrusted PGG signature face."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-signature '((t (:italic t)))
+(defface mh-show-signature (mh-face-data 'mh-show-signature)
   "Signature face."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-subject '((t (:inherit mh-folder-subject)))
+(defface mh-show-subject
+  (mh-face-data 'mh-folder-subject '((t (:inherit mh-folder-subject))))
   "Face used to highlight \"Subject:\" header fields."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-to
-  '((((class color) (background light))
-     (:foreground "SaddleBrown"))
-    (((class color) (background dark))
-     (:foreground "burlywood"))
-    (((class grayscale) (background light))
-     (:foreground "DimGray" :underline t))
-    (((class grayscale) (background dark))
-     (:foreground "LightGray" :underline t))
-    (t (:underline t)))
+(defface mh-show-to (mh-face-data 'mh-show-to)
   "Face used to highlight \"To:\" header fields."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-show-xface '((t (:inherit (mh-show-from highlight))))
-  "X-Face image face.
+(defface mh-show-xface
+  (mh-face-data 'mh-show-from '((t (:inherit (mh-show-from highlight)))))
+
+"X-Face image face.
 The background and foreground are used in the image."
   :group 'mh-faces
   :group 'mh-show)
 
-(defface mh-speedbar-folder
-  '((((class color) (background light))
-     (:foreground "blue4"))
-    (((class color) (background dark))
-     (:foreground "light blue")))
+(defface mh-speedbar-folder (mh-face-data 'mh-speedbar-folder)
   "Basic folder face."
   :group 'mh-faces
   :group 'mh-speedbar)
 
 (defface mh-speedbar-folder-with-unseen-messages
-  '((t
-     (:inherit mh-speedbar-folder :bold t)))
+  (mh-face-data 'mh-speedbar-folder
+                '((t (:inherit mh-speedbar-folder :bold t))))
   "Folder face when folder contains unread messages."
   :group 'mh-faces
   :group 'mh-speedbar)
 
 (defface mh-speedbar-selected-folder
-  '((((class color) (background light))
-     (:foreground "red1" :underline t))
-    (((class color) (background dark))
-     (:foreground "red1" :underline t))
-    (t
-     (:underline t)))
+  (mh-face-data 'mh-speedbar-selected-folder)
   "Selected folder face."
   :group 'mh-faces
   :group 'mh-speedbar)
 
 (defface mh-speedbar-selected-folder-with-unseen-messages
-  '((t
-     (:inherit mh-speedbar-selected-folder :bold t)))
+  (mh-face-data 'mh-speedbar-selected-folder
+                '((t (:inherit mh-speedbar-selected-folder :bold t))))
   "Selected folder face when folder contains unread messages."
   :group 'mh-faces
   :group 'mh-speedbar)
 
+;; Get rid of temporary functions and data structures.
+(fmakunbound 'mh-defface-compat)
+(fmakunbound 'mh-face-data)
+(makunbound 'mh-face-data)
+(makunbound 'mh-inherit-face-flag)
+(makunbound 'mh-min-colors-defined-flag)
+
 (provide 'mh-e)
 
 ;; Local Variables:
--- a/lisp/mh-e/mh-mime.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/mh-e/mh-mime.el	Fri Feb 17 09:10:23 2006 +0000
@@ -1741,9 +1741,9 @@
     ("application/x-zip" "\.sxw" "application/vnd.sun.xml.writer")
     ("application/x-zip" "\.odg" "application/vnd.oasis.opendocument.graphics")
     ("application/x-zip" "\.odi" "application/vnd.oasis.opendocument.image")
-    ("application/x-zip" "\.odp" 
+    ("application/x-zip" "\.odp"
      "application/vnd.oasis.opendocument.presentation")
-    ("application/x-zip" "\.ods" 
+    ("application/x-zip" "\.ods"
      "application/vnd.oasis.opendocument.spreadsheet")
     ("application/x-zip" "\.odt" "application/vnd.oasis.opendocument.text"))
   "Substitutions to make for Content-Type returned from file command.
--- a/lisp/mh-e/mh-utils.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/mh-e/mh-utils.el	Fri Feb 17 09:10:23 2006 +0000
@@ -96,10 +96,11 @@
   "Ensure that the MH-E images are accessible by `find-image'.
 
 Images for MH-E are found in \"../../etc/images\" relative to the
-files in \"lisp/mh-e\". This function saves the actual location
-found in the variable `mh-image-load-path'. If the images on your
-system are actually located elsewhere, then set the variable
-`mh-image-load-path' before starting MH-E.
+files in \"lisp/mh-e\", in `image-load-path', or in `load-path'.
+This function saves the actual location found in the variable
+`mh-image-load-path'. If the images on your system are actually
+located elsewhere, then set the variable `mh-image-load-path'
+before starting MH-E.
 
 If `image-load-path' exists (since Emacs 22), then the contents
 of the variable `mh-image-load-path' is added to it if isn't
@@ -109,21 +110,39 @@
 
 See also variable `mh-image-load-path-called-flag'."
   (unless mh-image-load-path-called-flag
-    (if (or (not mh-image-load-path)
-            (not (file-exists-p mh-image-load-path)))
-        (let (mh-library-name)
-          ;; First, find mh-e in the load-path.
-          (setq mh-library-name (locate-library "mh-e"))
-          (if (not mh-library-name)
-              (error "Can not find MH-E in load-path"))
-          (setq mh-image-load-path
-                (expand-file-name (concat (file-name-directory mh-library-name)
-                                          "../../etc/images")))))
+    (cond
+     (mh-image-load-path)            ; user setting exists; we're done
+     ((mh-image-search-load-path "mh-logo.xpm")
+      ;; Images already in image-load-path.
+      (setq mh-image-load-path
+	    (file-name-directory (mh-image-search-load-path "mh-logo.xpm"))))
+     ((locate-library "mh-logo.xpm")
+      ;; Images already in load-path.
+      (setq mh-image-load-path
+	    (file-name-directory (locate-library "mh-logo.xpm"))))
+     (t
+      ;; Guess `mh-image-load-path' if it wasn't provided by the user.
+      (let (mh-library-name)
+        ;; First, find mh-e in the load-path.
+        (setq mh-library-name (locate-library "mh-e"))
+        (if (not mh-library-name)
+            (error "Can not find MH-E in load-path"))
+        ;; And then set mh-image-load-path relative to that.
+        (setq mh-image-load-path
+              (expand-file-name (concat
+                                 (file-name-directory mh-library-name)
+                                 "../../etc/images"))))))
     (if (not (file-exists-p mh-image-load-path))
-        (error "Can not find image directory %s" mh-image-load-path))
+        (error "Directory %s in mh-image-load-path does not exist"
+               mh-image-load-path))
+    (if (not (file-exists-p
+              (expand-file-name "mh-logo.xpm" mh-image-load-path)))
+      (error "Directory %s in mh-image-load-path does not contain MH-E images"
+             mh-image-load-path))
     (if (boundp 'image-load-path)
         (add-to-list 'image-load-path mh-image-load-path)
       (add-to-list 'load-path mh-image-load-path))
+
     (setq mh-image-load-path-called-flag t)))
 
 ;;;###mh-autoload
--- a/lisp/mwheel.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/mwheel.el	Fri Feb 17 09:10:23 2006 +0000
@@ -91,7 +91,7 @@
 		  mouse-wheel-click-button))
   "Event that should be temporarily inhibited after mouse scrolling.
 The mouse wheel is typically on the mouse-2 button, so it may easily
-happen that text is accidentially yanked into the buffer when
+happen that text is accidentally yanked into the buffer when
 scrolling with the mouse wheel.  To prevent that, this variable can be
 set to the event sent when clicking on the mouse wheel button."
   :group 'mouse
@@ -220,7 +220,7 @@
 (define-minor-mode mouse-wheel-mode
   "Toggle mouse wheel support.
 With prefix argument ARG, turn on if positive, otherwise off.
-Returns non-nil if the new state is enabled."
+Return non-nil if the new state is enabled."
   :global t
   :group 'mouse
   (let* ((dn mouse-wheel-down-event)
--- a/lisp/progmodes/flymake.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/progmodes/flymake.el	Fri Feb 17 09:10:23 2006 +0000
@@ -339,7 +339,7 @@
             nil)))))
 
 (defun flymake-fix-file-name (name)
-  "Replace all occurences of '\' with '/'."
+  "Replace all occurrences of '\' with '/'."
   (when name
     (setq name (expand-file-name name))
     (setq name (abbreviate-file-name name))
--- a/lisp/progmodes/gdb-ui.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/progmodes/gdb-ui.el	Fri Feb 17 09:10:23 2006 +0000
@@ -72,8 +72,16 @@
 
 ;; 1) Strings that are watched don't update in the speedbar when their
 ;; contents change.
-;; 2) Watch expressions go out of scope when the inferior is re-run.
-;; 3) Cannot handle multiple debug sessions.
+;; 2) Cannot handle multiple debug sessions.
+
+;;; Problems with watch expressions:
+
+;; 1) They go out of scope when the inferior is re-run.
+;; 2) -var-update reports that an out of scope variable has changed:
+;;    changelist=[{name="var1",in_scope="false"}], but the value can't be accessed.
+;;    (-var-list-children, in contrast allows you to create variable objects of
+;;      the children when they are out of scope and get their values).
+;; 3) VARNUM increments even when vaiable object is not created (maybe trivial).
 
 ;;; TODO:
 
@@ -97,7 +105,9 @@
 (defvar gdb-selected-frame nil)
 (defvar gdb-frame-number nil)
 (defvar gdb-current-language nil)
-(defvar gdb-var-list nil "List of variables in watch window.")
+(defvar gdb-var-list nil
+ "List of variables in watch window.
+Each element has the form (EXPRESSION VARNUM NUMCHILD TYPE VALUE CHANGED-P).")
 (defvar gdb-var-changed nil "Non-nil means that `gdb-var-list' has changed.")
 (defvar gdb-main-file nil "Source file from which program execution begins.")
 (defvar gdb-overlay-arrow-position nil)
@@ -185,7 +195,6 @@
   "Font lock keywords used in `gdb-local-mode'.")
 
 ;; Variables for GDB 6.4+
-
 (defvar gdb-register-names nil "List of register names.")
 (defvar gdb-changed-registers nil
   "List of changed register numbers (strings).")
@@ -203,9 +212,9 @@
 
 If `gdb-many-windows' is t, regardless of the value of
 `gdb-show-main', the layout below will appear unless
-`gdb-use-inferior-io-buffer' is nil when the source buffer
-occupies the full width of the frame.  Keybindings are given in
-relevant buffer.
+`gdb-use-separate-io-buffer' is nil when the source buffer
+occupies the full width of the frame.  Keybindings are shown in
+some of the buffers.
 
 Watch expressions appear in the speedbar/slowbar.
 
@@ -218,28 +227,28 @@
 detailed description of this mode.
 
 
-+--------------------------------------------------------------+
-|                           GDB Toolbar                        |
-+-------------------------------+------------------------------+
-| GUD buffer (I/O of GDB)       | Locals buffer                |
-|                               |                              |
-|                               |                              |
-|                               |                              |
-+-------------------------------+------------------------------+
-| Source buffer                 | I/O buffer (of inferior)     |
-|                               | (comint-mode)                |
-|                               |                              |
-|                               |                              |
-|                               |                              |
-|                               |                              |
-|                               |                              |
-|                               |                              |
-+-------------------------------+------------------------------+
-| Stack buffer                  | Breakpoints buffer           |
-| RET      gdb-frames-select    | SPC    gdb-toggle-breakpoint |
-|                               | RET    gdb-goto-breakpoint   |
-|                               | d      gdb-delete-breakpoint |
-+-------------------------------+------------------------------+"
++----------------------------------------------------------------------+
+|                               GDB Toolbar                            |
++-----------------------------------+----------------------------------+
+| GUD buffer (I/O of GDB)           | Locals buffer                    |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
++-----------------------------------+----------------------------------+
+| Source buffer                     | I/O buffer (of debugged program) |
+|                                   | (comint-mode)                    |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
++-----------------------------------+----------------------------------+
+| Stack buffer                      | Breakpoints buffer               |
+| RET      gdb-frames-select        | SPC    gdb-toggle-breakpoint     |
+|                                   | RET    gdb-goto-breakpoint       |
+|                                   | D      gdb-delete-breakpoint     |
++-----------------------------------+----------------------------------+"
   ;;
   (interactive (list (gud-query-cmdline 'gdba)))
   ;;
@@ -281,26 +290,26 @@
   :group 'gud
   :version "22.1")
 
-(defcustom gdb-use-inferior-io-buffer nil
+(defcustom gdb-use-separate-io-buffer nil
   "Non-nil means display output from the inferior in a separate buffer."
   :type 'boolean
   :group 'gud
   :version "22.1")
 
-(defun gdb-use-inferior-io-buffer (arg)
+(defun gdb-use-separate-io-buffer (arg)
   "Toggle separate IO for inferior.
 With arg, use separate IO iff arg is positive."
   (interactive "P")
-  (setq gdb-use-inferior-io-buffer
+  (setq gdb-use-separate-io-buffer
 	(if (null arg)
-	    (not gdb-use-inferior-io-buffer)
+	    (not gdb-use-separate-io-buffer)
 	  (> (prefix-numeric-value arg) 0)))
   (message (format "Separate inferior IO %sabled"
-		   (if gdb-use-inferior-io-buffer "en" "dis")))
+		   (if gdb-use-separate-io-buffer "en" "dis")))
   (if (and gud-comint-buffer
 	   (buffer-name gud-comint-buffer))
       (condition-case nil
-	  (if gdb-use-inferior-io-buffer
+	  (if gdb-use-separate-io-buffer
 	      (gdb-restore-windows)
 	    (kill-buffer (gdb-inferior-io-name)))
 	(error nil))))
@@ -462,7 +471,7 @@
 
   (setq gdb-buffer-type 'gdba)
 
-  (if gdb-use-inferior-io-buffer (gdb-clear-inferior-io))
+  (if gdb-use-separate-io-buffer (gdb-clear-inferior-io))
 
   ;; Hack to see test for GDB 6.4+ (-stack-info-frame was implemented in 6.4)
   (setq gdb-version nil)
@@ -664,7 +673,7 @@
 	   'gdb-var-update-handler))
     (push 'gdb-var-update gdb-pending-triggers)))
 
-(defconst gdb-var-update-regexp "name=\"\\(.*?\\)\"")
+(defconst gdb-var-update-regexp "name=\"\\(.*?\\)\",in_scope=\"\\(.*?\\)\"")
 
 (defun gdb-var-update-handler ()
   (goto-char (point-min))
@@ -853,10 +862,10 @@
 	  (gdb-get-target-string)
 	  "*"))
 
-(defun gdb-display-inferior-io-buffer ()
+(defun gdb-display-separate-io-buffer ()
   "Display IO of inferior in a separate window."
   (interactive)
-  (if gdb-use-inferior-io-buffer
+  (if gdb-use-separate-io-buffer
       (gdb-display-buffer
        (gdb-get-create-buffer 'gdb-inferior-io))))
 
@@ -867,21 +876,21 @@
     (menu-bar-lines . nil)
     (minibuffer . nil)))
 
-(defun gdb-frame-inferior-io-buffer ()
+(defun gdb-frame-separate-io-buffer ()
   "Display IO of inferior in a new frame."
   (interactive)
-  (if gdb-use-inferior-io-buffer
+  (if gdb-use-separate-io-buffer
       (let ((special-display-regexps (append special-display-regexps '(".*")))
 	    (special-display-frame-alist gdb-frame-parameters))
 	(display-buffer (gdb-get-create-buffer 'gdb-inferior-io)))))
 
 (defvar gdb-inferior-io-mode-map
   (let ((map (make-sparse-keymap)))
-    (define-key map "\C-c\C-c" 'gdb-inferior-io-interrupt)
-    (define-key map "\C-c\C-z" 'gdb-inferior-io-stop)
-    (define-key map "\C-c\C-\\" 'gdb-inferior-io-quit)
-    (define-key map "\C-c\C-d" 'gdb-inferior-io-eof)
-    (define-key map "\C-d" 'gdb-inferior-io-eof)
+    (define-key map "\C-c\C-c" 'gdb-separate-io-interrupt)
+    (define-key map "\C-c\C-z" 'gdb-separate-io-stop)
+    (define-key map "\C-c\C-\\" 'gdb-separate-io-quit)
+    (define-key map "\C-c\C-d" 'gdb-separate-io-eof)
+    (define-key map "\C-d" 'gdb-separate-io-eof)
     map))
 
 (define-derived-mode gdb-inferior-io-mode comint-mode "Inferior I/O"
@@ -902,25 +911,25 @@
     (process-send-string proc string)
     (process-send-string proc "\n")))
 
-(defun gdb-inferior-io-interrupt ()
+(defun gdb-separate-io-interrupt ()
   "Interrupt the program being debugged."
   (interactive)
   (interrupt-process
    (get-buffer-process gud-comint-buffer) comint-ptyp))
 
-(defun gdb-inferior-io-quit ()
+(defun gdb-separate-io-quit ()
   "Send quit signal to the program being debugged."
   (interactive)
   (quit-process
    (get-buffer-process gud-comint-buffer) comint-ptyp))
 
-(defun gdb-inferior-io-stop ()
+(defun gdb-separate-io-stop ()
   "Stop the program being debugged."
   (interactive)
   (stop-process
    (get-buffer-process gud-comint-buffer) comint-ptyp))
 
-(defun gdb-inferior-io-eof ()
+(defun gdb-separate-io-eof ()
   "Send end-of-file to the program being debugged."
   (interactive)
   (process-send-eof
@@ -1116,7 +1125,7 @@
      ((eq sink 'user)
       (progn
 	(setq gud-running t)
-	(if gdb-use-inferior-io-buffer
+	(if gdb-use-separate-io-buffer
 	    (setq gdb-output-sink 'inferior))))
      (t
       (gdb-resync)
@@ -1126,7 +1135,7 @@
   "An annotation handler for `breakpoint' and other annotations.
 They say that I/O for the subprocess is now GDB, not the program
 being debugged."
-  (if gdb-use-inferior-io-buffer
+  (if gdb-use-separate-io-buffer
       (let ((sink gdb-output-sink))
 	(cond
 	 ((eq sink 'inferior)
@@ -1205,7 +1214,6 @@
       ;; FIXME: with GDB-6 on Darwin, this might very well work.
       ;; Only needed/used with speedbar/watch expressions.
       (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame))
-	(setq gdb-var-changed t)    ; force update
 	(dolist (var gdb-var-list)
 	  (setcar (nthcdr 5 var) nil))
 	(if (string-equal gdb-version "pre-6.4")
@@ -2462,17 +2470,17 @@
 		:visible (memq gud-minor-mode '(gdbmi gdba))))
   (define-key menu [gdb] '("Gdb" . gdb-display-gdb-buffer))
   (define-key menu [threads] '("Threads" . gdb-display-threads-buffer))
+  (define-key menu [inferior]
+    '(menu-item "Inferior IO" gdb-display-separate-io-buffer
+		:enable gdb-use-separate-io-buffer))
   (define-key menu [memory] '("Memory" . gdb-display-memory-buffer))
+  (define-key menu [registers] '("Registers" . gdb-display-registers-buffer))
   (define-key menu [disassembly]
     '("Disassembly" . gdb-display-assembler-buffer))
-  (define-key menu [registers] '("Registers" . gdb-display-registers-buffer))
-  (define-key menu [inferior]
-    '(menu-item "Inferior IO" gdb-display-inferior-io-buffer
-		:enable gdb-use-inferior-io-buffer))
+  (define-key menu [breakpoints]
+    '("Breakpoints" . gdb-display-breakpoints-buffer))
   (define-key menu [locals] '("Locals" . gdb-display-locals-buffer))
-  (define-key menu [frames] '("Stack" . gdb-display-stack-buffer))
-  (define-key menu [breakpoints]
-    '("Breakpoints" . gdb-display-breakpoints-buffer)))
+  (define-key menu [frames] '("Stack" . gdb-display-stack-buffer)))
 
 (let ((menu (make-sparse-keymap "GDB-Frames")))
   (define-key gud-menu-map [frames]
@@ -2481,25 +2489,25 @@
   (define-key menu [gdb] '("Gdb" . gdb-frame-gdb-buffer))
   (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer))
   (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer))
-  (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer))
+  (define-key menu [inferior]
+    '(menu-item "Inferior IO" gdb-frame-separate-io-buffer
+		:enable gdb-use-separate-io-buffer))
   (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer))
-  (define-key menu [inferior]
-    '(menu-item "Inferior IO" gdb-frame-inferior-io-buffer
-		:enable gdb-use-inferior-io-buffer))
+  (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer))
+  (define-key menu [breakpoints]
+    '("Breakpoints" . gdb-frame-breakpoints-buffer))
   (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer))
-  (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer))
-  (define-key menu [breakpoints]
-    '("Breakpoints" . gdb-frame-breakpoints-buffer)))
+  (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer)))
 
 (let ((menu (make-sparse-keymap "GDB-UI/MI")))
   (define-key gud-menu-map [ui]
     `(menu-item (if (eq gud-minor-mode 'gdba) "GDB-UI" "GDB-MI")
 		,menu :visible (memq gud-minor-mode '(gdbmi gdba))))
-  (define-key menu [gdb-use-inferior-io]
-  '(menu-item "Separate inferior IO" gdb-use-inferior-io-buffer
+  (define-key menu [gdb-use-separate-io]
+  '(menu-item "Separate inferior IO" gdb-use-separate-io-buffer
 	      :visible (eq gud-minor-mode 'gdba)
 	      :help "Toggle separate IO for inferior."
-	      :button (:toggle . gdb-use-inferior-io-buffer)))
+	      :button (:toggle . gdb-use-separate-io-buffer)))
   (define-key menu [gdb-many-windows]
   '(menu-item "Display Other Windows" gdb-many-windows
 	      :help "Toggle display of locals, stack and breakpoint information"
@@ -2545,7 +2553,7 @@
        (if gud-last-last-frame
 	   (gud-find-file (car gud-last-last-frame))
 	 (gud-find-file gdb-main-file)))
-  (when gdb-use-inferior-io-buffer
+  (when gdb-use-separate-io-buffer
     (split-window-horizontally)
     (other-window 1)
     (gdb-set-window-buffer
@@ -2957,37 +2965,15 @@
   (if (re-search-forward " source language \\(\\S-*\\)\." nil t)
       (setq gdb-current-language (match-string 1)))
   (gdb-invalidate-assembler))
+
 
-
-;; For debugging Emacs only (assumes that usual stack buffer already exists).
-(defun gdb-xbacktrace ()
-  "Generate a full lisp level backtrace with arguments."
-  (interactive)
-  (let ((frames nil)
-	(frame-number gdb-frame-number))
-    (with-current-buffer (gdb-get-buffer 'gdb-stack-buffer)
-      (save-excursion
-	(goto-char (point-min))
-	(while (search-forward "in Ffuncall " nil t)
-	  (goto-char (line-beginning-position))
-	  (looking-at "^#\\([0-9]+\\)")
-	  (push (match-string-no-properties 1) frames)
-	  (forward-line 1))))
-    (dolist (frame frames)
-      (gdb-enqueue-input (list (concat "server frame " frame "\n")
-			       'ignore))
-;     can't use separate buffer because Emacs gets confused by starting
-;     annotation from debug1_print (with output-sink eq 'emacs)
-;    (gdb-enqueue-input (list "server ppargs\n" 'gdb-get-arguments))
-      (gud-basic-call "server ppargs"))
-    (gdb-enqueue-input (list (concat "server frame " frame-number "\n")
-			     'ignore))))
-
 ;; Code specific to GDB 6.4
 (defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"")
 
 (defun gdb-set-gud-minor-mode-existing-buffers-1 ()
-  "Create list of source files for current GDB session."
+  "Create list of source files for current GDB session.
+If buffers already exist for any of these files, gud-minor-mode
+is set in them."
   (goto-char (point-min))
   (while (re-search-forward gdb-source-file-regexp-1 nil t)
     (push (match-string 1) gdb-source-file-list))
@@ -3051,7 +3037,8 @@
 	  'gdb-var-update-handler-1))
 	(push 'gdb-var-update gdb-pending-triggers))))
 
-(defconst gdb-var-update-regexp-1 "name=\"\\(.*?\\)\",value=\\(\".*?\"\\),")
+(defconst gdb-var-update-regexp-1
+  "name=\"\\(.*?\\)\",\\(?:value=\\(\".*?\"\\),\\)?in_scope=\"\\(.*?\\)\"")
 
 (defun gdb-var-update-handler-1 ()
   (goto-char (point-min))
@@ -3063,7 +3050,10 @@
 	    (if (string-equal varnum (cadr var))
 		(progn
 		  (setcar (nthcdr 5 var) t)
-		  (setcar (nthcdr 4 var) (read (match-string 2)))
+		  (setcar (nthcdr 4 var)
+			  (if (string-equal (match-string 3) "true")
+			      (read (match-string 2))
+			    "*changed*"))
 		  (setcar (nthcdr num gdb-var-list) var)
 		  (throw 'var-found1 nil)))
 	    (setq num (+ num 1))))))
--- a/lisp/progmodes/gud.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/progmodes/gud.el	Fri Feb 17 09:10:23 2006 +0000
@@ -656,8 +656,13 @@
 ;;;###autoload
 (defun gdb (command-line)
   "Run gdb on program FILE in buffer *gud-FILE*.
-The directory containing FILE becomes the initial working directory
-and source-file directory for your debugger."
+The directory containing FILE becomes the initial working
+directory and source-file directory for your debugger.  By
+default this command starts GDB using a graphical interface.  See
+`gdba' for more information.
+
+To run GDB in text command mode, set `gud-gdb-command-name' to
+\"gdb --fullname\" and include the pathname, if necessary."
   (interactive (list (gud-query-cmdline 'gdb)))
 
   (if (and gud-comint-buffer
@@ -3120,7 +3125,7 @@
 (defvar gdb-script-font-lock-keywords
   '(("^define\\s-+\\(\\(\\w\\|\\s_\\)+\\)" (1 font-lock-function-name-face))
     ("\\$\\(\\w+\\)" (1 font-lock-variable-name-face))
-    ("^\\s-*\\([a-z]+\\)" (1 font-lock-keyword-face))))
+    ("^\\s-*\\(\\(\\w\\|\\s_\\)+\\)" (1 font-lock-keyword-face))))
 
 ;; FIXME: The keyword "end" associated with "document"
 ;; should have font-lock-keyword-face (currently font-lock-doc-face).
--- a/lisp/speedbar.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/speedbar.el	Fri Feb 17 09:10:23 2006 +0000
@@ -1019,10 +1019,10 @@
 		    (lambda () (let ((speedbar-update-flag t))
 				 (speedbar-timer-fn)))))
 
-(defmacro speedbar-frame-width ()
+(defsubst speedbar-frame-width ()
   "Return the width of the speedbar frame in characters.
 nil if it doesn't exist."
-  '(window-width (get-buffer-window speedbar-buffer)))
+  (frame-width speedbar-frame))
 
 (defun speedbar-mode ()
   "Major mode for managing a display of directories and tags.
@@ -2123,7 +2123,7 @@
   "A wrapper for `try-completion'.
 Passes STRING and ALIST to `try-completion' if ALIST
 passes some tests."
-  (if (and (listp alist) (not (null alist))
+  (if (and (consp alist)
 	   (listp (car alist)) (stringp (car (car alist))))
       (try-completion string alist)
     nil))
@@ -2423,8 +2423,7 @@
 
   ;; Choose the correct method of doodling.
   (if (and speedbar-mode-specific-contents-flag
-	   (listp speedbar-special-mode-expansion-list)
-	   speedbar-special-mode-expansion-list
+	   (consp speedbar-special-mode-expansion-list)
 	   (local-variable-p
 	    'speedbar-special-mode-expansion-list
 	    (current-buffer)))
@@ -2463,12 +2462,14 @@
 	    )
 	(set-buffer speedbar-buffer)
 	(speedbar-with-writable
-	  (erase-buffer)
-	  (dolist (func funclst)
-	    (setq default-directory cbd)
-	    (funcall func cbd 0))
-	(speedbar-reconfigure-keymaps)
-	(goto-char (point-min)))
+	  (let* ((window (get-buffer-window speedbar-buffer 0))
+		 (p (window-point window)))
+	    (erase-buffer)
+	    (dolist (func funclst)
+	      (setq default-directory cbd)
+	      (funcall func cbd 0))
+	    (speedbar-reconfigure-keymaps)
+	    (set-window-point window p)))
 	))))
 
 (defun speedbar-update-directory-contents ()
@@ -2572,7 +2573,6 @@
 	    ;; We do not erase the buffer because these functions may
 	    ;; decide NOT to update themselves.
 	    (funcall func specialbuff)))
-
       (goto-char (point-min))))
   (speedbar-reconfigure-keymaps))
 
@@ -2614,8 +2614,7 @@
 		(speedbar-maybe-add-localized-support (current-buffer))
 		;; Update for special mode all the time!
 		(if (and speedbar-mode-specific-contents-flag
-			 (listp speedbar-special-mode-expansion-list)
-			 speedbar-special-mode-expansion-list
+			 (consp speedbar-special-mode-expansion-list)
 			 (local-variable-p
 			  'speedbar-special-mode-expansion-list
 			  (current-buffer)))
--- a/lisp/wid-edit.el	Wed Feb 15 00:49:52 2006 +0000
+++ b/lisp/wid-edit.el	Fri Feb 17 09:10:23 2006 +0000
@@ -860,6 +860,7 @@
     (define-key map [(shift tab)] 'advertised-widget-backward)
     (define-key map [backtab] 'widget-backward)
     (define-key map [down-mouse-2] 'widget-button-click)
+    (define-key map [down-mouse-1] 'widget-button-click)
     (define-key map "\C-m" 'widget-button-press)
     map)
   "Keymap containing useful binding for buffers containing widgets.
@@ -915,71 +916,79 @@
   "Invoke the button that the mouse is pointing at."
   (interactive "e")
   (if (widget-event-point event)
-      (let* ((pos (widget-event-point event))
+      (let* ((oevent event)
+	     (mouse-1 (memq (event-basic-type event) '(mouse-1 down-mouse-1)))
+	     (pos (widget-event-point event))
 	     (start (event-start event))
 	     (button (get-char-property
 		      pos 'button (and (windowp (posn-window start))
 				       (window-buffer (posn-window start))))))
-	(if button
-	    ;; Mouse click on a widget button.  Do the following
-	    ;; in a save-excursion so that the click on the button
-	    ;; doesn't change point.
-	    (save-selected-window
-	      (select-window (posn-window (event-start event)))
-	      (save-excursion
-		(goto-char (posn-point (event-start event)))
-		(let* ((overlay (widget-get button :button-overlay))
-		       (face (overlay-get overlay 'face))
-		       (mouse-face (overlay-get overlay 'mouse-face)))
-		  (unwind-protect
-		      ;; Read events, including mouse-movement events
-		      ;; until we receive a release event.  Highlight/
-		      ;; unhighlight the button the mouse was initially
-		      ;; on when we move over it.
-		      (save-excursion
-			(when face	; avoid changing around image
-			  (overlay-put overlay
-				       'face widget-button-pressed-face)
-			  (overlay-put overlay
-				       'mouse-face widget-button-pressed-face))
-			(unless (widget-apply button :mouse-down-action event)
-			  (let ((track-mouse t))
-			    (while (not (widget-button-release-event-p event))
-			      (setq event (read-event)
-				    pos (widget-event-point event))
-			      (if (and pos
-				       (eq (get-char-property pos 'button)
-					   button))
-				  (when face
-				    (overlay-put overlay
-						 'face
-						 widget-button-pressed-face)
-				    (overlay-put overlay
-						 'mouse-face
-						 widget-button-pressed-face))
-				(overlay-put overlay 'face face)
-				(overlay-put overlay 'mouse-face mouse-face)))))
-
-			;; When mouse is released over the button, run
-			;; its action function.
-			(when (and pos
-				   (eq (get-char-property pos 'button) button))
-			  (widget-apply-action button event)))
-		    (overlay-put overlay 'face face)
-		    (overlay-put overlay 'mouse-face mouse-face))))
-
-	      (unless (pos-visible-in-window-p (widget-event-point event))
-		(mouse-set-point event)
-		(beginning-of-line)
-		(recenter))
-	      )
-
+	(when (or (null button)
+		  (catch 'button-press-cancelled
+	      ;; Mouse click on a widget button.  Do the following
+	      ;; in a save-excursion so that the click on the button
+	      ;; doesn't change point.
+	      (save-selected-window
+		(select-window (posn-window (event-start event)))
+		(save-excursion
+		  (goto-char (posn-point (event-start event)))
+		  (let* ((overlay (widget-get button :button-overlay))
+			 (pressed-face (or (widget-get button :pressed-face)
+					   widget-button-pressed-face))
+			 (face (overlay-get overlay 'face))
+			 (mouse-face (overlay-get overlay 'mouse-face)))
+		    (unwind-protect
+			;; Read events, including mouse-movement
+			;; events, waiting for a release event.  If we
+			;; began with a mouse-1 event and receive a
+			;; movement event, that means the user wants
+			;; to perform drag-selection, so cancel the
+			;; button press and do the default mouse-1
+			;; action.  For mouse-2, just highlight/
+			;; unhighlight the button the mouse was
+			;; initially on when we move over it.
+			(save-excursion
+			  (when face	; avoid changing around image
+			    (overlay-put overlay 'face pressed-face)
+			    (overlay-put overlay 'mouse-face pressed-face))
+			  (unless (widget-apply button :mouse-down-action event)
+			    (let ((track-mouse t))
+			      (while (not (widget-button-release-event-p event))
+				(setq event (read-event))
+				(when (and mouse-1 (mouse-movement-p event))
+				  (push event unread-command-events)
+				  (setq event oevent)
+				  (throw 'button-press-cancelled t))
+				(setq pos (widget-event-point event))
+				(if (and pos
+					 (eq (get-char-property pos 'button)
+					     button))
+				    (when face
+				      (overlay-put overlay 'face pressed-face)
+				      (overlay-put overlay 'mouse-face pressed-face))
+				  (overlay-put overlay 'face face)
+				  (overlay-put overlay 'mouse-face mouse-face)))))
+
+			  ;; When mouse is released over the button, run
+			  ;; its action function.
+			  (when (and pos
+				     (eq (get-char-property pos 'button) button))
+			    (widget-apply-action button event)))
+		      (overlay-put overlay 'face face)
+		      (overlay-put overlay 'mouse-face mouse-face))))
+
+		;; This loses if the widget action switches windows. -- cyd
+		;; (unless (pos-visible-in-window-p (widget-event-point event))
+		;;   (mouse-set-point event)
+		;;   (beginning-of-line)
+		;;   (recenter))
+		)
+	      nil))
 	  (let ((up t) command)
 	    ;; Mouse click not on a widget button.  Find the global
 	    ;; command to run, and check whether it is bound to an
 	    ;; up event.
-	    (mouse-set-point event)
-	    (if (memq (event-basic-type event) '(mouse-1 down-mouse-1))
+	    (if mouse-1
 		(cond ((setq command	;down event
 			     (lookup-key widget-global-map [down-mouse-1]))
 		       (setq up nil))
--- a/lispref/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/lispref/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,18 @@
+2006-02-16 Johan Bockg,AC%(Brd <bojohan+mail@dd.chalmers.se> (tiny change)
+
+	* display.texi (Other Display Specs, Image Descriptors): Revert
+	erroneous changes.  The previous description of image-descriptors
+	as `(image . PROPS)' was correct.
+
+2006-02-14  Richard M. Stallman  <rms@gnu.org>
+
+	* variables.texi (File Local Variables): Clarifications.
+
+2006-02-14  Juanma Barranquero  <lekktu@gmail.com>
+
+	* variables.texi (File Local Variables): Use @code for a cons
+	cell, not @var.
+
 2006-02-13  Chong Yidong  <cyd@stupidchicken.com>
 
 	* variables.texi (File Local Variables): Document new file local
--- a/lispref/display.texi	Wed Feb 15 00:49:52 2006 +0000
+++ b/lispref/display.texi	Fri Feb 17 09:10:23 2006 +0000
@@ -3280,7 +3280,7 @@
 Recursive display specifications are not supported---@var{string}'s
 @code{display} properties, if any, are not used.
 
-@item (image @var{image-props})
+@item (image . @var{image-props})
 This kind of display specification is an image descriptor (@pxref{Images}).
 When used as a display specification, it means to display the image
 instead of the text that has the display specification.
@@ -3507,12 +3507,11 @@
 @subsection Image Descriptors
 @cindex image descriptor
 
-  An image description is a list of the form @code{(image
-@var{props})}, where @var{props} is a property list containing
-alternating keyword symbols (symbols whose names start with a colon) and
-their values.  You can use any Lisp object as a property, but the only
-properties that have any special meaning are certain symbols, all of
-them keywords.
+  An image description is a list of the form @code{(image . @var{props})},
+where @var{props} is a property list containing alternating keyword
+symbols (symbols whose names start with a colon) and their values.
+You can use any Lisp object as a property, but the only properties
+that have any special meaning are certain symbols, all of them keywords.
 
   Every image descriptor must contain the property @code{:type
 @var{type}} to specify the format of the image.  The value of @var{type}
--- a/lispref/variables.texi	Wed Feb 15 00:49:52 2006 +0000
+++ b/lispref/variables.texi	Fri Feb 17 09:10:23 2006 +0000
@@ -1777,30 +1777,26 @@
 measures to prevent this.
 
 @cindex safe local variable
-  When Emacs encounters a file local variable whose safety is not
-guaranteed, it asks the user whether or not to obey the file variable
-specifications.  If the user says no, Emacs ignores @emph{all} the
-file variables specified in that file.  A variable can be marked as
-@dfn{safe} by setting its @code{safe-local-variable} property.  If the
-property is @code{t}, that variable is always considered safe,
-regardless of the value assigned to it.  The
-@code{safe-local-variable} property can also be a a function taking
-exactly one argument.  In that case, Emacs considers it safe to give
-the variable a certain value if the function returns non-@code{nil}
-when called with that value as argument.  Many commonly-encountered
-file variables possess @code{safe-local-variable} by default,
-including @code{fill-column}, @code{fill-prefix}, and
-@code{indent-tabs-mode}.
+  You can specify safe values for a variable with a
+@code{safe-local-variable} property.  If the property is @code{t},
+setting that variable in a file is always considered safe, regardless
+of the value used.  If the property is a function of one argument,
+then any value is safe if the function returns non-@code{nil} given
+that value.  Many commonly encountered file variables standardly have
+@code{safe-local-variable} properties, including @code{fill-column},
+@code{fill-prefix}, and @code{indent-tabs-mode}.
 
 @defopt safe-local-variable-values
-This variable provides another way to mark variables as safe.  It is a
-list of cons cells @var{(var . val)}, where @var{var} is a variable
-name and @var{val} is a value of that variable that is safe.
+This variable provides another way to mark some variable values as
+safe.  It is a list of cons cells @code{(@var{var} . @var{val})},
+where @var{var} is a variable name and @var{val} is a value which is
+safe for that variable.
 
-When Emacs asks the user whether or not to obey a set of file variable
-specifications, the user can choose to mark them as safe.  This adds
-those variable-value pairs to @code{safe-local-variable-values}, and
-saves it to the user's custom file.
+When Emacs asks the user whether or not to obey a set of file local
+variable specifications, the user can choose to mark them as safe.
+Doing so adds those variable/value pairs to
+@code{safe-local-variable-values}, and saves it to the user's custom
+file.
 @end defopt
 
 @defun safe-local-variable-p sym val
@@ -1809,8 +1805,8 @@
 @end defun
 
 @cindex risky local variable
-Some variables are considered @dfn{risky}.  A variable whose name ends
-in any of @samp{-command}, @samp{-frame-alist}, @samp{-function},
+  Some variables are considered @dfn{risky}.  A variable whose name
+ends in any of @samp{-command}, @samp{-frame-alist}, @samp{-function},
 @samp{-functions}, @samp{-hook}, @samp{-hooks}, @samp{-form},
 @samp{-forms}, @samp{-map}, @samp{-map-alist}, @samp{-mode-alist},
 @samp{-program}, or @samp{-predicate} is considered risky.  The
@@ -1825,11 +1821,11 @@
 based on the above criteria.
 @end defun
 
-If a variable is risky, it will not be entered automatically into
+  If a variable is risky, it will not be entered automatically into
 @code{safe-local-variable-values} as described above.  Therefore,
 Emacs will always query before setting a risky variable, unless the
-user explicitly allows it by editing @code{safe-local-variable-values}
-via Customize.
+user explicitly allows the setting by customizing
+@code{safe-local-variable-values} directly.
 
 @defvar ignored-local-variables
 This variable holds a list of variables that should not be given local
--- a/man/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/man/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,28 @@
+2006-02-15  Francesco Potort,Al(B  <pot@gnu.org>
+
+	* maintaining.texi (Create Tags Table): Explain why the
+	exception when etags writes to files under the /dev tree.
+
+2006-02-14  Richard M. Stallman  <rms@gnu.org>
+
+	* custom.texi (Safe File Variables): Lots of clarification.
+	Renamed from Unsafe File Variables.
+
+2006-02-14  Chong Yidong  <cyd@stupidchicken.com>
+
+	* custom.texi (Unsafe File Variables): File variable confirmation
+	assumed denied in batch mode.
+
+2006-02-14  Richard M. Stallman  <rms@gnu.org>
+
+	* building.texi (GDB User Interface Layout): Don't say `inferior'
+	for program being debugged.
+
+2006-02-15  Nick Roberts  <nickrob@snap.net.nz>
+
+	* building.texi (GDB Graphical Interface): Replace
+	gdb-use-inferior-io-buffer with gdb-use-separate-io-buffer.
+
 2006-02-13  Chong Yidong  <cyd@stupidchicken.com>
 
 	* custom.texi (Specifying File Variables, Unsafe File Variables):
--- a/man/building.texi	Wed Feb 15 00:49:52 2006 +0000
+++ b/man/building.texi	Fri Feb 17 09:10:23 2006 +0000
@@ -828,20 +828,20 @@
 @example
 +--------------------------------+--------------------------------+
 |                                |                                |
-|  GUD buffer (I/O of GDB)       |     Locals buffer              |
+|   GUD buffer (I/O of GDB)      |   Locals buffer                |
 |                                |                                |
 |--------------------------------+--------------------------------+
 |                                |                                |
-|  Source buffer                 |     I/O buffer (of inferior)   |
+|   Source buffer                |   I/O buffer for debugged pgm  |
 |                                |                                |
 |--------------------------------+--------------------------------+
 |                                |                                |
-|  Stack buffer                  |     Breakpoints buffer         |
+|   Stack buffer                 |   Breakpoints buffer           |
 |                                |                                |
 +--------------------------------+--------------------------------+
 @end example
 
-  However, if @code{gdb-use-inferior-io-buffer} is @code{nil}, the I/O
+  However, if @code{gdb-use-separate-io-buffer} is @code{nil}, the I/O
 buffer does not appear and the source buffer occupies the full width
 of the frame.
 
@@ -972,12 +972,12 @@
 
 @table @asis
 @item Input/Output Buffer
-@vindex gdb-use-inferior-io-buffer
-If the variable @code{gdb-use-inferior-io-buffer} is non-@code{nil},
+@vindex gdb-use-separate-io-buffer
+If the variable @code{gdb-use-separate-io-buffer} is non-@code{nil},
 the executable program that is being debugged takes its input and
 displays its output here.  Otherwise it uses the GUD buffer for that.
 To toggle whether GUD mode uses this buffer, do @kbd{M-x
-gdb-use-inferior-io-buffer}.  That takes effect when you next
+gdb-use-separate-io-buffer}.  That takes effect when you next
 restart the program you are debugging.
 
 The history and replay commands from Shell mode are available here,
--- a/man/custom.texi	Wed Feb 15 00:49:52 2006 +0000
+++ b/man/custom.texi	Fri Feb 17 09:10:23 2006 +0000
@@ -1045,14 +1045,13 @@
 
 @menu
 * Specifying File Variables:: Specifying file local variables.
-* Unsafe File Variables::     Handling local variables that may not
-                              be safe.
+* Safe File Variables::       Making sure file local variables are safe.
 @end menu
 
 @node Specifying File Variables
 @subsubsection Specifying File Variables
 
-  There are two ways to specify local variable values: in the first
+  There are two ways to specify file local variable values: in the first
 line, or with a local variables list.  Here's how to specify them in the
 first line:
 
@@ -1098,7 +1097,7 @@
 in the @samp{-*-} line first, and @emph{everything} in the local
 variables list afterward.
 
-Here is an example of a local variables list:
+  Here is an example of a local variables list:
 
 @example
 ;;; Local Variables: ***
@@ -1179,49 +1178,52 @@
 major mode of a buffer according to the file name and contents,
 including the local variables list if any.  @xref{Choosing Modes}.
 
-@node Unsafe File Variables
-@subsubsection Unsafe File Variables
-
-  File variables create a certain amount of risk; when you visit
-someone else's file, its variables could affect your Emacs in
-arbitrary ways.  A special risk is posed by the @code{eval}
-``variable,'' which can potentially execute arbitrary code, and
-certain actual variables such as @code{load-path}.
-
-  Therefore, whenever Emacs encounters file variables that are not
-known to be safe, it displays the entire list of variables defined in
-that file, and asks you for confirmation before setting them.  You can
-type @samp{y} or @samp{SPC} to apply the local variables list, or
-@samp{n} to ignore it.
-
-  There is a set of file variables and values that are known to be
-safe.  For instance, it is safe to give @code{comment-column} or
+@node Safe File Variables
+@subsubsection Safety of File Variables
+
+  File-local variables can be dangerous; when you visit someone else's
+file, there's no telling what its local variables list could do to
+your Emacs.  Improper values of the @code{eval} ``variable,'' and
+other variables such as @code{load-path}, could execute Lisp code you
+didn't intend to run.
+
+  Therefore, whenever Emacs encounters file local variable values that
+are not known to be safe, it displays the file's entire local
+variables list, and asks you for confirmation before setting them.
+You can type @kbd{y} or @key{SPC} to put the local variables list into
+effect, or @kbd{n} to ignore it.  When Emacs is run in batch mode
+(@pxref{Initial Options}), it can't really ask you, so it assumes the
+answer @samp{n}.
+
+  Emacs normally recognizes certain variables/value pairs as safe.
+For instance, it is safe to give @code{comment-column} or
 @code{fill-column} any integer value.  If a file specifies only safe
-variable-value pairs, Emacs will not ask for confirmation before
-setting them.  You can also tell Emacs that a set of variable-value
-pairs is safe, by entering @samp{!} at the file variables confirmation
-prompt.  In that case, Emacs will not ask for confirmation if it
-encounters these variable-value pairs in the future.  You can directly
-edit the list of safe variable-value pairs by customizing
-@samp{safe-local-variable-values} (@pxref{Easy Customization}).
-
+variable/value pairs, Emacs does not ask for confirmation before
+setting them.  Otherwise, you can tell Emacs to record that all the
+variable/value pairs in the file are safe, by typing @kbd{!} at the
+confirmation prompt.  When Emacs encounters these variable/value pairs
+subsequently, in the same file or others, it will assume they are
+safe.
+
+@vindex safe-local-variable-values
+@cindex risky variable
   Some variables, such as @code{load-path}, are considered
-@dfn{risky}: there is seldom any reason to specify them as file
-variables, and changing them can be dangerous.  Even if you enter
-@samp{!} at the confirmation prompt, Emacs will not save these values
-for the future.  Therefore, you will be prompted each time the
-variable is encountered.  If you really want to allow such a variable,
-you can avoid the prompt by editing @samp{safe-local-variable-values}.
-
-@findex enable-local-variables
+particularly @dfn{risky}: there is seldom any reason to specify them
+as local variables, and changing them can be dangerous.  Even if you
+enter @kbd{!} at the confirmation prompt, Emacs will not record any
+values as safe for these variables.  If you really want to record safe
+values for these variables, do it directly by customizing
+@samp{safe-local-variable-values} (@pxref{Easy Customization}).
+
+@vindex enable-local-variables
   The variable @code{enable-local-variables} allows you to change the
 way Emacs processes local variables.  Its default value is @code{t},
-which means the behavior described above.  If you set the value to
-@code{nil}, Emacs simply ignores local variables in files.  Any other
-value says to query you about each file that has local variables, even
-if the variables are known to be safe.
-
-@findex enable-local-eval
+which specifies the behavior described above.  If it is @code{nil},
+Emacs simply ignores all file local variables.  Any other value says
+to query you about each file that has local variables, without trying
+to determine whether the values are known to be safe.
+
+@vindex enable-local-eval
   The variable @code{enable-local-eval} controls whether Emacs
 processes @code{eval} variables.  The three possibilities for the
 variable's value are @code{t}, @code{nil}, and anything else, just as
@@ -1229,7 +1231,7 @@
 is neither @code{t} nor @code{nil}, so normally Emacs does ask for
 confirmation about processes @code{eval} variables.
 
-@findex safe-local-eval-forms
+@vindex safe-local-eval-forms
   The @code{safe-local-eval-forms} is a customizable list of eval
 forms which are safe to eval, so Emacs should not ask for
 confirmation to evaluate these forms.
--- a/man/maintaining.texi	Wed Feb 15 00:49:52 2006 +0000
+++ b/man/maintaining.texi	Fri Feb 17 09:10:23 2006 +0000
@@ -404,7 +404,8 @@
 move an entire directory tree containing both the tags file and the
 source files, and the tags file will still refer correctly to the source
 files.  If the tags file is in @file{/dev}, however, the file names are
-made relative to the current working directory.
+made relative to the current working directory.  This is useful, for
+example, when writing the tags to @file{/dev/stdout}.
 
   If you specify absolute file names as arguments to @code{etags}, then
 the tags file will contain absolute file names.  This way, the tags file
--- a/src/ChangeLog	Wed Feb 15 00:49:52 2006 +0000
+++ b/src/ChangeLog	Fri Feb 17 09:10:23 2006 +0000
@@ -1,3 +1,37 @@
+2006-02-15  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+	* frame.c (x_get_arg): Clear out PARAM in ALIST also on Mac.
+
+	* macfns.c (x_set_menu_bar_lines): Menu bar is always shown on Mac.
+
+	* macmenu.c (set_frame_menubar): Don't call DrawMenuBar.
+
+2006-02-14  Richard M. Stallman  <rms@gnu.org>
+
+	* frame.c (x_get_arg): Clear out all occurrences of PARAM in ALIST.
+
+	* m/ibms390x.h: New file.
+
+2006-02-14  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* gtkutil.c (xg_tool_bar_detach_callback): Set show-arrow to the
+	value of x-gtk-whole-detached-tool-bar.
+	(xg_tool_bar_attach_callback): Set show-arrow to TRUE.
+
+	* xfns.c (syms_of_xfns): New variable: x-gtk-whole-detached-tool-bar.
+
+2006-02-14  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* xterm.c (x_x_to_emacs_modifiers): Make non-static.
+
+	* xterm.h: Declare x_x_to_emacs_modifiers.
+
+	* gtkutil.c (xg_tool_bar_button_cb): New function.
+	(xg_tool_bar_callback): Call x_x_to_emacs_modifiers to
+	store modifiers in event.
+	(update_frame_tool_bar): Connect button-release-event to
+	xg_tool_bar_button_cb.
+
 2006-02-13  Richard M. Stallman  <rms@gnu.org>
 
 	* .gdbinit (xwindow): Update the code to show the window box.
--- a/src/frame.c	Wed Feb 15 00:49:52 2006 +0000
+++ b/src/frame.c	Fri Feb 17 09:10:23 2006 +0000
@@ -3524,9 +3524,15 @@
     {
       /* If we find this parm in ALIST, clear it out
 	 so that it won't be "left over" at the end.  */
-#ifdef HAVE_X_WINDOWS /* macfns.c and w32fns.c have not yet
-			 been changed to cope with this.  */
+#ifndef WINDOWSNT /* w32fns.c has not yet been changed to cope with this.  */
+      Lisp_Object tail;
       XSETCAR (tem, Qnil);
+      /* In case the parameter appears more than once in the alist,
+	 clear it out.  */
+      for (tail = alist; CONSP (tail); tail = XCDR (tail))
+	if (CONSP (XCAR (tail))
+	    && EQ (XCAR (XCAR (tail)), param))
+	  XSETCAR (XCAR (tail), Qnil);
 #endif
     }
   else
--- a/src/gtkutil.c	Wed Feb 15 00:49:52 2006 +0000
+++ b/src/gtkutil.c	Fri Feb 17 09:10:23 2006 +0000
@@ -3242,11 +3242,28 @@
    the GtkImage with a new image.  */
 #define XG_TOOL_BAR_IMAGE_DATA "emacs-tool-bar-image"
 
+/* The key for storing the latest modifiers so the activate callback can
+   get them.  */
+#define XG_TOOL_BAR_LAST_MODIFIER "emacs-tool-bar-modifier"
+
+
 /* Callback function invoked when a tool bar item is pressed.
    W is the button widget in the tool bar that got pressed,
    CLIENT_DATA is an integer that is the index of the button in the
    tool bar.  0 is the first button.  */
 
+static gboolean
+xg_tool_bar_button_cb (widget, event, user_data)
+    GtkWidget      *widget;
+    GdkEventButton *event;
+    gpointer        user_data;
+{
+  g_object_set_data (G_OBJECT (user_data), XG_TOOL_BAR_LAST_MODIFIER,
+                     (gpointer) event->state);
+  return FALSE;
+}
+
+
 static void
 xg_tool_bar_callback (w, client_data)
      GtkWidget *w;
@@ -3254,6 +3271,8 @@
 {
   /* The EMACS_INT cast avoids a warning. */
   int idx = (int) (EMACS_INT) client_data;
+  int mod = (int) g_object_get_data (G_OBJECT (w), XG_TOOL_BAR_LAST_MODIFIER);
+
   FRAME_PTR f = (FRAME_PTR) g_object_get_data (G_OBJECT (w), XG_FRAME_DATA);
   Lisp_Object key, frame;
   struct input_event event;
@@ -3274,7 +3293,10 @@
   event.kind = TOOL_BAR_EVENT;
   event.frame_or_window = frame;
   event.arg = key;
-  event.modifiers = 0;  /* These are not available.  */
+  /* Convert between the modifier bits GDK uses and the modifier bits
+     Emacs uses.  This assumes GDK an X masks are the same, which they are when
+     this is written.  */
+  event.modifiers = x_x_to_emacs_modifiers (FRAME_X_DISPLAY_INFO (f), mod);
   kbd_buffer_store_event (&event);
 }
 
@@ -3292,6 +3314,10 @@
      gpointer client_data;
 {
   FRAME_PTR f = (FRAME_PTR) client_data;
+  extern int x_gtk_whole_detached_tool_bar;
+
+  g_object_set (G_OBJECT (w), "show-arrow", !x_gtk_whole_detached_tool_bar,
+		NULL);
 
   if (f)
     {
@@ -3322,6 +3348,7 @@
      gpointer client_data;
 {
   FRAME_PTR f = (FRAME_PTR) client_data;
+  g_object_set (G_OBJECT (w), "show-arrow", TRUE, NULL);
 
   if (f)
     {
@@ -3629,6 +3656,13 @@
           while (! GTK_IS_BUTTON (w))
             w = gtk_widget_get_parent (w);
 
+          /* Callback to save modifyer mask (Shift/Control, etc).  GTK makes
+             no distinction based on modifiers in the activate callback,
+             so we have to do it ourselves.  */
+          g_signal_connect (w, "button-release-event",
+                            GTK_SIGNAL_FUNC (xg_tool_bar_button_cb),
+                            ti);
+
           g_object_set_data (G_OBJECT (w), XG_FRAME_DATA, (gpointer)f);
 
           /* Use enter/leave notify to show help.  We use the events
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/m/ibms390x.h	Fri Feb 17 09:10:23 2006 +0000
@@ -0,0 +1,163 @@
+/* machine description file for IBM S390 in 64-bit mode
+   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
+
+/* This file was made by copying the significant parts of amdx86-64.h
+   into ibms390.h.  */
+
+
+/* The following line tells the configuration script what sort of 
+   operating system this machine is likely to run.
+   USUAL-OPSYS="<name of system .h file here, without the s- or .h>"
+
+NOTE-START
+IBM s390 64 bits (-machine=ibms390x64)
+
+  The possibilities for -opsystem are: gnu-linux.
+
+NOTE-END */
+
+#define BITS_PER_LONG 64
+#define BITS_PER_EMACS_INT 64
+
+/* Define WORDS_BIG_ENDIAN iff lowest-numbered byte in a word
+   is the most significant byte.  */
+
+#define WORDS_BIG_ENDIAN
+
+/* Define NO_ARG_ARRAY if you cannot take the address of the first of a
+ * group of arguments and treat it as an array of the arguments.  */
+
+#define NO_ARG_ARRAY
+
+/* Define WORD_MACHINE if addresses and such have
+ * to be corrected before they can be used as byte counts.  */
+
+#define WORD_MACHINE
+
+/* Now define a symbol for the cpu type, if your compiler
+   does not define it automatically:
+   Ones defined so far include vax, m68000, ns16000, pyramid,
+   orion, tahoe, APOLLO and many others */
+
+/* Use type int rather than a union, to represent Lisp_Object */
+/* This is desirable for most machines.  */
+
+#define NO_UNION_TYPE
+
+/* Define the type to use.  */
+#define EMACS_INT long
+#define EMACS_UINT unsigned long
+#define SPECIAL_EMACS_INT
+
+/* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend
+   the 24-bit bit field into an int.  In other words, if bit fields
+   are always unsigned.
+
+   If you use NO_UNION_TYPE, this flag does not matter.  */
+
+#undef EXPLICIT_SIGN_EXTEND
+
+/* Data type of load average, as read out of kmem.  */
+
+#define LOAD_AVE_TYPE long
+
+/* Convert that into an integer that is 100 for a load average of 1.0  */
+
+#define LOAD_AVE_CVT(x) (int) (((double) (x)) * 100.0 / FSCALE)
+
+/* Define CANNOT_DUMP on machines where unexec does not work.
+   Then the function dump-emacs will not be defined
+   and temacs will do (load "loadup") automatically unless told otherwise.  */
+
+#undef CANNOT_DUMP
+
+/* Define VIRT_ADDR_VARIES if the virtual addresses of
+   pure and impure space as loaded can vary, and even their
+   relative order cannot be relied on.
+
+   Otherwise Emacs assumes that text space precedes data space,
+   numerically.  */
+
+#define VIRT_ADDR_VARIES
+
+/* Define C_ALLOCA if this machine does not support a true alloca
+   and the one written in C should be used instead.
+   Define HAVE_ALLOCA to say that the system provides a properly
+   working alloca function and it should be used.
+   Define neither one if an assembler-language alloca
+   in the file alloca.s should be used.  */
+
+#undef C_ALLOCA
+#define HAVE_ALLOCA
+
+/* Define NO_REMAP if memory segmentation makes it not work well
+   to change the boundary between the text section and data section
+   when Emacs is dumped.  If you define this, the preloaded Lisp
+   code will not be sharable; but that's better than failing completely.  */
+
+#undef NO_REMAP
+
+/* Some really obscure 4.2-based systems (like Sequent DYNIX)
+ * do not support asynchronous I/O (using SIGIO) on sockets,
+ * even though it works fine on tty's.  If you have one of
+ * these systems, define the following, and then use it in
+ * config.h (or elsewhere) to decide when (not) to use SIGIO.
+ *
+ * You'd think this would go in an operating-system description file,
+ * but since it only occurs on some, but not all, BSD systems, the
+ * reasonable place to select for it is in the machine description
+ * file.
+ */
+
+#undef NO_SOCK_SIGIO
+
+
+/* After adding support for a new system, modify the large case
+   statement in the `configure' script to recognize reasonable
+   configuration names, and add a description of the system to
+   `etc/MACHINES'.
+
+   If you've just fixed a problem in an existing configuration file,
+   you should also check `etc/MACHINES' to make sure its descriptions
+   of known problems in that configuration should be updated.  */
+
+#define PNTR_COMPARISON_TYPE unsigned long
+
+/* On the 64 bit architecture, we can use 60 bits for addresses */
+
+#define VALBITS         60
+
+/* This definition of MARKBIT is necessary because of the comparison of
+   ARRAY_MARK_FLAG and MARKBIT in an #if in lisp.h, which cpp doesn't like. */
+
+#define MARKBIT         0x8000000000000000L
+
+#define LINKER $(CC) -nostdlib
+
+/* Define XINT and XUINT so that they can take arguments of type int */
+#define XINT(a)  (((long) (a) << (BITS_PER_LONG - VALBITS)) >> (BITS_PER_LONG - VALBITS))
+#define XUINT(a) ((long) (a) & VALMASK)
+
+/* Define XPNTR to avoid or'ing with DATA_SEG_BITS */
+
+#define XPNTR(a) XUINT (a)
+
+/* arch-tag: 4b87653c-6add-4663-8691-7d9dc17b5519
+   (do not change this comment) */
--- a/src/macfns.c	Wed Feb 15 00:49:52 2006 +0000
+++ b/src/macfns.c	Fri Feb 17 09:10:23 2006 +0000
@@ -1647,36 +1647,15 @@
      struct frame *f;
      Lisp_Object value, oldval;
 {
-  int nlines;
-  int olines = FRAME_MENU_BAR_LINES (f);
-
-  /* Right now, menu bars don't work properly in minibuf-only frames;
-     most of the commands try to apply themselves to the minibuffer
-     frame itself, and get an error because you can't switch buffers
-     in or split the minibuffer window.  */
-  if (FRAME_MINIBUF_ONLY_P (f))
-    return;
-
-  if (INTEGERP (value))
-    nlines = XINT (value);
-  else
-    nlines = 0;
+  /* Make sure we redisplay all windows in this frame.  */
+  windows_or_buffers_changed++;
 
   FRAME_MENU_BAR_LINES (f) = 0;
-  if (nlines)
-    FRAME_EXTERNAL_MENU_BAR (f) = 1;
-  else
-    {
-      if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
-	free_frame_menubar (f);
-      FRAME_EXTERNAL_MENU_BAR (f) = 0;
-
-      /* Adjust the frame size so that the client (text) dimensions
-	 remain the same.  This depends on FRAME_EXTERNAL_MENU_BAR being
-	 set correctly.  */
-      x_set_window_size (f, 0, FRAME_COLS (f), FRAME_LINES (f));
-      do_pending_window_change (0);
-    }
+  /* The menu bar is always shown.  */
+  FRAME_EXTERNAL_MENU_BAR (f) = 1;
+  if (FRAME_MAC_P (f) && f->output_data.mac->menubar_widget == 0)
+    /* Make sure next redisplay shows the menu bar.  */
+    XWINDOW (FRAME_SELECTED_WINDOW (f))->update_mode_line = Qt;
   adjust_glyphs (f);
 }
 
--- a/src/macmenu.c	Wed Feb 15 00:49:52 2006 +0000
+++ b/src/macmenu.c	Fri Feb 17 09:10:23 2006 +0000
@@ -1701,8 +1701,6 @@
 
   fill_menubar (first_wv->contents);
 
-  DrawMenuBar ();
-
   /* Add event handler so we can detect C-g. */
   install_menu_quit_handler (NULL);
   free_menubar_widget_value_tree (first_wv);
--- a/src/xfns.c	Wed Feb 15 00:49:52 2006 +0000
+++ b/src/xfns.c	Fri Feb 17 09:10:23 2006 +0000
@@ -159,6 +159,10 @@
 
 int x_gtk_show_hidden_files;
 
+/* If non-zero, don't collapse to tool bar when it is detached.  */
+
+int x_gtk_whole_detached_tool_bar;
+
 /* The background and shape of the mouse pointer, and shape when not
    over text or in the modeline.  */
 
@@ -5790,6 +5794,12 @@
 chooser to show or not show hidden files on a case by case basis.  */);
   x_gtk_show_hidden_files = 0;
 
+  DEFVAR_BOOL ("x-gtk-whole-detached-tool-bar", &x_gtk_whole_detached_tool_bar,
+    doc: /* *If non-nil, a detached tool bar is shown in full.
+The default is to just show an arrow and pressing on that arrow shows
+the tool bar buttons.  */);
+  x_gtk_whole_detached_tool_bar = 0;
+
   Fprovide (intern ("x"), Qnil);
 
 #ifdef USE_X_TOOLKIT
--- a/src/xterm.c	Wed Feb 15 00:49:52 2006 +0000
+++ b/src/xterm.c	Fri Feb 17 09:10:23 2006 +0000
@@ -323,8 +323,7 @@
 static const XColor *x_color_cells P_ ((Display *, int *));
 static void x_update_window_end P_ ((struct window *, int, int));
 void x_delete_display P_ ((struct x_display_info *));
-static unsigned int x_x_to_emacs_modifiers P_ ((struct x_display_info *,
-						unsigned));
+
 static int x_io_error_quitter P_ ((Display *));
 int x_catch_errors P_ ((Display *));
 void x_uncatch_errors P_ ((Display *, int));
@@ -3470,7 +3469,7 @@
 /* Convert between the modifier bits X uses and the modifier bits
    Emacs uses.  */
 
-static unsigned int
+unsigned int
 x_x_to_emacs_modifiers (dpyinfo, state)
      struct x_display_info *dpyinfo;
      unsigned int state;
--- a/src/xterm.h	Wed Feb 15 00:49:52 2006 +0000
+++ b/src/xterm.h	Fri Feb 17 09:10:23 2006 +0000
@@ -1006,6 +1006,8 @@
 extern void set_vertical_scroll_bar P_ ((struct window *));
 
 extern int x_dispatch_event P_ ((XEvent *, Display *));
+extern unsigned int x_x_to_emacs_modifiers P_ ((struct x_display_info *,
+						unsigned));
 
 /* Defined in xselect.c */