Commit 9628b887 authored by Karoly Lorentey's avatar Karoly Lorentey

lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.

(here): New variable.
(decode_options): Use it.
(ec_get_tty, ec_set_tty, init_tty, window_change, hang_up_signal): New functions.
(window_change_signal, init_signals, reset_tty, init_pty, copy_from_to): Ditto.
(pty_conversation): Ditto.
(main): Use them.
(master, pty_name, old_tty, tty, old_tty_valid, tty_erase_char): New variables.
(flow_control, meta_key, _sobuf, in_conversation, quit_conversation): Ditto.

lisp/server.el (server-process-filter): Added support for opening a new terminal frame.

dispextern.h (get_frame_size): Renamed to get_tty_size, added tty_output parameter.

dispnew.c (Fredraw_frame): fflush the current terminal instead of stdout.
(direct_output_for_insert, direct_output_forward_char, update_frame_1): Ditto.
(Fding, bitch_at_user): Ditto.
(update_frame_1): Count pending output for current terminal instead of stdout.
(window_change_signal): Resize all terminals.
(change_frame_size): Don't resize all terminals to the same size.

frame.c (Vterminal_frame): Removed.
(syms_of_frame): Removed declaration of Vterminal_frame.
(make_terminal_frame): Set the top frame of the terminal to the new frame.
(Fmake_terminal_frame): Get a new frame size from get_tty_size, don't copy it.
(do_switch_frame): Handle terminal frame visibility.
(next_frame, prev_frame): Skip over frames on different terminals.

frame.h (Vterminal_frame): Removed.

keyboard.c (input_fd): Removed.
(read_avail_input): Removed first argument from read_socket_hook.
Try to read from each available tty, until one succeeds.
(Fsuspend_emacs): Don't suspend if there are multiple terminals.

lisp.h (get_frame_size): Removed superflous declaration.

xterm.c (Xtread_socket): Removed first parameter.
macterm.h (XTread_socket): Ditto.
w32inevt.c (w32_console_read_socket): Ditto.
w32term.c (w32_read_socket): Ditto.

sysdep.c (input_fd): Removed.
(change_input_fd): Removed.
(discard_tty_input): Discard pending input on _all_ input descriptors.
(stuff_char, tabs_safe_p): Use current terminal instead of input_fd.
(init_baud_rate, request_sigio, unrequest_sigio): Ditto.
(init_sys_modes, reset_sys_modes): Ditto.
(narrow_foreground_group, widen_foreground_group): Use stdin.
(init_sys_modes, reset_sys_modes): otty parameter renamed to tty_out.
(get_frame_size): Renamed to get_tty_size, added tty_out parameter.

term.c (read_socket_hook): Removed first parameter.
(clear_end_of_line): Use updating_frame, if possible.
(write_glyphs, insert_glyphs, ins_del_lines): Ditto.
(term_init): Renamed get_frame_size to get_tty_size.

termchar.h (struct tty_output): New entries: top_frame,
previous_terminal_frame.

termhooks.h (read_socket_hook): Removed first parameter.

window.c (init_window_once): Removed reference to Vterminal_frame.

xdisp.c (previous_terminal_frame): Moved to struct tty_output.
(redisplay_internal): Updated to use previous_terminal_frame in tty_output.
Allow for simultaneous refresh of multiple ttys.


