input_available_clear_time = 0;
}
-/* This routine is called at interrupt level in response to C-g.
-
- If interrupt_input, this is the handler for SIGINT. Otherwise, it
- is called from kbd_buffer_store_event, in handling SIGIO or
- SIGTINT.
-
- If `waiting_for_input' is non zero, then unless `echoing' is
- nonzero, immediately throw back to read_char.
-
- Otherwise it sets the Lisp variable quit-flag not-nil. This causes
- eval to throw, when it gets a chance. If quit-flag is already
- non-nil, it stops the job right away.
+/* The SIGINT handler.
- XXX This comment needs to be updated. */
+ If we have a frame on the controlling tty, the SIGINT was generated
+ by C-g, so we call handle_interrupt. Otherwise, the handler kills
+ Emacs. */
static SIGTYPE
interrupt_signal (signalnum) /* If we don't have an argument, */
internal_last_event_frame = display->display_info.tty->top_frame;
handle_interrupt ();
-
}
errno = old_errno;
}
-/* C-g processing, signal independent code.
+/* This routine is called at interrupt level in response to C-g.
+
+ It is called from the SIGINT handler or kbd_buffer_store_event.
+
+ If `waiting_for_input' is non zero, then unless `echoing' is
+ nonzero, immediately throw back to read_char.
+
+ Otherwise it sets the Lisp variable quit-flag not-nil. This causes
+ eval to throw, when it gets a chance. If quit-flag is already
+ non-nil, it stops the job right away. */
- XXX Expand this comment. */
static void
handle_interrupt ()
{
static struct tchars new_tchars = {-1,-1,-1,-1,-1,-1};
#endif
+/* Initialize the terminal mode on all tty devices that are currently
+ open. */
+
void
init_all_sys_modes (void)
{
init_sys_modes (tty);
}
+/* Initialize the terminal mode on the given tty device. */
+
void
init_sys_modes (tty_out)
struct tty_display_info *tty_out;
}
\f
+
+/* Prepare all terminal devices for exiting Emacs. */
+
void
reset_all_sys_modes (void)
{
/* Prepare the terminal for closing it; move the cursor to the
bottom of the frame, turn off interrupt-driven I/O, etc. */
+
void
reset_sys_modes (tty_out)
struct tty_display_info *tty_out;
}
if (!tty_out->term_initted)
return;
-
+
+ /* Go to and clear the last line of the terminal. */
+
cmgoto (tty_out, FrameRows (tty_out) - 1, 0);
-#if 0 /* XXX This doesn't work anymore, the signature has changed. */
- tty_clear_end_of_line (tty_out, FrameCols (tty_out));
-#endif
+
+ /* Code adapted from tty_clear_end_of_line. */
+ if (tty_out->TS_clr_line)
+ {
+ emacs_tputs (tty_out, tty_out->TS_clr_line, 1, cmputc);
+ }
+ else
+ { /* have to do it the hard way */
+ int i;
+ turn_off_insert (tty_out);
+
+ for (i = curX (tty_out); i < FrameCols (tty_out) - 1; i++)
+ {
+ fputc (' ', TTY_OUTPUT (tty_out));
+ }
+ }
+
cmgoto (tty_out, FrameRows (tty_out) - 1, 0);
fflush (tty_out->output);
(*FRAME_DISPLAY (f)->ring_bell_hook) ();
}
+/* Ring the bell on a tty. */
+
void
tty_ring_bell ()
{
: tty->TS_bell));
}
-void tty_set_terminal_modes (struct display *display)
+/* Set up termcap modes for Emacs. */
+
+void
+tty_set_terminal_modes (struct display *display)
{
struct tty_display_info *tty = display->display_info.tty;
losecursor (tty);
}
-void tty_reset_terminal_modes (struct display *display)
+/* Reset termcap modes before exiting Emacs. */
+
+void
+tty_reset_terminal_modes (struct display *display)
{
struct tty_display_info *tty = display->display_info.tty;
updating_frame = NULL;
}
+/* Flag the end of a display update on a termcap display. */
+
void
tty_update_end (struct frame *f)
{
background_highlight (tty);
}
+/* Specify how many text lines, from the top of the window,
+ should be affected by insert-lines and delete-lines operations.
+ This, and those operations, are used only within an update
+ that is bounded by calls to update_begin and update_end. */
+
void
set_terminal_window (size)
int size;
(*FRAME_DISPLAY (f)->set_terminal_window_hook) (size);
}
+/* The implementation of set_terminal_window for termcap frames. */
+
void
tty_set_terminal_window (int size)
{
\f
/* Erase operations */
-/* clear from cursor to end of frame */
+/* Clear from cursor to end of frame. */
void
clear_to_end ()
{
(*FRAME_DISPLAY (f)->clear_to_end_hook) ();
}
+/* Clear from cursor to end of frame on a termcap device. */
+
void
tty_clear_to_end (void)
{
(*FRAME_DISPLAY (f)->clear_frame_hook) ();
}
+/* Clear an entire termcap frame. */
+
void
tty_clear_frame ()
{
(*FRAME_DISPLAY (f)->clear_end_of_line_hook) (first_unused_hpos);
}
+/* An implementation of clear_end_of_line for termcap frames.
+
+ Note that the cursor may be moved, on terminals lacking a `ce' string. */
+
void
tty_clear_end_of_line (int first_unused_hpos)
{
}
+/* Output LEN glyphs starting at STRING at the nominal cursor position.
+ Advance the nominal cursor over the text. */
+
void
write_glyphs (string, len)
register struct glyph *string;
(*FRAME_DISPLAY (f)->write_glyphs_hook) (string, len);
}
+/* An implementation of write_glyphs for termcap frames. */
+
void
tty_write_glyphs (struct glyph *string, int len)
{
cmcheckmagic (tty);
}
-/* If start is zero, insert blanks instead of a string at start */
+/* Insert LEN glyphs from START at the nominal cursor position.
+
+ If start is zero, insert blanks instead of a string at start */
void
insert_glyphs (start, len)
(*FRAME_DISPLAY (f)->insert_glyphs_hook) (start, len);
}
+/* An implementation of insert_glyphs for termcap frames. */
+
void
tty_insert_glyphs (struct glyph *start, int len)
{
cmcheckmagic (tty);
}
+/* Delete N glyphs at the nominal cursor position. */
+
void
delete_glyphs (n)
register int n;
(*FRAME_DISPLAY (f)->delete_glyphs_hook) (n);
}
+/* An implementation of delete_glyphs for termcap frames. */
+
void
tty_delete_glyphs (int n)
{
(*FRAME_DISPLAY (f)->ins_del_lines_hook) (vpos, n);
}
+/* An implementation of ins_del_lines for termcap frames. */
+
void
tty_ins_del_lines (int vpos, int n)
{
\f
+/* Return the termcap display with the given name. If NAME is null,
+ return the display corresponding to our controlling terminal.
+
+ Returns NULL if the named terminal device is not opened. */
+
struct display *
get_named_tty_display (name)
char *name;
***********************************************************************/
/* Create the bootstrap display device for the initial frame.
+ Returns a display of type output_initial. */
-Returns a display of type output_initial. */
struct display *
init_initial_display (void)
{
/* Deletes the bootstrap display device.
Called through delete_display_hook. */
+
void
delete_initial_display (struct display *display)
{
TERMINAL_TYPE is the termcap type of the device, e.g. "vt100".
If MUST_SUCCEED is true, then all errors are fatal. */
+
struct display *
term_init (char *name, char *terminal_type, int must_succeed)
{
/* Auxiliary error-handling function for term_init.
Free BUFFER and delete DISPLAY, then call error or fatal
- with str1 or str2, respectively, according to MUST_SUCCEED.
-*/
+ with str1 or str2, respectively, according to MUST_SUCCEED. */
+
static void
maybe_fatal (must_succeed, buffer, display, str1, str2, arg1, arg2)
int must_succeed;
static int deleting_tty = 0;
+
+/* Delete the given terminal device, closing all frames on it. */
+
void
delete_tty (struct display *display)
{
/* Initialize the tty-dependent part of frame F. The frame must
already have its display initialized. */
+
void
create_tty_output (struct frame *f)
{
}
/* Delete the tty-dependent part of frame F. */
+
void
delete_tty_output (struct frame *f)
{
/* Mark the pointers in the tty_display_info objects.
Called by the Fgarbage_collector. */
+
void
mark_ttys ()
{
\f
/* Create a new display object and add it to the display list. */
+
struct display *
create_display (void)
{
}
/* Remove a display from the display list and free its memory. */
+
void
delete_display (struct display *dev)
{