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 /* "md" -- turn on bold (extra bright mode). */
273 char *TS_enter_bold_mode
;
275 /* "mh" -- turn on half-bright mode. */
277 char *TS_enter_dim_mode
;
279 /* "mb" -- enter blinking mode. */
281 char *TS_enter_blink_mode
;
283 /* "mr" -- enter reverse video mode. */
285 char *TS_enter_reverse_mode
;
287 /* "us"/"ue" -- start/end underlining. */
289 char *TS_exit_underline_mode
, *TS_enter_underline_mode
;
291 /* "ug" -- number of blanks left by underline. */
293 int TN_magic_cookie_glitch_ul
;
295 /* "as"/"ae" -- start/end alternate character set. Not really
298 char *TS_enter_alt_charset_mode
, *TS_exit_alt_charset_mode
;
300 /* "me" -- switch appearances off. */
302 char *TS_exit_attribute_mode
;
304 /* "Co" -- number of colors. */
308 /* "pa" -- max. number of color pairs on screen. Not handled yet.
309 Could be a problem if not equal to TN_max_colors * TN_max_colors. */
313 /* "op" -- SVr4 set default pair to its original value. */
317 /* "AF"/"AB" or "Sf"/"Sb"-- set ANSI or SVr4 foreground/background color.
318 1 param, the color index. */
320 char *TS_set_foreground
, *TS_set_background
;
322 int TF_hazeltine
; /* termcap hz flag. */
323 int TF_insmode_motion
; /* termcap mi flag: can move while in insert mode. */
324 int TF_standout_motion
; /* termcap mi flag: can move while in standout mode. */
325 int TF_underscore
; /* termcap ul flag: _ underlines if over-struck on
326 non-blank position. Must clear before writing _. */
327 int TF_teleray
; /* termcap xt flag: many weird consequences.
330 int TF_xs
; /* Nonzero for "xs". If set together with
331 TN_standout_width == 0, it means don't bother
332 to write any end-standout cookies. */
334 int TN_standout_width
; /* termcap sg number: width occupied by standout
337 static int RPov
; /* # chars to start a TS_repeat */
339 static int delete_in_insert_mode
; /* delete mode == insert mode */
341 static int se_is_so
; /* 1 if same string both enters and leaves
346 /* The largest frame width in any call to calculate_costs. */
350 /* The largest frame height in any call to calculate_costs. */
352 int max_frame_height
;
354 /* Number of chars of space used for standout marker at beginning of line,
355 or'd with 0100. Zero if no standout marker at all.
356 The length of these vectors is max_frame_height.
358 Used IFF TN_standout_width >= 0. */
360 static char *chars_wasted
;
361 static char *copybuf
;
363 /* nonzero means supposed to write text in standout mode. */
365 int standout_requested
;
367 int insert_mode
; /* Nonzero when in insert mode. */
368 int standout_mode
; /* Nonzero when in standout mode. */
370 /* Size of window specified by higher levels.
371 This is the number of lines, from the top of frame downwards,
372 which can participate in insert-line/delete-line operations.
374 Effectively it excludes the bottom frame_height - specified_window_size
375 lines from those operations. */
377 int specified_window
;
379 /* Frame currently being redisplayed; 0 if not currently redisplaying.
380 (Direct output does not count). */
382 FRAME_PTR updating_frame
;
384 /* Provided for lisp packages. */
386 static int system_uses_terminfo
;
390 extern char *tgetstr ();
395 /* We aren't X windows, but we aren't termcap either. This makes me
396 uncertain as to what value to use for frame.output_method. For
397 this file, we'll define FRAME_TERMCAP_P to be zero so that our
398 output hooks get called instead of the termcap functions. Probably
399 the best long-term solution is to define an output_windows_nt... */
401 #undef FRAME_TERMCAP_P
402 #define FRAME_TERMCAP_P(_f_) 0
403 #endif /* WINDOWSNT */
408 if (! NILP (Vring_bell_function
))
410 Lisp_Object function
;
412 /* Temporarily set the global variable to nil
413 so that if we get an error, it stays nil
414 and we don't call it over and over.
416 We don't specbind it, because that would carefully
417 restore the bad value if there's an error
418 and make the loop of errors happen anyway. */
419 function
= Vring_bell_function
;
420 Vring_bell_function
= Qnil
;
424 Vring_bell_function
= function
;
428 if (! FRAME_TERMCAP_P (XFRAME (selected_frame
)))
430 (*ring_bell_hook
) ();
433 OUTPUT (TS_visible_bell
&& visible_bell
? TS_visible_bell
: TS_bell
);
437 set_terminal_modes ()
439 if (! FRAME_TERMCAP_P (XFRAME (selected_frame
)))
441 (*set_terminal_modes_hook
) ();
444 OUTPUT_IF (TS_termcap_modes
);
445 OUTPUT_IF (TS_cursor_visible
);
446 OUTPUT_IF (TS_keypad_mode
);
451 reset_terminal_modes ()
453 if (! FRAME_TERMCAP_P (XFRAME (selected_frame
)))
455 if (reset_terminal_modes_hook
)
456 (*reset_terminal_modes_hook
) ();
459 if (TN_standout_width
< 0)
460 turn_off_highlight ();
462 OUTPUT_IF (TS_end_keypad_mode
);
463 OUTPUT_IF (TS_cursor_normal
);
464 OUTPUT_IF (TS_end_termcap_modes
);
465 OUTPUT_IF (TS_orig_pair
);
466 /* Output raw CR so kernel can track the cursor hpos. */
467 /* But on magic-cookie terminals this can erase an end-standout marker and
468 cause the rest of the frame to be in standout, so move down first. */
469 if (TN_standout_width
>= 0)
479 if (! FRAME_TERMCAP_P (updating_frame
))
480 (*update_begin_hook
) (f
);
489 if (! FRAME_TERMCAP_P (updating_frame
))
491 (*update_end_hook
) (f
);
496 if (!XWINDOW (selected_window
)->cursor_off_p
)
500 background_highlight ();
501 standout_requested
= 0;
506 set_terminal_window (size
)
509 if (! FRAME_TERMCAP_P (updating_frame
))
511 (*set_terminal_window_hook
) (size
);
514 specified_window
= size
? size
: FRAME_HEIGHT (XFRAME (selected_frame
));
515 if (!scroll_region_ok
)
517 set_scroll_region (0, specified_window
);
521 set_scroll_region (start
, stop
)
525 struct frame
*sf
= XFRAME (selected_frame
);
527 if (TS_set_scroll_region
)
529 buf
= tparam (TS_set_scroll_region
, 0, 0, start
, stop
- 1);
531 else if (TS_set_scroll_region_1
)
533 buf
= tparam (TS_set_scroll_region_1
, 0, 0,
534 FRAME_HEIGHT (sf
), start
,
535 FRAME_HEIGHT (sf
) - stop
,
540 buf
= tparam (TS_set_window
, 0, 0, start
, 0, stop
, FRAME_WIDTH (sf
));
551 OUTPUT (TS_insert_mode
);
559 OUTPUT (TS_end_insert_mode
);
563 /* Handle highlighting when TN_standout_width (termcap sg) is not specified.
564 In these terminals, output is affected by the value of standout
565 mode when the output is written.
567 These functions are called on all terminals, but do nothing
568 on terminals whose standout mode does not work that way. */
571 turn_off_highlight ()
573 if (TN_standout_width
< 0)
576 OUTPUT_IF (TS_end_standout_mode
);
584 if (TN_standout_width
< 0)
587 OUTPUT_IF (TS_standout_mode
);
593 /* Make cursor invisible. */
598 OUTPUT_IF (TS_cursor_invisible
);
602 /* Ensure that cursor is visible. */
607 OUTPUT_IF (TS_cursor_normal
);
608 OUTPUT_IF (TS_cursor_visible
);
612 /* Set standout mode to the state it should be in for
613 empty space inside windows. What this is,
614 depends on the user option inverse-video. */
617 background_highlight ()
619 if (TN_standout_width
>= 0)
622 turn_on_highlight ();
624 turn_off_highlight ();
627 /* Set standout mode to the mode specified for the text to be output. */
630 highlight_if_desired ()
632 if (TN_standout_width
>= 0)
634 if (!inverse_video
== !standout_requested
)
635 turn_off_highlight ();
637 turn_on_highlight ();
640 /* Handle standout mode for terminals in which TN_standout_width >= 0.
641 On these terminals, standout is controlled by markers that
642 live inside the terminal's memory. TN_standout_width is the width
643 that the marker occupies in memory. Standout runs from the marker
644 to the end of the line on some terminals, or to the next
645 turn-off-standout marker (TS_end_standout_mode) string
646 on other terminals. */
648 /* Write a standout marker or end-standout marker at the front of the line
649 at vertical position vpos. */
652 write_standout_marker (flag
, vpos
)
655 if (flag
|| (TS_end_standout_mode
&& !TF_teleray
&& !se_is_so
656 && !(TF_xs
&& TN_standout_width
== 0)))
659 cmplus (TN_standout_width
);
660 OUTPUT (flag
? TS_standout_mode
: TS_end_standout_mode
);
661 chars_wasted
[curY
] = TN_standout_width
| 0100;
665 /* External interface to control of standout mode.
666 Call this when about to modify line at position VPOS
667 and not change whether it is highlighted. */
670 reassert_line_highlight (highlight
, vpos
)
674 struct frame
*f
= updating_frame
? updating_frame
: XFRAME (selected_frame
);
675 if (! FRAME_TERMCAP_P (f
))
677 (*reassert_line_highlight_hook
) (highlight
, vpos
);
680 if (TN_standout_width
< 0)
681 /* Handle terminals where standout takes affect at output time */
682 standout_requested
= highlight
;
683 else if (chars_wasted
&& chars_wasted
[vpos
] == 0)
684 /* For terminals with standout markers, write one on this line
685 if there isn't one already. */
686 write_standout_marker (highlight
, vpos
);
689 /* Call this when about to modify line at position VPOS
690 and change whether it is highlighted. */
693 change_line_highlight (new_highlight
, vpos
, y
, first_unused_hpos
)
694 int new_highlight
, vpos
, y
, first_unused_hpos
;
696 standout_requested
= new_highlight
;
697 if (! FRAME_TERMCAP_P (updating_frame
))
699 (*change_line_highlight_hook
) (new_highlight
, vpos
, y
, first_unused_hpos
);
705 if (TN_standout_width
< 0)
706 background_highlight ();
707 /* If line starts with a marker, delete the marker */
708 else if (TS_clr_line
&& chars_wasted
[curY
])
711 /* On Teleray, make sure to erase the SO marker. */
714 cmgoto (curY
- 1, FRAME_WIDTH (XFRAME (selected_frame
)) - 4);
716 curY
++; /* ESC S moves to next line where the TS_standout_mode was */
720 cmgoto (curY
, 0); /* reposition to kill standout marker */
722 clear_end_of_line_raw (first_unused_hpos
);
723 reassert_line_highlight (new_highlight
, curY
);
727 /* Move cursor to row/column position VPOS/HPOS. HPOS/VPOS are
728 frame-relative coordinates. */
731 cursor_to (vpos
, hpos
)
734 struct frame
*f
= updating_frame
? updating_frame
: XFRAME (selected_frame
);
736 if (! FRAME_TERMCAP_P (f
) && cursor_to_hook
)
738 (*cursor_to_hook
) (vpos
, hpos
);
742 /* Detect the case where we are called from reset_sys_modes
743 and the costs have never been calculated. Do nothing. */
744 if (chars_wasted
== 0)
747 hpos
+= chars_wasted
[vpos
] & 077;
748 if (curY
== vpos
&& curX
== hpos
)
750 if (!TF_standout_motion
)
751 background_highlight ();
752 if (!TF_insmode_motion
)
757 /* Similar but don't take any account of the wasted characters. */
760 raw_cursor_to (row
, col
)
763 struct frame
*f
= updating_frame
? updating_frame
: XFRAME (selected_frame
);
764 if (! FRAME_TERMCAP_P (f
))
766 (*raw_cursor_to_hook
) (row
, col
);
769 if (curY
== row
&& curX
== col
)
771 if (!TF_standout_motion
)
772 background_highlight ();
773 if (!TF_insmode_motion
)
778 /* Erase operations */
780 /* clear from cursor to end of frame */
786 if (clear_to_end_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
788 (*clear_to_end_hook
) ();
791 if (TS_clr_to_bottom
)
793 background_highlight ();
794 OUTPUT (TS_clr_to_bottom
);
795 bzero (chars_wasted
+ curY
,
796 FRAME_HEIGHT (XFRAME (selected_frame
)) - curY
);
800 for (i
= curY
; i
< FRAME_HEIGHT (XFRAME (selected_frame
)); i
++)
803 clear_end_of_line_raw (FRAME_WIDTH (XFRAME (selected_frame
)));
808 /* Clear entire frame */
813 struct frame
*sf
= XFRAME (selected_frame
);
816 && ! FRAME_TERMCAP_P ((updating_frame
? updating_frame
: sf
)))
818 (*clear_frame_hook
) ();
823 background_highlight ();
824 OUTPUT (TS_clr_frame
);
825 bzero (chars_wasted
, FRAME_HEIGHT (sf
));
835 /* Clear to end of line, but do not clear any standout marker.
836 Assumes that the cursor is positioned at a character of real text,
837 which implies it cannot be before a standout marker
838 unless the marker has zero width.
840 Note that the cursor may be moved. */
843 clear_end_of_line (first_unused_hpos
)
844 int first_unused_hpos
;
846 if (FRAME_TERMCAP_P (XFRAME (selected_frame
))
848 && TN_standout_width
== 0 && curX
== 0 && chars_wasted
[curY
] != 0)
849 write_glyphs (&space_glyph
, 1);
850 clear_end_of_line_raw (first_unused_hpos
);
853 /* Clear from cursor to end of line.
854 Assume that the line is already clear starting at column first_unused_hpos.
855 If the cursor is at a standout marker, erase the marker.
857 Note that the cursor may be moved, on terminals lacking a `ce' string. */
860 clear_end_of_line_raw (first_unused_hpos
)
861 int first_unused_hpos
;
865 if (clear_end_of_line_hook
866 && ! FRAME_TERMCAP_P ((updating_frame
868 : XFRAME (selected_frame
))))
870 (*clear_end_of_line_hook
) (first_unused_hpos
);
874 /* Detect the case where we are called from reset_sys_modes
875 and the costs have never been calculated. Do nothing. */
876 if (chars_wasted
== 0)
879 first_unused_hpos
+= chars_wasted
[curY
] & 077;
880 if (curX
>= first_unused_hpos
)
882 /* Notice if we are erasing a magic cookie */
884 chars_wasted
[curY
] = 0;
885 background_highlight ();
888 OUTPUT1 (TS_clr_line
);
891 { /* have to do it the hard way */
892 struct frame
*sf
= XFRAME (selected_frame
);
895 /* Do not write in last row last col with Auto-wrap on. */
896 if (AutoWrap
&& curY
== FRAME_HEIGHT (sf
) - 1
897 && first_unused_hpos
== FRAME_WIDTH (sf
))
900 for (i
= curX
; i
< first_unused_hpos
; i
++)
903 fputc (' ', termscript
);
906 cmplus (first_unused_hpos
- curX
);
910 /* Encode SRC_LEN glyphs starting at SRC to terminal output codes and
911 store them at DST. Do not write more than DST_LEN bytes. That may
912 require stopping before all SRC_LEN input glyphs have been
915 We store the number of glyphs actually converted in *CONSUMED. The
916 return value is the number of bytes store in DST. */
919 encode_terminal_code (src
, dst
, src_len
, dst_len
, consumed
)
923 int dst_len
, *consumed
;
925 struct glyph
*src_start
= src
, *src_end
= src
+ src_len
;
926 unsigned char *dst_start
= dst
, *dst_end
= dst
+ dst_len
;
929 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *buf
;
931 register int tlen
= GLYPH_TABLE_LENGTH
;
932 register Lisp_Object
*tbase
= GLYPH_TABLE_BASE
;
934 struct coding_system
*coding
;
936 coding
= (CODING_REQUIRE_ENCODING (&terminal_coding
)
938 : &safe_terminal_coding
);
940 while (src
< src_end
)
942 /* We must skip glyphs to be padded for a wide character. */
943 if (! CHAR_GLYPH_PADDING_P (*src
))
945 g
= GLYPH_FROM_CHAR_GLYPH (src
[0]);
947 if (g
< 0 || g
>= tlen
)
949 /* This glyph doesn't has an entry in Vglyph_table. */
950 if (! CHAR_VALID_P (src
->u
.ch
, 0))
957 len
= CHAR_STRING (src
->u
.ch
, workbuf
);
963 /* This glyph has an entry in Vglyph_table,
964 so process any alias before testing for simpleness. */
965 GLYPH_FOLLOW_ALIASES (tbase
, tlen
, g
);
967 if (GLYPH_SIMPLE_P (tbase
, tlen
, g
))
969 /* We set the multi-byte form of a character in G
970 (that should be an ASCII character) at
972 workbuf
[0] = FAST_GLYPH_CHAR (g
);
978 /* We have a string in Vglyph_table. */
979 len
= GLYPH_LENGTH (tbase
, g
);
980 buf
= GLYPH_STRING (tbase
, g
);
984 result
= encode_coding (coding
, buf
, dst
, len
, dst_end
- dst
);
985 len
-= coding
->consumed
;
986 dst
+= coding
->produced
;
987 if (result
== CODING_FINISH_INSUFFICIENT_DST
988 || (result
== CODING_FINISH_INSUFFICIENT_SRC
989 && len
> dst_end
- dst
))
990 /* The remaining output buffer is too short. We must
991 break the loop here without increasing SRC so that the
992 next call of this function starts from the same glyph. */
997 /* This is the case that a code of the range 0200..0237
998 exists in buf. We must just write out such a code. */
999 buf
+= coding
->consumed
;
1007 *consumed
= src
- src_start
;
1008 return (dst
- dst_start
);
1013 write_glyphs (string
, len
)
1014 register struct glyph
*string
;
1017 int produced
, consumed
;
1018 struct frame
*sf
= XFRAME (selected_frame
);
1019 struct frame
*f
= updating_frame
? updating_frame
: sf
;
1021 if (write_glyphs_hook
1022 && ! FRAME_TERMCAP_P (f
))
1024 (*write_glyphs_hook
) (string
, len
);
1028 highlight_if_desired ();
1031 /* Don't dare write in last column of bottom line, if Auto-Wrap,
1032 since that would scroll the whole frame on some terminals. */
1035 && curY
+ 1 == FRAME_HEIGHT (sf
)
1036 && (curX
+ len
- (chars_wasted
[curY
] & 077) == FRAME_WIDTH (sf
)))
1043 /* The mode bit CODING_MODE_LAST_BLOCK should be set to 1 only at
1045 terminal_coding
.mode
&= ~CODING_MODE_LAST_BLOCK
;
1049 /* Identify a run of glyphs with the same face. */
1050 int face_id
= string
->face_id
;
1053 for (n
= 1; n
< len
; ++n
)
1054 if (string
[n
].face_id
!= face_id
)
1057 /* Turn appearance modes of the face of the run on. */
1058 turn_on_face (f
, face_id
);
1062 /* We use a shared conversion buffer of the current size
1063 (1024 bytes at least). Usually it is sufficient, but if
1064 not, we just repeat the loop. */
1065 produced
= encode_terminal_code (string
, conversion_buffer
,
1066 n
, conversion_buffer_size
,
1070 fwrite (conversion_buffer
, 1, produced
, stdout
);
1071 if (ferror (stdout
))
1074 fwrite (conversion_buffer
, 1, produced
, termscript
);
1081 /* Turn appearance modes off. */
1082 turn_off_face (f
, face_id
);
1085 /* We may have to output some codes to terminate the writing. */
1086 if (CODING_REQUIRE_FLUSHING (&terminal_coding
))
1088 terminal_coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1089 encode_coding (&terminal_coding
, "", conversion_buffer
,
1090 0, conversion_buffer_size
);
1091 if (terminal_coding
.produced
> 0)
1093 fwrite (conversion_buffer
, 1, terminal_coding
.produced
, stdout
);
1094 if (ferror (stdout
))
1097 fwrite (conversion_buffer
, 1, terminal_coding
.produced
,
1105 /* If start is zero, insert blanks instead of a string at start */
1108 insert_glyphs (start
, len
)
1109 register struct glyph
*start
;
1113 struct glyph
*glyph
;
1114 struct frame
*f
, *sf
;
1119 if (insert_glyphs_hook
)
1121 (*insert_glyphs_hook
) (start
, len
);
1125 sf
= XFRAME (selected_frame
);
1126 f
= updating_frame
? updating_frame
: sf
;
1127 highlight_if_desired ();
1129 if (TS_ins_multi_chars
)
1131 buf
= tparam (TS_ins_multi_chars
, 0, 0, len
);
1135 write_glyphs (start
, len
);
1141 /* The bit CODING_MODE_LAST_BLOCK should be set to 1 only at the tail. */
1142 terminal_coding
.mode
&= ~CODING_MODE_LAST_BLOCK
;
1145 int produced
, consumed
;
1147 OUTPUT1_IF (TS_ins_char
);
1150 conversion_buffer
[0] = SPACEGLYPH
;
1155 turn_on_face (f
, start
->face_id
);
1158 /* We must open sufficient space for a character which
1159 occupies more than one column. */
1160 while (len
&& CHAR_GLYPH_PADDING_P (*start
))
1162 OUTPUT1_IF (TS_ins_char
);
1167 /* This is the last glyph. */
1168 terminal_coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1170 /* We use shared conversion buffer of the current size (1024
1171 bytes at least). It is surely sufficient for just one glyph. */
1172 produced
= encode_terminal_code (glyph
, conversion_buffer
, 1,
1173 conversion_buffer_size
, &consumed
);
1178 fwrite (conversion_buffer
, 1, produced
, stdout
);
1179 if (ferror (stdout
))
1182 fwrite (conversion_buffer
, 1, produced
, termscript
);
1185 OUTPUT1_IF (TS_pad_inserted_char
);
1187 turn_off_face (f
, glyph
->face_id
);
1200 if (delete_glyphs_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
1202 (*delete_glyphs_hook
) (n
);
1206 if (delete_in_insert_mode
)
1213 OUTPUT_IF (TS_delete_mode
);
1216 if (TS_del_multi_chars
)
1218 buf
= tparam (TS_del_multi_chars
, 0, 0, n
);
1223 for (i
= 0; i
< n
; i
++)
1224 OUTPUT1 (TS_del_char
);
1225 if (!delete_in_insert_mode
)
1226 OUTPUT_IF (TS_end_delete_mode
);
1229 /* Insert N lines at vpos VPOS. If N is negative, delete -N lines. */
1232 ins_del_lines (vpos
, n
)
1235 char *multi
= n
> 0 ? TS_ins_multi_lines
: TS_del_multi_lines
;
1236 char *single
= n
> 0 ? TS_ins_line
: TS_del_line
;
1237 char *scroll
= n
> 0 ? TS_rev_scroll
: TS_fwd_scroll
;
1240 register int i
= n
> 0 ? n
: -n
;
1243 if (ins_del_lines_hook
&& ! FRAME_TERMCAP_P (updating_frame
))
1245 (*ins_del_lines_hook
) (vpos
, n
);
1249 sf
= XFRAME (selected_frame
);
1251 /* If the lines below the insertion are being pushed
1252 into the end of the window, this is the same as clearing;
1253 and we know the lines are already clear, since the matching
1254 deletion has already been done. So can ignore this. */
1255 /* If the lines below the deletion are blank lines coming
1256 out of the end of the window, don't bother,
1257 as there will be a matching inslines later that will flush them. */
1258 if (scroll_region_ok
&& vpos
+ i
>= specified_window
)
1260 if (!memory_below_frame
&& vpos
+ i
>= FRAME_HEIGHT (sf
))
1265 raw_cursor_to (vpos
, 0);
1266 background_highlight ();
1267 buf
= tparam (multi
, 0, 0, i
);
1273 raw_cursor_to (vpos
, 0);
1274 background_highlight ();
1282 set_scroll_region (vpos
, specified_window
);
1284 raw_cursor_to (specified_window
- 1, 0);
1286 raw_cursor_to (vpos
, 0);
1287 background_highlight ();
1289 OUTPUTL (scroll
, specified_window
- vpos
);
1290 set_scroll_region (0, specified_window
);
1293 if (TN_standout_width
>= 0)
1295 register int lower_limit
1298 : FRAME_HEIGHT (sf
));
1302 bcopy (&chars_wasted
[vpos
- n
], &chars_wasted
[vpos
],
1303 lower_limit
- vpos
+ n
);
1304 bzero (&chars_wasted
[lower_limit
+ n
], - n
);
1308 bcopy (&chars_wasted
[vpos
], ©buf
[vpos
], lower_limit
- vpos
- n
);
1309 bcopy (©buf
[vpos
], &chars_wasted
[vpos
+ n
],
1310 lower_limit
- vpos
- n
);
1311 bzero (&chars_wasted
[vpos
], n
);
1314 if (!scroll_region_ok
&& memory_below_frame
&& n
< 0)
1316 cursor_to (FRAME_HEIGHT (sf
) + n
, 0);
1321 /* Compute cost of sending "str", in characters,
1322 not counting any line-dependent padding. */
1330 tputs (str
, 0, evalcost
);
1334 /* Compute cost of sending "str", in characters,
1335 counting any line-dependent padding at one line. */
1338 string_cost_one_line (str
)
1343 tputs (str
, 1, evalcost
);
1347 /* Compute per line amount of line-dependent padding,
1348 in tenths of characters. */
1356 tputs (str
, 0, evalcost
);
1359 tputs (str
, 10, evalcost
);
1364 /* char_ins_del_cost[n] is cost of inserting N characters.
1365 char_ins_del_cost[-n] is cost of deleting N characters.
1366 The length of this vector is based on max_frame_width. */
1368 int *char_ins_del_vector
;
1370 #define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_WIDTH ((f))])
1375 calculate_ins_del_char_costs (frame
)
1378 int ins_startup_cost
, del_startup_cost
;
1379 int ins_cost_per_char
, del_cost_per_char
;
1383 if (TS_ins_multi_chars
)
1385 ins_cost_per_char
= 0;
1386 ins_startup_cost
= string_cost_one_line (TS_ins_multi_chars
);
1388 else if (TS_ins_char
|| TS_pad_inserted_char
1389 || (TS_insert_mode
&& TS_end_insert_mode
))
1391 ins_startup_cost
= (30 * (string_cost (TS_insert_mode
)
1392 + string_cost (TS_end_insert_mode
))) / 100;
1393 ins_cost_per_char
= (string_cost_one_line (TS_ins_char
)
1394 + string_cost_one_line (TS_pad_inserted_char
));
1398 ins_startup_cost
= 9999;
1399 ins_cost_per_char
= 0;
1402 if (TS_del_multi_chars
)
1404 del_cost_per_char
= 0;
1405 del_startup_cost
= string_cost_one_line (TS_del_multi_chars
);
1407 else if (TS_del_char
)
1409 del_startup_cost
= (string_cost (TS_delete_mode
)
1410 + string_cost (TS_end_delete_mode
));
1411 if (delete_in_insert_mode
)
1412 del_startup_cost
/= 2;
1413 del_cost_per_char
= string_cost_one_line (TS_del_char
);
1417 del_startup_cost
= 9999;
1418 del_cost_per_char
= 0;
1421 /* Delete costs are at negative offsets */
1422 p
= &char_ins_del_cost (frame
)[0];
1423 for (i
= FRAME_WIDTH (frame
); --i
>= 0;)
1424 *--p
= (del_startup_cost
+= del_cost_per_char
);
1426 /* Doing nothing is free */
1427 p
= &char_ins_del_cost (frame
)[0];
1430 /* Insert costs are at positive offsets */
1431 for (i
= FRAME_WIDTH (frame
); --i
>= 0;)
1432 *p
++ = (ins_startup_cost
+= ins_cost_per_char
);
1436 calculate_costs (frame
)
1439 register char *f
= (TS_set_scroll_region
1440 ? TS_set_scroll_region
1441 : TS_set_scroll_region_1
);
1443 FRAME_COST_BAUD_RATE (frame
) = baud_rate
;
1445 scroll_region_cost
= string_cost (f
);
1446 #ifdef HAVE_X_WINDOWS
1447 if (FRAME_X_P (frame
))
1449 do_line_insertion_deletion_costs (frame
, 0, ".5*", 0, ".5*",
1451 x_screen_planes (frame
));
1452 scroll_region_cost
= 0;
1457 /* These variables are only used for terminal stuff. They are allocated
1458 once for the terminal frame of X-windows emacs, but not used afterwards.
1460 char_ins_del_vector (i.e., char_ins_del_cost) isn't used because
1461 X turns off char_ins_del_ok.
1463 chars_wasted and copybuf are only used here in term.c in cases where
1464 the term hook isn't called. */
1466 max_frame_height
= max (max_frame_height
, FRAME_HEIGHT (frame
));
1467 max_frame_width
= max (max_frame_width
, FRAME_WIDTH (frame
));
1469 if (chars_wasted
!= 0)
1470 chars_wasted
= (char *) xrealloc (chars_wasted
, max_frame_height
);
1472 chars_wasted
= (char *) xmalloc (max_frame_height
);
1475 copybuf
= (char *) xrealloc (copybuf
, max_frame_height
);
1477 copybuf
= (char *) xmalloc (max_frame_height
);
1479 if (char_ins_del_vector
!= 0)
1481 = (int *) xrealloc (char_ins_del_vector
,
1483 + 2 * max_frame_width
* sizeof (int)));
1486 = (int *) xmalloc (sizeof (int)
1487 + 2 * max_frame_width
* sizeof (int));
1489 bzero (chars_wasted
, max_frame_height
);
1490 bzero (copybuf
, max_frame_height
);
1491 bzero (char_ins_del_vector
, (sizeof (int)
1492 + 2 * max_frame_width
* sizeof (int)));
1494 if (f
&& (!TS_ins_line
&& !TS_del_line
))
1495 do_line_insertion_deletion_costs (frame
,
1496 TS_rev_scroll
, TS_ins_multi_lines
,
1497 TS_fwd_scroll
, TS_del_multi_lines
,
1500 do_line_insertion_deletion_costs (frame
,
1501 TS_ins_line
, TS_ins_multi_lines
,
1502 TS_del_line
, TS_del_multi_lines
,
1505 calculate_ins_del_char_costs (frame
);
1507 /* Don't use TS_repeat if its padding is worse than sending the chars */
1508 if (TS_repeat
&& per_line_cost (TS_repeat
) * baud_rate
< 9000)
1509 RPov
= string_cost (TS_repeat
);
1511 RPov
= FRAME_WIDTH (frame
) * 2;
1513 cmcostinit (); /* set up cursor motion costs */
1520 /* Termcap capability names that correspond directly to X keysyms.
1521 Some of these (marked "terminfo") aren't supplied by old-style
1522 (Berkeley) termcap entries. They're listed in X keysym order;
1523 except we put the keypad keys first, so that if they clash with
1524 other keys (as on the IBM PC keyboard) they get overridden.
1527 static struct fkey_table keys
[] =
1529 "kh", "home", /* termcap */
1530 "kl", "left", /* termcap */
1531 "ku", "up", /* termcap */
1532 "kr", "right", /* termcap */
1533 "kd", "down", /* termcap */
1534 "%8", "prior", /* terminfo */
1535 "%5", "next", /* terminfo */
1536 "@7", "end", /* terminfo */
1537 "@1", "begin", /* terminfo */
1538 "*6", "select", /* terminfo */
1539 "%9", "print", /* terminfo */
1540 "@4", "execute", /* terminfo --- actually the `command' key */
1542 * "insert" --- see below
1544 "&8", "undo", /* terminfo */
1545 "%0", "redo", /* terminfo */
1546 "%7", "menu", /* terminfo --- actually the `options' key */
1547 "@0", "find", /* terminfo */
1548 "@2", "cancel", /* terminfo */
1549 "%1", "help", /* terminfo */
1551 * "break" goes here, but can't be reliably intercepted with termcap
1553 "&4", "reset", /* terminfo --- actually `restart' */
1555 * "system" and "user" --- no termcaps
1557 "kE", "clearline", /* terminfo */
1558 "kA", "insertline", /* terminfo */
1559 "kL", "deleteline", /* terminfo */
1560 "kI", "insertchar", /* terminfo */
1561 "kD", "deletechar", /* terminfo */
1562 "kB", "backtab", /* terminfo */
1564 * "kp_backtab", "kp-space", "kp-tab" --- no termcaps
1566 "@8", "kp-enter", /* terminfo */
1568 * "kp-f1", "kp-f2", "kp-f3" "kp-f4",
1569 * "kp-multiply", "kp-add", "kp-separator",
1570 * "kp-subtract", "kp-decimal", "kp-divide", "kp-0";
1571 * --- no termcaps for any of these.
1573 "K4", "kp-1", /* terminfo */
1575 * "kp-2" --- no termcap
1577 "K5", "kp-3", /* terminfo */
1579 * "kp-4" --- no termcap
1581 "K2", "kp-5", /* terminfo */
1583 * "kp-6" --- no termcap
1585 "K1", "kp-7", /* terminfo */
1587 * "kp-8" --- no termcap
1589 "K3", "kp-9", /* terminfo */
1591 * "kp-equal" --- no termcap
1604 static char **term_get_fkeys_arg
;
1605 static Lisp_Object
term_get_fkeys_1 ();
1607 /* Find the escape codes sent by the function keys for Vfunction_key_map.
1608 This function scans the termcap function key sequence entries, and
1609 adds entries to Vfunction_key_map for each function key it finds. */
1612 term_get_fkeys (address
)
1615 /* We run the body of the function (term_get_fkeys_1) and ignore all Lisp
1616 errors during the call. The only errors should be from Fdefine_key
1617 when given a key sequence containing an invalid prefix key. If the
1618 termcap defines function keys which use a prefix that is already bound
1619 to a command by the default bindings, we should silently ignore that
1620 function key specification, rather than giving the user an error and
1621 refusing to run at all on such a terminal. */
1623 extern Lisp_Object
Fidentity ();
1624 term_get_fkeys_arg
= address
;
1625 internal_condition_case (term_get_fkeys_1
, Qerror
, Fidentity
);
1633 char **address
= term_get_fkeys_arg
;
1635 /* This can happen if CANNOT_DUMP or with strange options. */
1637 Vfunction_key_map
= Fmake_sparse_keymap (Qnil
);
1639 for (i
= 0; i
< (sizeof (keys
)/sizeof (keys
[0])); i
++)
1641 char *sequence
= tgetstr (keys
[i
].cap
, address
);
1643 Fdefine_key (Vfunction_key_map
, build_string (sequence
),
1644 Fmake_vector (make_number (1),
1645 intern (keys
[i
].name
)));
1648 /* The uses of the "k0" capability are inconsistent; sometimes it
1649 describes F10, whereas othertimes it describes F0 and "k;" describes F10.
1650 We will attempt to politely accommodate both systems by testing for
1651 "k;", and if it is present, assuming that "k0" denotes F0, otherwise F10.
1654 char *k_semi
= tgetstr ("k;", address
);
1655 char *k0
= tgetstr ("k0", address
);
1656 char *k0_name
= "f10";
1660 Fdefine_key (Vfunction_key_map
, build_string (k_semi
),
1661 Fmake_vector (make_number (1), intern ("f10")));
1666 Fdefine_key (Vfunction_key_map
, build_string (k0
),
1667 Fmake_vector (make_number (1), intern (k0_name
)));
1670 /* Set up cookies for numbered function keys above f10. */
1672 char fcap
[3], fkey
[4];
1674 fcap
[0] = 'F'; fcap
[2] = '\0';
1675 for (i
= 11; i
< 64; i
++)
1678 fcap
[1] = '1' + i
- 11;
1680 fcap
[1] = 'A' + i
- 20;
1682 fcap
[1] = 'a' + i
- 46;
1685 char *sequence
= tgetstr (fcap
, address
);
1688 sprintf (fkey
, "f%d", i
);
1689 Fdefine_key (Vfunction_key_map
, build_string (sequence
),
1690 Fmake_vector (make_number (1),
1698 * Various mappings to try and get a better fit.
1701 #define CONDITIONAL_REASSIGN(cap1, cap2, sym) \
1702 if (!tgetstr (cap1, address)) \
1704 char *sequence = tgetstr (cap2, address); \
1706 Fdefine_key (Vfunction_key_map, build_string (sequence), \
1707 Fmake_vector (make_number (1), \
1711 /* if there's no key_next keycap, map key_npage to `next' keysym */
1712 CONDITIONAL_REASSIGN ("%5", "kN", "next");
1713 /* if there's no key_prev keycap, map key_ppage to `previous' keysym */
1714 CONDITIONAL_REASSIGN ("%8", "kP", "prior");
1715 /* if there's no key_dc keycap, map key_ic to `insert' keysym */
1716 CONDITIONAL_REASSIGN ("kD", "kI", "insert");
1717 /* if there's no key_end keycap, map key_ll to 'end' keysym */
1718 CONDITIONAL_REASSIGN ("@7", "kH", "end");
1720 /* IBM has their own non-standard dialect of terminfo.
1721 If the standard name isn't found, try the IBM name. */
1722 CONDITIONAL_REASSIGN ("kB", "KO", "backtab");
1723 CONDITIONAL_REASSIGN ("@4", "kJ", "execute"); /* actually "action" */
1724 CONDITIONAL_REASSIGN ("@4", "kc", "execute"); /* actually "command" */
1725 CONDITIONAL_REASSIGN ("%7", "ki", "menu");
1726 CONDITIONAL_REASSIGN ("@7", "kw", "end");
1727 CONDITIONAL_REASSIGN ("F1", "k<", "f11");
1728 CONDITIONAL_REASSIGN ("F2", "k>", "f12");
1729 CONDITIONAL_REASSIGN ("%1", "kq", "help");
1730 CONDITIONAL_REASSIGN ("*6", "kU", "select");
1731 #undef CONDITIONAL_REASSIGN
1738 /***********************************************************************
1739 Character Display Information
1740 ***********************************************************************/
1742 static void append_glyph
P_ ((struct it
*));
1745 /* Append glyphs to IT's glyph_row. Called from produce_glyphs for
1746 terminal frames if IT->glyph_row != NULL. IT->c is the character
1747 for which to produce glyphs; IT->face_id contains the character's
1748 face. Padding glyphs are appended if IT->c has a IT->pixel_width >
1755 struct glyph
*glyph
, *end
;
1758 xassert (it
->glyph_row
);
1759 glyph
= (it
->glyph_row
->glyphs
[it
->area
]
1760 + it
->glyph_row
->used
[it
->area
]);
1761 end
= it
->glyph_row
->glyphs
[1 + it
->area
];
1764 i
< it
->pixel_width
&& glyph
< end
;
1767 glyph
->type
= CHAR_GLYPH
;
1768 glyph
->pixel_width
= 1;
1769 glyph
->u
.ch
= it
->c
;
1770 glyph
->face_id
= it
->face_id
;
1771 glyph
->padding_p
= i
> 0;
1772 glyph
->charpos
= CHARPOS (it
->position
);
1773 glyph
->object
= it
->object
;
1775 ++it
->glyph_row
->used
[it
->area
];
1781 /* Produce glyphs for the display element described by IT. The
1782 function fills output fields of IT with pixel information like the
1783 pixel width and height of a character, and maybe produces glyphs at
1784 the same time if IT->glyph_row is non-null. See the explanation of
1785 struct display_iterator in dispextern.h for an overview. */
1791 /* If a hook is installed, let it do the work. */
1792 xassert (it
->what
== IT_CHARACTER
1793 || it
->what
== IT_COMPOSITION
1794 || it
->what
== IT_IMAGE
1795 || it
->what
== IT_STRETCH
);
1797 /* Nothing but characters are supported on terminal frames. For a
1798 composition sequence, it->c is the first character of the
1800 xassert (it
->what
== IT_CHARACTER
1801 || it
->what
== IT_COMPOSITION
);
1803 if (it
->c
>= 040 && it
->c
< 0177)
1805 it
->pixel_width
= it
->nglyphs
= 1;
1809 else if (it
->c
== '\n')
1810 it
->pixel_width
= it
->nglyphs
= 0;
1811 else if (it
->c
== '\t')
1813 int absolute_x
= (it
->current_x
- it
->prompt_width
1814 + it
->continuation_lines_width
);
1816 = (((1 + absolute_x
+ it
->tab_width
- 1)
1821 /* If part of the TAB has been displayed on the previous line
1822 which is continued now, continuation_lines_width will have
1823 been incremented already by the part that fitted on the
1824 continued line. So, we will get the right number of spaces
1826 nspaces
= next_tab_x
- absolute_x
;
1833 it
->pixel_width
= it
->len
= 1;
1841 it
->pixel_width
= nspaces
;
1842 it
->nglyphs
= nspaces
;
1846 /* A multi-byte character. The display width is fixed for all
1847 characters of the set. Some of the glyphs may have to be
1848 ignored because they are already displayed in a continued
1850 int charset
= CHAR_CHARSET (it
->c
);
1852 it
->pixel_width
= CHARSET_WIDTH (charset
);
1853 it
->nglyphs
= it
->pixel_width
;
1859 /* Advance current_x by the pixel width as a convenience for
1861 if (it
->area
== TEXT_AREA
)
1862 it
->current_x
+= it
->pixel_width
;
1863 it
->ascent
= it
->max_ascent
= it
->phys_ascent
= it
->max_phys_ascent
= 0;
1864 it
->descent
= it
->max_descent
= it
->phys_descent
= it
->max_phys_descent
= 1;
1868 /* Get information about special display element WHAT in an
1869 environment described by IT. WHAT is one of IT_TRUNCATION or
1870 IT_CONTINUATION. Maybe produce glyphs for WHAT if IT has a
1871 non-null glyph_row member. This function ensures that fields like
1872 face_id, c, len of IT are left untouched. */
1875 produce_special_glyphs (it
, what
)
1877 enum display_element_type what
;
1883 temp_it
.what
= IT_CHARACTER
;
1886 bzero (&temp_it
.current
, sizeof temp_it
.current
);
1888 if (what
== IT_CONTINUATION
)
1890 /* Continuation glyph. */
1892 && INTEGERP (DISP_CONTINUE_GLYPH (it
->dp
))
1893 && GLYPH_CHAR_VALID_P (XINT (DISP_CONTINUE_GLYPH (it
->dp
))))
1895 temp_it
.c
= FAST_GLYPH_CHAR (XINT (DISP_CONTINUE_GLYPH (it
->dp
)));
1896 temp_it
.len
= CHAR_LEN (temp_it
.c
);
1901 produce_glyphs (&temp_it
);
1902 it
->pixel_width
= temp_it
.pixel_width
;
1903 it
->nglyphs
= temp_it
.pixel_width
;
1905 else if (what
== IT_TRUNCATION
)
1907 /* Truncation glyph. */
1909 && INTEGERP (DISP_TRUNC_GLYPH (it
->dp
))
1910 && GLYPH_CHAR_VALID_P (XINT (DISP_TRUNC_GLYPH (it
->dp
))))
1912 temp_it
.c
= FAST_GLYPH_CHAR (XINT (DISP_TRUNC_GLYPH (it
->dp
)));
1913 temp_it
.len
= CHAR_LEN (temp_it
.c
);
1918 produce_glyphs (&temp_it
);
1919 it
->pixel_width
= temp_it
.pixel_width
;
1920 it
->nglyphs
= temp_it
.pixel_width
;
1927 /* Return an estimation of the pixel height of mode or top lines on
1928 frame F. FACE_ID specifies what line's height to estimate. */
1931 estimate_mode_line_height (f
, face_id
)
1933 enum face_id face_id
;
1935 if (estimate_mode_line_height_hook
)
1936 return estimate_mode_line_height_hook (f
, face_id
);
1943 /***********************************************************************
1945 ***********************************************************************/
1948 /* Turn appearances of face FACE_ID on tty frame F on. */
1951 turn_on_face (f
, face_id
)
1955 struct face
*face
= FACE_FROM_ID (f
, face_id
);
1957 xassert (face
!= NULL
);
1959 if (face
->tty_bold_p
)
1960 OUTPUT1_IF (TS_enter_bold_mode
);
1961 else if (face
->tty_dim_p
)
1962 OUTPUT1_IF (TS_enter_dim_mode
);
1964 /* Alternate charset and blinking not yet used. */
1965 if (face
->tty_alt_charset_p
)
1966 OUTPUT1_IF (TS_enter_alt_charset_mode
);
1968 if (face
->tty_blinking_p
)
1969 OUTPUT1_IF (TS_enter_blink_mode
);
1971 if (face
->tty_underline_p
1972 /* Don't underline if that's difficult. */
1973 && TN_magic_cookie_glitch_ul
<= 0)
1974 OUTPUT1_IF (TS_enter_underline_mode
);
1976 if (face
->tty_reverse_p
1977 || face
->foreground
== FACE_TTY_DEFAULT_BG_COLOR
1978 || face
->background
== FACE_TTY_DEFAULT_FG_COLOR
)
1979 OUTPUT1_IF (TS_enter_reverse_mode
);
1981 if (TN_max_colors
> 0)
1985 if (face
->foreground
!= FACE_TTY_DEFAULT_COLOR
1986 && face
->foreground
!= FACE_TTY_DEFAULT_FG_COLOR
1987 && face
->foreground
!= FACE_TTY_DEFAULT_BG_COLOR
1988 && TS_set_foreground
)
1990 p
= tparam (TS_set_foreground
, NULL
, 0, (int) face
->foreground
);
1995 if (face
->background
!= FACE_TTY_DEFAULT_COLOR
1996 && face
->background
!= FACE_TTY_DEFAULT_BG_COLOR
1997 && face
->background
!= FACE_TTY_DEFAULT_FG_COLOR
1998 && TS_set_background
)
2000 p
= tparam (TS_set_background
, NULL
, 0, (int) face
->background
);
2008 /* Turn off appearances of face FACE_ID on tty frame F. */
2011 turn_off_face (f
, face_id
)
2015 struct face
*face
= FACE_FROM_ID (f
, face_id
);
2017 xassert (face
!= NULL
);
2019 if (TS_exit_attribute_mode
)
2021 /* Capability "me" will turn off appearance modes double-bright,
2022 half-bright, reverse-video, standout, underline. It may or
2023 may not turn off alt-char-mode. */
2024 if (face
->tty_bold_p
2026 || face
->tty_reverse_p
2027 || face
->tty_alt_charset_p
2028 || face
->tty_blinking_p
2029 || face
->tty_underline_p
)
2030 OUTPUT1_IF (TS_exit_attribute_mode
);
2032 if (face
->tty_alt_charset_p
)
2033 OUTPUT_IF (TS_exit_alt_charset_mode
);
2037 /* If we don't have "me" we can only have those appearances
2038 that have exit sequences defined. */
2039 if (face
->tty_alt_charset_p
)
2040 OUTPUT_IF (TS_exit_alt_charset_mode
);
2042 if (face
->tty_underline_p
2043 /* We don't underline if that's difficult. */
2044 && TN_magic_cookie_glitch_ul
<= 0)
2045 OUTPUT_IF (TS_exit_underline_mode
);
2048 /* Switch back to default colors. */
2049 if (TN_max_colors
> 0
2050 && ((face
->foreground
!= FACE_TTY_DEFAULT_COLOR
2051 && face
->foreground
!= FACE_TTY_DEFAULT_FG_COLOR
)
2052 || (face
->background
!= FACE_TTY_DEFAULT_COLOR
2053 && face
->background
!= FACE_TTY_DEFAULT_BG_COLOR
)))
2054 OUTPUT1_IF (TS_orig_pair
);
2058 /* Return non-zero if the terminal is capable to display colors. */
2060 DEFUN ("tty-display-color-p", Ftty_display_color_p
, Stty_display_color_p
,
2062 "Return non-nil if TTY can display colors on FRAME.")
2066 return TN_max_colors
> 0 ? Qt
: Qnil
;
2072 /***********************************************************************
2074 ***********************************************************************/
2077 term_init (terminal_type
)
2078 char *terminal_type
;
2081 char **address
= &area
;
2085 struct frame
*sf
= XFRAME (selected_frame
);
2088 initialize_w32_display ();
2092 area
= (char *) xmalloc (2044);
2097 FrameRows
= FRAME_HEIGHT (sf
);
2098 FrameCols
= FRAME_WIDTH (sf
);
2099 specified_window
= FRAME_HEIGHT (sf
);
2101 delete_in_insert_mode
= 1;
2104 scroll_region_ok
= 0;
2106 /* Seems to insert lines when it's not supposed to, messing
2107 up the display. In doing a trace, it didn't seem to be
2108 called much, so I don't think we're losing anything by
2111 line_ins_del_ok
= 0;
2112 char_ins_del_ok
= 1;
2116 FRAME_CAN_HAVE_SCROLL_BARS (sf
) = 0;
2117 FRAME_VERTICAL_SCROLL_BAR_TYPE (sf
) = vertical_scroll_bar_none
;
2120 #else /* not WINDOWSNT */
2124 status
= tgetent (buffer
, terminal_type
);
2128 fatal ("Cannot open terminfo database file");
2130 fatal ("Cannot open termcap database file");
2136 fatal ("Terminal type %s is not defined.\n\
2137 If that is not the actual type of terminal you have,\n\
2138 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
2139 `setenv TERM ...') to specify the correct type. It may be necessary\n\
2140 to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.",
2143 fatal ("Terminal type %s is not defined.\n\
2144 If that is not the actual type of terminal you have,\n\
2145 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
2146 `setenv TERM ...') to specify the correct type. It may be necessary\n\
2147 to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
2152 area
= (char *) xmalloc (2044);
2154 area
= (char *) xmalloc (strlen (buffer
));
2155 #endif /* not TERMINFO */
2159 TS_ins_line
= tgetstr ("al", address
);
2160 TS_ins_multi_lines
= tgetstr ("AL", address
);
2161 TS_bell
= tgetstr ("bl", address
);
2162 BackTab
= tgetstr ("bt", address
);
2163 TS_clr_to_bottom
= tgetstr ("cd", address
);
2164 TS_clr_line
= tgetstr ("ce", address
);
2165 TS_clr_frame
= tgetstr ("cl", address
);
2166 ColPosition
= tgetstr ("ch", address
);
2167 AbsPosition
= tgetstr ("cm", address
);
2168 CR
= tgetstr ("cr", address
);
2169 TS_set_scroll_region
= tgetstr ("cs", address
);
2170 TS_set_scroll_region_1
= tgetstr ("cS", address
);
2171 RowPosition
= tgetstr ("cv", address
);
2172 TS_del_char
= tgetstr ("dc", address
);
2173 TS_del_multi_chars
= tgetstr ("DC", address
);
2174 TS_del_line
= tgetstr ("dl", address
);
2175 TS_del_multi_lines
= tgetstr ("DL", address
);
2176 TS_delete_mode
= tgetstr ("dm", address
);
2177 TS_end_delete_mode
= tgetstr ("ed", address
);
2178 TS_end_insert_mode
= tgetstr ("ei", address
);
2179 Home
= tgetstr ("ho", address
);
2180 TS_ins_char
= tgetstr ("ic", address
);
2181 TS_ins_multi_chars
= tgetstr ("IC", address
);
2182 TS_insert_mode
= tgetstr ("im", address
);
2183 TS_pad_inserted_char
= tgetstr ("ip", address
);
2184 TS_end_keypad_mode
= tgetstr ("ke", address
);
2185 TS_keypad_mode
= tgetstr ("ks", address
);
2186 LastLine
= tgetstr ("ll", address
);
2187 Right
= tgetstr ("nd", address
);
2188 Down
= tgetstr ("do", address
);
2190 Down
= tgetstr ("nl", address
); /* Obsolete name for "do" */
2192 /* VMS puts a carriage return before each linefeed,
2193 so it is not safe to use linefeeds. */
2194 if (Down
&& Down
[0] == '\n' && Down
[1] == '\0')
2197 if (tgetflag ("bs"))
2198 Left
= "\b"; /* can't possibly be longer! */
2199 else /* (Actually, "bs" is obsolete...) */
2200 Left
= tgetstr ("le", address
);
2202 Left
= tgetstr ("bc", address
); /* Obsolete name for "le" */
2203 TS_pad_char
= tgetstr ("pc", address
);
2204 TS_repeat
= tgetstr ("rp", address
);
2205 TS_end_standout_mode
= tgetstr ("se", address
);
2206 TS_fwd_scroll
= tgetstr ("sf", address
);
2207 TS_standout_mode
= tgetstr ("so", address
);
2208 TS_rev_scroll
= tgetstr ("sr", address
);
2209 Wcm
.cm_tab
= tgetstr ("ta", address
);
2210 TS_end_termcap_modes
= tgetstr ("te", address
);
2211 TS_termcap_modes
= tgetstr ("ti", address
);
2212 Up
= tgetstr ("up", address
);
2213 TS_visible_bell
= tgetstr ("vb", address
);
2214 TS_cursor_normal
= tgetstr ("ve", address
);
2215 TS_cursor_visible
= tgetstr ("vs", address
);
2216 TS_cursor_invisible
= tgetstr ("vi", address
);
2217 TS_set_window
= tgetstr ("wi", address
);
2219 TS_enter_underline_mode
= tgetstr ("us", address
);
2220 TS_exit_underline_mode
= tgetstr ("ue", address
);
2221 TN_magic_cookie_glitch_ul
= tgetnum ("ug");
2222 TS_enter_bold_mode
= tgetstr ("md", address
);
2223 TS_enter_dim_mode
= tgetstr ("mh", address
);
2224 TS_enter_blink_mode
= tgetstr ("mb", address
);
2225 TS_enter_reverse_mode
= tgetstr ("mr", address
);
2226 TS_enter_alt_charset_mode
= tgetstr ("as", address
);
2227 TS_exit_alt_charset_mode
= tgetstr ("ae", address
);
2228 TS_exit_attribute_mode
= tgetstr ("me", address
);
2230 MultiUp
= tgetstr ("UP", address
);
2231 MultiDown
= tgetstr ("DO", address
);
2232 MultiLeft
= tgetstr ("LE", address
);
2233 MultiRight
= tgetstr ("RI", address
);
2235 /* SVr4/ANSI color suppert. If "op" isn't available, don't support
2236 color because we can't switch back to the default foreground and
2238 TS_orig_pair
= tgetstr ("op", address
);
2241 TS_set_foreground
= tgetstr ("AF", address
);
2242 TS_set_background
= tgetstr ("AB", address
);
2243 if (!TS_set_foreground
)
2246 TS_set_foreground
= tgetstr ("Sf", address
);
2247 TS_set_background
= tgetstr ("Sb", address
);
2249 TN_max_colors
= tgetnum ("Co");
2250 TN_max_pairs
= tgetnum ("pa");
2253 MagicWrap
= tgetflag ("xn");
2254 /* Since we make MagicWrap terminals look like AutoWrap, we need to have
2255 the former flag imply the latter. */
2256 AutoWrap
= MagicWrap
|| tgetflag ("am");
2257 memory_below_frame
= tgetflag ("db");
2258 TF_hazeltine
= tgetflag ("hz");
2259 must_write_spaces
= tgetflag ("in");
2260 meta_key
= tgetflag ("km") || tgetflag ("MT");
2261 TF_insmode_motion
= tgetflag ("mi");
2262 TF_standout_motion
= tgetflag ("ms");
2263 TF_underscore
= tgetflag ("ul");
2264 TF_xs
= tgetflag ("xs");
2265 TF_teleray
= tgetflag ("xt");
2267 term_get_fkeys (address
);
2269 /* Get frame size from system, or else from termcap. */
2272 get_frame_size (&width
, &height
);
2273 FRAME_WIDTH (sf
) = width
;
2274 FRAME_HEIGHT (sf
) = height
;
2277 if (FRAME_WIDTH (sf
) <= 0)
2278 SET_FRAME_WIDTH (sf
, tgetnum ("co"));
2280 /* Keep width and external_width consistent */
2281 SET_FRAME_WIDTH (sf
, FRAME_WIDTH (sf
));
2282 if (FRAME_HEIGHT (sf
) <= 0)
2283 FRAME_HEIGHT (sf
) = tgetnum ("li");
2285 if (FRAME_HEIGHT (sf
) < 3 || FRAME_WIDTH (sf
) < 3)
2286 fatal ("Screen size %dx%d is too small",
2287 FRAME_HEIGHT (sf
), FRAME_WIDTH (sf
));
2289 min_padding_speed
= tgetnum ("pb");
2290 TN_standout_width
= tgetnum ("sg");
2291 TabWidth
= tgetnum ("tw");
2294 /* These capabilities commonly use ^J.
2295 I don't know why, but sending them on VMS does not work;
2296 it causes following spaces to be lost, sometimes.
2297 For now, the simplest fix is to avoid using these capabilities ever. */
2298 if (Down
&& Down
[0] == '\n')
2306 TS_fwd_scroll
= Down
;
2308 PC
= TS_pad_char
? *TS_pad_char
: 0;
2313 /* Turned off since /etc/termcap seems to have :ta= for most terminals
2314 and newer termcap doc does not seem to say there is a default.
2319 if (TS_standout_mode
== 0)
2321 TN_standout_width
= tgetnum ("ug");
2322 TS_end_standout_mode
= tgetstr ("ue", address
);
2323 TS_standout_mode
= tgetstr ("us", address
);
2326 /* If no `se' string, try using a `me' string instead.
2327 If that fails, we can't use standout mode at all. */
2328 if (TS_end_standout_mode
== 0)
2330 char *s
= tgetstr ("me", address
);
2332 TS_end_standout_mode
= s
;
2334 TS_standout_mode
= 0;
2340 /* Teleray: most programs want a space in front of TS_standout_mode,
2341 but Emacs can do without it (and give one extra column). */
2342 TS_standout_mode
= "\033RD";
2343 TN_standout_width
= 1;
2344 /* But that means we cannot rely on ^M to go to column zero! */
2346 /* LF can't be trusted either -- can alter hpos */
2347 /* if move at column 0 thru a line with TS_standout_mode */
2351 /* Special handling for certain terminal types known to need it */
2353 if (!strcmp (terminal_type
, "supdup"))
2355 memory_below_frame
= 1;
2356 Wcm
.cm_losewrap
= 1;
2358 if (!strncmp (terminal_type
, "c10", 3)
2359 || !strcmp (terminal_type
, "perq"))
2361 /* Supply a makeshift :wi string.
2362 This string is not valid in general since it works only
2363 for windows starting at the upper left corner;
2364 but that is all Emacs uses.
2366 This string works only if the frame is using
2367 the top of the video memory, because addressing is memory-relative.
2368 So first check the :ti string to see if that is true.
2370 It would be simpler if the :wi string could go in the termcap
2371 entry, but it can't because it is not fully valid.
2372 If it were in the termcap entry, it would confuse other programs. */
2375 p
= TS_termcap_modes
;
2376 while (*p
&& strcmp (p
, "\033v "))
2379 TS_set_window
= "\033v%C %C %C %C ";
2381 /* Termcap entry often fails to have :in: flag */
2382 must_write_spaces
= 1;
2383 /* :ti string typically fails to have \E^G! in it */
2384 /* This limits scope of insert-char to one line. */
2385 strcpy (area
, TS_termcap_modes
);
2386 strcat (area
, "\033\007!");
2387 TS_termcap_modes
= area
;
2388 area
+= strlen (area
) + 1;
2390 /* Change all %+ parameters to %C, to handle
2391 values above 96 correctly for the C100. */
2394 if (p
[0] == '%' && p
[1] == '+')
2400 FrameRows
= FRAME_HEIGHT (sf
);
2401 FrameCols
= FRAME_WIDTH (sf
);
2402 specified_window
= FRAME_HEIGHT (sf
);
2404 if (Wcm_init () == -1) /* can't do cursor motion */
2406 fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
2407 It lacks the ability to position the cursor.\n\
2408 If that is not the actual type of terminal you have, use either the\n\
2409 DCL command `SET TERMINAL/DEVICE= ...' for DEC-compatible terminals,\n\
2410 or `define EMACS_TERM \"terminal type\"' for non-DEC terminals.",
2414 fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
2415 It lacks the ability to position the cursor.\n\
2416 If that is not the actual type of terminal you have,\n\
2417 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
2418 `setenv TERM ...') to specify the correct type. It may be necessary\n\
2419 to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.",
2421 # else /* TERMCAP */
2422 fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
2423 It lacks the ability to position the cursor.\n\
2424 If that is not the actual type of terminal you have,\n\
2425 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
2426 `setenv TERM ...') to specify the correct type. It may be necessary\n\
2427 to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
2429 # endif /* TERMINFO */
2431 if (FRAME_HEIGHT (sf
) <= 0
2432 || FRAME_WIDTH (sf
) <= 0)
2433 fatal ("The frame size has not been specified");
2435 delete_in_insert_mode
2436 = TS_delete_mode
&& TS_insert_mode
2437 && !strcmp (TS_delete_mode
, TS_insert_mode
);
2439 se_is_so
= (TS_standout_mode
2440 && TS_end_standout_mode
2441 && !strcmp (TS_standout_mode
, TS_end_standout_mode
));
2443 /* Remove width of standout marker from usable width of line */
2444 if (TN_standout_width
> 0)
2445 SET_FRAME_WIDTH (sf
, FRAME_WIDTH (sf
) - TN_standout_width
);
2447 UseTabs
= tabs_safe_p () && TabWidth
== 8;
2451 && (TS_set_window
|| TS_set_scroll_region
|| TS_set_scroll_region_1
));
2453 line_ins_del_ok
= (((TS_ins_line
|| TS_ins_multi_lines
)
2454 && (TS_del_line
|| TS_del_multi_lines
))
2455 || (scroll_region_ok
&& TS_fwd_scroll
&& TS_rev_scroll
));
2457 char_ins_del_ok
= ((TS_ins_char
|| TS_insert_mode
2458 || TS_pad_inserted_char
|| TS_ins_multi_chars
)
2459 && (TS_del_char
|| TS_del_multi_chars
));
2461 fast_clear_end_of_line
= TS_clr_line
!= 0;
2464 if (read_socket_hook
) /* Baudrate is somewhat */
2465 /* meaningless in this case */
2468 FRAME_CAN_HAVE_SCROLL_BARS (sf
) = 0;
2469 FRAME_VERTICAL_SCROLL_BAR_TYPE (sf
) = vertical_scroll_bar_none
;
2470 #endif /* WINDOWSNT */
2475 fatal (str
, arg1
, arg2
)
2476 char *str
, *arg1
, *arg2
;
2478 fprintf (stderr
, "emacs: ");
2479 fprintf (stderr
, str
, arg1
, arg2
);
2480 fprintf (stderr
, "\n");
2488 DEFVAR_BOOL ("system-uses-terminfo", &system_uses_terminfo
,
2489 "Non-nil means the system uses terminfo rather than termcap.\n\
2490 This variable can be used by terminal emulator packages.");
2492 system_uses_terminfo
= 1;
2494 system_uses_terminfo
= 0;
2497 DEFVAR_LISP ("ring-bell-function", &Vring_bell_function
,
2498 "Non-nil means call this function to ring the bell.\n\
2499 The function should accept no arguments.");
2500 Vring_bell_function
= Qnil
;
2502 defsubr (&Stty_display_color_p
);