git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-5
parent 4f0359de
......@@ -25,19 +25,18 @@ STATUS
------
We can create frames on new tty devices, but there are problems with
refresh (only the (single) selected frame is refreshed), and input is
read only from the initial terminal. At the moment, the type of the
new terminals must be the same as the initial terminal.
redisplay. Input is read from all terminals (NOT via MULTIKBOARD!).
At the moment, the type of the new terminals must be the same as the
initial terminal. Emacsclient is extended to support opening a new
terminal frame.
To try it out, start up emacs, and evaluate the following:
To try it out, start up the emacs server (M-x server-start), and then
start emacsclient with
(make-terminal-frame '((tty . "/dev/pts/5") (tty-type . "xterm")))
emacsclient -h
(With your own values, of course.) If you switch to the new frame
with M-x other-frame, the new tty is refreshed with the frame
contents. The result of input from the original terminal appears on
the new. If you exit emacs, both terminals are restored to their
previous states.
If you exit emacs, both terminals are restored to their previous
states.
X, Mac, Windows and DOS support is broken.
......@@ -50,6 +49,8 @@ For the NEWS file:
specify a terminal device (`tty' parameter) and a terminal type
(`tty-type' parameter) to `make-terminal-frame'.
** Emacsclient has been extended to support opening a new terminal
frame.
CHANGELOG
---------
......@@ -76,15 +77,50 @@ THINGS THAT ARE DONE
(Done, new frame parameters: `tty' and `tty-type'.)
-- Implement support for reading from multiple terminals.
(Done, read_avail_input tries to read from each terminal, until one
succeeds.)
-- other-frame should cycle through the frames on the `current'
terminal.
(Done. A little fragile, but seems to work.)
-- Support different terminal sizes.
(Done, no problem.)
-- Make sure terminal resizes are handled gracefully. (Could be
problematic.)
(Done. We don't get SIGWINCH for additional ttys, though.)
-- Extend emacsclient to automatically open a new tty when it connects
to Emacs.
(Done. It's an ugly hack, needs more work.)
-- Redisplay must refresh the topmost frame on all terminals, not just
the initial terminal.
(Done, but introduced ugly redisplay problems. Ugh.)
THINGS TO DO
------------
** Fix redisplay problems.
** Make make-terminal-frame look up the tty and tty-type parameters
from the currently selected terminal before the global default.
** Move optimalization parameters (costs) from union output_data to
struct frame.
** Provide a way for emacsclient to tell Emacs that the tty has been
resized.
** Implement terminal deletion, i.e., closing the tty device and
restoring its previous state without exiting Emacs. This should be
exported to the Lisp interpreter.
......@@ -96,27 +132,14 @@ THINGS TO DO
Currently, they are still stored in global variables, so we don't
really support multiple terminal types.
** Support different terminal sizes. (Should be solved by the
previous entry.)
** Make sure terminal resizes are handled gracefully. (Could be
problematic.)
** Implement support for reading from multiple terminals.
** other-frame should cycle through the frames on the `current'
terminal. This means that Emacs must know from which terminal the
last keyboard event came from. (Multikeyboard support may help
with this.)
** Redisplay must refresh the topmost on all terminals, not just
the initial terminal.
** Each keypress should automatically select the frame corresponding
to the terminal that it was coming from. This means that Emacs
must know from which terminal the last keyboard event came from.
(Multikeyboard support may help with this.)
** Make struct tty_output available from Lisp.
** Extend emacsclient to automatically open a new tty when it connects
to Emacs.
** Implement support for starting an interactive Emacs session without
an initial frame. (The user would connect to it and open frames
later, with emacsclient.) Not necessary a good idea.
......
This diff is collapsed.
/* Terminal initialization for emacsclient.
Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Terminal initialization for emacsclient.
Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Adapted from systty.h */
#ifdef HAVE_TERMIOS
#define HAVE_TCATTR
#endif
/* Include the proper files. */
#ifdef HAVE_TERMIO
#ifdef __DGUX
#include <sys/ioctl.h>
#endif
#ifndef NO_TERMIO
#include <termio.h>
#endif /* not NO_TERMIO */
#ifndef INCLUDED_FCNTL
#define INCLUDED_FCNTL
#include <fcntl.h>
#endif
#else /* not HAVE_TERMIO */
#ifdef HAVE_TERMIOS
#if defined(_AIX) && defined(_I386)
#include <termios.h> /* termios.h needs to be before termio.h */
#include <termio.h>
#else /* not (_AIX && _I386) */
#ifndef NO_TERMIO
#include <termio.h>
#endif
#include <termios.h>
#endif /* not (_AIX && _I386) */
#define INCLUDED_FCNTL
#include <fcntl.h>
#else /* neither HAVE_TERMIO nor HAVE_TERMIOS */
#ifndef VMS
#ifndef DOS_NT
#include <sgtty.h>
#endif /* not DOS_NT */
#else /* VMS */
#include <descrip.h>
static struct iosb
{
short status;
short offset;
short termlen;
short term;
} input_iosb;
extern int waiting_for_ast;
extern int stop_input;
extern int input_ef;
extern int timer_ef;
extern int process_ef;
extern int input_eflist;
extern int timer_eflist;
static $DESCRIPTOR (input_dsc, "TT");
static int terminator_mask[2] = { 0, 0 };
static struct sensemode {
short status;
unsigned char xmit_baud;
unsigned char rcv_baud;
unsigned char crfill;
unsigned char lffill;
unsigned char parity;
unsigned char unused;
char class;
char type;
short scr_wid;
unsigned long tt_char : 24, scr_len : 8;
unsigned long tt2_char;
} sensemode_iosb;
#endif /* VMS */
#endif /* not HAVE_TERMIOS */
#endif /* not HAVE_TERMIO */
#ifdef __GNU_LIBRARY__
#include <sys/ioctl.h>
#include <termios.h>
#endif
#ifdef AIXHFT
/* Get files for keyboard remapping */
#define HFNKEYS 2
#include <sys/hft.h>
#include <sys/devinfo.h>
#endif
/* Get rid of LLITOUT in 4.1, since it is said to stimulate kernel bugs. */
#ifdef BSD4_1
#undef LLITOUT
#define LLITOUT 0
#endif /* 4.1 */
#ifdef NEED_BSDTTY
#include <sys/bsdtty.h>
#endif
#if defined (HPUX) && defined (HAVE_PTYS)
#include <sys/ptyio.h>
#endif
#ifdef AIX
#include <sys/pty.h>
#endif /* AIX */
#if (defined (POSIX) || defined (NEED_UNISTD_H)) && defined (HAVE_UNISTD_H)
#include <unistd.h>
#endif
#ifdef SYSV_PTYS
#include <sys/types.h>
#include <sys/tty.h>
#ifdef titan
#include <sys/ttyhw.h>
#include <sys/stream.h>
#endif
#ifndef NO_PTY_H
#include <sys/pty.h>
#endif
#endif
/* saka@pfu.fujitsu.co.JP writes:
FASYNC defined in this file. But, FASYNC don't working.
so no problem, because unrequest_sigio only need. */
#if defined (pfa)
#include <sys/file.h>
#endif
/* Special cases - inhibiting the use of certain features. */
#ifdef APOLLO
#undef TIOCSTART
#endif
#ifdef XENIX
#undef TIOCGETC /* Avoid confusing some conditionals that test this. */
#endif
#ifdef BROKEN_TIOCGETC
#undef TIOCGETC /* Avoid confusing some conditionals that test this. */
#endif
/* UNIPLUS systems may have FIONREAD. */
#ifdef UNIPLUS
#include <sys.ioctl.h>
#endif
/* Allow m- file to inhibit use of FIONREAD. */
#ifdef BROKEN_FIONREAD
#undef FIONREAD
#undef ASYNC
#endif
/* Interrupt input is not used if there is no FIONREAD. */
#ifndef FIONREAD
#undef SIGIO
#endif
/* On TERMIOS systems, the tcmumbleattr calls take care of these
parameters, and it's a bad idea to use them (on AIX, it makes the
tty hang for a long time). */
#if defined (TIOCGLTC) && !defined (HAVE_TERMIOS)
#define HAVE_LTCHARS
#endif
#if defined (TIOCGETC) && !defined (HAVE_TERMIOS)
#define HAVE_TCHARS
#endif
/* Try to establish the correct character to disable terminal functions
in a system-independent manner. Note that USG (at least) define
_POSIX_VDISABLE as 0! */
#ifdef _POSIX_VDISABLE
#define CDISABLE _POSIX_VDISABLE
#else /* not _POSIX_VDISABLE */
#ifdef CDEL
#undef CDISABLE
#define CDISABLE CDEL
#else /* not CDEL */
#define CDISABLE 255
#endif /* not CDEL */
#endif /* not _POSIX_VDISABLE */
/* Get the number of characters queued for output. */
/* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters
queued for output to the terminal FD in *SIZE, if FD is a tty.
Returns -1 if there was an error (i.e. FD is not a tty), 0
otherwise. */
#ifdef TIOCOUTQ
#define EMACS_OUTQSIZE(fd, size) (ioctl ((fd), TIOCOUTQ, (size)))
#endif
#ifdef HAVE_TERMIO
#ifdef TCOUTQ
#undef EMACS_OUTQSIZE
#define EMACS_OUTQSIZE(fd, size) (ioctl ((fd), TCOUTQ, (size)))
#endif
#endif
......@@ -319,6 +319,15 @@ PROC is the server process. Format of STRING is \"PATH PATH PATH... \\n\"."
(server-select-display display)
(error (process-send-string proc (nth 1 err))
(setq request "")))))
;; Open a new tty at the client.
((and (equal "-pty" arg) (string-match "\\([^ ]*\\) \\([^ ]*\\) " request))
(let ((pty (server-unquote-arg (match-string 1 request)))
(type (server-unquote-arg (match-string 2 request))))
(setq request (substring request (match-end 0)))
(condition-case err
(make-terminal-frame `((tty . ,pty) (tty-type . ,type)))
(error (process-send-string proc (nth 1 err))
(setq request "")))))
;; ARG is a line number option.
((string-match "\\`\\+[0-9]+\\'" arg)
(setq lineno (string-to-int (substring arg 1))))
......
......@@ -2555,7 +2555,7 @@ extern int x_intersect_rectangles P_ ((XRectangle *, XRectangle *,
/* Defined in sysdep.c */
void get_frame_size P_ ((int *, int *));
void get_tty_size P_ ((struct tty_output *, int *, int *));
void request_sigio P_ ((void));
void unrequest_sigio P_ ((void));
int tabs_safe_p P_ ((void));
......
......@@ -3321,7 +3321,7 @@ DEFUN ("redraw-frame", Fredraw_frame, Sredraw_frame, 1, 1, 0,
clear_frame ();
clear_current_matrices (f);
update_end (f);
fflush (stdout);
fflush (TTY_OUTPUT (FRAME_TTY (f)));
windows_or_buffers_changed++;
/* Mark all windows as inaccurate, so that every window will have
its redisplay done. */
......@@ -3461,7 +3461,7 @@ direct_output_for_insert (g)
/* If we can't insert glyphs, we can use this method only
at the end of a line. */
if (!TTY_CHAR_INS_DEL_OK (CURTTY ()))
if (!TTY_CHAR_INS_DEL_OK (FRAME_TTY (f)))
if (PT != ZV && FETCH_BYTE (PT_BYTE) != '\n')
return 0;
......@@ -3658,7 +3658,7 @@ direct_output_for_insert (g)
rif->update_window_end_hook (w, 1, 0);
update_end (f);
updated_row = NULL;
fflush (stdout);
fflush (TTY_OUTPUT (CURTTY ());
TRACE ((stderr, "direct output for insert\n"));
mark_window_display_accurate (it.window, 1);
......@@ -3749,7 +3749,7 @@ direct_output_forward_char (n)
cursor_to (y, x);
}
fflush (stdout);
fflush (TTY_OUTPUT (CURTTY ()));
redisplay_performed_directly_p = 1;
return 1;
}
......@@ -5102,18 +5102,18 @@ update_frame_1 (f, force_p, inhibit_id_p)
Also flush out if likely to have more than 1k buffered
otherwise. I'm told that some telnet connections get
really screwed by more than 1k output at once. */
int outq = PENDING_OUTPUT_COUNT (stdout);
int outq = PENDING_OUTPUT_COUNT (TTY_OUTPUT (FRAME_TTY (f)));
if (outq > 900
|| (outq > 20 && ((i - 1) % preempt_count == 0)))
{
fflush (stdout);
fflush (TTY_OUTPUT (FRAME_TTY (f)));
if (preempt_count == 1)
{
#ifdef EMACS_OUTQSIZE
if (EMACS_OUTQSIZE (0, &outq) < 0)
/* Probably not a tty. Ignore the error and reset
the outq count. */
outq = PENDING_OUTPUT_COUNT (stdout);
outq = PENDING_OUTPUT_COUNT (TTY_OUTPUT (FRAME_TTY (f)));
#endif
outq *= 10;
if (baud_rate <= outq && baud_rate > 0)
......@@ -5893,28 +5893,34 @@ window_change_signal (signalnum) /* If we don't have an argument, */
#endif
int old_errno = errno;
get_frame_size (&width, &height);
struct tty_output *tty;
/* The frame size change obviously applies to a single
termcap-controlled terminal, but we can't decide which.
Therefore, we resize the frames corresponding to each tty.
XXX In fact we only get the signal for the initial terminal.
*/
for (tty = tty_list; tty; tty = tty->next) {
/* The frame size change obviously applies to a termcap-controlled
frame. Find such a frame in the list, and assume it's the only
one (since the redisplay code always writes to stdout, not a
FILE * specified in the frame structure). Record the new size,
but don't reallocate the data structures now. Let that be done
later outside of the signal handler. */
{
Lisp_Object tail, frame;
FOR_EACH_FRAME (tail, frame)
{
if (FRAME_TERMCAP_P (XFRAME (frame)))
{
change_frame_size (XFRAME (frame), height, width, 0, 1, 0);
break;
}
}
get_tty_size (tty, &width, &height);
{
Lisp_Object tail, frame;
FOR_EACH_FRAME (tail, frame)
{
if (FRAME_TERMCAP_P (XFRAME (frame)) && FRAME_TTY (XFRAME (frame)) == tty)
{
/* Record the new sizes, but don't reallocate the data structures
now. Let that be done later outside of the signal handler. */
change_frame_size (XFRAME (frame), height, width, 0, 1, 0);
break;
}
}
}
}
signal (SIGWINCH, window_change_signal);
errno = old_errno;
}
......@@ -5969,10 +5975,11 @@ change_frame_size (f, newheight, newwidth, pretend, delay, safe)
{
Lisp_Object tail, frame;
if (! FRAME_WINDOW_P (f))
if (FRAME_MSDOS_P (f))
{
/* When using termcap, or on MS-DOS, all frames use
the same screen, so a change in size affects all frames. */
/* On MS-DOS, all frames use the same screen, so a change in
size affects all frames. Termcap now supports multiple
ttys. */
FOR_EACH_FRAME (tail, frame)
if (! FRAME_WINDOW_P (XFRAME (frame)))
change_frame_size_1 (XFRAME (frame), newheight, newwidth,
......@@ -6162,7 +6169,7 @@ terminate any keyboard macro currently executing. */)
putchar (07);
else
ring_bell ();
fflush (stdout);
fflush (TTY_OUTPUT (CURTTY ()));
}
else
bitch_at_user ();
......@@ -6179,7 +6186,7 @@ bitch_at_user ()
error ("Keyboard macro terminated by a command ringing the bell");
else
ring_bell ();
fflush (stdout);
fflush (TTY_OUTPUT (CURTTY ()));
}
......
......@@ -1564,7 +1564,7 @@ main (argc, argv
if (!noninteractive)
{
#ifdef VMS
init_vms_input ();/* init_display calls get_frame_size, that needs this. */
init_vms_input ();/* init_display calls get_tty_size, that needs this. */
#endif /* VMS */
init_display (); /* Determine terminal type. Calls init_sys_modes. */
}
......
......@@ -114,8 +114,6 @@ Lisp_Object Qfullscreen, Qfullwidth, Qfullheight, Qfullboth;
Lisp_Object Qface_set_after_frame_default;
Lisp_Object Vterminal_frame;
Lisp_Object Vdefault_frame_alist;
Lisp_Object Vdefault_frame_scroll_bars;
Lisp_Object Vmouse_position_function;
......@@ -550,6 +548,7 @@ make_terminal_frame (tty, tty_type)
f->output_data.tty = term_init (tty, tty_type);
else
f->output_data.tty = term_dummy_init ();
f->output_data.tty->top_frame = frame;
#ifdef CANNOT_DUMP
FRAME_FOREGROUND_PIXEL(f) = FACE_TTY_DEFAULT_FG_COLOR;
FRAME_BACKGROUND_PIXEL(f) = FACE_TTY_DEFAULT_BG_COLOR;
......@@ -637,12 +636,15 @@ Note that changing the size of one terminal frame automatically affects all. */
type[SBYTES (tty_type)] = 0;
}
f = make_terminal_frame (name, type);
}
change_frame_size (f, FRAME_LINES (sf),
FRAME_COLS (sf), 0, 0, 0);
{
int width, height;
get_tty_size (FRAME_TTY (f), &width, &height);
change_frame_size (f, height, width, 0, 0, 0);
}
adjust_glyphs (f);
calculate_costs (f);
XSETFRAME (frame, f);
......@@ -746,6 +748,15 @@ do_switch_frame (frame, track, for_deletion)
if (!for_deletion && FRAME_HAS_MINIBUF_P (sf))
resize_mini_window (XWINDOW (FRAME_MINIBUF_WINDOW (sf)), 1);
if (FRAME_TERMCAP_P (XFRAME (selected_frame))
&& FRAME_TERMCAP_P (XFRAME (frame))
&& FRAME_TTY (XFRAME (selected_frame)) == FRAME_TTY (XFRAME (frame)))
{
XFRAME (selected_frame)->async_visible = 0;
XFRAME (frame)->async_visible = 1;
FRAME_TTY (XFRAME (frame))->top_frame = frame;
}
selected_frame = frame;
if (! FRAME_MINIBUF_ONLY_P (XFRAME (selected_frame)))
last_nonminibuf_frame = XFRAME (selected_frame);
......@@ -979,7 +990,10 @@ next_frame (frame, minibuf)
f = XCAR (tail);
if (passed
&& FRAME_KBOARD (XFRAME (f)) == FRAME_KBOARD (XFRAME (frame)))
&& ((!FRAME_TERMCAP_P (XFRAME (f)) && !FRAME_TERMCAP_P (XFRAME (frame))
&& FRAME_KBOARD (XFRAME (f)) == FRAME_KBOARD (XFRAME (frame)))
|| (FRAME_TERMCAP_P (XFRAME (f)) && FRAME_TERMCAP_P (XFRAME (frame))
&& FRAME_TTY (XFRAME (f)) == FRAME_TTY (XFRAME (frame)))))
{
/* Decide whether this frame is eligible to be returned. */
......@@ -1056,7 +1070,10 @@ prev_frame (frame, minibuf)
if (EQ (frame, f) && !NILP (prev))
return prev;
if (FRAME_KBOARD (XFRAME (f)) == FRAME_KBOARD (XFRAME (frame)))
if ((!FRAME_TERMCAP_P (XFRAME (f)) && !FRAME_TERMCAP_P (XFRAME (frame))
&& FRAME_KBOARD (XFRAME (f)) == FRAME_KBOARD (XFRAME (frame)))
|| (FRAME_TERMCAP_P (XFRAME (f)) && FRAME_TERMCAP_P (XFRAME (frame))
&& FRAME_TTY (XFRAME (f)) == FRAME_TTY (XFRAME (frame))))
{
/* Decide whether this frame is eligible to be returned,
according to minibuf. */
......@@ -4081,9 +4098,6 @@ Setting this variable does not affect existing frames, only new ones. */);
= intern ("inhibit-default-face-x-resources");
staticpro (&Qinhibit_default_face_x_resources);
DEFVAR_LISP ("terminal-frame", &Vterminal_frame,
doc: /* The initial frame-object, which represents Emacs's stdout. */);
DEFVAR_LISP ("emacs-iconified", &Vemacs_iconified,
doc: /* Non-nil if all of emacs is iconified and frame updates are not needed. */);
Vemacs_iconified = Qnil;
......
......@@ -28,9 +28,7 @@ Boston, MA 02111-1307, USA. */
/* Miscellanea. */
/* Nonzero means don't assume anything about current contents of
actual terminal frame */
/* Nonzero means there is at least one garbaged frame. */
extern int frame_garbaged;
/* Nonzero means FRAME_MESSAGE_BUF (selected_frame) is being used by
......@@ -71,7 +69,7 @@ enum text_cursor_kinds
#if !defined(HAVE_X_WINDOWS)
#define PIX_TYPE int
#define PIX_TYPE unsigned long
/* A (mostly empty) x_output structure definition for building Emacs
on Unix and GNU/Linux without X support. */
......@@ -743,7 +741,10 @@ typedef struct frame *FRAME_PTR;
Also, if a frame used to be invisible, but has just become visible,
it must be marked as garbaged, since redisplay hasn't been keeping
up its contents. */
up its contents.
Note that a tty frame is visible if and only if it is the topmost
frame. */
#define FRAME_SAMPLE_VISIBILITY(f) \
(((f)->async_visible && (f)->visible != (f)->async_visible) ? \
......@@ -799,8 +800,6 @@ extern int other_visible_frames P_ ((struct frame *));
extern Lisp_Object Vframe_list;
extern Lisp_Object Vdefault_frame_alist;
extern Lisp_Object Vterminal_frame;
extern Lisp_Object Vmouse_highlight;