1 /* terminal control module for terminals described by TERMCAP
2 Copyright (C) 1985, 86, 87, 93, 94, 95, 98
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* New redisplay, TTY faces by Gerd Moellmann <gerd@acm.org>. */
36 #include "termhooks.h"
38 #include "dispextern.h"
50 static void turn_on_face
P_ ((struct frame
*, int face_id
));
51 static void turn_off_face
P_ ((struct frame
*, int face_id
));
52 static void tty_show_cursor
P_ ((void));
53 static void tty_hide_cursor
P_ ((void));
55 #define max(a, b) ((a) > (b) ? (a) : (b))
56 #define min(a, b) ((a) < (b) ? (a) : (b))
59 tputs (a, (int) (FRAME_HEIGHT (XFRAME (selected_frame)) - curY), cmputc)
60 #define OUTPUT1(a) tputs (a, 1, cmputc)
61 #define OUTPUTL(a, lines) tputs (a, lines, cmputc)
63 #define OUTPUT_IF(a) \
66 tputs (a, (int) (FRAME_HEIGHT (XFRAME (selected_frame)) \
70 #define OUTPUT1_IF(a) do { if (a) tputs (a, 1, cmputc); } while (0)
72 /* Function to use to ring the bell. */
74 Lisp_Object Vring_bell_function
;
76 /* Terminal characteristics that higher levels want to look at.
77 These are all extern'd in termchar.h */
79 int must_write_spaces
; /* Nonzero means spaces in the text
80 must actually be output; can't just skip
81 over some columns to leave them blank. */
82 int min_padding_speed
; /* Speed below which no padding necessary */
84 int line_ins_del_ok
; /* Terminal can insert and delete lines */
85 int char_ins_del_ok
; /* Terminal can insert and delete chars */
86 int scroll_region_ok
; /* Terminal supports setting the
88 int scroll_region_cost
; /* Cost of setting a scroll window,
89 measured in characters */
90 int memory_below_frame
; /* Terminal remembers lines
91 scrolled off bottom */
92 int fast_clear_end_of_line
; /* Terminal has a `ce' string */
94 /* Nonzero means no need to redraw the entire frame on resuming
95 a suspended Emacs. This is useful on terminals with multiple pages,
96 where one page is used for Emacs and another for all else. */
98 int no_redraw_on_reenter
;
100 /* Hook functions that you can set to snap out the functions in this file.
101 These are all extern'd in termhooks.h */
103 void (*cursor_to_hook
) P_ ((int, int));
104 void (*raw_cursor_to_hook
) P_ ((int, int));
105 void (*clear_to_end_hook
) P_ ((void));
106 void (*clear_frame_hook
) P_ ((void));
107 void (*clear_end_of_line_hook
) P_ ((int));
109 void (*ins_del_lines_hook
) P_ ((int, int));
111 void (*change_line_highlight_hook
) P_ ((int, int, int, int));
112 void (*reassert_line_highlight_hook
) P_ ((int, int));
114 void (*delete_glyphs_hook
) P_ ((int));
116 void (*ring_bell_hook
) P_ ((void));
118 void (*reset_terminal_modes_hook
) P_ ((void));
119 void (*set_terminal_modes_hook
) P_ ((void));
120 void (*update_begin_hook
) P_ ((struct frame
*));
121 void (*update_end_hook
) P_ ((struct frame
*));
122 void (*set_terminal_window_hook
) P_ ((int));
123 void (*insert_glyphs_hook
) P_ ((struct glyph
*, int));
124 void (*write_glyphs_hook
) P_ ((struct glyph
*, int));
125 void (*delete_glyphs_hook
) P_ ((int));
127 int (*read_socket_hook
) P_ ((int, struct input_event
*, int, int));
129 void (*frame_up_to_date_hook
) P_ ((struct frame
*));
131 /* Return the current position of the mouse.
133 Set *f to the frame the mouse is in, or zero if the mouse is in no
134 Emacs frame. If it is set to zero, all the other arguments are
137 If the motion started in a scroll bar, set *bar_window to the
138 scroll bar's window, *part to the part the mouse is currently over,
139 *x to the position of the mouse along the scroll bar, and *y to the
140 overall length of the scroll bar.
142 Otherwise, set *bar_window to Qnil, and *x and *y to the column and
143 row of the character cell the mouse is over.
145 Set *time to the time the mouse was at the returned position.
147 This should clear mouse_moved until the next motion
149 void (*mouse_position_hook
) P_ ((FRAME_PTR
*f
, int insist
,
150 Lisp_Object
*bar_window
,
151 enum scroll_bar_part
*part
,
154 unsigned long *time
));
156 /* When reading from a minibuffer in a different frame, Emacs wants
157 to shift the highlight from the selected frame to the mini-buffer's
158 frame; under X, this means it lies about where the focus is.
159 This hook tells the window system code to re-decide where to put
161 void (*frame_rehighlight_hook
) P_ ((FRAME_PTR f
));
163 /* If we're displaying frames using a window system that can stack
164 frames on top of each other, this hook allows you to bring a frame
165 to the front, or bury it behind all the other windows. If this
166 hook is zero, that means the device we're displaying on doesn't
167 support overlapping frames, so there's no need to raise or lower
170 If RAISE is non-zero, F is brought to the front, before all other
171 windows. If RAISE is zero, F is sent to the back, behind all other
173 void (*frame_raise_lower_hook
) P_ ((FRAME_PTR f
, int raise
));
175 /* Set the vertical scroll bar for WINDOW to have its upper left corner
176 at (TOP, LEFT), and be LENGTH rows high. Set its handle to
177 indicate that we are displaying PORTION characters out of a total
178 of WHOLE characters, starting at POSITION. If WINDOW doesn't yet
179 have a scroll bar, create one for it. */
181 void (*set_vertical_scroll_bar_hook
)
182 P_ ((struct window
*window
,
183 int portion
, int whole
, int position
));
186 /* The following three hooks are used when we're doing a thorough
187 redisplay of the frame. We don't explicitly know which scroll bars
188 are going to be deleted, because keeping track of when windows go
189 away is a real pain - can you say set-window-configuration?
190 Instead, we just assert at the beginning of redisplay that *all*
191 scroll bars are to be removed, and then save scroll bars from the
192 fiery pit when we actually redisplay their window. */
194 /* Arrange for all scroll bars on FRAME to be removed at the next call
195 to `*judge_scroll_bars_hook'. A scroll bar may be spared if
196 `*redeem_scroll_bar_hook' is applied to its window before the judgment.
198 This should be applied to each frame each time its window tree is
199 redisplayed, even if it is not displaying scroll bars at the moment;
200 if the HAS_SCROLL_BARS flag has just been turned off, only calling
201 this and the judge_scroll_bars_hook will get rid of them.
203 If non-zero, this hook should be safe to apply to any frame,
204 whether or not it can support scroll bars, and whether or not it is
205 currently displaying them. */
206 void (*condemn_scroll_bars_hook
) P_ ((FRAME_PTR frame
));
208 /* Unmark WINDOW's scroll bar for deletion in this judgement cycle.
209 Note that it's okay to redeem a scroll bar that is not condemned. */
210 void (*redeem_scroll_bar_hook
) P_ ((struct window
*window
));
212 /* Remove all scroll bars on FRAME that haven't been saved since the
213 last call to `*condemn_scroll_bars_hook'.
215 This should be applied to each frame after each time its window
216 tree is redisplayed, even if it is not displaying scroll bars at the
217 moment; if the HAS_SCROLL_BARS flag has just been turned off, only
218 calling this and condemn_scroll_bars_hook will get rid of them.
220 If non-zero, this hook should be safe to apply to any frame,
221 whether or not it can support scroll bars, and whether or not it is
222 currently displaying them. */
223 void (*judge_scroll_bars_hook
) P_ ((FRAME_PTR FRAME
));
225 /* Hook to call in estimate_mode_line_height, if any. */
227 int (* estimate_mode_line_height_hook
) P_ ((struct frame
*f
, enum face_id
));
230 /* Strings, numbers and flags taken from the termcap entry. */
232 char *TS_ins_line
; /* "al" */
233 char *TS_ins_multi_lines
; /* "AL" (one parameter, # lines to insert) */
234 char *TS_bell
; /* "bl" */
235 char *TS_clr_to_bottom
; /* "cd" */
236 char *TS_clr_line
; /* "ce", clear to end of line */
237 char *TS_clr_frame
; /* "cl" */
238 char *TS_set_scroll_region
; /* "cs" (2 params, first line and last line) */
239 char *TS_set_scroll_region_1
; /* "cS" (4 params: total lines,
240 lines above scroll region, lines below it,
241 total lines again) */
242 char *TS_del_char
; /* "dc" */
243 char *TS_del_multi_chars
; /* "DC" (one parameter, # chars to delete) */
244 char *TS_del_line
; /* "dl" */
245 char *TS_del_multi_lines
; /* "DL" (one parameter, # lines to delete) */
246 char *TS_delete_mode
; /* "dm", enter character-delete mode */
247 char *TS_end_delete_mode
; /* "ed", leave character-delete mode */
248 char *TS_end_insert_mode
; /* "ei", leave character-insert mode */
249 char *TS_ins_char
; /* "ic" */
250 char *TS_ins_multi_chars
; /* "IC" (one parameter, # chars to insert) */
251 char *TS_insert_mode
; /* "im", enter character-insert mode */
252 char *TS_pad_inserted_char
; /* "ip". Just padding, no commands. */
253 char *TS_end_keypad_mode
; /* "ke" */
254 char *TS_keypad_mode
; /* "ks" */
255 char *TS_pad_char
; /* "pc", char to use as padding */
256 char *TS_repeat
; /* "rp" (2 params, # times to repeat
257 and character to be repeated) */
258 char *TS_end_standout_mode
; /* "se" */
259 char *TS_fwd_scroll
; /* "sf" */
260 char *TS_standout_mode
; /* "so" */
261 char *TS_rev_scroll
; /* "sr" */
262 char *TS_end_termcap_modes
; /* "te" */
263 char *TS_termcap_modes
; /* "ti" */
264 char *TS_visible_bell
; /* "vb" */
265 char *TS_cursor_normal
; /* "ve" */
266 char *TS_cursor_visible
; /* "vs" */
267 char *TS_cursor_invisible
; /* "vi" */
268 char *TS_set_window
; /* "wi" (4 params, start and end of window,
269 each as vpos and hpos) */
271 /* Value of the "NC" (no_color_video) capability, or 0 if not
274 static int TN_no_color_video
;
276 /* Meaning of bits in no_color_video. Each bit set means that the
277 corresponding attribute cannot be combined with colors. */
281 NC_STANDOUT
= 1 << 0,
282 NC_UNDERLINE
= 1 << 1,
289 NC_ALT_CHARSET
= 1 << 8
292 /* "md" -- turn on bold (extra bright mode). */
294 char *TS_enter_bold_mode
;
296 /* "mh" -- turn on half-bright mode. */
298 char *TS_enter_dim_mode
;
300 /* "mb" -- enter blinking mode. */
302 char *TS_enter_blink_mode
;
304 /* "mr" -- enter reverse video mode. */
306 char *TS_enter_reverse_mode
;
308 /* "us"/"ue" -- start/end underlining. */
310 char *TS_exit_underline_mode
, *TS_enter_underline_mode
;
312 /* "ug" -- number of blanks left by underline. */
314 int TN_magic_cookie_glitch_ul
;
316 /* "as"/"ae" -- start/end alternate character set. Not really
319 char *TS_enter_alt_charset_mode
, *TS_exit_alt_charset_mode
;
321 /* "me" -- switch appearances off. */
323 char *TS_exit_attribute_mode
;
325 /* "Co" -- number of colors. */
329 /* "pa" -- max. number of color pairs on screen. Not handled yet.
330 Could be a problem if not equal to TN_max_colors * TN_max_colors. */
334 /* "op" -- SVr4 set default pair to its original value. */
338 /* "AF"/"AB" or "Sf"/"Sb"-- set ANSI or SVr4 foreground/background color.
339 1 param, the color index. */
341 char *TS_set_foreground
, *TS_set_background
;
343 int TF_hazeltine
; /* termcap hz flag. */
344 int TF_insmode_motion
; /* termcap mi flag: can move while in insert mode. */
345 int TF_standout_motion
; /* termcap mi flag: can move while in standout mode. */
346 int TF_underscore
; /* termcap ul flag: _ underlines if over-struck on
347 non-blank position. Must clear before writing _. */
348 int TF_teleray
; /* termcap xt flag: many weird consequences.
351 int TF_xs
; /* Nonzero for "xs". If set together with
352 TN_standout_width == 0, it means don't bother
353 to write any end-standout cookies. */
355 int TN_standout_width
; /* termcap sg number: width occupied by standout
358 static int RPov
; /* # chars to start a TS_repeat */
360 static int delete_in_insert_mode
; /* delete mode == insert mode */
362 static int se_is_so
; /* 1 if same string both enters and leaves
367 /* The largest frame width in any call to calculate_costs. */
371 /* The largest frame height in any call to calculate_costs. */
373 int max_frame_height
;
375 /* Number of chars of space used for standout marker at beginning of line,
376 or'd with 0100. Zero if no standout marker at all.
377 The length of these vectors is max_frame_height.
379 Used IFF TN_standout_width >= 0. */
381 static char *chars_wasted
;
382 static char *copybuf
;
384 /* nonzero means supposed to write text in standout mode. */
386 int standout_requested
;
388 int insert_mode
; /* Nonzero when in insert mode. */
389 int standout_mode
; /* Nonzero when in standout mode. */
391 /* Size of window specified by higher levels.
392 This is the number of lines, from the top of frame downwards,
393 which can participate in insert-line/delete-line operations.
395 Effectively it excludes the bottom frame_height - specified_window_size
396 lines from those operations. */
398 int specified_window
;
400 /* Frame currently being redisplayed; 0 if not currently redisplaying.
401 (Direct output does not count). */
403 FRAME_PTR updating_frame
;
405 /* Provided for lisp packages. */
407 static int system_uses_terminfo
;
411 extern char *tgetstr ();
416 /* We aren't X windows, but we aren't termcap either. This makes me
417 uncertain as to what value to use for frame.output_method. For
418 this file, we'll define FRAME_TERMCAP_P to be zero so that our
419 output hooks get called instead of the termcap functions. Probably
420 the best long-term solution is to define an output_windows_nt... */
422 #undef FRAME_TERMCAP_P
423 #define FRAME_TERMCAP_P(_f_) 0
424 #endif /* WINDOWSNT */
429 if (! NILP (Vring_bell_function
))
431 Lisp_Object function
;
433 /* Temporarily set the global variable to nil
434 so that if we get an error, it stays nil
435 and we don't call it over and over.
437 We don't specbind it, because that would carefully
438 restore the bad value if there's an error
439 and make the loop of errors happen anyway. */
440 function
= Vring_bell_function
;
441 Vring_bell_function
= Qnil
;
445 Vring_bell_function
= function
;
449 if (! FRAME_TERMCAP_P (XFRAME (selected_frame
)))
451 (*ring_bell_hook
) ();
454 OUTPUT (TS_visible_bell
&& visible_bell
? TS_visible_bell
: TS_bell
);
458 set_terminal_modes ()
460 if (! FRAME_TERMCAP_P (XFRAME (selected_frame
)))
462 (*set_terminal_modes_hook
) ();
465 OUTPUT_IF (TS_termcap_modes
);
466 OUTPUT_IF (TS_cursor_visible
);
467 OUTPUT_IF (TS_keypad_mode
);
472 reset_terminal_modes ()
474 if (! FRAME_TERMCAP_P (XFRAME (selected_frame
)))
476 if (reset_terminal_modes_hook
)
477 (*reset_terminal_modes_hook
) ();
480 if (TN_standout_width
< 0)
481 turn_off_highlight ();
483 OUTPUT_IF (TS_end_keypad_mode
);
484 OUTPUT_IF (TS_cursor_normal
);
485 OUTPUT_IF (TS_end_termcap_modes
);
486 OUTPUT_IF (TS_orig_pair
);
487 /* Output raw CR so kernel can track the cursor hpos. */
488 /* But on magic-cookie terminals this can erase an end-standout marker and
489 cause the rest of the frame to be in standout, so move down first. */
490 if (TN_standout_width
>= 0)
500 if (! FRAME_TERMCAP_P (updating_frame
))
501 (*update_begin_hook
) (f
);
510 if (! FRAME_TERMCAP_P (updating_frame
))
512 (*update_end_hook
) (f
);
517 if (!XWINDOW (selected_window
)->cursor_off_p
)
521 background_highlight ();
522 standout_requested
= 0;
527 set_terminal_window (size
)
530 if (! FRAME_TERMCAP_P (updating_frame
))
532 (*set_terminal_window_hook
) (size
);
535 specified_window
= size
? size
: FRAME_HEIGHT (XFRAME (selected_frame
));
536 if (!scroll_region_ok
)
538 set_scroll_region (0, specified_window
);
542 set_scroll_region (start
, stop
)
546 struct frame
*sf
= XFRAME (selected_frame
);
548 if (TS_set_scroll_region
)
550 buf
= tparam (TS_set_scroll_region
, 0, 0, start
, stop
- 1);
552 else if (TS_set_scroll_region_1
)
554 buf
= tparam (TS_set_scroll_region_1
, 0, 0,
555 FRAME_HEIGHT (sf
), start
,
556 FRAME_HEIGHT (sf
) - stop
,
561 buf
= tparam (TS_set_window
, 0, 0, start
, 0, stop
, FRAME_WIDTH (sf
));
572 OUTPUT (TS_insert_mode
);
580 OUTPUT (TS_end_insert_mode
);
584 /* Handle highlighting when TN_standout_width (termcap sg) is not specified.
585 In these terminals, output is affected by the value of standout
586 mode when the output is written.
588 These functions are called on all terminals, but do nothing
589 on terminals whose standout mode does not work that way. */
592 turn_off_highlight ()
594 if (TN_standout_width
< 0)
597 OUTPUT_IF (TS_end_standout_mode
);
605 if (TN_standout_width
< 0)
608 OUTPUT_IF (TS_standout_mode
);
614 /* Make cursor invisible. */
619 OUTPUT_IF (TS_cursor_invisible
);
623 /* Ensure that cursor is visible. */
628 OUTPUT_IF (TS_cursor_normal
);
629 OUTPUT_IF (TS_cursor_visible
);
633 /* Set standout mode to the state it should be in for
634 empty space inside windows. What this is,
635 depends on the user option inverse-video. */
638 background_highlight ()
640 if (TN_standout_width
>= 0)
643 turn_on_highlight ();
645 turn_off_highlight ();
648 /* Set standout mode to the mode specified for the text to be output. */
651 highlight_if_desired ()
653 if (TN_standout_width
>= 0)
655 if (!inverse_video
== !standout_requested
)
656 turn_off_highlight ();
658 turn_on_highlight ();
661 /* Handle standout mode for terminals in which TN_standout_width >= 0.
662 On these terminals, standout is controlled by markers that
663 live inside the terminal's memory. TN_standout_width is the width
664 that the marker occupies in memory. Standout runs from the marker
665 to the end of the line on some terminals, or to the next
666 turn-off-standout marker (TS_end_standout_mode) string
667 on other terminals. */
669 /* Write a standout marker or end-standout marker at the front of the line
670 at vertical position vpos. */
673 write_standout_marker (flag
, vpos
)
676 if (flag
|| (TS_end_standout_mode
&& !TF_teleray
&& !se_is_so
677 && !(TF_xs
&& TN_standout_width
== 0)))
680 cmplus (TN_standout_width
);
681 OUTPUT (flag
? TS_standout_mode
: TS_end_standout_mode
);
682 chars_wasted
[curY
] = TN_standout_width
| 0100;
686 /* External interface to control of standout mode.
687 Call this when about to modify line at position VPOS
688 and not change whether it is highlighted. */
691 reassert_line_highlight (highlight
, vpos
)
695 struct frame
*f
= updating_frame
? updating_frame
: XFRAME (selected_frame
);
696 if (! FRAME_TERMCAP_P (f
))
698 (*reassert_line_highlight_hook
) (highlight
, vpos
);
701 if (TN_standout_width
< 0)
702 /* Handle terminals where standout takes affect at output time */
703 standout_requested
= highlight
;
704 else if (chars_wasted
&& chars_wasted
[vpos
] == 0)
705 /* For terminals with standout markers, write one on this line
706 if there isn't one already. */
707 write_standout_marker (highlight
, vpos
);
710 /* Call this when about to modify line at position VPOS
711 and change whether it is highlighted. */
714 change_line_highlight (new_highlight
, vpos
, y
, first_unused_hpos
)
715 int new_highlight
, vpos
, y
, first_unused_hpos
;
717 standout_requested
= new_highlight
;
718 if (! FRAME_TERMCAP_P (updating_frame
))
720 (*change_line_highlight_hook
) (new_highlight
, vpos
, y
, first_unused_hpos
);
726 if (TN_standout_width
< 0)
727 background_highlight ();
728 /* If line starts with a marker, delete the marker */
729 else if (TS_clr_line
&& chars_wasted
[curY
])
732 /* On Teleray, make sure to erase the SO marker. */
735 cmgoto (curY
- 1, FRAME_WIDTH (XFRAME (selected_frame
)) - 4);
737 curY
++; /* ESC S moves to next line where the TS_standout_mode was */
741 cmgoto (curY
, 0); /* reposition to kill standout marker */
743 clear_end_of_line_raw (first_unused_hpos
);
744 reassert_line_highlight (new_highlight
, curY
);
748 /* Move cursor to row/column position VPOS/HPOS. HPOS/VPOS are
749 frame-relative coordinates. */
752 cursor_to (vpos
, hpos
)
755 struct frame
*f
= updating_frame
? updating_frame
: XFRAME (selected_frame
);
757 if (! FRAME_TERMCAP_P (f
) && cursor_to_hook
)
759 (*cursor_to_hook
) (vpos
, hpos
);
763 /* Detect the case where we are called from reset_sys_modes
764 and the costs have never been calculated. Do nothing. */
765 if (chars_wasted
== 0)
768 hpos
+= chars_wasted
[vpos
] & 077;
769 if (curY
== vpos
&& curX
== hpos
)
771 if (!TF_standout_motion
)
772 background_highlight ();
773 if (!TF_insmode_motion
)
778 /* Similar but don't take any account of the wasted characters. */
781 raw_cursor_to (row
, col
)
784 struct frame
*f
= updating_frame
? updating_frame
: XFRAME (selected_frame
);
785 if (! FRAME_TERMCAP_P (f
))
787 (*raw_cursor_to_hook
) (row
, col
);
790 if (curY
== row
&& curX
== col
)
792 if (!TF_standout_motion
)
793 background_highlight ();
794 if (!TF_insmode_motion
)
799 /* Erase operations */
801 /* clear from cursor to end of frame */
807 if (clear_to_end_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
809 (*clear_to_end_hook
) ();
812 if (TS_clr_to_bottom
)
814 background_highlight ();
815 OUTPUT (TS_clr_to_bottom
);
816 bzero (chars_wasted
+ curY
,
817 FRAME_HEIGHT (XFRAME (selected_frame
)) - curY
);
821 for (i
= curY
; i
< FRAME_HEIGHT (XFRAME (selected_frame
)); i
++)
824 clear_end_of_line_raw (FRAME_WIDTH (XFRAME (selected_frame
)));
829 /* Clear entire frame */
834 struct frame
*sf
= XFRAME (selected_frame
);
837 && ! FRAME_TERMCAP_P ((updating_frame
? updating_frame
: sf
)))
839 (*clear_frame_hook
) ();
844 background_highlight ();
845 OUTPUT (TS_clr_frame
);
846 bzero (chars_wasted
, FRAME_HEIGHT (sf
));
856 /* Clear to end of line, but do not clear any standout marker.
857 Assumes that the cursor is positioned at a character of real text,
858 which implies it cannot be before a standout marker
859 unless the marker has zero width.
861 Note that the cursor may be moved. */
864 clear_end_of_line (first_unused_hpos
)
865 int first_unused_hpos
;
867 if (FRAME_TERMCAP_P (XFRAME (selected_frame
))
869 && TN_standout_width
== 0 && curX
== 0 && chars_wasted
[curY
] != 0)
870 write_glyphs (&space_glyph
, 1);
871 clear_end_of_line_raw (first_unused_hpos
);
874 /* Clear from cursor to end of line.
875 Assume that the line is already clear starting at column first_unused_hpos.
876 If the cursor is at a standout marker, erase the marker.
878 Note that the cursor may be moved, on terminals lacking a `ce' string. */
881 clear_end_of_line_raw (first_unused_hpos
)
882 int first_unused_hpos
;
886 if (clear_end_of_line_hook
887 && ! FRAME_TERMCAP_P ((updating_frame
889 : XFRAME (selected_frame
))))
891 (*clear_end_of_line_hook
) (first_unused_hpos
);
895 /* Detect the case where we are called from reset_sys_modes
896 and the costs have never been calculated. Do nothing. */
897 if (chars_wasted
== 0)
900 first_unused_hpos
+= chars_wasted
[curY
] & 077;
901 if (curX
>= first_unused_hpos
)
903 /* Notice if we are erasing a magic cookie */
905 chars_wasted
[curY
] = 0;
906 background_highlight ();
909 OUTPUT1 (TS_clr_line
);
912 { /* have to do it the hard way */
913 struct frame
*sf
= XFRAME (selected_frame
);
916 /* Do not write in last row last col with Auto-wrap on. */
917 if (AutoWrap
&& curY
== FRAME_HEIGHT (sf
) - 1
918 && first_unused_hpos
== FRAME_WIDTH (sf
))
921 for (i
= curX
; i
< first_unused_hpos
; i
++)
924 fputc (' ', termscript
);
927 cmplus (first_unused_hpos
- curX
);
931 /* Encode SRC_LEN glyphs starting at SRC to terminal output codes and
932 store them at DST. Do not write more than DST_LEN bytes. That may
933 require stopping before all SRC_LEN input glyphs have been
936 We store the number of glyphs actually converted in *CONSUMED. The
937 return value is the number of bytes store in DST. */
940 encode_terminal_code (src
, dst
, src_len
, dst_len
, consumed
)
944 int dst_len
, *consumed
;
946 struct glyph
*src_start
= src
, *src_end
= src
+ src_len
;
947 unsigned char *dst_start
= dst
, *dst_end
= dst
+ dst_len
;
950 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *buf
;
952 register int tlen
= GLYPH_TABLE_LENGTH
;
953 register Lisp_Object
*tbase
= GLYPH_TABLE_BASE
;
955 struct coding_system
*coding
;
957 coding
= (CODING_REQUIRE_ENCODING (&terminal_coding
)
959 : &safe_terminal_coding
);
961 while (src
< src_end
)
963 /* We must skip glyphs to be padded for a wide character. */
964 if (! CHAR_GLYPH_PADDING_P (*src
))
966 g
= GLYPH_FROM_CHAR_GLYPH (src
[0]);
968 if (g
< 0 || g
>= tlen
)
970 /* This glyph doesn't has an entry in Vglyph_table. */
971 if (! CHAR_VALID_P (src
->u
.ch
, 0))
978 len
= CHAR_STRING (src
->u
.ch
, workbuf
);
984 /* This glyph has an entry in Vglyph_table,
985 so process any alias before testing for simpleness. */
986 GLYPH_FOLLOW_ALIASES (tbase
, tlen
, g
);
988 if (GLYPH_SIMPLE_P (tbase
, tlen
, g
))
990 /* We set the multi-byte form of a character in G
991 (that should be an ASCII character) at
993 workbuf
[0] = FAST_GLYPH_CHAR (g
);
999 /* We have a string in Vglyph_table. */
1000 len
= GLYPH_LENGTH (tbase
, g
);
1001 buf
= GLYPH_STRING (tbase
, g
);
1005 result
= encode_coding (coding
, buf
, dst
, len
, dst_end
- dst
);
1006 len
-= coding
->consumed
;
1007 dst
+= coding
->produced
;
1008 if (result
== CODING_FINISH_INSUFFICIENT_DST
1009 || (result
== CODING_FINISH_INSUFFICIENT_SRC
1010 && len
> dst_end
- dst
))
1011 /* The remaining output buffer is too short. We must
1012 break the loop here without increasing SRC so that the
1013 next call of this function starts from the same glyph. */
1018 /* This is the case that a code of the range 0200..0237
1019 exists in buf. We must just write out such a code. */
1020 buf
+= coding
->consumed
;
1028 *consumed
= src
- src_start
;
1029 return (dst
- dst_start
);
1034 write_glyphs (string
, len
)
1035 register struct glyph
*string
;
1038 int produced
, consumed
;
1039 struct frame
*sf
= XFRAME (selected_frame
);
1040 struct frame
*f
= updating_frame
? updating_frame
: sf
;
1042 if (write_glyphs_hook
1043 && ! FRAME_TERMCAP_P (f
))
1045 (*write_glyphs_hook
) (string
, len
);
1049 highlight_if_desired ();
1052 /* Don't dare write in last column of bottom line, if Auto-Wrap,
1053 since that would scroll the whole frame on some terminals. */
1056 && curY
+ 1 == FRAME_HEIGHT (sf
)
1057 && (curX
+ len
- (chars_wasted
[curY
] & 077) == FRAME_WIDTH (sf
)))
1064 /* The mode bit CODING_MODE_LAST_BLOCK should be set to 1 only at
1066 terminal_coding
.mode
&= ~CODING_MODE_LAST_BLOCK
;
1070 /* Identify a run of glyphs with the same face. */
1071 int face_id
= string
->face_id
;
1074 for (n
= 1; n
< len
; ++n
)
1075 if (string
[n
].face_id
!= face_id
)
1078 /* Turn appearance modes of the face of the run on. */
1079 turn_on_face (f
, face_id
);
1083 /* We use a shared conversion buffer of the current size
1084 (1024 bytes at least). Usually it is sufficient, but if
1085 not, we just repeat the loop. */
1086 produced
= encode_terminal_code (string
, conversion_buffer
,
1087 n
, conversion_buffer_size
,
1091 fwrite (conversion_buffer
, 1, produced
, stdout
);
1092 if (ferror (stdout
))
1095 fwrite (conversion_buffer
, 1, produced
, termscript
);
1102 /* Turn appearance modes off. */
1103 turn_off_face (f
, face_id
);
1106 /* We may have to output some codes to terminate the writing. */
1107 if (CODING_REQUIRE_FLUSHING (&terminal_coding
))
1109 terminal_coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1110 encode_coding (&terminal_coding
, "", conversion_buffer
,
1111 0, conversion_buffer_size
);
1112 if (terminal_coding
.produced
> 0)
1114 fwrite (conversion_buffer
, 1, terminal_coding
.produced
, stdout
);
1115 if (ferror (stdout
))
1118 fwrite (conversion_buffer
, 1, terminal_coding
.produced
,
1126 /* If start is zero, insert blanks instead of a string at start */
1129 insert_glyphs (start
, len
)
1130 register struct glyph
*start
;
1134 struct glyph
*glyph
;
1135 struct frame
*f
, *sf
;
1140 if (insert_glyphs_hook
)
1142 (*insert_glyphs_hook
) (start
, len
);
1146 sf
= XFRAME (selected_frame
);
1147 f
= updating_frame
? updating_frame
: sf
;
1148 highlight_if_desired ();
1150 if (TS_ins_multi_chars
)
1152 buf
= tparam (TS_ins_multi_chars
, 0, 0, len
);
1156 write_glyphs (start
, len
);
1162 /* The bit CODING_MODE_LAST_BLOCK should be set to 1 only at the tail. */
1163 terminal_coding
.mode
&= ~CODING_MODE_LAST_BLOCK
;
1166 int produced
, consumed
;
1168 OUTPUT1_IF (TS_ins_char
);
1171 conversion_buffer
[0] = SPACEGLYPH
;
1176 turn_on_face (f
, start
->face_id
);
1179 /* We must open sufficient space for a character which
1180 occupies more than one column. */
1181 while (len
&& CHAR_GLYPH_PADDING_P (*start
))
1183 OUTPUT1_IF (TS_ins_char
);
1188 /* This is the last glyph. */
1189 terminal_coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1191 /* We use shared conversion buffer of the current size (1024
1192 bytes at least). It is surely sufficient for just one glyph. */
1193 produced
= encode_terminal_code (glyph
, conversion_buffer
, 1,
1194 conversion_buffer_size
, &consumed
);
1199 fwrite (conversion_buffer
, 1, produced
, stdout
);
1200 if (ferror (stdout
))
1203 fwrite (conversion_buffer
, 1, produced
, termscript
);
1206 OUTPUT1_IF (TS_pad_inserted_char
);
1208 turn_off_face (f
, glyph
->face_id
);
1221 if (delete_glyphs_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
1223 (*delete_glyphs_hook
) (n
);
1227 if (delete_in_insert_mode
)
1234 OUTPUT_IF (TS_delete_mode
);
1237 if (TS_del_multi_chars
)
1239 buf
= tparam (TS_del_multi_chars
, 0, 0, n
);
1244 for (i
= 0; i
< n
; i
++)
1245 OUTPUT1 (TS_del_char
);
1246 if (!delete_in_insert_mode
)
1247 OUTPUT_IF (TS_end_delete_mode
);
1250 /* Insert N lines at vpos VPOS. If N is negative, delete -N lines. */
1253 ins_del_lines (vpos
, n
)
1256 char *multi
= n
> 0 ? TS_ins_multi_lines
: TS_del_multi_lines
;
1257 char *single
= n
> 0 ? TS_ins_line
: TS_del_line
;
1258 char *scroll
= n
> 0 ? TS_rev_scroll
: TS_fwd_scroll
;
1261 register int i
= n
> 0 ? n
: -n
;
1264 if (ins_del_lines_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
1266 (*ins_del_lines_hook
) (vpos
, n
);
1270 sf
= XFRAME (selected_frame
);
1272 /* If the lines below the insertion are being pushed
1273 into the end of the window, this is the same as clearing;
1274 and we know the lines are already clear, since the matching
1275 deletion has already been done. So can ignore this. */
1276 /* If the lines below the deletion are blank lines coming
1277 out of the end of the window, don't bother,
1278 as there will be a matching inslines later that will flush them. */
1279 if (scroll_region_ok
&& vpos
+ i
>= specified_window
)
1281 if (!memory_below_frame
&& vpos
+ i
>= FRAME_HEIGHT (sf
))
1286 raw_cursor_to (vpos
, 0);
1287 background_highlight ();
1288 buf
= tparam (multi
, 0, 0, i
);
1294 raw_cursor_to (vpos
, 0);
1295 background_highlight ();
1303 set_scroll_region (vpos
, specified_window
);
1305 raw_cursor_to (specified_window
- 1, 0);
1307 raw_cursor_to (vpos
, 0);
1308 background_highlight ();
1310 OUTPUTL (scroll
, specified_window
- vpos
);
1311 set_scroll_region (0, specified_window
);
1314 if (TN_standout_width
>= 0)
1316 register int lower_limit
1319 : FRAME_HEIGHT (sf
));
1323 bcopy (&chars_wasted
[vpos
- n
], &chars_wasted
[vpos
],
1324 lower_limit
- vpos
+ n
);
1325 bzero (&chars_wasted
[lower_limit
+ n
], - n
);
1329 bcopy (&chars_wasted
[vpos
], ©buf
[vpos
], lower_limit
- vpos
- n
);
1330 bcopy (©buf
[vpos
], &chars_wasted
[vpos
+ n
],
1331 lower_limit
- vpos
- n
);
1332 bzero (&chars_wasted
[vpos
], n
);
1335 if (!scroll_region_ok
&& memory_below_frame
&& n
< 0)
1337 cursor_to (FRAME_HEIGHT (sf
) + n
, 0);
1342 /* Compute cost of sending "str", in characters,
1343 not counting any line-dependent padding. */
1351 tputs (str
, 0, evalcost
);
1355 /* Compute cost of sending "str", in characters,
1356 counting any line-dependent padding at one line. */
1359 string_cost_one_line (str
)
1364 tputs (str
, 1, evalcost
);
1368 /* Compute per line amount of line-dependent padding,
1369 in tenths of characters. */
1377 tputs (str
, 0, evalcost
);
1380 tputs (str
, 10, evalcost
);
1385 /* char_ins_del_cost[n] is cost of inserting N characters.
1386 char_ins_del_cost[-n] is cost of deleting N characters.
1387 The length of this vector is based on max_frame_width. */
1389 int *char_ins_del_vector
;
1391 #define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_WIDTH ((f))])
1396 calculate_ins_del_char_costs (frame
)
1399 int ins_startup_cost
, del_startup_cost
;
1400 int ins_cost_per_char
, del_cost_per_char
;
1404 if (TS_ins_multi_chars
)
1406 ins_cost_per_char
= 0;
1407 ins_startup_cost
= string_cost_one_line (TS_ins_multi_chars
);
1409 else if (TS_ins_char
|| TS_pad_inserted_char
1410 || (TS_insert_mode
&& TS_end_insert_mode
))
1412 ins_startup_cost
= (30 * (string_cost (TS_insert_mode
)
1413 + string_cost (TS_end_insert_mode
))) / 100;
1414 ins_cost_per_char
= (string_cost_one_line (TS_ins_char
)
1415 + string_cost_one_line (TS_pad_inserted_char
));
1419 ins_startup_cost
= 9999;
1420 ins_cost_per_char
= 0;
1423 if (TS_del_multi_chars
)
1425 del_cost_per_char
= 0;
1426 del_startup_cost
= string_cost_one_line (TS_del_multi_chars
);
1428 else if (TS_del_char
)
1430 del_startup_cost
= (string_cost (TS_delete_mode
)
1431 + string_cost (TS_end_delete_mode
));
1432 if (delete_in_insert_mode
)
1433 del_startup_cost
/= 2;
1434 del_cost_per_char
= string_cost_one_line (TS_del_char
);
1438 del_startup_cost
= 9999;
1439 del_cost_per_char
= 0;
1442 /* Delete costs are at negative offsets */
1443 p
= &char_ins_del_cost (frame
)[0];
1444 for (i
= FRAME_WIDTH (frame
); --i
>= 0;)
1445 *--p
= (del_startup_cost
+= del_cost_per_char
);
1447 /* Doing nothing is free */
1448 p
= &char_ins_del_cost (frame
)[0];
1451 /* Insert costs are at positive offsets */
1452 for (i
= FRAME_WIDTH (frame
); --i
>= 0;)
1453 *p
++ = (ins_startup_cost
+= ins_cost_per_char
);
1457 calculate_costs (frame
)
1460 register char *f
= (TS_set_scroll_region
1461 ? TS_set_scroll_region
1462 : TS_set_scroll_region_1
);
1464 FRAME_COST_BAUD_RATE (frame
) = baud_rate
;
1466 scroll_region_cost
= string_cost (f
);
1468 /* These variables are only used for terminal stuff. They are allocated
1469 once for the terminal frame of X-windows emacs, but not used afterwards.
1471 char_ins_del_vector (i.e., char_ins_del_cost) isn't used because
1472 X turns off char_ins_del_ok.
1474 chars_wasted and copybuf are only used here in term.c in cases where
1475 the term hook isn't called. */
1477 max_frame_height
= max (max_frame_height
, FRAME_HEIGHT (frame
));
1478 max_frame_width
= max (max_frame_width
, FRAME_WIDTH (frame
));
1480 if (chars_wasted
!= 0)
1481 chars_wasted
= (char *) xrealloc (chars_wasted
, max_frame_height
);
1483 chars_wasted
= (char *) xmalloc (max_frame_height
);
1486 copybuf
= (char *) xrealloc (copybuf
, max_frame_height
);
1488 copybuf
= (char *) xmalloc (max_frame_height
);
1490 if (char_ins_del_vector
!= 0)
1492 = (int *) xrealloc (char_ins_del_vector
,
1494 + 2 * max_frame_width
* sizeof (int)));
1497 = (int *) xmalloc (sizeof (int)
1498 + 2 * max_frame_width
* sizeof (int));
1500 bzero (chars_wasted
, max_frame_height
);
1501 bzero (copybuf
, max_frame_height
);
1502 bzero (char_ins_del_vector
, (sizeof (int)
1503 + 2 * max_frame_width
* sizeof (int)));
1505 if (f
&& (!TS_ins_line
&& !TS_del_line
))
1506 do_line_insertion_deletion_costs (frame
,
1507 TS_rev_scroll
, TS_ins_multi_lines
,
1508 TS_fwd_scroll
, TS_del_multi_lines
,
1511 do_line_insertion_deletion_costs (frame
,
1512 TS_ins_line
, TS_ins_multi_lines
,
1513 TS_del_line
, TS_del_multi_lines
,
1516 calculate_ins_del_char_costs (frame
);
1518 /* Don't use TS_repeat if its padding is worse than sending the chars */
1519 if (TS_repeat
&& per_line_cost (TS_repeat
) * baud_rate
< 9000)
1520 RPov
= string_cost (TS_repeat
);
1522 RPov
= FRAME_WIDTH (frame
) * 2;
1524 cmcostinit (); /* set up cursor motion costs */
1531 /* Termcap capability names that correspond directly to X keysyms.
1532 Some of these (marked "terminfo") aren't supplied by old-style
1533 (Berkeley) termcap entries. They're listed in X keysym order;
1534 except we put the keypad keys first, so that if they clash with
1535 other keys (as on the IBM PC keyboard) they get overridden.
1538 static struct fkey_table keys
[] =
1540 "kh", "home", /* termcap */
1541 "kl", "left", /* termcap */
1542 "ku", "up", /* termcap */
1543 "kr", "right", /* termcap */
1544 "kd", "down", /* termcap */
1545 "%8", "prior", /* terminfo */
1546 "%5", "next", /* terminfo */
1547 "@7", "end", /* terminfo */
1548 "@1", "begin", /* terminfo */
1549 "*6", "select", /* terminfo */
1550 "%9", "print", /* terminfo */
1551 "@4", "execute", /* terminfo --- actually the `command' key */
1553 * "insert" --- see below
1555 "&8", "undo", /* terminfo */
1556 "%0", "redo", /* terminfo */
1557 "%7", "menu", /* terminfo --- actually the `options' key */
1558 "@0", "find", /* terminfo */
1559 "@2", "cancel", /* terminfo */
1560 "%1", "help", /* terminfo */
1562 * "break" goes here, but can't be reliably intercepted with termcap
1564 "&4", "reset", /* terminfo --- actually `restart' */
1566 * "system" and "user" --- no termcaps
1568 "kE", "clearline", /* terminfo */
1569 "kA", "insertline", /* terminfo */
1570 "kL", "deleteline", /* terminfo */
1571 "kI", "insertchar", /* terminfo */
1572 "kD", "deletechar", /* terminfo */
1573 "kB", "backtab", /* terminfo */
1575 * "kp_backtab", "kp-space", "kp-tab" --- no termcaps
1577 "@8", "kp-enter", /* terminfo */
1579 * "kp-f1", "kp-f2", "kp-f3" "kp-f4",
1580 * "kp-multiply", "kp-add", "kp-separator",
1581 * "kp-subtract", "kp-decimal", "kp-divide", "kp-0";
1582 * --- no termcaps for any of these.
1584 "K4", "kp-1", /* terminfo */
1586 * "kp-2" --- no termcap
1588 "K5", "kp-3", /* terminfo */
1590 * "kp-4" --- no termcap
1592 "K2", "kp-5", /* terminfo */
1594 * "kp-6" --- no termcap
1596 "K1", "kp-7", /* terminfo */
1598 * "kp-8" --- no termcap
1600 "K3", "kp-9", /* terminfo */
1602 * "kp-equal" --- no termcap
1615 static char **term_get_fkeys_arg
;
1616 static Lisp_Object
term_get_fkeys_1 ();
1618 /* Find the escape codes sent by the function keys for Vfunction_key_map.
1619 This function scans the termcap function key sequence entries, and
1620 adds entries to Vfunction_key_map for each function key it finds. */
1623 term_get_fkeys (address
)
1626 /* We run the body of the function (term_get_fkeys_1) and ignore all Lisp
1627 errors during the call. The only errors should be from Fdefine_key
1628 when given a key sequence containing an invalid prefix key. If the
1629 termcap defines function keys which use a prefix that is already bound
1630 to a command by the default bindings, we should silently ignore that
1631 function key specification, rather than giving the user an error and
1632 refusing to run at all on such a terminal. */
1634 extern Lisp_Object
Fidentity ();
1635 term_get_fkeys_arg
= address
;
1636 internal_condition_case (term_get_fkeys_1
, Qerror
, Fidentity
);
1644 char **address
= term_get_fkeys_arg
;
1646 /* This can happen if CANNOT_DUMP or with strange options. */
1648 Vfunction_key_map
= Fmake_sparse_keymap (Qnil
);
1650 for (i
= 0; i
< (sizeof (keys
)/sizeof (keys
[0])); i
++)
1652 char *sequence
= tgetstr (keys
[i
].cap
, address
);
1654 Fdefine_key (Vfunction_key_map
, build_string (sequence
),
1655 Fmake_vector (make_number (1),
1656 intern (keys
[i
].name
)));
1659 /* The uses of the "k0" capability are inconsistent; sometimes it
1660 describes F10, whereas othertimes it describes F0 and "k;" describes F10.
1661 We will attempt to politely accommodate both systems by testing for
1662 "k;", and if it is present, assuming that "k0" denotes F0, otherwise F10.
1665 char *k_semi
= tgetstr ("k;", address
);
1666 char *k0
= tgetstr ("k0", address
);
1667 char *k0_name
= "f10";
1671 Fdefine_key (Vfunction_key_map
, build_string (k_semi
),
1672 Fmake_vector (make_number (1), intern ("f10")));
1677 Fdefine_key (Vfunction_key_map
, build_string (k0
),
1678 Fmake_vector (make_number (1), intern (k0_name
)));
1681 /* Set up cookies for numbered function keys above f10. */
1683 char fcap
[3], fkey
[4];
1685 fcap
[0] = 'F'; fcap
[2] = '\0';
1686 for (i
= 11; i
< 64; i
++)
1689 fcap
[1] = '1' + i
- 11;
1691 fcap
[1] = 'A' + i
- 20;
1693 fcap
[1] = 'a' + i
- 46;
1696 char *sequence
= tgetstr (fcap
, address
);
1699 sprintf (fkey
, "f%d", i
);
1700 Fdefine_key (Vfunction_key_map
, build_string (sequence
),
1701 Fmake_vector (make_number (1),
1709 * Various mappings to try and get a better fit.
1712 #define CONDITIONAL_REASSIGN(cap1, cap2, sym) \
1713 if (!tgetstr (cap1, address)) \
1715 char *sequence = tgetstr (cap2, address); \
1717 Fdefine_key (Vfunction_key_map, build_string (sequence), \
1718 Fmake_vector (make_number (1), \
1722 /* if there's no key_next keycap, map key_npage to `next' keysym */
1723 CONDITIONAL_REASSIGN ("%5", "kN", "next");
1724 /* if there's no key_prev keycap, map key_ppage to `previous' keysym */
1725 CONDITIONAL_REASSIGN ("%8", "kP", "prior");
1726 /* if there's no key_dc keycap, map key_ic to `insert' keysym */
1727 CONDITIONAL_REASSIGN ("kD", "kI", "insert");
1728 /* if there's no key_end keycap, map key_ll to 'end' keysym */
1729 CONDITIONAL_REASSIGN ("@7", "kH", "end");
1731 /* IBM has their own non-standard dialect of terminfo.
1732 If the standard name isn't found, try the IBM name. */
1733 CONDITIONAL_REASSIGN ("kB", "KO", "backtab");
1734 CONDITIONAL_REASSIGN ("@4", "kJ", "execute"); /* actually "action" */
1735 CONDITIONAL_REASSIGN ("@4", "kc", "execute"); /* actually "command" */
1736 CONDITIONAL_REASSIGN ("%7", "ki", "menu");
1737 CONDITIONAL_REASSIGN ("@7", "kw", "end");
1738 CONDITIONAL_REASSIGN ("F1", "k<", "f11");
1739 CONDITIONAL_REASSIGN ("F2", "k>", "f12");
1740 CONDITIONAL_REASSIGN ("%1", "kq", "help");
1741 CONDITIONAL_REASSIGN ("*6", "kU", "select");
1742 #undef CONDITIONAL_REASSIGN
1749 /***********************************************************************
1750 Character Display Information
1751 ***********************************************************************/
1753 static void append_glyph
P_ ((struct it
*));
1756 /* Append glyphs to IT's glyph_row. Called from produce_glyphs for
1757 terminal frames if IT->glyph_row != NULL. IT->c is the character
1758 for which to produce glyphs; IT->face_id contains the character's
1759 face. Padding glyphs are appended if IT->c has a IT->pixel_width >
1766 struct glyph
*glyph
, *end
;
1769 xassert (it
->glyph_row
);
1770 glyph
= (it
->glyph_row
->glyphs
[it
->area
]
1771 + it
->glyph_row
->used
[it
->area
]);
1772 end
= it
->glyph_row
->glyphs
[1 + it
->area
];
1775 i
< it
->pixel_width
&& glyph
< end
;
1778 glyph
->type
= CHAR_GLYPH
;
1779 glyph
->pixel_width
= 1;
1780 glyph
->u
.ch
= it
->c
;
1781 glyph
->face_id
= it
->face_id
;
1782 glyph
->padding_p
= i
> 0;
1783 glyph
->charpos
= CHARPOS (it
->position
);
1784 glyph
->object
= it
->object
;
1786 ++it
->glyph_row
->used
[it
->area
];
1792 /* Produce glyphs for the display element described by IT. The
1793 function fills output fields of IT with pixel information like the
1794 pixel width and height of a character, and maybe produces glyphs at
1795 the same time if IT->glyph_row is non-null. See the explanation of
1796 struct display_iterator in dispextern.h for an overview. */
1802 /* If a hook is installed, let it do the work. */
1803 xassert (it
->what
== IT_CHARACTER
1804 || it
->what
== IT_COMPOSITION
1805 || it
->what
== IT_IMAGE
1806 || it
->what
== IT_STRETCH
);
1808 /* Nothing but characters are supported on terminal frames. For a
1809 composition sequence, it->c is the first character of the
1811 xassert (it
->what
== IT_CHARACTER
1812 || it
->what
== IT_COMPOSITION
);
1814 if (it
->c
>= 040 && it
->c
< 0177)
1816 it
->pixel_width
= it
->nglyphs
= 1;
1820 else if (it
->c
== '\n')
1821 it
->pixel_width
= it
->nglyphs
= 0;
1822 else if (it
->c
== '\t')
1824 int absolute_x
= (it
->current_x
1825 + it
->continuation_lines_width
);
1827 = (((1 + absolute_x
+ it
->tab_width
- 1)
1832 /* If part of the TAB has been displayed on the previous line
1833 which is continued now, continuation_lines_width will have
1834 been incremented already by the part that fitted on the
1835 continued line. So, we will get the right number of spaces
1837 nspaces
= next_tab_x
- absolute_x
;
1844 it
->pixel_width
= it
->len
= 1;
1852 it
->pixel_width
= nspaces
;
1853 it
->nglyphs
= nspaces
;
1857 /* A multi-byte character. The display width is fixed for all
1858 characters of the set. Some of the glyphs may have to be
1859 ignored because they are already displayed in a continued
1861 int charset
= CHAR_CHARSET (it
->c
);
1863 it
->pixel_width
= CHARSET_WIDTH (charset
);
1864 it
->nglyphs
= it
->pixel_width
;
1870 /* Advance current_x by the pixel width as a convenience for
1872 if (it
->area
== TEXT_AREA
)
1873 it
->current_x
+= it
->pixel_width
;
1874 it
->ascent
= it
->max_ascent
= it
->phys_ascent
= it
->max_phys_ascent
= 0;
1875 it
->descent
= it
->max_descent
= it
->phys_descent
= it
->max_phys_descent
= 1;
1879 /* Get information about special display element WHAT in an
1880 environment described by IT. WHAT is one of IT_TRUNCATION or
1881 IT_CONTINUATION. Maybe produce glyphs for WHAT if IT has a
1882 non-null glyph_row member. This function ensures that fields like
1883 face_id, c, len of IT are left untouched. */
1886 produce_special_glyphs (it
, what
)
1888 enum display_element_type what
;
1894 temp_it
.what
= IT_CHARACTER
;
1896 temp_it
.object
= make_number (0);
1897 bzero (&temp_it
.current
, sizeof temp_it
.current
);
1899 if (what
== IT_CONTINUATION
)
1901 /* Continuation glyph. */
1903 && INTEGERP (DISP_CONTINUE_GLYPH (it
->dp
))
1904 && GLYPH_CHAR_VALID_P (XINT (DISP_CONTINUE_GLYPH (it
->dp
))))
1906 temp_it
.c
= FAST_GLYPH_CHAR (XINT (DISP_CONTINUE_GLYPH (it
->dp
)));
1907 temp_it
.len
= CHAR_LEN (temp_it
.c
);
1912 produce_glyphs (&temp_it
);
1913 it
->pixel_width
= temp_it
.pixel_width
;
1914 it
->nglyphs
= temp_it
.pixel_width
;
1916 else if (what
== IT_TRUNCATION
)
1918 /* Truncation glyph. */
1920 && INTEGERP (DISP_TRUNC_GLYPH (it
->dp
))
1921 && GLYPH_CHAR_VALID_P (XINT (DISP_TRUNC_GLYPH (it
->dp
))))
1923 temp_it
.c
= FAST_GLYPH_CHAR (XINT (DISP_TRUNC_GLYPH (it
->dp
)));
1924 temp_it
.len
= CHAR_LEN (temp_it
.c
);
1929 produce_glyphs (&temp_it
);
1930 it
->pixel_width
= temp_it
.pixel_width
;
1931 it
->nglyphs
= temp_it
.pixel_width
;
1938 /* Return an estimation of the pixel height of mode or top lines on
1939 frame F. FACE_ID specifies what line's height to estimate. */
1942 estimate_mode_line_height (f
, face_id
)
1944 enum face_id face_id
;
1946 if (estimate_mode_line_height_hook
)
1947 return estimate_mode_line_height_hook (f
, face_id
);
1954 /***********************************************************************
1956 ***********************************************************************/
1958 /* Value is non-zero if attribute ATTR may be used. ATTR should be
1959 one of the enumerators from enum no_color_bit, or a bit set built
1960 from them. Some display attributes may not be used together with
1961 color; the termcap capability `NC' specifies which ones. */
1963 #define MAY_USE_WITH_COLORS_P(ATTR) \
1964 (TN_max_colors > 0 \
1965 ? (TN_no_color_video & (ATTR)) == 0 \
1968 /* Turn appearances of face FACE_ID on tty frame F on. */
1971 turn_on_face (f
, face_id
)
1975 struct face
*face
= FACE_FROM_ID (f
, face_id
);
1977 xassert (face
!= NULL
);
1979 if (face
->tty_bold_p
)
1981 if (MAY_USE_WITH_COLORS_P (NC_BOLD
))
1982 OUTPUT1_IF (TS_enter_bold_mode
);
1984 else if (face
->tty_dim_p
)
1985 if (MAY_USE_WITH_COLORS_P (NC_DIM
))
1986 OUTPUT1_IF (TS_enter_dim_mode
);
1988 /* Alternate charset and blinking not yet used. */
1989 if (face
->tty_alt_charset_p
1990 && MAY_USE_WITH_COLORS_P (NC_ALT_CHARSET
))
1991 OUTPUT1_IF (TS_enter_alt_charset_mode
);
1993 if (face
->tty_blinking_p
1994 && MAY_USE_WITH_COLORS_P (NC_BLINK
))
1995 OUTPUT1_IF (TS_enter_blink_mode
);
1997 if (face
->tty_underline_p
1998 /* Don't underline if that's difficult. */
1999 && TN_magic_cookie_glitch_ul
<= 0
2000 && MAY_USE_WITH_COLORS_P (NC_UNDERLINE
))
2001 OUTPUT1_IF (TS_enter_underline_mode
);
2003 if (MAY_USE_WITH_COLORS_P (NC_REVERSE
))
2004 if (face
->tty_reverse_p
2005 || face
->foreground
== FACE_TTY_DEFAULT_BG_COLOR
2006 || face
->background
== FACE_TTY_DEFAULT_FG_COLOR
)
2007 OUTPUT1_IF (TS_enter_reverse_mode
);
2009 if (TN_max_colors
> 0)
2013 if (face
->foreground
!= FACE_TTY_DEFAULT_COLOR
2014 && face
->foreground
!= FACE_TTY_DEFAULT_FG_COLOR
2015 && face
->foreground
!= FACE_TTY_DEFAULT_BG_COLOR
2016 && TS_set_foreground
)
2018 p
= tparam (TS_set_foreground
, NULL
, 0, (int) face
->foreground
);
2023 if (face
->background
!= FACE_TTY_DEFAULT_COLOR
2024 && face
->background
!= FACE_TTY_DEFAULT_BG_COLOR
2025 && face
->background
!= FACE_TTY_DEFAULT_FG_COLOR
2026 && TS_set_background
)
2028 p
= tparam (TS_set_background
, NULL
, 0, (int) face
->background
);
2036 /* Turn off appearances of face FACE_ID on tty frame F. */
2039 turn_off_face (f
, face_id
)
2043 struct face
*face
= FACE_FROM_ID (f
, face_id
);
2045 xassert (face
!= NULL
);
2047 if (TS_exit_attribute_mode
)
2049 /* Capability "me" will turn off appearance modes double-bright,
2050 half-bright, reverse-video, standout, underline. It may or
2051 may not turn off alt-char-mode. */
2052 if (face
->tty_bold_p
2054 || face
->tty_reverse_p
2055 || face
->tty_alt_charset_p
2056 || face
->tty_blinking_p
2057 || face
->tty_underline_p
)
2058 OUTPUT1_IF (TS_exit_attribute_mode
);
2060 if (face
->tty_alt_charset_p
)
2061 OUTPUT_IF (TS_exit_alt_charset_mode
);
2065 /* If we don't have "me" we can only have those appearances
2066 that have exit sequences defined. */
2067 if (face
->tty_alt_charset_p
)
2068 OUTPUT_IF (TS_exit_alt_charset_mode
);
2070 if (face
->tty_underline_p
2071 /* We don't underline if that's difficult. */
2072 && TN_magic_cookie_glitch_ul
<= 0)
2073 OUTPUT_IF (TS_exit_underline_mode
);
2076 /* Switch back to default colors. */
2077 if (TN_max_colors
> 0
2078 && ((face
->foreground
!= FACE_TTY_DEFAULT_COLOR
2079 && face
->foreground
!= FACE_TTY_DEFAULT_FG_COLOR
)
2080 || (face
->background
!= FACE_TTY_DEFAULT_COLOR
2081 && face
->background
!= FACE_TTY_DEFAULT_BG_COLOR
)))
2082 OUTPUT1_IF (TS_orig_pair
);
2086 /* Return non-zero if the terminal is capable to display colors. */
2088 DEFUN ("tty-display-color-p", Ftty_display_color_p
, Stty_display_color_p
,
2090 "Return non-nil if TTY can display colors on FRAME.")
2094 return TN_max_colors
> 0 ? Qt
: Qnil
;
2100 /***********************************************************************
2102 ***********************************************************************/
2105 term_init (terminal_type
)
2106 char *terminal_type
;
2109 char **address
= &area
;
2113 struct frame
*sf
= XFRAME (selected_frame
);
2116 initialize_w32_display ();
2120 area
= (char *) xmalloc (2044);
2125 FrameRows
= FRAME_HEIGHT (sf
);
2126 FrameCols
= FRAME_WIDTH (sf
);
2127 specified_window
= FRAME_HEIGHT (sf
);
2129 delete_in_insert_mode
= 1;
2132 scroll_region_ok
= 0;
2134 /* Seems to insert lines when it's not supposed to, messing
2135 up the display. In doing a trace, it didn't seem to be
2136 called much, so I don't think we're losing anything by
2139 line_ins_del_ok
= 0;
2140 char_ins_del_ok
= 1;
2144 FRAME_CAN_HAVE_SCROLL_BARS (sf
) = 0;
2145 FRAME_VERTICAL_SCROLL_BAR_TYPE (sf
) = vertical_scroll_bar_none
;
2146 TN_max_colors
= 16; /* Required to be non-zero for tty-display-color-p */
2149 #else /* not WINDOWSNT */
2153 status
= tgetent (buffer
, terminal_type
);
2157 fatal ("Cannot open terminfo database file");
2159 fatal ("Cannot open termcap database file");
2165 fatal ("Terminal type %s is not defined.\n\
2166 If that is not the actual type of terminal you have,\n\
2167 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
2168 `setenv TERM ...') to specify the correct type. It may be necessary\n\
2169 to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.",
2172 fatal ("Terminal type %s is not defined.\n\
2173 If that is not the actual type of terminal you have,\n\
2174 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
2175 `setenv TERM ...') to specify the correct type. It may be necessary\n\
2176 to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
2181 area
= (char *) xmalloc (2044);
2183 area
= (char *) xmalloc (strlen (buffer
));
2184 #endif /* not TERMINFO */
2188 TS_ins_line
= tgetstr ("al", address
);
2189 TS_ins_multi_lines
= tgetstr ("AL", address
);
2190 TS_bell
= tgetstr ("bl", address
);
2191 BackTab
= tgetstr ("bt", address
);
2192 TS_clr_to_bottom
= tgetstr ("cd", address
);
2193 TS_clr_line
= tgetstr ("ce", address
);
2194 TS_clr_frame
= tgetstr ("cl", address
);
2195 ColPosition
= NULL
; /* tgetstr ("ch", address); */
2196 AbsPosition
= tgetstr ("cm", address
);
2197 CR
= tgetstr ("cr", address
);
2198 TS_set_scroll_region
= tgetstr ("cs", address
);
2199 TS_set_scroll_region_1
= tgetstr ("cS", address
);
2200 RowPosition
= tgetstr ("cv", address
);
2201 TS_del_char
= tgetstr ("dc", address
);
2202 TS_del_multi_chars
= tgetstr ("DC", address
);
2203 TS_del_line
= tgetstr ("dl", address
);
2204 TS_del_multi_lines
= tgetstr ("DL", address
);
2205 TS_delete_mode
= tgetstr ("dm", address
);
2206 TS_end_delete_mode
= tgetstr ("ed", address
);
2207 TS_end_insert_mode
= tgetstr ("ei", address
);
2208 Home
= tgetstr ("ho", address
);
2209 TS_ins_char
= tgetstr ("ic", address
);
2210 TS_ins_multi_chars
= tgetstr ("IC", address
);
2211 TS_insert_mode
= tgetstr ("im", address
);
2212 TS_pad_inserted_char
= tgetstr ("ip", address
);
2213 TS_end_keypad_mode
= tgetstr ("ke", address
);
2214 TS_keypad_mode
= tgetstr ("ks", address
);
2215 LastLine
= tgetstr ("ll", address
);
2216 Right
= tgetstr ("nd", address
);
2217 Down
= tgetstr ("do", address
);
2219 Down
= tgetstr ("nl", address
); /* Obsolete name for "do" */
2221 /* VMS puts a carriage return before each linefeed,
2222 so it is not safe to use linefeeds. */
2223 if (Down
&& Down
[0] == '\n' && Down
[1] == '\0')
2226 if (tgetflag ("bs"))
2227 Left
= "\b"; /* can't possibly be longer! */
2228 else /* (Actually, "bs" is obsolete...) */
2229 Left
= tgetstr ("le", address
);
2231 Left
= tgetstr ("bc", address
); /* Obsolete name for "le" */
2232 TS_pad_char
= tgetstr ("pc", address
);
2233 TS_repeat
= tgetstr ("rp", address
);
2234 TS_end_standout_mode
= tgetstr ("se", address
);
2235 TS_fwd_scroll
= tgetstr ("sf", address
);
2236 TS_standout_mode
= tgetstr ("so", address
);
2237 TS_rev_scroll
= tgetstr ("sr", address
);
2238 Wcm
.cm_tab
= tgetstr ("ta", address
);
2239 TS_end_termcap_modes
= tgetstr ("te", address
);
2240 TS_termcap_modes
= tgetstr ("ti", address
);
2241 Up
= tgetstr ("up", address
);
2242 TS_visible_bell
= tgetstr ("vb", address
);
2243 TS_cursor_normal
= tgetstr ("ve", address
);
2244 TS_cursor_visible
= tgetstr ("vs", address
);
2245 TS_cursor_invisible
= tgetstr ("vi", address
);
2246 TS_set_window
= tgetstr ("wi", address
);
2248 TS_enter_underline_mode
= tgetstr ("us", address
);
2249 TS_exit_underline_mode
= tgetstr ("ue", address
);
2250 TN_magic_cookie_glitch_ul
= tgetnum ("ug");
2251 TS_enter_bold_mode
= tgetstr ("md", address
);
2252 TS_enter_dim_mode
= tgetstr ("mh", address
);
2253 TS_enter_blink_mode
= tgetstr ("mb", address
);
2254 TS_enter_reverse_mode
= tgetstr ("mr", address
);
2255 TS_enter_alt_charset_mode
= tgetstr ("as", address
);
2256 TS_exit_alt_charset_mode
= tgetstr ("ae", address
);
2257 TS_exit_attribute_mode
= tgetstr ("me", address
);
2259 MultiUp
= tgetstr ("UP", address
);
2260 MultiDown
= tgetstr ("DO", address
);
2261 MultiLeft
= tgetstr ("LE", address
);
2262 MultiRight
= tgetstr ("RI", address
);
2264 /* SVr4/ANSI color suppert. If "op" isn't available, don't support
2265 color because we can't switch back to the default foreground and
2267 TS_orig_pair
= tgetstr ("op", address
);
2270 TS_set_foreground
= tgetstr ("AF", address
);
2271 TS_set_background
= tgetstr ("AB", address
);
2272 if (!TS_set_foreground
)
2275 TS_set_foreground
= tgetstr ("Sf", address
);
2276 TS_set_background
= tgetstr ("Sb", address
);
2279 TN_max_colors
= tgetnum ("Co");
2280 TN_max_pairs
= tgetnum ("pa");
2282 TN_no_color_video
= tgetnum ("NC");
2283 if (TN_no_color_video
== -1)
2284 TN_no_color_video
= 0;
2287 MagicWrap
= tgetflag ("xn");
2288 /* Since we make MagicWrap terminals look like AutoWrap, we need to have
2289 the former flag imply the latter. */
2290 AutoWrap
= MagicWrap
|| tgetflag ("am");
2291 memory_below_frame
= tgetflag ("db");
2292 TF_hazeltine
= tgetflag ("hz");
2293 must_write_spaces
= tgetflag ("in");
2294 meta_key
= tgetflag ("km") || tgetflag ("MT");
2295 TF_insmode_motion
= tgetflag ("mi");
2296 TF_standout_motion
= tgetflag ("ms");
2297 TF_underscore
= tgetflag ("ul");
2298 TF_xs
= tgetflag ("xs");
2299 TF_teleray
= tgetflag ("xt");
2301 term_get_fkeys (address
);
2303 /* Get frame size from system, or else from termcap. */
2306 get_frame_size (&width
, &height
);
2307 FRAME_WIDTH (sf
) = width
;
2308 FRAME_HEIGHT (sf
) = height
;
2311 if (FRAME_WIDTH (sf
) <= 0)
2312 SET_FRAME_WIDTH (sf
, tgetnum ("co"));
2314 /* Keep width and external_width consistent */
2315 SET_FRAME_WIDTH (sf
, FRAME_WIDTH (sf
));
2316 if (FRAME_HEIGHT (sf
) <= 0)
2317 FRAME_HEIGHT (sf
) = tgetnum ("li");
2319 if (FRAME_HEIGHT (sf
) < 3 || FRAME_WIDTH (sf
) < 3)
2320 fatal ("Screen size %dx%d is too small",
2321 FRAME_HEIGHT (sf
), FRAME_WIDTH (sf
));
2323 min_padding_speed
= tgetnum ("pb");
2324 TN_standout_width
= tgetnum ("sg");
2325 TabWidth
= tgetnum ("tw");
2328 /* These capabilities commonly use ^J.
2329 I don't know why, but sending them on VMS does not work;
2330 it causes following spaces to be lost, sometimes.
2331 For now, the simplest fix is to avoid using these capabilities ever. */
2332 if (Down
&& Down
[0] == '\n')
2340 TS_fwd_scroll
= Down
;
2342 PC
= TS_pad_char
? *TS_pad_char
: 0;
2347 /* Turned off since /etc/termcap seems to have :ta= for most terminals
2348 and newer termcap doc does not seem to say there is a default.
2353 if (TS_standout_mode
== 0)
2355 TN_standout_width
= tgetnum ("ug");
2356 TS_end_standout_mode
= tgetstr ("ue", address
);
2357 TS_standout_mode
= tgetstr ("us", address
);
2360 /* If no `se' string, try using a `me' string instead.
2361 If that fails, we can't use standout mode at all. */
2362 if (TS_end_standout_mode
== 0)
2364 char *s
= tgetstr ("me", address
);
2366 TS_end_standout_mode
= s
;
2368 TS_standout_mode
= 0;
2374 /* Teleray: most programs want a space in front of TS_standout_mode,
2375 but Emacs can do without it (and give one extra column). */
2376 TS_standout_mode
= "\033RD";
2377 TN_standout_width
= 1;
2378 /* But that means we cannot rely on ^M to go to column zero! */
2380 /* LF can't be trusted either -- can alter hpos */
2381 /* if move at column 0 thru a line with TS_standout_mode */
2385 /* Special handling for certain terminal types known to need it */
2387 if (!strcmp (terminal_type
, "supdup"))
2389 memory_below_frame
= 1;
2390 Wcm
.cm_losewrap
= 1;
2392 if (!strncmp (terminal_type
, "c10", 3)
2393 || !strcmp (terminal_type
, "perq"))
2395 /* Supply a makeshift :wi string.
2396 This string is not valid in general since it works only
2397 for windows starting at the upper left corner;
2398 but that is all Emacs uses.
2400 This string works only if the frame is using
2401 the top of the video memory, because addressing is memory-relative.
2402 So first check the :ti string to see if that is true.
2404 It would be simpler if the :wi string could go in the termcap
2405 entry, but it can't because it is not fully valid.
2406 If it were in the termcap entry, it would confuse other programs. */
2409 p
= TS_termcap_modes
;
2410 while (*p
&& strcmp (p
, "\033v "))
2413 TS_set_window
= "\033v%C %C %C %C ";
2415 /* Termcap entry often fails to have :in: flag */
2416 must_write_spaces
= 1;
2417 /* :ti string typically fails to have \E^G! in it */
2418 /* This limits scope of insert-char to one line. */
2419 strcpy (area
, TS_termcap_modes
);
2420 strcat (area
, "\033\007!");
2421 TS_termcap_modes
= area
;
2422 area
+= strlen (area
) + 1;
2424 /* Change all %+ parameters to %C, to handle
2425 values above 96 correctly for the C100. */
2428 if (p
[0] == '%' && p
[1] == '+')
2434 FrameRows
= FRAME_HEIGHT (sf
);
2435 FrameCols
= FRAME_WIDTH (sf
);
2436 specified_window
= FRAME_HEIGHT (sf
);
2438 if (Wcm_init () == -1) /* can't do cursor motion */
2440 fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
2441 It lacks the ability to position the cursor.\n\
2442 If that is not the actual type of terminal you have, use either the\n\
2443 DCL command `SET TERMINAL/DEVICE= ...' for DEC-compatible terminals,\n\
2444 or `define EMACS_TERM \"terminal type\"' for non-DEC terminals.",
2448 fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
2449 It lacks the ability to position the cursor.\n\
2450 If that is not the actual type of terminal you have,\n\
2451 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
2452 `setenv TERM ...') to specify the correct type. It may be necessary\n\
2453 to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.",
2455 # else /* TERMCAP */
2456 fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
2457 It lacks the ability to position the cursor.\n\
2458 If that is not the actual type of terminal you have,\n\
2459 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
2460 `setenv TERM ...') to specify the correct type. It may be necessary\n\
2461 to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
2463 # endif /* TERMINFO */
2465 if (FRAME_HEIGHT (sf
) <= 0
2466 || FRAME_WIDTH (sf
) <= 0)
2467 fatal ("The frame size has not been specified");
2469 delete_in_insert_mode
2470 = TS_delete_mode
&& TS_insert_mode
2471 && !strcmp (TS_delete_mode
, TS_insert_mode
);
2473 se_is_so
= (TS_standout_mode
2474 && TS_end_standout_mode
2475 && !strcmp (TS_standout_mode
, TS_end_standout_mode
));
2477 /* Remove width of standout marker from usable width of line */
2478 if (TN_standout_width
> 0)
2479 SET_FRAME_WIDTH (sf
, FRAME_WIDTH (sf
) - TN_standout_width
);
2481 UseTabs
= tabs_safe_p () && TabWidth
== 8;
2485 && (TS_set_window
|| TS_set_scroll_region
|| TS_set_scroll_region_1
));
2487 line_ins_del_ok
= (((TS_ins_line
|| TS_ins_multi_lines
)
2488 && (TS_del_line
|| TS_del_multi_lines
))
2489 || (scroll_region_ok
&& TS_fwd_scroll
&& TS_rev_scroll
));
2491 char_ins_del_ok
= ((TS_ins_char
|| TS_insert_mode
2492 || TS_pad_inserted_char
|| TS_ins_multi_chars
)
2493 && (TS_del_char
|| TS_del_multi_chars
));
2495 fast_clear_end_of_line
= TS_clr_line
!= 0;
2498 if (read_socket_hook
) /* Baudrate is somewhat */
2499 /* meaningless in this case */
2502 FRAME_CAN_HAVE_SCROLL_BARS (sf
) = 0;
2503 FRAME_VERTICAL_SCROLL_BAR_TYPE (sf
) = vertical_scroll_bar_none
;
2504 #endif /* WINDOWSNT */
2509 fatal (str
, arg1
, arg2
)
2510 char *str
, *arg1
, *arg2
;
2512 fprintf (stderr
, "emacs: ");
2513 fprintf (stderr
, str
, arg1
, arg2
);
2514 fprintf (stderr
, "\n");
2522 DEFVAR_BOOL ("system-uses-terminfo", &system_uses_terminfo
,
2523 "Non-nil means the system uses terminfo rather than termcap.\n\
2524 This variable can be used by terminal emulator packages.");
2526 system_uses_terminfo
= 1;
2528 system_uses_terminfo
= 0;
2531 DEFVAR_LISP ("ring-bell-function", &Vring_bell_function
,
2532 "Non-nil means call this function to ring the bell.\n\
2533 The function should accept no arguments.");
2534 Vring_bell_function
= Qnil
;
2536 defsubr (&Stty_display_color_p
);