diff options
| author | Lukas Fürmetz <fuermetz@mailbox.org> | 2019-08-12 17:20:18 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-08-12 17:20:18 +0200 |
| commit | fad40c1436afcf73fe39ea2ec535628866c72b23 (patch) | |
| tree | 2d03761c102de61fbd68eaefe8c80a09a211b6db | |
| parent | 8ad65fd6b27976547384ac129065ed01f8f69d01 (diff) | |
| parent | 38aa161d405121d78c880273a5beda814e7f2c8e (diff) | |
Merge pull request #127 from jixiuf/fix-scroll
fix #121 Cursor position does not update properly
| -rw-r--r-- | elisp.c | 13 | ||||
| -rw-r--r-- | elisp.h | 8 | ||||
| -rw-r--r-- | vterm-module.c | 33 |
3 files changed, 33 insertions, 21 deletions
@@ -28,18 +28,22 @@ int string_bytes(emacs_env *env, emacs_value string) { return size; } -emacs_value string_length(emacs_env *env, emacs_value string) { +emacs_value length(emacs_env *env, emacs_value string) { return env->funcall(env, Flength, 1, (emacs_value[]){string}); } emacs_value list(emacs_env *env, emacs_value elements[], ptrdiff_t len) { return env->funcall(env, Flist, len, elements); } +emacs_value nth(emacs_env *env, int idx, emacs_value list) { + emacs_value eidx = env->make_integer(env, idx); + return env->funcall(env, Fnth, 2, (emacs_value[]){eidx, list}); +} void put_text_property(emacs_env *env, emacs_value string, emacs_value property, emacs_value value) { emacs_value start = env->make_integer(env, 0); - emacs_value end = string_length(env, string); + emacs_value end = length(env, string); env->funcall(env, Fput_text_property, 5, (emacs_value[]){start, end, property, value, string}); @@ -96,8 +100,9 @@ emacs_value buffer_line_number(emacs_env *env) { return env->funcall(env, Fbuffer_line_number, 0, (emacs_value[]){}); } -emacs_value get_buffer_window(emacs_env *env) { - return env->funcall(env, Fget_buffer_window, 0, (emacs_value[]){}); +emacs_value get_buffer_window_list(emacs_env *env) { + return env->funcall(env, Fget_buffer_window_list, 3, + (emacs_value[]){Qnil, Qnil, Qt}); } emacs_value selected_window(emacs_env *env) { @@ -27,6 +27,7 @@ emacs_value Qcursor_type; emacs_value Fsymbol_value; emacs_value Flength; emacs_value Flist; +emacs_value Fnth; emacs_value Ferase_buffer; emacs_value Finsert; emacs_value Fgoto_char; @@ -42,7 +43,7 @@ emacs_value Fpoint; emacs_value Fput_text_property; emacs_value Fset; emacs_value Fvterm_flush_output; -emacs_value Fget_buffer_window; +emacs_value Fget_buffer_window_list; emacs_value Fselected_window; emacs_value Fvterm_set_title; emacs_value Fvterm_set_directory; @@ -55,8 +56,9 @@ void bind_function(emacs_env *env, const char *name, emacs_value Sfun); void provide(emacs_env *env, const char *feature); emacs_value symbol_value(emacs_env *env, emacs_value symbol); int string_bytes(emacs_env *env, emacs_value string); -emacs_value string_length(emacs_env *env, emacs_value string); +emacs_value length(emacs_env *env, emacs_value string); emacs_value list(emacs_env *env, emacs_value elements[], ptrdiff_t len); +emacs_value nth(emacs_env *env, int idx, emacs_value list); void put_text_property(emacs_env *env, emacs_value string, emacs_value property, emacs_value value); void erase_buffer(emacs_env *env); @@ -72,7 +74,7 @@ void set_window_point(emacs_env *env, emacs_value win, emacs_value point); emacs_value point(emacs_env *env); bool eq(emacs_env *env, emacs_value e1, emacs_value e2); void forward_char(emacs_env *env, emacs_value n); -emacs_value get_buffer_window(emacs_env *env); +emacs_value get_buffer_window_list(emacs_env *env); emacs_value selected_window(emacs_env *env); void set_title(emacs_env *env, emacs_value string); void set_directory(emacs_env *env, emacs_value string); diff --git a/vterm-module.c b/vterm-module.c index a4f9918..a82cf2e 100644 --- a/vterm-module.c +++ b/vterm-module.c @@ -301,20 +301,24 @@ static void adjust_topline(Term *term, emacs_env *env, long added) { bool following = buffer_lnum == cursor_lnum + added; // cursor at end? - emacs_value window = get_buffer_window(env); + emacs_value windows = get_buffer_window_list(env); emacs_value swindow = selected_window(env); - - 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 */ + 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 { - 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)) { + set_window_point(env, window, point(env)); + } } } } @@ -823,6 +827,7 @@ int emacs_module_init(struct emacs_runtime *ert) { Fsymbol_value = env->make_global_ref(env, env->intern(env, "symbol-value")); Flength = env->make_global_ref(env, env->intern(env, "length")); Flist = env->make_global_ref(env, env->intern(env, "list")); + Fnth = env->make_global_ref(env, env->intern(env, "nth")); Ferase_buffer = env->make_global_ref(env, env->intern(env, "erase-buffer")); Finsert = env->make_global_ref(env, env->intern(env, "insert")); Fgoto_char = env->make_global_ref(env, env->intern(env, "goto-char")); @@ -842,8 +847,8 @@ int emacs_module_init(struct emacs_runtime *ert) { env->make_global_ref(env, env->intern(env, "set-window-point")); 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 = - env->make_global_ref(env, env->intern(env, "get-buffer-window")); + Fget_buffer_window_list = + env->make_global_ref(env, env->intern(env, "get-buffer-window-list")); Fselected_window = env->make_global_ref(env, env->intern(env, "selected-window")); |
