Merged from miles@gnu.org--gnu-2005 (patch 656-658)
[bpt/emacs.git] / README.multi-tty
index bae8eb1..ab43fc7 100644 (file)
@@ -31,26 +31,28 @@ The following is a (sadly incomplete) list of people who have
 contributed to the project by testing, submitting patches, bug
 reports, and suggestions.  Thanks!
 
-ARISAWA Akihiro <ari at mbf dot ocn dot ne dot jp>
-Vincent Bernat <bernat at luffy dot cx>
-Han Boetes <han at mijncomputer dot nl>
-Robert J. Chassell <bob at rattlesnake dot com>
-Romain Francoise <romain at orebokech dot com>
-Ami Fischman <ami at fischman dot org>
-Friedrich Delgado Friedrichs <friedel at nomaden dot org>
-IRIE Tetsuya <irie at t dot email dot ne dot jp>
-Yoshiaki Kasahara <kasahara at nc dot kyushu-u dot ac dot jp>
-Jurej Kubelka <Juraj dot Kubelka at email dot cz>
-David Lichteblau <david at lichteblau dot com>
-Xavier Mallard <zedek at gnu-rox dot org>
-Istvan Marko <mi-mtty at kismala dot com>
-Ted Morse <morse at ciholas 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>
-Dan Waber <dwaber at logolalia dot com>
+ARISAWA Akihiro <ari@mbf.ocn.ne.jp>
+Vincent Bernat <bernat@luffy.cx>
+Han Boetes <han@mijncomputer.nl>
+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>
+Francisco Borges <borges@let.rug.nl>
+Frank Ruell <stoerte@dreamwarrior.net>
+Dan Waber <dwaber@logolalia.com>
 and many others.
 
 Richard Stallman was kind enough to review an earlier version of my
@@ -95,6 +97,7 @@ Known problems:
 
         * GTK support.  If you compile your Emacs with the GTK
           toolkit, some functionality of multi-tty will be lost.
+         In particular, closing an X display causes a crash.
           Current releases of GTK have limitations and bugs that
           prevent full-blown multi-display support in Emacs.  Use the
           Lucid toolkit if you want to see a complete feature set.
@@ -257,75 +260,84 @@ 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 functions to handle my Emacs sessions:
-
-,----[ ~/.bash_profile
-| # 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.
-| function preload-emacs {
-|     local name="$1"
-|     local waitp="$2"
-|     local screendir="/var/run/screen/S-$USER"
-|     local serverdir="/tmp/emacs$UID"
-|     local emacs=emacs # Or wherever you installed your multi-tty Emacs
-| 
-|     if [ -z "$name" ]; then 
-|      echo "Usage: preload-emacs <name> [<waitp>]" >&2
-|      return 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
-|     return 0
-| }
-| 
-| # 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.
-| function connect-emacs {
-|     local name="$1"
-|     shift
-|     
-|     if [ -z "$name" ]; then
-|      echo "Usage: connect-emacs <name> <args>..." >&2
-|     fi
-|     preload-emacs "$name" wait
-|     emacsclient -s "$name" "$@"
-| }
-| 
-| export -f preload-emacs connect-emacs
-|
-| # Preload editor and gnus sessions for speedy initial connects.
-| preload-emacs editor
-| preload-emacs gnus
-`----
-
-,----[ ~/.bashrc
-| alias gnus="connect-emacs gnus"
-| alias edit="connect-emacs editor"
-| alias et="connect-emacs editor -t"
-| alias e=edit
-`----
+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"
+
+
+CHANGELOG
+---------
+
+See arch logs.
 
 
 NEWS
 ----
 
-For the NEWS file:  (Needs work)
+For the NEWS file:  (Needs much, much work)
 
 ** Support for multiple terminal devices has been added.
 
@@ -343,12 +355,16 @@ For the NEWS file:  (Needs work)
 *** A make-frame-on-tty function has been added to make it easier to
     create frames on new terminals.
 
-*** New functions: frame-tty-name, frame-tty-type for accessing
-    terminal parameters, and delete-tty for closing the terminal
-    device.
+*** New functions: frame-tty-name, frame-tty-type, delete-tty,
+    terminal-local-value, set-terminal-local-value
 
-*** talk.el has been extended for multiple tty support.
+    terminal-id, terminal-parameters, terminal-parameter,
+    set-terminal-parameter
+
+*** New variables: global-key-translation-map
 
+*** The keymaps key-translation-map and function-key-map are now
+    terminal-local.
 
 ** Support for simultaneous graphical and terminal frames has been
    added.
@@ -361,10 +377,8 @@ For the NEWS file:  (Needs work)
 *** The new `initial-window-system' variable contains the
     `window-system' value for the first frame.
 
-CHANGELOG
----------
+*** talk.el has been extended for multiple tty support.
 
-See arch logs.
 
 * * *
 
@@ -374,6 +388,87 @@ is probably not very interesting for anyone else.)
 THINGS TO DO
 ------------
 
