diff src/frame-tty.c @ 149:538048ae2ab8 r20-3b1

Import from CVS: tag r20-3b1
author cvs
date Mon, 13 Aug 2007 09:36:16 +0200
parents 360340f9fd5f
children 25f70ba0133c
line wrap: on
line diff
--- a/src/frame-tty.c	Mon Aug 13 09:35:15 2007 +0200
+++ b/src/frame-tty.c	Mon Aug 13 09:36:16 2007 +0200
@@ -1,6 +1,7 @@
 /* TTY frame functions.
-   Copyright (C) 1995 Free Software Foundation, Inc.
+   Copyright (C) 1995  Free Software Foundation, Inc.
    Copyright (C) 1995, 1996 Ben Wing.
+   Copyright (C) 1997  Free Software Foundation, Inc.
 
 This file is part of XEmacs.
 
@@ -21,11 +22,8 @@
 
 /* Synched up with: Not in FSF. */
 
-/* Written by Ben Wing. */
-
-/* #### This file is just a stub.  It should be possible to have more
-   than one frame on a tty, with only one frame being "active" (displayed)
-   at a time. */
+/* Written by Ben Wing.
+   Multi-frame support added by Hrvoje Niksic. */
 
 #include <config.h>
 #include "lisp.h"
@@ -33,25 +31,47 @@
 #include "console-tty.h"
 #include "frame.h"
 
+
+/* Default properties to use when creating frames.  */
 Lisp_Object Vdefault_tty_frame_plist;
 
+/* The count of frame number. */
+static int tty_frame_count;
+
+static void tty_make_frame_visible (struct frame *);
+static void tty_make_frame_invisible (struct frame *);
+
+
 static void
 tty_init_frame_1 (struct frame *f, Lisp_Object props)
 {
   struct device *d = XDEVICE (FRAME_DEVICE (f));
   struct console *c = XCONSOLE (DEVICE_CONSOLE (d));
-  if (!NILP (DEVICE_FRAME_LIST (d)))
-    error ("Only one frame allowed on TTY devices");
 
-  f->name = build_string ("emacs");
+  ++CONSOLE_TTY_DATA (c)->frame_count;
+  f->order_count = CONSOLE_TTY_DATA (c)->frame_count;
   f->height = CONSOLE_TTY_DATA (c)->height;
   f->width = CONSOLE_TTY_DATA (c)->width;
-  f->visible = 1;
 #ifdef HAVE_SCROLLBARS
   f->scrollbar_on_left = 1;
   f->scrollbar_on_top = 0;
 #endif
+}
+
+static void
+tty_init_frame_3 (struct frame *f)
+{
+  struct device *d = XDEVICE (FRAME_DEVICE (f));
+  Lisp_Object tail = DEVICE_FRAME_LIST (d);
+
+  while (CONSP (tail))
+    {
+      tty_make_frame_invisible (decode_frame (XCAR (tail)));
+      tail = XCDR (tail);
+    }
+  select_frame_2 (make_frame (f));
   SET_FRAME_CLEAR (f);
+  tty_make_frame_visible (f);
 }
 
 static void
@@ -59,7 +79,7 @@
 		      int first_on_console)
 {
   if (first_on_console)
-      call1 (Qinit_post_tty_win, FRAME_CONSOLE (f));
+    call1 (Qinit_post_tty_win, FRAME_CONSOLE (f));
 }
 
 /* Change from withdrawn state to mapped state. */
@@ -71,20 +91,72 @@
       SET_FRAME_CLEAR(f);
       f->visible = 1;
     }
-  
 }
 
 /* Change from mapped state to withdrawn state. */
 static void
 tty_make_frame_invisible (struct frame *f)
 {
-    f->visible = 0;
+  f->visible = 0;
 }
 
 static int
 tty_frame_visible_p (struct frame *f)
 {
-  return FRAME_VISIBLE_P(f);
+  return FRAME_VISIBLE_P (f);
+}
+
+/* Raise the frame.  This means that it becomes visible, and all the
+   others become invisible.  */
+static void
+tty_raise_frame (struct frame *f)
+{
+  struct device *d = XDEVICE (FRAME_DEVICE (f));
+  Lisp_Object frame_list = DEVICE_FRAME_LIST (d);
+  Lisp_Object tail = frame_list;
+
+  while (CONSP (tail))
+    {
+      if (decode_frame (XCAR (tail)) != f)
+	tty_make_frame_invisible (XFRAME (XCAR (tail)));
+      tail = XCDR (tail);
+    }
+  select_frame_2 (make_frame (f));
+  tty_make_frame_visible (f);
+}
+
+/* Lower the frame.  This means that it becomes invisible, while the
+   one after it in the frame list becomes visible.  */
+static void
+tty_lower_frame (struct frame *f)
+{
+  struct device *d = XDEVICE (FRAME_DEVICE (f));
+  Lisp_Object frame_list = DEVICE_FRAME_LIST (d);
+  Lisp_Object tail;
+  Lisp_Object new;
+
+  if (!FRAME_VISIBLE_P (f))
+    return;
+
+  tail = frame_list;
+  while (CONSP (tail))
+    {
+      if (decode_frame (XCAR (tail)) == f)
+	break;
+      tail = XCDR (tail);
+    }
+  if (!CONSP (tail))
+    {
+      error ("Cannot find frame to lower");
+    }
+
+  tty_make_frame_invisible (f);
+  if (CONSP (XCDR (tail)))
+    new = XCAR (XCDR (tail));
+  else
+    new = XCAR (frame_list);
+  tty_make_frame_visible (XFRAME (new));
+  select_frame_2 (new);
 }
 
 
@@ -96,10 +168,13 @@
 console_type_create_frame_tty (void)
 {
   CONSOLE_HAS_METHOD (tty, init_frame_1);
+  CONSOLE_HAS_METHOD (tty, init_frame_3);
   CONSOLE_HAS_METHOD (tty, after_init_frame);
   CONSOLE_HAS_METHOD (tty, make_frame_visible);
   CONSOLE_HAS_METHOD (tty, make_frame_invisible);
   CONSOLE_HAS_METHOD (tty, frame_visible_p);
+  CONSOLE_HAS_METHOD (tty, raise_frame);
+  CONSOLE_HAS_METHOD (tty, lower_frame);
 }
 
 void