From 5e36ebdef86ad3571dee1af14f6b538c7064dd8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 12 Aug 2020 18:53:32 +0200 Subject: [PATCH] config: make selection foreground/background colors configurable The default is still to inverse the regular foreground/background colors. If the user sets *both* of the new options, selection-foreground and selection-background, those colors will *always* be used for selected cells, instead of inverting the regular foreground/background colors. --- CHANGELOG.md | 2 ++ config.c | 9 +++++++++ config.h | 3 +++ doc/footrc.5.scd | 5 +++++ footrc | 2 ++ render.c | 20 ++++++++++++-------- 6 files changed, 33 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aac7cfa..2aaa8848 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ * **mouse.hide-when-typing** option to `footrc`. * **scrollback.multiplier** option to `footrc` (https://codeberg.org/dnkl/foot/issues/54). +* **colors.selection-foreground** and **colors.selection-background** + options to `footrc`. ### Deprecated diff --git a/config.c b/config.c index aeea91b5..46edf31c 100644 --- a/config.c +++ b/config.c @@ -474,6 +474,8 @@ parse_section_colors(const char *key, const char *value, struct config *conf, else if (strcmp(key, "bright5") == 0) color = &conf->colors.bright[5]; else if (strcmp(key, "bright6") == 0) color = &conf->colors.bright[6]; else if (strcmp(key, "bright7") == 0) color = &conf->colors.bright[7]; + else if (strcmp(key, "selection-foreground") == 0) color = &conf->colors.selection_fg; + else if (strcmp(key, "selection-background") == 0) color = &conf->colors.selection_bg; else if (strcmp(key, "alpha") == 0) { double alpha; if (!str_to_double(value, &alpha) || alpha < 0. || alpha > 1.) { @@ -1257,6 +1259,9 @@ config_load(struct config *conf, const char *conf_path, bool errors_are_fatal) default_bright[7], }, .alpha = 0xffff, + .selection_fg = 0x80000000, /* Use default bg */ + .selection_bg = 0x80000000, /* Use default fg */ + .selection_uses_custom_colors = false, }, .cursor = { @@ -1373,6 +1378,10 @@ config_load(struct config *conf, const char *conf_path, bool errors_are_fatal) ret = parse_config_file(f, conf, conf_path, errors_are_fatal); fclose(f); + conf->colors.selection_uses_custom_colors = + conf->colors.selection_fg >> 24 == 0 && + conf->colors.selection_bg >> 24 == 0; + out: if (ret && tll_length(conf->fonts) == 0) tll_push_back(conf->fonts, config_font_parse("monospace")); diff --git a/config.h b/config.h index 0c105cda..3c7ff1ae 100644 --- a/config.h +++ b/config.h @@ -70,6 +70,9 @@ struct config { uint32_t regular[8]; uint32_t bright[8]; uint16_t alpha; + uint32_t selection_fg; + uint32_t selection_bg; + bool selection_uses_custom_colors; } colors; struct { diff --git a/doc/footrc.5.scd b/doc/footrc.5.scd index 8e45e6a2..df4993ed 100644 --- a/doc/footrc.5.scd +++ b/doc/footrc.5.scd @@ -156,6 +156,11 @@ _alpha_ option. Background translucency. A value in the range 0.0-1.0, where 0.0 means completely transparent, and 1.0 is opaque. Default: _1.0_. +*selection-foreground*, *selection-background* + Foreground (text) and background color to use in selected + text. Note that *both* options must be set, or the default will be + used. Default: _inverse foreground/background_. + # SECTION: csd diff --git a/footrc b/footrc index 81fddde1..ec36bbc1 100644 --- a/footrc +++ b/footrc @@ -43,6 +43,8 @@ # bright5=fcace3 # bright magenta # bright6=b3ffff # bright cyan # bright7=ffffff # bright white +# selection-foreground= +# selection-background= [csd] # preferred=server diff --git a/render.c b/render.c index 5cc82ed1..db611a50 100644 --- a/render.c +++ b/render.c @@ -384,15 +384,19 @@ render_cell(struct terminal *term, pixman_image_t *pix, uint32_t _fg = 0; uint32_t _bg = 0; - /* Use cell specific color, if set, otherwise the default colors (possible reversed) */ - _fg = cell->attrs.have_fg ? cell->attrs.fg : term->colors.fg; - _bg = cell->attrs.have_bg ? cell->attrs.bg : term->colors.bg; + if (is_selected && term->conf->colors.selection_uses_custom_colors) { + _fg = term->conf->colors.selection_fg; + _bg = term->conf->colors.selection_bg; + } else { + /* Use cell specific color, if set, otherwise the default colors (possible reversed) */ + _fg = cell->attrs.have_fg ? cell->attrs.fg : term->colors.fg; + _bg = cell->attrs.have_bg ? cell->attrs.bg : term->colors.bg; - /* If *one* is set, we reverse */ - if (term->reverse ^ cell->attrs.reverse ^ is_selected) { - uint32_t swap = _fg; - _fg = _bg; - _bg = swap; + if (term->reverse ^ cell->attrs.reverse ^ is_selected) { + uint32_t swap = _fg; + _fg = _bg; + _bg = swap; + } } if (cell->attrs.blink && term->blink.state == BLINK_OFF)