1 /* terminal control module for terminals described by TERMCAP
2 Copyright (C) 1985, 1986, 1987, 1993, 1994 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
31 #include "termhooks.h"
34 #define max(a, b) ((a) > (b) ? (a) : (b))
35 #define min(a, b) ((a) < (b) ? (a) : (b))
37 #define OUTPUT(a) tputs (a, FRAME_HEIGHT (selected_frame) - curY, cmputc)
38 #define OUTPUT1(a) tputs (a, 1, cmputc)
39 #define OUTPUTL(a, lines) tputs (a, lines, cmputc)
40 #define OUTPUT_IF(a) { if (a) tputs (a, FRAME_HEIGHT (selected_frame) - curY, cmputc); }
41 #define OUTPUT1_IF(a) { if (a) tputs (a, 1, cmputc); }
43 /* Terminal characteristics that higher levels want to look at.
44 These are all extern'd in termchar.h */
46 int must_write_spaces
; /* Nonzero means spaces in the text
47 must actually be output; can't just skip
48 over some columns to leave them blank. */
49 int min_padding_speed
; /* Speed below which no padding necessary */
51 int line_ins_del_ok
; /* Terminal can insert and delete lines */
52 int char_ins_del_ok
; /* Terminal can insert and delete chars */
53 int scroll_region_ok
; /* Terminal supports setting the
55 int memory_below_frame
; /* Terminal remembers lines
56 scrolled off bottom */
57 int fast_clear_end_of_line
; /* Terminal has a `ce' string */
59 int dont_calculate_costs
; /* Nonzero means don't bother computing */
60 /* various cost tables; we won't use them. */
62 /* Nonzero means no need to redraw the entire frame on resuming
63 a suspended Emacs. This is useful on terminals with multiple pages,
64 where one page is used for Emacs and another for all else. */
65 int no_redraw_on_reenter
;
67 /* Hook functions that you can set to snap out the functions in this file.
68 These are all extern'd in termhooks.h */
70 int (*cursor_to_hook
) ();
71 int (*raw_cursor_to_hook
) ();
73 int (*clear_to_end_hook
) ();
74 int (*clear_frame_hook
) ();
75 int (*clear_end_of_line_hook
) ();
77 int (*ins_del_lines_hook
) ();
79 int (*change_line_highlight_hook
) ();
80 int (*reassert_line_highlight_hook
) ();
82 int (*insert_glyphs_hook
) ();
83 int (*write_glyphs_hook
) ();
84 int (*delete_glyphs_hook
) ();
86 int (*ring_bell_hook
) ();
88 int (*reset_terminal_modes_hook
) ();
89 int (*set_terminal_modes_hook
) ();
90 int (*update_begin_hook
) ();
91 int (*update_end_hook
) ();
92 int (*set_terminal_window_hook
) ();
94 int (*read_socket_hook
) ();
96 int (*frame_up_to_date_hook
) ();
98 /* Return the current position of the mouse.
100 Set *f to the frame the mouse is in, or zero if the mouse is in no
101 Emacs frame. If it is set to zero, all the other arguments are
104 If the motion started in a scroll bar, set *bar_window to the
105 scroll bar's window, *part to the part the mouse is currently over,
106 *x to the position of the mouse along the scroll bar, and *y to the
107 overall length of the scroll bar.
109 Otherwise, set *bar_window to Qnil, and *x and *y to the column and
110 row of the character cell the mouse is over.
112 Set *time to the time the mouse was at the returned position.
114 This should clear mouse_moved until the next motion
116 void (*mouse_position_hook
) ( /* FRAME_PTR *f,
117 Lisp_Object *bar_window,
118 enum scroll_bar_part *part,
121 unsigned long *time */ );
123 /* When reading from a minibuffer in a different frame, Emacs wants
124 to shift the highlight from the selected frame to the minibuffer's
125 frame; under X, this means it lies about where the focus is.
126 This hook tells the window system code to re-decide where to put
128 void (*frame_rehighlight_hook
) ( /* FRAME_PTR f */ );
130 /* If we're displaying frames using a window system that can stack
131 frames on top of each other, this hook allows you to bring a frame
132 to the front, or bury it behind all the other windows. If this
133 hook is zero, that means the device we're displaying on doesn't
134 support overlapping frames, so there's no need to raise or lower
137 If RAISE is non-zero, F is brought to the front, before all other
138 windows. If RAISE is zero, F is sent to the back, behind all other
140 void (*frame_raise_lower_hook
) ( /* FRAME_PTR f, int raise */ );
142 /* Set the vertical scroll bar for WINDOW to have its upper left corner
143 at (TOP, LEFT), and be LENGTH rows high. Set its handle to
144 indicate that we are displaying PORTION characters out of a total
145 of WHOLE characters, starting at POSITION. If WINDOW doesn't yet
146 have a scroll bar, create one for it. */
147 void (*set_vertical_scroll_bar_hook
)
148 ( /* struct window *window,
149 int portion, int whole, int position */ );
152 /* The following three hooks are used when we're doing a thorough
153 redisplay of the frame. We don't explicitly know which scroll bars
154 are going to be deleted, because keeping track of when windows go
155 away is a real pain - can you say set-window-configuration?
156 Instead, we just assert at the beginning of redisplay that *all*
157 scroll bars are to be removed, and then save scroll bars from the
158 firey pit when we actually redisplay their window. */
160 /* Arrange for all scroll bars on FRAME to be removed at the next call
161 to `*judge_scroll_bars_hook'. A scroll bar may be spared if
162 `*redeem_scroll_bar_hook' is applied to its window before the judgement.
164 This should be applied to each frame each time its window tree is
165 redisplayed, even if it is not displaying scroll bars at the moment;
166 if the HAS_SCROLL_BARS flag has just been turned off, only calling
167 this and the judge_scroll_bars_hook will get rid of them.
169 If non-zero, this hook should be safe to apply to any frame,
170 whether or not it can support scroll bars, and whether or not it is
171 currently displaying them. */
172 void (*condemn_scroll_bars_hook
)( /* FRAME_PTR *frame */ );
174 /* Unmark WINDOW's scroll bar for deletion in this judgement cycle.
175 Note that it's okay to redeem a scroll bar that is not condemned. */
176 void (*redeem_scroll_bar_hook
)( /* struct window *window */ );
178 /* Remove all scroll bars on FRAME that haven't been saved since the
179 last call to `*condemn_scroll_bars_hook'.
181 This should be applied to each frame after each time its window
182 tree is redisplayed, even if it is not displaying scroll bars at the
183 moment; if the HAS_SCROLL_BARS flag has just been turned off, only
184 calling this and condemn_scroll_bars_hook will get rid of them.
186 If non-zero, this hook should be safe to apply to any frame,
187 whether or not it can support scroll bars, and whether or not it is
188 currently displaying them. */
189 void (*judge_scroll_bars_hook
)( /* FRAME_PTR *FRAME */ );
192 /* Strings, numbers and flags taken from the termcap entry. */
194 char *TS_ins_line
; /* termcap "al" */
195 char *TS_ins_multi_lines
; /* "AL" (one parameter, # lines to insert) */
196 char *TS_bell
; /* "bl" */
197 char *TS_clr_to_bottom
; /* "cd" */
198 char *TS_clr_line
; /* "ce", clear to end of line */
199 char *TS_clr_frame
; /* "cl" */
200 char *TS_set_scroll_region
; /* "cs" (2 params, first line and last line) */
201 char *TS_set_scroll_region_1
; /* "cS" (4 params: total lines,
202 lines above scroll region, lines below it,
203 total lines again) */
204 char *TS_del_char
; /* "dc" */
205 char *TS_del_multi_chars
; /* "DC" (one parameter, # chars to delete) */
206 char *TS_del_line
; /* "dl" */
207 char *TS_del_multi_lines
; /* "DL" (one parameter, # lines to delete) */
208 char *TS_delete_mode
; /* "dm", enter character-delete mode */
209 char *TS_end_delete_mode
; /* "ed", leave character-delete mode */
210 char *TS_end_insert_mode
; /* "ei", leave character-insert mode */
211 char *TS_ins_char
; /* "ic" */
212 char *TS_ins_multi_chars
; /* "IC" (one parameter, # chars to insert) */
213 char *TS_insert_mode
; /* "im", enter character-insert mode */
214 char *TS_pad_inserted_char
; /* "ip". Just padding, no commands. */
215 char *TS_end_keypad_mode
; /* "ke" */
216 char *TS_keypad_mode
; /* "ks" */
217 char *TS_pad_char
; /* "pc", char to use as padding */
218 char *TS_repeat
; /* "rp" (2 params, # times to repeat
219 and character to be repeated) */
220 char *TS_end_standout_mode
; /* "se" */
221 char *TS_fwd_scroll
; /* "sf" */
222 char *TS_standout_mode
; /* "so" */
223 char *TS_rev_scroll
; /* "sr" */
224 char *TS_end_termcap_modes
; /* "te" */
225 char *TS_termcap_modes
; /* "ti" */
226 char *TS_visible_bell
; /* "vb" */
227 char *TS_end_visual_mode
; /* "ve" */
228 char *TS_visual_mode
; /* "vi" */
229 char *TS_set_window
; /* "wi" (4 params, start and end of window,
230 each as vpos and hpos) */
232 int TF_hazeltine
; /* termcap hz flag. */
233 int TF_insmode_motion
; /* termcap mi flag: can move while in insert mode. */
234 int TF_standout_motion
; /* termcap mi flag: can move while in standout mode. */
235 int TF_underscore
; /* termcap ul flag: _ underlines if overstruck on
236 nonblank position. Must clear before writing _. */
237 int TF_teleray
; /* termcap xt flag: many weird consequences.
240 int TF_xs
; /* Nonzero for "xs". If set together with
241 TN_standout_width == 0, it means don't bother
242 to write any end-standout cookies. */
244 int TN_standout_width
; /* termcap sg number: width occupied by standout
247 static int RPov
; /* # chars to start a TS_repeat */
249 static int delete_in_insert_mode
; /* delete mode == insert mode */
251 static int se_is_so
; /* 1 if same string both enters and leaves
256 /* Number of chars of space used for standout marker at beginning of line,
257 or'd with 0100. Zero if no standout marker at all.
259 Used IFF TN_standout_width >= 0. */
261 static char *chars_wasted
;
262 static char *copybuf
;
264 /* nonzero means supposed to write text in standout mode. */
265 int standout_requested
;
267 int insert_mode
; /* Nonzero when in insert mode. */
268 int standout_mode
; /* Nonzero when in standout mode. */
270 /* Size of window specified by higher levels.
271 This is the number of lines, from the top of frame downwards,
272 which can participate in insert-line/delete-line operations.
274 Effectively it excludes the bottom frame_height - specified_window_size
275 lines from those operations. */
277 int specified_window
;
279 /* Frame currently being redisplayed; 0 if not currently redisplaying.
280 (Direct output does not count). */
282 FRAME_PTR updating_frame
;
284 /* Provided for lisp packages. */
285 static int system_uses_terminfo
;
291 if (! FRAME_TERMCAP_P (selected_frame
))
293 (*ring_bell_hook
) ();
296 OUTPUT (TS_visible_bell
&& visible_bell
? TS_visible_bell
: TS_bell
);
299 set_terminal_modes ()
301 if (! FRAME_TERMCAP_P (selected_frame
))
303 (*set_terminal_modes_hook
) ();
306 OUTPUT_IF (TS_termcap_modes
);
307 OUTPUT_IF (TS_visual_mode
);
308 OUTPUT_IF (TS_keypad_mode
);
312 reset_terminal_modes ()
314 if (! FRAME_TERMCAP_P (selected_frame
))
316 (*reset_terminal_modes_hook
) ();
319 if (TN_standout_width
< 0)
320 turn_off_highlight ();
322 OUTPUT_IF (TS_end_keypad_mode
);
323 OUTPUT_IF (TS_end_visual_mode
);
324 OUTPUT_IF (TS_end_termcap_modes
);
325 /* Output raw CR so kernel can track the cursor hpos. */
326 /* But on magic-cookie terminals this can erase an end-standout marker and
327 cause the rest of the frame to be in standout, so move down first. */
328 if (TN_standout_width
>= 0)
337 if (! FRAME_TERMCAP_P (updating_frame
))
338 (*update_begin_hook
) (f
);
344 if (! FRAME_TERMCAP_P (updating_frame
))
347 (*update_end_hook
) (f
);
351 background_highlight ();
352 standout_requested
= 0;
356 set_terminal_window (size
)
359 if (! FRAME_TERMCAP_P (updating_frame
))
361 (*set_terminal_window_hook
) (size
);
364 specified_window
= size
? size
: FRAME_HEIGHT (selected_frame
);
365 if (!scroll_region_ok
)
367 set_scroll_region (0, specified_window
);
370 set_scroll_region (start
, stop
)
374 if (TS_set_scroll_region
)
376 buf
= tparam (TS_set_scroll_region
, 0, 0, start
, stop
- 1);
378 else if (TS_set_scroll_region_1
)
380 buf
= tparam (TS_set_scroll_region_1
, 0, 0,
381 FRAME_HEIGHT (selected_frame
), start
,
382 FRAME_HEIGHT (selected_frame
) - stop
,
383 FRAME_HEIGHT (selected_frame
));
387 buf
= tparam (TS_set_window
, 0, 0, start
, 0, stop
, FRAME_WIDTH (selected_frame
));
397 OUTPUT (TS_insert_mode
);
404 OUTPUT (TS_end_insert_mode
);
408 /* Handle highlighting when TN_standout_width (termcap sg) is not specified.
409 In these terminals, output is affected by the value of standout
410 mode when the output is written.
412 These functions are called on all terminals, but do nothing
413 on terminals whose standout mode does not work that way. */
415 turn_off_highlight ()
417 if (TN_standout_width
< 0)
420 OUTPUT_IF (TS_end_standout_mode
);
427 if (TN_standout_width
< 0)
430 OUTPUT_IF (TS_standout_mode
);
435 /* Set standout mode to the state it should be in for
436 empty space inside windows. What this is,
437 depends on the user option inverse-video. */
439 background_highlight ()
441 if (TN_standout_width
>= 0)
444 turn_on_highlight ();
446 turn_off_highlight ();
449 /* Set standout mode to the mode specified for the text to be output. */
452 highlight_if_desired ()
454 if (TN_standout_width
>= 0)
456 if (!inverse_video
== !standout_requested
)
457 turn_off_highlight ();
459 turn_on_highlight ();
462 /* Handle standout mode for terminals in which TN_standout_width >= 0.
463 On these terminals, standout is controlled by markers that
464 live inside the terminal's memory. TN_standout_width is the width
465 that the marker occupies in memory. Standout runs from the marker
466 to the end of the line on some terminals, or to the next
467 turn-off-standout marker (TS_end_standout_mode) string
468 on other terminals. */
470 /* Write a standout marker or end-standout marker at the front of the line
471 at vertical position vpos. */
473 write_standout_marker (flag
, vpos
)
476 if (flag
|| (TS_end_standout_mode
&& !TF_teleray
&& !se_is_so
477 && !(TF_xs
&& TN_standout_width
== 0)))
480 cmplus (TN_standout_width
);
481 OUTPUT (flag
? TS_standout_mode
: TS_end_standout_mode
);
482 chars_wasted
[curY
] = TN_standout_width
| 0100;
486 /* External interface to control of standout mode.
487 Call this when about to modify line at position VPOS
488 and not change whether it is highlighted. */
490 reassert_line_highlight (highlight
, vpos
)
494 if (! FRAME_TERMCAP_P ((updating_frame
? updating_frame
: selected_frame
)))
496 (*reassert_line_highlight_hook
) (highlight
, vpos
);
499 if (TN_standout_width
< 0)
500 /* Handle terminals where standout takes affect at output time */
501 standout_requested
= highlight
;
502 else if (chars_wasted
[vpos
] == 0)
503 /* For terminals with standout markers, write one on this line
504 if there isn't one already. */
505 write_standout_marker (highlight
, vpos
);
508 /* Call this when about to modify line at position VPOS
509 and change whether it is highlighted. */
511 change_line_highlight (new_highlight
, vpos
, first_unused_hpos
)
512 int new_highlight
, vpos
, first_unused_hpos
;
514 standout_requested
= new_highlight
;
515 if (! FRAME_TERMCAP_P (updating_frame
))
517 (*change_line_highlight_hook
) (new_highlight
, vpos
, first_unused_hpos
);
523 if (TN_standout_width
< 0)
524 background_highlight ();
525 /* If line starts with a marker, delete the marker */
526 else if (TS_clr_line
&& chars_wasted
[curY
])
529 /* On Teleray, make sure to erase the SO marker. */
532 cmgoto (curY
- 1, FRAME_WIDTH (selected_frame
) - 4);
534 curY
++; /* ESC S moves to next line where the TS_standout_mode was */
538 cmgoto (curY
, 0); /* reposition to kill standout marker */
540 clear_end_of_line_raw (first_unused_hpos
);
541 reassert_line_highlight (new_highlight
, curY
);
545 /* Move to absolute position, specified origin 0 */
550 if (! FRAME_TERMCAP_P ((updating_frame
555 (*cursor_to_hook
) (row
, col
);
559 col
+= chars_wasted
[row
] & 077;
560 if (curY
== row
&& curX
== col
)
562 if (!TF_standout_motion
)
563 background_highlight ();
564 if (!TF_insmode_motion
)
569 /* Similar but don't take any account of the wasted characters. */
571 raw_cursor_to (row
, col
)
574 if (! FRAME_TERMCAP_P ((updating_frame
? updating_frame
: selected_frame
)))
576 (*raw_cursor_to_hook
) (row
, col
);
579 if (curY
== row
&& curX
== col
)
581 if (!TF_standout_motion
)
582 background_highlight ();
583 if (!TF_insmode_motion
)
588 /* Erase operations */
590 /* clear from cursor to end of frame */
595 if (clear_to_end_hook
&& FRAME_TERMCAP_P (updating_frame
))
597 (*clear_to_end_hook
) ();
600 if (TS_clr_to_bottom
)
602 background_highlight ();
603 OUTPUT (TS_clr_to_bottom
);
604 bzero (chars_wasted
+ curY
, FRAME_HEIGHT (selected_frame
) - curY
);
608 for (i
= curY
; i
< FRAME_HEIGHT (selected_frame
); i
++)
611 clear_end_of_line_raw (FRAME_WIDTH (selected_frame
));
616 /* Clear entire frame */
621 && ! FRAME_TERMCAP_P ((updating_frame
? updating_frame
: selected_frame
)))
623 (*clear_frame_hook
) ();
628 background_highlight ();
629 OUTPUT (TS_clr_frame
);
630 bzero (chars_wasted
, FRAME_HEIGHT (selected_frame
));
640 /* Clear to end of line, but do not clear any standout marker.
641 Assumes that the cursor is positioned at a character of real text,
642 which implies it cannot be before a standout marker
643 unless the marker has zero width.
645 Note that the cursor may be moved. */
647 clear_end_of_line (first_unused_hpos
)
648 int first_unused_hpos
;
650 static GLYPH buf
= SPACEGLYPH
;
651 if (FRAME_TERMCAP_P (selected_frame
)
652 && TN_standout_width
== 0 && curX
== 0 && chars_wasted
[curY
] != 0)
653 write_glyphs (&buf
, 1);
654 clear_end_of_line_raw (first_unused_hpos
);
657 /* Clear from cursor to end of line.
658 Assume that the line is already clear starting at column first_unused_hpos.
659 If the cursor is at a standout marker, erase the marker.
661 Note that the cursor may be moved, on terminals lacking a `ce' string. */
663 clear_end_of_line_raw (first_unused_hpos
)
664 int first_unused_hpos
;
668 if (clear_end_of_line_hook
669 && ! FRAME_TERMCAP_P ((updating_frame
673 (*clear_end_of_line_hook
) (first_unused_hpos
);
677 first_unused_hpos
+= chars_wasted
[curY
] & 077;
678 if (curX
>= first_unused_hpos
)
680 /* Notice if we are erasing a magic cookie */
682 chars_wasted
[curY
] = 0;
683 background_highlight ();
686 OUTPUT1 (TS_clr_line
);
689 { /* have to do it the hard way */
692 /* Do not write in last row last col with Autowrap on. */
693 if (AutoWrap
&& curY
== FRAME_HEIGHT (selected_frame
) - 1
694 && first_unused_hpos
== FRAME_WIDTH (selected_frame
))
697 for (i
= curX
; i
< first_unused_hpos
; i
++)
700 fputc (' ', termscript
);
703 cmplus (first_unused_hpos
- curX
);
708 write_glyphs (string
, len
)
709 register GLYPH
*string
;
713 register int tlen
= GLYPH_TABLE_LENGTH
;
714 register Lisp_Object
*tbase
= GLYPH_TABLE_BASE
;
716 if (write_glyphs_hook
717 && ! FRAME_TERMCAP_P ((updating_frame
? updating_frame
: selected_frame
)))
719 (*write_glyphs_hook
) (string
, len
);
723 highlight_if_desired ();
726 /* Don't dare write in last column of bottom line, if AutoWrap,
727 since that would scroll the whole frame on some terminals. */
730 && curY
+ 1 == FRAME_HEIGHT (selected_frame
)
731 && (curX
+ len
- (chars_wasted
[curY
] & 077)
732 == FRAME_WIDTH (selected_frame
)))
739 /* Check quickly for G beyond length of table.
740 That implies it isn't an alias and is simple. */
744 putc (g
& 0xff, stdout
);
748 putc (g
& 0xff, termscript
);
752 /* G has an entry in Vglyph_table,
753 so process any alias and then test for simpleness. */
754 while (GLYPH_ALIAS_P (tbase
, tlen
, g
))
755 g
= GLYPH_ALIAS (tbase
, g
);
756 if (GLYPH_SIMPLE_P (tbase
, tlen
, g
))
760 /* Here if G (or its definition as an alias) is not simple. */
761 fwrite (GLYPH_STRING (tbase
, g
), 1, GLYPH_LENGTH (tbase
, g
),
766 fwrite (GLYPH_STRING (tbase
, g
), 1, GLYPH_LENGTH (tbase
, g
),
773 /* If start is zero, insert blanks instead of a string at start */
775 insert_glyphs (start
, len
)
776 register GLYPH
*start
;
781 register int tlen
= GLYPH_TABLE_LENGTH
;
782 register Lisp_Object
*tbase
= GLYPH_TABLE_BASE
;
784 if (insert_glyphs_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
786 (*insert_glyphs_hook
) (start
, len
);
789 highlight_if_desired ();
791 if (TS_ins_multi_chars
)
793 buf
= tparam (TS_ins_multi_chars
, 0, 0, len
);
797 write_glyphs (start
, len
);
805 OUTPUT1_IF (TS_ins_char
);
811 if (GLYPH_SIMPLE_P (tbase
, tlen
, g
))
813 putc (g
& 0xff, stdout
);
817 putc (g
& 0xff, termscript
);
821 fwrite (GLYPH_STRING (tbase
, g
), 1, GLYPH_LENGTH (tbase
, g
), stdout
);
825 fwrite (GLYPH_STRING (tbase
, g
), 1, GLYPH_LENGTH (tbase
, g
),
829 OUTPUT1_IF (TS_pad_inserted_char
);
839 if (delete_glyphs_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
841 (*delete_glyphs_hook
) (n
);
845 if (delete_in_insert_mode
)
852 OUTPUT_IF (TS_delete_mode
);
855 if (TS_del_multi_chars
)
857 buf
= tparam (TS_del_multi_chars
, 0, 0, n
);
862 for (i
= 0; i
< n
; i
++)
863 OUTPUT1 (TS_del_char
);
864 if (!delete_in_insert_mode
)
865 OUTPUT_IF (TS_end_delete_mode
);
868 /* Insert N lines at vpos VPOS. If N is negative, delete -N lines. */
870 ins_del_lines (vpos
, n
)
873 char *multi
= n
> 0 ? TS_ins_multi_lines
: TS_del_multi_lines
;
874 char *single
= n
> 0 ? TS_ins_line
: TS_del_line
;
875 char *scroll
= n
> 0 ? TS_rev_scroll
: TS_fwd_scroll
;
877 register int i
= n
> 0 ? n
: -n
;
880 if (ins_del_lines_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
882 (*ins_del_lines_hook
) (vpos
, n
);
886 /* If the lines below the insertion are being pushed
887 into the end of the window, this is the same as clearing;
888 and we know the lines are already clear, since the matching
889 deletion has already been done. So can ignore this. */
890 /* If the lines below the deletion are blank lines coming
891 out of the end of the window, don't bother,
892 as there will be a matching inslines later that will flush them. */
893 if (scroll_region_ok
&& vpos
+ i
>= specified_window
)
895 if (!memory_below_frame
&& vpos
+ i
>= FRAME_HEIGHT (selected_frame
))
900 raw_cursor_to (vpos
, 0);
901 background_highlight ();
902 buf
= tparam (multi
, 0, 0, i
);
908 raw_cursor_to (vpos
, 0);
909 background_highlight ();
917 set_scroll_region (vpos
, specified_window
);
919 raw_cursor_to (specified_window
- 1, 0);
921 raw_cursor_to (vpos
, 0);
922 background_highlight ();
924 OUTPUTL (scroll
, specified_window
- vpos
);
925 set_scroll_region (0, specified_window
);
928 if (TN_standout_width
>= 0)
933 : FRAME_HEIGHT (selected_frame
));
937 bcopy (&chars_wasted
[vpos
- n
], &chars_wasted
[vpos
],
938 lower_limit
- vpos
+ n
);
939 bzero (&chars_wasted
[lower_limit
+ n
], - n
);
943 bcopy (&chars_wasted
[vpos
], ©buf
[vpos
], lower_limit
- vpos
- n
);
944 bcopy (©buf
[vpos
], &chars_wasted
[vpos
+ n
],
945 lower_limit
- vpos
- n
);
946 bzero (&chars_wasted
[vpos
], n
);
949 if (!scroll_region_ok
&& memory_below_frame
&& n
< 0)
951 cursor_to (FRAME_HEIGHT (selected_frame
) + n
, 0);
956 /* Compute cost of sending "str", in characters,
957 not counting any line-dependent padding. */
965 tputs (str
, 0, evalcost
);
969 /* Compute cost of sending "str", in characters,
970 counting any line-dependent padding at one line. */
973 string_cost_one_line (str
)
978 tputs (str
, 1, evalcost
);
982 /* Compute per line amount of line-dependent padding,
983 in tenths of characters. */
991 tputs (str
, 0, evalcost
);
994 tputs (str
, 10, evalcost
);
999 /* char_ins_del_cost[n] is cost of inserting N characters.
1000 char_ins_del_cost[-n] is cost of deleting N characters. */
1002 int *char_ins_del_vector
;
1004 #define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_WIDTH ((f))])
1009 calculate_ins_del_char_costs (frame
)
1012 int ins_startup_cost
, del_startup_cost
;
1013 int ins_cost_per_char
, del_cost_per_char
;
1017 if (TS_ins_multi_chars
)
1019 ins_cost_per_char
= 0;
1020 ins_startup_cost
= string_cost_one_line (TS_ins_multi_chars
);
1022 else if (TS_ins_char
|| TS_pad_inserted_char
1023 || (TS_insert_mode
&& TS_end_insert_mode
))
1025 ins_startup_cost
= (30 * (string_cost (TS_insert_mode
)
1026 + string_cost (TS_end_insert_mode
))) / 100;
1027 ins_cost_per_char
= (string_cost_one_line (TS_ins_char
)
1028 + string_cost_one_line (TS_pad_inserted_char
));
1032 ins_startup_cost
= 9999;
1033 ins_cost_per_char
= 0;
1036 if (TS_del_multi_chars
)
1038 del_cost_per_char
= 0;
1039 del_startup_cost
= string_cost_one_line (TS_del_multi_chars
);
1041 else if (TS_del_char
)
1043 del_startup_cost
= (string_cost (TS_delete_mode
)
1044 + string_cost (TS_end_delete_mode
));
1045 if (delete_in_insert_mode
)
1046 del_startup_cost
/= 2;
1047 del_cost_per_char
= string_cost_one_line (TS_del_char
);
1051 del_startup_cost
= 9999;
1052 del_cost_per_char
= 0;
1055 /* Delete costs are at negative offsets */
1056 p
= &char_ins_del_cost (frame
)[0];
1057 for (i
= FRAME_WIDTH (selected_frame
); --i
>= 0;)
1058 *--p
= (del_startup_cost
+= del_cost_per_char
);
1060 /* Doing nothing is free */
1061 p
= &char_ins_del_cost (frame
)[0];
1064 /* Insert costs are at positive offsets */
1065 for (i
= FRAME_WIDTH (frame
); --i
>= 0;)
1066 *p
++ = (ins_startup_cost
+= ins_cost_per_char
);
1069 #ifdef HAVE_X_WINDOWS
1070 extern int x_screen_planes
;
1073 extern do_line_insertion_deletion_costs ();
1075 calculate_costs (frame
)
1078 register char *f
= TS_set_scroll_region
?
1079 TS_set_scroll_region
1080 : TS_set_scroll_region_1
;
1082 if (dont_calculate_costs
)
1085 #ifdef HAVE_X_WINDOWS
1086 if (FRAME_X_P (frame
))
1088 do_line_insertion_deletion_costs (frame
, 0, ".5*", 0, ".5*",
1089 0, 0, x_screen_planes
);
1094 /* These variables are only used for terminal stuff. They are allocated
1095 once for the terminal frame of X-windows emacs, but not used afterwards.
1097 char_ins_del_vector (i.e., char_ins_del_cost) isn't used because
1098 X turns off char_ins_del_ok.
1100 chars_wasted and copybuf are only used here in term.c in cases where
1101 the term hook isn't called. */
1103 if (chars_wasted
!= 0)
1104 chars_wasted
= (char *) xrealloc (chars_wasted
, FRAME_HEIGHT (frame
));
1106 chars_wasted
= (char *) xmalloc (FRAME_HEIGHT (frame
));
1109 copybuf
= (char *) xrealloc (copybuf
, FRAME_HEIGHT (frame
));
1111 copybuf
= (char *) xmalloc (FRAME_HEIGHT (frame
));
1113 if (char_ins_del_vector
!= 0)
1115 = (int *) xrealloc (char_ins_del_vector
,
1117 + 2 * FRAME_WIDTH (frame
) * sizeof (int)));
1120 = (int *) xmalloc (sizeof (int)
1121 + 2 * FRAME_WIDTH (frame
) * sizeof (int));
1123 bzero (chars_wasted
, FRAME_HEIGHT (frame
));
1124 bzero (copybuf
, FRAME_HEIGHT (frame
));
1125 bzero (char_ins_del_vector
, (sizeof (int)
1126 + 2 * FRAME_WIDTH (frame
) * sizeof (int)));
1128 if (f
&& (!TS_ins_line
&& !TS_del_line
))
1129 do_line_insertion_deletion_costs (frame
,
1130 TS_rev_scroll
, TS_ins_multi_lines
,
1131 TS_fwd_scroll
, TS_del_multi_lines
,
1134 do_line_insertion_deletion_costs (frame
,
1135 TS_ins_line
, TS_ins_multi_lines
,
1136 TS_del_line
, TS_del_multi_lines
,
1139 calculate_ins_del_char_costs (frame
);
1141 /* Don't use TS_repeat if its padding is worse than sending the chars */
1142 if (TS_repeat
&& per_line_cost (TS_repeat
) * baud_rate
< 9000)
1143 RPov
= string_cost (TS_repeat
);
1145 RPov
= FRAME_WIDTH (frame
) * 2;
1147 cmcostinit (); /* set up cursor motion costs */
1154 /* Termcap capability names that correspond directly to X keysyms.
1155 Some of these (marked "terminfo") aren't supplied by old-style
1156 (Berkeley) termcap entries. They're listed in X keysym order;
1157 except we put the keypad keys first, so that if they clash with
1158 other keys (as on the IBM PC keyboard) they get overridden.
1161 static struct fkey_table keys
[] = {
1162 "kh", "home", /* termcap */
1163 "kl", "left", /* termcap */
1164 "ku", "up", /* termcap */
1165 "kr", "right", /* termcap */
1166 "kd", "down", /* termcap */
1167 "%8", "prior", /* terminfo */
1168 "%5", "next", /* terminfo */
1169 "@7", "end", /* terminfo */
1170 "@1", "begin", /* terminfo */
1171 "*6", "select", /* terminfo */
1172 "%9", "print", /* terminfo */
1173 "@4", "execute", /* terminfo --- actually the `command' key */
1175 * "insert" --- see below
1177 "&8", "undo", /* terminfo */
1178 "%0", "redo", /* terminfo */
1179 "%7", "menu", /* terminfo --- actually the `options' key */
1180 "@0", "find", /* terminfo */
1181 "@2", "cancel", /* terminfo */
1182 "%1", "help", /* terminfo */
1184 * "break" goes here, but can't be reliably intercepted with termcap
1186 "&4", "reset", /* terminfo --- actually `restart' */
1188 * "system" and "user" --- no termcaps
1190 "kE", "clearline", /* terminfo */
1191 "kA", "insertline", /* terminfo */
1192 "kL", "deleteline", /* terminfo */
1193 "kI", "insertchar", /* terminfo */
1194 "kD", "deletechar", /* terminfo */
1195 "kB", "backtab", /* terminfo */
1197 * "kp_backtab", "kp-space", "kp-tab" --- no termcaps
1199 "@8", "kp-enter", /* terminfo */
1201 * "kp-f1", "kp-f2", "kp-f3" "kp-f4",
1202 * "kp-multiply", "kp-add", "kp-separator",
1203 * "kp-subtract", "kp-decimal", "kp-divide", "kp-0";
1204 * --- no termcaps for any of these.
1206 "K4", "kp-1", /* terminfo */
1208 * "kp-2" --- no termcap
1210 "K5", "kp-3", /* terminfo */
1212 * "kp-4" --- no termcap
1214 "K2", "kp-5", /* terminfo */
1216 * "kp-6" --- no termcap
1218 "K1", "kp-7", /* terminfo */
1220 * "kp-8" --- no termcap
1222 "K3", "kp-9", /* terminfo */
1224 * "kp-equal" --- no termcap
1237 static char **term_get_fkeys_arg
;
1238 static Lisp_Object
term_get_fkeys_1 ();
1240 /* Find the escape codes sent by the function keys for Vfunction_key_map.
1241 This function scans the termcap function key sequence entries, and
1242 adds entries to Vfunction_key_map for each function key it finds. */
1245 term_get_fkeys (address
)
1248 /* We run the body of the function (term_get_fkeys_1) and ignore all Lisp
1249 errors during the call. The only errors should be from Fdefine_key
1250 when given a key sequence containing an invalid prefix key. If the
1251 termcap defines function keys which use a prefix that is already bound
1252 to a command by the default bindings, we should silently ignore that
1253 function key specification, rather than giving the user an error and
1254 refusing to run at all on such a terminal. */
1256 extern Lisp_Object
Fidentity ();
1257 static Lisp_Object
term_get_fkeys_1 ();
1258 term_get_fkeys_arg
= address
;
1259 internal_condition_case (term_get_fkeys_1
, Qerror
, Fidentity
);
1265 extern char *tgetstr ();
1268 char **address
= term_get_fkeys_arg
;
1270 /* This can happen if CANNOT_DUMP or with strange options. */
1272 Vfunction_key_map
= Fmake_sparse_keymap (Qnil
);
1274 for (i
= 0; i
< (sizeof (keys
)/sizeof (keys
[0])); i
++)
1276 char *sequence
= tgetstr (keys
[i
].cap
, address
);
1278 Fdefine_key (Vfunction_key_map
, build_string (sequence
),
1279 Fmake_vector (make_number (1),
1280 intern (keys
[i
].name
)));
1283 /* The uses of the "k0" capability are inconsistent; sometimes it
1284 describes F10, whereas othertimes it describes F0 and "k;" describes F10.
1285 We will attempt to politely accommodate both systems by testing for
1286 "k;", and if it is present, assuming that "k0" denotes F0, otherwise F10.
1289 char *k_semi
= tgetstr ("k;", address
);
1290 char *k0
= tgetstr ("k0", address
);
1291 char *k0_name
= "f10";
1295 Fdefine_key (Vfunction_key_map
, build_string (k_semi
),
1296 Fmake_vector (make_number (1), intern ("f10")));
1301 Fdefine_key (Vfunction_key_map
, build_string (k0
),
1302 Fmake_vector (make_number (1), intern (k0_name
)));
1305 /* Set up cookies for numbered function keys above f10. */
1307 char fcap
[3], fkey
[4];
1309 fcap
[0] = 'F'; fcap
[2] = '\0';
1310 for (i
= 11; i
< 64; i
++)
1313 fcap
[1] = '1' + i
- 11;
1315 fcap
[1] = 'A' + i
- 11;
1317 fcap
[1] = 'a' + i
- 11;
1320 char *sequence
= tgetstr (fcap
, address
);
1323 sprintf (fkey
, "f%d", i
);
1324 Fdefine_key (Vfunction_key_map
, build_string (sequence
),
1325 Fmake_vector (make_number (1),
1333 * Various mappings to try and get a better fit.
1336 #define CONDITIONAL_REASSIGN(cap1, cap2, sym) \
1337 if (!tgetstr (cap1, address)) \
1339 char *sequence = tgetstr (cap2, address); \
1341 Fdefine_key (Vfunction_key_map, build_string (sequence), \
1342 Fmake_vector (make_number (1), \
1346 /* if there's no key_next keycap, map key_npage to `next' keysym */
1347 CONDITIONAL_REASSIGN ("%5", "kN", "next");
1348 /* if there's no key_prev keycap, map key_ppage to `previous' keysym */
1349 CONDITIONAL_REASSIGN ("%8", "kP", "prior");
1350 /* if there's no key_dc keycap, map key_ic to `insert' keysym */
1351 CONDITIONAL_REASSIGN ("kD", "kI", "insert");
1352 #undef CONDITIONAL_REASSIGN
1357 term_init (terminal_type
)
1358 char *terminal_type
;
1361 char **address
= &area
;
1366 extern char *tgetstr ();
1369 dont_calculate_costs
= 0;
1371 status
= tgetent (buffer
, terminal_type
);
1373 fatal ("Cannot open termcap database file.\n");
1375 fatal ("Terminal type %s is not defined.\n\
1376 If that is not the actual type of terminal you have,\n\
1377 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
1378 `setenv TERM ...') to specify the correct type. It may be necessary\n\
1379 to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
1383 area
= (char *) malloc (2044);
1385 area
= (char *) malloc (strlen (buffer
));
1386 #endif /* not TERMINFO */
1390 TS_ins_line
= tgetstr ("al", address
);
1391 TS_ins_multi_lines
= tgetstr ("AL", address
);
1392 TS_bell
= tgetstr ("bl", address
);
1393 BackTab
= tgetstr ("bt", address
);
1394 TS_clr_to_bottom
= tgetstr ("cd", address
);
1395 TS_clr_line
= tgetstr ("ce", address
);
1396 TS_clr_frame
= tgetstr ("cl", address
);
1397 ColPosition
= tgetstr ("ch", address
);
1398 AbsPosition
= tgetstr ("cm", address
);
1399 CR
= tgetstr ("cr", address
);
1400 TS_set_scroll_region
= tgetstr ("cs", address
);
1401 TS_set_scroll_region_1
= tgetstr ("cS", address
);
1402 RowPosition
= tgetstr ("cv", address
);
1403 TS_del_char
= tgetstr ("dc", address
);
1404 TS_del_multi_chars
= tgetstr ("DC", address
);
1405 TS_del_line
= tgetstr ("dl", address
);
1406 TS_del_multi_lines
= tgetstr ("DL", address
);
1407 TS_delete_mode
= tgetstr ("dm", address
);
1408 TS_end_delete_mode
= tgetstr ("ed", address
);
1409 TS_end_insert_mode
= tgetstr ("ei", address
);
1410 Home
= tgetstr ("ho", address
);
1411 TS_ins_char
= tgetstr ("ic", address
);
1412 TS_ins_multi_chars
= tgetstr ("IC", address
);
1413 TS_insert_mode
= tgetstr ("im", address
);
1414 TS_pad_inserted_char
= tgetstr ("ip", address
);
1415 TS_end_keypad_mode
= tgetstr ("ke", address
);
1416 TS_keypad_mode
= tgetstr ("ks", address
);
1417 LastLine
= tgetstr ("ll", address
);
1418 Right
= tgetstr ("nd", address
);
1419 Down
= tgetstr ("do", address
);
1421 Down
= tgetstr ("nl", address
); /* Obsolete name for "do" */
1423 /* VMS puts a carriage return before each linefeed,
1424 so it is not safe to use linefeeds. */
1425 if (Down
&& Down
[0] == '\n' && Down
[1] == '\0')
1428 if (tgetflag ("bs"))
1429 Left
= "\b"; /* can't possibly be longer! */
1430 else /* (Actually, "bs" is obsolete...) */
1431 Left
= tgetstr ("le", address
);
1433 Left
= tgetstr ("bc", address
); /* Obsolete name for "le" */
1434 TS_pad_char
= tgetstr ("pc", address
);
1435 TS_repeat
= tgetstr ("rp", address
);
1436 TS_end_standout_mode
= tgetstr ("se", address
);
1437 TS_fwd_scroll
= tgetstr ("sf", address
);
1438 TS_standout_mode
= tgetstr ("so", address
);
1439 TS_rev_scroll
= tgetstr ("sr", address
);
1440 Wcm
.cm_tab
= tgetstr ("ta", address
);
1441 TS_end_termcap_modes
= tgetstr ("te", address
);
1442 TS_termcap_modes
= tgetstr ("ti", address
);
1443 Up
= tgetstr ("up", address
);
1444 TS_visible_bell
= tgetstr ("vb", address
);
1445 TS_end_visual_mode
= tgetstr ("ve", address
);
1446 TS_visual_mode
= tgetstr ("vs", address
);
1447 TS_set_window
= tgetstr ("wi", address
);
1448 MultiUp
= tgetstr ("UP", address
);
1449 MultiDown
= tgetstr ("DO", address
);
1450 MultiLeft
= tgetstr ("LE", address
);
1451 MultiRight
= tgetstr ("RI", address
);
1453 AutoWrap
= tgetflag ("am");
1454 memory_below_frame
= tgetflag ("db");
1455 TF_hazeltine
= tgetflag ("hz");
1456 must_write_spaces
= tgetflag ("in");
1457 meta_key
= tgetflag ("km") || tgetflag ("MT");
1458 TF_insmode_motion
= tgetflag ("mi");
1459 TF_standout_motion
= tgetflag ("ms");
1460 TF_underscore
= tgetflag ("ul");
1461 MagicWrap
= tgetflag ("xn");
1462 TF_xs
= tgetflag ("xs");
1463 TF_teleray
= tgetflag ("xt");
1465 term_get_fkeys (address
);
1467 /* Get frame size from system, or else from termcap. */
1468 get_frame_size (&FRAME_WIDTH (selected_frame
),
1469 &FRAME_HEIGHT (selected_frame
));
1470 if (FRAME_WIDTH (selected_frame
) <= 0)
1471 FRAME_WIDTH (selected_frame
) = tgetnum ("co");
1472 if (FRAME_HEIGHT (selected_frame
) <= 0)
1473 FRAME_HEIGHT (selected_frame
) = tgetnum ("li");
1475 min_padding_speed
= tgetnum ("pb");
1476 TN_standout_width
= tgetnum ("sg");
1477 TabWidth
= tgetnum ("tw");
1480 /* These capabilities commonly use ^J.
1481 I don't know why, but sending them on VMS does not work;
1482 it causes following spaces to be lost, sometimes.
1483 For now, the simplest fix is to avoid using these capabilities ever. */
1484 if (Down
&& Down
[0] == '\n')
1492 TS_fwd_scroll
= Down
;
1494 PC
= TS_pad_char
? *TS_pad_char
: 0;
1499 /* Turned off since /etc/termcap seems to have :ta= for most terminals
1500 and newer termcap doc does not seem to say there is a default.
1505 if (TS_standout_mode
== 0)
1507 TN_standout_width
= tgetnum ("ug");
1508 TS_end_standout_mode
= tgetstr ("ue", address
);
1509 TS_standout_mode
= tgetstr ("us", address
);
1512 /* If no `se' string, try using a `me' string instead.
1513 If that fails, we can't use standout mode at all. */
1514 if (TS_end_standout_mode
== 0)
1516 char *s
= tgetstr ("me");
1518 TS_end_standout_mode
= s
;
1520 TS_standout_mode
= 0;
1526 /* Teleray: most programs want a space in front of TS_standout_mode,
1527 but Emacs can do without it (and give one extra column). */
1528 TS_standout_mode
= "\033RD";
1529 TN_standout_width
= 1;
1530 /* But that means we cannot rely on ^M to go to column zero! */
1532 /* LF can't be trusted either -- can alter hpos */
1533 /* if move at column 0 thru a line with TS_standout_mode */
1537 /* Special handling for certain terminal types known to need it */
1539 if (!strcmp (terminal_type
, "supdup"))
1541 memory_below_frame
= 1;
1542 Wcm
.cm_losewrap
= 1;
1544 if (!strncmp (terminal_type
, "c10", 3)
1545 || !strcmp (terminal_type
, "perq"))
1547 /* Supply a makeshift :wi string.
1548 This string is not valid in general since it works only
1549 for windows starting at the upper left corner;
1550 but that is all Emacs uses.
1552 This string works only if the frame is using
1553 the top of the video memory, because addressing is memory-relative.
1554 So first check the :ti string to see if that is true.
1556 It would be simpler if the :wi string could go in the termcap
1557 entry, but it can't because it is not fully valid.
1558 If it were in the termcap entry, it would confuse other programs. */
1561 p
= TS_termcap_modes
;
1562 while (*p
&& strcmp (p
, "\033v "))
1565 TS_set_window
= "\033v%C %C %C %C ";
1567 /* Termcap entry often fails to have :in: flag */
1568 must_write_spaces
= 1;
1569 /* :ti string typically fails to have \E^G! in it */
1570 /* This limits scope of insert-char to one line. */
1571 strcpy (area
, TS_termcap_modes
);
1572 strcat (area
, "\033\007!");
1573 TS_termcap_modes
= area
;
1574 area
+= strlen (area
) + 1;
1576 /* Change all %+ parameters to %C, to handle
1577 values above 96 correctly for the C100. */
1580 if (p
[0] == '%' && p
[1] == '+')
1586 FrameRows
= FRAME_HEIGHT (selected_frame
);
1587 FrameCols
= FRAME_WIDTH (selected_frame
);
1588 specified_window
= FRAME_HEIGHT (selected_frame
);
1590 if (Wcm_init () == -1) /* can't do cursor motion */
1592 fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
1593 It lacks the ability to position the cursor.\n\
1594 If that is not the actual type of terminal you have, use either the\n\
1595 DCL command `SET TERMINAL/DEVICE= ...' for DEC-compatible terminals,\n\
1596 or `define EMACS_TERM \"terminal type\"' for non-DEC terminals.\n",
1599 fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
1600 It lacks the ability to position the cursor.\n\
1601 If that is not the actual type of terminal you have,\n\
1602 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
1603 `setenv TERM ...') to specify the correct type. It may be necessary\n\
1604 to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
1607 if (FRAME_HEIGHT (selected_frame
) <= 0
1608 || FRAME_WIDTH (selected_frame
) <= 0)
1609 fatal ("The frame size has not been specified.");
1611 delete_in_insert_mode
1612 = TS_delete_mode
&& TS_insert_mode
1613 && !strcmp (TS_delete_mode
, TS_insert_mode
);
1615 se_is_so
= (TS_standout_mode
1616 && TS_end_standout_mode
1617 && !strcmp (TS_standout_mode
, TS_end_standout_mode
));
1619 /* Remove width of standout marker from usable width of line */
1620 if (TN_standout_width
> 0)
1621 FRAME_WIDTH (selected_frame
) -= TN_standout_width
;
1623 UseTabs
= tabs_safe_p () && TabWidth
== 8;
1627 && (TS_set_window
|| TS_set_scroll_region
|| TS_set_scroll_region_1
));
1629 line_ins_del_ok
= (((TS_ins_line
|| TS_ins_multi_lines
)
1630 && (TS_del_line
|| TS_del_multi_lines
))
1631 || (scroll_region_ok
&& TS_fwd_scroll
&& TS_rev_scroll
));
1633 char_ins_del_ok
= ((TS_ins_char
|| TS_insert_mode
1634 || TS_pad_inserted_char
|| TS_ins_multi_chars
)
1635 && (TS_del_char
|| TS_del_multi_chars
));
1637 fast_clear_end_of_line
= TS_clr_line
!= 0;
1640 if (read_socket_hook
) /* Baudrate is somewhat */
1641 /* meaningless in this case */
1644 FRAME_CAN_HAVE_SCROLL_BARS (selected_frame
) = 0;
1645 FRAME_HAS_VERTICAL_SCROLL_BARS (selected_frame
) = 0;
1649 fatal (str
, arg1
, arg2
)
1650 char *str
, *arg1
, *arg2
;
1652 fprintf (stderr
, "emacs: ");
1653 fprintf (stderr
, str
, arg1
, arg2
);
1660 DEFVAR_BOOL ("system-uses-terminfo", &system_uses_terminfo
,
1661 "Non-nil means the system uses terminfo rather than termcap.\n\
1662 This variable can be used by terminal emulator packages.");
1664 system_uses_terminfo
= 1;
1666 system_uses_terminfo
= 0;