+** Report GTK multi-display problems to GTK maintainers.  For extra
+   credit, fix them.
+
+** Possibly turn off the double C-g feature when there is an X frame.
+   C.f. (emacs)Emergency Escape.
+
+** 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.)
+
+** I think `(set-)terminal-local-value' and the terminal parameter
+   mechanism should be integrated into a single framework.
+
+** 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)?
+
+** 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
+   can be renamed without aliases:
+
+    display-controlling-tty-p           terminal-controlling-tty-p
+    display-list                        terminal-list
+    display-live-p                      terminal-live-p
+    display-name                        terminal-name
+    display-tty-type                    terminal-tty-type
+    frame-display                       terminal-of-frame
+    delete-display                     delete-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
@@ -383,21 +478,46 @@ THINGS TO DO
    Update: selecting a region with the mouse enables single_kboard
    under X.  This is very confusing.
 
-   Update: After discussions with Richard, 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.
+   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.
 
    Update: Warning the user is not trivial to implement, as Emacs has
-   only one echo area.  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.
-
-** normal-erase-is-backspace-mode in simple.el needs to be updated for
-   multi-tty (rep. by Dan Waber).
+   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.
+
+** 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:
+
+       #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
+
+   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.
+
+   See if xsmfns.c should be updated.
 
 ** Hunt down display-related functions in frame.el and extend them all
    to accept display ids.
@@ -405,6 +525,24 @@ THINGS TO DO
 ** rif->flush_display_optional (NULL) calls should be replaced by a
    new global function.
 
+** The set-locale-environment hack (adding the DISPLAY option) should
+   be replaced with a clean design.
+
+** standard-display-table should be display-local.
+   standard-display-european should be display-local.
+
+** With iswitchb-default-method set to 'always-frame, only frames on
+   the current display should be considered.  This might involve
+   extending `get-buffer-window'.
+
+** 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.
+
+   Exceptions found so far: x-select-text and
+   x-cut-buffer-or-selection-value.
+
 ** Have a look at fatal_error_hook.
 
 ** Have a look at set_frame_matrix_frame.
@@ -423,14 +561,6 @@ THINGS TO DO
 
    (This is likely an error in the CVS trunk.)
 
-** 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)?
-
-** 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.
-
 ** 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''
@@ -449,9 +579,6 @@ THINGS TO DO
    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
@@ -482,7 +609,9 @@ THINGS TO DO
    that's why raw terminal support is broken again.  I really do need
    to understand input.)
 
-** Maybe standard-display-table should be display-local.
+** flow-ctrl.el must be updated.
+
+** Fix stuff_char for multi-tty.  Doesn't seem to be of high priority.
 
 DIARY OF CHANGES
 ----------------
@@ -963,7 +1092,7 @@ DIARY OF CHANGES
 
    (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:
 
@@ -1022,5 +1151,120 @@ DIARY OF CHANGES
 
    (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.)
 
 ;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
+