mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-06 11:55:48 +00:00
Add a level of indirection to terminal characteristics.
* src/termchar.h (struct terminal): New struct. (must_write_spaces, min_padding_speed, line_ins_del_ok) (char_ins_del_ok, scroll_region_ok, scroll_region_cost) (memory_below_frame, fast_clear_end_of_line): Moved to struct terminal. (current_terminal): New variable. (CURRENT_TERMINAL, TERMINAL_*): New accessor macros. (min_padding_speed, dont_calculate_costs): Commented out (unused). * src/term.c (_current_terminal): New variable. Will be removed when true multi-tty support is implemented. * src/termopts.h (no_redraw_on_reenter): Moved here. * src/term.c (set_terminal_window, ins_del_lines, calculate_costs) (term_init): Use the accessor macros for terminal characteristics. * src/dispnew.c (line_hash_code, line_draw_cost) (direct_output_for_insert, update_frame_1, scrolling) (update_frame_line): Ditto. * src/macterm.c (mac_initialize): Ditto. * src/msdos.c (internal_terminal_init): Ditto. * src/scroll.c (calculate_scrolling, calculate_direct_scrolling) (scrolling_1, scroll_cost): Ditto. * src/sysdep.c (hft_init): Ditto. * src/w32term.c (w32_initialize): Ditto. * src/xdisp.c (try_window_id): Ditto. * src/xterm.c (x_initialize): Ditto. * etc/TODO: Add pointer to my tla archive. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-1
This commit is contained in:
parent
da1492a4cf
commit
8a56675df1
5
etc/TODO
5
etc/TODO
@ -137,7 +137,10 @@ Other features we would like:
|
||||
* Highlight rectangles (`mouse-track-rectangle-p' in XEmacs). Already in CUA,
|
||||
but it's a valuable feature worth making more general.
|
||||
|
||||
* Support simultaneous tty and X frames.
|
||||
* Support simultaneous tty and X frames. [For a partial
|
||||
implementation, see tla branch
|
||||
lorentey@elte.hu--2004/emacs--multi-tty--0 at
|
||||
http://lorentey.web.elte.hu/arch/2004]
|
||||
|
||||
* Provide MIME support for Rmail using the Gnus MIME library. [Maybe
|
||||
not now feasible, given Gnus maintenance decisions. fx looked at
|
||||
|
@ -1397,7 +1397,7 @@ line_hash_code (row)
|
||||
{
|
||||
int c = glyph->u.ch;
|
||||
int face_id = glyph->face_id;
|
||||
if (must_write_spaces)
|
||||
if (TERMINAL_MUST_WRITE_SPACES (CURRENT_TERMINAL ()))
|
||||
c -= SPACEGLYPH;
|
||||
hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + c;
|
||||
hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + face_id;
|
||||
@ -1429,7 +1429,7 @@ line_draw_cost (matrix, vpos)
|
||||
int glyph_table_len = GLYPH_TABLE_LENGTH;
|
||||
|
||||
/* Ignore trailing and leading spaces if we can. */
|
||||
if (!must_write_spaces)
|
||||
if (!TERMINAL_MUST_WRITE_SPACES (CURRENT_TERMINAL ()))
|
||||
{
|
||||
/* Skip from the end over trailing spaces. */
|
||||
while (end > beg && CHAR_GLYPH_SPACE_P (*(end - 1)))
|
||||
@ -3462,7 +3462,7 @@ direct_output_for_insert (g)
|
||||
|
||||
/* If we can't insert glyphs, we can use this method only
|
||||
at the end of a line. */
|
||||
if (!char_ins_del_ok)
|
||||
if (!TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ()))
|
||||
if (PT != ZV && FETCH_BYTE (PT_BYTE) != '\n')
|
||||
return 0;
|
||||
|
||||
@ -5075,7 +5075,7 @@ update_frame_1 (f, force_p, inhibit_id_p)
|
||||
}
|
||||
|
||||
/* If we cannot insert/delete lines, it's no use trying it. */
|
||||
if (!line_ins_del_ok)
|
||||
if (!TERMINAL_LINE_INS_DEL_OK (CURRENT_TERMINAL ()))
|
||||
inhibit_id_p = 1;
|
||||
|
||||
/* See if any of the desired lines are enabled; don't compute for
|
||||
@ -5293,21 +5293,23 @@ scrolling (frame)
|
||||
}
|
||||
|
||||
/* If changed lines are few, don't allow preemption, don't scroll. */
|
||||
if ((!scroll_region_ok && changed_lines < baud_rate / 2400)
|
||||
if ((!TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ())
|
||||
&& changed_lines < baud_rate / 2400)
|
||||
|| unchanged_at_bottom == FRAME_LINES (frame))
|
||||
return 1;
|
||||
|
||||
window_size = (FRAME_LINES (frame) - unchanged_at_top
|
||||
- unchanged_at_bottom);
|
||||
|
||||
if (scroll_region_ok)
|
||||
if (TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()))
|
||||
free_at_end_vpos -= unchanged_at_bottom;
|
||||
else if (memory_below_frame)
|
||||
else if (TERMINAL_MEMORY_BELOW_FRAME (CURRENT_TERMINAL ()))
|
||||
free_at_end_vpos = -1;
|
||||
|
||||
/* If large window, fast terminal and few lines in common between
|
||||
current frame and desired frame, don't bother with i/d calc. */
|
||||
if (!scroll_region_ok && window_size >= 18 && baud_rate > 2400
|
||||
if (!TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ())
|
||||
&& window_size >= 18 && baud_rate > 2400
|
||||
&& (window_size >=
|
||||
10 * scrolling_max_lines_saved (unchanged_at_top,
|
||||
FRAME_LINES (frame) - unchanged_at_bottom,
|
||||
@ -5387,7 +5389,7 @@ update_frame_line (f, vpos)
|
||||
struct glyph_row *current_row = MATRIX_ROW (current_matrix, vpos);
|
||||
struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, vpos);
|
||||
int must_write_whole_line_p;
|
||||
int write_spaces_p = must_write_spaces;
|
||||
int write_spaces_p = TERMINAL_MUST_WRITE_SPACES (CURRENT_TERMINAL ());
|
||||
int colored_spaces_p = (FACE_FROM_ID (f, DEFAULT_FACE_ID)->background
|
||||
!= FACE_TTY_DEFAULT_BG_COLOR);
|
||||
|
||||
@ -5466,7 +5468,7 @@ update_frame_line (f, vpos)
|
||||
nlen--;
|
||||
|
||||
/* If there's no i/d char, quickly do the best we can without it. */
|
||||
if (!char_ins_del_ok)
|
||||
if (!TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ()))
|
||||
{
|
||||
int i, j;
|
||||
|
||||
@ -5569,7 +5571,8 @@ update_frame_line (f, vpos)
|
||||
|
||||
tem = (nlen - nsp) - (olen - osp);
|
||||
if (endmatch && tem
|
||||
&& (!char_ins_del_ok || endmatch <= char_ins_del_cost (f)[tem]))
|
||||
&& (!TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ())
|
||||
|| endmatch <= char_ins_del_cost (f)[tem]))
|
||||
endmatch = 0;
|
||||
|
||||
/* nsp - osp is the distance to insert or delete.
|
||||
@ -5578,7 +5581,7 @@ update_frame_line (f, vpos)
|
||||
Is it worth it? */
|
||||
|
||||
if (nsp != osp
|
||||
&& (!char_ins_del_ok
|
||||
&& (!TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ())
|
||||
|| begmatch + endmatch <= char_ins_del_cost (f)[nsp - osp]))
|
||||
{
|
||||
begmatch = 0;
|
||||
|
@ -8674,12 +8674,13 @@ mac_initialize ()
|
||||
redeem_scroll_bar_hook = XTredeem_scroll_bar;
|
||||
judge_scroll_bars_hook = XTjudge_scroll_bars;
|
||||
|
||||
scroll_region_ok = 1; /* we'll scroll partial frames */
|
||||
char_ins_del_ok = 1;
|
||||
line_ins_del_ok = 1; /* we'll just blt 'em */
|
||||
fast_clear_end_of_line = 1; /* X does this well */
|
||||
memory_below_frame = 0; /* we don't remember what scrolls
|
||||
off the bottom */
|
||||
TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()) = 1; /* we'll scroll partial frames */
|
||||
TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ()) = 1;
|
||||
TERMINAL_LINE_INS_DEL_OK (CURRENT_TERMINAL ()) = 1; /* we'll just blt 'em */
|
||||
TERMINAL_FAST_CLEAR_END_OF_LINE (CURRENT_TERMINAL ()) = 1; /* X does this well */
|
||||
TERMINAL_MEMORY_BELOW_FRAME (CURRENT_TERMINAL ()) = 0; /* we don't remember what
|
||||
scrolls off the
|
||||
bottom */
|
||||
baud_rate = 19200;
|
||||
|
||||
x_noop_count = 0;
|
||||
|
@ -2580,7 +2580,7 @@ internal_terminal_init ()
|
||||
set_terminal_modes_hook = IT_set_terminal_modes;
|
||||
reset_terminal_modes_hook = IT_reset_terminal_modes;
|
||||
set_terminal_window_hook = IT_set_terminal_window;
|
||||
char_ins_del_ok = 0;
|
||||
TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ()) = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
10
src/scroll.c
10
src/scroll.c
@ -100,7 +100,8 @@ calculate_scrolling (frame, matrix, window_size, lines_below,
|
||||
register struct matrix_elt *p, *p1;
|
||||
register int cost, cost1;
|
||||
|
||||
int lines_moved = window_size + (scroll_region_ok ? 0 : lines_below);
|
||||
int lines_moved = window_size
|
||||
+ (TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()) ? 0 : lines_below);
|
||||
/* first_insert_cost[I] is the cost of doing the first insert-line
|
||||
at the i'th line of the lines we are considering,
|
||||
where I is origin 1 (as it is below). */
|
||||
@ -466,7 +467,8 @@ calculate_direct_scrolling (frame, matrix, window_size, lines_below,
|
||||
/* Overhead of setting the scroll window, plus the extra cost
|
||||
cost of scrolling by a distance of one. The extra cost is
|
||||
added once for consistency with the cost vectors */
|
||||
scroll_overhead = scroll_region_cost + extra_cost;
|
||||
scroll_overhead
|
||||
= TERMINAL_SCROLL_REGION_COST (CURRENT_TERMINAL ()) + extra_cost;
|
||||
|
||||
/* initialize the top left corner of the matrix */
|
||||
matrix->writecost = 0;
|
||||
@ -818,7 +820,7 @@ scrolling_1 (frame, window_size, unchanged_at_top, unchanged_at_bottom,
|
||||
matrix = ((struct matrix_elt *)
|
||||
alloca ((window_size + 1) * (window_size + 1) * sizeof *matrix));
|
||||
|
||||
if (scroll_region_ok)
|
||||
if (TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()))
|
||||
{
|
||||
calculate_direct_scrolling (frame, matrix, window_size,
|
||||
unchanged_at_bottom,
|
||||
@ -914,7 +916,7 @@ scroll_cost (frame, from, to, amount)
|
||||
if (amount == 0)
|
||||
return 0;
|
||||
|
||||
if (! scroll_region_ok)
|
||||
if (! TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()))
|
||||
limit = height;
|
||||
else if (amount > 0)
|
||||
limit += amount;
|
||||
|
@ -5126,7 +5126,8 @@ hft_init ()
|
||||
}
|
||||
/* The HFT system on AIX doesn't optimize for scrolling, so it's really ugly
|
||||
at times. */
|
||||
line_ins_del_ok = char_ins_del_ok = 0;
|
||||
TERMINAL_LINE_INS_DEL_OK (CURRENT_TERMINAL ()) = 0;
|
||||
TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ()) = 0;
|
||||
}
|
||||
|
||||
/* Reset the rubout key to backspace. */
|
||||
|
75
src/term.c
75
src/term.c
@ -83,28 +83,13 @@ static void tty_hide_cursor P_ ((void));
|
||||
|
||||
Lisp_Object Vring_bell_function;
|
||||
|
||||
/* Terminal characteristics that higher levels want to look at.
|
||||
These are all extern'd in termchar.h */
|
||||
|
||||
int must_write_spaces; /* Nonzero means spaces in the text
|
||||
must actually be output; can't just skip
|
||||
over some columns to leave them blank. */
|
||||
int min_padding_speed; /* Speed below which no padding necessary */
|
||||
|
||||
int line_ins_del_ok; /* Terminal can insert and delete lines */
|
||||
int char_ins_del_ok; /* Terminal can insert and delete chars */
|
||||
int scroll_region_ok; /* Terminal supports setting the
|
||||
scroll window */
|
||||
int scroll_region_cost; /* Cost of setting a scroll window,
|
||||
measured in characters */
|
||||
int memory_below_frame; /* Terminal remembers lines
|
||||
scrolled off bottom */
|
||||
int fast_clear_end_of_line; /* Terminal has a `ce' string */
|
||||
/* Terminal characteristics that higher levels want to look at. */
|
||||
static struct terminal _current_terminal;
|
||||
TERMINAL_PTR current_terminal = &_current_terminal;
|
||||
|
||||
/* Nonzero means no need to redraw the entire frame on resuming
|
||||
a suspended Emacs. This is useful on terminals with multiple pages,
|
||||
where one page is used for Emacs and another for all else. */
|
||||
|
||||
int no_redraw_on_reenter;
|
||||
|
||||
/* Hook functions that you can set to snap out the functions in this file.
|
||||
@ -505,7 +490,7 @@ set_terminal_window (size)
|
||||
if (FRAME_TERMCAP_P (updating_frame))
|
||||
{
|
||||
specified_window = size ? size : FRAME_LINES (updating_frame);
|
||||
if (scroll_region_ok)
|
||||
if (TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()))
|
||||
set_scroll_region (0, specified_window);
|
||||
}
|
||||
else
|
||||
@ -1151,9 +1136,11 @@ ins_del_lines (vpos, n)
|
||||
/* If the lines below the deletion are blank lines coming
|
||||
out of the end of the window, don't bother,
|
||||
as there will be a matching inslines later that will flush them. */
|
||||
if (scroll_region_ok && vpos + i >= specified_window)
|
||||
if (TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ())
|
||||
&& vpos + i >= specified_window)
|
||||
return;
|
||||
if (!memory_below_frame && vpos + i >= FRAME_LINES (sf))
|
||||
if (!TERMINAL_MEMORY_BELOW_FRAME (CURRENT_TERMINAL ())
|
||||
&& vpos + i >= FRAME_LINES (sf))
|
||||
return;
|
||||
|
||||
if (multi)
|
||||
@ -1186,7 +1173,9 @@ ins_del_lines (vpos, n)
|
||||
set_scroll_region (0, specified_window);
|
||||
}
|
||||
|
||||
if (!scroll_region_ok && memory_below_frame && n < 0)
|
||||
if (!TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ())
|
||||
&& TERMINAL_MEMORY_BELOW_FRAME (CURRENT_TERMINAL ())
|
||||
&& n < 0)
|
||||
{
|
||||
cursor_to (FRAME_LINES (sf) + n, 0);
|
||||
clear_to_end ();
|
||||
@ -1317,7 +1306,7 @@ calculate_costs (frame)
|
||||
|
||||
FRAME_COST_BAUD_RATE (frame) = baud_rate;
|
||||
|
||||
scroll_region_cost = string_cost (f);
|
||||
TERMINAL_SCROLL_REGION_COST (CURRENT_TERMINAL ()) = string_cost (f);
|
||||
|
||||
/* These variables are only used for terminal stuff. They are allocated
|
||||
once for the terminal frame of X-windows emacs, but not used afterwards.
|
||||
@ -2185,15 +2174,15 @@ term_init (terminal_type)
|
||||
delete_in_insert_mode = 1;
|
||||
|
||||
UseTabs = 0;
|
||||
scroll_region_ok = 0;
|
||||
TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()) = 0;
|
||||
|
||||
/* Seems to insert lines when it's not supposed to, messing
|
||||
up the display. In doing a trace, it didn't seem to be
|
||||
called much, so I don't think we're losing anything by
|
||||
turning it off. */
|
||||
|
||||
line_ins_del_ok = 0;
|
||||
char_ins_del_ok = 1;
|
||||
TERMINAL_LINE_INS_DEL_OK (CURRENT_TERMINAL ()) = 0;
|
||||
TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ()) = 1;
|
||||
|
||||
baud_rate = 19200;
|
||||
|
||||
@ -2346,9 +2335,9 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
|
||||
/* Since we make MagicWrap terminals look like AutoWrap, we need to have
|
||||
the former flag imply the latter. */
|
||||
AutoWrap = MagicWrap || tgetflag ("am");
|
||||
memory_below_frame = tgetflag ("db");
|
||||
TERMINAL_MEMORY_BELOW_FRAME (CURRENT_TERMINAL ()) = tgetflag ("db");
|
||||
TF_hazeltine = tgetflag ("hz");
|
||||
must_write_spaces = tgetflag ("in");
|
||||
TERMINAL_MUST_WRITE_SPACES (CURRENT_TERMINAL ()) = tgetflag ("in");
|
||||
meta_key = tgetflag ("km") || tgetflag ("MT");
|
||||
TF_insmode_motion = tgetflag ("mi");
|
||||
TF_standout_motion = tgetflag ("ms");
|
||||
@ -2377,7 +2366,10 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
|
||||
fatal ("Screen size %dx%d is too small",
|
||||
FRAME_LINES (sf), FRAME_COLS (sf));
|
||||
|
||||
min_padding_speed = tgetnum ("pb");
|
||||
#if 0 /* This is not used anywhere. */
|
||||
TERMINAL_MIN_PADDING_SPEED (CURRENT_TERMINAL ()) = tgetnum ("pb");
|
||||
#endif
|
||||
|
||||
TabWidth = tgetnum ("tw");
|
||||
|
||||
#ifdef VMS
|
||||
@ -2453,7 +2445,7 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
|
||||
|
||||
if (!strcmp (terminal_type, "supdup"))
|
||||
{
|
||||
memory_below_frame = 1;
|
||||
TERMINAL_MEMORY_BELOW_FRAME (CURRENT_TERMINAL ()) = 1;
|
||||
Wcm.cm_losewrap = 1;
|
||||
}
|
||||
if (!strncmp (terminal_type, "c10", 3)
|
||||
@ -2480,7 +2472,7 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
|
||||
TS_set_window = "\033v%C %C %C %C ";
|
||||
}
|
||||
/* Termcap entry often fails to have :in: flag */
|
||||
must_write_spaces = 1;
|
||||
TERMINAL_MUST_WRITE_SPACES (CURRENT_TERMINAL ()) = 1;
|
||||
/* :ti string typically fails to have \E^G! in it */
|
||||
/* This limits scope of insert-char to one line. */
|
||||
strcpy (area, TS_termcap_modes);
|
||||
@ -2543,19 +2535,22 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
|
||||
|
||||
UseTabs = tabs_safe_p () && TabWidth == 8;
|
||||
|
||||
scroll_region_ok
|
||||
TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ())
|
||||
= (Wcm.cm_abs
|
||||
&& (TS_set_window || TS_set_scroll_region || TS_set_scroll_region_1));
|
||||
|
||||
line_ins_del_ok = (((TS_ins_line || TS_ins_multi_lines)
|
||||
&& (TS_del_line || TS_del_multi_lines))
|
||||
|| (scroll_region_ok && TS_fwd_scroll && TS_rev_scroll));
|
||||
TERMINAL_LINE_INS_DEL_OK (CURRENT_TERMINAL ())
|
||||
= (((TS_ins_line || TS_ins_multi_lines)
|
||||
&& (TS_del_line || TS_del_multi_lines))
|
||||
|| (TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ())
|
||||
&& TS_fwd_scroll && TS_rev_scroll));
|
||||
|
||||
TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ())
|
||||
= ((TS_ins_char || TS_insert_mode
|
||||
|| TS_pad_inserted_char || TS_ins_multi_chars)
|
||||
&& (TS_del_char || TS_del_multi_chars));
|
||||
|
||||
char_ins_del_ok = ((TS_ins_char || TS_insert_mode
|
||||
|| TS_pad_inserted_char || TS_ins_multi_chars)
|
||||
&& (TS_del_char || TS_del_multi_chars));
|
||||
|
||||
fast_clear_end_of_line = TS_clr_line != 0;
|
||||
TERMINAL_FAST_CLEAR_END_OF_LINE (CURRENT_TERMINAL ()) = TS_clr_line != 0;
|
||||
|
||||
init_baud_rate ();
|
||||
if (read_socket_hook) /* Baudrate is somewhat */
|
||||
|
@ -18,32 +18,51 @@ along with GNU Emacs; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
struct terminal
|
||||
{
|
||||
|
||||
/* EMACS_INT baud_rate; */ /* Output speed in baud */
|
||||
int must_write_spaces; /* Nonzero means spaces in the text must
|
||||
actually be output; can't just skip over
|
||||
some columns to leave them blank. */
|
||||
int fast_clear_end_of_line; /* Nonzero means terminal has a `ce' string */
|
||||
|
||||
int line_ins_del_ok; /* Terminal can insert and delete lines */
|
||||
int char_ins_del_ok; /* Terminal can insert and delete chars */
|
||||
int scroll_region_ok; /* Terminal supports setting the scroll
|
||||
window */
|
||||
int scroll_region_cost; /* Cost of setting the scroll window,
|
||||
measured in characters. */
|
||||
int memory_below_frame; /* Terminal remembers lines scrolled
|
||||
off bottom */
|
||||
|
||||
/* extern EMACS_INT baud_rate; */ /* Output speed in baud */
|
||||
extern int must_write_spaces; /* Nonzero means spaces in the text
|
||||
must actually be output; can't just skip
|
||||
over some columns to leave them blank. */
|
||||
extern int min_padding_speed; /* Speed below which no padding necessary */
|
||||
extern int fast_clear_end_of_line; /* Nonzero means terminal has
|
||||
command for this */
|
||||
#if 0 /* These are not used anywhere. */
|
||||
int min_padding_speed; /* Speed below which no padding necessary. */
|
||||
int dont_calculate_costs; /* Nonzero means don't bother computing
|
||||
various cost tables; we won't use them. */
|
||||
#endif
|
||||
};
|
||||
|
||||
extern int line_ins_del_ok; /* Terminal can insert and delete lines */
|
||||
extern int char_ins_del_ok; /* Terminal can insert and delete chars */
|
||||
extern int scroll_region_ok; /* Terminal supports setting the scroll
|
||||
window */
|
||||
extern int scroll_region_cost; /* Cost of setting the scroll window,
|
||||
measured in characters */
|
||||
extern int memory_below_frame; /* Terminal remembers lines scrolled
|
||||
off bottom */
|
||||
extern int fast_clear_end_of_line; /* Terminal has a `ce' string */
|
||||
typedef struct terminal *TERMINAL_PTR;
|
||||
|
||||
extern int dont_calculate_costs; /* Nonzero means don't bother computing
|
||||
various cost tables; we won't use them. */
|
||||
extern TERMINAL_PTR current_terminal;
|
||||
|
||||
/* Nonzero means no need to redraw the entire frame on resuming
|
||||
a suspended Emacs. This is useful on terminals with multiple pages,
|
||||
where one page is used for Emacs and another for all else. */
|
||||
extern int no_redraw_on_reenter;
|
||||
#define CURRENT_TERMINAL() \
|
||||
(current_terminal ? current_terminal : (abort(), (TERMINAL_PTR) 0))
|
||||
|
||||
#define TERMINAL_MUST_WRITE_SPACES(t) ((t)->must_write_spaces)
|
||||
#define TERMINAL_FAST_CLEAR_END_OF_LINE(t) ((t)->fast_clear_end_of_line)
|
||||
#define TERMINAL_LINE_INS_DEL_OK(t) ((t)->line_ins_del_ok)
|
||||
#define TERMINAL_CHAR_INS_DEL_OK(t) ((t)->char_ins_del_ok)
|
||||
#define TERMINAL_SCROLL_REGION_OK(t) ((t)->scroll_region_ok)
|
||||
#define TERMINAL_SCROLL_REGION_COST(t) ((t)->scroll_region_cost)
|
||||
#define TERMINAL_MEMORY_BELOW_FRAME(t) ((t)->memory_below_frame)
|
||||
|
||||
#if 0
|
||||
/* These are not used anywhere. */
|
||||
#define TERMINAL_MIN_PADDING_SPEED(t) ((t)->min_padding_speed)
|
||||
#define TERMINAL_DONT_CALCULATE_COSTS(t) ((t)->dont_calculate_costs)
|
||||
#endif
|
||||
|
||||
/* arch-tag: bf9f0d49-842b-42fb-9348-ec8759b27193
|
||||
(do not change this comment) */
|
||||
|
@ -40,5 +40,10 @@ extern int meta_key;
|
||||
/* Nonzero means truncate lines in all windows less wide than the frame */
|
||||
extern int truncate_partial_width_windows;
|
||||
|
||||
/* Nonzero means no need to redraw the entire frame on resuming a suspended
|
||||
Emacs. This is useful on terminals with multiple pages, where one page is
|
||||
used for Emacs and another for all else. */
|
||||
extern int no_redraw_on_reenter;
|
||||
|
||||
/* arch-tag: 35d4d284-dc1a-4fff-97fa-0154a21aebdb
|
||||
(do not change this comment) */
|
||||
|
@ -6366,12 +6366,13 @@ w32_initialize ()
|
||||
redeem_scroll_bar_hook = w32_redeem_scroll_bar;
|
||||
judge_scroll_bars_hook = w32_judge_scroll_bars;
|
||||
|
||||
scroll_region_ok = 1; /* we'll scroll partial frames */
|
||||
char_ins_del_ok = 1;
|
||||
line_ins_del_ok = 1; /* we'll just blt 'em */
|
||||
fast_clear_end_of_line = 1; /* X does this well */
|
||||
memory_below_frame = 0; /* we don't remember what scrolls
|
||||
off the bottom */
|
||||
TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()) = 1; /* we'll scroll partial frames */
|
||||
TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ()) = 1;
|
||||
TERMINAL_LINE_INS_DEL_OK (CURRENT_TERMINAL ()) = 1; /* we'll just blt 'em */
|
||||
TERMINAL_FAST_CLEAR_END_OF_LINE (CURRENT_TERMINAL ()) = 1; /* X does this well */
|
||||
TERMINAL_MEMORY_BELOW_FRAME (CURRENT_TERMINAL ()) = 0; /* we don't remember what
|
||||
scrolls off the
|
||||
bottom */
|
||||
baud_rate = 19200;
|
||||
|
||||
w32_system_caret_hwnd = NULL;
|
||||
|
@ -12889,7 +12889,7 @@ try_window_id (w)
|
||||
|
||||
/* Window must either use window-based redisplay or be full width. */
|
||||
if (!FRAME_WINDOW_P (f)
|
||||
&& (!line_ins_del_ok
|
||||
&& (!TERMINAL_LINE_INS_DEL_OK (CURRENT_TERMINAL ())
|
||||
|| !WINDOW_FULL_WIDTH_P (w)))
|
||||
GIVE_UP (4);
|
||||
|
||||
@ -13322,7 +13322,7 @@ try_window_id (w)
|
||||
|
||||
/* On dumb terminals delete dvpos lines at the end
|
||||
before inserting dvpos empty lines. */
|
||||
if (!scroll_region_ok)
|
||||
if (!TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()))
|
||||
ins_del_lines (end - dvpos, -dvpos);
|
||||
|
||||
/* Insert dvpos empty lines in front of
|
||||
@ -13343,7 +13343,7 @@ try_window_id (w)
|
||||
|
||||
/* On a dumb terminal insert dvpos empty lines at the
|
||||
end. */
|
||||
if (!scroll_region_ok)
|
||||
if (!TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()))
|
||||
ins_del_lines (end + dvpos, -dvpos);
|
||||
}
|
||||
|
||||
|
13
src/xterm.c
13
src/xterm.c
@ -10852,12 +10852,13 @@ x_initialize ()
|
||||
redeem_scroll_bar_hook = XTredeem_scroll_bar;
|
||||
judge_scroll_bars_hook = XTjudge_scroll_bars;
|
||||
|
||||
scroll_region_ok = 1; /* we'll scroll partial frames */
|
||||
char_ins_del_ok = 1;
|
||||
line_ins_del_ok = 1; /* we'll just blt 'em */
|
||||
fast_clear_end_of_line = 1; /* X does this well */
|
||||
memory_below_frame = 0; /* we don't remember what scrolls
|
||||
off the bottom */
|
||||
TERMINAL_SCROLL_REGION_OK (CURRENT_TERMINAL ()) = 1; /* we'll scroll partial frames */
|
||||
TERMINAL_CHAR_INS_DEL_OK (CURRENT_TERMINAL ()) = 1;
|
||||
TERMINAL_LINE_INS_DEL_OK (CURRENT_TERMINAL ()) = 1; /* we'll just blt 'em */
|
||||
TERMINAL_FAST_CLEAR_END_OF_LINE (CURRENT_TERMINAL ()) = 1; /* X does this well */
|
||||
TERMINAL_MEMORY_BELOW_FRAME (CURRENT_TERMINAL ()) = 0; /* we don't remember what
|
||||
scrolls off the
|
||||
bottom */
|
||||
baud_rate = 19200;
|
||||
|
||||
x_noop_count = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user