aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fürmetz <fuermetz@mailbox.org>2018-11-03 14:18:19 +0100
committerLukas Fürmetz <fuermetz@mailbox.org>2018-11-03 14:18:19 +0100
commit122b4834edf3c8f332fcf763d3489d5def5fcb1f (patch)
tree0a06527445e809a5be899aea133c4793ada6095a
parente3a1505252b2fdeb4bb1aa321f211b317d2a400f (diff)
Recenter only, when buffer is the selected window
-rw-r--r--elisp.c8
-rw-r--r--elisp.h5
-rw-r--r--vterm-module.c31
3 files changed, 32 insertions, 12 deletions
diff --git a/elisp.c b/elisp.c
index 5625dfc..0cbfa5f 100644
--- a/elisp.c
+++ b/elisp.c
@@ -114,6 +114,14 @@ 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 selected_window(emacs_env *env) {
+ return env->funcall(env, Fselected_window, 0, (emacs_value[]){});
+}
+
void toggle_cursor(emacs_env *env, bool visible) {
emacs_value Qvisible = visible ? Qt : Qnil;
env->funcall(env, Fset, 2, (emacs_value[]){Qcursor_type, Qvisible});
diff --git a/elisp.h b/elisp.h
index eccfa8e..b505c40 100644
--- a/elisp.h
+++ b/elisp.h
@@ -37,6 +37,8 @@ emacs_value Fset;
emacs_value Fvterm_face_color_hex;
emacs_value Fvterm_flush_output;
emacs_value Fblink_cursor_mode;
+emacs_value Fget_buffer_window;
+emacs_value Fselected_window;
// Utils
void bind_function(emacs_env *env, const char *name, emacs_value Sfun);
@@ -63,4 +65,7 @@ emacs_value get_hex_color_bg(emacs_env *env, emacs_value face);
emacs_value buffer_line_number(emacs_env *env);
void recenter(emacs_env *env, emacs_value pos);
void forward_char(emacs_env *env, emacs_value n);
+emacs_value get_buffer_window(emacs_env *env);
+emacs_value selected_window(emacs_env *env);
+
#endif /* ELISP_H */
diff --git a/vterm-module.c b/vterm-module.c
index b25601d..1b6d630 100644
--- a/vterm-module.c
+++ b/vterm-module.c
@@ -263,28 +263,33 @@ static void refresh_scrollback(Term *term, emacs_env *env) {
static void adjust_topline(Term *term, emacs_env *env, long added) {
int height, width;
vterm_get_size(term->vt, &height, &width);
- /* FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { */
+
int buffer_lnum = env->extract_integer(env, buffer_line_number(env));
VTermState *state = vterm_obtain_state(term->vt);
VTermPos pos;
vterm_state_get_cursorpos(state, &pos);
int cursor_lnum = row_to_linenr(term, pos.row);
+
+ goto_line(env, MIN(cursor_lnum, buffer_lnum));
+ size_t offset = get_col_offset(term, pos.row, pos.col);
+ forward_char(env, env->make_integer(env, pos.col - offset));
+
+
bool following = buffer_lnum == cursor_lnum + added; // cursor at end?
- if (following) { /* || (wp == curwin && is_focused(term)) */
- // "Follow" the terminal output
- goto_line(env, MIN(cursor_lnum, buffer_lnum));
- size_t offset = get_col_offset(term, pos.row, pos.col);
- forward_char(env, env->make_integer(env, pos.col - offset));
- recenter(env, env->make_integer(env, -1)); /* make current line at the screen bottom */
+ emacs_value window = get_buffer_window(env);
+ emacs_value swindow = selected_window(env);
- } else {
- goto_line(env, MIN(cursor_lnum, buffer_lnum));
- size_t offset = get_col_offset(term, pos.row, pos.col);
- forward_char(env, env->make_integer(env, pos.col - offset));
- recenter(env, env->make_integer(env, pos.row));
+ if (swindow == window) {
+ 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));
+ }
}
}
+
static void term_redraw(Term *term, emacs_env *env) {
long ml_before = env->extract_integer(env, buffer_line_number(env));
refresh_scrollback(term, env);
@@ -642,6 +647,8 @@ int emacs_module_init(struct emacs_runtime *ert) {
env->make_global_ref(env, env->intern(env, "forward-char"));
Fblink_cursor_mode =
env->make_global_ref(env, env->intern(env, "blink-cursor-mode"));
+ Fget_buffer_window = env->make_global_ref(env, env->intern(env, "get-buffer-window"));
+ Fselected_window = env->make_global_ref(env, env->intern(env, "selected-window"));
// Faces
Qterm = env->make_global_ref(env, env->intern(env, "vterm"));