summaryrefslogtreecommitdiff
path: root/src/term.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/term.c')
-rw-r--r--src/term.c1668
1 files changed, 0 insertions, 1668 deletions
diff --git a/src/term.c b/src/term.c
deleted file mode 100644
index 8f7bf3aef4d..00000000000
--- a/src/term.c
+++ /dev/null
@@ -1,1668 +0,0 @@
-/* terminal control module for terminals described by TERMCAP
- Copyright (C) 1985, 1986, 1987, 1993, 1994 Free Software Foundation, Inc.
-
-This file is part of GNU Emacs.
-
-GNU Emacs 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.
-
-GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-
-#include <stdio.h>
-#include <ctype.h>
-#include <config.h>
-#include "termchar.h"
-#include "termopts.h"
-#include "cm.h"
-#undef NULL
-#include "lisp.h"
-#include "frame.h"
-#include "disptab.h"
-#include "termhooks.h"
-#include "keyboard.h"
-
-#define max(a, b) ((a) > (b) ? (a) : (b))
-#define min(a, b) ((a) < (b) ? (a) : (b))
-
-#define OUTPUT(a) tputs (a, FRAME_HEIGHT (selected_frame) - curY, cmputc)
-#define OUTPUT1(a) tputs (a, 1, cmputc)
-#define OUTPUTL(a, lines) tputs (a, lines, cmputc)
-#define OUTPUT_IF(a) { if (a) tputs (a, FRAME_HEIGHT (selected_frame) - curY, cmputc); }
-#define OUTPUT1_IF(a) { if (a) tputs (a, 1, cmputc); }
-
-/* Terminal characteristics that higher levels want to look at.
- These are all extern'd in termchar.h */
-
-int must_write_spaces; /* Nonzero means spaces in the text
- must actually be output; can't just skip
- over some columns to leave them blank. */
-int min_padding_speed; /* Speed below which no padding necessary */
-
-int line_ins_del_ok; /* Terminal can insert and delete lines */
-int char_ins_del_ok; /* Terminal can insert and delete chars */
-int scroll_region_ok; /* Terminal supports setting the
- scroll window */
-int memory_below_frame; /* Terminal remembers lines
- scrolled off bottom */
-int fast_clear_end_of_line; /* Terminal has a `ce' string */
-
-int dont_calculate_costs; /* Nonzero means don't bother computing */
- /* various cost tables; we won't use them. */
-
-/* Nonzero means no need to redraw the entire frame on resuming
- a suspended Emacs. This is useful on terminals with multiple pages,
- where one page is used for Emacs and another for all else. */
-int no_redraw_on_reenter;
-
-/* Hook functions that you can set to snap out the functions in this file.
- These are all extern'd in termhooks.h */
-
-int (*cursor_to_hook) ();
-int (*raw_cursor_to_hook) ();
-
-int (*clear_to_end_hook) ();
-int (*clear_frame_hook) ();
-int (*clear_end_of_line_hook) ();
-
-int (*ins_del_lines_hook) ();
-
-int (*change_line_highlight_hook) ();
-int (*reassert_line_highlight_hook) ();
-
-int (*insert_glyphs_hook) ();
-int (*write_glyphs_hook) ();
-int (*delete_glyphs_hook) ();
-
-int (*ring_bell_hook) ();
-
-int (*reset_terminal_modes_hook) ();
-int (*set_terminal_modes_hook) ();
-int (*update_begin_hook) ();
-int (*update_end_hook) ();
-int (*set_terminal_window_hook) ();
-
-int (*read_socket_hook) ();
-
-int (*frame_up_to_date_hook) ();
-
-/* Return the current position of the mouse.
-
- Set *f to the frame the mouse is in, or zero if the mouse is in no
- Emacs frame. If it is set to zero, all the other arguments are
- garbage.
-
- If the motion started in a scroll bar, set *bar_window to the
- scroll bar's window, *part to the part the mouse is currently over,
- *x to the position of the mouse along the scroll bar, and *y to the
- overall length of the scroll bar.
-
- Otherwise, set *bar_window to Qnil, and *x and *y to the column and
- row of the character cell the mouse is over.
-
- Set *time to the time the mouse was at the returned position.
-
- This should clear mouse_moved until the next motion
- event arrives. */
-void (*mouse_position_hook) ( /* FRAME_PTR *f,
- Lisp_Object *bar_window,
- enum scroll_bar_part *part,
- Lisp_Object *x,
- Lisp_Object *y,
- unsigned long *time */ );
-
-/* When reading from a minibuffer in a different frame, Emacs wants
- to shift the highlight from the selected frame to the minibuffer's
- frame; under X, this means it lies about where the focus is.
- This hook tells the window system code to re-decide where to put
- the highlight. */
-void (*frame_rehighlight_hook) ( /* FRAME_PTR f */ );
-
-/* If we're displaying frames using a window system that can stack
- frames on top of each other, this hook allows you to bring a frame
- to the front, or bury it behind all the other windows. If this
- hook is zero, that means the device we're displaying on doesn't
- support overlapping frames, so there's no need to raise or lower
- anything.
-
- If RAISE is non-zero, F is brought to the front, before all other
- windows. If RAISE is zero, F is sent to the back, behind all other
- windows. */
-void (*frame_raise_lower_hook) ( /* FRAME_PTR f, int raise */ );
-
-/* Set the vertical scroll bar for WINDOW to have its upper left corner
- at (TOP, LEFT), and be LENGTH rows high. Set its handle to
- indicate that we are displaying PORTION characters out of a total
- of WHOLE characters, starting at POSITION. If WINDOW doesn't yet
- have a scroll bar, create one for it. */
-void (*set_vertical_scroll_bar_hook)
- ( /* struct window *window,
- int portion, int whole, int position */ );
-
-
-/* The following three hooks are used when we're doing a thorough
- redisplay of the frame. We don't explicitly know which scroll bars
- are going to be deleted, because keeping track of when windows go
- away is a real pain - can you say set-window-configuration?
- Instead, we just assert at the beginning of redisplay that *all*
- scroll bars are to be removed, and then save scroll bars from the
- firey pit when we actually redisplay their window. */
-
-/* Arrange for all scroll bars on FRAME to be removed at the next call
- to `*judge_scroll_bars_hook'. A scroll bar may be spared if
- `*redeem_scroll_bar_hook' is applied to its window before the judgement.
-
- This should be applied to each frame each time its window tree is
- redisplayed, even if it is not displaying scroll bars at the moment;
- if the HAS_SCROLL_BARS flag has just been turned off, only calling
- this and the judge_scroll_bars_hook will get rid of them.
-
- If non-zero, this hook should be safe to apply to any frame,
- whether or not it can support scroll bars, and whether or not it is
- currently displaying them. */
-void (*condemn_scroll_bars_hook)( /* FRAME_PTR *frame */ );
-
-/* Unmark WINDOW's scroll bar for deletion in this judgement cycle.
- Note that it's okay to redeem a scroll bar that is not condemned. */
-void (*redeem_scroll_bar_hook)( /* struct window *window */ );
-
-/* Remove all scroll bars on FRAME that haven't been saved since the
- last call to `*condemn_scroll_bars_hook'.
-
- This should be applied to each frame after each time its window
- tree is redisplayed, even if it is not displaying scroll bars at the
- moment; if the HAS_SCROLL_BARS flag has just been turned off, only
- calling this and condemn_scroll_bars_hook will get rid of them.
-
- If non-zero, this hook should be safe to apply to any frame,
- whether or not it can support scroll bars, and whether or not it is
- currently displaying them. */
-void (*judge_scroll_bars_hook)( /* FRAME_PTR *FRAME */ );
-
-
-/* Strings, numbers and flags taken from the termcap entry. */
-
-char *TS_ins_line; /* termcap "al" */
-char *TS_ins_multi_lines; /* "AL" (one parameter, # lines to insert) */
-char *TS_bell; /* "bl" */
-char *TS_clr_to_bottom; /* "cd" */
-char *TS_clr_line; /* "ce", clear to end of line */
-char *TS_clr_frame; /* "cl" */
-char *TS_set_scroll_region; /* "cs" (2 params, first line and last line) */
-char *TS_set_scroll_region_1; /* "cS" (4 params: total lines,
- lines above scroll region, lines below it,
- total lines again) */
-char *TS_del_char; /* "dc" */
-char *TS_del_multi_chars; /* "DC" (one parameter, # chars to delete) */
-char *TS_del_line; /* "dl" */
-char *TS_del_multi_lines; /* "DL" (one parameter, # lines to delete) */
-char *TS_delete_mode; /* "dm", enter character-delete mode */
-char *TS_end_delete_mode; /* "ed", leave character-delete mode */
-char *TS_end_insert_mode; /* "ei", leave character-insert mode */
-char *TS_ins_char; /* "ic" */
-char *TS_ins_multi_chars; /* "IC" (one parameter, # chars to insert) */
-char *TS_insert_mode; /* "im", enter character-insert mode */
-char *TS_pad_inserted_char; /* "ip". Just padding, no commands. */
-char *TS_end_keypad_mode; /* "ke" */
-char *TS_keypad_mode; /* "ks" */
-char *TS_pad_char; /* "pc", char to use as padding */
-char *TS_repeat; /* "rp" (2 params, # times to repeat
- and character to be repeated) */
-char *TS_end_standout_mode; /* "se" */
-char *TS_fwd_scroll; /* "sf" */
-char *TS_standout_mode; /* "so" */
-char *TS_rev_scroll; /* "sr" */
-char *TS_end_termcap_modes; /* "te" */
-char *TS_termcap_modes; /* "ti" */
-char *TS_visible_bell; /* "vb" */
-char *TS_end_visual_mode; /* "ve" */
-char *TS_visual_mode; /* "vi" */
-char *TS_set_window; /* "wi" (4 params, start and end of window,
- each as vpos and hpos) */
-
-int TF_hazeltine; /* termcap hz flag. */
-int TF_insmode_motion; /* termcap mi flag: can move while in insert mode. */
-int TF_standout_motion; /* termcap mi flag: can move while in standout mode. */
-int TF_underscore; /* termcap ul flag: _ underlines if overstruck on
- nonblank position. Must clear before writing _. */
-int TF_teleray; /* termcap xt flag: many weird consequences.
- For t1061. */
-
-int TF_xs; /* Nonzero for "xs". If set together with
- TN_standout_width == 0, it means don't bother
- to write any end-standout cookies. */
-
-int TN_standout_width; /* termcap sg number: width occupied by standout
- markers */
-
-static int RPov; /* # chars to start a TS_repeat */
-
-static int delete_in_insert_mode; /* delete mode == insert mode */
-
-static int se_is_so; /* 1 if same string both enters and leaves
- standout mode */
-
-/* internal state */
-
-/* Number of chars of space used for standout marker at beginning of line,
- or'd with 0100. Zero if no standout marker at all.
-
- Used IFF TN_standout_width >= 0. */
-
-static char *chars_wasted;
-static char *copybuf;
-
-/* nonzero means supposed to write text in standout mode. */
-int standout_requested;
-
-int insert_mode; /* Nonzero when in insert mode. */
-int standout_mode; /* Nonzero when in standout mode. */
-
-/* Size of window specified by higher levels.
- This is the number of lines, from the top of frame downwards,
- which can participate in insert-line/delete-line operations.
-
- Effectively it excludes the bottom frame_height - specified_window_size
- lines from those operations. */
-
-int specified_window;
-
-/* Frame currently being redisplayed; 0 if not currently redisplaying.
- (Direct output does not count). */
-
-FRAME_PTR updating_frame;
-
-/* Provided for lisp packages. */
-static int system_uses_terminfo;
-
-char *tparam ();
-
-ring_bell ()
-{
- if (! FRAME_TERMCAP_P (selected_frame))
- {
- (*ring_bell_hook) ();
- return;
- }
- OUTPUT (TS_visible_bell && visible_bell ? TS_visible_bell : TS_bell);
-}
-
-set_terminal_modes ()
-{
- if (! FRAME_TERMCAP_P (selected_frame))
- {
- (*set_terminal_modes_hook) ();
- return;
- }
- OUTPUT_IF (TS_termcap_modes);
- OUTPUT_IF (TS_visual_mode);
- OUTPUT_IF (TS_keypad_mode);
- losecursor ();
-}
-
-reset_terminal_modes ()
-{
- if (! FRAME_TERMCAP_P (selected_frame))
- {
- (*reset_terminal_modes_hook) ();
- return;
- }
- if (TN_standout_width < 0)
- turn_off_highlight ();
- turn_off_insert ();
- OUTPUT_IF (TS_end_keypad_mode);
- OUTPUT_IF (TS_end_visual_mode);
- OUTPUT_IF (TS_end_termcap_modes);
- /* Output raw CR so kernel can track the cursor hpos. */
- /* But on magic-cookie terminals this can erase an end-standout marker and
- cause the rest of the frame to be in standout, so move down first. */
- if (TN_standout_width >= 0)
- cmputc ('\n');
- cmputc ('\r');
-}
-
-update_begin (f)
- FRAME_PTR f;
-{
- updating_frame = f;
- if (! FRAME_TERMCAP_P (updating_frame))
- (*update_begin_hook) (f);
-}
-
-update_end (f)
- FRAME_PTR f;
-{
- if (! FRAME_TERMCAP_P (updating_frame))
- {
- updating_frame = 0;
- (*update_end_hook) (f);
- return;
- }
- turn_off_insert ();
- background_highlight ();
- standout_requested = 0;
- updating_frame = 0;
-}
-
-set_terminal_window (size)
- int size;
-{
- if (! FRAME_TERMCAP_P (updating_frame))
- {
- (*set_terminal_window_hook) (size);
- return;
- }
- specified_window = size ? size : FRAME_HEIGHT (selected_frame);
- if (!scroll_region_ok)
- return;
- set_scroll_region (0, specified_window);
-}
-
-set_scroll_region (start, stop)
- int start, stop;
-{
- char *buf;
- if (TS_set_scroll_region)
- {
- buf = tparam (TS_set_scroll_region, 0, 0, start, stop - 1);
- }
- else if (TS_set_scroll_region_1)
- {
- buf = tparam (TS_set_scroll_region_1, 0, 0,
- FRAME_HEIGHT (selected_frame), start,
- FRAME_HEIGHT (selected_frame) - stop,
- FRAME_HEIGHT (selected_frame));
- }
- else
- {
- buf = tparam (TS_set_window, 0, 0, start, 0, stop, FRAME_WIDTH (selected_frame));
- }
- OUTPUT (buf);
- xfree (buf);
- losecursor ();
-}
-
-turn_on_insert ()
-{
- if (!insert_mode)
- OUTPUT (TS_insert_mode);
- insert_mode = 1;
-}
-
-turn_off_insert ()
-{
- if (insert_mode)
- OUTPUT (TS_end_insert_mode);
- insert_mode = 0;
-}
-
-/* Handle highlighting when TN_standout_width (termcap sg) is not specified.
- In these terminals, output is affected by the value of standout
- mode when the output is written.
-
- These functions are called on all terminals, but do nothing
- on terminals whose standout mode does not work that way. */
-
-turn_off_highlight ()
-{
- if (TN_standout_width < 0)
- {
- if (standout_mode)
- OUTPUT_IF (TS_end_standout_mode);
- standout_mode = 0;
- }
-}
-
-turn_on_highlight ()
-{
- if (TN_standout_width < 0)
- {
- if (!standout_mode)
- OUTPUT_IF (TS_standout_mode);
- standout_mode = 1;
- }
-}
-
-/* Set standout mode to the state it should be in for
- empty space inside windows. What this is,
- depends on the user option inverse-video. */
-
-background_highlight ()
-{
- if (TN_standout_width >= 0)
- return;
- if (inverse_video)
- turn_on_highlight ();
- else
- turn_off_highlight ();
-}
-
-/* Set standout mode to the mode specified for the text to be output. */
-
-static
-highlight_if_desired ()
-{
- if (TN_standout_width >= 0)
- return;
- if (!inverse_video == !standout_requested)
- turn_off_highlight ();
- else
- turn_on_highlight ();
-}
-
-/* Handle standout mode for terminals in which TN_standout_width >= 0.
- On these terminals, standout is controlled by markers that
- live inside the terminal's memory. TN_standout_width is the width
- that the marker occupies in memory. Standout runs from the marker
- to the end of the line on some terminals, or to the next
- turn-off-standout marker (TS_end_standout_mode) string
- on other terminals. */
-
-/* Write a standout marker or end-standout marker at the front of the line
- at vertical position vpos. */
-
-write_standout_marker (flag, vpos)
- int flag, vpos;
-{
- if (flag || (TS_end_standout_mode && !TF_teleray && !se_is_so
- && !(TF_xs && TN_standout_width == 0)))
- {
- cmgoto (vpos, 0);
- cmplus (TN_standout_width);
- OUTPUT (flag ? TS_standout_mode : TS_end_standout_mode);
- chars_wasted[curY] = TN_standout_width | 0100;
- }
-}
-
-/* External interface to control of standout mode.
- Call this when about to modify line at position VPOS
- and not change whether it is highlighted. */
-
-reassert_line_highlight (highlight, vpos)
- int highlight;
- int vpos;
-{
- if (! FRAME_TERMCAP_P ((updating_frame ? updating_frame : selected_frame)))
- {
- (*reassert_line_highlight_hook) (highlight, vpos);
- return;
- }
- if (TN_standout_width < 0)
- /* Handle terminals where standout takes affect at output time */
- standout_requested = highlight;
- else if (chars_wasted[vpos] == 0)
- /* For terminals with standout markers, write one on this line
- if there isn't one already. */
- write_standout_marker (highlight, vpos);
-}
-
-/* Call this when about to modify line at position VPOS
- and change whether it is highlighted. */
-
-change_line_highlight (new_highlight, vpos, first_unused_hpos)
- int new_highlight, vpos, first_unused_hpos;
-{
- standout_requested = new_highlight;
- if (! FRAME_TERMCAP_P (updating_frame))
- {
- (*change_line_highlight_hook) (new_highlight, vpos, first_unused_hpos);
- return;
- }
-
- cursor_to (vpos, 0);
-
- if (TN_standout_width < 0)
- background_highlight ();
- /* If line starts with a marker, delete the marker */
- else if (TS_clr_line && chars_wasted[curY])
- {
- turn_off_insert ();
- /* On Teleray, make sure to erase the SO marker. */
- if (TF_teleray)
- {
- cmgoto (curY - 1, FRAME_WIDTH (selected_frame) - 4);
- OUTPUT ("\033S");
- curY++; /* ESC S moves to next line where the TS_standout_mode was */
- curX = 0;
- }
- else
- cmgoto (curY, 0); /* reposition to kill standout marker */
- }
- clear_end_of_line_raw (first_unused_hpos);
- reassert_line_highlight (new_highlight, curY);
-}
-
-
-/* Move to absolute position, specified origin 0 */
-
-cursor_to (row, col)
- int row, col;
-{
- if (! FRAME_TERMCAP_P ((updating_frame
- ? updating_frame
- : selected_frame))
- && cursor_to_hook)
- {
- (*cursor_to_hook) (row, col);
- return;
- }
-
- col += chars_wasted[row] & 077;
- if (curY == row && curX == col)
- return;
- if (!TF_standout_motion)
- background_highlight ();
- if (!TF_insmode_motion)
- turn_off_insert ();
- cmgoto (row, col);
-}
-
-/* Similar but don't take any account of the wasted characters. */
-
-raw_cursor_to (row, col)
- int row, col;
-{
- if (! FRAME_TERMCAP_P ((updating_frame ? updating_frame : selected_frame)))
- {
- (*raw_cursor_to_hook) (row, col);
- return;
- }
- if (curY == row && curX == col)
- return;
- if (!TF_standout_motion)
- background_highlight ();
- if (!TF_insmode_motion)
- turn_off_insert ();
- cmgoto (row, col);
-}
-
-/* Erase operations */
-
-/* clear from cursor to end of frame */
-clear_to_end ()
-{
- register int i;
-
- if (clear_to_end_hook && FRAME_TERMCAP_P (updating_frame))
- {
- (*clear_to_end_hook) ();
- return;
- }
- if (TS_clr_to_bottom)
- {
- background_highlight ();
- OUTPUT (TS_clr_to_bottom);
- bzero (chars_wasted + curY, FRAME_HEIGHT (selected_frame) - curY);
- }
- else
- {
- for (i = curY; i < FRAME_HEIGHT (selected_frame); i++)
- {
- cursor_to (i, 0);
- clear_end_of_line_raw (FRAME_WIDTH (selected_frame));
- }
- }
-}
-
-/* Clear entire frame */
-
-clear_frame ()
-{
- if (clear_frame_hook
- && ! FRAME_TERMCAP_P ((updating_frame ? updating_frame : selected_frame)))
- {
- (*clear_frame_hook) ();
- return;
- }
- if (TS_clr_frame)
- {
- background_highlight ();
- OUTPUT (TS_clr_frame);
- bzero (chars_wasted, FRAME_HEIGHT (selected_frame));
- cmat (0, 0);
- }
- else
- {
- cursor_to (0, 0);
- clear_to_end ();
- }
-}
-
-/* Clear to end of line, but do not clear any standout marker.
- Assumes that the cursor is positioned at a character of real text,
- which implies it cannot be before a standout marker
- unless the marker has zero width.
-
- Note that the cursor may be moved. */
-
-clear_end_of_line (first_unused_hpos)
- int first_unused_hpos;
-{
- static GLYPH buf = SPACEGLYPH;
- if (FRAME_TERMCAP_P (selected_frame)
- && TN_standout_width == 0 && curX == 0 && chars_wasted[curY] != 0)
- write_glyphs (&buf, 1);
- clear_end_of_line_raw (first_unused_hpos);
-}
-
-/* Clear from cursor to end of line.
- Assume that the line is already clear starting at column first_unused_hpos.
- If the cursor is at a standout marker, erase the marker.
-
- Note that the cursor may be moved, on terminals lacking a `ce' string. */
-
-clear_end_of_line_raw (first_unused_hpos)
- int first_unused_hpos;
-{
- register int i;
-
- if (clear_end_of_line_hook
- && ! FRAME_TERMCAP_P ((updating_frame
- ? updating_frame
- : selected_frame)))
- {
- (*clear_end_of_line_hook) (first_unused_hpos);
- return;
- }
-
- first_unused_hpos += chars_wasted[curY] & 077;
- if (curX >= first_unused_hpos)
- return;
- /* Notice if we are erasing a magic cookie */
- if (curX == 0)
- chars_wasted[curY] = 0;
- background_highlight ();
- if (TS_clr_line)
- {
- OUTPUT1 (TS_clr_line);
- }
- else
- { /* have to do it the hard way */
- turn_off_insert ();
-
- /* Do not write in last row last col with Autowrap on. */
- if (AutoWrap && curY == FRAME_HEIGHT (selected_frame) - 1
- && first_unused_hpos == FRAME_WIDTH (selected_frame))
- first_unused_hpos--;
-
- for (i = curX; i < first_unused_hpos; i++)
- {
- if (termscript)
- fputc (' ', termscript);
- putchar (' ');
- }
- cmplus (first_unused_hpos - curX);
- }
-}
-
-
-write_glyphs (string, len)
- register GLYPH *string;
- register int len;
-{
- register GLYPH g;
- register int tlen = GLYPH_TABLE_LENGTH;
- register Lisp_Object *tbase = GLYPH_TABLE_BASE;
-
- if (write_glyphs_hook
- && ! FRAME_TERMCAP_P ((updating_frame ? updating_frame : selected_frame)))
- {
- (*write_glyphs_hook) (string, len);
- return;
- }
-
- highlight_if_desired ();
- turn_off_insert ();
-
- /* Don't dare write in last column of bottom line, if AutoWrap,
- since that would scroll the whole frame on some terminals. */
-
- if (AutoWrap
- && curY + 1 == FRAME_HEIGHT (selected_frame)
- && (curX + len - (chars_wasted[curY] & 077)
- == FRAME_WIDTH (selected_frame)))
- len --;
-
- cmplus (len);
- while (--len >= 0)
- {
- g = *string++;
- /* Check quickly for G beyond length of table.
- That implies it isn't an alias and is simple. */
- if (g >= tlen)
- {
- simple:
- putc (g & 0xff, stdout);
- if (ferror (stdout))
- clearerr (stdout);
- if (termscript)
- putc (g & 0xff, termscript);
- }
- else
- {
- /* G has an entry in Vglyph_table,
- so process any alias and then test for simpleness. */
- while (GLYPH_ALIAS_P (tbase, tlen, g))
- g = GLYPH_ALIAS (tbase, g);
- if (GLYPH_SIMPLE_P (tbase, tlen, g))
- goto simple;
- else
- {
- /* Here if G (or its definition as an alias) is not simple. */
- fwrite (GLYPH_STRING (tbase, g), 1, GLYPH_LENGTH (tbase, g),
- stdout);
- if (ferror (stdout))
- clearerr (stdout);
- if (termscript)
- fwrite (GLYPH_STRING (tbase, g), 1, GLYPH_LENGTH (tbase, g),
- termscript);
- }
- }
- }
-}
-
-/* If start is zero, insert blanks instead of a string at start */
-
-insert_glyphs (start, len)
- register GLYPH *start;
- register int len;
-{
- char *buf;
- register GLYPH g;
- register int tlen = GLYPH_TABLE_LENGTH;
- register Lisp_Object *tbase = GLYPH_TABLE_BASE;
-
- if (insert_glyphs_hook && ! FRAME_TERMCAP_P (updating_frame))
- {
- (*insert_glyphs_hook) (start, len);
- return;
- }
- highlight_if_desired ();
-
- if (TS_ins_multi_chars)
- {
- buf = tparam (TS_ins_multi_chars, 0, 0, len);
- OUTPUT1 (buf);
- xfree (buf);
- if (start)
- write_glyphs (start, len);
- return;
- }
-
- turn_on_insert ();
- cmplus (len);
- while (--len >= 0)
- {
- OUTPUT1_IF (TS_ins_char);
- if (!start)
- g = SPACEGLYPH;
- else
- g = *start++;
-
- if (GLYPH_SIMPLE_P (tbase, tlen, g))
- {
- putc (g & 0xff, stdout);
- if (ferror (stdout))
- clearerr (stdout);
- if (termscript)
- putc (g & 0xff, termscript);
- }
- else
- {
- fwrite (GLYPH_STRING (tbase, g), 1, GLYPH_LENGTH (tbase, g), stdout);
- if (ferror (stdout))
- clearerr (stdout);
- if (termscript)
- fwrite (GLYPH_STRING (tbase, g), 1, GLYPH_LENGTH (tbase, g),
- termscript);
- }
-
- OUTPUT1_IF (TS_pad_inserted_char);
- }
-}
-
-delete_glyphs (n)
- register int n;
-{
- char *buf;
- register int i;
-
- if (delete_glyphs_hook && ! FRAME_TERMCAP_P (updating_frame))
- {
- (*delete_glyphs_hook) (n);
- return;
- }
-
- if (delete_in_insert_mode)
- {
- turn_on_insert ();
- }
- else
- {
- turn_off_insert ();
- OUTPUT_IF (TS_delete_mode);
- }
-
- if (TS_del_multi_chars)
- {
- buf = tparam (TS_del_multi_chars, 0, 0, n);
- OUTPUT1 (buf);
- xfree (buf);
- }
- else
- for (i = 0; i < n; i++)
- OUTPUT1 (TS_del_char);
- if (!delete_in_insert_mode)
- OUTPUT_IF (TS_end_delete_mode);
-}
-
-/* Insert N lines at vpos VPOS. If N is negative, delete -N lines. */
-
-ins_del_lines (vpos, n)
- int vpos, n;
-{
- char *multi = n > 0 ? TS_ins_multi_lines : TS_del_multi_lines;
- char *single = n > 0 ? TS_ins_line : TS_del_line;
- char *scroll = n > 0 ? TS_rev_scroll : TS_fwd_scroll;
-
- register int i = n > 0 ? n : -n;
- register char *buf;
-
- if (ins_del_lines_hook && ! FRAME_TERMCAP_P (updating_frame))
- {
- (*ins_del_lines_hook) (vpos, n);
- return;
- }
-
- /* If the lines below the insertion are being pushed
- into the end of the window, this is the same as clearing;
- and we know the lines are already clear, since the matching
- deletion has already been done. So can ignore this. */
- /* If the lines below the deletion are blank lines coming
- out of the end of the window, don't bother,
- as there will be a matching inslines later that will flush them. */
- if (scroll_region_ok && vpos + i >= specified_window)
- return;
- if (!memory_below_frame && vpos + i >= FRAME_HEIGHT (selected_frame))
- return;
-
- if (multi)
- {
- raw_cursor_to (vpos, 0);
- background_highlight ();
- buf = tparam (multi, 0, 0, i);
- OUTPUT (buf);
- xfree (buf);
- }
- else if (single)
- {
- raw_cursor_to (vpos, 0);
- background_highlight ();
- while (--i >= 0)
- OUTPUT (single);
- if (TF_teleray)
- curX = 0;
- }
- else
- {
- set_scroll_region (vpos, specified_window);
- if (n < 0)
- raw_cursor_to (specified_window - 1, 0);
- else
- raw_cursor_to (vpos, 0);
- background_highlight ();
- while (--i >= 0)
- OUTPUTL (scroll, specified_window - vpos);
- set_scroll_region (0, specified_window);
- }
-
- if (TN_standout_width >= 0)
- {
- register lower_limit
- = (scroll_region_ok
- ? specified_window
- : FRAME_HEIGHT (selected_frame));
-
- if (n < 0)
- {
- bcopy (&chars_wasted[vpos - n], &chars_wasted[vpos],
- lower_limit - vpos + n);
- bzero (&chars_wasted[lower_limit + n], - n);
- }
- else
- {
- bcopy (&chars_wasted[vpos], &copybuf[vpos], lower_limit - vpos - n);
- bcopy (&copybuf[vpos], &chars_wasted[vpos + n],
- lower_limit - vpos - n);
- bzero (&chars_wasted[vpos], n);
- }
- }
- if (!scroll_region_ok && memory_below_frame && n < 0)
- {
- cursor_to (FRAME_HEIGHT (selected_frame) + n, 0);
- clear_to_end ();
- }
-}
-
-/* Compute cost of sending "str", in characters,
- not counting any line-dependent padding. */
-
-int
-string_cost (str)
- char *str;
-{
- cost = 0;
- if (str)
- tputs (str, 0, evalcost);
- return cost;
-}
-
-/* Compute cost of sending "str", in characters,
- counting any line-dependent padding at one line. */
-
-static int
-string_cost_one_line (str)
- char *str;
-{
- cost = 0;
- if (str)
- tputs (str, 1, evalcost);
- return cost;
-}
-
-/* Compute per line amount of line-dependent padding,
- in tenths of characters. */
-
-int
-per_line_cost (str)
- register char *str;
-{
- cost = 0;
- if (str)
- tputs (str, 0, evalcost);
- cost = - cost;
- if (str)
- tputs (str, 10, evalcost);
- return cost;
-}
-
-#ifndef old
-/* char_ins_del_cost[n] is cost of inserting N characters.
- char_ins_del_cost[-n] is cost of deleting N characters. */
-
-int *char_ins_del_vector;
-
-#define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_WIDTH ((f))])
-#endif
-
-/* ARGSUSED */
-static void
-calculate_ins_del_char_costs (frame)
- FRAME_PTR frame;
-{
- int ins_startup_cost, del_startup_cost;
- int ins_cost_per_char, del_cost_per_char;
- register int i;
- register int *p;
-
- if (TS_ins_multi_chars)
- {
- ins_cost_per_char = 0;
- ins_startup_cost = string_cost_one_line (TS_ins_multi_chars);
- }
- else if (TS_ins_char || TS_pad_inserted_char
- || (TS_insert_mode && TS_end_insert_mode))
- {
- ins_startup_cost = (30 * (string_cost (TS_insert_mode)
- + string_cost (TS_end_insert_mode))) / 100;
- ins_cost_per_char = (string_cost_one_line (TS_ins_char)
- + string_cost_one_line (TS_pad_inserted_char));
- }
- else
- {
- ins_startup_cost = 9999;
- ins_cost_per_char = 0;
- }
-
- if (TS_del_multi_chars)
- {
- del_cost_per_char = 0;
- del_startup_cost = string_cost_one_line (TS_del_multi_chars);
- }
- else if (TS_del_char)
- {
- del_startup_cost = (string_cost (TS_delete_mode)
- + string_cost (TS_end_delete_mode));
- if (delete_in_insert_mode)
- del_startup_cost /= 2;
- del_cost_per_char = string_cost_one_line (TS_del_char);
- }
- else
- {
- del_startup_cost = 9999;
- del_cost_per_char = 0;
- }
-
- /* Delete costs are at negative offsets */
- p = &char_ins_del_cost (frame)[0];
- for (i = FRAME_WIDTH (selected_frame); --i >= 0;)
- *--p = (del_startup_cost += del_cost_per_char);
-
- /* Doing nothing is free */
- p = &char_ins_del_cost (frame)[0];
- *p++ = 0;
-
- /* Insert costs are at positive offsets */
- for (i = FRAME_WIDTH (frame); --i >= 0;)
- *p++ = (ins_startup_cost += ins_cost_per_char);
-}
-
-#ifdef HAVE_X_WINDOWS
-extern int x_screen_planes;
-#endif
-
-extern do_line_insertion_deletion_costs ();
-
-calculate_costs (frame)
- FRAME_PTR frame;
-{
- register char *f = TS_set_scroll_region ?
- TS_set_scroll_region
- : TS_set_scroll_region_1;
-
- if (dont_calculate_costs)
- return;
-
-#ifdef HAVE_X_WINDOWS
- if (FRAME_X_P (frame))
- {
- do_line_insertion_deletion_costs (frame, 0, ".5*", 0, ".5*",
- 0, 0, x_screen_planes);
- return;
- }
-#endif
-
- /* These variables are only used for terminal stuff. They are allocated
- once for the terminal frame of X-windows emacs, but not used afterwards.
-
- char_ins_del_vector (i.e., char_ins_del_cost) isn't used because
- X turns off char_ins_del_ok.
-
- chars_wasted and copybuf are only used here in term.c in cases where
- the term hook isn't called. */
-
- if (chars_wasted != 0)
- chars_wasted = (char *) xrealloc (chars_wasted, FRAME_HEIGHT (frame));
- else
- chars_wasted = (char *) xmalloc (FRAME_HEIGHT (frame));
-
- if (copybuf != 0)
- copybuf = (char *) xrealloc (copybuf, FRAME_HEIGHT (frame));
- else
- copybuf = (char *) xmalloc (FRAME_HEIGHT (frame));
-
- if (char_ins_del_vector != 0)
- char_ins_del_vector
- = (int *) xrealloc (char_ins_del_vector,
- (sizeof (int)
- + 2 * FRAME_WIDTH (frame) * sizeof (int)));
- else
- char_ins_del_vector
- = (int *) xmalloc (sizeof (int)
- + 2 * FRAME_WIDTH (frame) * sizeof (int));
-
- bzero (chars_wasted, FRAME_HEIGHT (frame));
- bzero (copybuf, FRAME_HEIGHT (frame));
- bzero (char_ins_del_vector, (sizeof (int)
- + 2 * FRAME_WIDTH (frame) * sizeof (int)));
-
- if (f && (!TS_ins_line && !TS_del_line))
- do_line_insertion_deletion_costs (frame,
- TS_rev_scroll, TS_ins_multi_lines,
- TS_fwd_scroll, TS_del_multi_lines,
- f, f, 1);
- else
- do_line_insertion_deletion_costs (frame,
- TS_ins_line, TS_ins_multi_lines,
- TS_del_line, TS_del_multi_lines,
- 0, 0, 1);
-
- calculate_ins_del_char_costs (frame);
-
- /* Don't use TS_repeat if its padding is worse than sending the chars */
- if (TS_repeat && per_line_cost (TS_repeat) * baud_rate < 9000)
- RPov = string_cost (TS_repeat);
- else
- RPov = FRAME_WIDTH (frame) * 2;
-
- cmcostinit (); /* set up cursor motion costs */
-}
-
-struct fkey_table {
- char *cap, *name;
-};
-
- /* Termcap capability names that correspond directly to X keysyms.
- Some of these (marked "terminfo") aren't supplied by old-style
- (Berkeley) termcap entries. They're listed in X keysym order;
- except we put the keypad keys first, so that if they clash with
- other keys (as on the IBM PC keyboard) they get overridden.
- */
-
-static struct fkey_table keys[] = {
- "kh", "home", /* termcap */
- "kl", "left", /* termcap */
- "ku", "up", /* termcap */
- "kr", "right", /* termcap */
- "kd", "down", /* termcap */
- "%8", "prior", /* terminfo */
- "%5", "next", /* terminfo */
- "@7", "end", /* terminfo */
- "@1", "begin", /* terminfo */
- "*6", "select", /* terminfo */
- "%9", "print", /* terminfo */
- "@4", "execute", /* terminfo --- actually the `command' key */
- /*
- * "insert" --- see below
- */
- "&8", "undo", /* terminfo */
- "%0", "redo", /* terminfo */
- "%7", "menu", /* terminfo --- actually the `options' key */
- "@0", "find", /* terminfo */
- "@2", "cancel", /* terminfo */
- "%1", "help", /* terminfo */
- /*
- * "break" goes here, but can't be reliably intercepted with termcap
- */
- "&4", "reset", /* terminfo --- actually `restart' */
- /*
- * "system" and "user" --- no termcaps
- */
- "kE", "clearline", /* terminfo */
- "kA", "insertline", /* terminfo */
- "kL", "deleteline", /* terminfo */
- "kI", "insertchar", /* terminfo */
- "kD", "deletechar", /* terminfo */
- "kB", "backtab", /* terminfo */
- /*
- * "kp_backtab", "kp-space", "kp-tab" --- no termcaps
- */
- "@8", "kp-enter", /* terminfo */
- /*
- * "kp-f1", "kp-f2", "kp-f3" "kp-f4",
- * "kp-multiply", "kp-add", "kp-separator",
- * "kp-subtract", "kp-decimal", "kp-divide", "kp-0";
- * --- no termcaps for any of these.
- */
- "K4", "kp-1", /* terminfo */
- /*
- * "kp-2" --- no termcap
- */
- "K5", "kp-3", /* terminfo */
- /*
- * "kp-4" --- no termcap
- */
- "K2", "kp-5", /* terminfo */
- /*
- * "kp-6" --- no termcap
- */
- "K1", "kp-7", /* terminfo */
- /*
- * "kp-8" --- no termcap
- */
- "K3", "kp-9", /* terminfo */
- /*
- * "kp-equal" --- no termcap
- */
- "k1", "f1",
- "k2", "f2",
- "k3", "f3",
- "k4", "f4",
- "k5", "f5",
- "k6", "f6",
- "k7", "f7",
- "k8", "f8",
- "k9", "f9",
- };
-
-static char **term_get_fkeys_arg;
-static Lisp_Object term_get_fkeys_1 ();
-
-/* Find the escape codes sent by the function keys for Vfunction_key_map.
- This function scans the termcap function key sequence entries, and
- adds entries to Vfunction_key_map for each function key it finds. */
-
-void
-term_get_fkeys (address)
- char **address;
-{
- /* We run the body of the function (term_get_fkeys_1) and ignore all Lisp
- errors during the call. The only errors should be from Fdefine_key
- when given a key sequence containing an invalid prefix key. If the
- termcap defines function keys which use a prefix that is already bound
- to a command by the default bindings, we should silently ignore that
- function key specification, rather than giving the user an error and
- refusing to run at all on such a terminal. */
-
- extern Lisp_Object Fidentity ();
- static Lisp_Object term_get_fkeys_1 ();
- term_get_fkeys_arg = address;
- internal_condition_case (term_get_fkeys_1, Qerror, Fidentity);
-}
-
-static Lisp_Object
-term_get_fkeys_1 ()
-{
- extern char *tgetstr ();
- int i;
-
- char **address = term_get_fkeys_arg;
-
- /* This can happen if CANNOT_DUMP or with strange options. */
- if (!initialized)
- Vfunction_key_map = Fmake_sparse_keymap (Qnil);
-
- for (i = 0; i < (sizeof (keys)/sizeof (keys[0])); i++)
- {
- char *sequence = tgetstr (keys[i].cap, address);
- if (sequence)
- Fdefine_key (Vfunction_key_map, build_string (sequence),
- Fmake_vector (make_number (1),
- intern (keys[i].name)));
- }
-
- /* The uses of the "k0" capability are inconsistent; sometimes it
- describes F10, whereas othertimes it describes F0 and "k;" describes F10.
- We will attempt to politely accommodate both systems by testing for
- "k;", and if it is present, assuming that "k0" denotes F0, otherwise F10.
- */
- {
- char *k_semi = tgetstr ("k;", address);
- char *k0 = tgetstr ("k0", address);
- char *k0_name = "f10";
-
- if (k_semi)
- {
- Fdefine_key (Vfunction_key_map, build_string (k_semi),
- Fmake_vector (make_number (1), intern ("f10")));
- k0_name = "f0";
- }
-
- if (k0)
- Fdefine_key (Vfunction_key_map, build_string (k0),
- Fmake_vector (make_number (1), intern (k0_name)));
- }
-
- /* Set up cookies for numbered function keys above f10. */
- {
- char fcap[3], fkey[4];
-
- fcap[0] = 'F'; fcap[2] = '\0';
- for (i = 11; i < 64; i++)
- {
- if (i <= 19)
- fcap[1] = '1' + i - 11;
- else if (i <= 45)
- fcap[1] = 'A' + i - 11;
- else
- fcap[1] = 'a' + i - 11;
-
- {
- char *sequence = tgetstr (fcap, address);
- if (sequence)
- {
- sprintf (fkey, "f%d", i);
- Fdefine_key (Vfunction_key_map, build_string (sequence),
- Fmake_vector (make_number (1),
- intern (fkey)));
- }
- }
- }
- }
-
- /*
- * Various mappings to try and get a better fit.
- */
- {
-#define CONDITIONAL_REASSIGN(cap1, cap2, sym) \
- if (!tgetstr (cap1, address)) \
- { \
- char *sequence = tgetstr (cap2, address); \
- if (sequence) \
- Fdefine_key (Vfunction_key_map, build_string (sequence), \
- Fmake_vector (make_number (1), \
- intern (sym))); \
- }
-
- /* if there's no key_next keycap, map key_npage to `next' keysym */
- CONDITIONAL_REASSIGN ("%5", "kN", "next");
- /* if there's no key_prev keycap, map key_ppage to `previous' keysym */
- CONDITIONAL_REASSIGN ("%8", "kP", "prior");
- /* if there's no key_dc keycap, map key_ic to `insert' keysym */
- CONDITIONAL_REASSIGN ("kD", "kI", "insert");
-#undef CONDITIONAL_REASSIGN
- }
-}
-
-
-term_init (terminal_type)
- char *terminal_type;
-{
- char *area;
- char **address = &area;
- char buffer[2044];
- register char *p;
- int status;
-
- extern char *tgetstr ();
-
- Wcm_clear ();
- dont_calculate_costs = 0;
-
- status = tgetent (buffer, terminal_type);
- if (status < 0)
- fatal ("Cannot open termcap database file.\n");
- if (status == 0)
- fatal ("Terminal type %s is not defined.\n\
-If that is not the actual type of terminal you have,\n\
-use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
-`setenv TERM ...') to specify the correct type. It may be necessary\n\
-to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
- terminal_type);
-
-#ifdef TERMINFO
- area = (char *) malloc (2044);
-#else
- area = (char *) malloc (strlen (buffer));
-#endif /* not TERMINFO */
- if (area == 0)
- abort ();
-
- TS_ins_line = tgetstr ("al", address);
- TS_ins_multi_lines = tgetstr ("AL", address);
- TS_bell = tgetstr ("bl", address);
- BackTab = tgetstr ("bt", address);
- TS_clr_to_bottom = tgetstr ("cd", address);
- TS_clr_line = tgetstr ("ce", address);
- TS_clr_frame = tgetstr ("cl", address);
- ColPosition = tgetstr ("ch", address);
- AbsPosition = tgetstr ("cm", address);
- CR = tgetstr ("cr", address);
- TS_set_scroll_region = tgetstr ("cs", address);
- TS_set_scroll_region_1 = tgetstr ("cS", address);
- RowPosition = tgetstr ("cv", address);
- TS_del_char = tgetstr ("dc", address);
- TS_del_multi_chars = tgetstr ("DC", address);
- TS_del_line = tgetstr ("dl", address);
- TS_del_multi_lines = tgetstr ("DL", address);
- TS_delete_mode = tgetstr ("dm", address);
- TS_end_delete_mode = tgetstr ("ed", address);
- TS_end_insert_mode = tgetstr ("ei", address);
- Home = tgetstr ("ho", address);
- TS_ins_char = tgetstr ("ic", address);
- TS_ins_multi_chars = tgetstr ("IC", address);
- TS_insert_mode = tgetstr ("im", address);
- TS_pad_inserted_char = tgetstr ("ip", address);
- TS_end_keypad_mode = tgetstr ("ke", address);
- TS_keypad_mode = tgetstr ("ks", address);
- LastLine = tgetstr ("ll", address);
- Right = tgetstr ("nd", address);
- Down = tgetstr ("do", address);
- if (!Down)
- Down = tgetstr ("nl", address); /* Obsolete name for "do" */
-#ifdef VMS
- /* VMS puts a carriage return before each linefeed,
- so it is not safe to use linefeeds. */
- if (Down && Down[0] == '\n' && Down[1] == '\0')
- Down = 0;
-#endif /* VMS */
- if (tgetflag ("bs"))
- Left = "\b"; /* can't possibly be longer! */
- else /* (Actually, "bs" is obsolete...) */
- Left = tgetstr ("le", address);
- if (!Left)
- Left = tgetstr ("bc", address); /* Obsolete name for "le" */
- TS_pad_char = tgetstr ("pc", address);
- TS_repeat = tgetstr ("rp", address);
- TS_end_standout_mode = tgetstr ("se", address);
- TS_fwd_scroll = tgetstr ("sf", address);
- TS_standout_mode = tgetstr ("so", address);
- TS_rev_scroll = tgetstr ("sr", address);
- Wcm.cm_tab = tgetstr ("ta", address);
- TS_end_termcap_modes = tgetstr ("te", address);
- TS_termcap_modes = tgetstr ("ti", address);
- Up = tgetstr ("up", address);
- TS_visible_bell = tgetstr ("vb", address);
- TS_end_visual_mode = tgetstr ("ve", address);
- TS_visual_mode = tgetstr ("vs", address);
- TS_set_window = tgetstr ("wi", address);
- MultiUp = tgetstr ("UP", address);
- MultiDown = tgetstr ("DO", address);
- MultiLeft = tgetstr ("LE", address);
- MultiRight = tgetstr ("RI", address);
-
- AutoWrap = tgetflag ("am");
- memory_below_frame = tgetflag ("db");
- TF_hazeltine = tgetflag ("hz");
- must_write_spaces = tgetflag ("in");
- meta_key = tgetflag ("km") || tgetflag ("MT");
- TF_insmode_motion = tgetflag ("mi");
- TF_standout_motion = tgetflag ("ms");
- TF_underscore = tgetflag ("ul");
- MagicWrap = tgetflag ("xn");
- TF_xs = tgetflag ("xs");
- TF_teleray = tgetflag ("xt");
-
- term_get_fkeys (address);
-
- /* Get frame size from system, or else from termcap. */
- get_frame_size (&FRAME_WIDTH (selected_frame),
- &FRAME_HEIGHT (selected_frame));
- if (FRAME_WIDTH (selected_frame) <= 0)
- FRAME_WIDTH (selected_frame) = tgetnum ("co");
- if (FRAME_HEIGHT (selected_frame) <= 0)
- FRAME_HEIGHT (selected_frame) = tgetnum ("li");
-
- min_padding_speed = tgetnum ("pb");
- TN_standout_width = tgetnum ("sg");
- TabWidth = tgetnum ("tw");
-
-#ifdef VMS
- /* These capabilities commonly use ^J.
- I don't know why, but sending them on VMS does not work;
- it causes following spaces to be lost, sometimes.
- For now, the simplest fix is to avoid using these capabilities ever. */
- if (Down && Down[0] == '\n')
- Down = 0;
-#endif /* VMS */
-
- if (!TS_bell)
- TS_bell = "\07";
-
- if (!TS_fwd_scroll)
- TS_fwd_scroll = Down;
-
- PC = TS_pad_char ? *TS_pad_char : 0;
-
- if (TabWidth < 0)
- TabWidth = 8;
-
-/* Turned off since /etc/termcap seems to have :ta= for most terminals
- and newer termcap doc does not seem to say there is a default.
- if (!Wcm.cm_tab)
- Wcm.cm_tab = "\t";
-*/
-
- if (TS_standout_mode == 0)
- {
- TN_standout_width = tgetnum ("ug");
- TS_end_standout_mode = tgetstr ("ue", address);
- TS_standout_mode = tgetstr ("us", address);
- }
-
- /* If no `se' string, try using a `me' string instead.
- If that fails, we can't use standout mode at all. */
- if (TS_end_standout_mode == 0)
- {
- char *s = tgetstr ("me");
- if (s != 0)
- TS_end_standout_mode = s;
- else
- TS_standout_mode = 0;
- }
-
- if (TF_teleray)
- {
- Wcm.cm_tab = 0;
- /* Teleray: most programs want a space in front of TS_standout_mode,
- but Emacs can do without it (and give one extra column). */
- TS_standout_mode = "\033RD";
- TN_standout_width = 1;
- /* But that means we cannot rely on ^M to go to column zero! */
- CR = 0;
- /* LF can't be trusted either -- can alter hpos */
- /* if move at column 0 thru a line with TS_standout_mode */
- Down = 0;
- }
-
- /* Special handling for certain terminal types known to need it */
-
- if (!strcmp (terminal_type, "supdup"))
- {
- memory_below_frame = 1;
- Wcm.cm_losewrap = 1;
- }
- if (!strncmp (terminal_type, "c10", 3)
- || !strcmp (terminal_type, "perq"))
- {
- /* Supply a makeshift :wi string.
- This string is not valid in general since it works only
- for windows starting at the upper left corner;
- but that is all Emacs uses.
-
- This string works only if the frame is using
- the top of the video memory, because addressing is memory-relative.
- So first check the :ti string to see if that is true.
-
- It would be simpler if the :wi string could go in the termcap
- entry, but it can't because it is not fully valid.
- If it were in the termcap entry, it would confuse other programs. */
- if (!TS_set_window)
- {
- p = TS_termcap_modes;
- while (*p && strcmp (p, "\033v "))
- p++;
- if (*p)
- TS_set_window = "\033v%C %C %C %C ";
- }
- /* Termcap entry often fails to have :in: flag */
- must_write_spaces = 1;
- /* :ti string typically fails to have \E^G! in it */
- /* This limits scope of insert-char to one line. */
- strcpy (area, TS_termcap_modes);
- strcat (area, "\033\007!");
- TS_termcap_modes = area;
- area += strlen (area) + 1;
- p = AbsPosition;
- /* Change all %+ parameters to %C, to handle
- values above 96 correctly for the C100. */
- while (*p)
- {
- if (p[0] == '%' && p[1] == '+')
- p[1] = 'C';
- p++;
- }
- }
-
- FrameRows = FRAME_HEIGHT (selected_frame);
- FrameCols = FRAME_WIDTH (selected_frame);
- specified_window = FRAME_HEIGHT (selected_frame);
-
- if (Wcm_init () == -1) /* can't do cursor motion */
-#ifdef VMS
- fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
-It lacks the ability to position the cursor.\n\
-If that is not the actual type of terminal you have, use either the\n\
-DCL command `SET TERMINAL/DEVICE= ...' for DEC-compatible terminals,\n\
-or `define EMACS_TERM \"terminal type\"' for non-DEC terminals.\n",
- terminal_type);
-#else
- fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
-It lacks the ability to position the cursor.\n\
-If that is not the actual type of terminal you have,\n\
-use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
-`setenv TERM ...') to specify the correct type. It may be necessary\n\
-to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
- terminal_type);
-#endif
- if (FRAME_HEIGHT (selected_frame) <= 0
- || FRAME_WIDTH (selected_frame) <= 0)
- fatal ("The frame size has not been specified.");
-
- delete_in_insert_mode
- = TS_delete_mode && TS_insert_mode
- && !strcmp (TS_delete_mode, TS_insert_mode);
-
- se_is_so = (TS_standout_mode
- && TS_end_standout_mode
- && !strcmp (TS_standout_mode, TS_end_standout_mode));
-
- /* Remove width of standout marker from usable width of line */
- if (TN_standout_width > 0)
- FRAME_WIDTH (selected_frame) -= TN_standout_width;
-
- UseTabs = tabs_safe_p () && TabWidth == 8;
-
- scroll_region_ok
- = (Wcm.cm_abs
- && (TS_set_window || TS_set_scroll_region || TS_set_scroll_region_1));
-
- line_ins_del_ok = (((TS_ins_line || TS_ins_multi_lines)
- && (TS_del_line || TS_del_multi_lines))
- || (scroll_region_ok && TS_fwd_scroll && TS_rev_scroll));
-
- char_ins_del_ok = ((TS_ins_char || TS_insert_mode
- || TS_pad_inserted_char || TS_ins_multi_chars)
- && (TS_del_char || TS_del_multi_chars));
-
- fast_clear_end_of_line = TS_clr_line != 0;
-
- init_baud_rate ();
- if (read_socket_hook) /* Baudrate is somewhat */
- /* meaningless in this case */
- baud_rate = 9600;
-
- FRAME_CAN_HAVE_SCROLL_BARS (selected_frame) = 0;
- FRAME_HAS_VERTICAL_SCROLL_BARS (selected_frame) = 0;
-}
-
-/* VARARGS 1 */
-fatal (str, arg1, arg2)
- char *str, *arg1, *arg2;
-{
- fprintf (stderr, "emacs: ");
- fprintf (stderr, str, arg1, arg2);
- fflush (stderr);
- exit (1);
-}
-
-syms_of_term ()
-{
- DEFVAR_BOOL ("system-uses-terminfo", &system_uses_terminfo,
- "Non-nil means the system uses terminfo rather than termcap.\n\
-This variable can be used by terminal emulator packages.");
-#ifdef TERMINFO
- system_uses_terminfo = 1;
-#else
- system_uses_terminfo = 0;
-#endif
-}