aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYubao Liu <yubao.liu@gmail.com>2024-06-26 22:38:57 +0800
committerGabriele Bozzola <sbozzolator@gmail.com>2024-07-05 08:33:04 -0700
commitd9ea29fb10aed20512bd95dc5b8c1a01684044b1 (patch)
tree5fe70fcad4e36e9229192b2c4ce6a5426f04f8b3
parentdf057b1af2bb89a1deb288086f13be296af42090 (diff)
don't garble partial multi-byte character after control sequence
When use [lf](https://github.com/gokcehan/lf) to list files, emacs-libvterm may read partial multi-byte character, for example: $ echo -n '招聘' | hexdump -C 00000000 e6 8b 9b e8 81 98 ; get "招", control sequence and partial character (vterm--filter process "\xE6\x8B\x9B\e[14;111H\xE8") ; now full "聘" (vterm--filter process "\x81\x98") This will send "\xE8" to libvterm which is not a full character.
-rw-r--r--vterm-module.c10
-rw-r--r--vterm.el2
2 files changed, 7 insertions, 5 deletions
diff --git a/vterm-module.c b/vterm-module.c
index 05f40f0..2294ef4 100644
--- a/vterm-module.c
+++ b/vterm-module.c
@@ -1345,12 +1345,14 @@ 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];
- env->copy_string_contents(env, args[1], bytes, &len);
+ if (len > 0) {
+ char bytes[len];
+ env->copy_string_contents(env, args[1], bytes, &len);
- vterm_input_write(term->vt, bytes, len);
- vterm_screen_flush_damage(term->vts);
+ vterm_input_write(term->vt, bytes, len);
+ vterm_screen_flush_damage(term->vts);
+ }
return env->make_integer(env, 0);
}
diff --git a/vterm.el b/vterm.el
index 04c9058..fff90f2 100644
--- a/vterm.el
+++ b/vterm.el
@@ -1522,7 +1522,7 @@ Then triggers a redraw from the module."
(- count 1 partial)))
'eight-bit))
(cl-incf partial))
- (when (> count partial 0)
+ (when (> (1+ count) partial 0)
(setq vterm--undecoded-bytes
(substring decoded-substring (- partial)))
(setq decoded-substring