summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-08-11 16:24:50 +0200
committerBram Moolenaar <Bram@vim.org>2017-08-11 16:24:50 +0200
commite41e3b41f991bd610f889dea57676526704fea5f (patch)
treebfe0901e8daf63928bae6458eb9b4c319c027c05 /src
parentf1237f18143d9fe5b2a6ce981dee415736858789 (diff)
downloadvim-git-e41e3b41f991bd610f889dea57676526704fea5f.tar.gz
patch 8.0.0898: can't use the alternate screen in a terminal windowv8.0.0898
Problem: Can't use the alternate screen in a terminal window. Solution: Initialze the alternate screen. (Yasuhiro Matsumoto, closes #1957) Add term_getaltscreen().
Diffstat (limited to 'src')
-rw-r--r--src/evalfunc.c1
-rw-r--r--src/libvterm/include/vterm.h8
-rw-r--r--src/proto/terminal.pro1
-rw-r--r--src/terminal.c23
-rw-r--r--src/version.c2
5 files changed, 35 insertions, 0 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index b5880c58d..6cb0ed7d7 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -831,6 +831,7 @@ static struct fst
#endif
{"tempname", 0, 0, f_tempname},
#ifdef FEAT_TERMINAL
+ {"term_getaltscreen", 1, 1, f_term_getaltscreen},
{"term_getattr", 2, 2, f_term_getattr},
{"term_getcursor", 1, 1, f_term_getcursor},
{"term_getjob", 1, 1, f_term_getjob},
diff --git a/src/libvterm/include/vterm.h b/src/libvterm/include/vterm.h
index e797dffbf..cd7b1f772 100644
--- a/src/libvterm/include/vterm.h
+++ b/src/libvterm/include/vterm.h
@@ -188,6 +188,8 @@ void vterm_keyboard_start_paste(VTerm *vt);
void vterm_keyboard_end_paste(VTerm *vt);
void vterm_mouse_move(VTerm *vt, int row, int col, VTermModifier mod);
+/* "button" is 1 for left, 2 for middle, 3 for right.
+ * Button 4 is scroll wheel down, button 5 is scroll wheel up. */
void vterm_mouse_button(VTerm *vt, int button, int pressed, VTermModifier mod);
/* ------------
@@ -302,6 +304,9 @@ typedef struct {
int (*settermprop)(VTermProp prop, VTermValue *val, void *user);
int (*bell)(void *user);
int (*resize)(int rows, int cols, void *user);
+ /* A line was pushed off the top of the window.
+ * "cells[cols]" contains the cells of that line.
+ * Return value is unused. */
int (*sb_pushline)(int cols, const VTermScreenCell *cells, void *user);
int (*sb_popline)(int cols, VTermScreenCell *cells, void *user);
} VTermScreenCallbacks;
@@ -320,6 +325,9 @@ void *vterm_screen_get_cbdata(VTermScreen *screen);
void vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const VTermParserCallbacks *fallbacks, void *user);
void *vterm_screen_get_unrecognised_fbdata(VTermScreen *screen);
+/* Enable support for using the alternate screen if "altscreen" is non-zero.
+ * Before that switching to the alternate screen won't work.
+ * Calling with "altscreen" zero has no effect. */
void vterm_screen_enable_altscreen(VTermScreen *screen, int altscreen);
typedef enum {
diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro
index 7b28c2862..a004d355e 100644
--- a/src/proto/terminal.pro
+++ b/src/proto/terminal.pro
@@ -17,6 +17,7 @@ void term_change_in_curbuf(void);
int term_get_attr(buf_T *buf, linenr_T lnum, int col);
char_u *term_get_status_text(term_T *term);
int set_ref_in_term(int copyID);
+void f_term_getaltscreen(typval_T *argvars, typval_T *rettv);
void f_term_getattr(typval_T *argvars, typval_T *rettv);
void f_term_getcursor(typval_T *argvars, typval_T *rettv);
void f_term_getjob(typval_T *argvars, typval_T *rettv);
diff --git a/src/terminal.c b/src/terminal.c
index b1cb61fc0..e22f7bcf7 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -146,6 +146,8 @@ struct terminal_S {
VTermPos tl_cursor_pos;
int tl_cursor_visible;
+
+ int tl_using_altscreen;
};
#define TMODE_ONCE 1 /* CTRL-\ CTRL-N used */
@@ -1316,6 +1318,11 @@ handle_settermprop(
out_flush();
break;
+ case VTERM_PROP_ALTSCREEN:
+ /* TODO: do anything else? */
+ term->tl_using_altscreen = value->boolean;
+ break;
+
default:
break;
}
@@ -1865,6 +1872,9 @@ create_vterm(term_T *term, int rows, int cols)
/* Required to initialize most things. */
vterm_screen_reset(screen, 1 /* hard */);
+
+ /* Allow using alternate screen. */
+ vterm_screen_enable_altscreen(screen, 1);
}
/*
@@ -1939,6 +1949,19 @@ term_get_buf(typval_T *argvars)
}
/*
+ * "term_getaltscreen(buf)" function
+ */
+ void
+f_term_getaltscreen(typval_T *argvars, typval_T *rettv)
+{
+ buf_T *buf = term_get_buf(argvars);
+
+ if (buf == NULL)
+ return;
+ rettv->vval.v_number = buf->b_term->tl_using_altscreen;
+}
+
+/*
* "term_getattr(attr, name)" function
*/
void
diff --git a/src/version.c b/src/version.c
index 6a19bd147..8b112c600 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 898,
+/**/
897,
/**/
896,