diff options
| author | Glenn Morris | 2007-08-30 05:12:25 +0000 |
|---|---|---|
| committer | Glenn Morris | 2007-08-30 05:12:25 +0000 |
| commit | 9b62c83fe0e382be404036cbfff6bdebbc025130 (patch) | |
| tree | 57a85357f15d8266461d5c220a4c3462a5b60c12 | |
| parent | e1b79824db0b5cc40cdc61ff268a1ec526c54bc0 (diff) | |
| download | emacs-9b62c83fe0e382be404036cbfff6bdebbc025130.tar.gz emacs-9b62c83fe0e382be404036cbfff6bdebbc025130.zip | |
Move here from top-level README.multi-tty, with some edits for
information made out-of-date by merge to trunk.
| -rw-r--r-- | admin/notes/multi-tty | 1362 |
1 files changed, 1362 insertions, 0 deletions
diff --git a/admin/notes/multi-tty b/admin/notes/multi-tty new file mode 100644 index 00000000000..5895f59bddc --- /dev/null +++ b/admin/notes/multi-tty | |||
| @@ -0,0 +1,1362 @@ | |||
| 1 | -*- coding: utf-8; mode: text; -*- | ||
| 2 | |||
| 3 | From README.multi-tty in the multi-tty branch. | ||
| 4 | Some of this information may be out of date. | ||
| 5 | |||
| 6 | |||
| 7 | THANKS | ||
| 8 | ------ | ||
| 9 | |||
| 10 | The following is a (sadly incomplete) list of people who have | ||
| 11 | contributed to the project by testing, submitting patches, bug | ||
| 12 | reports, and suggestions. Thanks! | ||
| 13 | |||
| 14 | Bernard Adrian <bernadrian@free.fr> | ||
| 15 | ARISAWA Akihiro <ari@mbf.ocn.ne.jp> | ||
| 16 | Vincent Bernat <bernat@luffy.cx> | ||
| 17 | Han Boetes <han@mijncomputer.nl> | ||
| 18 | Francisco Borges <borges@let.rug.nl> | ||
| 19 | Damien Cassou <damien.cassou@laposte.net> | ||
| 20 | Robert J. Chassell <bob@rattlesnake.com> | ||
| 21 | Romain Francoise <romain@orebokech.com> | ||
| 22 | Ami Fischman <ami@fischman.org> | ||
| 23 | Noah Friedman <friedman@splode.com> | ||
| 24 | Friedrich Delgado Friedrichs <friedel@nomaden.org> | ||
| 25 | Samium Gromoff <_deepfire@mail.ru> | ||
| 26 | Mikhail Gusarov <dottedmag@dottedmag.net> | ||
| 27 | Eric Hanchrow <offby1@blarg.net> | ||
| 28 | IRIE Tetsuya <irie@t.email.ne.jp> | ||
| 29 | Yoshiaki Kasahara <kasahara@nc.kyushu-u.ac.jp> | ||
| 30 | Bas Kok <nekkobassu@yahoo.com> | ||
| 31 | Jurej Kubelka <Juraj.Kubelka@email.cz> | ||
| 32 | David Lichteblau <david@lichteblau.com> | ||
| 33 | Richard Lewis <rtf@jabble.com> | ||
| 34 | mace <mace@kirjakaapeli.lib.hel.fi> | ||
| 35 | Suresh Madhu <madhu@cs.unm.edu> | ||
| 36 | Xavier Mallard <zedek@gnu-rox.org> | ||
| 37 | Istvan Marko <mi-mtty@kismala.com> | ||
| 38 | Ted Morse <morse@ciholas.com> | ||
| 39 | Gergely Nagy <algernon@debian.org> | ||
| 40 | Dan Nicolaescu <dann@ics.uci.edu> | ||
| 41 | Kalle Olavi Niemitalo <kon@iki.fi> | ||
| 42 | Mark Plaksin <happy@mcplaksin.org> | ||
| 43 | Frank Ruell <stoerte@dreamwarrior.net> | ||
| 44 | Tom Schutzer-Weissmann <trmsw@yahoo.co.uk> | ||
| 45 | Joakim Verona <joakim@verona.se> | ||
| 46 | Dan Waber <dwaber@logolalia.com> | ||
| 47 | and many others. | ||
| 48 | |||
| 49 | Richard Stallman was kind enough to review an earlier version of my | ||
| 50 | patches. | ||
| 51 | |||
| 52 | |||
| 53 | STATUS | ||
| 54 | ------ | ||
| 55 | |||
| 56 | It still needs to be ported to Windows/Mac/DOS. Both multiple | ||
| 57 | tty device support and simultaneous X and tty frame support works | ||
| 58 | fine. Emacsclient has been extended to support opening new tty and X | ||
| 59 | frames. It has been changed to open new Emacs frames by default. | ||
| 60 | |||
| 61 | Tested on GNU/Linux, Solaris 8, FreeBSD and OpenBSD. | ||
| 62 | |||
| 63 | Known problems: | ||
| 64 | |||
| 65 | * GTK support. If you compile your Emacs with the GTK | ||
| 66 | toolkit, some functionality of multi-tty may be lost. In | ||
| 67 | particular, you may get crashes while working on multiple X | ||
| 68 | displays at once. Previous releases of GTK had limitations | ||
| 69 | and bugs that prevented full-blown multi-display support in | ||
| 70 | Emacs. (GTK crashed when Emacs tries to disconnect from an | ||
| 71 | X server.) Things are much improved in the current GTK | ||
| 72 | version, but if you do experience crashes in libgtk, try | ||
| 73 | compiling Emacs with the Lucid toolkit instead. | ||
| 74 | |||
| 75 | * The single-kboard mode. | ||
| 76 | |||
| 77 | If your multi-tty Emacs session seems to be frozen, you | ||
| 78 | probably have a recursive editing session or a pending | ||
| 79 | minibuffer prompt (which is a kind of recursive editing) on | ||
| 80 | another display. To unfreeze your session, switch to that | ||
| 81 | display and complete the recursive edit, for example by | ||
| 82 | pressing C-] (`abort-recursive-edit'). | ||
| 83 | |||
| 84 | I am sorry to say that currently there is no way to break | ||
| 85 | out of this "single-kboard mode" from a frozen display. If | ||
| 86 | you are unable to switch to the display that locks the | ||
| 87 | others (for example because it is on a remote computer), | ||
| 88 | then you can use emacsclient to break out of all recursive | ||
| 89 | editing sessions: | ||
| 90 | |||
| 91 | emacsclient -e '(top-level)' | ||
| 92 | |||
| 93 | Note that this (perhaps) unintuitive behaviour is by design. | ||
| 94 | Single-kboard mode is required because of an intrinsic Emacs | ||
| 95 | limitation that is very hard to eliminate. (This limitation | ||
| 96 | is related to the single-threaded nature of Emacs.) | ||
| 97 | |||
| 98 | I plan to implement better user notification and support for | ||
| 99 | breaking out of single-kboard mode from locked displays. | ||
| 100 | |||
| 101 | * Mac and DOS support is broken, doesn't even | ||
| 102 | compile. Multiple display support will probably not provide | ||
| 103 | new Emacs features on these systems, but the multi-tty | ||
| 104 | branch changed a few low-level interfaces, and the | ||
| 105 | system-dependent source files need to be adapted | ||
| 106 | accordingly. The changes are mostly trivial, so almost | ||
| 107 | anyone can help, if only by compiling the branch and | ||
| 108 | reporting the compiler errors. | ||
| 109 | |||
| 110 | |||
| 111 | TESTING | ||
| 112 | ------- | ||
| 113 | |||
| 114 | To test the multi-tty feature, start up the Emacs server with the | ||
| 115 | following commands: | ||
| 116 | |||
| 117 | emacs | ||
| 118 | M-x server-start | ||
| 119 | |||
| 120 | and then (from a shell prompt on another terminal) start emacsclient | ||
| 121 | with | ||
| 122 | emacsclient -t /optional/file/names... (for a tty frame) | ||
| 123 | emacsclient /optional/file/names... (for an X frame) | ||
| 124 | |||
| 125 | (Make sure both emacs and emacsclient are multi-tty versions.) | ||
| 126 | You'll hopefully have two fully working, independent frames on | ||
| 127 | separate terminals. The new frame is closed automatically when you | ||
| 128 | finish editing the specified files (C-x #), but delete-frame (C-x 5 0) | ||
| 129 | also works. Of course, you can create frames on more than two tty | ||
| 130 | devices. | ||
| 131 | |||
| 132 | Creating new frames on the same tty with C-x 5 2 (make-frame-command) | ||
| 133 | works, and behaves the same way as in previous Emacs versions. If you | ||
| 134 | exit emacs, all terminals should be restored to their previous states. | ||
| 135 | |||
| 136 | TIPS & TRICKS | ||
| 137 | ------------- | ||
| 138 | |||
| 139 | I think the best way to use the new Emacs is to have it running inside | ||
| 140 | a disconnected GNU screen session, and always use emacsclient for | ||
| 141 | normal work. One advantage of this is that not a single keystroke of | ||
| 142 | your work will be lost if the display device that you are using | ||
| 143 | crashes, or the network connection times out, or whatever. (I had an | ||
| 144 | extremely unstable X server for some time while I was developing these | ||
| 145 | patches, and running Emacs this way has saved me a number of M-x | ||
| 146 | recover-session invocations.) | ||
| 147 | |||
| 148 | I use the following two bash scripts to handle my Emacs sessions: | ||
| 149 | |||
| 150 | -------------------------------------------------------connect-emacs-- | ||
| 151 | #!/bin/bash | ||
| 152 | # Usage: connect-emacs <name> <args>... | ||
| 153 | # | ||
| 154 | # Connects to the Emacs instance called NAME. Starts up the instance | ||
| 155 | # if it is not already running. The rest of the arguments are passed | ||
| 156 | # to emacsclient. | ||
| 157 | |||
| 158 | name="$1" | ||
| 159 | shift | ||
| 160 | |||
| 161 | if [ -z "$name" ]; then | ||
| 162 | echo "Usage: connect_emacs <name> <args>..." >&2 | ||
| 163 | exit 1 | ||
| 164 | fi | ||
| 165 | preload-emacs "$name" wait | ||
| 166 | /usr/bin/emacsclient.emacs-multi-tty -s "$name" "$@" | ||
| 167 | ---------------------------------------------------------------------- | ||
| 168 | |||
| 169 | -------------------------------------------------------preload-emacs-- | ||
| 170 | #!/bin/bash | ||
| 171 | # Usage: preload-emacs <name> [<waitp>] | ||
| 172 | # | ||
| 173 | # Preloads the Emacs instance called NAME in a detached screen | ||
| 174 | # session. Does nothing if the instance is already running. If WAITP | ||
| 175 | # is non-empty, the function waits until the server starts up and | ||
| 176 | # creates its socket; otherwise it returns immediately. | ||
| 177 | |||
| 178 | name="$1" | ||
| 179 | waitp="$2" | ||
| 180 | screendir="/var/run/screen/S-$USER" | ||
| 181 | serverdir="/tmp/emacs$UID" | ||
| 182 | emacs=/usr/bin/emacs-multi-tty # Or wherever you installed your multi-tty Emacs | ||
| 183 | |||
| 184 | if [ -z "$name" ]; then | ||
| 185 | echo "Usage: preload_emacs <name> [<waitp>]" >&2 | ||
| 186 | exit 1 | ||
| 187 | fi | ||
| 188 | |||
| 189 | if [ ! -e "$screendir"/*."$name" ]; then | ||
| 190 | if [ -e "$serverdir/$name" ]; then | ||
| 191 | # Delete leftover socket (for the wait option) | ||
| 192 | rm "$serverdir/$name" | ||
| 193 | fi | ||
| 194 | screen -dmS "$name" "$emacs" -nw --eval "(setq server-name \"$name\")" -f server-start | ||
| 195 | fi | ||
| 196 | if [ ! -z "$waitp" ]; then | ||
| 197 | while [ ! -e "$serverdir/$name" ]; do sleep 0.1; done | ||
| 198 | fi | ||
| 199 | ---------------------------------------------------------------------- | ||
| 200 | |||
| 201 | I have the following in my profile to have two instances automatically | ||
| 202 | preloaded for editing and email: | ||
| 203 | |||
| 204 | preload-emacs editor | ||
| 205 | preload-emacs gnus | ||
| 206 | |||
| 207 | It is useful to set up short aliases for connect-emacs. I use the | ||
| 208 | following: | ||
| 209 | |||
| 210 | alias edit="connect-emacs editor" | ||
| 211 | alias e=edit | ||
| 212 | alias et="connect-emacs editor -t" | ||
| 213 | alias gnus="connect-emacs gnus" | ||
| 214 | |||
| 215 | |||
| 216 | THINGS TO DO | ||
| 217 | ------------ | ||
| 218 | |||
| 219 | ** See if `tty-defined-color-alist' needs to be terminal-local. | ||
| 220 | Update: Dan says it should be, so convert it. | ||
| 221 | |||
| 222 | ** Mikhail Gusarov suggest to add a hook akin to | ||
| 223 | `after-make-frame-functions' that is called whenever Emacs connects | ||
| 224 | to a new terminal. Good idea! | ||
| 225 | |||
| 226 | ** emacsclient -t on the console does not work after su. You have to | ||
| 227 | use non-root accounts or start as root to see this. | ||
| 228 | |||
| 229 | Login: root | ||
| 230 | Password: | ||
| 231 | # su lorentey | ||
| 232 | $ emacsclient -t | ||
| 233 | *ERROR*: Could not open file: /dev/tty1 | ||
| 234 | |||
| 235 | The tty can be opened as /dev/tty by emacsclient, but not by Emacs. | ||
| 236 | This seems to be a serious problem. Currently my only idea is to | ||
| 237 | bring back the ugly pty proxy hack from the initial versions of | ||
| 238 | multi-tty. Suggestions would be appreciated. | ||
| 239 | |||
| 240 | Update: we could change emacsclient to pass its open file | ||
| 241 | descriptor to the Emacs process. Unfortunately, this requires a | ||
| 242 | new Lisp-level Emacs API, and as file descriptors are not otherwise | ||
| 243 | exported to Lisp, this approach seems at least as ugly as the pty | ||
| 244 | proxy idea. | ||
| 245 | |||
| 246 | ** lisp/vc.el depends on the terminal type during load time. | ||
| 247 | `vc-annotate-color-map' is one example that needs to be fixed. | ||
| 248 | |||
| 249 | ** Understand how `quit_throw_to_read_char' works, and fix any bugs | ||
| 250 | that come to light. | ||
| 251 | |||
| 252 | ** See if getcjmp can be eliminated somehow. Why does Emacs allow | ||
| 253 | asynchronous input processing while it's reading input anyway? | ||
| 254 | |||
| 255 | ** `delete-frame' events are handled by `special-event-map' | ||
| 256 | immediately when read by `read_char'. This is fine but it prevents | ||
| 257 | higher-level keymaps from binding that event to get notified of the | ||
| 258 | deleted frame. | ||
| 259 | |||
| 260 | Sometimes it would be useful for Lisp code to be notified of frame | ||
| 261 | deletions after they have happened, usually because they want to | ||
| 262 | clean up after the deleted frame. Not all frame-local states can | ||
| 263 | be stored as a frame parameter. For example, | ||
| 264 | `display-splash-screen' uses `recursive-edit' with a special keymap | ||
| 265 | override to create its buffer---and it leads to all kinds of | ||
| 266 | nastiness if Emacs stays in this recursive edit mode after the | ||
| 267 | frame containing the splash screen is deleted. Basically, the | ||
| 268 | splash-screen implementation wants to throw out of the recursive | ||
| 269 | edit when the frame is deleted; however, it is not legal to throw | ||
| 270 | from `delete-frame-functions' because `delete-frame' must not fail. | ||
| 271 | (Introducing `delete-frame-after-functions' would not help either | ||
| 272 | because `delete-frame' may not fail at that time either.) | ||
| 273 | |||
| 274 | Currently `fancy-splash-screens' installs a | ||
| 275 | `delete-frame-functions' hook that sets up a timer to exit the | ||
| 276 | recursive edit. This is an adequate solution, but it would perhaps | ||
| 277 | be better to have something like a `frame-deleted' event that could | ||
| 278 | be bound in the normal way. | ||
| 279 | |||
| 280 | ** Trouble: `setenv' doesn't actually set environment variables in the | ||
| 281 | Emacs process. This defeats the purpose of the elaborate | ||
| 282 | `server-with-environment' magic around the `tgetent' call in | ||
| 283 | `init_tty'. D'oh. | ||
| 284 | |||
| 285 | ** (Possibly) create hooks in struct device for creating frames on a | ||
| 286 | specific terminal, and eliminate the hackish terminal-related frame | ||
| 287 | parameters (display, tty, tty-type). | ||
| 288 | |||
| 289 | make_terminal_frame | ||
| 290 | create_tty_output | ||
| 291 | |||
| 292 | ** Decide whether to keep the C implementation of terminal parameters, | ||
| 293 | or revert to the previous, purely Lisp code. It turned out that | ||
| 294 | local environments do not need terminal parameters after all. | ||
| 295 | |||
| 296 | ** Move Fsend_string_to_terminal to term.c, and declare get_named_tty | ||
| 297 | as static, removing it from dispextern.h. | ||
| 298 | Move fatal to emacs.c and declare it somewhere. | ||
| 299 | |||
| 300 | ** Search for `suspend-emacs' references and replace them with | ||
| 301 | `suspend-frame', if necessary. Ditto for `save-buffers-kill-emacs' | ||
| 302 | vs. `save-buffers-kill-display'. | ||
| 303 | |||
| 304 | ** Emacs crashes when a tty frame is resized so that there is no space | ||
| 305 | for all its windows. (Tom Schutzer-Weissmann) | ||
| 306 | |||
| 307 | ** Report GTK multi-display problems to GTK maintainers. For extra | ||
| 308 | credit, fix them. | ||
| 309 | |||
| 310 | Currently you can not connect to new X displays when you compile | ||
| 311 | Emacs with GTK support. If you want to play around with GTK | ||
| 312 | multidisplay (and don't mind core dumps), you can edit src/config.h | ||
| 313 | and define HAVE_GTK_MULTIDISPLAY there by hand. | ||
| 314 | |||
| 315 | http://bugzilla.gnome.org/show_bug.cgi?id=85715 | ||
| 316 | |||
| 317 | Update: Han reports that GTK+ version 2.8.9 almost gets display | ||
| 318 | disconnects right. GTK will probably be fully fixed by the time | ||
| 319 | multi-tty gets into the trunk. | ||
| 320 | |||
| 321 | Update: I am still having problems with GTK+ 2.8.10. I have the | ||
| 322 | impression that the various multidisplay fixes will only get | ||
| 323 | released in GTK+ 2.10. | ||
| 324 | |||
| 325 | ** Audit `face-valid-attribute-values' usage in customize and | ||
| 326 | elsewhere. Its return value depends on the current window system. | ||
| 327 | Replace static initializers using it with runtime functions. For | ||
| 328 | example, custom's buttons are broken on non-initial device types. | ||
| 329 | |||
| 330 | ** Possibly turn off the double C-g feature when there is an X frame. | ||
| 331 | C.f. (emacs)Emergency Escape. | ||
| 332 | |||
| 333 | ** frames-on-display-list should also accept frames. | ||
| 334 | |||
| 335 | ** Consider the `tty-type' frame parameter and the `display-tty-type' | ||
| 336 | function. They serve the exact same purpose. I think it may be | ||
| 337 | a good idea to eliminate one of them, preferably `tty-type'. | ||
| 338 | |||
| 339 | ** The handling of lisp/term/*.el, and frame creation in general, is a | ||
| 340 | big, big mess. How come the terminal-specific file is loaded by | ||
| 341 | tty-create-frame-with-faces? I don't think it is necessary to load | ||
| 342 | these files for each frame; once per terminal should be enough. | ||
| 343 | Update: lisp/term/*.el is not loaded repeatedly anymore, but | ||
| 344 | faces.el still needs to be cleaned up. | ||
| 345 | |||
| 346 | ** Fix frame-set-background-mode in this branch. It was recently | ||
| 347 | changed in CVS, and frame.el in multi-tty has not yet been adapted | ||
| 348 | for the changes. (It needs to look at | ||
| 349 | default-frame-background-mode.) (Update: maybe it is fixed now; | ||
| 350 | needs testing.) (Note that the byte compiler has this to say about | ||
| 351 | term/rxvt.el:) | ||
| 352 | |||
| 353 | term/rxvt.el:309:17:Warning: assignment to free variable | ||
| 354 | `default-frame-background-mode' | ||
| 355 | |||
| 356 | ** I think `(set-)terminal-local-value' and the terminal parameter | ||
| 357 | mechanism should be integrated into a single framework. | ||
| 358 | |||
| 359 | (Update: `(set-)terminal-local-value' is now eliminated, but the | ||
| 360 | terminal-local variables should still be accessible as terminal | ||
| 361 | parameters. This also applies to `display-name' and similar | ||
| 362 | functions.) | ||
| 363 | |||
| 364 | ** Add the following hooks: after-delete-frame-hook (for server.el, | ||
| 365 | instead of delete-frame-functions), | ||
| 366 | after-delete-terminal-functions, after-create-terminal-functions. | ||
| 367 | |||
| 368 | ** BULK RENAME: The `display-' prefix of new Lisp-level functions | ||
| 369 | conflicts with stuff like `display-time-mode'. Use `device-' | ||
| 370 | or `terminal-' instead. I think I prefer `terminal-'. | ||
| 371 | |||
| 372 | It turns out that most of the offending Lisp functions were defined | ||
| 373 | in the trunk. Therefore, compatibility aliases should be defined | ||
| 374 | for the following names: | ||
| 375 | |||
| 376 | display-color-cells terminal-color-cells | ||
| 377 | display-color-p terminal-color-p | ||
| 378 | display-graphic-p terminal-graphic-p | ||
| 379 | display-grayscale-p terminal-grayscale-p | ||
| 380 | display-images-p terminal-images-p | ||
| 381 | display-mm-height terminal-mm-height | ||
| 382 | display-mm-width terminal-mm-width | ||
| 383 | display-mouse-p terminal-mouse-p | ||
| 384 | display-multi-font-p terminal-multi-font-p | ||
| 385 | display-multi-frame-p terminal-multi-frame-p | ||
| 386 | display-pixel-height terminal-pixel-height | ||
| 387 | display-pixel-width terminal-pixel-width | ||
| 388 | display-pixels-per-inch terminal-pixels-per-inch | ||
| 389 | display-planes terminal-planes | ||
| 390 | display-popup-menus-p terminal-popup-menus-p | ||
| 391 | display-save-under terminal-save-under | ||
| 392 | display-screens terminal-screens | ||
| 393 | display-supports-face-attributes-p terminal-supports-face-attributes-p | ||
| 394 | display-visual-class terminal-visual-class | ||
| 395 | framep-on-display framep-on-terminal | ||
| 396 | frames-on-display-list frames-on-terminal-list | ||
| 397 | |||
| 398 | The following functions were introduced in the multi-tty branch, and | ||
| 399 | were renamed without aliases: | ||
| 400 | |||
| 401 | delete-display delete-terminal | ||
| 402 | display-controlling-tty-p controlling-tty-p | ||
| 403 | display-list terminal-list | ||
| 404 | display-live-p terminal-live-p | ||
| 405 | display-name terminal-name | ||
| 406 | display-tty-type tty-type | ||
| 407 | frame-display frame-terminal | ||
| 408 | selected-display selected-terminal | ||
| 409 | |||
| 410 | ** The single-keyboard mode of MULTI_KBOARD is extremely confusing | ||
| 411 | sometimes; Emacs does not respond to stimuli from other keyboards. | ||
| 412 | At least a beep or a message would be important, if the single-mode | ||
| 413 | is still required to prevent interference. (Reported by Dan | ||
| 414 | Nicolaescu.) | ||
| 415 | |||
| 416 | Update: selecting a region with the mouse enables single_kboard | ||
| 417 | under X. This is very confusing. | ||
| 418 | |||
| 419 | Update: After discussions with Richard Stallman, this will be | ||
| 420 | resolved by having locked displays warn the user to wait, and | ||
| 421 | introducing a complex protocol to remotely bail out of | ||
| 422 | single-kboard mode by pressing C-g. | ||
| 423 | |||
| 424 | Update: Warning the user is not trivial to implement, as Emacs has | ||
| 425 | only one echo area, shared by all frames. Ideally the warning | ||
| 426 | should not be displayed on the display that is locking the others. | ||
| 427 | Perhaps the high probability of user confusion caused by | ||
| 428 | single_kboard mode deserves a special case in the display code. | ||
| 429 | Alternatively, it might be good enough to signal single_kboard mode | ||
| 430 | by changing the modelines or some other frame-local display element | ||
| 431 | on the locked out displays. | ||
| 432 | |||
| 433 | Update: In fact struct kboard does have an echo_string slot. | ||
| 434 | |||
| 435 | ** The session management module is prone to crashes when the X | ||
| 436 | connection is closed and then later I try to connect to a new X | ||
| 437 | session: | ||
| 438 | |||
| 439 | #0 0xb7ebc806 in SmcGetIceConnection () from /usr/X11R6/lib/libSM.so.6 | ||
| 440 | #1 0x080e6641 in x_session_check_input (bufp=0xbf86c9c0) at xsmfns.c:144 | ||
| 441 | #2 0x080d3bbc in XTread_socket (device=0xa722ff8, expected=1, hold_quit=0xbf86ca90) at xterm.c:7037 | ||
| 442 | #3 0x080fa404 in read_avail_input (expected=1) at keyboard.c:6696 | ||
| 443 | #4 0x080fa4ca in handle_async_input () at keyboard.c:6900 | ||
| 444 | #5 0x080d51fa in x_term_init (display_name=162628899, xrm_option=0x0, resource_name=0x857068c "emacs") at xterm.c:10622 | ||
| 445 | #6 0x080d920e in x_display_info_for_name (name=162628899) at xfns.c:3975 | ||
| 446 | #7 0x080d92f9 in check_x_display_info (object=1) at xfns.c:274 | ||
| 447 | #8 0x080d97b8 in Fx_create_frame (parms=151221485) at xfns.c:3016 | ||
| 448 | #9 0x0815bf72 in Ffuncall (nargs=2, args=0xbf86ceec) at eval.c:2851 | ||
| 449 | |||
| 450 | I installed a workaround to prevent this. The X session manager is | ||
| 451 | only contacted when the very first display in the Emacs session is | ||
| 452 | an X display. Also, x_delete_display() on this display aborts | ||
| 453 | session management, and XTread_socket only calls | ||
| 454 | x_session_check_input when it is called for the display that the | ||
| 455 | session was opened on. While this does not really fix the bug, it | ||
| 456 | makes it much less frequent, because session manager support will | ||
| 457 | not normally be enabled when Emacs can survive the shutdown of the | ||
| 458 | X server. | ||
| 459 | |||
| 460 | See if xsmfns.c should be updated. | ||
| 461 | |||
| 462 | ** Hunt down display-related functions in frame.el and extend them all | ||
| 463 | to accept display ids. | ||
| 464 | |||
| 465 | ** rif->flush_display_optional (NULL) calls should be replaced by a | ||
| 466 | new global function. | ||
| 467 | |||
| 468 | ** The set-locale-environment hack (adding the DISPLAY option) should | ||
| 469 | be replaced with a clean design. | ||
| 470 | |||
| 471 | ** standard-display-table should be display-local. | ||
| 472 | standard-display-european should be display-local. | ||
| 473 | |||
| 474 | ** With iswitchb-default-method set to 'always-frame, only frames on | ||
| 475 | the current display should be considered. This might involve | ||
| 476 | extending `get-buffer-window'. | ||
| 477 | |||
| 478 | ** Have a look at Vlocale_coding_system. Seems like it would be a | ||
| 479 | tedious job to localize it, although most references use it for | ||
| 480 | interfacing with libc and are therefore OK with the global | ||
| 481 | definition. | ||
| 482 | |||
| 483 | Exceptions found so far: x-select-text and | ||
| 484 | x-cut-buffer-or-selection-value. | ||
| 485 | |||
| 486 | ** Have a look at fatal_error_hook. | ||
| 487 | |||
| 488 | ** Have a look at set_frame_matrix_frame. | ||
| 489 | |||
| 490 | ** Check if we got term-setup-hook right. | ||
| 491 | |||
| 492 | ** I think tip_frame should be display-local. | ||
| 493 | |||
| 494 | ** Check display reference count handling in x_create_tip_frame. | ||
| 495 | |||
| 496 | ** make-frame does not correctly handle extra parameters in its | ||
| 497 | argument: | ||
| 498 | |||
| 499 | (frame-parameter (make-frame (list (cons 'foobar 42))) 'foobar) | ||
| 500 | => nil | ||
| 501 | |||
| 502 | (This is likely an error in the CVS trunk.) | ||
| 503 | |||
| 504 | ** Dan Nicolaescu suggests that -nw should be added as an alias for -t | ||
| 505 | in emacsclient. Good idea. (Alas, implementing this is not | ||
| 506 | trivial, getopt_long does not seem to support two-letter ``short'' | ||
| 507 | options. Patches are welcome.) | ||
| 508 | |||
| 509 | ** Mark Plaksin suggests that emacsclient should accept the same | ||
| 510 | X-related command-line arguments as Emacs. Most of the X-related | ||
| 511 | argument-handling is done in Lisp, so this should be quite easy to | ||
| 512 | implement. (For example, Samium Gromoff wants emacsclient to | ||
| 513 | support --geometry; implementing this would add that support.) | ||
| 514 | |||
| 515 | ** Gergely Nagy suggests that C-x # should only kill the current | ||
| 516 | frame, not any other emacsclient frame that may have the same file | ||
| 517 | opened for editing. I think I agree with him. | ||
| 518 | |||
| 519 | ** Very strange bug: visible-bell does not work on secondary | ||
| 520 | terminals in xterm and konsole. The screen does flicker a bit, | ||
| 521 | but it's so quick it isn't noticable. | ||
| 522 | |||
| 523 | (Update: This is probably some problem with padding or whatnot on | ||
| 524 | the secondary terminals.) | ||
| 525 | |||
| 526 | ** Move baud_rate to struct display. | ||
| 527 | |||
| 528 | ** Implement support for starting an interactive Emacs session without | ||
| 529 | an initial frame. (The user would connect to it and open frames | ||
| 530 | later, with emacsclient.) | ||
| 531 | |||
| 532 | ** Fix Mac support (I can't do this entirely myself). Note that the | ||
| 533 | current state of Mac-specific source files in the multi-tty tree | ||
| 534 | are not useful; before starting work on Mac support, revert to | ||
| 535 | pristine, pre-multi-tty versions. | ||
| 536 | |||
| 537 | ** Fix DOS support (I can't do this entirely myself). Note that the | ||
| 538 | current state of DOS-specific source files in the multi-tty tree | ||
| 539 | are not useful; before starting work on DOS support, revert to | ||
| 540 | pristine, pre-multi-tty versions. | ||
| 541 | |||
| 542 | ** Fix Windows support. Currently bootstraping works on w32, but Emacs | ||
| 543 | crashes on startup and none of the multi-tty features are | ||
| 544 | implemented. Many XXX comments mark things that probably need | ||
| 545 | updating, ChangeLogs will help in spotting changes to X specific | ||
| 546 | files that may need porting. | ||
| 547 | |||
| 548 | ** Do a grep on XXX and ?? for more issues. | ||
| 549 | |||
| 550 | ** flow-ctrl.el must be updated. | ||
| 551 | |||
| 552 | ** Fix stuff_char for multi-tty. Doesn't seem to be of high priority. | ||
| 553 | |||
| 554 | DIARY OF CHANGES | ||
| 555 | ---------------- | ||
| 556 | |||
| 557 | (ex-TODO items with explanations.) | ||
| 558 | |||
| 559 | -- Introduce a new struct for terminal devices. | ||
| 560 | |||
| 561 | (Done, see struct tty_output. The list of members is not yet | ||
| 562 | complete.) | ||
| 563 | |||
| 564 | -- Change the bootstrap procedure to initialize tty_list. | ||
| 565 | |||
| 566 | (Done, but needs review.) | ||
| 567 | |||
| 568 | -- Change make-terminal-frame to support specifying another tty. | ||
| 569 | |||
| 570 | (Done, new frame parameters: `tty' and `tty-type'.) | ||
| 571 | |||
| 572 | -- Implement support for reading from multiple terminals. | ||
| 573 | |||
| 574 | (Done, read_avail_input tries to read from each terminal, until one | ||
| 575 | succeeds. MULTI_KBOARD is not used. Secondary terminals don't send | ||
| 576 | SIGIO!) | ||
| 577 | |||
| 578 | (Update: They do, now.) | ||
| 579 | |||
| 580 | (Update2: After enabling X, they don't.) | ||
| 581 | |||
| 582 | -- other-frame should cycle through the frames on the `current' | ||
| 583 | terminal only. | ||
| 584 | |||
| 585 | (Done, by trivially modifiying next_frame and prev_frame.) | ||
| 586 | |||
| 587 | -- Support different terminal sizes. | ||
| 588 | |||
| 589 | (Done, no problem.) | ||
| 590 | |||
| 591 | -- Make sure terminal resizes are handled gracefully. (Could be | ||
| 592 | problematic.) | ||
| 593 | |||
| 594 | (Done. We don't get automatic SIGWINCH for additional ttys, | ||
| 595 | though.) | ||
| 596 | |||
| 597 | -- Extend emacsclient to automatically open a new tty when it connects | ||
| 598 | to Emacs. | ||
| 599 | |||
| 600 | (Done. It's an ugly hack, needs more work.) | ||
| 601 | |||
| 602 | -- Redisplay must refresh the topmost frame on *all* terminals, not | ||
| 603 | just the initial terminal. | ||
| 604 | |||
| 605 | (Done, but introduced an ugly redisplay problems. Ugh.) | ||
| 606 | |||
| 607 | -- Fix redisplay problems. | ||
| 608 | |||
| 609 | (Done; it turned out that the entire Wcm structure must be moved | ||
| 610 | inside tty_output. Why didn't I catch this earlier?) | ||
| 611 | |||
| 612 | -- Provide a way for emacsclient to tell Emacs that the tty has been | ||
| 613 | resized. | ||
| 614 | |||
| 615 | (Done, simply forward the SIGWINCH signal.) | ||
| 616 | |||
| 617 | -- Each keypress should automatically select the frame corresponding | ||
| 618 | to the terminal that it was coming from. This means that Emacs | ||
| 619 | must know from which terminal the last keyboard event came from. | ||
| 620 | |||
| 621 | (Done, it was quite simple, the input event system already | ||
| 622 | supported multiple frames.) | ||
| 623 | |||
| 624 | -- Fix SIGIO issue with secondary terminals. | ||
| 625 | |||
| 626 | (Done, emacsclient signals Emacs after writing to the proxy pseudo | ||
| 627 | terminal. Note that this means that multi-tty does not work with | ||
| 628 | raw ttys!) | ||
| 629 | |||
| 630 | (Update: This is bullshit. There is a read_input_waiting function, | ||
| 631 | extend that somehow.) | ||
| 632 | |||
| 633 | (Update of update: The first update was not right either, extending | ||
| 634 | read_input_waiting was not necessary. Secondary ttys do seem to | ||
| 635 | send signals on input.) | ||
| 636 | |||
| 637 | (Update^3: Not any more.) | ||
| 638 | |||
| 639 | -- Make make-terminal-frame look up the `tty' and `tty-type' frame | ||
| 640 | parameters from the currently selected terminal before the global | ||
| 641 | default. | ||
| 642 | |||
| 643 | (Done.) | ||
| 644 | |||
| 645 | -- Put all cached terminal escape sequences into struct tty_output. | ||
| 646 | Currently, they are still stored in global variables, so we don't | ||
| 647 | really support multiple terminal types. | ||
| 648 | |||
| 649 | (Done. It was not fun.) | ||
| 650 | |||
| 651 | -- Implement sane error handling after initialization. (Currently | ||
| 652 | emacs exits if you specify a bad terminal type.) The helpful error | ||
| 653 | messages must still be provided when Emacs starts. | ||
| 654 | |||
| 655 | (Done.) | ||
| 656 | |||
| 657 | -- Implement terminal deletion, i.e., deleting local frames, closing | ||
| 658 | the tty device and restoring its previous state without exiting | ||
| 659 | Emacs. | ||
| 660 | |||
| 661 | (Done, but at the moment only called when an error happens during | ||
| 662 | initialization. There is a memory corruption error around this | ||
| 663 | somewhere.) (Update: now it is fully enabled.) | ||
| 664 | |||
| 665 | -- Implement automatic deletion of terminals when the last frame on | ||
| 666 | that terminal is closed. | ||
| 667 | |||
| 668 | (Done.) | ||
| 669 | |||
| 670 | -- Restore tty screen after closing the terminal. | ||
| 671 | |||
| 672 | (Done, we do the same as Emacs 21.2 for all terminals.) | ||
| 673 | |||
| 674 | -- 'TERM=dumb src/emacs' does not restore the terminal state. | ||
| 675 | |||
| 676 | (Done.) | ||
| 677 | |||
| 678 | -- C-g should work on secondary terminals. | ||
| 679 | |||
| 680 | (Done, but the binding is not configurable.) | ||
| 681 | |||
| 682 | -- Deal with SIGHUP in Emacs and in emacsclient. (After this, the | ||
| 683 | server-frames may be removed from server.el.) | ||
| 684 | |||
| 685 | (Done, nothing to do. It seems that Emacs does not receive SIGHUP | ||
| 686 | from secondary ttys, which is actually a good thing.) (Update: I | ||
| 687 | think it would be a bad idea to remove server-frames.) | ||
| 688 | |||
| 689 | -- Change emacsclient/server.el to support the -t argument better, | ||
| 690 | i.e. automatically close the socket when the frame is closed. | ||
| 691 | |||
| 692 | (Seems to be working OK.) | ||
| 693 | |||
| 694 | -- Fix mysterious memory corruption error with tty deletion. To | ||
| 695 | trigger it, try the following shell command: | ||
| 696 | |||
| 697 | while true; do TERM=no-such-terminal-definition emacsclient -h; done | ||
| 698 | |||
| 699 | Emacs usually dumps core after a few dozen iterations. (The bug | ||
| 700 | seems to be related to the xfreeing or bzeroing of | ||
| 701 | tty_output.Wcm. Maybe there are outside references to struct Wcm? | ||
| 702 | Why were these vars collected into a struct before multi-tty | ||
| 703 | support?) | ||
| 704 | |||
| 705 | (Done. Whew. It turned out that the problem had nothing to do | ||
| 706 | with hypothetical external references to Wcm, or any other | ||
| 707 | tty_output component; it was simply that delete_tty closed the | ||
| 708 | filehandles of secondary ttys twice, resulting in fclose doubly | ||
| 709 | freeing memory. Utterly trivial matter. I love the C's memory | ||
| 710 | management, it puts hair on your chest.) | ||
| 711 | |||
| 712 | -- Support raw secondary terminals. (Note that SIGIO works only on | ||
| 713 | the controlling terminal.) Hint: extend read_input_waiting for | ||
| 714 | multiple ttys and hopefully this will be fixed. | ||
| 715 | |||
| 716 | (Done, it seems to have been working already for some time. It | ||
| 717 | seems F_SETOWN does work, after all. Not sure what made it fail | ||
| 718 | earlier, but it seems to be fixed (there were several changes | ||
| 719 | around request_sigio, maybe one of them did it). | ||
| 720 | read_input_waiting is only used in sys_select, don't change | ||
| 721 | it.) (Update: After adding X support, it's broken again.) | ||
| 722 | (Update^2: No it isn't.) :-) | ||
| 723 | |||
| 724 | -- Find out why does Emacs abort when it wants to close its | ||
| 725 | controlling tty. Hint: chan_process[] array. Hey, maybe | ||
| 726 | noninterrupt-IO would work, too? Update: no, there is no process | ||
| 727 | for stdin/out. | ||
| 728 | |||
| 729 | (Done. Added add/delete_keyboard_wait_descriptor to | ||
| 730 | term_init/delete_tty. The hint was right, in a way.) | ||
| 731 | |||
| 732 | -- Issue with SIGIO: it needs to be disabled during redisplay. See if | ||
| 733 | fcntl kernel behaviour could be emulated by emacsclient. | ||
| 734 | |||
| 735 | (Done. Simply disabled the SIGIO emulation hack in emacsclient.) | ||
| 736 | (Update: it was added back.) (Update^2: and removed again.) | ||
| 737 | |||
| 738 | -- server.el: There are issues with saving files in buffers of closed | ||
| 739 | clients. Try editing a file with emacsclient -f, and (without | ||
| 740 | saving it) do a delete-frame. The frame is closed without | ||
| 741 | question, and a surprising confirmation prompt appears in another | ||
| 742 | frame. | ||
| 743 | |||
| 744 | (Done. delete-frame now asks for confirmation if it still has | ||
| 745 | pending buffers, and modified buffers don't seem to be deleted.) | ||
| 746 | |||
| 747 | -- emacsclient.el, server.el: Handle eval or file open errors when | ||
| 748 | doing -t. | ||
| 749 | |||
| 750 | (Done.) | ||
| 751 | |||
| 752 | -- Make parts of struct tty_output accessible from Lisp. The device | ||
| 753 | name and the type is sufficient. | ||
| 754 | |||
| 755 | (Done, see frame-tty-name and frame-tty-type.) | ||
| 756 | |||
| 757 | -- Export delete_tty to the Lisp environment, for emacsclient. | ||
| 758 | |||
| 759 | (Done, see delete-tty.) | ||
| 760 | |||
| 761 | -- Get rid of the accessor macros in termchar.h, or define macros for | ||
| 762 | all members. | ||
| 763 | |||
| 764 | (Done.) | ||
| 765 | |||
| 766 | -- Move device-specific parameters (like costs) commonly used by | ||
| 767 | device backends to a common, device-dependent structure. | ||
| 768 | |||
| 769 | (Done. See struct display_method in termhooks.h.) | ||
| 770 | |||
| 771 | -- Fix X support. | ||
| 772 | |||
| 773 | (Done. Well, it seems to be working.) | ||
| 774 | |||
| 775 | -- Allow simultaneous X and tty frames. (Handling input could be | ||
| 776 | tricky. Or maybe not.) | ||
| 777 | |||
| 778 | (Done. Allowed, that is. It is currently extremely unstable, to | ||
| 779 | the point of being unusable. The rif variable causes constant | ||
| 780 | core dumps. Handling input is indeed tricky.) | ||
| 781 | |||
| 782 | -- Rewrite multi-tty input in terms of MULTI_KBOARD. | ||
| 783 | |||
| 784 | (Done. In fact, there was no need to rewrite anything, I just | ||
| 785 | added a kboard member to tty_display_info, and initialized the | ||
| 786 | frame's kboard from there.) | ||
| 787 | |||
| 788 | -- Fix rif issue with X-tty combo sessions. IMHO the best thing to do | ||
| 789 | is to get rid of that global variable (and use the value value in | ||
| 790 | display_method, which is guaranteed to be correct). | ||
| 791 | |||
| 792 | (Done, did exactly that. Core dumps during combo sessions became | ||
| 793 | much rarer. In fact, I have not yet met a single one.) | ||
| 794 | |||
| 795 | -- Add multi-tty support to talk.el. | ||
| 796 | |||
| 797 | (Done.) | ||
| 798 | |||
| 799 | -- Clean up the source of emacsclient. It is a mess. | ||
| 800 | |||
| 801 | (Done, eliminated stupid proxy-pty kludge.) | ||
| 802 | |||
| 803 | -- Fix faces on tty frames during X-tty combo sessions. There is an | ||
| 804 | init_frame_faces call in init_sys_modes, see if there is a problem | ||
| 805 | with it. | ||
| 806 | |||
| 807 | (Done, there was a stupid mistake in | ||
| 808 | Ftty_supports_face_attributes_p. Colors are broken, though.) | ||
| 809 | |||
| 810 | -- C-x 5 2, C-x 5 o, C-x 5 0 on an emacsclient frame unexpectedly | ||
| 811 | exits emacsclient. This is a result of trying to be clever with | ||
| 812 | delete-frame-functions. | ||
| 813 | |||
| 814 | (Fixed, added delete-tty-after-functions, and changed server.el to | ||
| 815 | use it.) | ||
| 816 | |||
| 817 | -- Something with (maybe) multi-keyboard support broke function keys | ||
| 818 | and arrows on ttys during X+tty combo sessions. Debug this. | ||
| 819 | |||
| 820 | (I can't reproduce it, maybe the terminal type was wrong.) | ||
| 821 | |||
| 822 | -- Fix input from raw ttys (again). | ||
| 823 | |||
| 824 | (Now it seems to work all right.) | ||
| 825 | |||
| 826 | -- During an X-tty combo session, a (message "Hello") from a tty frame | ||
| 827 | goes to the X frame. Fix this. | ||
| 828 | |||
| 829 | (Done. There was a safeguard against writing to the initial | ||
| 830 | terminal frame during bootstrap which prevented echo_area_display | ||
| 831 | from working correctly on a tty frame during a combo session.) | ||
| 832 | |||
| 833 | -- If there are no frames on its controlling terminal, Emacs should | ||
| 834 | exit if the user presses C-c there. | ||
| 835 | |||
| 836 | (Done, as far as possible. See the SIGTERM comment in | ||
| 837 | interrupt_signal on why this seems to be impossible to solve this | ||
| 838 | in general.) | ||
| 839 | |||
| 840 | -- During an X session, Emacs seems to read from stdin. Also, Emacs | ||
| 841 | fails to start without a controlling tty. | ||
| 842 | |||
| 843 | (Fixed by replacing the troublesome termcap display with a dummy | ||
| 844 | bootstrap display during bootstrap. | ||
| 845 | |||
| 846 | -- Do tty output through struct display, like graphical display | ||
| 847 | backends. | ||
| 848 | |||
| 849 | (Done.) | ||
| 850 | |||
| 851 | -- Define an output_initial value for output_method for the initial | ||
| 852 | frame that is dumped with Emacs. Checking for this frame (e.g. in | ||
| 853 | cmd_error_internal) is ugly. | ||
| 854 | |||
| 855 | (Done, breaking interactive temacs.) | ||
| 856 | |||
| 857 | -- The command `emacsclient -t -e '(delete-frame)'' fails to exit. | ||
| 858 | |||
| 859 | (Fixed.) | ||
| 860 | |||
| 861 | -- frame-creation-function should always create a frame that is on the | ||
| 862 | same display as the selected frame. Maybe frame-creation-function | ||
| 863 | should simply be removed and make-frame changed to do the right | ||
| 864 | thing. | ||
| 865 | |||
| 866 | (Done, with a nice hack. frame-creation-function is now frame-local.) | ||
| 867 | |||
| 868 | -- Fix C-g on raw ttys. | ||
| 869 | |||
| 870 | (Done. I disabled the interrupt/quit keys on all secondary | ||
| 871 | terminals, so Emacs sees C-g as normal input. This looks like an | ||
| 872 | overkill, because emacsclient has extra code to pass SIGINT to | ||
| 873 | Emacs, so C-g should remain the interrupt/quit key on emacsclient | ||
| 874 | frames. See the next entry why implementing this distinction would | ||
| 875 | be a bad idea.) | ||
| 876 | |||
| 877 | -- Make sure C-g goes to the right frame with ttys. This is hard, as | ||
| 878 | SIGINT doesn't have a tty parameter. :-( | ||
| 879 | |||
| 880 | (Done, the previous change fixes this as a pleasant side effect.) | ||
| 881 | |||
| 882 | -- I have seen a case when Emacs with multiple ttys fell into a loop | ||
| 883 | eating 100% of CPU time. Strace showed this loop: | ||
| 884 | |||
| 885 | getpid() = 30284 | ||
| 886 | kill(30284, SIGIO) = 0 | ||
| 887 | --- SIGIO (I/O possible) @ 0 (0) --- | ||
| 888 | ioctl(6, FIONREAD, [0]) = -1 EIO (Input/output error) | ||
| 889 | ioctl(5, FIONREAD, [0]) = -1 EIO (Input/output error) | ||
| 890 | ioctl(0, FIONREAD, [0]) = 0 | ||
| 891 | sigreturn() = ? (mask now []) | ||
| 892 | gettimeofday({1072842297, 747760}, NULL) = 0 | ||
| 893 | gettimeofday({1072842297, 747806}, NULL) = 0 | ||
| 894 | select(9, [0 3 5 6], NULL, NULL, {0, 0}) = 2 (in [5 6], left {0, 0}) | ||
| 895 | select(9, [0 3 5 6], NULL, NULL, {0, 0}) = 2 (in [5 6], left {0, 0}) | ||
| 896 | gettimeofday({1072842297, 748245}, NULL) = 0 | ||
| 897 | |||
| 898 | I have seen something similar with a single X frame, but have not | ||
| 899 | been able to reproduce it for debugging. | ||
| 900 | |||
| 901 | Update: This may have been caused by checking for nread != 0 | ||
| 902 | instead of nread > 0 after calling read_socket_hook in | ||
| 903 | read_avail_input. | ||
| 904 | |||
| 905 | (Fixed. This was caused by unconditionally including stdin in | ||
| 906 | input_wait_mask in init_process. The select call in | ||
| 907 | wait_reading_process_input always returned immediately, indicating | ||
| 908 | that there is pending input from stdin, which nobody read. | ||
| 909 | |||
| 910 | Note that the above strace output seems to be an unrelated but | ||
| 911 | similar bug. I think that is now fixed.) | ||
| 912 | |||
| 913 | -- Exiting Emacs while there are emacsclient frames doesn't restore the | ||
| 914 | ttys to their default states. | ||
| 915 | |||
| 916 | (This seems to be fixed by some previous change.) | ||
| 917 | |||
| 918 | -- Allow opening an X session after -nw. | ||
| 919 | |||
| 920 | (Done.) | ||
| 921 | |||
| 922 | -- Fix color handling during tty+X combo sessions. (It seems that tty | ||
| 923 | sessions automatically convert the face colors to terminal colors | ||
| 924 | when the face is loaded. This conversion must happen instead on | ||
| 925 | the fly in write_glyphs, which might be problematic, as color | ||
| 926 | approximation is currently done in lisp (term/tty-colors.el).) | ||
| 927 | (Update: hm, colors seem to work fine if I start emacs with -nw and | ||
| 928 | then create an X frame. Maybe it's just a small buglet somewhere.) | ||
| 929 | |||
| 930 | (Seems to be fixed. The problem was in startup.el, it did not | ||
| 931 | initialize tty colors when the initial window system was | ||
| 932 | graphical.) | ||
| 933 | |||
| 934 | -- emacs -nw --eval '(y-or-n-p "Foobar")' segfaults. (Reported by | ||
| 935 | Romain Francoise) | ||
| 936 | |||
| 937 | (Fixed, there was a keyboard initialization problem.) | ||
| 938 | |||
| 939 | -- Fix interactive use of temacs. There are face-related SEGVs, most | ||
| 940 | likely because of changes in realize_default_face, realize_face. | ||
| 941 | |||
| 942 | (Fixed.) | ||
| 943 | |||
| 944 | -- Don't exit Emacs when the last X connection fails during a | ||
| 945 | multi-display session. | ||
| 946 | |||
| 947 | (Fixed.) | ||
| 948 | |||
| 949 | -- Dan Nicolaescu noticed that starting emacsclient on the same | ||
| 950 | terminal device that is the controlling tty of the Emacs process | ||
| 951 | gives unexpected results. | ||
| 952 | |||
| 953 | (Fixed.) | ||
| 954 | |||
| 955 | -- Istvan Marko reported that Emacs hang on ttys if it was started | ||
| 956 | from a shell script. | ||
| 957 | |||
| 958 | (Fixed. There was a bug in the multi-tty version of | ||
| 959 | narrow_foreground_group. tcsetpgrp blocks if it is called from a | ||
| 960 | process that is not in the same process group as the tty.) | ||
| 961 | |||
| 962 | -- emacsclient -t from an Emacs term buffer does not work, complains | ||
| 963 | about face problems. This can even lock up Emacs (if the recursive | ||
| 964 | frame sets single_kboard). Update: the face problems are caused by | ||
| 965 | bugs in term.el, not in multi-tty. The lockup is caused by | ||
| 966 | single_kboard mode, and is not easily resolvable. The best thing to | ||
| 967 | do is to simply refuse to create a tty frame of type `eterm'. | ||
| 968 | |||
| 969 | (Fixed, changed emacsclient to check for TERM=eterm. The face | ||
| 970 | complaints seem to be caused by bugs in term.el; they are not | ||
| 971 | related to multi-tty.) | ||
| 972 | |||
| 973 | -- Find out the best way to support suspending Emacs with multiple | ||
| 974 | ttys. My guess: disable it on the controlling tty, but from other | ||
| 975 | ttys pass it on to emacsclient somehow. (It is (I hope) trivial to | ||
| 976 | extend emacsclient to handle suspend/resume. A `kill -STOP' almost | ||
| 977 | works right now.) | ||
| 978 | |||
| 979 | (Done. I needed to play with signal handling and the server | ||
| 980 | protocol a bit to make emacsclient behave as a normal UNIX program | ||
| 981 | wrt foreground/background process groups.) | ||
| 982 | |||
| 983 | -- There is a flicker during the startup of `emacs -nw'; it's as if | ||
| 984 | the terminal is initialized, reset and then initialialized again. | ||
| 985 | Debug this. (Hint: narrow_foreground_group is called twice during | ||
| 986 | startup.) | ||
| 987 | |||
| 988 | (This is gone.) | ||
| 989 | |||
| 990 | -- Robert Chassell has found serious copy-paste bugs with the | ||
| 991 | multi-tty branch. There seem to be redisplay bugs while copying | ||
| 992 | from X to a terminal frame. Copying accented characters do not | ||
| 993 | work for me. | ||
| 994 | |||
| 995 | (Patch-124 should fix this, by changing the interprogram-*-function | ||
| 996 | variables to be frame-local, as suggested by Mark Plaksin | ||
| 997 | (thanks!). I think that the redisplay bugs are in fact not bugs, | ||
| 998 | but delays caused by single_kboard --> perhaps MULTI_KBOARD should | ||
| 999 | be removed.) | ||
| 1000 | |||
| 1001 | -- frame-creation-function was removed, which might be a bad idea. | ||
| 1002 | Think up a compatible solution. | ||
| 1003 | |||
| 1004 | (It was an internal interface that may be changed when necessary.) | ||
| 1005 | |||
| 1006 | -- Change Lisp code not to (getenv "TERM"); use the `tty-type' frame | ||
| 1007 | parameter or the frame-tty-type function instead. (M-x tags-search | ||
| 1008 | "TERM" helps with this.) Update: Actually, all getenv invocations | ||
| 1009 | should be checked for multi-tty compatibility, and an interface | ||
| 1010 | must be implemented to get the remote client's environment. | ||
| 1011 | |||
| 1012 | (Done. Only getenv calls in lisp/term/*.el were changed; other | ||
| 1013 | calls should be mostly left as they are.) | ||
| 1014 | |||
| 1015 | -- Add an elaborate mechanism for display-local variables. (There are | ||
| 1016 | already a few of these; search for `terminal-local' in the Elisp | ||
| 1017 | manual.) | ||
| 1018 | |||
| 1019 | (Not needed. Display-local variables could be emulated by | ||
| 1020 | frame-local variables.) | ||
| 1021 | |||
| 1022 | -- Emacs assumes that all terminal frames have the same locale | ||
| 1023 | settings as Emacs itself. This may lead to bogus results in a | ||
| 1024 | multi-locale setup. (E.g., while logging in from a remote client | ||
| 1025 | with a different locale.) | ||
| 1026 | (Update after new bugreport by Friedrich Delgado Friedrichs: | ||
| 1027 | (at least) the structs terminal_coding and keyboard_coding in | ||
| 1028 | coding.c must be moved to struct display, and the Lisp interface | ||
| 1029 | [set-]keyboard-coding-system must be adapted for the change.) | ||
| 1030 | |||
| 1031 | (Fixed. Emacs now uses the locale settings as seen by the | ||
| 1032 | emacsclient process for server tty frames.) | ||
| 1033 | (Update: Not really; Vlocale_coding_system is still global.) | ||
| 1034 | |||
| 1035 | -- Make `struct display' accessible to Lisp programs. Accessor functions: | ||
| 1036 | |||
| 1037 | (displayp OBJECT): Returns t if OBJECT is a display. | ||
| 1038 | => Implemented as display-live-p. | ||
| 1039 | |||
| 1040 | (display-list): Returns list of currently active displays. | ||
| 1041 | => Implemented. | ||
| 1042 | |||
| 1043 | (selected-display): Returns the display object of the selected frame. | ||
| 1044 | => Not strictly necessary, but implemented anyway. | ||
| 1045 | |||
| 1046 | (frame-display FRAME): Returns the display object of FRAME. | ||
| 1047 | => Implemented. | ||
| 1048 | |||
| 1049 | (display-frames DISPLAY): Returns a list of frames on DISPLAY. | ||
| 1050 | => Already implemented, see frames-on-display-list. | ||
| 1051 | |||
| 1052 | (display-type DISPLAY): Returns the type of DISPLAY, as a | ||
| 1053 | symbol. (See `framep'.) | ||
| 1054 | => Implemented as display-live-p. | ||
| 1055 | |||
| 1056 | (display-device DISPLAY): Returns the name of the device that | ||
| 1057 | DISPLAY uses, as a string. (E.g: "/dev/pts/16", or | ||
| 1058 | ":0.0") | ||
| 1059 | => Implemented as display-name. | ||
| 1060 | |||
| 1061 | etc. | ||
| 1062 | |||
| 1063 | See next issue why this is necessary. | ||
| 1064 | |||
| 1065 | (Update: The consensus on emacs-devel seems to be to do this via | ||
| 1066 | integer identifiers. That's fine by me.) | ||
| 1067 | |||
| 1068 | (Done.) | ||
| 1069 | |||
| 1070 | -- The following needs to be supported: | ||
| 1071 | |||
| 1072 | $ emacsclient -t | ||
| 1073 | C-z | ||
| 1074 | $ emacsclient -t | ||
| 1075 | (This fails now.) | ||
| 1076 | |||
| 1077 | The cleanest way to solve this is to allow multiple displays on the | ||
| 1078 | same terminal device; each new emacsclient process should create | ||
| 1079 | its own display. As displays are currently identified by their | ||
| 1080 | device names, this is not possible until struct display becomes | ||
| 1081 | accessible as a Lisp-level object. | ||
| 1082 | |||
| 1083 | (Done.) | ||
| 1084 | |||
| 1085 | -- Miles Bader suggests that C-x C-c on an emacsclient frame should | ||
| 1086 | only close the frame, not exit the entire Emacs session. Update: | ||
| 1087 | see above for a function that does this. Maybe this should be the | ||
| 1088 | new default? | ||
| 1089 | |||
| 1090 | (Done. This is the new default. No complaints so far.) | ||
| 1091 | |||
| 1092 | -- Clean up the frame-local variable system. I think it's ugly and | ||
| 1093 | error-prone. But maybe I just haven't yet fully understood it. | ||
| 1094 | |||
| 1095 | (Nothing to do. It doesn't seem ugly any more. It's rather clever.) | ||
| 1096 | |||
| 1097 | -- Support multiple character locales. A version of | ||
| 1098 | `set-locale-environment' needs to be written for setting up | ||
| 1099 | display-local settings on ttys. I think calling | ||
| 1100 | set-display-table-and-terminal-coding-system and | ||
| 1101 | set-keyboard-coding-system would be enough. The language | ||
| 1102 | environment itself should remain a global setting. | ||
| 1103 | |||
| 1104 | (Done, by an ugly hack.) | ||
| 1105 | |||
| 1106 | -- The terminal customization files in term/*.el tend to change global | ||
| 1107 | parameters, which may confuse Emacs with multiple displays. Change | ||
| 1108 | them to tweak only frame-local settings, if possible. (They tend | ||
| 1109 | to call define-key to set function key sequences a lot.) | ||
| 1110 | |||
| 1111 | (Done, by making `function-key-map' terminal-local (i.e., part of | ||
| 1112 | struct kboard). This has probably covered all the remaining problems.) | ||
| 1113 | |||
| 1114 | -- Make `function-key-map' and `key-translation-map' terminal-local. | ||
| 1115 | |||
| 1116 | (Done.) | ||
| 1117 | |||
| 1118 | -- Implement `terminal-local-value' and `set-terminal-local-value' to | ||
| 1119 | allow deterministic access to terminal local bindings. The | ||
| 1120 | encode-kb package can not set up `key-translation-map' without | ||
| 1121 | these. The terminal-local bindings seem to be independent of what | ||
| 1122 | frame is selected. | ||
| 1123 | |||
| 1124 | (Done.) | ||
| 1125 | |||
| 1126 | -- xt-mouse.el needs to be adapted for multi-tty. It currently | ||
| 1127 | signals an error on kill-emacs under X, which prevents the user | ||
| 1128 | from exiting Emacs. (Reported by Mnemonikk on freenode.) | ||
| 1129 | |||
| 1130 | (Done, I hope.) | ||
| 1131 | |||
| 1132 | |||
| 1133 | -- Having {reset,init}_all_sys_modes in set-input-mode breaks arrow | ||
| 1134 | keys on non-selected terminals under screen, and sometimes on other | ||
| 1135 | terminal types as well. The other function keys continue to work | ||
| 1136 | fine. Sometimes faces on these screens become garbled. | ||
| 1137 | |||
| 1138 | This only seems to affect displays that are of the same terminfo | ||
| 1139 | type as the selected one. Interestingly, in screen Emacs normally | ||
| 1140 | reports the up arrow key as `M-o A', but after the above SNAFU, it | ||
| 1141 | complains about `M-[ a'. UNIX ttys are a complete mystery to me, | ||
| 1142 | but it seems the reset-reinitialize cycle somehow leaves the | ||
| 1143 | non-selected terminals in a different state than usual. I have no | ||
| 1144 | idea how this could happen. | ||
| 1145 | |||
| 1146 | Currently set-input-mode resets only the currently selected | ||
| 1147 | terminal, which seems to somehow work around the problem. | ||
| 1148 | |||
| 1149 | Update: | ||
| 1150 | |||
| 1151 | Dan Nicolaescu <dann@ics.uci.edu> writes: | ||
| 1152 | > Some terminals have 2 modes for cursor keys: Application Mode where | ||
| 1153 | > the cursor keys transmit the codes defined in the terminfo entry, and | ||
| 1154 | > Cursor mode. Applications have to send the smkx and rmkx terminfo | ||
| 1155 | > strings to switch between the 2 modes. So Emacs (and emacsclient) have | ||
| 1156 | > to send smkx when initializing and rmkx when quitting (or on | ||
| 1157 | > suspend). | ||
| 1158 | |||
| 1159 | (I think patch-370 fixed this.) | ||
| 1160 | |||
| 1161 | -- This long-standing bug (first reported by Han Boetes) seems to come | ||
| 1162 | and go all the time. It is time to track it down and fix it. | ||
| 1163 | |||
| 1164 | emacs | ||
| 1165 | M-x server-start | ||
| 1166 | |||
| 1167 | # From another xterm: | ||
| 1168 | emacsclient -e '(y-or-n-p "Do you want me to crash? ")' | ||
| 1169 | # Notice how the answer ends up in the *scratch* buffer | ||
| 1170 | M-x garbage-collect | ||
| 1171 | SIGSEGV | ||
| 1172 | |||
| 1173 | (Fixed in patch-414 after detailed analysis by Kalle Olavi Niemitalo.) | ||
| 1174 | |||
| 1175 | -- normal-erase-is-backspace-mode in simple.el needs to be updated for | ||
| 1176 | multi-tty (rep. by Dan Waber). (The Delete key is broken on X | ||
| 1177 | because of this.) | ||
| 1178 | |||
| 1179 | (Fixed in patch-427.) | ||
| 1180 | |||
| 1181 | -- I think keyboard-translate-table should be made terminal-local. | ||
| 1182 | |||
| 1183 | (Done in patch-431.) | ||
| 1184 | |||
| 1185 | -- The semantics of terminal-local variables are confusing; it is not | ||
| 1186 | clear what binding is in effect in any given time. See if | ||
| 1187 | current_kboard (or at least the terminal-local bindings exported to | ||
| 1188 | Lisp) might be changed to be tied to the selected frame instead. | ||
| 1189 | Currently, `function-key-map' and `key-translation-map' may be | ||
| 1190 | accessed reliably only using the hackish | ||
| 1191 | `(set-)terminal-local-value' functions. | ||
| 1192 | |||
| 1193 | Perhaps there should be a difference between `last-command' &co. | ||
| 1194 | and these more conventional configuration variables. | ||
| 1195 | (E.g. `symbol-value' would use current_kboard to access | ||
| 1196 | `last-command', but SELECTED_FRAME()->display->kboard to get the | ||
| 1197 | value of `function-key-map'. | ||
| 1198 | |||
| 1199 | (Fixed in patch-434.) | ||
| 1200 | |||
| 1201 | -- If the first key pressed on a new tty terminal is a function key, | ||
| 1202 | it is not recognized correctly. May be related to the bug below. | ||
| 1203 | |||
| 1204 | (Seems to have been fixed as a side effect of patch-434. "The bug | ||
| 1205 | below" was the set-input-mode madness.) | ||
| 1206 | |||
| 1207 | (Update: this bug was fixed for good in patch-449. It was tracked | ||
| 1208 | down to a bug in `read_key_sequence': it failed to reinitialize its | ||
| 1209 | local function-key-map/key-translation-map references when it | ||
| 1210 | switched keyboards. I don't understand why did this bug only | ||
| 1211 | appear on brand new frames, though!) | ||
| 1212 | |||
| 1213 | -- Disable connecting to a new X display when we use the GTK toolkit. | ||
| 1214 | |||
| 1215 | (Disabled in patch-450.) | ||
| 1216 | |||
| 1217 | -- Implement automatic forwarding of client environment variables to | ||
| 1218 | forked processes, as discussed on the multi-tty list. Terminal | ||
| 1219 | parameters are now accessible in C code, so the biggest obstacle is | ||
| 1220 | gone. The `getenv_internal' and `child_setup' functions in | ||
| 1221 | callproc.c must be changed to support the following variable: | ||
| 1222 | |||
| 1223 | terminal-local-environment-variables is a variable defined in ... | ||
| 1224 | |||
| 1225 | Enable or disable terminal-local environment variables. | ||
| 1226 | |||
| 1227 | If set to t, `getenv', `setenv' and subprocess creation | ||
| 1228 | functions use the environment variables of the emacsclient | ||
| 1229 | process that created the selected frame, ignoring | ||
| 1230 | `process-environment'. | ||
| 1231 | |||
| 1232 | If set to nil, Emacs uses `process-environment' and ignores | ||
| 1233 | the client environment. | ||
| 1234 | |||
| 1235 | Otherwise, `terminal-local-environment-variables' should be a | ||
| 1236 | list of variable names (represented by Lisp strings) to look | ||
| 1237 | up in the client environment. The rest will come from | ||
| 1238 | `process-environment'. | ||
| 1239 | |||
| 1240 | (Implemented in patch-461; `terminal-getenv', `terminal-setenv' and | ||
| 1241 | `with-terminal-environment' are now replaced by extensions to | ||
| 1242 | `getenv' and `setenv', and the new `local-environment-variables' | ||
| 1243 | facility. Yay!) | ||
| 1244 | |||
| 1245 | (Updated in patch-465 to fix the semantics of let-binding | ||
| 1246 | `process-environment'. `process-environment' was changed to | ||
| 1247 | override all local/global environment variables, and a new variable | ||
| 1248 | `global-environment' was introduced to have `process-environment's | ||
| 1249 | old meaning.) | ||
| 1250 | |||
| 1251 | (Updated in patch-466 to fix the case when two emacsclient sessions | ||
| 1252 | share the same terminal, but have different environment. The local | ||
| 1253 | environment lists are now stored as frame parameters, so the | ||
| 1254 | C-level terminal parameters are not strictly necessary any more.) | ||
| 1255 | |||
| 1256 | -- `Fdelete_frame' is called from various critical places where it is | ||
| 1257 | not acceptable for the frame deletion to fail, e.g. from | ||
| 1258 | x_connection_closed after an X error. `Fdelete_frame' now protects | ||
| 1259 | against `delete-frame-functions' throwing an error and preventing a | ||
| 1260 | frame delete. (patch-475) | ||
| 1261 | |||
| 1262 | -- Fix set-input-mode for multi-tty. It's a truly horrible interface; | ||
| 1263 | what if we'd blow it up into several separate functions (with a | ||
| 1264 | compatibility definition)? | ||
| 1265 | |||
| 1266 | (Done. See `set-input-interrupt-mode', `set-output-flow-control', | ||
| 1267 | `set-input-meta-mode' and `set-quit-char'.) (patch-457) | ||
| 1268 | |||
| 1269 | -- Let-binding `overriding-terminal-local-map' on a brand new frame | ||
| 1270 | does not seem to work correctly. (See `fancy-splash-screens'.) | ||
| 1271 | The keymap seems to be set up right, but events go to another | ||
| 1272 | terminal. Or is it `unread-command-events' that gets Emacs | ||
| 1273 | confused? Investigate. | ||
| 1274 | |||
| 1275 | (Emacs was confused because a process filter entered | ||
| 1276 | `recursive-edit' while Emacs was reading input. I added support | ||
| 1277 | for this in the input system.) (patch-489) | ||
| 1278 | |||
| 1279 | -- I smell something funny around pop_kboard's "deleted kboard" case. | ||
| 1280 | Determine what are the circumstances of this case, and fix any | ||
| 1281 | bug that comes to light. | ||
| 1282 | |||
| 1283 | (It happens simply because single_kboard's terminal is sometimes | ||
| 1284 | deleted while executing a command on it, for example the one that | ||
| 1285 | kills the terminal. There was no bug here, but I rewrote the whole | ||
| 1286 | single_kboard mess anyway.) (patch-489) | ||
| 1287 | |||
| 1288 | -- Understand Emacs's low-level input system (it's black magic) :-) | ||
| 1289 | What exactly does interrupt_input do? I tried to disable it for | ||
| 1290 | raw secondary tty support, but it does not seem to do anything | ||
| 1291 | useful. (Update: Look again. X unconditionally enables this, maybe | ||
| 1292 | that's why raw terminal support is broken again. I really do need | ||
| 1293 | to understand input.) | ||
| 1294 | (Update: I am starting to understand the read_key_sequence->read-char | ||
| 1295 | ->kbd_buffer_get_event->read_avail_input->read_socket_hook path. Yay!) | ||
| 1296 | |||
| 1297 | (Update: OK, it all seems so easy now (NOT). Input could be done | ||
| 1298 | synchronously (with wait_reading_process_input), or asynchronously | ||
| 1299 | by SIGIO or polling (SIGALRM). C-g either sets the Vquit_flag, | ||
| 1300 | signals a 'quit condition (when immediate_quit), or throws to | ||
| 1301 | `getcjmp' when Emacs was waiting for input when the C-g event | ||
| 1302 | arrived.) | ||
| 1303 | |||
| 1304 | -- Replace wrong_kboard_jmpbuf with a special return value of | ||
| 1305 | read_char. It is absurd that we use setjmp/longjmp just to return | ||
| 1306 | to the immediate caller. | ||
| 1307 | |||
| 1308 | (Done in patch-500.) | ||
| 1309 | |||
| 1310 | -- `tool-bar-mode', `scroll-bar-mode', `menu-bar-mode' and | ||
| 1311 | 'fringe-mode' are modes global to the entire Emacs session, not | ||
| 1312 | just a single frame or a single terminal. This means that their | ||
| 1313 | status sometimes differs from what's actually displayed on the | ||
| 1314 | screen. As a consequence, the Options | Show/Hide menu sometimes | ||
| 1315 | shows incorrect status, and you have to select an option twice for | ||
| 1316 | it to have any visible effect on the current frame. | ||
| 1317 | |||
| 1318 | Change Emacs so that the status of the items in the Options | | ||
| 1319 | Show/Hide menu correspond to the current frame. | ||
| 1320 | |||
| 1321 | (Done in patch-537.) | ||
| 1322 | |||
| 1323 | -- The `default-directory' variable should somehow be set to the | ||
| 1324 | cwd of the emacsclient process when the user runs emacsclient | ||
| 1325 | without file arguments. Perhaps it is OK to just override the | ||
| 1326 | directory of the *scratch* buffer. | ||
| 1327 | |||
| 1328 | (Done in patch-539.) | ||
| 1329 | |||
| 1330 | -- The borders on tooltip frames on X are messed up. More | ||
| 1331 | specifically, the frame's internal border (internal-border-width | ||
| 1332 | frame parameter) is not filled with the correct background color. | ||
| 1333 | |||
| 1334 | It seems the border contents are drawn onto by the | ||
| 1335 | update_single_window call in `x-show-tip'. After some debugging, I | ||
| 1336 | think the window's background color is not set up | ||
| 1337 | correctly---calling `x_clear_area' fills the specified area with | ||
| 1338 | black, not light yellow. | ||
| 1339 | |||
| 1340 | (Done in patch-544. A background_pixel field was defined both in | ||
| 1341 | struct frame and struct x_output, and Emacs got confused between | ||
| 1342 | them.) | ||
| 1343 | |||
| 1344 | |||
| 1345 | This file is part of GNU Emacs. | ||
| 1346 | |||
| 1347 | GNU Emacs is free software; you can redistribute it and/or modify | ||
| 1348 | it under the terms of the GNU General Public License as published by | ||
| 1349 | the Free Software Foundation; either version 3, or (at your option) | ||
| 1350 | any later version. | ||
| 1351 | |||
| 1352 | GNU Emacs is distributed in the hope that it will be useful, | ||
| 1353 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 1354 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 1355 | GNU General Public License for more details. | ||
| 1356 | |||
| 1357 | You should have received a copy of the GNU General Public License | ||
| 1358 | along with GNU Emacs; see the file COPYING. If not, write to the | ||
| 1359 | Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
| 1360 | Boston, MA 02110-1301, USA. | ||
| 1361 | |||
| 1362 | ;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d | ||