+** XEmacs can now play sound using Enlightenment Sound Daemon (ESD).
+It will try NAS first, then ESD, then playing native sound directly.
+
+** X-Face support is now available under MS-Windows.
+If an X-Face libary built under MS-Windows is available then XEmacs
+will use this at build time.
+
+** The font-menu is now available under MS-Windows.
+
+** MS-Windows support for selection is now much more robust.
+
+Generally selection should now do what you would expect under
+MS-Windows: the middle mouse button will paste your current selection
+or the clipboard; conversions from different types of selection to the
+clipboard can be made; the kill-ring and friends will be updated as
+per X.
+
+The only thing selection doesn't do is set the clipboard automatically
+as this would break the MS-Windows model. If you want this behavior
+then set `selection-sets-clipboard' to t.
+
+** Mail spool locking now works correctly.
+XEmacs has always come with a little auxiliary program, movemail,
+which moves mail out of the system's spool area into user storage. To
+coordinate between XEmacs, the mail delivery agent, and other mail
+user agents, movemail needs to properly lock the spool file before
+moving it. Movemail now correctly respects the --mail-locking option
+to configure. Moreover, movemail's locking behavior can be specified
+at run-time, via a new command-line option -m to movemail, or through
+the environment variable EMACSLOCKMETHOD.
+
+When installing XEmacs, make sure you configure it according to your
+environment's mail spool locking conventions. When you're using a
+binary kit, set the `mail-lock-method' variable at startup, or the
+EMACSLOCKMETHOD environment variable.
+
+** Init file will move to ~/.xemacs/init.el.
+
+If `~/.xemacs/init.el' exists, XEmacs will prefer it over `~/.emacs'
+as an init file. The file may be byte-compiled as
+`~/.xemacs/init.elc'.
+
+Future versions of XEmacs will stop supporting `~/.emacs' as an init
+file. XEmacs offers automatic migration upon startup.
+
+** Custom file will move to ~/.xemacs/custom.el.
+
+Whereas customize settings were formerly stored in the regular init
+file, XEmacs now prefers them to be in a separate file
+`~/.xemacs/custom.el', completely under automatic control. This
+change goes with the migration of the init file, and XEmacs offers
+automatic migration upon startup.
+
+** Init file may be called .emacs.el.
+
+For the time being, like in GNU Emacs 20.4 and on, you can now name
+the XEmacs init file `.emacs.el'. Formerly the name had to be
+`.emacs'. If you use the name `.emacs.el', you can byte-compile the
+file in the usual way.
+
+If both `.emacs' and `.emacs.el' exist, the latter file is the one
+that is used.
+
+** New command-line switches -user-init-file and -user-init-directory.
+These can be used to specify alternate locations for what is normally
+~/.emacs and ~/.xemacs.
+
+Moreover, -user <user> (which used to only work in unpredictable ways)
+is now equivalent to -user-init-file ~<user>/.xemacs/init.el
+-user-init-directory ~<user>/.xemacs. or -user-init-file
+~<user>/.emacs -user-init-directory ~<user>/.xemacs, whichever init
+file comes first.
+
+** New variable `mswindows-meta-activates-menu'.
+If you set this variable to nil then pressing and releasing the Alt
+key under MS-Windows will no longer activate the menubar. The default
+is t. This is not to be confused with `menu-accelerator-enabled',
+which enables the use of Alt+<Letter> accelerators to invoke the
+menus.
+
+** Pixel-based scrolling has been implemented.
+By default this will attempt to scroll in increments equal to the
+height of the default face. Set `window-pixel-scroll-increment' to
+modify this behavior.
+
+** Operation progress can be displayed using graphical widgets.
+See `progress-feedback' for details. This support has been switched
+on by default for font-lock and some web browsing functions. If you
+do not like this behavior set `progress-feedback-use-echo-area'.
+
+** The PostgreSQL Relational Database Management System is now supported.
+It is now possible to build XEmacs so that the programming interface
+to the PostgreSQL RDBMS (libpq) is available in XEmacs Lisp.
+Supported versions of PostgreSQL are 6.5.3 (earlier versions may work,
+but have not been tested) and 7.0-beta1.
+
+** Etags changes.
+
+*** In DOS, etags looks for file.cgz if it cannot find file.c.
+
+*** New option --ignore-case-regex is an alternative to --regex. It is now
+possible to bind a regexp to a language, by prepending the regexp with
+{lang}, where lang is one of the languages that `etags --help' prints
+out. This feature is useful especially for regex files, where each
+line contains a regular expression. The manual contains details.
+
+*** In C and derived languages, etags creates tags for function
+declarations when given the --declarations option.
+
+*** In C++, tags are created for "operator". The tags have the form
+"operator+", without spaces between the keyword and the operator.
+
+*** New language Ada: tags are functions, procedures, packages, tasks, and
+types.
+
+*** In Fortran, procedure is no more tagged.
+
+*** In Java, tags are created for "interface".
+
+*** In Lisp, "(defstruct (foo", "(defun (operator" and similar constructs
+are now tagged.
+
+*** In Perl, the --globals option tags global variables. my and local
+variables are tagged.
+
+*** New language Python: def and class at the beginning of a line are tags.
+
+*** .ss files are Scheme files, .pdb is Postscript with C syntax, .psw is
+for PSWrap.
+
+\f
+* Lisp and internal changes in XEmacs 21.2
+==========================================
+
+** A new portable dumper is available for beta testing.
+
+Olivier Galibert has written a portable dumper for XEmacs, based on
+initial work by Kyle Jones. Normally, XEmacs C sources link into an
+executable called `temacs', which loads the Lisp code and "unexecs"
+into a proper `xemacs' executable. The unexec() process is hard to
+implement correctly and makes XEmacs very hard to port to new
+operating systems, or even to new releases of old systems.
+
+A portable dumper is a different approach to dumping: instead of
+dumping full-fledged executable, it only dumps out the initialized
+data structures (both Lisp and C) into an external file. A normally
+running XEmacs only needs to mmap() that file and relocate a bit to
+get to the initialized data. In that scheme, there is no difference
+between `temacs' and `xemacs'.
+
+This is all very experimental, though. Configure with `--pdump' to
+try testing it.
+
+** Much effort has been invested to make XEmacs Lisp faster:
+
+*** Many basic lisp operations are now faster.
+This is especially the case when running a Mule-enabled XEmacs.
+
+A general overhaul of the lisp engine should produce a speedup of 1.4
+in a Latin-1 XEmacs, and 2.1 in a Mule XEmacs. These numbers were
+obtained running `(byte-compile "simple.el")', which should be a
+pretty typical test of "pure" Lisp.
+
+*** Lisp hash tables have been re-implemented. The Common Lisp style
+hash table interface has been made standard, and moved from cl.el into
+fast C code (See the section on hash tables in the XEmacs Lisp
+Reference). A speedup factor of 3 can be expected with code that
+makes intensive use of hash tables.
+
+*** The garbage collector has been tuned, leading to a speedup of
+1.16.
+
+*** The family of functions that iterate over lists, like `memq', and
+`rassq', have been made a little faster (typically 1.3).
+
+*** Lisp function calls are faster, by approximately a factor of two.
+However, defining inline functions (via defsubst) still makes sense
+for tight loops.
+
+*** Finally, a few functions have had dramatic performance
+improvements. For example, `(last long-list)' is now 30 times faster.
+
+Of course, your mileage will vary.
+
+Many operations do not see any improvement. Surprisingly, running
+(font-lock-fontify-buffer) does not use the Lisp engine much at all.
+Speeding up your favorite slow operation is an excellent project to
+improve XEmacs. Don't forget to profile!
+
+** Native widgets can be displayed in buffers.
+
+The glyph system has been extended to allow the display of glyphs that
+are implemented as native window-system widgets. Thus you can embed
+buttons, scrollbars, combo boxes, edit fields and progress gauges in a
+buffer. As a side effect subwindow support now works once again.
+
+All of this is still fairly experimental and there is no
+documentation. The current APIs might change in a future version of
+XEmacs. Some widgets are only available under MS-Windows. See the
+file glyphs-test.el in the XEmacs src distribution for examples of
+usage.
+
+The buffers-tab functionality and progress gauge have been implemented
+using this feature.
+
+** `user-init-file' and `user-init-directory' are now absolute
+file/directory names. Previously, both variables used to be relative
+to (concat "~" init-file-user). This turned out to be too complicated
+for most packages (and some core Lisp files) to use correctly. Also,
+the `init-file-user' variable has been obsoleted in the process.
+
+The user-visible options like `-u' have not changed their behavior.
+
+** XEmacs finally has an automated test suite!
+Although this is not yet very sophisticated, it is already responsible
+for several important bug fixes in XEmacs. To try it out, simply use
+the makefile target `make check' after building XEmacs.
+
+** Hash tables have been reimplemented.
+As was pointed out above, the standard interface to hash tables is now
+the Common Lisp interface, as described in Common Lisp, the Language
+(CLtL2, by Steele). The older interface (functions with names
+containing the phrase `hashtable') will continue to work, but the
+preferred interface now has names containing the phrase `hash-table'.
+
+Here's the executive overview: create hash tables using
+make-hash-table, and use gethash, puthash, remhash, maphash and
+clrhash to manipulate entries in the hash table. See the (updated)
+Lisp Reference Manual for details.
+
+** Lisp code handles circular lists much more robustly.
+Many basic lisp functions used to loop forever when given a circular
+list, expecting you to C-g (quit) out of the loop. Now this is more
+likely to trigger a `circular-list' error. Printing a circular list
+now results in something like this:
+
+ (let ((x (cons 'foo 'foo)))
+ (setcdr x x)
+ x)
+ => (foo ... <circular list>)
+
+An extra bonus is that checking for circularities is not just
+friendlier, but actually faster than checking for C-g.
+
+** Functions for decoding base64 encoding are now available; see
+`base64-encode-region', `base64-encode-string', `base64-decode-region'
+and `base64-decode-string'.
+
+** The functions `read-string', `read-expression', `eval-minibuffer',
+`read-variable', `read-command', `read-function', `read-number',
+`read-shell-command', `read-from-minibuffer', and `completing-read'
+now take an additional argument which specifies the default value. If
+this argument is non-nil, it should be a string; that string is used
+in two ways:
+
+ It is returned if the user enters empty input.
+ It is available through the history command M-n.
+
+** LDAP changes.
+
+*** The LDAP interface now consists of two layers, a low-level layer
+that closely matches the LDAP C API, and a more convenient
+higher-level set of functions.
+
+*** The low-level functions that used to be named *-internal are now
+named more simply: `ldap-open', `ldap-close', `ldap-search-basic',
+`ldap-add', and `ldap-modify'. They should be used directly for very
+specific purposes (such as multiple operations on a connection) only.
+
+*** The higher-level functions provide a more convenient way to access
+LDAP directories hiding the subtleties of handling the connection,
+translating arguments and ensuring compliance with LDAP
+internationalization rules and formats (currently partly implemented
+only.) This layer provides atomic operations for searches,
+modification, addition and deletion of multiple entries at once:
+`ldap-search-entries', `ldap-add-entries', `ldap-delete-entries', and
+`ldap-modify-entries'.
+
+*** To maintain compatibility with previous code, the now obsolete
+function `ldap-search' is now merely a wrapper that calls either
+`ldap-search-basic' or `ldap-search-entries'. Please don't use the
+`ldap-search' function in your new programs -- a direct call to one of
+the two replacements is more efficient and unambiguous.
+
+** The arguments to `locate-file' are now more Lisp-like. As before,
+the usage is:
+
+ (locate-file FILENAME PATH-LIST &optional SUFFIXES MODE)
+
+Except that SUFFIXES are now a list of strings instead of a single,
+colon-separated string. MODE is now a symbol or a list of symbols
+(symbols `exists', `executable', `writable', and `readable' are
+supported) instead of an integer code. See the documentation for
+details. Of course, the old form is still accepted for backward
+compatibility.
+
+Several bugs in locate-file have been fixed, most notably its failure
+to call expand-file-name on elements of PATH-LIST. Because of that
+elements of load-path of the form "~/..." used to not work.
+locate-file is now guaranteed to expand files during its course of
+operation.
+
+** `translate-region' has been improved in several ways. Its TABLE
+argument used to be a 256-character string. In addition to this, it
+can now also be a vector or a char-table, which makes the function
+useful for Mule, which it wasn't. If TABLE a vector or a generic
+char-table, you can map characters to strings instead of to other
+characters. For instance:
+
+ (let ((table (make-char-table 'generic)))
+ (put-char-table ?a "the letter a" table)
+ (put-char-table ?b "" table)
+ (put-char-table ?c ?\n table)
+ (translate-region (point-min) (point-max) table))
+
+** The new form `ignore-file-errors', similar to `ignore-errors' may
+be used as a short-hand for condition-case when you wish to ignore
+file-related error. For example:
+
+ (ignore-file-errors (delete-file "foo"))
+
+** The first argument to `intern-soft' may now also be a symbol, like
+with `unintern'. If given a symbol, `intern-soft' will look for that
+exact symbol rather than for any string. This is useful when you want
+to check whether a specific symbol is interned in an obarray, e.g.:
+
+ (intern "foo")
+ (intern-soft "foo")
+ => foo
+ (intern-soft (make-symbol "foo"))
+ => nil
+
+** The `keywordp' function now returns non-nil only on symbols
+interned in the global obarray. For example:
+
+ (keywordp (intern ":foo" [0]))
+ => nil
+ (keywordp (intern ":foo")) ; The same as (keywordp :foo)
+ => t
+
+This behavior is compatible with other code which treats symbols
+beginning with colon as keywords only if they are interned in the
+global obarray. `keywordp' used to wrongly return t in both cases
+above.
+
+** New variables `this-command-properties' and
+`last-command-properties' are now available for communication between
+consecutive commands. Commands should use these to communicate with
+the pre/post-command hooks, subsequent commands, wrapping commands,
+etc. in preference to looking at and/or setting `this-command'.
+
+** New functions `add-one-shot-hook' and `add-local-one-shot-hook' make
+it possible to add a "one-shot" hook, which is to say a hook that runs
+only once, and automatically removes itself after the first time it
+has run.
+
+** The descriptor that specifies the text of a menu item can now be an
+evaluated expression. This makes this descriptor parallel with
+others, which can also be expressions.