diff options
| author | Yubao Liu <yubao.liu@gmail.com> | 2024-06-26 22:38:57 +0800 |
|---|---|---|
| committer | Gabriele Bozzola <sbozzolator@gmail.com> | 2024-07-05 08:33:04 -0700 |
| commit | d9ea29fb10aed20512bd95dc5b8c1a01684044b1 (patch) | |
| tree | 5fe70fcad4e36e9229192b2c4ce6a5426f04f8b3 /vterm-module.c | |
| parent | df057b1af2bb89a1deb288086f13be296af42090 (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.
Diffstat (limited to 'vterm-module.c')
| -rw-r--r-- | vterm-module.c | 10 |
1 files changed, 6 insertions, 4 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); } |
