Api: Adding cterm color support to nvim_set_hl

This commit is contained in:
shadmansaleh
2021-03-29 09:48:07 +06:00
parent 095f5da79c
commit fdbba2ccf7
2 changed files with 38 additions and 2 deletions

View File

@@ -217,6 +217,12 @@ Dictionary nvim__get_hl_defs(Integer ns_id, Error *err)
/// in addition the following keys are also recognized: /// in addition the following keys are also recognized:
/// `default`: don't override existing definition, /// `default`: don't override existing definition,
/// like `hi default` /// like `hi default`
/// `ctermfg`: sets foreground of cterm color
/// `ctermbg`: sets background of cterm color
/// `cterm` : cterm attribute map. sets attributed for
/// cterm colors. similer to `hi cterm`
/// Note: by default cterm attributes are
/// same as attributes of gui color
/// @param[out] err Error details, if any /// @param[out] err Error details, if any
/// ///
/// TODO: ns_id = 0, should modify :highlight namespace /// TODO: ns_id = 0, should modify :highlight namespace

View File

@@ -797,8 +797,11 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err)
{ {
HlAttrs hlattrs = HLATTRS_INIT; HlAttrs hlattrs = HLATTRS_INIT;
int32_t fg = -1, bg = -1, sp = -1; int32_t fg = -1, bg = -1, ctermfg = -1, ctermbg = -1, sp = -1;
int16_t mask = 0; int16_t mask = 0;
int16_t cterm_mask = 0;
bool cterm_mask_provided = false;
for (size_t i = 0; i < dict.size; i++) { for (size_t i = 0; i < dict.size; i++) {
char *key = dict.items[i].key.data; char *key = dict.items[i].key.data;
Object val = dict.items[i].value; Object val = dict.items[i].value;
@@ -828,6 +831,24 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err)
} }
} }
// Handle cterm attrs
if (strequal(key, "cterm") && val.type == kObjectTypeDictionary){
cterm_mask_provided = true;
Dictionary cterm_dict = val.data.dictionary;
for (size_t l = 0; l < cterm_dict.size; l++){
char *cterm_dict_key = cterm_dict.items[l].key.data;
Object cterm_dict_val = cterm_dict.items[l].value;
for (int m = 0; flags[m].name; m++){
if (strequal(flags[m].name, cterm_dict_key)){
if (api_object_to_bool(cterm_dict_val, cterm_dict_key, false, err)){
cterm_mask |= flags[m].flag;
}
break;
}
}
}
}
struct { struct {
const char *name; const char *name;
const char *shortname; const char *shortname;
@@ -835,6 +856,8 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err)
} colors[] = { } colors[] = {
{ "foreground", "fg", &fg }, { "foreground", "fg", &fg },
{ "background", "bg", &bg }, { "background", "bg", &bg },
{ "ctermfg", NULL, &ctermfg },
{ "ctermbg", NULL, &ctermbg },
{ "special", "sp", &sp }, { "special", "sp", &sp },
{ NULL, NULL, NULL }, { NULL, NULL, NULL },
}; };
@@ -879,13 +902,20 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err)
} }
} }
// apply gui mask as default for cterm mask
if (!cterm_mask_provided){
cterm_mask = mask;
}
if (use_rgb) { if (use_rgb) {
hlattrs.rgb_ae_attr = mask; hlattrs.rgb_ae_attr = mask;
hlattrs.rgb_bg_color = bg; hlattrs.rgb_bg_color = bg;
hlattrs.rgb_fg_color = fg; hlattrs.rgb_fg_color = fg;
hlattrs.rgb_sp_color = sp; hlattrs.rgb_sp_color = sp;
hlattrs.cterm_bg_color = ctermbg == -1 ? cterm_normal_bg_color : ctermbg + 1;
hlattrs.cterm_fg_color = ctermfg == -1 ? cterm_normal_fg_color : ctermfg + 1;
hlattrs.cterm_ae_attr = cterm_mask;
} else { } else {
hlattrs.cterm_ae_attr = mask; hlattrs.cterm_ae_attr = cterm_mask;
hlattrs.cterm_bg_color = bg == -1 ? cterm_normal_bg_color : bg + 1; hlattrs.cterm_bg_color = bg == -1 ? cterm_normal_bg_color : bg + 1;
hlattrs.cterm_fg_color = fg == -1 ? cterm_normal_fg_color : fg + 1; hlattrs.cterm_fg_color = fg == -1 ? cterm_normal_fg_color : fg + 1;
} }