diff options
| author | Lukas Fürmetz <fuermetz@mailbox.org> | 2017-07-25 23:48:04 +0200 |
|---|---|---|
| committer | Lukas Fürmetz <fuermetz@mailbox.org> | 2017-07-25 23:48:04 +0200 |
| commit | 9d6a1ea521a6c779ec09e16db8a76a2bdf7e5ae8 (patch) | |
| tree | e95021d01c2f82fb4134facf7b98278ea5564d29 | |
| parent | 7e2676d1fd69beeb08bc32b03b2f3e168c9e995c (diff) | |
Implement almost all of the attributes of libvterm
| -rw-r--r-- | vterm-module.c | 54 | ||||
| -rw-r--r-- | vterm-module.h | 3 |
2 files changed, 35 insertions, 22 deletions
diff --git a/vterm-module.c b/vterm-module.c index 9736367..de8b0ce 100644 --- a/vterm-module.c +++ b/vterm-module.c @@ -77,15 +77,38 @@ static emacs_value propertize(emacs_env *env, emacs_value string, /* * Color must be a string #RGB */ -static emacs_value color_text(emacs_env *env, emacs_value string, - emacs_value fg, emacs_value bg) { - emacs_value foreground = env->intern(env, ":foreground"); - emacs_value background = env->intern(env, ":background"); - emacs_value face = env->intern(env, "font-lock-face"); - emacs_value properties = - list(env, (emacs_value[]){foreground, fg, background, bg}, 4); - - return propertize(env, string, face, properties); +static emacs_value render_cell(emacs_env *env, VTermScreenCell cell) { + char c = cell.chars[0] == '\0' ? ' ' : cell.chars[0]; + emacs_value character = env->make_string(env, &c, 1); + + emacs_value t = env->intern(env, "t"); + emacs_value nil = env->intern(env, "nil"); + + emacs_value foreground = color_to_rgb_string(env, cell.fg); + emacs_value background = color_to_rgb_string(env, cell.bg); + emacs_value bold = cell.attrs.bold ? t : nil; + emacs_value underline = cell.attrs.underline ? t : nil; + emacs_value italic = cell.attrs.italic ? t : nil; + emacs_value reverse = cell.attrs.reverse ? t : nil; + emacs_value strike = cell.attrs.strike ? t : nil; + + // TODO: Blink, font, dwl, dhl is missing + emacs_value Qforeground = env->intern(env, ":foreground"); + emacs_value Qbackground = env->intern(env, ":background"); + emacs_value Qbold = env->intern(env, ":bold"); + emacs_value Qunderline = env->intern(env, ":underline"); + emacs_value Qitalic = env->intern(env, ":italic"); + emacs_value Qreverse = env->intern(env, ":inverse-video"); + emacs_value Qstrike = env->intern(env, ":strike-through"); + + emacs_value Qface = env->intern(env, "font-lock-face"); + emacs_value properties = list( + env, (emacs_value[]){Qforeground, foreground, Qbackground, background, + Qbold, bold, Qunderline, underline, Qitalic, italic, + Qreverse, reverse, Qstrike, strike}, + 14); + + return propertize(env, character, Qface, properties); } static void byte_to_hex(uint8_t byte, char *hex) { @@ -133,17 +156,8 @@ static void vterm_redraw(VTerm *vt, emacs_env *env) { VTermScreenCell cell; vterm_screen_get_cell(screen, pos, &cell); - char c; - if (cell.chars[0] == '\0') - c = ' '; - else - c = cell.chars[0]; - - emacs_value string = env->make_string(env, &c, 1); - emacs_value fg = color_to_rgb_string(env, cell.fg); - emacs_value bg = color_to_rgb_string(env, cell.bg); - emacs_value colored_text = color_text(env, string, fg, bg); - insert(env, colored_text); + emacs_value character = render_cell(env, cell); + insert(env, character); } insert(env, env->make_string(env, "\n", 1)); diff --git a/vterm-module.h b/vterm-module.h index 6f42632..dfd9eb0 100644 --- a/vterm-module.h +++ b/vterm-module.h @@ -17,8 +17,7 @@ static emacs_value string_length(emacs_env *env, emacs_value string); static emacs_value list(emacs_env *env, emacs_value *elements, ptrdiff_t len); static emacs_value propertize(emacs_env *env, emacs_value string, emacs_value prop, emacs_value properties); -static emacs_value color_text(emacs_env *env, emacs_value string, - emacs_value fg, emacs_value bg); +static emacs_value render_cell(emacs_env *env, VTermScreenCell cell); static void byte_to_hex(uint8_t byte, char *hex); static emacs_value color_to_rgb_string(emacs_env *env, VTermColor color); static void erase_buffer(emacs_env *env); |
