summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fe-text/term-curses.c7
-rw-r--r--src/fe-text/term-terminfo.c7
-rw-r--r--src/fe-text/term.c6
-rw-r--r--src/fe-text/term.h3
-rw-r--r--src/fe-text/terminfo-core.c41
-rw-r--r--src/fe-text/terminfo-core.h4
6 files changed, 57 insertions, 11 deletions
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);