This is device-stream.c in view mode; [Download] [Up]
/* Stream device functions. Copyright (C) 1995 Amdahl Corporation 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Synched up with: Not in FSF. */ /* This file has been Mule-ized. */ /* Written by Ben Wing. */ #include <config.h> #include "lisp.h" #include "device-stream.h" #include "events.h" #include "frame.h" #include "redisplay.h" #include "sysdep.h" DEFINE_DEVICE_TYPE (stream); Lisp_Object Vterminal_device; Lisp_Object Vterminal_frame; static void allocate_stream_device_struct (struct device *d) { d->device_data = (struct stream_device *) xmalloc (sizeof (struct stream_device)); /* zero out all slots. */ memset (d->device_data, 0, sizeof (struct stream_device)); } static void stream_init_device (struct device *d, Lisp_Object device_data) { Lisp_Object tty = Qnil; FILE *infd, *outfd, *errfd; tty = Fnth (Qzero, device_data); /* Open the specified device */ if (NILP (tty)) { infd = stdin; outfd = stdout; errfd = stderr; } else { CHECK_STRING (tty, 0); infd = outfd = errfd = fopen ((char *) string_data (XSTRING (tty)), "r+"); if (!infd) error ("Unable to open tty %s", string_data (XSTRING (tty))); } allocate_stream_device_struct (d); DEVICE_STREAM_DATA (d)->infd = infd; DEVICE_STREAM_DATA (d)->outfd = outfd; DEVICE_STREAM_DATA (d)->errfd = errfd; DEVICE_INFD (d) = fileno (infd); DEVICE_OUTFD (d) = fileno (outfd); init_baud_rate (d); init_one_device (d); } static int stream_initially_selected_for_input (struct device *d) { return noninteractive && initialized; } static void free_stream_device_struct (struct device *d) { struct stream_device *td = (struct stream_device *) d->device_data; if (td) xfree (td); } extern int stdout_needs_newline; static void stream_delete_device (struct device *d) { if (/* DEVICE_STREAM_DATA (d)->needs_newline */ stdout_needs_newline) /* #### clean this up */ { fputc ('\n', DEVICE_STREAM_DATA (d)->outfd); fflush (DEVICE_STREAM_DATA (d)->outfd); } if (DEVICE_STREAM_DATA (d)->infd != stdin) fclose (DEVICE_STREAM_DATA (d)->infd); free_stream_device_struct (d); } static void stream_init_frame (struct frame *f, Lisp_Object parms) { 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 void stream_font_metric_info (struct device *d, Lisp_Object font, struct font_metric_info *fm) { fm->width = 1; fm->height = 1; fm->ascent = 1; fm->descent = 0; fm->proportional = 0; } static int stream_text_width (struct window *w, Lisp_Object font, CONST Emchar *s, int 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) { fputc (07, DEVICE_STREAM_DATA (d)->outfd); fflush (DEVICE_STREAM_DATA (d)->outfd); } /************************************************************************/ /* initialization */ /************************************************************************/ void device_type_create_stream (void) { INITIALIZE_DEVICE_TYPE (stream, "stream", "device-stream-p"); /* device methods */ DEVICE_HAS_METHOD (stream, init_device); DEVICE_HAS_METHOD (stream, initially_selected_for_input); DEVICE_HAS_METHOD (stream, delete_device); /* frame methods */ DEVICE_HAS_METHOD (stream, init_frame); /* redisplay methods */ DEVICE_HAS_METHOD (stream, left_margin_width); DEVICE_HAS_METHOD (stream, right_margin_width); DEVICE_HAS_METHOD (stream, text_width); DEVICE_HAS_METHOD (stream, font_metric_info); DEVICE_HAS_METHOD (stream, output_display_block); DEVICE_HAS_METHOD (stream, output_vertical_divider); DEVICE_HAS_METHOD (stream, divider_width); DEVICE_HAS_METHOD (stream, divider_height); DEVICE_HAS_METHOD (stream, eol_cursor_width); DEVICE_HAS_METHOD (stream, clear_to_window_end); DEVICE_HAS_METHOD (stream, clear_region); DEVICE_HAS_METHOD (stream, clear_frame); DEVICE_HAS_METHOD (stream, output_begin); DEVICE_HAS_METHOD (stream, output_end); DEVICE_HAS_METHOD (stream, flash); DEVICE_HAS_METHOD (stream, ring_bell); } void vars_of_device_stream (void) { 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_device_stream (void) { /* This function can GC */ if (!initialized) { Vterminal_device = Fmake_device (Qstream, Qnil); Vterminal_frame = Fmake_frame (Qnil, Vterminal_device); } else if (noninteractive) event_stream_select_device (XDEVICE (Vterminal_device)); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.