diff options
Diffstat (limited to 'vterm-module.c')
| -rw-r--r-- | vterm-module.c | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/vterm-module.c b/vterm-module.c index 7d44293..edf8237 100644 --- a/vterm-module.c +++ b/vterm-module.c @@ -2,9 +2,11 @@ #include "elisp.h" #include "utf8.h" #include <assert.h> +#include <fcntl.h> #include <limits.h> #include <stdio.h> #include <string.h> +#include <termios.h> #include <unistd.h> #include <vterm.h> @@ -528,13 +530,24 @@ static void term_flush_output(Term *term, emacs_env *env) { static void term_process_key(Term *term, unsigned char *key, size_t len, VTermModifier modifier) { if (is_key(key, len, "<return>")) { - vterm_keyboard_key(term->vt, VTERM_KEY_ENTER, modifier); + if (term->pty_fd > 0) { + struct termios keys; + tcgetattr(term->pty_fd, &keys); + if (keys.c_iflag & ICRNL) + vterm_keyboard_unichar(term->vt, 10, modifier); + else + vterm_keyboard_unichar(term->vt, 13, modifier); + } else { + vterm_keyboard_key(term->vt, VTERM_KEY_ENTER, modifier); + } } else if (is_key(key, len, "<start_paste>")) { vterm_keyboard_start_paste(term->vt); } else if (is_key(key, len, "<end_paste>")) { vterm_keyboard_end_paste(term->vt); } else if (is_key(key, len, "<tab>")) { vterm_keyboard_key(term->vt, VTERM_KEY_TAB, modifier); + } else if (is_key(key, len, "<backtab>") || is_key(key, len, "<iso-lefttab>")) { + vterm_keyboard_key(term->vt, VTERM_KEY_TAB, VTERM_MOD_SHIFT); } else if (is_key(key, len, "<backspace>")) { vterm_keyboard_key(term->vt, VTERM_KEY_BACKSPACE, modifier); } else if (is_key(key, len, "<escape>")) { @@ -593,17 +606,7 @@ static void term_process_key(Term *term, unsigned char *key, size_t len, } } -static void term_put_caret(Term *term, emacs_env *env, int row, int col, - int offset) { - int rows, cols; - vterm_get_size(term->vt, &rows, &cols); - // row * (cols + 1) because of newline character - // col + 1 because (goto-char 1) sets point to first position - int point = ((row + term->sb_current) * (cols + 1)) + col + 1 + offset; - goto_char(env, point); -} - -static void term_finalize(void *object) { +void term_finalize(void *object) { Term *term = (Term *)object; for (int i = 0; i < term->sb_current; i++) { free(term->sb_buffer[i]); @@ -613,13 +616,17 @@ static void term_finalize(void *object) { term->title = NULL; } + if (term->pty_fd > 0) { + close(term->pty_fd); + } + free(term->sb_buffer); vterm_free(term->vt); free(term); } -static emacs_value Fvterm_new(emacs_env *env, ptrdiff_t nargs, - emacs_value args[], void *data) { +emacs_value Fvterm_new(emacs_env *env, ptrdiff_t nargs, emacs_value args[], + void *data) { Term *term = malloc(sizeof(Term)); int rows = env->extract_integer(env, args[0]); @@ -642,6 +649,7 @@ static emacs_value Fvterm_new(emacs_env *env, ptrdiff_t nargs, term->invalid_end = rows; term->width = cols; term->height = rows; + term->pty_fd = -1; term->title = NULL; term->is_title_changed = false; @@ -649,8 +657,8 @@ static emacs_value Fvterm_new(emacs_env *env, ptrdiff_t nargs, return env->make_user_ptr(env, term_finalize, term); } -static emacs_value Fvterm_update(emacs_env *env, ptrdiff_t nargs, - emacs_value args[], void *data) { +emacs_value Fvterm_update(emacs_env *env, ptrdiff_t nargs, emacs_value args[], + void *data) { Term *term = env->get_user_ptr(env, args[0]); // Process keys @@ -679,14 +687,15 @@ static emacs_value Fvterm_update(emacs_env *env, ptrdiff_t nargs, return env->make_integer(env, 0); } -static emacs_value Fvterm_redraw(emacs_env *env, ptrdiff_t nargs, - emacs_value args[], void *data) { +emacs_value Fvterm_redraw(emacs_env *env, ptrdiff_t nargs, emacs_value args[], + void *data) { Term *term = env->get_user_ptr(env, args[0]); term_redraw(term, env); return env->make_integer(env, 0); } -static emacs_value Fvterm_write_input(emacs_env *env, ptrdiff_t nargs, - emacs_value args[], void *data) { + +emacs_value Fvterm_write_input(emacs_env *env, ptrdiff_t nargs, + emacs_value args[], void *data) { Term *term = env->get_user_ptr(env, args[0]); ptrdiff_t len = string_bytes(env, args[1]); char bytes[len]; @@ -699,8 +708,8 @@ static emacs_value Fvterm_write_input(emacs_env *env, ptrdiff_t nargs, return env->make_integer(env, 0); } -static emacs_value Fvterm_set_size(emacs_env *env, ptrdiff_t nargs, - emacs_value args[], void *data) { +emacs_value Fvterm_set_size(emacs_env *env, ptrdiff_t nargs, emacs_value args[], + void *data) { Term *term = env->get_user_ptr(env, args[0]); int rows = env->extract_integer(env, args[1]); int cols = env->extract_integer(env, args[2]); @@ -714,6 +723,22 @@ static emacs_value Fvterm_set_size(emacs_env *env, ptrdiff_t nargs, return Qnil; } + +emacs_value Fvterm_set_pty_name(emacs_env *env, ptrdiff_t nargs, + emacs_value args[], void *data) { + Term *term = env->get_user_ptr(env, args[0]); + + if (nargs > 1) { + ptrdiff_t len = string_bytes(env, args[1]); + char filename[len]; + + env->copy_string_contents(env, args[1], filename, &len); + + term->pty_fd = open(filename, O_RDONLY); + } + return Qnil; +} + int emacs_module_init(struct emacs_runtime *ert) { emacs_env *env = ert->get_environment(ert); @@ -794,6 +819,10 @@ int emacs_module_init(struct emacs_runtime *ert) { "Sets the size of the terminal.", NULL); bind_function(env, "vterm--set-size", fun); + fun = env->make_function(env, 2, 2, Fvterm_set_pty_name, + "Sets the name of the pty.", NULL); + bind_function(env, "vterm--set-pty-name", fun); + provide(env, "vterm-module"); return 0; |
