aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fürmetz <fuermetz@mailbox.org>2019-08-12 17:20:18 +0200
committerGitHub <noreply@github.com>2019-08-12 17:20:18 +0200
commitfad40c1436afcf73fe39ea2ec535628866c72b23 (patch)
tree2d03761c102de61fbd68eaefe8c80a09a211b6db
parent8ad65fd6b27976547384ac129065ed01f8f69d01 (diff)
parent38aa161d405121d78c880273a5beda814e7f2c8e (diff)
Merge pull request #127 from jixiuf/fix-scroll
fix #121 Cursor position does not update properly
-rw-r--r--elisp.c13
-rw-r--r--elisp.h8
-rw-r--r--vterm-module.c33
3 files changed, 33 insertions, 21 deletions
diff --git a/elisp.c b/elisp.c
index 4f2f106..bffeb5e 100644
--- a/elisp.c
+++ b/elisp.c
@@ -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) {
diff --git a/elisp.h b/elisp.h
index 5420728..c5f7e6d 100644
--- a/elisp.h
+++ b/elisp.h
@@ -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"));