summaryrefslogtreecommitdiff
path: root/src/frame.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1995-02-17 08:09:33 +0000
committerRichard M. Stallman <rms@gnu.org>1995-02-17 08:09:33 +0000
commita252da45f83249a12d73923ff263125d9f96f849 (patch)
treecbad8f64ae2b16ceeabf1a1263d3c19d3c75937b /src/frame.c
parenta393d057ca89e451f57f476fe5de69a214dba7b5 (diff)
downloademacs-a252da45f83249a12d73923ff263125d9f96f849.tar.gz
(Fmake_terminal_frame): New function.
(syms_of_frame): defsubr it. (make_terminal_frame): Init Vframe_list only the first time. Set visible and async_visible directly. (redisplay): Don't display nonselected terminal frames.
Diffstat (limited to 'src/frame.c')
-rw-r--r--src/frame.c48
1 files changed, 44 insertions, 4 deletions
diff --git a/src/frame.c b/src/frame.c
index 56694a97b80..12eb303f110 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -323,24 +323,55 @@ make_minibuffer_frame ()
/* Construct a frame that refers to the terminal (stdin and stdout). */
+static int terminal_frame_count;
+
struct frame *
make_terminal_frame ()
{
register struct frame *f;
Lisp_Object frame;
+ char name[20];
+
+ /* The first call must initialize Vframe_list. */
+ if (! (NILP (Vframe_list) || CONSP (Vframe_list)))
+ Vframe_list = Qnil;
- Vframe_list = Qnil;
f = make_frame (1);
XSETFRAME (frame, f);
Vframe_list = Fcons (frame, Vframe_list);
- f->name = build_string ("terminal");
- FRAME_SET_VISIBLE (f, 1);
- f->display.nothing = 1; /* Nonzero means frame isn't deleted. */
+ terminal_frame_count++;
+ sprintf (name, "terminal-%d", terminal_frame_count);
+
+ f->name = build_string (name);
+ f->visible = 1; /* FRAME_SET_VISIBLE wd set frame_garbaged. */
+ f->async_visible = 1; /* Don't let visible be cleared later. */
+ f->display.nothing = 1; /* Nonzero means frame isn't deleted. */
XSETFRAME (Vterminal_frame, f);
return f;
}
+
+DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
+ 1, 1, 0, "")
+ (parms)
+ Lisp_Object parms;
+{
+ struct frame *f;
+ Lisp_Object frame;
+
+ if (selected_frame->output_method != output_termcap)
+ error ("Not using an ASCII terminal now; cannot make a new ASCII frame");
+
+ f = make_terminal_frame ();
+ change_frame_size (f, FRAME_HEIGHT (selected_frame),
+ FRAME_WIDTH (selected_frame), 0, 0);
+ remake_frame_glyphs (f);
+ calculate_costs (f);
+ XSETFRAME (frame, f);
+ Fmodify_frame_parameters (frame, parms);
+ return frame;
+}
static Lisp_Object
do_switch_frame (frame, no_enter, track)
@@ -409,6 +440,14 @@ do_switch_frame (frame, no_enter, track)
#endif /* HAVE_X_WINDOWS */
#endif /* ! 0 */
+ if (FRAME_TERMCAP_P (XFRAME (frame)))
+ {
+ /* Since frames on an ASCII terminal share the same display area,
+ switching means we must redisplay the whole thing. */
+ windows_or_buffers_changed++;
+ SET_FRAME_GARBAGED (XFRAME (frame));
+ }
+
selected_frame = XFRAME (frame);
if (! FRAME_MINIBUF_ONLY_P (selected_frame))
last_nonminibuf_frame = selected_frame;
@@ -1810,6 +1849,7 @@ The `menu-bar-lines' element of the list controls whether new frames\n\
defsubr (&Sframep);
defsubr (&Sframe_live_p);
+ defsubr (&Smake_terminal_frame);
defsubr (&Shandle_switch_frame);
defsubr (&Sselect_frame);
defsubr (&Sselected_frame);