diff options
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | elisp.c | 5 | ||||
| -rw-r--r-- | elisp.h | 3 | ||||
| -rw-r--r-- | vterm-module.c | 21 | ||||
| -rw-r--r-- | vterm.el | 40 |
5 files changed, 44 insertions, 29 deletions
@@ -529,7 +529,9 @@ is a global minor mode in Emacs, you can use `M-x blink-cursor-mode` to toggle. ## Colors -Customize the following faces to your liking. +Customize the following faces to your liking. It is possible to specify +different colors for foreground and background via the `:foreground` and +`:background` attributes. - vterm-color-black - vterm-color-red @@ -42,6 +42,7 @@ emacs_value Frecenter; emacs_value Fset_window_point; emacs_value Fwindow_body_height; emacs_value Fpoint; +emacs_value Fapply; emacs_value Fput_text_property; emacs_value Fadd_text_properties; @@ -182,9 +183,9 @@ void set_cursor_blink(emacs_env *env, bool blink) { (emacs_value[]){env->make_integer(env, blink)}); } -emacs_value vterm_get_color(emacs_env *env, int index) { +emacs_value vterm_get_color(emacs_env *env, int index, emacs_value args) { emacs_value idx = env->make_integer(env, index); - return env->funcall(env, Fvterm_get_color, 1, (emacs_value[]){idx}); + return env->funcall(env, Fapply, 3, (emacs_value[]){ Fvterm_get_color, idx, args }); } void set_title(emacs_env *env, emacs_value string) { @@ -29,6 +29,7 @@ extern emacs_value Qrear_nonsticky; extern emacs_value Qvterm_prompt; // Emacs functions +extern emacs_value Fapply; extern emacs_value Fblink_cursor_mode; extern emacs_value Fsymbol_value; extern emacs_value Flength; @@ -91,7 +92,7 @@ emacs_value selected_window(emacs_env *env); void set_title(emacs_env *env, emacs_value string); void set_directory(emacs_env *env, emacs_value string); void vterm_invalidate(emacs_env *env); -emacs_value vterm_get_color(emacs_env *env, int index); +emacs_value vterm_get_color(emacs_env *env, int index, emacs_value args); emacs_value vterm_eval(emacs_env *env, emacs_value string); emacs_value vterm_set_selection(emacs_env *env, emacs_value selection_target, emacs_value selection_data); diff --git a/vterm-module.c b/vterm-module.c index b599a37..f6ab477 100644 --- a/vterm-module.c +++ b/vterm-module.c @@ -845,18 +845,26 @@ static emacs_value cell_rgb_color(emacs_env *env, Term *term, VTermScreenCell *cell, bool is_foreground) { VTermColor *color = is_foreground ? &cell->fg : &cell->bg; + int props_len = 0; + emacs_value props[3]; + if (is_foreground) + props[props_len++] = Qforeground; + if (cell->attrs.underline) + props[props_len++] = Qunderline; + if (cell->attrs.reverse) + props[props_len++] = Qreverse; + + emacs_value args = list(env, props, props_len); + /** NOTE: -10 is used as index offset for special indexes, * see C-h f vterm--get-color RET */ - if (VTERM_COLOR_IS_DEFAULT_FG(color)) { - return vterm_get_color(env, -1 + (cell->attrs.underline ? -10 : 0)); - } - if (VTERM_COLOR_IS_DEFAULT_BG(color)) { - return vterm_get_color(env, -2 + (cell->attrs.reverse ? -10 : 0)); + if (VTERM_COLOR_IS_DEFAULT_FG(color) || VTERM_COLOR_IS_DEFAULT_BG(color)) { + return vterm_get_color(env, -1, args); } if (VTERM_COLOR_IS_INDEXED(color)) { if (color->indexed.idx < 16) { - return vterm_get_color(env, color->indexed.idx); + return vterm_get_color(env, color->indexed.idx, args); } else { VTermState *state = vterm_obtain_state(term->vt); vterm_state_get_palette_color(state, color->indexed.idx, color); @@ -1451,6 +1459,7 @@ int emacs_module_init(struct emacs_runtime *ert) { Qcursor_type = env->make_global_ref(env, env->intern(env, "cursor-type")); // Functions + Fapply = env->make_global_ref(env, env->intern(env, "apply")); Fblink_cursor_mode = env->make_global_ref(env, env->intern(env, "blink-cursor-mode")); Fsymbol_value = env->make_global_ref(env, env->intern(env, "symbol-value")); @@ -1654,25 +1654,27 @@ If N is negative backward-line from end of buffer." (when raw-pwd (vterm--get-directory raw-pwd))))) -(defun vterm--get-color (index) - "Get color by index from `vterm-color-palette'. -Argument INDEX index of the terminal color. -Special values for INDEX are: --11 foreground for cells with underline attribute, foreground of -the `vterm-color-underline' face is used in this case. --12 background for cells with inverse video attribute, background -of the `vterm-color-inverse-video' face is used in this case." - (cond - ((and (>= index 0) (< index 16)) - (face-foreground - (elt vterm-color-palette index) - nil 'default)) - ((= index -11) - (face-foreground 'vterm-color-underline nil 'default)) - ((= index -12) - (face-background 'vterm-color-inverse-video nil 'default)) - (t - nil))) +(defun vterm--get-color (index &rest args) + "Get color by INDEX from `vterm-color-palette'. + +Special INDEX of -1 is used to represent default colors. ARGS +may optionally contain `:underline' or `:inverse-video' for cells +with underline or inverse video attribute. If ARGS contains +`:foreground', use foreground color of the respective face +instead of background." + (let ((foreground (member :foreground args)) + (underline (member :underline args)) + (inverse-video (member :inverse-video args))) + (funcall (if foreground #'face-foreground #'face-background) + (cond + ((and (>= index 0) (< index 16)) + (elt vterm-color-palette index)) + ((and (= index -1) foreground underline) + 'vterm-color-underline) + ((and (= index -1) (not foreground) inverse-video) + 'vterm-color-inverse-video) + (t 'default)) + nil 'default))) (defun vterm--eval (str) "Check if string STR is `vterm-eval-cmds' and execute command. |
