Rename `struct device' to `struct terminal'. Rename some terminal-related functions...
[bpt/emacs.git] / README.multi-tty
index 739fce1..f1a0cde 100644 (file)
@@ -2,15 +2,14 @@
 GOAL
 ----
 
-The goal of this branch is to implement support for opening multiple,
-different tty devices and simultaneous X and tty frames from a single
-Emacs session.
+This branch implements support for opening multiple, different tty
+devices and simultaneous X and tty frames from a single Emacs session.
 
 Some use cases:
 Emacs is notoriously slow at startup, so most people use another
 editor or emacsclient for quick editing jobs from the console.
 Unfortunately, emacsclient was very awkward to use, because it did not
-support opening a new Emacs frame on the current virtual console.
+support opening a new Emacs frame on the current virtual tty.
 Now, with multi-tty support, it can do that.  (Emacsclient starts up
 faster than vi!)
 
@@ -25,298 +24,641 @@ WHO IS DOING IT
 
 I'm Károly Lőrentey.  My address: lorentey@elte.hu.
 
-Comments, bug reports, suggestions and patches are welcome!
+Comments, bug reports, suggestions and patches are welcome; send them
+to multi-tty@lists.fnord.hu.
+
+The following is a (sadly incomplete) list of people who have
+contributed to the project by testing, submitting patches, bug
+reports, and suggestions.  Thanks!
+
+Bernard Adrian <bernadrian@free.fr>
+ARISAWA Akihiro <ari@mbf.ocn.ne.jp>
+Vincent Bernat <bernat@luffy.cx>
+Han Boetes <han@mijncomputer.nl>
+Francisco Borges <borges@let.rug.nl>
+Damien Cassou <damien.cassou@laposte.net>
+Robert J. Chassell <bob@rattlesnake.com>
+Romain Francoise <romain@orebokech.com>
+Ami Fischman <ami@fischman.org>
+Friedrich Delgado Friedrichs <friedel@nomaden.org>
+IRIE Tetsuya <irie@t.email.ne.jp>
+Yoshiaki Kasahara <kasahara@nc.kyushu-u.ac.jp>
+Bas Kok <nekkobassu@yahoo.com>
+Jurej Kubelka <Juraj.Kubelka@email.cz>
+David Lichteblau <david@lichteblau.com>
+Xavier Mallard <zedek@gnu-rox.org>
+Istvan Marko <mi-mtty@kismala.com>
+Ted Morse <morse@ciholas.com>
+Gergely Nagy <algernon@debian.org>
+Dan Nicolaescu <dann@ics.uci.edu>
+Kalle Olavi Niemitalo <kon@iki.fi>
+Mark Plaksin <happy@mcplaksin.org>
+Frank Ruell <stoerte@dreamwarrior.net>
+Tom Schutzer-Weissmann <trmsw@yahoo.co.uk>
+Joakim Verona <joakim@verona.se>
+Dan Waber <dwaber@logolalia.com>
+and many others.
+
+Richard Stallman was kind enough to review an earlier version of my
+patches.
+
+
+MAILING LISTS
+-------------
+
+The multi-tty mailing list (discussion & bug reports):
+
+       Address:        multi-tty@lists.fnord.hu
+       Signup:         http://lists.fnord.hu/mailman/listinfo/multi-tty
+       Archive:        http://news.gmane.org/gmane.emacs.multi-tty/
+
+Commit notifications (read-only):
+
+        Address:       multi-tty-commits@lists.fnord.hu
+       Signup:         http://lists.fnord.hu/mailman/listinfo/multi-tty-commits
+
+
+STATUS
+------
+
+The branch is now very stable and almost full-featured.  All of the
+major problems have been fixed, only a few minor issues remain.  (It
+still needs to be ported to Windows/Mac/DOS, though.)  Both multiple
+tty device support and simultaneous X and tty frame support works
+fine.  Emacsclient has been extended to support opening new tty and X
+frames.  It has been changed to open new Emacs frames by default.
+
+The multi-tty branch has been scheduled for inclusion in the next
+major release of Emacs (version 23).  I expect the merge into the
+development trunk to occur sometime during next year (2006), after the
+merge of the Unicode branch.
+
+Tested on GNU/Linux, Solaris 8, FreeBSD and OpenBSD.  Please let me
+know if you succeed or fail to use it on other platforms---I'll have a
+few tricky test cases for you.
+
+Known problems:
+
+        * GTK support.  If you compile your Emacs with the GTK
+          toolkit, some functionality of multi-tty will be lost.  In
+          particular, you will not be able to work on multiple X
+          displays at once.  Current releases of GTK have limitations
+          and bugs that prevent full-blown multi-display support in
+          Emacs.  (GTK crashes when Emacs tries to disconnect from an
+          X server.)  Use the Lucid toolkit if you want to see a
+          complete feature set.
+
+        * The single-kboard mode.
+
+         If your multi-tty Emacs session seems to be frozen, you
+         probably have a recursive editing session or a pending
+         minibuffer prompt (which is a kind of recursive editing) on
+         another display.  To unfreeze your session, switch to that
+         display and complete the recursive edit, for example by
+         pressing C-] (`abort-recursive-edit').
+
+         I am sorry to say that currently there is no way to break
+         out of this "single-kboard mode" from a frozen display.  If
+         you are unable to switch to the display that locks the
+         others (for example because it is on a remote computer),
+         then you can use emacsclient to break out of all recursive
+         editing sessions:
+
+               emacsclient -e '(top-level)'
+
+         Note that this (perhaps) unintuitive behaviour is by design.
+         Single-kboard mode is required because of an intrinsic Emacs
+         limitation that is very hard to eliminate.  (This limitation
+         is related to the single-threaded nature of Emacs.)
+
+         I plan to implement better user notification and support for
+         breaking out of single-kboard mode from locked displays.
+
+       * Mac, Windows and DOS support is broken, doesn't even
+         compile.  Multiple display support will probably not provide
+         new Emacs features on these systems, but the multi-tty
+         branch changed a few low-level interfaces, and the
+         system-dependent source files need to be adapted
+         accordingly.  The changes are mostly trivial, so almost
+         anyone can help, if only by compiling the branch and
+         reporting the compiler errors.
+
+
+HOW TO GET THE BRANCH
+---------------------
+
+The branch uses Bazaar 1 (http://bazaar.canonical.com) for version control.
 
 Retrieving the latest version of the branch:
 
-       tla register-archive lorentey@elte.hu--2004 http://lorentey.web.elte.hu/arch/2004/
-       tla get lorentey@elte.hu--2004/emacs--multi-tty <directory>
+       baz register-archive -f http://aszt.inf.elte.hu/~lorentey/mirror/arch/2004
+       baz get lorentey@elte.hu--2004/emacs--multi-tty <directory>
 
-(I use a recent arch development snapshot, but any of the released
-versions of arch will do fine, I think.)
+This incantation uses an archive mirror that is hosted on a
+high-bandwidth site.  Please note that on average there is a two-hour
+delay for commits to arrive on this mirror.  My primary mirror is on the
+low-bandwidth http://lorentey.hu/ site:
 
-To update your source tree to the latest revision after the first
-checkout, simply use the following command:
+       baz register-archive -f http://lorentey.hu/arch/2004/
+       baz get lorentey@elte.hu--2004/emacs--multi-tty <directory>
 
-       tla replay lorentey@elte.hu--2004/emacs--multi-tty--0
+This is "instantly" updated, but very slow from outside Hungary.
+(By "instantly" I mean as soon as I connect the notebook I work on to
+a network.  It could take days.)
 
-If you are interested, you can find more detailed information about
-Arch on http://wiki.gnuarch.org/.  It's a wonderful source control
-system, I highly recommend it.
+The Arch supermirror provides mirroring services for all public Arch
+repositories.  We have a mirror there, too, if you prefer.
 
-If you don't have arch, the branch has a homepage from which you can
+       baz register-archive -f http://mirrors.sourcecontrol.net/lorentey%40elte.hu--2004
+       baz get lorentey@elte.hu--2004/emacs--multi-tty <directory>
+
+My GPG key id is 0FB27A3F; it is available from
+hkp://wwwkeys.eu.pgp.net/, or from my homepage at
+http://lorentey.hu/rolam/gpg.html)
+
+Don't worry if the above checkout takes a few minutes to complete;
+once you have a source tree, updating it to the latest revision will
+be _much_ faster.  Use the following command for the update:
+
+       baz replay
+
+You can find more information about Bazaar on
+http://bazaar.canonical.com/.  It's a distributed source control
+system that is somewhat less broken than competing projects.
+
+If you don't have Bazaar, the branch has a homepage from which you can
 download conventional patches against Emacs CVS HEAD:
 
-       http://lorentey.web.elte.hu/project/emacs.html
+       http://lorentey.hu/project/emacs.html
 
-If you want to be notified of new revisions, sign up to the
-multi-tty@listbox.elte.hu mailing list by visiting the
-below homepage and following its instructions.
+I suggest you use Bazaar whenever feasible.
 
-       https://listbox.elte.hu/mailman/listinfo/multi-tty
 
-Please note that the multi-tty mailing list is read-only, and is
-reserved for automatic commit messages.  Discussion about the branch
-and bug reports should be sent directly to me (lorentey@elte.hu), or
-to the emacs-devel@gnu.org mailing list.  (I hope to merge my branch
-into CVS HEAD reasonably soon, so I don't want to set up an elaborate
-development infrastructure for the multi-tty branch.)
+DEBIAN PACKAGES
+---------------
 
-STATUS
-------
+If you run Debian, or a distribution based on Debian, you are welcome
+to use our binary packages; put these lines in your /etc/apt/sources.list:
 
-The branch is now very stable and almost full-featured. I hope the
-major problems were fixed.  (It still needs testing on other
-architectures, though.)  Both multiple tty device support and
-simultaneous X and tty frame support works fine.  Emacsclient has been
-extended to support opening new tty and X frames.  It has been changed
-open new Emacs frames by default.
+       # Multi-tty Emacs
+       deb http://aszt.inf.elte.hu/~lorentey/mirror/apt unstable multi-tty
+       deb-src http://aszt.inf.elte.hu/~lorentey/mirror/apt unstable multi-tty
 
-Please let me know if you find any bugs in this branch.
+Note that these packages are intended solely to provide an easy way to
+test the new multi-tty features.  They are not to be taken as Emacs
+releases, and it's a mistake to expect robust operation or any kind of
+timely support for them.  Do not install them, unless you'd like to
+have your editor crash on you.
 
-HOW TO COMPILE AND TEST
------------------------
 
-To try out the multi-tty branch, compile and run the multi-tty branch
-with the following commands:
+COMPILATION
+-----------
 
-        find -name "*.elc" | xargs rm   # Delete leftover stuff
-       mkdir +build
-       cd +build
-       ../configure <your favourite options>
+The multi-tty branch is compiled the same way as Emacs itself:
+
+       make maintainer-clean  # (If you have compiled Emacs before)
+
+       ./configure --without-gtk <your favourite options>
        make bootstrap
-       src/emacs -nw           # You can also try without -nw
+       make install
+
+If you have strange compilation errors, they may be caused by old
+*.elc files that are left over from an earlier bootstrap.  The `make
+maintainer-clean' target deletes them, so it is a good idea to run
+that before reporting a bug.  (Emacs requires a clean recompilation
+after certain kinds of source code changes.)
+
+TESTING
+-------
+
+To test the multi-tty branch, start up the Emacs server with the
+following commands:
+
+       emacs
        M-x server-start
 
 and then (from a shell prompt on another terminal) start emacsclient
 with
-       lib-src/emacsclient /optional/file/names...
-or
-       lib-src/emacsclient -t /optional/file/names...
+       emacsclient -t /optional/file/names...   (for a tty frame)
+       emacsclient /optional/file/names...      (for an X frame)
 
+(Make sure both emacs and emacsclient are multi-tty versions.)
 You'll hopefully have two fully working, independent frames on
 separate terminals. The new frame is closed automatically when you
 finish editing the specified files (C-x #), but delete-frame (C-x 5 0)
 also works.  Of course, you can create frames on more than two tty
 devices.
 
-Creating new frames on the same tty with C-x 5 2 works, and they
-behave the same way as in previous Emacs versions.  If you exit emacs,
-all terminals should be restored to their previous states.
+Creating new frames on the same tty with C-x 5 2 (make-frame-command)
+works, and behaves the same way as in previous Emacs versions.  If you
+exit emacs, all terminals should be restored to their previous states.
+
+This is work in progress, and probably full of bugs.  It is a good
+idea to run emacs from gdb, so that you'll have a live instance to
+debug if something goes wrong.  Please send me your bug reports on our
+mailing list: multi-tty@lists.fnord.hu
 
-This is work in progress, and probably full of bugs.  You should
-always run emacs from gdb, so that you'll have a live instance to
-debug if something goes wrong.  Please send me your bug reports.
+TIPS & TRICKS
+-------------
 
 I think the best way to use the new Emacs is to have it running inside
 a disconnected GNU screen session, and always use emacsclient for
-normal work.  This way not a single keystroke of your work will be
-lost if the display device that you are using crashes, or the network
-connection times out, or whatever.  As long as the server that runs
-your Emacs remains up, all your buffers remain exactly as they were
-before the crash, and you can continue working as if nothing had
-happened.  (I had an extremely unstable X server for some time while I
-was developing these patches, and running Emacs this way has saved me
-a number of M-x recover-session invocations.)
+normal work.  One advantage of this is that not a single keystroke of
+your work will be lost if the display device that you are using
+crashes, or the network connection times out, or whatever.  (I had an
+extremely unstable X server for some time while I was developing these
+patches, and running Emacs this way has saved me a number of M-x
+recover-session invocations.)
+
+I use the following two bash scripts to handle my Emacs sessions:
+
+-------------------------------------------------------connect-emacs--
+#!/bin/bash
+# Usage: connect-emacs <name> <args>...
+#
+# Connects to the Emacs instance called NAME.  Starts up the instance
+# if it is not already running.  The rest of the arguments are passed
+# to emacsclient.
+
+name="$1"
+shift
+    
+if [ -z "$name" ]; then
+    echo "Usage: connect_emacs <name> <args>..." >&2
+    exit 1
+fi
+preload-emacs "$name" wait
+/usr/bin/emacsclient.emacs-multi-tty -s "$name" "$@"
+----------------------------------------------------------------------
+
+-------------------------------------------------------preload-emacs--
+#!/bin/bash
+# Usage: preload-emacs <name> [<waitp>]
+#
+# Preloads the Emacs instance called NAME in a detached screen
+# session.  Does nothing if the instance is already running.  If WAITP
+# is non-empty, the function waits until the server starts up and
+# creates its socket; otherwise it returns immediately.
+
+name="$1"
+waitp="$2"
+screendir="/var/run/screen/S-$USER"
+serverdir="/tmp/emacs$UID"
+emacs=/usr/bin/emacs-multi-tty # Or wherever you installed your multi-tty Emacs
+
+if [ -z "$name" ]; then 
+    echo "Usage: preload_emacs <name> [<waitp>]" >&2
+    exit 1
+fi
+
+if [ ! -e "$screendir"/*."$name" ]; then
+    if [ -e "$serverdir/$name" ]; then
+       # Delete leftover socket (for the wait option)
+       rm "$serverdir/$name"
+    fi
+    screen -dmS "$name" "$emacs" -nw --eval "(setq server-name \"$name\")" -f server-start
+fi
+if [ ! -z "$waitp" ]; then
+    while [ ! -e "$serverdir/$name" ]; do sleep 0.1; done
+fi
+----------------------------------------------------------------------
+
+I have the following in my profile to have two instances automatically
+preloaded for editing and email:
+
+       preload-emacs editor
+       preload-emacs gnus
+
+It is useful to set up short aliases for connect-emacs.  I use the
+following:
+
+       alias edit="connect-emacs editor"
+       alias e=edit
+       alias et="connect-emacs editor -t"
+       alias gnus="connect-emacs gnus"
 
-(I am thinking about introducing a --daemon option to get rid of the
-above screen dependency.)
 
-Problems:
+CHANGELOG
+---------
 
-       * Mac, Windows and DOS support is broken, probably doesn't
-         even compile -- this will be solved later.
+See arch logs.
 
-       * Only tested on my GNU/Linux box, Solaris 8 and FreeBSD.
 
 NEWS
 ----
 
-For the NEWS file:
+For the NEWS file:  (Needs much, much work)
+
+** Support for multiple terminal devices and simultaneous graphical
+   and tty frames has been added.  You can test for the presence of
+   this feature in your Lisp code by testing for the `multi-tty'
+   feature.
 
-** Support for multiple terminal devices has been added.
+*** The `window-system' variable has been made frame-local. The new
+    `initial-window-system' variable contains the `window-system'
+    value for the first frame.
 
 *** You can specify a terminal device (`tty' parameter) and a terminal
     type (`tty-type' parameter) to `make-terminal-frame'.
 
-*** You can test for the presence of multiple terminal support by
-    testing for the `multi-tty' feature.
+*** The new function `make-frame-on-tty' allows you to create a new
+    frame on another tty device interactively.
+
+*** The function `make-frame-on-display' now works during a tty
+    session, and `make-frame-on-tty' works during a graphical session.
 
 *** Emacsclient has been extended to support opening a new terminal
     frame. Its behaviour has been changed to open a new Emacs frame by
     default.  Use the -c option to get the old behavior of opening
     files in the currently selected Emacs frame.
 
-*** A make-frame-on-tty function has been added to make it easier to
-    create frames on new terminals.
+*** C-z now invokes `suspend-frame', C-x C-c now invokes
+    `save-buffers-kill-terminal'.
+
+*** New functions: frame-tty-name, frame-tty-type, delete-tty,
+    suspend-tty, resume-tty, terminal-id, terminal-parameters,
+    terminal-parameter, set-terminal-parameter,
+    modify-terminal-parameters, environment, let-environment
+
+*** New variables: local-key-translation-map, local-function-key-map
 
-*** New functions: frame-tty-name, frame-tty-type for accessing
-    terminal parameters, and delete-tty for closing the terminal
-    device.
+*** The `keyboard-translate-table' variable and the terminal and
+    keyboard coding systems have been made terminal-local.
+
+*** In addition to the global key-translation-map and
+    function-key-map, Emacs has terminal-local
+    local-key-translation-map and local-function-key-map variables,
+    and uses them instead of the global keymaps to set up translations
+    and function key sequences relevant to a specific terminal device.
 
 *** talk.el has been extended for multiple tty support.
 
+* * *
 
-** Support for simultaneous graphical and terminal frames has been
-   added.
+(The rest of this file consists of my development notes and as such it
+is probably not very interesting for anyone else.)
 
-*** The function `make-frame-on-display' now works during a terminal
-    session, and `make-frame-on-tty' works during a graphical session.
+THINGS TO DO
+------------
 
-*** The `window-system' variable has been made frame-local.
+** Trouble: `setenv' doesn't actually set environment variables in the
+   Emacs process.  This defeats the purpose of the elaborate
+   `server-with-environment' magic around the `tgetent' call in
+   `init_tty'.  D'oh.
 
-*** The new `initial-window-system' variable contains the
-    `window-system' value for the first frame.
+** (Possibly) create hooks in struct device for creating frames on a
+   specific terminal, and eliminate the hackish terminal-related frame
+   parameters (display, tty, tty-type).
 
-THANKS
-------
+       make_terminal_frame
+               create_tty_output
 
-The following is an (incomplete) list of people who have contributed
-to the project by testing, bug reports, and suggestions.  Thanks!
-
-Robert J. Chassell <bob at rattlesnake dot com>
-Romain Francoise <romain at orebokech dot com>
-Ami Fischman <ami at fischman dot org>
-Istvan Marko <mi-mtty ar kismala dot com>
-Dan Nicolaescu <dann at ics dot uci dot edu>
-Gergely Nagy <algernon at debian dot org>
-Mark Plaksin <happy at mcplaksin dot org>
-Francisco Borges <borges at let dot rug dot nl>
-Frank Ruell <stoerte at dreamwarrior dot net>
-and many others.
+** Decide whether to keep the C implementation of terminal parameters,
+   or revert to the previous, purely Lisp code.  It turned out that
+   local environments do not need terminal parameters after all.
 
-Richard Stallman was kind enough to review an earlier version of my
-patches.
+** Move Fsend_string_to_terminal to term.c, and declare get_named_tty
+   as static, removing it from dispextern.h.
+   Move fatal to emacs.c and declare it somewhere.
 
-CHANGELOG
----------
+** Search for `suspend-emacs' references and replace them with
+   `suspend-frame', if necessary.  Ditto for `save-buffers-kill-emacs'
+   vs. `save-buffers-kill-display'.
 
-See arch logs.
+** Emacs crashes when a tty frame is resized so that there is no space
+   for all its windows.  (Tom Schutzer-Weissmann)
 
-THINGS TO DO
-------------
+** Report GTK multi-display problems to GTK maintainers.  For extra
+   credit, fix them.
 
-** frame-creation-function was removed, which might be a bad idea.
-   Think up a compatible solution.
+   Currently you can not connect to new X displays when you compile
+   Emacs with GTK support.  If you want to play around with GTK
+   multidisplay (and don't mind core dumps), you can edit src/config.h
+   and define HAVE_GTK_MULTIDISPLAY there by hand.
 
-** make-frame does not correctly handle extra parameters in its
-   argument:
+** Audit `face-valid-attribute-values' usage in customize and
+   elsewhere.  Its return value depends on the current window system.
+   Replace static initializers using it with runtime functions.  For
+   example, custom's buttons are broken on non-initial device types.
 
-       (frame-parameter (make-frame (list (cons 'foobar 42))) 'foobar)
-               => nil
+** Possibly turn off the double C-g feature when there is an X frame.
+   C.f. (emacs)Emergency Escape.
 
-   (This is likely an error in the CVS trunk.)
+** frames-on-display-list should also accept frames.
+
+** I smell something funny around pop_kboard's "deleted kboard" case.
+   Determine what are the circumstances of this case, and fix any
+   bug that comes to light.
+
+** Consider the `tty-type' frame parameter and the `display-tty-type'
+   function.  They serve the exact same purpose.  I think it may be
+   a good idea to eliminate one of them, preferably `tty-type'.
+
+** The handling of lisp/term/*.el, and frame creation in general, is a
+   big, big mess.  How come the terminal-specific file is loaded by
+   tty-create-frame-with-faces?  I don't think it is necessary to load
+   these files for each frame; once per terminal should be enough.
+   Update: lisp/term/*.el is not loaded repeatedly anymore, but
+   faces.el still needs to be cleaned up.
+
+** Fix frame-set-background-mode in this branch.  It was recently
+   changed in CVS, and frame.el in multi-tty has not yet been adapted
+   for the changes.  (It needs to look at
+   default-frame-background-mode.)  (Update: maybe it is fixed now;
+   needs testing.) (Note that the byte compiler has this to say about
+   term/rxvt.el:)
+
+       term/rxvt.el:309:17:Warning: assignment to free variable
+           `default-frame-background-mode'
+
+** I think `(set-)terminal-local-value' and the terminal parameter
+   mechanism should be integrated into a single framework.
+
+   (Update: `(set-)terminal-local-value' is now eliminated, but the
+   terminal-local variables should still be accessible as terminal
+   parameters.  This also applies to `display-name' and similar
+   functions.)
+
+** Add the following hooks: after-delete-frame-hook (for server.el,
+   instead of delete-frame-functions),
+   after-delete-terminal-functions, after-create-terminal-functions.
 
 ** Fix set-input-mode for multi-tty.  It's a truly horrible interface;
    what if we'd blow it up into several separate functions (with a
    compatibility definition)?
 
-** Emacs assumes that all terminal frames have the same locale
-   settings as Emacs itself.  This may lead to bogus results in a
-   multi-locale setup. (E.g., while logging in from a remote client
-   with a different locale.)
+** BULK RENAME: The `display-' prefix of new Lisp-level functions
+   conflicts with stuff like `display-time-mode'.  Use `device-'
+   or `terminal-' instead.  I think I prefer `terminal-'.
+
+   It turns out that most of the offending Lisp functions were defined
+   in the trunk.  Therefore, compatibility aliases should be defined
+   for the following names:
+
+    display-color-cells                        terminal-color-cells
+    display-color-p                    terminal-color-p
+    display-graphic-p                  terminal-graphic-p
+    display-grayscale-p                        terminal-grayscale-p
+    display-images-p                   terminal-images-p
+    display-mm-height                  terminal-mm-height
+    display-mm-width                   terminal-mm-width
+    display-mouse-p                    terminal-mouse-p
+    display-multi-font-p               terminal-multi-font-p
+    display-multi-frame-p              terminal-multi-frame-p
+    display-pixel-height               terminal-pixel-height
+    display-pixel-width                        terminal-pixel-width
+    display-pixels-per-inch            terminal-pixels-per-inch
+    display-planes                     terminal-planes
+    display-popup-menus-p              terminal-popup-menus-p
+    display-save-under                 terminal-save-under
+    display-screens                    terminal-screens
+    display-supports-face-attributes-p terminal-supports-face-attributes-p
+    display-visual-class               terminal-visual-class
+    framep-on-display                  framep-on-terminal
+    frames-on-display-list             frames-on-terminal-list
+
+   The following functions were introduced in the multi-tty branch, and
+   were renamed without aliases:
+
+    delete-display                     delete-terminal
+    display-controlling-tty-p           controlling-tty-p
+    display-list                        terminal-list
+    display-live-p                      terminal-live-p
+    display-name                        terminal-name
+    display-tty-type                    tty-type
+    frame-display                       frame-terminal
+    selected-display                   selected-terminal
 
 ** The single-keyboard mode of MULTI_KBOARD is extremely confusing
    sometimes; Emacs does not respond to stimuli from other keyboards.
    At least a beep or a message would be important, if the single-mode
    is still required to prevent interference.  (Reported by Dan
-   Nicolaescu.)  (Update: selecting a region with the mouse enables
-   single_kboard under X.  This is very confusing.)
+   Nicolaescu.)  
 
-** Change Lisp code not to (getenv "TERM"); use the `tty-type' frame
-   parameter or the frame-tty-type function instead.  (M-x tags-search
-   "TERM" helps with this.)  Update: Actually, all getenv invocations
-   should be checked for multi-tty compatibility, and an interface
-   must be implemented to get the remote client's environment.
+   Update: selecting a region with the mouse enables single_kboard
+   under X.  This is very confusing.
 
-** The terminal customization files in term/*.el tend to change global
-   parameters, which may confuse Emacs with multiple displays.  Change
-   them to tweak only frame-local settings, if possible.
+   Update: After discussions with Richard Stallman, this will be
+   resolved by having locked displays warn the user to wait, and
+   introducing a complex protocol to remotely bail out of
+   single-kboard mode by pressing C-g.
 
-** Dan Nicolaescu suggests that -nw should be added as an alias for -t
-   in emacsclient.  Good idea.  (Alas, implementing this is not
-   trivial, getopt_long does not seem to support two-letter ``short''
-   options.  Patches are welcome.) :-)
+   Update: Warning the user is not trivial to implement, as Emacs has
+   only one echo area, shared by all frames.  Ideally the warning
+   should not be displayed on the display that is locking the others.
+   Perhaps the high probability of user confusion caused by
+   single_kboard mode deserves a special case in the display code.
+   Alternatively, it might be good enough to signal single_kboard mode
+   by changing the modelines or some other frame-local display element
+   on the locked out displays.
 
-** Mark Plaksin suggests that emacsclient should accept the same
-   X-related command-line arguments as Emacs.  Most of the X-related
-   argument-handling is done in Lisp, so this should be quite easy to
-   implement.
+** The session management module is prone to crashes when the X
+   connection is closed and then later I try to connect to a new X
+   session:
 
-** Gergely Nagy suggests that C-x # should only kill the current
-   frame, not any other emacsclient frame that may have the same file
-   opened for editing.  I think I agree with him.
+       #0  0xb7ebc806 in SmcGetIceConnection () from /usr/X11R6/lib/libSM.so.6
+       #1  0x080e6641 in x_session_check_input (bufp=0xbf86c9c0) at xsmfns.c:144
+       #2  0x080d3bbc in XTread_socket (device=0xa722ff8, expected=1, hold_quit=0xbf86ca90) at xterm.c:7037
+       #3  0x080fa404 in read_avail_input (expected=1) at keyboard.c:6696
+       #4  0x080fa4ca in handle_async_input () at keyboard.c:6900
+       #5  0x080d51fa in x_term_init (display_name=162628899, xrm_option=0x0, resource_name=0x857068c "emacs") at xterm.c:10622
+       #6  0x080d920e in x_display_info_for_name (name=162628899) at xfns.c:3975
+       #7  0x080d92f9 in check_x_display_info (object=1) at xfns.c:274
+       #8  0x080d97b8 in Fx_create_frame (parms=151221485) at xfns.c:3016
+       #9  0x0815bf72 in Ffuncall (nargs=2, args=0xbf86ceec) at eval.c:2851
 
-** Miles Bader suggests that C-x C-c on an emacsclient frame should
-   only close the frame, not exit the entire Emacs session.
+   I installed a workaround to prevent this.  The X session manager is
+   only contacted when the very first display in the Emacs session is
+   an X display.  Also, x_delete_display() on this display aborts
+   session management, and XTread_socket only calls
+   x_session_check_input when it is called for the display that the
+   session was opened on.  While this does not really fix the bug, it
+   makes it much less frequent, because session manager support will
+   not normally be enabled when Emacs can survive the shutdown of the
+   X server.
 
-** Make `struct display' accessible to Lisp programs.  Accessor functions:
+   See if xsmfns.c should be updated.
 
-       (displayp OBJECT):  Returns t if OBJECT is a display.
+** Hunt down display-related functions in frame.el and extend them all
+   to accept display ids.
 
-       (display-list):  Returns list of currently active displays.
+** rif->flush_display_optional (NULL) calls should be replaced by a
+   new global function.
 
-       (selected-display):  Returns the display object of the selected frame.
+** The set-locale-environment hack (adding the DISPLAY option) should
+   be replaced with a clean design.
 
-       (frame-display FRAME):  Returns the display object of FRAME.
+** standard-display-table should be display-local.
+   standard-display-european should be display-local.
 
-       (display-frames DISPLAY):  Returns a list of frames on DISPLAY.
+** With iswitchb-default-method set to 'always-frame, only frames on
+   the current display should be considered.  This might involve
+   extending `get-buffer-window'.
 
-       (display-type DISPLAY):  Returns the type of DISPLAY, as a
-               symbol.  (See `framep'.)
+** Have a look at Vlocale_coding_system.  Seems like it would be a
+   tedious job to localize it, although most references use it for
+   interfacing with libc and are therefore OK with the global
+   definition.
 
-       (display-device DISPLAY): Returns the name of the device that
-               DISPLAY uses, as a string.  (E.g: "/dev/pts/16", or
-               ":0.0")
+   Exceptions found so far: x-select-text and
+   x-cut-buffer-or-selection-value.
 
-       etc.
+** Have a look at fatal_error_hook.
 
-   See next issue why this is necessary.
+** Have a look at set_frame_matrix_frame.
 
-** The following needs to be supported:
+** Check if we got term-setup-hook right.
 
-       $ emacsclient -t
-               C-z
-       $ emacsclient -t
-               (This fails now.)
+** I think tip_frame should be display-local.
 
-   The cleanest way to solve this is to allow multiple displays on the
-   same terminal device; each new emacsclient process should create
-   its own display.  As displays are currently identified by their
-   device names, this is not possible until struct display becomes
-   accessible as a Lisp-level object.
+** Check display reference count handling in x_create_tip_frame.
 
-** Add an elaborate mechanism for display-local variables.  (There are
-   already a few of these; search for `terminal-local' in the Elisp
-   manual.)
+** make-frame does not correctly handle extra parameters in its
+   argument:
+
+       (frame-parameter (make-frame (list (cons 'foobar 42))) 'foobar)
+               => nil
+
+   (This is likely an error in the CVS trunk.)
+
+** Dan Nicolaescu suggests that -nw should be added as an alias for -t
+   in emacsclient.  Good idea.  (Alas, implementing this is not
+   trivial, getopt_long does not seem to support two-letter ``short''
+   options.  Patches are welcome.)
+
+** Mark Plaksin suggests that emacsclient should accept the same
+   X-related command-line arguments as Emacs.  Most of the X-related
+   argument-handling is done in Lisp, so this should be quite easy to
+   implement.
+
+** Gergely Nagy suggests that C-x # should only kill the current
+   frame, not any other emacsclient frame that may have the same file
+   opened for editing.  I think I agree with him.
 
 ** Very strange bug: visible-bell does not work on secondary
    terminals in xterm and konsole.  The screen does flicker a bit,
    but it's so quick it isn't noticable.
 
-** Clean up the frame-local variable system.  I think it's ugly and
-   error-prone.  But maybe I just haven't yet fully understood it.
-
 ** Move baud_rate to struct display.
 
 ** Implement support for starting an interactive Emacs session without
    an initial frame.  (The user would connect to it and open frames
    later, with emacsclient.)
 
-** Fix Mac support (I can't do this myself).  Note that the current
-   state of Mac-specific source files in the multi-tty tree are not
-   useful; before starting work on Mac support, revert to pristine,
-   pre-multi-tty versions.
+** Fix Mac support (I can't do this entirely myself).  Note that the
+   current state of Mac-specific source files in the multi-tty tree
+   are not useful; before starting work on Mac support, revert to
+   pristine, pre-multi-tty versions.
 
-** Fix W32 support (I can't do this myself).  Note that the current
-   state of W32-specific source files in the multi-tty tree are not
-   useful; before starting work on W32 support, revert to pristine,
-   pre-multi-tty versions.
+** Fix W32 support (I can't do this entirely myself).  Note that the
+   current state of W32-specific source files in the multi-tty tree
+   are not useful; before starting work on W32 support, revert to
+   pristine, pre-multi-tty versions.
 
-** Fix DOS support (I can't do this myself).  Note that the current
-   state of DOS-specific source files in the multi-tty tree are not
-   useful; before starting work on DOS support, revert to pristine,
-   pre-multi-tty versions.
+** Fix DOS support (I can't do this entirely myself).  Note that the
+   current state of DOS-specific source files in the multi-tty tree
+   are not useful; before starting work on DOS support, revert to
+   pristine, pre-multi-tty versions.
 
 ** Do a grep on XXX and ?? for more issues.
 
@@ -326,8 +668,12 @@ THINGS TO DO
    useful.  (Update: Look again. X unconditionally enables this, maybe
    that's why raw terminal support is broken again.  I really do need
    to understand input.)
+   (Update: I am starting to understand the read_key_sequence->read-char
+   ->kbd_buffer_get_event->read_avail_input->read_socket_hook path.  Yay!)
+
+** flow-ctrl.el must be updated.
 
-** Maybe standard-display-table should be display-local.
+** Fix stuff_char for multi-tty.  Doesn't seem to be of high priority.
 
 DIARY OF CHANGES
 ----------------
@@ -630,7 +976,7 @@ DIARY OF CHANGES
    frame that is dumped with Emacs.  Checking for this frame (e.g. in
    cmd_error_internal) is ugly.
 
-   (Done, broking interactive temacs.)
+   (Done, breaking interactive temacs.)
 
 -- The command `emacsclient -t -e '(delete-frame)'' fails to exit.
 
@@ -776,6 +1122,260 @@ DIARY OF CHANGES
    but delays caused by single_kboard --> perhaps MULTI_KBOARD should
    be removed.)
 
+-- frame-creation-function was removed, which might be a bad idea.
+   Think up a compatible solution.
+
+   (It was an internal interface that may be changed when necessary.)
+
+-- Change Lisp code not to (getenv "TERM"); use the `tty-type' frame
+   parameter or the frame-tty-type function instead.  (M-x tags-search
+   "TERM" helps with this.)  Update: Actually, all getenv invocations
+   should be checked for multi-tty compatibility, and an interface
+   must be implemented to get the remote client's environment.
+
+   (Done.  Only getenv calls in lisp/term/*.el were changed; other
+   calls should be mostly left as they are.)
+
+-- Add an elaborate mechanism for display-local variables.  (There are
+   already a few of these; search for `terminal-local' in the Elisp
+   manual.)
+
+   (Not needed.  Display-local variables could be emulated by
+   frame-local variables.)
+
+-- Emacs assumes that all terminal frames have the same locale
+   settings as Emacs itself.  This may lead to bogus results in a
+   multi-locale setup. (E.g., while logging in from a remote client
+   with a different locale.)
+   (Update after new bugreport by Friedrich Delgado Friedrichs: 
+   (at least) the structs terminal_coding and keyboard_coding in
+   coding.c must be moved to struct display, and the Lisp interface
+   [set-]keyboard-coding-system must be adapted for the change.)
+
+   (Fixed.  Emacs now uses the locale settings as seen by the
+   emacsclient process for server tty frames.)
+   (Update: Not really; Vlocale_coding_system is still global.)
+
+-- Make `struct display' accessible to Lisp programs.  Accessor functions:
+
+       (displayp OBJECT):  Returns t if OBJECT is a display.
+               => Implemented as display-live-p.
+
+       (display-list):  Returns list of currently active displays.
+               => Implemented.
+
+       (selected-display):  Returns the display object of the selected frame.
+               => Not strictly necessary, but implemented anyway.
+
+       (frame-display FRAME):  Returns the display object of FRAME.
+               => Implemented.
+
+       (display-frames DISPLAY):  Returns a list of frames on DISPLAY.
+               => Already implemented, see frames-on-display-list.
+
+       (display-type DISPLAY):  Returns the type of DISPLAY, as a
+               symbol.  (See `framep'.)
+               => Implemented as display-live-p.
+
+       (display-device DISPLAY): Returns the name of the device that
+               DISPLAY uses, as a string.  (E.g: "/dev/pts/16", or
+               ":0.0")
+               => Implemented as display-name.
+
+       etc.
+
+   See next issue why this is necessary.
+
+   (Update: The consensus on emacs-devel seems to be to do this via
+   integer identifiers.  That's fine by me.)
+
+   (Done.)
+
+-- The following needs to be supported:
+
+       $ emacsclient -t
+               C-z
+       $ emacsclient -t
+               (This fails now.)
+
+   The cleanest way to solve this is to allow multiple displays on the
+   same terminal device; each new emacsclient process should create
+   its own display.  As displays are currently identified by their
+   device names, this is not possible until struct display becomes
+   accessible as a Lisp-level object.
+
+   (Done.)
+
+-- Miles Bader suggests that C-x C-c on an emacsclient frame should
+   only close the frame, not exit the entire Emacs session.  Update:
+   see above for a function that does this.  Maybe this should be the
+   new default?  
+
+   (Done.  This is the new default.  No complaints so far.)
+
+-- Clean up the frame-local variable system.  I think it's ugly and
+   error-prone.  But maybe I just haven't yet fully understood it.
+
+   (Nothing to do.  It doesn't seem ugly any more.  It's rather clever.)
+
+-- Support multiple character locales.  A version of
+   `set-locale-environment' needs to be written for setting up
+   display-local settings on ttys.  I think calling
+   set-display-table-and-terminal-coding-system and
+   set-keyboard-coding-system would be enough.  The language
+   environment itself should remain a global setting.
+
+   (Done, by an ugly hack.)
+
+-- The terminal customization files in term/*.el tend to change global
+   parameters, which may confuse Emacs with multiple displays.  Change
+   them to tweak only frame-local settings, if possible.  (They tend
+   to call define-key to set function key sequences a lot.)
+
+   (Done, by making `function-key-map' terminal-local (i.e., part of
+   struct kboard).  This has probably covered all the remaining problems.)
+
+-- Make `function-key-map' and `key-translation-map' terminal-local.
+
+   (Done.)
+
+-- Implement `terminal-local-value' and `set-terminal-local-value' to
+   allow deterministic access to terminal local bindings.  The
+   encode-kb package can not set up `key-translation-map' without
+   these.  The terminal-local bindings seem to be independent of what
+   frame is selected.
+
+   (Done.)
+
+-- xt-mouse.el needs to be adapted for multi-tty.  It currently
+   signals an error on kill-emacs under X, which prevents the user
+   from exiting Emacs. (Reported by Mnemonikk on freenode.)
+
+   (Done, I hope.)
+   
+
+-- Having {reset,init}_all_sys_modes in set-input-mode breaks arrow
+   keys on non-selected terminals under screen, and sometimes on other
+   terminal types as well.  The other function keys continue to work
+   fine.  Sometimes faces on these screens become garbled.
 
+   This only seems to affect displays that are of the same terminfo
+   type as the selected one. Interestingly, in screen Emacs normally
+   reports the up arrow key as `M-o A', but after the above SNAFU, it
+   complains about `M-[ a'.  UNIX ttys are a complete mystery to me,
+   but it seems the reset-reinitialize cycle somehow leaves the
+   non-selected terminals in a different state than usual.  I have no
+   idea how this could happen.
+
+   Currently set-input-mode resets only the currently selected
+   terminal, which seems to somehow work around the problem.
+
+   Update:
+
+       Dan Nicolaescu <dann@ics.uci.edu> writes:
+       > Some terminals have 2 modes for cursor keys: Application Mode where
+       > the cursor keys transmit the codes defined in the terminfo entry, and
+       > Cursor mode. Applications have to send the smkx and rmkx terminfo
+       > strings to switch between the 2 modes. So Emacs (and emacsclient) have
+       > to send smkx when initializing and rmkx when quitting (or on
+       > suspend). 
+
+   (I think patch-370 fixed this.)
+
+-- This long-standing bug (first reported by Han Boetes) seems to come
+   and go all the time.  It is time to track it down and fix it.
+
+       emacs
+               M-x server-start
+       
+       # From another xterm:
+       emacsclient -e '(y-or-n-p "Do you want me to crash? ")'
+               # Notice how the answer ends up in the *scratch* buffer
+               M-x garbage-collect
+               SIGSEGV
+
+   (Fixed in patch-414 after detailed analysis by Kalle Olavi Niemitalo.)
+
+-- normal-erase-is-backspace-mode in simple.el needs to be updated for
+   multi-tty (rep. by Dan Waber).  (The Delete key is broken on X
+   because of this.)
+
+   (Fixed in patch-427.)
+
+-- I think keyboard-translate-table should be made terminal-local.
+
+   (Done in patch-431.)
+
+-- The semantics of terminal-local variables are confusing; it is not
+   clear what binding is in effect in any given time.  See if
+   current_kboard (or at least the terminal-local bindings exported to
+   Lisp) might be changed to be tied to the selected frame instead.
+   Currently, `function-key-map' and `key-translation-map' may be
+   accessed reliably only using the hackish
+   `(set-)terminal-local-value' functions.
+
+   Perhaps there should be a difference between `last-command' &co.
+   and these more conventional configuration variables.
+   (E.g. `symbol-value' would use current_kboard to access
+   `last-command', but SELECTED_FRAME()->display->kboard to get the
+   value of `function-key-map'.
+
+   (Fixed in patch-434.)
+
+-- If the first key pressed on a new tty terminal is a function key,
+   it is not recognized correctly.  May be related to the bug below.
+
+   (Seems to have been fixed as a side effect of patch-434.  "The bug
+   below" was the set-input-mode madness.)  
+
+   (Update: this bug was fixed for good in patch-449.  It was tracked
+   down to a bug in `read_key_sequence': it failed to reinitialize its
+   local function-key-map/key-translation-map references when it
+   switched keyboards.  I don't understand why did this bug only
+   appear on brand new frames, though!)
+
+-- Disable connecting to a new X display when we use the GTK toolkit.
+
+   (Disabled in patch-450.)
+
+-- Implement automatic forwarding of client environment variables to
+   forked processes, as discussed on the multi-tty list.  Terminal
+   parameters are now accessible in C code, so the biggest obstacle is
+   gone.  The `getenv_internal' and `child_setup' functions in
+   callproc.c must be changed to support the following variable:
+
+       terminal-local-environment-variables is a variable defined in ...
+
+       Enable or disable terminal-local environment variables.
+
+       If set to t, `getenv', `setenv' and subprocess creation
+       functions use the environment variables of the emacsclient
+       process that created the selected frame, ignoring
+       `process-environment'.
+
+       If set to nil, Emacs uses `process-environment' and ignores
+       the client environment.
+
+       Otherwise, `terminal-local-environment-variables' should be a
+       list of variable names (represented by Lisp strings) to look
+       up in the client environment.  The rest will come from
+       `process-environment'.
+
+   (Implemented in patch-461; `terminal-getenv', `terminal-setenv' and
+   `with-terminal-environment' are now replaced by extensions to
+   `getenv' and `setenv', and the new `local-environment-variables'
+   facility.  Yay!)
+
+   (Updated in patch-465 to fix the semantics of let-binding
+   `process-environment'.  `process-environment' was changed to
+   override all local/global environment variables, and a new variable
+   `global-environment' was introduced to have `process-environment's
+   old meaning.)
+
+   (Updated in patch-466 to fix the case when two emacsclient sessions
+   share the same terminal, but have different environment.  The local
+   environment lists are now stored as frame parameters, so the
+   C-level terminal parameters are not strictly necessary any more.)
 
 ;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
+