config: add [colors-dark] and [colors-light], replacing [colors] and [colors2]

The main reason for having two color sections is to be able to switch
between dark and light. Thus, it's better if the section names reflect
this, rather than the more generic 'colors' and 'colors2' (which was
the dark one and which was the light one, now again?)

When the second color section was added, we kept the original name,
colors, to make sure we didn't break existing configurations, and
third-party themes.

However, in the long run, it's probably better to be specific in the
section naming, to avoid confusion.

So, add 'colors-dark', and 'colors-light'. Keep 'colors' and 'colors2'
as aliases for now, but mark them as deprecated. They WILL be removed
in a future release.

Also rename the option values for initial-color-theme, from 1/2, to
dark/light. Keep the old ones for now, marked as deprecated.

Update all bundled themes to use the new names. In the light-only
themes (i.e. themes that define a single, light, theme), use
colors-light, and set initial-color-theme=light.

Possible improvements: disable color switching if only one color
section has been explicitly configured (todo: figure out how to handle
the default color theme values...)
This commit is contained in:
Daniel Eklöf 2025-12-19 09:29:06 +01:00
parent 4e96780eef
commit cf2b390f6e
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
103 changed files with 542 additions and 298 deletions

View file

@ -74,6 +74,8 @@
`foot` and `footclient`), allowing you to set a custom toplevel
tag. The compositor must implement the new `xdg-toplevel-tag-v1`
Wayland protocol ([#2212][2212]).
* `[colors-dark]` section to `foot.ini`. Replaces `[colors]`.
* `[colors-light]` section to `foot.ini`. Replaces `[colors2]`.
[2212]: https://codeberg.org/dnkl/foot/issues/2212
@ -93,6 +95,11 @@
### Deprecated
* `[colors]` section in `foot.ini`. Use `[colors-dark]` instead.
* `[colors2]` section in `foot.ini`. Use `[colors-light]` instead.
### Removed
### Fixed

128
config.c
View file

@ -144,6 +144,8 @@ static const char *const binding_action_map[] = {
[BIND_ACTION_REGEX_COPY] = "regex-copy",
[BIND_ACTION_THEME_SWITCH_1] = "color-theme-switch-1",
[BIND_ACTION_THEME_SWITCH_2] = "color-theme-switch-2",
[BIND_ACTION_THEME_SWITCH_DARK] = "color-theme-switch-dark",
[BIND_ACTION_THEME_SWITCH_LIGHT] = "color-theme-switch-light",
[BIND_ACTION_THEME_TOGGLE] = "color-theme-toggle",
/* Mouse-specific actions */
@ -1118,8 +1120,40 @@ parse_section_main(struct context *ctx)
sizeof(conf->initial_color_theme) == sizeof(int),
"enum is not 32-bit");
return value_to_enum(ctx, (const char*[]){"1", "2", NULL},
(int *)&conf->initial_color_theme);
if (!value_to_enum(ctx, (const char*[]){
"dark", "light", "1", "2", NULL},
(int *)&conf->initial_color_theme))
return false;
if (streq(ctx->value, "1")) {
LOG_WARN("%s:%d: [main].initial-color-theme=1 deprecated, "
"use [main].initial-color-theme=dark instead",
ctx->path, ctx->lineno);
user_notification_add(
&ctx->conf->notifications,
USER_NOTIFICATION_DEPRECATED,
xstrdup("[main].initial-color-theme=1: "
"use [main].initial-color-theme=dark instead"));
conf->initial_color_theme = COLOR_THEME_DARK;
}
else if (streq(ctx->value, "2")) {
LOG_WARN("%s:%d: [main].initial-color-theme=2 deprecated, "
"use [main].initial-color-theme=light instead",
ctx->path, ctx->lineno);
user_notification_add(
&ctx->conf->notifications,
USER_NOTIFICATION_DEPRECATED,
xstrdup("[main].initial-color-theme=2: "
"use [main].initial-color-theme=light instead"));
conf->initial_color_theme = COLOR_THEME_LIGHT;
}
return true;
}
else if (streq(key, "uppercase-regex-insert"))
@ -1555,16 +1589,44 @@ parse_color_theme(struct context *ctx, struct color_theme *theme)
return true;
}
static bool
parse_section_colors_dark(struct context *ctx)
{
return parse_color_theme(ctx, &ctx->conf->colors_dark);
}
static bool
parse_section_colors_light(struct context *ctx)
{
return parse_color_theme(ctx, &ctx->conf->colors_light);
}
static bool
parse_section_colors(struct context *ctx)
{
return parse_color_theme(ctx, &ctx->conf->colors);
LOG_WARN("%s:%d: [colors]: deprecated; use [colors-dark] instead",
ctx->path, ctx->lineno);
user_notification_add(
&ctx->conf->notifications,
USER_NOTIFICATION_DEPRECATED,
xstrdup("[colors]: use [colors-dark] instead"));
return parse_color_theme(ctx, &ctx->conf->colors_dark);
}
static bool
parse_section_colors2(struct context *ctx)
{
return parse_color_theme(ctx, &ctx->conf->colors2);
LOG_WARN("%s:%d: [colors2]: deprecated; use [colors-light] instead",
ctx->path, ctx->lineno);
user_notification_add(
&ctx->conf->notifications,
USER_NOTIFICATION_DEPRECATED,
xstrdup("[colors2]: use [colors-light] instead"));
return parse_color_theme(ctx, &ctx->conf->colors_light);
}
static bool
@ -1610,14 +1672,14 @@ parse_section_cursor(struct context *ctx)
if (!value_to_two_colors(
ctx,
&conf->colors.cursor.text,
&conf->colors.cursor.cursor,
&conf->colors_dark.cursor.text,
&conf->colors_dark.cursor.cursor,
false))
{
return false;
}
conf->colors.use_custom.cursor = true;
conf->colors_dark.use_custom.cursor = true;
return true;
}
@ -2268,6 +2330,29 @@ parse_key_binding_section(struct context *ctx,
aux.regex_name = regex_name;
}
if (action_map == binding_action_map &&
action >= BIND_ACTION_THEME_SWITCH_1 &&
action <= BIND_ACTION_THEME_SWITCH_2)
{
const char *use_instead =
action_map[action == BIND_ACTION_THEME_SWITCH_1
? BIND_ACTION_THEME_SWITCH_DARK
: BIND_ACTION_THEME_SWITCH_LIGHT];
const char *notif = action == BIND_ACTION_THEME_SWITCH_1
? "[key-bindings].color-theme-switch-1: use [key-bindings].color-theme-switch-dark instead"
: "[key-bindings].color-theme-switch-2: use [key-bindings].color-theme-switch-light instead";
LOG_WARN("%s:%d: [key-bindings].%s: deprecated, use %s instead",
ctx->path, ctx->lineno,
action_map[action], use_instead);
user_notification_add(
&ctx->conf->notifications,
USER_NOTIFICATION_DEPRECATED,
xstrdup(notif));
}
if (!value_to_key_combos(ctx, action, &aux, bindings, KEY_BINDING)) {
free_binding_aux(&aux);
return false;
@ -2958,8 +3043,8 @@ enum section {
SECTION_SCROLLBACK,
SECTION_URL,
SECTION_REGEX,
SECTION_COLORS,
SECTION_COLORS2,
SECTION_COLORS_DARK,
SECTION_COLORS_LIGHT,
SECTION_CURSOR,
SECTION_MOUSE,
SECTION_CSD,
@ -2971,6 +3056,11 @@ enum section {
SECTION_ENVIRONMENT,
SECTION_TWEAK,
SECTION_TOUCH,
/* Deprecated */
SECTION_COLORS,
SECTION_COLORS2,
SECTION_COUNT,
};
@ -2989,8 +3079,8 @@ static const struct {
[SECTION_SCROLLBACK] = {&parse_section_scrollback, "scrollback"},
[SECTION_URL] = {&parse_section_url, "url"},
[SECTION_REGEX] = {&parse_section_regex, "regex", true},
[SECTION_COLORS] = {&parse_section_colors, "colors"},
[SECTION_COLORS2] = {&parse_section_colors2, "colors2"},
[SECTION_COLORS_DARK] = {&parse_section_colors_dark, "colors-dark"},
[SECTION_COLORS_LIGHT] = {&parse_section_colors_light, "colors-light"},
[SECTION_CURSOR] = {&parse_section_cursor, "cursor"},
[SECTION_MOUSE] = {&parse_section_mouse, "mouse"},
[SECTION_CSD] = {&parse_section_csd, "csd"},
@ -3002,6 +3092,10 @@ static const struct {
[SECTION_ENVIRONMENT] = {&parse_section_environment, "environment"},
[SECTION_TWEAK] = {&parse_section_tweak, "tweak"},
[SECTION_TOUCH] = {&parse_section_touch, "touch"},
/* Deprecated */
[SECTION_COLORS] = {&parse_section_colors, "colors"},
[SECTION_COLORS2] = {&parse_section_colors2, "colors2"},
};
static_assert(ALEN(section_info) == SECTION_COUNT, "section info array size mismatch");
@ -3435,7 +3529,7 @@ config_load(struct config *conf, const char *conf_path,
},
.multiplier = 3.,
},
.colors = {
.colors_dark = {
.fg = default_foreground,
.bg = default_background,
.flash = 0x7f7f00,
@ -3455,7 +3549,7 @@ config_load(struct config *conf, const char *conf_path,
.url = false,
},
},
.initial_color_theme = COLOR_THEME1,
.initial_color_theme = COLOR_THEME_DARK,
.cursor = {
.style = CURSOR_BLOCK,
.unfocused_style = CURSOR_UNFOCUSED_HOLLOW,
@ -3535,10 +3629,10 @@ config_load(struct config *conf, const char *conf_path,
.notifications = tll_init(),
};
memcpy(conf->colors.table, default_color_table, sizeof(default_color_table));
memcpy(conf->colors.sixel, default_sixel_colors, sizeof(default_sixel_colors));
memcpy(&conf->colors2, &conf->colors, sizeof(conf->colors));
conf->colors2.dim_blend_towards = DIM_BLEND_TOWARDS_WHITE;
memcpy(conf->colors_dark.table, default_color_table, sizeof(default_color_table));
memcpy(conf->colors_dark.sixel, default_sixel_colors, sizeof(default_sixel_colors));
memcpy(&conf->colors_light, &conf->colors_dark, sizeof(conf->colors_dark));
conf->colors_light.dim_blend_towards = DIM_BLEND_TOWARDS_WHITE;
parse_modifiers(XKB_MOD_NAME_SHIFT, 5, &conf->mouse.selection_override_modifiers);

View file

@ -195,8 +195,10 @@ struct color_theme {
};
enum which_color_theme {
COLOR_THEME1,
COLOR_THEME2,
COLOR_THEME_DARK,
COLOR_THEME_LIGHT,
COLOR_THEME_1, /* Deprecated */
COLOR_THEME_2, /* Deprecated */
};
enum shm_bit_depth {
@ -327,8 +329,8 @@ struct config {
tll(struct custom_regex) custom_regexes;
struct color_theme colors;
struct color_theme colors2;
struct color_theme colors_dark;
struct color_theme colors_light;
enum which_color_theme initial_color_theme;
struct {

2
csi.c
View file

@ -1578,7 +1578,7 @@ csi_dispatch(struct terminal *term, uint8_t final)
int chars = snprintf(
reply, sizeof(reply),
"\033[?997;%dn",
term->colors.active_theme == COLOR_THEME1 ? 1 : 2);
term->colors.active_theme == COLOR_THEME_DARK ? 1 : 2);
term_to_slave(term, reply, chars);
break;

View file

@ -695,8 +695,8 @@ variables to unset may be defined in *foot.ini*(5).
The following signals have special meaning in foot:
- SIGUSR1: switch to color theme 1 (i.e. use the *[colors]* section).
- SIGUSR2: switch to color theme 2 (i.e. use the *[colors2]* section).
- SIGUSR1: switch to the dark color theme (*[colors-dark]*).
- SIGUSR2: switch to the light color theme (*[colors-light]*).
Note: you can send SIGUSR1/SIGUSR2 to a *foot --server* process too,
in which case all client instances will switch theme. Furthermore, all

View file

@ -24,7 +24,7 @@ commented out will usually be installed to */etc/xdg/foot/foot.ini*.
Options are set using KEY=VALUE pairs:
*\[colors\]*++
*\[colors-dark\]*++
*background=000000*++
*foreground=ffffff*
@ -371,12 +371,12 @@ empty string to be set, but it must be quoted: *KEY=""*)
Default: _yes_
*initial-color-theme*
Selects which color theme to use, *1*, or *2*.
Selects which color theme to use, *dark*, or *light*.
*1* uses the colors defined in the *colors* section, while *2*
uses the colors from the *colors2* section.
*dark* uses the colors defined in the *colors-dark* section, while
*light* uses the colors from the *colors-light* section.
Use the *color-theme-switch-1*, *color-theme-switch-2* and
Use the *color-theme-switch-dark*, *color-theme-switch-light* and
*color-theme-toggle* key bindings to switch between the two themes
at runtime, or send SIGUSR1/SIGUSR2 to the foot process (see
*foot*(1) for details).
@ -987,19 +987,24 @@ applications can change these at runtime.
Default: _400_.
# SECTION: colors
# SECTION: colors-dark, colors-light
This section controls the 16 ANSI colors, the default foreground and
background colors, and the extended 256 color palette. Note that
These two sections controls the 16 ANSI colors, the default foreground
and background colors, and the extended 256 color palette. Note that
applications can change these at runtime.
The colors are in RRGGBB format (i.e. plain old 6-digit hex values,
without prefix). That is, they do *not* have an alpha component. You
can configure the background transparency with the _alpha_ option.
In the context of private mode 2031 (Dark and Light Mode detection),
the primary theme (i.e. the *colors* section) is considered to be the
dark theme (since the default theme is dark).
*colors-dark* is intended to define a dark color theme, and
*colors-light* is intended to define a light color theme. You can
switch between them using the *color-theme-switch-dark*,
*color-theme-switch-light* and *color-theme-toggle* key bindings, or
by sending SIGUSR1/SIGUSR2 to the foot process.
The default theme used is *colors-dark*, unless
*initial-color-theme=light* has been set.
*cursor*
Two space separated RRGGBB values (i.e. plain old 6-digit hex
@ -1098,7 +1103,7 @@ dark theme (since the default theme is dark).
black makes the text darker, while blending towards white makes it
whiter (but still dimmer than normal text).
Default: _black_ (*colors*), _white_ (*colors2*)
Default: _black_ (*colors-dark*), _white_ (*colors-light*)
*selection-foreground*, *selection-background*
Foreground (text) and background color to use in selected
@ -1135,20 +1140,6 @@ dark theme (since the default theme is dark).
Flash translucency. A value in the range 0.0-1.0, where 0.0 means
completely transparent, and 1.0 is opaque. Default: _0.5_.
# SECTION: colors2
This section defines an alternative color theme. It has the exact same
keys as the *colors* section. The default values are the same, except
for *dim-blend-towards*, which defaults to *white* instead.
Note that values are not inherited. That is, if you set a value in
*colors*, but not in *colors2*, the value from *colors* is not
inherited by *colors2*.
In the context of private mode 2031 (Dark and Light Mode detection),
the alternative theme (i.e. the *colors2* section) is considered to be
the light theme (since the default, the primary theme, is dark).
# SECTION: csd
This section controls the look of the _CSDs_ (Client Side
@ -1455,16 +1446,16 @@ e.g. *search-start=none*.
Default: _Control+Shift+u_.
*color-theme-switch-1*, *color-theme-switch-2*, *color-theme-toggle*
Switch between the primary color theme (defined in the *colors*
section), and the alternative color theme (defined in the
*colors2* section).
*color-theme-switch-dark*, *color-theme-switch-dark*, *color-theme-toggle*
Switch between the dark color theme (defined in the *colors-dark*
section), and the light color theme (defined in the *colors-light*
section).
*color-theme-switch-1* applies the primary color theme regardless
*color-theme-switch-dark* applies the dark color theme regardless
of which color theme is currently active.
*color-theme-switch-2* applies the alternative color theme regardless
of which color theme is currently active.
*color-theme-switch-light* applies the light color theme
regardless of which color theme is currently active.
*color-theme-toggle* toggles between the primary and alternative
color themes.

View file

@ -198,8 +198,8 @@ variables to unset may be defined in *foot.ini*(5).
The following signals have special meaning in footclient:
- SIGUSR1: switch to color theme 1 (i.e. use the *[colors]* section).
- SIGUSR2: switch to color theme 2 (i.e. use the *[colors2]* section).
- SIGUSR1: switch to the dark color theme (*[colors-dark]*).
- SIGUSR2: switch to the light color theme (*[colors-light]*).
When sending SIGUSR1/SIGUSR2 to a footclient instance, the theme is
changed in that instance only. This is different from when you send

View file

@ -24,7 +24,7 @@
# dpi-aware=no
# gamma-correct-blending=no
# initial-color-theme=1
# initial-color-theme=dark
# initial-window-size-pixels=700x500 # Or,
# initial-window-size-chars=<COLSxROWS>
# initial-window-mode=windowed
@ -101,7 +101,7 @@
[touch]
# long-press-delay=400
[colors]
[colors-dark]
# alpha=1.0
# alpha-mode=default # Can be `default`, `matching` or `all`
# background=242424
@ -169,7 +169,7 @@
# search-box-match=<regular0> <regular3> # black-on-yellow
# urls=<regular3>
[colors2]
[colors-light]
# Alternative color theme, see man page foot.ini(5)
# Same builtin defaults as [color], except for:
# dim-blend-towards=white

View file

@ -486,11 +486,13 @@ execute_binding(struct seat *seat, struct terminal *term,
return true;
case BIND_ACTION_THEME_SWITCH_1:
term_theme_switch_to_1(term);
case BIND_ACTION_THEME_SWITCH_DARK:
term_theme_switch_to_dark(term);
return true;
case BIND_ACTION_THEME_SWITCH_2:
term_theme_switch_to_2(term);
case BIND_ACTION_THEME_SWITCH_LIGHT:
term_theme_switch_to_light(term);
return true;
case BIND_ACTION_THEME_TOGGLE:

View file

@ -45,6 +45,8 @@ enum bind_action_normal {
BIND_ACTION_REGEX_COPY,
BIND_ACTION_THEME_SWITCH_1,
BIND_ACTION_THEME_SWITCH_2,
BIND_ACTION_THEME_SWITCH_DARK,
BIND_ACTION_THEME_SWITCH_LIGHT,
BIND_ACTION_THEME_TOGGLE,
/* Mouse specific actions - i.e. they require a mouse coordinate */

8
main.c
View file

@ -59,14 +59,14 @@ fdm_sigusr(struct fdm *fdm, int signo, void *data)
if (ctx->server != NULL) {
if (signo == SIGUSR1)
server_global_theme_switch_to_1(ctx->server);
server_global_theme_switch_to_dark(ctx->server);
else
server_global_theme_switch_to_2(ctx->server);
server_global_theme_switch_to_light(ctx->server);
} else {
if (signo == SIGUSR1)
term_theme_switch_to_1(ctx->term);
term_theme_switch_to_dark(ctx->term);
else
term_theme_switch_to_2(ctx->term);
term_theme_switch_to_light(ctx->term);
}
return true;

44
osc.c
View file

@ -1459,9 +1459,9 @@ osc_dispatch(struct terminal *term)
case 11:
term->colors.bg = color;
if (!have_alpha) {
alpha = term->colors.active_theme == COLOR_THEME1
? term->conf->colors.alpha
: term->conf->colors2.alpha;
alpha = term->colors.active_theme == COLOR_THEME_DARK
? term->conf->colors_dark.alpha
: term->conf->colors_light.alpha;
}
const bool changed = term->colors.alpha != alpha;
@ -1516,9 +1516,9 @@ osc_dispatch(struct terminal *term)
/* Reset Color Number 'c' (whole table if no parameter) */
const struct color_theme *theme =
term->colors.active_theme == COLOR_THEME1
? &term->conf->colors
: &term->conf->colors2;
term->colors.active_theme == COLOR_THEME_DARK
? &term->conf->colors_dark
: &term->conf->colors_light;
if (string[0] == '\0') {
LOG_DBG("resetting all colors");
@ -1559,9 +1559,9 @@ osc_dispatch(struct terminal *term)
LOG_DBG("resetting foreground color");
const struct color_theme *theme =
term->colors.active_theme == COLOR_THEME1
? &term->conf->colors
: &term->conf->colors2;
term->colors.active_theme == COLOR_THEME_DARK
? &term->conf->colors_dark
: &term->conf->colors_light;
term->colors.fg = theme->fg;
term_damage_color(term, COLOR_DEFAULT, 0);
@ -1571,9 +1571,9 @@ osc_dispatch(struct terminal *term)
LOG_DBG("resetting background color");
const struct color_theme *theme =
term->colors.active_theme == COLOR_THEME1
? &term->conf->colors
: &term->conf->colors2;
term->colors.active_theme == COLOR_THEME_DARK
? &term->conf->colors_dark
: &term->conf->colors_light;
bool alpha_changed = term->colors.alpha != theme->alpha;
@ -1594,14 +1594,14 @@ osc_dispatch(struct terminal *term)
LOG_DBG("resetting cursor color");
const struct color_theme *theme =
term->colors.active_theme == COLOR_THEME1
? &term->conf->colors
: &term->conf->colors2;
term->colors.active_theme == COLOR_THEME_DARK
? &term->conf->colors_dark
: &term->conf->colors_light;
term->colors.cursor_fg = theme->cursor.text;
term->colors.cursor_bg = theme->cursor.cursor;
if (term->conf->colors.use_custom.cursor) {
if (term->conf->colors_dark.use_custom.cursor) {
term->colors.cursor_fg |= 1u << 31;
term->colors.cursor_bg |= 1u << 31;
}
@ -1614,9 +1614,9 @@ osc_dispatch(struct terminal *term)
LOG_DBG("resetting selection background color");
const struct color_theme *theme =
term->colors.active_theme == COLOR_THEME1
? &term->conf->colors
: &term->conf->colors2;
term->colors.active_theme == COLOR_THEME_DARK
? &term->conf->colors_dark
: &term->conf->colors_light;
term->colors.selection_bg = theme->selection_bg;
break;
@ -1626,9 +1626,9 @@ osc_dispatch(struct terminal *term)
LOG_DBG("resetting selection foreground color");
const struct color_theme *theme =
term->colors.active_theme == COLOR_THEME1
? &term->conf->colors
: &term->conf->colors2;
term->colors.active_theme == COLOR_THEME_DARK
? &term->conf->colors_dark
: &term->conf->colors_light;
term->colors.selection_fg = theme->selection_fg;
break;

View file

@ -293,7 +293,7 @@ static inline uint32_t
color_dim(const struct terminal *term, uint32_t color)
{
const struct config *conf = term->conf;
const uint8_t custom_dim = conf->colors.use_custom.dim;
const uint8_t custom_dim = conf->colors_dark.use_custom.dim;
if (unlikely(custom_dim != 0)) {
for (size_t i = 0; i < 8; i++) {
@ -302,7 +302,7 @@ color_dim(const struct terminal *term, uint32_t color)
if (term->colors.table[0 + i] == color) {
/* "Regular" color, return the corresponding "dim" */
return conf->colors.dim[i];
return conf->colors_dark.dim[i];
}
else if (term->colors.table[8 + i] == color) {
@ -312,9 +312,9 @@ color_dim(const struct terminal *term, uint32_t color)
}
}
const struct color_theme *theme = term->colors.active_theme == COLOR_THEME1
? &conf->colors
: &conf->colors2;
const struct color_theme *theme = term->colors.active_theme == COLOR_THEME_DARK
? &conf->colors_dark
: &conf->colors_light;
return color_blend_towards(
color,
@ -776,7 +776,7 @@ render_cell(struct terminal *term, pixman_image_t *pix,
}
else if (!term->window->is_fullscreen && term->colors.alpha != 0xffff) {
switch (term->conf->colors.alpha_mode) {
switch (term->conf->colors_dark.alpha_mode) {
case ALPHA_MODE_DEFAULT: {
if (cell->attrs.bg_src == COLOR_DEFAULT) {
alpha = term->colors.alpha;
@ -1175,8 +1175,8 @@ render_cell(struct terminal *term, pixman_image_t *pix,
if (unlikely(cell->attrs.url)) {
pixman_color_t url_color = color_hex_to_pixman(
term->conf->colors.use_custom.url
? term->conf->colors.url
term->conf->colors_dark.use_custom.url
? term->conf->colors_dark.url
: term->colors.table[3],
gamma_correct);
draw_underline(term, pix, font, &url_color, x, y, cell_cols);
@ -1991,8 +1991,8 @@ render_overlay(struct terminal *term)
case OVERLAY_FLASH:
color = color_hex_to_pixman_with_alpha(
term->conf->colors.flash,
term->conf->colors.flash_alpha,
term->conf->colors_dark.flash,
term->conf->colors_dark.flash_alpha,
wayl_do_linear_blending(term->wl, term->conf));
break;
@ -2510,10 +2510,10 @@ render_csd_title(struct terminal *term, const struct csd_data *info,
uint32_t bg = term->conf->csd.color.title_set
? term->conf->csd.color.title
: 0xffu << 24 | term->conf->colors.fg;
: 0xffu << 24 | term->conf->colors_dark.fg;
uint32_t fg = term->conf->csd.color.buttons_set
? term->conf->csd.color.buttons
: term->conf->colors.bg;
: term->conf->colors_dark.bg;
if (!term->visual_focus) {
bg = color_dim(term, bg);
@ -2607,7 +2607,7 @@ render_csd_border(struct terminal *term, enum csd_surface surf_idx,
uint32_t _color =
conf->csd.color.border_set ? conf->csd.color.border :
conf->csd.color.title_set ? conf->csd.color.title :
0xffu << 24 | term->conf->colors.fg;
0xffu << 24 | term->conf->colors_dark.fg;
if (!term->visual_focus)
_color = color_dim(term, _color);
@ -2627,7 +2627,7 @@ static pixman_color_t
get_csd_button_fg_color(const struct terminal *term)
{
const struct config *conf = term->conf;
uint32_t _color = conf->colors.bg;
uint32_t _color = conf->colors_dark.bg;
uint16_t alpha = 0xffff;
if (conf->csd.color.buttons_set) {
@ -2872,7 +2872,7 @@ render_csd_button(struct terminal *term, enum csd_surface surf_idx,
switch (surf_idx) {
case CSD_SURF_MINIMIZE:
_color = term->conf->colors.table[4]; /* blue */
_color = term->conf->colors_dark.table[4]; /* blue */
is_set = term->conf->csd.color.minimize_set;
conf_color = &term->conf->csd.color.minimize;
is_active = term->active_surface == TERM_SURF_BUTTON_MINIMIZE &&
@ -2880,7 +2880,7 @@ render_csd_button(struct terminal *term, enum csd_surface surf_idx,
break;
case CSD_SURF_MAXIMIZE:
_color = term->conf->colors.table[2]; /* green */
_color = term->conf->colors_dark.table[2]; /* green */
is_set = term->conf->csd.color.maximize_set;
conf_color = &term->conf->csd.color.maximize;
is_active = term->active_surface == TERM_SURF_BUTTON_MAXIMIZE &&
@ -2888,7 +2888,7 @@ render_csd_button(struct terminal *term, enum csd_surface surf_idx,
break;
case CSD_SURF_CLOSE:
_color = term->conf->colors.table[1]; /* red */
_color = term->conf->colors_dark.table[1]; /* red */
is_set = term->conf->csd.color.close_set;
conf_color = &term->conf->csd.color.quit;
is_active = term->active_surface == TERM_SURF_BUTTON_CLOSE &&
@ -3117,9 +3117,9 @@ render_scrollback_position(struct terminal *term)
uint32_t fg = term->colors.table[0];
uint32_t bg = term->colors.table[8 + 4];
if (term->conf->colors.use_custom.scrollback_indicator) {
fg = term->conf->colors.scrollback_indicator.fg;
bg = term->conf->colors.scrollback_indicator.bg;
if (term->conf->colors_dark.use_custom.scrollback_indicator) {
fg = term->conf->colors_dark.scrollback_indicator.fg;
bg = term->conf->colors_dark.scrollback_indicator.bg;
}
render_osd(
@ -3799,18 +3799,18 @@ render_search_box(struct terminal *term)
const bool is_match = term->search.match_len == text_len;
const bool custom_colors = is_match
? term->conf->colors.use_custom.search_box_match
: term->conf->colors.use_custom.search_box_no_match;
? term->conf->colors_dark.use_custom.search_box_match
: term->conf->colors_dark.use_custom.search_box_no_match;
/* Background - yellow on empty/match, red on mismatch (default) */
const bool gamma_correct = wayl_do_linear_blending(term->wl, term->conf);
const pixman_color_t color = color_hex_to_pixman(
is_match
? (custom_colors
? term->conf->colors.search_box.match.bg
? term->conf->colors_dark.search_box.match.bg
: term->colors.table[3])
: (custom_colors
? term->conf->colors.search_box.no_match.bg
? term->conf->colors_dark.search_box.no_match.bg
: term->colors.table[1]),
gamma_correct);
@ -3832,8 +3832,8 @@ render_search_box(struct terminal *term)
pixman_color_t fg = color_hex_to_pixman(
custom_colors
? (is_match
? term->conf->colors.search_box.match.fg
: term->conf->colors.search_box.no_match.fg)
? term->conf->colors_dark.search_box.match.fg
: term->conf->colors_dark.search_box.no_match.fg)
: term->colors.table[0],
gamma_correct);
@ -4254,11 +4254,11 @@ render_urls(struct terminal *term)
struct buffer *bufs[render_count];
shm_get_many(chain, render_count, widths, heights, bufs, false);
uint32_t fg = term->conf->colors.use_custom.jump_label
? term->conf->colors.jump_label.fg
uint32_t fg = term->conf->colors_dark.use_custom.jump_label
? term->conf->colors_dark.jump_label.fg
: term->colors.table[0];
uint32_t bg = term->conf->colors.use_custom.jump_label
? term->conf->colors.jump_label.bg
uint32_t bg = term->conf->colors_dark.use_custom.jump_label
? term->conf->colors_dark.jump_label.bg
: term->colors.table[3];
for (size_t i = 0; i < render_count; i++) {

View file

@ -182,11 +182,11 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
switch (sigusr.signo) {
case SIGUSR1:
term_theme_switch_to_1(client->instance->terminal);
term_theme_switch_to_dark(client->instance->terminal);
break;
case SIGUSR2:
term_theme_switch_to_2(client->instance->terminal);
term_theme_switch_to_light(client->instance->terminal);
break;
default:
@ -670,21 +670,21 @@ server_destroy(struct server *server)
}
void
server_global_theme_switch_to_1(struct server *server)
server_global_theme_switch_to_dark(struct server *server)
{
server->conf->initial_color_theme = COLOR_THEME1;
server->conf->initial_color_theme = COLOR_THEME_DARK;
tll_foreach(server->clients, it)
term_theme_switch_to_1(it->item->instance->terminal);
term_theme_switch_to_dark(it->item->instance->terminal);
tll_foreach(server->terminals, it)
term_theme_switch_to_1(it->item->terminal);
term_theme_switch_to_dark(it->item->terminal);
}
void
server_global_theme_switch_to_2(struct server *server)
server_global_theme_switch_to_light(struct server *server)
{
server->conf->initial_color_theme = COLOR_THEME2;
server->conf->initial_color_theme = COLOR_THEME_LIGHT;
tll_foreach(server->clients, it)
term_theme_switch_to_2(it->item->instance->terminal);
term_theme_switch_to_light(it->item->instance->terminal);
tll_foreach(server->terminals, it)
term_theme_switch_to_2(it->item->terminal);
term_theme_switch_to_light(it->item->terminal);
}

View file

@ -10,5 +10,5 @@ struct server *server_init(struct config *conf, struct fdm *fdm,
struct reaper *reaper, struct wayland *wayl);
void server_destroy(struct server *server);
void server_global_theme_switch_to_1(struct server *server);
void server_global_theme_switch_to_2(struct server *server);
void server_global_theme_switch_to_dark(struct server *server);
void server_global_theme_switch_to_light(struct server *server);

View file

@ -137,7 +137,7 @@ sixel_init(struct terminal *term, int p1, int p2, int p3)
}
const size_t active_palette_entries = min(
ALEN(term->conf->colors.sixel), term->sixel.palette_size);
ALEN(term->conf->colors_dark.sixel), term->sixel.palette_size);
if (term->sixel.use_private_palette) {
xassert(term->sixel.private_palette == NULL);
@ -145,7 +145,7 @@ sixel_init(struct terminal *term, int p1, int p2, int p3)
term->sixel.palette_size, sizeof(term->sixel.private_palette[0]));
memcpy(
term->sixel.private_palette, term->conf->colors.sixel,
term->sixel.private_palette, term->conf->colors_dark.sixel,
active_palette_entries * sizeof(term->sixel.private_palette[0]));
if (term->sixel.linear_blending || term->sixel.use_10bit) {
@ -164,7 +164,7 @@ sixel_init(struct terminal *term, int p1, int p2, int p3)
term->sixel.palette_size, sizeof(term->sixel.shared_palette[0]));
memcpy(
term->sixel.shared_palette, term->conf->colors.sixel,
term->sixel.shared_palette, term->conf->colors_dark.sixel,
active_palette_entries * sizeof(term->sixel.shared_palette[0]));
if (term->sixel.linear_blending || term->sixel.use_10bit) {

View file

@ -1271,8 +1271,10 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
const struct color_theme *theme = NULL;
switch (conf->initial_color_theme) {
case COLOR_THEME1: theme = &conf->colors; break;
case COLOR_THEME2: theme = &conf->colors2; break;
case COLOR_THEME_DARK: theme = &conf->colors_dark; break;
case COLOR_THEME_LIGHT: theme = &conf->colors_light; break;
case COLOR_THEME_1: BUG("COLOR_THEME_1 should not be used"); break;
case COLOR_THEME_2: BUG("COLOR_THEME_2 should not be used"); break;
}
/* Initialize configure-based terminal attributes */
@ -2177,8 +2179,10 @@ term_reset(struct terminal *term, bool hard)
const struct color_theme *theme = NULL;
switch (term->conf->initial_color_theme) {
case COLOR_THEME1: theme = &term->conf->colors; break;
case COLOR_THEME2: theme = &term->conf->colors2; break;
case COLOR_THEME_DARK: theme = &term->conf->colors_dark; break;
case COLOR_THEME_LIGHT: theme = &term->conf->colors_light; break;
case COLOR_THEME_1: BUG("COLOR_THEME_1 should not be used"); break;
case COLOR_THEME_2: BUG("COLOR_THEME_2 should not be used"); break;
}
term->flash.active = false;
@ -4742,13 +4746,13 @@ term_send_size_notification(struct terminal *term)
}
void
term_theme_switch_to_1(struct terminal *term)
term_theme_switch_to_dark(struct terminal *term)
{
if (term->colors.active_theme == COLOR_THEME1)
if (term->colors.active_theme == COLOR_THEME_DARK)
return;
term_theme_apply(term, &term->conf->colors);
term->colors.active_theme = COLOR_THEME1;
term_theme_apply(term, &term->conf->colors_dark);
term->colors.active_theme = COLOR_THEME_DARK;
wayl_win_alpha_changed(term->window);
term_font_subpixel_changed(term);
@ -4762,13 +4766,13 @@ term_theme_switch_to_1(struct terminal *term)
}
void
term_theme_switch_to_2(struct terminal *term)
term_theme_switch_to_light(struct terminal *term)
{
if (term->colors.active_theme == COLOR_THEME2)
if (term->colors.active_theme == COLOR_THEME_LIGHT)
return;
term_theme_apply(term, &term->conf->colors2);
term->colors.active_theme = COLOR_THEME2;
term_theme_apply(term, &term->conf->colors_light);
term->colors.active_theme = COLOR_THEME_LIGHT;
wayl_win_alpha_changed(term->window);
term_font_subpixel_changed(term);
@ -4784,15 +4788,15 @@ term_theme_switch_to_2(struct terminal *term)
void
term_theme_toggle(struct terminal *term)
{
if (term->colors.active_theme == COLOR_THEME1) {
term_theme_apply(term, &term->conf->colors2);
term->colors.active_theme = COLOR_THEME2;
if (term->colors.active_theme == COLOR_THEME_DARK) {
term_theme_apply(term, &term->conf->colors_light);
term->colors.active_theme = COLOR_THEME_LIGHT;
if (term->report_theme_changes)
term_to_slave(term, "\033[?997;2n", 9);
} else {
term_theme_apply(term, &term->conf->colors);
term->colors.active_theme = COLOR_THEME1;
term_theme_apply(term, &term->conf->colors_dark);
term->colors.active_theme = COLOR_THEME_DARK;
if (term->report_theme_changes)
term_to_slave(term, "\033[?997;1n", 9);

View file

@ -994,8 +994,8 @@ void term_enable_size_notifications(struct terminal *term);
void term_disable_size_notifications(struct terminal *term);
void term_send_size_notification(struct terminal *term);
void term_theme_switch_to_1(struct terminal *term);
void term_theme_switch_to_2(struct terminal *term);
void term_theme_switch_to_dark(struct terminal *term);
void term_theme_switch_to_light(struct terminal *term);
void term_theme_toggle(struct terminal *term);
static inline void term_reset_grapheme_state(struct terminal *term)

View file

@ -521,6 +521,14 @@ test_section_main(void)
(int []){STARTUP_WINDOWED, STARTUP_MAXIMIZED, STARTUP_FULLSCREEN},
(int *)&conf.startup_mode);
test_enum(
&ctx, &parse_section_main, "initial-color-theme",
2,
(const char *[]){"dark", "light", "1", "2"},
(int []){COLOR_THEME_DARK, COLOR_THEME_LIGHT,
COLOR_THEME_DARK, COLOR_THEME_LIGHT},
(int *)&conf.initial_color_theme);
/* TODO: font (custom) */
/* TODO: include (custom) */
/* TODO: bold-text-in-bright (enum/boolean) */
@ -695,78 +703,157 @@ test_section_touch(void)
}
static void
test_section_colors(void)
test_section_colors_dark(void)
{
struct config conf = {0};
struct context ctx = {
.conf = &conf, .section = "colors", .path = "unittest"};
.conf = &conf, .section = "colors-dark", .path = "unittest"};
test_invalid_key(&ctx, &parse_section_colors, "invalid-key");
test_color(&ctx, &parse_section_colors, "foreground", false, &conf.colors.fg);
test_color(&ctx, &parse_section_colors, "background", false, &conf.colors.bg);
test_color(&ctx, &parse_section_colors, "regular0", false, &conf.colors.table[0]);
test_color(&ctx, &parse_section_colors, "regular1", false, &conf.colors.table[1]);
test_color(&ctx, &parse_section_colors, "regular2", false, &conf.colors.table[2]);
test_color(&ctx, &parse_section_colors, "regular3", false, &conf.colors.table[3]);
test_color(&ctx, &parse_section_colors, "regular4", false, &conf.colors.table[4]);
test_color(&ctx, &parse_section_colors, "regular5", false, &conf.colors.table[5]);
test_color(&ctx, &parse_section_colors, "regular6", false, &conf.colors.table[6]);
test_color(&ctx, &parse_section_colors, "regular7", false, &conf.colors.table[7]);
test_color(&ctx, &parse_section_colors, "bright0", false, &conf.colors.table[8]);
test_color(&ctx, &parse_section_colors, "bright1", false, &conf.colors.table[9]);
test_color(&ctx, &parse_section_colors, "bright2", false, &conf.colors.table[10]);
test_color(&ctx, &parse_section_colors, "bright3", false, &conf.colors.table[11]);
test_color(&ctx, &parse_section_colors, "bright4", false, &conf.colors.table[12]);
test_color(&ctx, &parse_section_colors, "bright5", false, &conf.colors.table[13]);
test_color(&ctx, &parse_section_colors, "bright6", false, &conf.colors.table[14]);
test_color(&ctx, &parse_section_colors, "bright7", false, &conf.colors.table[15]);
test_color(&ctx, &parse_section_colors, "dim0", false, &conf.colors.dim[0]);
test_color(&ctx, &parse_section_colors, "dim1", false, &conf.colors.dim[1]);
test_color(&ctx, &parse_section_colors, "dim2", false, &conf.colors.dim[2]);
test_color(&ctx, &parse_section_colors, "dim3", false, &conf.colors.dim[3]);
test_color(&ctx, &parse_section_colors, "dim4", false, &conf.colors.dim[4]);
test_color(&ctx, &parse_section_colors, "dim5", false, &conf.colors.dim[5]);
test_color(&ctx, &parse_section_colors, "dim6", false, &conf.colors.dim[6]);
test_color(&ctx, &parse_section_colors, "dim7", false, &conf.colors.dim[7]);
test_color(&ctx, &parse_section_colors, "selection-foreground", false, &conf.colors.selection_fg);
test_color(&ctx, &parse_section_colors, "selection-background", false, &conf.colors.selection_bg);
test_color(&ctx, &parse_section_colors, "urls", false, &conf.colors.url);
test_two_colors(&ctx, &parse_section_colors, "jump-labels", false,
&conf.colors.jump_label.fg,
&conf.colors.jump_label.bg);
test_two_colors(&ctx, &parse_section_colors, "scrollback-indicator", false,
&conf.colors.scrollback_indicator.fg,
&conf.colors.scrollback_indicator.bg);
test_two_colors(&ctx, &parse_section_colors, "search-box-no-match", false,
&conf.colors.search_box.no_match.fg,
&conf.colors.search_box.no_match.bg);
test_two_colors(&ctx, &parse_section_colors, "search-box-match", false,
&conf.colors.search_box.match.fg,
&conf.colors.search_box.match.bg);
test_color(&ctx, &parse_section_colors_dark, "foreground", false, &conf.colors_dark.fg);
test_color(&ctx, &parse_section_colors_dark, "background", false, &conf.colors_dark.bg);
test_color(&ctx, &parse_section_colors_dark, "regular0", false, &conf.colors_dark.table[0]);
test_color(&ctx, &parse_section_colors_dark, "regular1", false, &conf.colors_dark.table[1]);
test_color(&ctx, &parse_section_colors_dark, "regular2", false, &conf.colors_dark.table[2]);
test_color(&ctx, &parse_section_colors_dark, "regular3", false, &conf.colors_dark.table[3]);
test_color(&ctx, &parse_section_colors_dark, "regular4", false, &conf.colors_dark.table[4]);
test_color(&ctx, &parse_section_colors_dark, "regular5", false, &conf.colors_dark.table[5]);
test_color(&ctx, &parse_section_colors_dark, "regular6", false, &conf.colors_dark.table[6]);
test_color(&ctx, &parse_section_colors_dark, "regular7", false, &conf.colors_dark.table[7]);
test_color(&ctx, &parse_section_colors_dark, "bright0", false, &conf.colors_dark.table[8]);
test_color(&ctx, &parse_section_colors_dark, "bright1", false, &conf.colors_dark.table[9]);
test_color(&ctx, &parse_section_colors_dark, "bright2", false, &conf.colors_dark.table[10]);
test_color(&ctx, &parse_section_colors_dark, "bright3", false, &conf.colors_dark.table[11]);
test_color(&ctx, &parse_section_colors_dark, "bright4", false, &conf.colors_dark.table[12]);
test_color(&ctx, &parse_section_colors_dark, "bright5", false, &conf.colors_dark.table[13]);
test_color(&ctx, &parse_section_colors_dark, "bright6", false, &conf.colors_dark.table[14]);
test_color(&ctx, &parse_section_colors_dark, "bright7", false, &conf.colors_dark.table[15]);
test_color(&ctx, &parse_section_colors_dark, "dim0", false, &conf.colors_dark.dim[0]);
test_color(&ctx, &parse_section_colors_dark, "dim1", false, &conf.colors_dark.dim[1]);
test_color(&ctx, &parse_section_colors_dark, "dim2", false, &conf.colors_dark.dim[2]);
test_color(&ctx, &parse_section_colors_dark, "dim3", false, &conf.colors_dark.dim[3]);
test_color(&ctx, &parse_section_colors_dark, "dim4", false, &conf.colors_dark.dim[4]);
test_color(&ctx, &parse_section_colors_dark, "dim5", false, &conf.colors_dark.dim[5]);
test_color(&ctx, &parse_section_colors_dark, "dim6", false, &conf.colors_dark.dim[6]);
test_color(&ctx, &parse_section_colors_dark, "dim7", false, &conf.colors_dark.dim[7]);
test_color(&ctx, &parse_section_colors_dark, "selection-foreground", false, &conf.colors_dark.selection_fg);
test_color(&ctx, &parse_section_colors_dark, "selection-background", false, &conf.colors_dark.selection_bg);
test_color(&ctx, &parse_section_colors_dark, "urls", false, &conf.colors_dark.url);
test_two_colors(&ctx, &parse_section_colors_dark, "jump-labels", false,
&conf.colors_dark.jump_label.fg,
&conf.colors_dark.jump_label.bg);
test_two_colors(&ctx, &parse_section_colors_dark, "scrollback-indicator", false,
&conf.colors_dark.scrollback_indicator.fg,
&conf.colors_dark.scrollback_indicator.bg);
test_two_colors(&ctx, &parse_section_colors_dark, "search-box-no-match", false,
&conf.colors_dark.search_box.no_match.fg,
&conf.colors_dark.search_box.no_match.bg);
test_two_colors(&ctx, &parse_section_colors_dark, "search-box-match", false,
&conf.colors_dark.search_box.match.fg,
&conf.colors_dark.search_box.match.bg);
test_two_colors(&ctx, &parse_section_colors, "cursor", false,
&conf.colors.cursor.text,
&conf.colors.cursor.cursor);
test_two_colors(&ctx, &parse_section_colors_dark, "cursor", false,
&conf.colors_dark.cursor.text,
&conf.colors_dark.cursor.cursor);
test_enum(&ctx, &parse_section_colors, "alpha-mode", 3,
test_enum(&ctx, &parse_section_colors_dark, "alpha-mode", 3,
(const char *[]){"default", "matching", "all"},
(int []){ALPHA_MODE_DEFAULT, ALPHA_MODE_MATCHING, ALPHA_MODE_ALL},
(int *)&conf.colors.alpha_mode);
(int *)&conf.colors_dark.alpha_mode);
test_enum(&ctx, &parse_section_colors, "dim-blend-towards", 2,
test_enum(&ctx, &parse_section_colors_dark, "dim-blend-towards", 2,
(const char *[]){"black", "white"},
(int []){DIM_BLEND_TOWARDS_BLACK, DIM_BLEND_TOWARDS_WHITE},
(int *)&conf.colors.dim_blend_towards);
(int *)&conf.colors_dark.dim_blend_towards);
for (size_t i = 0; i < 255; i++) {
char key_name[4];
sprintf(key_name, "%zu", i);
test_color(&ctx, &parse_section_colors, key_name, false,
&conf.colors.table[i]);
test_color(&ctx, &parse_section_colors_dark, key_name, false,
&conf.colors_dark.table[i]);
}
test_invalid_key(&ctx, &parse_section_colors, "256");
test_invalid_key(&ctx, &parse_section_colors_dark, "256");
/* TODO: alpha (float in range 0-1, converted to uint16_t) */
config_free(&conf);
}
static void
test_section_colors_light(void)
{
struct config conf = {0};
struct context ctx = {
.conf = &conf, .section = "colors-light", .path = "unittest"};
test_invalid_key(&ctx, &parse_section_colors, "invalid-key");
test_color(&ctx, &parse_section_colors_light, "foreground", false, &conf.colors_light.fg);
test_color(&ctx, &parse_section_colors_light, "background", false, &conf.colors_light.bg);
test_color(&ctx, &parse_section_colors_light, "regular0", false, &conf.colors_light.table[0]);
test_color(&ctx, &parse_section_colors_light, "regular1", false, &conf.colors_light.table[1]);
test_color(&ctx, &parse_section_colors_light, "regular2", false, &conf.colors_light.table[2]);
test_color(&ctx, &parse_section_colors_light, "regular3", false, &conf.colors_light.table[3]);
test_color(&ctx, &parse_section_colors_light, "regular4", false, &conf.colors_light.table[4]);
test_color(&ctx, &parse_section_colors_light, "regular5", false, &conf.colors_light.table[5]);
test_color(&ctx, &parse_section_colors_light, "regular6", false, &conf.colors_light.table[6]);
test_color(&ctx, &parse_section_colors_light, "regular7", false, &conf.colors_light.table[7]);
test_color(&ctx, &parse_section_colors_light, "bright0", false, &conf.colors_light.table[8]);
test_color(&ctx, &parse_section_colors_light, "bright1", false, &conf.colors_light.table[9]);
test_color(&ctx, &parse_section_colors_light, "bright2", false, &conf.colors_light.table[10]);
test_color(&ctx, &parse_section_colors_light, "bright3", false, &conf.colors_light.table[11]);
test_color(&ctx, &parse_section_colors_light, "bright4", false, &conf.colors_light.table[12]);
test_color(&ctx, &parse_section_colors_light, "bright5", false, &conf.colors_light.table[13]);
test_color(&ctx, &parse_section_colors_light, "bright6", false, &conf.colors_light.table[14]);
test_color(&ctx, &parse_section_colors_light, "bright7", false, &conf.colors_light.table[15]);
test_color(&ctx, &parse_section_colors_light, "dim0", false, &conf.colors_light.dim[0]);
test_color(&ctx, &parse_section_colors_light, "dim1", false, &conf.colors_light.dim[1]);
test_color(&ctx, &parse_section_colors_light, "dim2", false, &conf.colors_light.dim[2]);
test_color(&ctx, &parse_section_colors_light, "dim3", false, &conf.colors_light.dim[3]);
test_color(&ctx, &parse_section_colors_light, "dim4", false, &conf.colors_light.dim[4]);
test_color(&ctx, &parse_section_colors_light, "dim5", false, &conf.colors_light.dim[5]);
test_color(&ctx, &parse_section_colors_light, "dim6", false, &conf.colors_light.dim[6]);
test_color(&ctx, &parse_section_colors_light, "dim7", false, &conf.colors_light.dim[7]);
test_color(&ctx, &parse_section_colors_light, "selection-foreground", false, &conf.colors_light.selection_fg);
test_color(&ctx, &parse_section_colors_light, "selection-background", false, &conf.colors_light.selection_bg);
test_color(&ctx, &parse_section_colors_light, "urls", false, &conf.colors_light.url);
test_two_colors(&ctx, &parse_section_colors_light, "jump-labels", false,
&conf.colors_light.jump_label.fg,
&conf.colors_light.jump_label.bg);
test_two_colors(&ctx, &parse_section_colors_light, "scrollback-indicator", false,
&conf.colors_light.scrollback_indicator.fg,
&conf.colors_light.scrollback_indicator.bg);
test_two_colors(&ctx, &parse_section_colors_light, "search-box-no-match", false,
&conf.colors_light.search_box.no_match.fg,
&conf.colors_light.search_box.no_match.bg);
test_two_colors(&ctx, &parse_section_colors_light, "search-box-match", false,
&conf.colors_light.search_box.match.fg,
&conf.colors_light.search_box.match.bg);
test_two_colors(&ctx, &parse_section_colors_light, "cursor", false,
&conf.colors_light.cursor.text,
&conf.colors_light.cursor.cursor);
test_enum(&ctx, &parse_section_colors_light, "alpha-mode", 3,
(const char *[]){"default", "matching", "all"},
(int []){ALPHA_MODE_DEFAULT, ALPHA_MODE_MATCHING, ALPHA_MODE_ALL},
(int *)&conf.colors_light.alpha_mode);
test_enum(&ctx, &parse_section_colors_light, "dim-blend-towards", 2,
(const char *[]){"black", "white"},
(int []){DIM_BLEND_TOWARDS_BLACK, DIM_BLEND_TOWARDS_WHITE},
(int *)&conf.colors_light.dim_blend_towards);
for (size_t i = 0; i < 255; i++) {
char key_name[4];
sprintf(key_name, "%zu", i);
test_color(&ctx, &parse_section_colors_light, key_name, false,
&conf.colors_light.table[i]);
}
test_invalid_key(&ctx, &parse_section_colors_light, "256");
/* TODO: alpha (float in range 0-1, converted to uint16_t) */
@ -1444,7 +1531,8 @@ main(int argc, const char *const *argv)
test_section_cursor();
test_section_mouse();
test_section_touch();
test_section_colors();
test_section_colors_dark();
test_section_colors_light();
test_section_csd();
test_section_key_bindings();
test_section_key_bindings_collisions();

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Aero root theme
[colors]
[colors-dark]
cursor=1a1a1a 9fd5f5
foreground=dedeef
background=1a1a1a

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Alacritty
[colors]
[colors-dark]
cursor = 181818 56d8c9
background= 181818
foreground= d8d8d8

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# https://github.com/romainl/Apprentice
[colors]
[colors-dark]
cursor=262626 6c6c6c
foreground=bcbcbc
background=262626

View file

@ -2,7 +2,7 @@
# theme: Ayu Mirage
# description: a theme based on Ayu Mirage for Sublime Text (original: https://github.com/dempfi/ayu)
[colors]
[colors-dark]
cursor = ffcc66 665a44
foreground = cccac2
background = 242936

View file

@ -1,7 +1,7 @@
# _*_ conf _*_
# Catppuccin Frappe
[colors]
[colors-dark]
foreground=c6d0f5
background=303446

View file

@ -1,7 +1,10 @@
# _*_ conf _*_
# Catppuccin Latte
[colors]
[main]
initial-color-theme=light
[colors-light]
foreground=4c4f69
background=eff1f5

View file

@ -1,7 +1,7 @@
# _*_ conf _*_
# Catppuccin Macchiato
[colors]
[colors-dark]
foreground=cad3f5
background=24273a

View file

@ -1,7 +1,7 @@
# _*_ conf _*_
# Catppuccin Mocha
[colors]
[colors-dark]
foreground=cdd6f4
background=1e1e2e

View file

@ -3,7 +3,7 @@
# author: ayushnix (https://sr.ht/~ayushnix)
# description: A dark theme with bright cyberpunk colors (WCAG AAA compliant)
[colors]
[colors-dark]
cursor = 181818 cdcdcd
foreground = cdcdcd
background = 181818

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Derp
[colors]
[colors-dark]
cursor=000000 ffffff
foreground=ffffff
background=000000

View file

@ -2,7 +2,7 @@
# Deus
# Color palette based on: https://github.com/ajmwagar/vim-deus
[colors]
[colors-dark]
cursor=2c323b eaeaea
background=2c323b
foreground=eaeaea

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Dracula
[colors]
[colors-dark]
cursor=282a36 f8f8f2
foreground=f8f8f2
background=282a36

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Dracula iTerm2 variant
[colors]
[colors-dark]
cursor=ffffff bbbbbb
foreground=f8f8f2
background=1e1f29

View file

@ -5,7 +5,10 @@
# text and the white background.
# author: Eugen Rahaian <eugen@rah.ro>
[colors]
[main]
initial-color-theme=light
[colors-light]
cursor=ffffff 515151
background= ffffff
foreground= 000000

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Gruvbox
[colors]
[colors-dark]
background=282828
foreground=ebdbb2
regular0=282828
@ -21,7 +21,7 @@ bright5=d3869b
bright6=8ec07c
bright7=ebdbb2
[colors2]
[colors-light]
background=fbf1c7
foreground=3c3836
regular0=fbf1c7

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Gruvbox
[colors]
[colors-dark]
background=282828
foreground=ebdbb2
regular0=282828

View file

@ -1,7 +1,10 @@
# -*- conf -*-
# Gruvbox - Light
[colors]
[main]
initial-color-theme=light
[colors-light]
background=fbf1c7
foreground=3c3836
regular0=fbf1c7

View file

@ -1,6 +1,6 @@
# -*- conf -*-
[colors]
[colors-dark]
cursor=141414 c9c9c9
foreground=c9c9c9
background=141414

View file

@ -2,7 +2,7 @@
# this foot theme is based on alacritty iterm theme:
# https://github.com/alacritty/alacritty-theme/blob/master/themes/iterm.toml
[colors]
[colors-dark]
foreground=fffbf6
background=101421

View file

@ -2,7 +2,7 @@
# JetBrains Darcula
# Palette based on the same theme from https://github.com/dexpota/kitty-themes
[colors]
[colors-dark]
cursor=202020 ffffff
background=202020
foreground=adadad

View file

@ -1,6 +1,6 @@
# -*- conf -*-
[colors]
[colors-dark]
cursor=111111 cccccc
foreground=dddddd
background=000000

View file

@ -2,7 +2,10 @@
# Material Amber
# Based on material.io guidelines with Amber 50 background
[colors]
[main]
initial-color-theme=light
[colors-light]
cursor=fff8e1 21201d
foreground = 21201d
background = fff8e1

View file

@ -2,7 +2,7 @@
# Material
# From https://github.com/MartinSeeler/iterm2-material-design
[colors]
[colors-dark]
foreground=ECEFF1
background=263238
regular0=546E7A # black

View file

@ -3,7 +3,11 @@
# modus-operandi
# See: https://protesilaos.com/emacs/modus-themes
#
[colors]
[main]
initial-color-theme=light
[colors-light]
background=ffffff
foreground=000000
regular0=000000

View file

@ -4,7 +4,7 @@
# See: https://protesilaos.com/emacs/modus-themes
#
[colors]
[colors-dark]
background=000000
foreground=ffffff
regular0=000000

View file

@ -4,7 +4,7 @@
# See: https://protesilaos.com/emacs/modus-themes
#
[colors]
[colors-dark]
background=0d0e1c
foreground=ffffff
regular0=000000

View file

@ -2,7 +2,7 @@
# Molokai
# Based on zhou13's at https://github.com/zhou13/molokai-terminal/blob/master/xterm/Xresources
[colors]
[colors-dark]
background=1B1D1E
foreground=CCCCCC
regular0=1B1D1E

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Monokai Pro
[colors]
[colors-dark]
background=2D2A2E
foreground=FCFCFA
regular0=403E41

View file

@ -2,7 +2,7 @@
# moonfly
# Based on https://github.com/bluz71/vim-moonfly-colors
[colors]
[colors-dark]
cursor = 080808 9e9e9e
foreground = b2b2b2
background = 080808

View file

@ -6,7 +6,7 @@
# https://xcolors.net/neon
#
[colors]
[colors-dark]
foreground=f8f8f8
background=171717
regular0=171717

View file

@ -1,7 +1,7 @@
# _*_ conf _*_
# Night Owl
[colors]
[colors-dark]
cursor=011627 80a4c2
foreground=d6deeb
background=011627

View file

@ -2,7 +2,7 @@
# nightfly
# Based on https://github.com/bluz71/vim-nightfly-guicolors
[colors]
[colors-dark]
cursor = 080808 9ca1aa
foreground = acb4c2
background = 011627

View file

@ -3,7 +3,7 @@
# https://github.com/n1ghtmare/noirblaze-kitty
[colors]
[colors-dark]
cursor=121212 ff0088
foreground=d5d5d5
background=121212

View file

@ -6,7 +6,7 @@
# this specific foot theme is based on nord-alacritty:
# https://github.com/arcticicestudio/nord-alacritty/blob/develop/src/nord.yml
[colors]
[colors-dark]
cursor = 2e3440 d8dee9
foreground = d8dee9
background = 2e3440

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Nordiq
[colors]
[colors-dark]
cursor=eeeeee 9f515a
foreground=dbdee9
background=0e1420

View file

@ -3,7 +3,7 @@
# Uses the dark color palette from the default Neovim color scheme
# See: https://github.com/neovim/neovim/blob/fb6c059dc55c8d594102937be4dd70f5ff51614a/src/nvim/highlight_group.c#L419
[colors]
[colors-dark]
cursor=14161b e0e2ea # NvimDarkGrey2 NvimLightGrey2
foreground=e0e2ea # NvimLightGrey2
background=14161b # NvimDarkGrey2
@ -29,7 +29,7 @@ bright5=ffcaff # NvimLightMagenta
bright6=8cf8f7 # NvimLightCyan
bright7=eef1f8 # NvimLightGrey1
[colors2]
[colors-light]
cursor=e0e2ea 14161b # NvimLightGrey2 NvimDarkGrey2
foreground=14161b # NvimDarkGrey2
background=e0e2ea # NvimLightGrey2

View file

@ -3,7 +3,7 @@
# Uses the dark color palette from the default Neovim color scheme
# See: https://github.com/neovim/neovim/blob/fb6c059dc55c8d594102937be4dd70f5ff51614a/src/nvim/highlight_group.c#L419
[colors]
[colors-dark]
cursor=14161b e0e2ea # NvimDarkGrey2 NvimLightGrey2
foreground=e0e2ea # NvimLightGrey2
background=14161b # NvimDarkGrey2

View file

@ -3,7 +3,10 @@
# Uses the light color palette from the default Neovim color scheme
# See: https://github.com/neovim/neovim/blob/fb6c059dc55c8d594102937be4dd70f5ff51614a/src/nvim/highlight_group.c#L334
[colors]
[main]
initial-color-theme=light
[colors-light]
cursor=e0e2ea 14161b # NvimLightGrey2 NvimDarkGrey2
foreground=14161b # NvimDarkGrey2
background=e0e2ea # NvimLightGrey2

View file

@ -1,7 +1,7 @@
# OneDark
# Palette based on the same theme from https://github.com/dexpota/kitty-themes
[colors]
[colors-dark]
cursor=111111 cccccc
foreground=979eab
background=282c34

View file

@ -7,7 +7,7 @@
# + cursor colors from:
# https://github.com/sonph/onehalf/blob/master/iterm/OneHalfDark.itermcolors
[colors]
[colors-dark]
cursor=dcdfe4 a3b3cc
foreground=dcdfe4
background=282c34

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# http://panda.siamak.me/
[colors]
[colors-dark]
# alpha=1.0
background=1D1E20
foreground=F0F0F0

View file

@ -2,7 +2,7 @@
# PaperColorDark
# Palette based on https://github.com/NLKNguyen/papercolor-theme
[colors]
[colors-dark]
cursor=1c1c1c eeeeee
background=1c1c1c
foreground=eeeeee
@ -25,7 +25,7 @@ bright7=5f8787 # bright white
# selection-foreground=1c1c1c
# selection-background=af87d7
[colors2]
[colors-light]
cursor=eeeeee 444444
background=eeeeee
foreground=444444

View file

@ -2,7 +2,7 @@
# PaperColorDark
# Palette based on https://github.com/NLKNguyen/papercolor-theme
[colors]
[colors-dark]
cursor=1c1c1c eeeeee
background=1c1c1c
foreground=eeeeee

View file

@ -2,7 +2,10 @@
# PaperColor Light
# Palette based on https://github.com/NLKNguyen/papercolor-theme
[colors]
[main]
initial-color-theme=light
xs
[colors-light]
cursor=eeeeee 444444
background=eeeeee
foreground=444444

View file

@ -1,7 +1,7 @@
# Based on Poimandres color theme for kitti terminal emulator
# https://github.com/ubmit/poimandres-kitty
[colors]
[colors-dark]
cursor=1b1e28 ffffff
foreground=a6accd
background=1b1e28

View file

@ -13,7 +13,7 @@
# and also posted here:
# https://forums.debian.net/viewtopic.php?t=29981
[colors]
[colors-dark]
foreground = cccccc
background = 191911

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Rosé Pine
[colors]
[colors-dark]
cursor=191724 e0def4
background=191724
foreground=e0def4

View file

@ -1,7 +1,11 @@
# -*- conf -*-
# Rosé Pine Dawn
[colors]
[main]
initial-color-theme=light
[colors-light]
cursor=faf4ed 575279
background=faf4ed
foreground=575279

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Rosé Pine Moon
[colors]
[colors-dark]
cursor=232136 e0def4
background=232136
foreground=e0def4

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Selenized dark
[colors]
[colors-dark]
cursor = 103c48 53d6c7
background= 103c48
foreground= adbcbc
@ -24,7 +24,7 @@ bright5= ff84cd
bright6= 53d6c7
bright7= cad8d9
[colors2]
[colors-light]
cursor=fbf3db 00978a
background= fbf3db
foreground= 53676d

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Selenized black
[colors]
[colors-dark]
cursor = 181818 56d8c9
background= 181818
foreground= b9b9b9

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Selenized dark
[colors]
[colors-dark]
cursor = 103c48 53d6c7
background= 103c48
foreground= adbcbc

View file

@ -1,7 +1,10 @@
# -*- conf -*-
# Selenized light
[colors]
[main]
initial-color-theme=light
[colors-light]
cursor=fbf3db 00978a
background= fbf3db
foreground= 53676d

View file

@ -1,7 +1,10 @@
# -*- conf -*-
# Selenized white
[colors]
[main]
initial-color-theme=light
[colors-light]
cursor=ffffff 009a8a
background= ffffff
foreground= 474747

View file

@ -2,7 +2,7 @@
# Solarized dark+light
# Dark
[colors]
[colors-dark]
cursor= 002b36 93a1a1
background= 002b36
foreground= 839496
@ -25,7 +25,7 @@ bright7= fdf6e3
# Light
[colors2]
[colors-light]
cursor= fdf6e3 586e75
background= fdf6e3
foreground= 657b83

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Solarized dark
[colors]
[colors-dark]
cursor= 002b36 93a1a1
background= 002b36
foreground= 839496

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Solarized dark
[colors]
[colors-dark]
cursor= 002b36 93a1a1
background= 002b36
foreground= 839496

View file

@ -1,7 +1,10 @@
# -*- conf -*-
# Solarized light
[colors]
[main]
initial-color-theme=light
[colors-light]
cursor= fdf6e3 586e75
background= fdf6e3
foreground= 657b83

View file

@ -9,7 +9,7 @@
# encoding to sRGB again.
# Dark
[colors]
[colors-dark]
cursor= 002b36 93a1a1
background= 002b36
foreground= 839496
@ -32,7 +32,7 @@ bright7= ffffff
# Light
[colors2]
[colors-light]
cursor= fdf6e3 586e75
background= fdf6e3
foreground= 657b83

View file

@ -1,6 +1,6 @@
# srcery
[colors]
[colors-dark]
background= 1c1b19
foreground= fce8c3
regular0= 1c1b19

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Theme: starlight V4 (https://github.com/CosmicToast/starlight)
[colors]
[colors-dark]
foreground = FFFFFF
background = 242424

View file

@ -1,7 +1,7 @@
# -*- conf -*-
# Tango
[colors]
[colors-dark]
cursor=000000 babdb6
foreground=babdb6
background=000000

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with a palette inspired by earthly colours (WCAG AA compliant)
[colors]
[colors-dark]
#cursor = 302420 a9a2a6
foreground = a9a2a6
background = 302420

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with warm hues (WCAG AA compliant)
[colors]
[colors-dark]
#cursor = 232323 aeadaf
foreground = aeadaf
background = 232323

View file

@ -3,7 +3,11 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Light theme with a soft, slightly desaturated palette (WCAG AA compliant)
[colors]
[main]
initial-color-theme=light
[colors-light]
#cursor = eff0f2 4a4b4e
foreground = 4a4b4e
background = eff0f2

View file

@ -3,7 +3,10 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Light theme with warm colours (WCAG AA compliant)
[colors]
[main]
initial-color-theme=light
[colors-light]
#cursor = f8f2e5 464340
foreground = 464340
background = f8f2e5

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with a deep blue-ish, slightly desaturated palette (WCAG AA compliant)
[colors]
[colors-dark]
#cursor = 1f252d a2a8ba
foreground = a2a8ba
background = 1f252d

View file

@ -3,7 +3,10 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Light, pleasant theme optimised for long writing/coding sessions (WCAG AA compliant)
[colors]
[main]
initial-color-theme=light
[colors-light]
#cursor = fff5f3 4d595f
foreground = 4d595f
background = fff5f3

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with colours inspired by concept art of outer space (WCAG AAA compliant)
[colors]
[colors-dark]
#cursor = 090a18 b4abac
foreground = b4abac
background = 090a18

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: High contrast dark theme with bright colours (WCAG AAA compliant)
[colors]
[colors-dark]
#cursor = 1a1a1a e0e0e0
foreground = e0e0e0
background = 1a1a1a

View file

@ -3,7 +3,10 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Light theme inspired by old vaporwave concept art (WCAG AA compliant)
[colors]
[main]
initial-color-theme=light
[colors-light]
#cursor = f3f2f4 53545b
foreground = 53545b
background = f3f2f4

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with a subdued palette on the green side of the spectrum (WCAG AA compliant)
[colors]
[colors-dark]
#cursor = 162c22 bbbcbc
foreground = bbbcbc
background = 162c22

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with a palette inspired by early spring colours (WCAG AA compliant)
[colors]
[colors-dark]
#cursor = 283a37 b5b8b7
foreground = b5b8b7
background = 283a37

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with colours inspired by summer evenings by the sea (WCAG AA compliant)
[colors]
[colors-dark]
#cursor = 202c3d a0abae
foreground = a0abae
background = 202c3d

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: A green-scale, subtle theme for late night hackers (WCAG AAA compliant)
[colors]
[colors-dark]
#cursor = 282b2b b6e0ca
foreground = b6e0ca
background = 282b2b

View file

@ -3,7 +3,10 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Light theme for prose or for coding in an open space (WCAG AAA compliant)
[colors]
[main]
initial-color-theme=light
[colors-light]
#cursor = ffffff 4a484d
foreground = 4a484d
background = ffffff

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with a vibrant palette (WCAG AA compliant)
[colors]
[colors-dark]
#cursor = 001514 a29fa0
foreground = a29fa0
background = 001514

View file

@ -3,7 +3,7 @@
# author: Protesilaos Stavrou (https://protesilaos.com)
# description: Dark theme with a palette inspired by winter nights at the city (WCAG AA compliant)
[colors]
[colors-dark]
#cursor = 202427 8da3b8
foreground = 8da3b8
background = 202427

View file

@ -2,7 +2,10 @@
# Reference: https://github.com/tokyo-night/tokyo-night-vscode-theme/blob/master/themes/tokyo-night-light-color-theme.json
[colors]
[main]
initial-color-theme=light
[colors-light]
background=d6d8df
foreground=343b58
regular0=343b58

View file

@ -1,6 +1,6 @@
# -*- conf -*-
[colors]
[colors-dark]
background=1a1b26
foreground=c0caf5
regular0=15161E

View file

@ -1,6 +1,6 @@
# -*- conf -*-
[colors]
[colors-dark]
background=24283b
foreground=c0caf5
regular0=1D202F

Some files were not shown because too many files have changed in this diff Show more