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