diff --git a/src/fe-text/term-curses.c b/src/fe-text/term-curses.c index 6f71ac29..41139b97 100644 --- a/src/fe-text/term-curses.c +++ b/src/fe-text/term-curses.c @@ -193,6 +193,13 @@ void term_force_colors(int set) /* don't do anything with curses */ } +/* Setup scrolling - if fast is TRUE, we'll use the fastest method to + scroll, if it's FALSE, we'll use the one that looks cleanest. */ +void term_setup_scroll(int fast) +{ + /* don't do anything with curses */ +} + /* Clear screen */ void term_clear(void) { diff --git a/src/fe-text/term-terminfo.c b/src/fe-text/term-terminfo.c index e110085f..a0fb1422 100644 --- a/src/fe-text/term-terminfo.c +++ b/src/fe-text/term-terminfo.c @@ -170,6 +170,13 @@ void term_force_colors(int set) terminfo_setup_colors(current_term, set); } +/* Setup scrolling - if fast is TRUE, we'll use the fastest method to + scroll, if it's FALSE, we'll use the one that looks cleanest. */ +void term_setup_scroll(int fast) +{ + terminfo_setup_scroll(current_term, fast); +} + /* Clear screen */ void term_clear(void) { diff --git a/src/fe-text/term.c b/src/fe-text/term.c index 2889f8eb..f2847661 100644 --- a/src/fe-text/term.c +++ b/src/fe-text/term.c @@ -92,7 +92,8 @@ static void read_settings(void) { int old_colors = term_use_colors; - if (settings_get_bool("force_colors")) { + term_setup_scroll(settings_get_bool("term_scroll_fast")); + if (settings_get_bool("term_force_colors")) { if (!term_use_colors) { term_force_colors(TRUE); term_use_colors = TRUE; @@ -115,7 +116,8 @@ void term_common_init(void) struct sigaction act; #endif settings_add_bool("lookandfeel", "colors", TRUE); - settings_add_bool("lookandfeel", "force_colors", FALSE); + settings_add_bool("lookandfeel", "term_force_colors", FALSE); + settings_add_bool("lookandfeel", "term_scroll_fast", FALSE); term_use_colors = term_has_colors() && settings_get_bool("colors"); read_settings(); diff --git a/src/fe-text/term.h b/src/fe-text/term.h index 74e51f31..255329d6 100644 --- a/src/fe-text/term.h +++ b/src/fe-text/term.h @@ -40,6 +40,9 @@ void term_resize_dirty(void); int term_has_colors(void); /* Force the colors on any way you can */ void term_force_colors(int set); +/* Setup scrolling - if fast is TRUE, we'll use the fastest method to + scroll, if it's FALSE, we'll use the one that looks cleanest. */ +void term_setup_scroll(int fast); /* Clear screen */ void term_clear(void); diff --git a/src/fe-text/terminfo-core.c b/src/fe-text/terminfo-core.c index e6ff8ac4..79151fa0 100644 --- a/src/fe-text/terminfo-core.c +++ b/src/fe-text/terminfo-core.c @@ -484,6 +484,36 @@ void terminfo_cont(TERM_REC *term) terminfo_input_init(term); } +/* Setup scrolling - if fast is TRUE, we'll use the fastest method to + scroll, if it's FALSE, we'll use the one that looks cleanest. */ +void terminfo_setup_scroll(TERM_REC *term, int fast) +{ + int region_1; + + if ((term->TI_csr || term->TI_wind) && term->TI_rin && term->TI_indn) { + /* this is excellent - if only terminals supported it.. */ + term->scroll = _scroll_region; + return; + } + + region_1 = (term->TI_csr || term->TI_wind) && term->TI_ri && term->TI_ind; + if (!fast && region_1) { + /* we prefer pretty */ + term->scroll = _scroll_region_1; + } else if (term->TI_il && term->TI_dl) { + /* either we prefer fast, or can't do pretty */ + term->scroll = _scroll_line; + } else if (region_1) { + /* we prefer fast, but can't do it */ + term->scroll = _scroll_region_1; + } + + if (term->scroll == NULL && (term->TI_il1 && term->TI_dl1)) { + /* the final slowest and ugliest method we can use */ + term->scroll = _scroll_line_1; + } +} + void terminfo_stop(TERM_REC *term) { /* reset colors */ @@ -543,15 +573,8 @@ static int term_setup(TERM_REC *term) _set_cursor_visible : _ignore_parm; /* Scrolling */ - if ((term->TI_csr || term->TI_wind) && term->TI_rin && term->TI_indn) - term->scroll = _scroll_region; - else if (term->TI_il && term->TI_dl) - term->scroll = _scroll_line; - else if ((term->TI_csr || term->TI_wind) && term->TI_ri && term->TI_ind) - term->scroll = _scroll_region_1; - else if (term->TI_il1 && term->TI_dl1) - term->scroll = _scroll_line_1; - else { + terminfo_setup_scroll(term, FALSE); + if (term->scroll == NULL) { fprintf(term->out, "Terminal doesn't support scrolling\n"); return 0; } diff --git a/src/fe-text/terminfo-core.h b/src/fe-text/terminfo-core.h index 93afa78b..5c823854 100644 --- a/src/fe-text/terminfo-core.h +++ b/src/fe-text/terminfo-core.h @@ -93,6 +93,10 @@ void terminfo_core_deinit(TERM_REC *term); terminal capabilities don't contain color codes */ void terminfo_setup_colors(TERM_REC *term, int force); +/* Setup scrolling - if fast is TRUE, we'll use the fastest method to + scroll, if it's FALSE, we'll use the one that looks cleanest. */ +void terminfo_setup_scroll(TERM_REC *term, int fast); + /* Terminal was resized - ask the width/height from terminfo again */ void terminfo_resize(TERM_REC *term);