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