diff src/console-stream.c @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children bcdc7deadc19
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/console-stream.c	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,335 @@
+/* Stream device functions.
+   Copyright (C) 1995 Free Software Foundation, Inc.
+   Copyright (C) 1996 Ben Wing.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+/* This file has been Mule-ized. */
+
+/* Written by Ben Wing. */
+
+#include <config.h>
+#include "lisp.h"
+
+#include "console-stream.h"
+#include "console-tty.h"
+#include "events.h"
+#include "frame.h"
+#include "redisplay.h"
+#include "sysdep.h"
+#include "window.h"
+
+DEFINE_CONSOLE_TYPE (stream);
+
+Lisp_Object Vterminal_console;
+Lisp_Object Vterminal_device;
+Lisp_Object Vterminal_frame;
+
+extern Lisp_Object Vstdio_str; /* in console-tty.c */
+
+static void
+allocate_stream_console_struct (struct console *con)
+{
+  con->console_data =
+    (struct stream_console *) xmalloc (sizeof (struct stream_console));
+
+  /* zero out all slots. */
+  memset (con->console_data, 0, sizeof (struct stream_console));
+}
+
+static void
+stream_init_console (struct console *con, Lisp_Object params)
+{
+  Lisp_Object tty = CONSOLE_CONNECTION (con);
+  FILE *infd, *outfd, *errfd;
+
+  /* Open the specified console */
+
+  if (NILP (tty) || !NILP (Fequal (tty, Vstdio_str)))
+    {
+      infd = stdin;
+      outfd = stdout;
+      errfd = stderr;
+    }
+  else
+    {
+      CHECK_STRING (tty);
+      infd = outfd = errfd =
+	fopen ((char *) string_data (XSTRING (tty)), "r+");
+      if (!infd)
+	error ("Unable to open tty %s", string_data (XSTRING (tty)));
+    }
+
+  allocate_stream_console_struct (con);
+  CONSOLE_STREAM_DATA (con)->infd = infd;
+  CONSOLE_STREAM_DATA (con)->outfd = outfd;
+  CONSOLE_STREAM_DATA (con)->errfd = errfd;
+}
+
+static void
+stream_init_device (struct device *d, Lisp_Object params)
+{
+  struct console *con = XCONSOLE (DEVICE_CONSOLE (d));
+
+  DEVICE_INFD (d) = fileno (CONSOLE_STREAM_DATA (con)->infd);
+  DEVICE_OUTFD (d) = fileno (CONSOLE_STREAM_DATA (con)->outfd);
+  init_baud_rate (d);
+  init_one_device (d);
+}
+
+static int
+stream_initially_selected_for_input (struct console *con)
+{
+  return noninteractive && initialized;
+}
+
+static void
+free_stream_console_struct (struct console *con)
+{
+  struct stream_console *tcon = (struct stream_console *) con->console_data;
+  if (tcon)
+    xfree (tcon);
+}
+
+extern int stdout_needs_newline;
+
+static void
+stream_delete_console (struct console *con)
+{
+  if (/* CONSOLE_STREAM_DATA (con)->needs_newline */
+      stdout_needs_newline) /* #### clean this up */    
+    {
+      fputc ('\n', CONSOLE_STREAM_DATA (con)->outfd);
+      fflush (CONSOLE_STREAM_DATA (con)->outfd);
+    }
+  if (CONSOLE_STREAM_DATA (con)->infd != stdin)
+    fclose (CONSOLE_STREAM_DATA (con)->infd);
+  free_stream_console_struct (con);
+}
+
+static Lisp_Object
+stream_semi_canonicalize_console_connection (Lisp_Object connection,
+					     Error_behavior errb)
+{
+  return tty_semi_canonicalize_console_connection (connection, errb);
+}
+
+static Lisp_Object
+stream_canonicalize_console_connection (Lisp_Object connection,
+					Error_behavior errb)
+{
+  return tty_canonicalize_console_connection (connection, errb);
+}
+
+static Lisp_Object
+stream_semi_canonicalize_device_connection (Lisp_Object connection,
+					    Error_behavior errb)
+{
+  return tty_semi_canonicalize_device_connection (connection, errb);
+}
+
+static Lisp_Object
+stream_canonicalize_device_connection (Lisp_Object connection,
+				       Error_behavior errb)
+{
+  return tty_canonicalize_device_connection (connection, errb);
+}
+
+
+static void
+stream_init_frame_1 (struct frame *f, Lisp_Object props)
+{
+  struct device *d = XDEVICE (FRAME_DEVICE (f));
+  if (!NILP (DEVICE_FRAME_LIST (d)))
+    error ("Only one frame allowed on stream devices");
+
+  f->name = build_string ("stream");
+  f->height = 80;
+  f->width = 24;
+  f->visible = 0; /* so redisplay doesn't try to do anything */
+}
+
+
+static int
+stream_text_width (struct face_cachel *cachel, CONST Emchar *str,
+		   Charcount len)
+{
+  return len;
+}
+
+static int
+stream_left_margin_width (struct window *w)
+{
+  return 0;
+}
+
+static int
+stream_right_margin_width (struct window *w)
+{
+  return 0;
+}
+
+static int
+stream_divider_width (void)
+{
+  return 1;
+}
+
+static int
+stream_divider_height (void)
+{
+  return 1;
+}
+
+static int
+stream_eol_cursor_width (void)
+{
+  return 1;
+}
+
+static void
+stream_output_begin (struct device *d)
+{
+}
+
+static void
+stream_output_end (struct device *d)
+{
+}
+
+static void
+stream_output_display_block (struct window *w, struct display_line *dl,
+			     int block, int start, int end,
+			     int start_pixpos, int cursor_start,
+			     int cursor_width, int cursor_height)
+{
+}
+
+static void
+stream_output_vertical_divider (struct window *w, int clear)
+{
+}
+
+static void
+stream_clear_to_window_end (struct window *w, int ypos1, int ypos2)
+{
+}
+
+static void
+stream_clear_region (Lisp_Object locale, face_index findex, int x, int y,
+		       int width, int height)
+{
+}
+
+static void
+stream_clear_frame (struct frame *f)
+{
+}
+
+static int
+stream_flash (struct device *d)
+{
+  return 0; /* sorry can't do it */
+}
+
+static void
+stream_ring_bell (struct device *d, int volume, int pitch, int duration)
+{
+  struct console *c = XCONSOLE (DEVICE_CONSOLE (d));
+  fputc (07, CONSOLE_STREAM_DATA (c)->outfd);
+  fflush (CONSOLE_STREAM_DATA (c)->outfd);
+}
+
+
+/************************************************************************/
+/*                            initialization                            */
+/************************************************************************/
+
+void
+console_type_create_stream (void)
+{
+  INITIALIZE_CONSOLE_TYPE (stream, "stream", "console-stream-p");
+
+  /* console methods */
+  CONSOLE_HAS_METHOD (stream, init_console);
+  CONSOLE_HAS_METHOD (stream, initially_selected_for_input);
+  CONSOLE_HAS_METHOD (stream, delete_console);
+  CONSOLE_HAS_METHOD (stream, canonicalize_console_connection);
+  CONSOLE_HAS_METHOD (stream, canonicalize_device_connection);
+  CONSOLE_HAS_METHOD (stream, semi_canonicalize_console_connection);
+  CONSOLE_HAS_METHOD (stream, semi_canonicalize_device_connection);
+
+  /* device methods */
+  CONSOLE_HAS_METHOD (stream, init_device);
+
+  /* frame methods */
+  CONSOLE_HAS_METHOD (stream, init_frame_1);
+
+  /* redisplay methods */
+  CONSOLE_HAS_METHOD (stream, left_margin_width);
+  CONSOLE_HAS_METHOD (stream, right_margin_width);
+  CONSOLE_HAS_METHOD (stream, text_width);
+  CONSOLE_HAS_METHOD (stream, output_display_block);
+  CONSOLE_HAS_METHOD (stream, output_vertical_divider);
+  CONSOLE_HAS_METHOD (stream, divider_width);
+  CONSOLE_HAS_METHOD (stream, divider_height);
+  CONSOLE_HAS_METHOD (stream, eol_cursor_width);
+  CONSOLE_HAS_METHOD (stream, clear_to_window_end);
+  CONSOLE_HAS_METHOD (stream, clear_region);
+  CONSOLE_HAS_METHOD (stream, clear_frame);
+  CONSOLE_HAS_METHOD (stream, output_begin);
+  CONSOLE_HAS_METHOD (stream, output_end);
+  CONSOLE_HAS_METHOD (stream, flash);
+  CONSOLE_HAS_METHOD (stream, ring_bell);
+}
+
+void
+vars_of_console_stream (void)
+{
+  DEFVAR_LISP ("terminal-console", &Vterminal_console /*
+The initial console-object, which represent's Emacs's stdout.
+*/ );
+  Vterminal_console = Qnil;
+
+  DEFVAR_LISP ("terminal-device", &Vterminal_device /*
+The initial device-object, which represent's Emacs's stdout.
+*/ );
+  Vterminal_device = Qnil;
+
+  DEFVAR_LISP ("terminal-frame", &Vterminal_frame /*
+The initial frame-object, which represents Emacs's stdout.
+*/ );
+  Vterminal_frame = Qnil;
+}
+
+void
+init_console_stream (void)
+{
+  /* This function can GC */
+  if (!initialized)
+    {
+      Vterminal_device = Fmake_device (Qstream, Qnil, Qnil);
+      Vterminal_console = Fdevice_console (Vterminal_device);
+      Vterminal_frame = Fmake_frame (Qnil, Vterminal_device);
+      minibuf_window = XFRAME (Vterminal_frame)->minibuffer_window;
+    }
+  else if (noninteractive)
+    event_stream_select_console (XCONSOLE (Vterminal_console));
+}