aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fürmetz <fuermetz@mailbox.org>2019-01-29 23:12:41 +0100
committerLukas Fürmetz <fuermetz@mailbox.org>2019-01-29 23:34:51 +0100
commit976c3f27b5908cedbe7d80ac2f63c00a976e82cd (patch)
tree4344c57d2678d533168d60ad92fabc05d8b517f7
parent39d4c44e3b0f2ccf788780c1701cc4b2c90a5d82 (diff)
Simplify color handling by using ansi-color-vector-names
-rw-r--r--elisp.c4
-rw-r--r--elisp.h8
-rw-r--r--vterm-module.c69
-rw-r--r--vterm.el126
4 files changed, 17 insertions, 190 deletions
diff --git a/elisp.c b/elisp.c
index 4b36125..cf4b095 100644
--- a/elisp.c
+++ b/elisp.c
@@ -36,10 +36,6 @@ emacs_value list(emacs_env *env, emacs_value elements[], ptrdiff_t len) {
return env->funcall(env, Flist, len, elements);
}
-emacs_value append(emacs_env *env, emacs_value lists[], ptrdiff_t count) {
- return env->funcall(env, Fappend, count, lists);
-}
-
void put_text_property(emacs_env *env, emacs_value string, emacs_value property,
emacs_value value) {
emacs_value start = env->make_integer(env, 0);
diff --git a/elisp.h b/elisp.h
index 8eef6ab..73ba7e8 100644
--- a/elisp.h
+++ b/elisp.h
@@ -17,13 +17,9 @@ emacs_value Qunderline;
emacs_value Qslant;
emacs_value Qreverse;
emacs_value Qstrike;
-emacs_value Qinherited;
emacs_value Qface;
emacs_value Qcursor_type;
-emacs_value Qvterm_color_default_fg;
-emacs_value Qvterm_color_default_bg;
-emacs_value Qvterm_color_palette_fg;
-emacs_value Qvterm_color_palette_bg;
+emacs_value Qansi_color_names_vector;
// Emacs functions
emacs_value Fsymbol_value;
@@ -31,7 +27,6 @@ emacs_value Flength;
emacs_value Flist;
emacs_value Ferase_buffer;
emacs_value Finsert;
-emacs_value Fappend;
emacs_value Fgoto_char;
emacs_value Fforward_char;
emacs_value Fforward_line;
@@ -56,7 +51,6 @@ emacs_value symbol_value(emacs_env *env, emacs_value symbol);
int string_bytes(emacs_env *env, emacs_value string);
emacs_value string_length(emacs_env *env, emacs_value string);
emacs_value list(emacs_env *env, emacs_value elements[], ptrdiff_t len);
-emacs_value append(emacs_env *env, emacs_value lists[], ptrdiff_t count);
void put_text_property(emacs_env *env, emacs_value string, emacs_value property,
emacs_value value);
void erase_buffer(emacs_env *env);
diff --git a/vterm-module.c b/vterm-module.c
index 14cdada..b8d4738 100644
--- a/vterm-module.c
+++ b/vterm-module.c
@@ -433,6 +433,8 @@ static emacs_value render_text(emacs_env *env, Term *term, char *buffer,
text = env->make_string(env, buffer, len);
}
+ emacs_value fg = color_to_rgb_string(env, term, &cell->fg);
+ emacs_value bg = color_to_rgb_string(env, term, &cell->bg);
emacs_value bold = cell->attrs.bold ? Qbold : Qnormal;
emacs_value underline = cell->attrs.underline ? Qt : Qnil;
emacs_value italic = cell->attrs.italic ? Qitalic : Qnormal;
@@ -442,60 +444,29 @@ static emacs_value render_text(emacs_env *env, Term *term, char *buffer,
// TODO: Blink, font, dwl, dhl is missing
emacs_value properties =
list(env,
- (emacs_value[]){Qweight, bold, Qunderline, underline, Qslant, italic,
- Qreverse, reverse, Qstrike, strike},
- 10);
-
- properties = append(
- env, (emacs_value[]){cell_to_face(env, term, cell), properties}, 2);
+ (emacs_value[]){Qforeground, fg, Qbackground, bg, Qweight, bold,
+ Qunderline, underline, Qslant, italic, Qreverse,
+ reverse, Qstrike, strike},
+ 14);
put_text_property(env, text, Qface, properties);
return text;
}
-static emacs_value cell_to_face(emacs_env *env, Term *term,
- VTermScreenCell *cell) {
- bool fg_is_face =
- VTERM_COLOR_IS_INDEXED(&cell->fg) && cell->fg.indexed.idx < 16;
- bool bg_is_face =
- VTERM_COLOR_IS_INDEXED(&cell->bg) && cell->bg.indexed.idx < 16;
-
- emacs_value palette = symbol_value(env, Qvterm_color_palette_fg);
- emacs_value fg = fg_is_face ? color_to_face(env, &cell->fg, palette)
- : color_to_rgb_string(env, term, &cell->fg);
-
- palette = symbol_value(env, Qvterm_color_palette_bg);
- emacs_value bg = bg_is_face ? color_to_face(env, &cell->bg, palette)
- : color_to_rgb_string(env, term, &cell->bg);
-
- if (fg_is_face && bg_is_face) {
- return list(env, (emacs_value[]){Qinherited, list(env, (emacs_value[]){fg, bg}, 2)}, 2);
- } else if (fg_is_face && !bg_is_face) {
- return list(env, (emacs_value[]){Qinherited, fg, Qbackground, bg}, 4);
- } else if (!fg_is_face && bg_is_face) {
- return list(env, (emacs_value[]){Qforeground, fg, Qinherited, bg}, 4);
- } else {
- return list(env, (emacs_value[]){Qforeground, fg, Qbackground, bg}, 4);
- }
-}
-
-static emacs_value color_to_face(emacs_env *env, VTermColor *color,
- emacs_value palette) {
+static emacs_value color_to_rgb_string(emacs_env *env, Term *term,
+ VTermColor *color) {
+ emacs_value palette = symbol_value(env, Qansi_color_names_vector);
if (VTERM_COLOR_IS_DEFAULT_FG(color)) {
- return Qvterm_color_default_fg;
+ return env->vec_get(env, palette, 7);
}
if (VTERM_COLOR_IS_DEFAULT_BG(color)) {
- return Qvterm_color_default_bg;
+ return env->vec_get(env, palette, 0);
}
- if (VTERM_COLOR_IS_INDEXED(color)) {
- return env->vec_get(env, palette, color->indexed.idx);
+ if (VTERM_COLOR_IS_INDEXED(color) < 16) {
+ return env->vec_get(env, palette, color->indexed.idx % 8);
}
-}
-
-static emacs_value color_to_rgb_string(emacs_env *env, Term *term,
- VTermColor *color) {
- if (VTERM_COLOR_IS_INDEXED(color)) {
+ if (VTERM_COLOR_IS_INDEXED(color) >= 16) {
VTermState *state = vterm_obtain_state(term->vt);
vterm_state_get_palette_color(state, color->indexed.idx, color);
}
@@ -720,17 +691,10 @@ int emacs_module_init(struct emacs_runtime *ert) {
Qslant = env->make_global_ref(env, env->intern(env, ":slant"));
Qreverse = env->make_global_ref(env, env->intern(env, ":inverse-video"));
Qstrike = env->make_global_ref(env, env->intern(env, ":strike-through"));
- Qinherited = env->make_global_ref(env, env->intern(env, ":inherit"));
Qface = env->make_global_ref(env, env->intern(env, "font-lock-face"));
Qcursor_type = env->make_global_ref(env, env->intern(env, "cursor-type"));
- Qvterm_color_default_fg =
- env->make_global_ref(env, env->intern(env, "vterm-color-default-fg"));
- Qvterm_color_default_bg =
- env->make_global_ref(env, env->intern(env, "vterm-color-default-bg"));
- Qvterm_color_palette_fg =
- env->make_global_ref(env, env->intern(env, "vterm-color-palette-fg"));
- Qvterm_color_palette_bg =
- env->make_global_ref(env, env->intern(env, "vterm-color-palette-bg"));
+ Qansi_color_names_vector =
+ env->make_global_ref(env, env->intern(env, "ansi-color-names-vector"));
// Functions
Fsymbol_value = env->make_global_ref(env, env->intern(env, "symbol-value"));
@@ -738,7 +702,6 @@ int emacs_module_init(struct emacs_runtime *ert) {
Flist = env->make_global_ref(env, env->intern(env, "list"));
Ferase_buffer = env->make_global_ref(env, env->intern(env, "erase-buffer"));
Finsert = env->make_global_ref(env, env->intern(env, "insert"));
- Fappend = env->make_global_ref(env, env->intern(env, "append"));
Fgoto_char = env->make_global_ref(env, env->intern(env, "goto-char"));
Fput_text_property =
env->make_global_ref(env, env->intern(env, "put-text-property"));
diff --git a/vterm.el b/vterm.el
index a5d7514..018fd4e 100644
--- a/vterm.el
+++ b/vterm.el
@@ -83,132 +83,6 @@ for different shell. "
:type 'hook
:group 'vterm)
-(defface vterm-color-default-fg
- `((t :foreground ,(aref ansi-color-names-vector 0)))
- "Foreground of the console."
- :group 'vterm)
-
-(defface vterm-color-default-bg
- `((t :background ,(aref ansi-color-names-vector 7)))
- "Background of the console."
- :group 'vterm)
-
-(defface vterm-color-black-fg
- `((t :foreground ,(aref ansi-color-names-vector 0)))
- "Face used to render black color code."
- :group 'vterm)
-
-(defface vterm-color-black-bg
- `((t :background ,(aref ansi-color-names-vector 0)))
- "Face used to render black color code."
- :group 'vterm)
-
-(defface vterm-color-red-fg
- `((t :foreground ,(aref ansi-color-names-vector 1)))
- "Face used to render red color code."
- :group 'vterm)
-
-(defface vterm-color-red-bg
- `((t :background ,(aref ansi-color-names-vector 1)))
- "Face used to render red color code."
- :group 'vterm)
-
-(defface vterm-color-green-fg
- `((t :foreground ,(aref ansi-color-names-vector 2)))
- "Face used to render green color code."
- :group 'vterm)
-
-(defface vterm-color-green-bg
- `((t :background ,(aref ansi-color-names-vector 2)))
- "Face used to render green color code."
- :group 'vterm)
-
-(defface vterm-color-yellow-fg
- `((t :foreground ,(aref ansi-color-names-vector 3)))
- "Face used to render yellow color code."
- :group 'vterm)
-
-(defface vterm-color-yellow-bg
- `((t :background ,(aref ansi-color-names-vector 3)))
- "Face used to render yellow color code."
- :group 'vterm)
-
-(defface vterm-color-blue-fg
- `((t :foreground ,(aref ansi-color-names-vector 4)))
- "Face used to render blue color code."
- :group 'vterm)
-
-(defface vterm-color-blue-bg
- `((t :background ,(aref ansi-color-names-vector 4)))
- "Face used to render yellow color code."
- :group 'vterm)
-
-(defface vterm-color-magenta-fg
- `((t :foreground ,(aref ansi-color-names-vector 5)))
- "Face used to render magenta color code."
- :group 'vterm)
-
-(defface vterm-color-magenta-bg
- `((t :background ,(aref ansi-color-names-vector 5)))
- "Face used to render magenta color code."
- :group 'vterm)
-
-(defface vterm-color-cyan-fg
- `((t :foreground ,(aref ansi-color-names-vector 6)))
- "Face used to render cyan color code."
- :group 'vterm)
-
-(defface vterm-color-cyan-bg
- `((t :background ,(aref ansi-color-names-vector 6)))
- "Face used to render cyan color code."
- :group 'vterm)
-
-(defface vterm-color-white-fg
- `((t :foreground ,(aref ansi-color-names-vector 7)))
- "Face used to render white color code."
- :group 'vterm)
-
-(defface vterm-color-white-bg
- `((t :background ,(aref ansi-color-names-vector 7)))
- "Face used to render white color code."
- :group 'vterm)
-
-(defvar vterm-color-palette-fg [vterm-color-black-fg
- vterm-color-red-fg
- vterm-color-green-fg
- vterm-color-yellow-fg
- vterm-color-blue-fg
- vterm-color-magenta-fg
- vterm-color-cyan-fg
- vterm-color-white-fg
- vterm-color-black-fg
- vterm-color-red-fg
- vterm-color-green-fg
- vterm-color-yellow-fg
- vterm-color-blue-fg
- vterm-color-magenta-fg
- vterm-color-cyan-fg
- vterm-color-white-fg]
- "Color palette for the foreground.")
-
-(defvar vterm-color-palette-bg [vterm-color-black-bg
- vterm-color-red-bg
- vterm-color-green-bg
- vterm-color-yellow-bg
- vterm-color-blue-bg
- vterm-color-magenta-bg
- vterm-color-cyan-bg
- vterm-color-white-bg
- vterm-color-black-bg
- vterm-color-red-bg
- vterm-color-green-bg
- vterm-color-yellow-bg
- vterm-color-blue-bg
- vterm-color-magenta-bg
- vterm-color-cyan-bg
- vterm-color-white-bg]
- "Color palette for the background.")
-
(defvar vterm--term nil
"Pointer to Term.")
(make-variable-buffer-local 'vterm--term)