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