diff options
| author | jixiuf <jixiuf@qq.com> | 2020-02-01 00:57:07 +0800 |
|---|---|---|
| committer | jixiuf <jixiuf@qq.com> | 2020-02-01 11:13:54 +0800 |
| commit | 9c21014efd1cc14a486d894ffa5734c72a131442 (patch) | |
| tree | 7fb67eb72acc68128b34ad70298330965b2a36d3 /vterm-module.c | |
| parent | 4fbf8f89ff0852f2ef7670f426cd7030d65a9223 (diff) | |
fix adjust_topline fix #222
Diffstat (limited to 'vterm-module.c')
| -rw-r--r-- | vterm-module.c | 34 |
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 = |
