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