aboutsummaryrefslogtreecommitdiff
path: root/vterm-module.c
diff options
context:
space:
mode:
Diffstat (limited to 'vterm-module.c')
-rw-r--r--vterm-module.c73
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;