# HG changeset patch # User Karoly Lorentey # Date 1072650532 0 # Node ID db645482d6bcc39a7db9e49e0036300177fa957c # Parent 09ea561dfa8c55cde9020eaf6726d9ab34d80403 Trivial changes git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-18 diff -r 09ea561dfa8c -r db645482d6bc README.multi-tty --- a/README.multi-tty Sun Dec 28 16:05:28 2003 +0000 +++ b/README.multi-tty Sun Dec 28 22:28:52 2003 +0000 @@ -28,7 +28,8 @@ already seems to be usable. Emacsclient has been extended to support opening a new terminal frame. -To try it out, compile Emacs with the following commands +To try it out, compile the multi-tty branch with the following +commands: mkdir +build cd +build @@ -38,17 +39,24 @@ then start up the emacs server (src/emacs, M-x server-start), and then (from a shell prompt on another terminal) start emacsclient with - lib-src/emacsclient -h + lib-src/emacsclient -h /optional/file/names... -You'll hopefully have two fully working frames on separate terminals. -If you exit emacs, both terminals should be restored to their previous -states. You can close the newly opened frame and return to the shell -without exiting Emacs by pressing C-x 5 0, i.e., delete-frame. +You'll hopefully have two fully working, independent frames on +separate terminals. (This seems to be very useful, emacsclient starts +up even faster than vi!) :-) You can close the newly opened frame and +return to the shell without exiting Emacs by pressing C-x 5 0, i.e., +delete-frame. (Note that this does not seem to work yet on the +original terminal.) Creating new frames on the same tty with C-x 5 2 +works exactly as before. Suspending Emacs is disabled at the moment. +If you exit emacs, all terminals should be restored to their previous +states. X, Mac, Windows and DOS support is broken, probably doesn't even -compile -- this will be solved later. +compile -- this will be solved later. Please see the attached README +for other issues, implementation notes and sub-TODO items. -Tested under GNU/Linux only. +Only tested on my GNU/Linux box. + NEWS ---- diff -r 09ea561dfa8c -r db645482d6bc src/cm.c --- a/src/cm.c Sun Dec 28 16:05:28 2003 +0000 +++ b/src/cm.c Sun Dec 28 22:28:52 2003 +0000 @@ -134,8 +134,7 @@ * after we reach the last column; this takes us to a known state. */ void -cmcheckmagic (tty) - struct tty_output *tty; +cmcheckmagic (struct tty_output *tty) { if (curX (tty) == FrameCols (tty)) { diff -r 09ea561dfa8c -r db645482d6bc src/cm.h --- a/src/cm.h Sun Dec 28 16:05:28 2003 +0000 +++ b/src/cm.h Sun Dec 28 22:28:52 2003 +0000 @@ -166,10 +166,10 @@ extern struct tty_output *current_tty; extern void cmcheckmagic P_ ((struct tty_output *)); extern int cmputc P_ ((int)); -extern void cmcostinit P_ ((struct tty_output *tty)); +extern void cmcostinit P_ ((struct tty_output *)); extern void cmgoto P_ ((struct tty_output *, int, int)); -extern void Wcm_clear P_ ((struct tty_output *tty)); -extern int Wcm_init P_ ((struct tty_output *tty)); +extern void Wcm_clear P_ ((struct tty_output *)); +extern int Wcm_init P_ ((struct tty_output *)); /* arch-tag: acc1535a-7136-49d6-b22d-9bc85702251b (do not change this comment) */ diff -r 09ea561dfa8c -r db645482d6bc src/term.c --- a/src/term.c Sun Dec 28 16:05:28 2003 +0000 +++ b/src/term.c Sun Dec 28 22:28:52 2003 +0000 @@ -917,18 +917,19 @@ { char *buf; struct glyph *glyph = NULL; - struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame)); + struct frame *f; struct tty_output *tty; if (len <= 0) return; - if (insert_glyphs_hook && ! FRAME_TERMCAP_P (f)) + if (insert_glyphs_hook) { (*insert_glyphs_hook) (start, len); return; } + f = (updating_frame ? updating_frame : XFRAME (selected_frame)); tty = FRAME_TTY (f); if (tty->TS_ins_multi_chars) @@ -2156,11 +2157,9 @@ tty_list = tty; } - if (tty->Wcm) - Wcm_clear (tty); - else - tty->Wcm = (struct cm *) xmalloc (sizeof (struct cm)); - + if (! tty->Wcm) + tty->Wcm = (struct cm *) xmalloc (sizeof (struct cm)); + if (name) { int fd; @@ -2676,24 +2675,6 @@ { Lisp_Object tail, frame; - FOR_EACH_FRAME (tail, frame) - { - struct frame *f = XFRAME (frame); - if (FRAME_LIVE_P (f) && FRAME_TTY (f) == tty) - { - Fdelete_frame (frame, Qt); - f->output_data.tty = 0; - } - } - - /* Close the terminal and free memory. */ - delete_tty_1 (tty); -} - -static void -delete_tty_1 (struct tty_output *tty) -{ - if (tty == tty_list) tty_list = tty->next; else @@ -2709,13 +2690,25 @@ p->next = p->next->next; } + FOR_EACH_FRAME (tail, frame) + { + struct frame *f = XFRAME (frame); + if (FRAME_LIVE_P (f) && FRAME_TTY (f) == tty) + { + Fdelete_frame (frame, Qt); + f->output_data.tty = 0; + } + } + /* This hangs. */ - /* reset_sys_modes (tty); */ - - if (tty->name) + /* + reset_sys_modes (tty); + + if (tty->name) xfree (tty->name); if (tty->type) xfree (tty->type); + */ if (tty->input) fclose (tty->input); if (tty->output) @@ -2723,9 +2716,19 @@ if (tty->termscript) fclose (tty->termscript); + tty->input = 0; + tty->output = 0; + tty->termscript = 0; + /* if (tty->old_tty) - xfree (tty->old_tty); + { + memset (tty->old_tty, 'Z', sizeof (struct emacs_tty)); + tty->old_tty = 0; + } + + + /* xfree (tty->old_tty); if (tty->Wcm) {