aboutsummaryrefslogtreecommitdiff
path: root/vterm-module.c
diff options
context:
space:
mode:
authorjixiuf <jixiuf@qq.com>2020-02-01 00:57:07 +0800
committerjixiuf <jixiuf@qq.com>2020-02-01 11:13:54 +0800
commit9c21014efd1cc14a486d894ffa5734c72a131442 (patch)
tree7fb67eb72acc68128b34ad70298330965b2a36d3 /vterm-module.c
parent4fbf8f89ff0852f2ef7670f426cd7030d65a9223 (diff)
fix adjust_topline fix #222
Diffstat (limited to 'vterm-module.c')
-rw-r--r--vterm-module.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/vterm-module.c b/vterm-module.c
index 173bda1..2a9c203 100644
--- a/vterm-module.c
+++ b/vterm-module.c
@@ -427,29 +427,24 @@ static void adjust_topline(Term *term, emacs_env *env) {
size_t offset = get_col_offset(term, pos.row, pos.col);
forward_char(env, env->make_integer(env, pos.col - offset));
- bool following =
- term->height == 1 + pos.row + term->linenum_added; // cursor at end?
-
+ emacs_value cursor_point = point(env);
emacs_value windows = get_buffer_window_list(env);
- emacs_value swindow = selected_window(env);
int winnum = env->extract_integer(env, length(env, windows));
for (int i = 0; i < winnum; i++) {
emacs_value window = nth(env, i, windows);
- if (eq(env, window, swindow)) {
- if (following) {
- // "Follow" the terminal output
- recenter(env,
- env->make_integer(
- env, -1)); /* make current line at the screen bottom */
- } else {
- recenter(env, env->make_integer(env, pos.row));
- }
- } else {
- if (env->is_not_nil(env, window)) {
- set_window_point(env, window, point(env));
- }
+ if (env->is_not_nil(env, window)) {
+ int win_height =
+ env->extract_integer(env, window_body_height(env, window));
+ /*
+ -win_height is negative,so we backward win_height lines from end of
+ buffer
+ */
+ goto_line(env, -win_height);
+ set_window_start(env, window, point(env));
+ set_window_point(env, window, cursor_point);
}
}
+ goto_char(env, cursor_point);
}
static void invalidate_terminal(Term *term, int start_row, int end_row) {
@@ -1099,6 +1094,11 @@ int emacs_module_init(struct emacs_runtime *ert) {
Frecenter = env->make_global_ref(env, env->intern(env, "recenter"));
Fset_window_point =
env->make_global_ref(env, env->intern(env, "set-window-point"));
+ Fset_window_start =
+ env->make_global_ref(env, env->intern(env, "set-window-start"));
+ Fwindow_body_height =
+ env->make_global_ref(env, env->intern(env, "window-body-height"));
+
Fpoint = env->make_global_ref(env, env->intern(env, "point"));
Fforward_char = env->make_global_ref(env, env->intern(env, "forward-char"));
Fget_buffer_window_list =