diff --git a/src/common/init.c b/src/common/init.c index 853042fc8..c2dfa9fb5 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -2,6 +2,7 @@ #include "common/parsing.h" #include "common/thread.h" #include "detection/displayserver/displayserver.h" +#include "detection/terminaltheme/terminaltheme.h" #include "util/textModifier.h" #include "logo/logo.h" @@ -22,10 +23,18 @@ static void initState(FFstate* state) state->logoWidth = 0; state->logoHeight = 0; state->keysHeight = 0; + state->terminalLightTheme = false; ffPlatformInit(&state->platform); state->configDoc = NULL; state->resultDoc = NULL; + + { + // don't enable bright color if the terminal is in light mode + FFTerminalThemeResult result; + if (ffDetectTerminalTheme(&result, true /* forceEnv for performance */) && !result.bg.dark) + state->terminalLightTheme = true; + } } static void defaultConfig(void) diff --git a/src/detection/terminaltheme/terminaltheme.c b/src/detection/terminaltheme/terminaltheme.c index 845eec637..192864bb3 100644 --- a/src/detection/terminaltheme/terminaltheme.c +++ b/src/detection/terminaltheme/terminaltheme.c @@ -74,17 +74,17 @@ static bool detectByEnv(FFTerminalThemeResult* result) return true; } -static inline bool detectColor(FFTerminalThemeResult* result) +static inline bool detectColor(FFTerminalThemeResult* result, bool forceEnv) { - if (detectByEscapeCode(result)) + if (!forceEnv && detectByEscapeCode(result)) return true; return detectByEnv(result); } -bool ffDetectTerminalTheme(FFTerminalThemeResult* result) +bool ffDetectTerminalTheme(FFTerminalThemeResult* result, bool forceEnv) { - if (!detectColor(result)) return false; + if (!detectColor(result, forceEnv)) return false; result->fg.dark = result->fg.r * 299 + result->fg.g * 587 + result->fg.b * 114 < 128000; result->bg.dark = result->bg.r * 299 + result->bg.g * 587 + result->bg.b * 114 < 128000; return true; diff --git a/src/detection/terminaltheme/terminaltheme.h b/src/detection/terminaltheme/terminaltheme.h index 08bb4ea0f..9f54c7f22 100644 --- a/src/detection/terminaltheme/terminaltheme.h +++ b/src/detection/terminaltheme/terminaltheme.h @@ -16,4 +16,4 @@ typedef struct FFTerminalThemeResult FFTerminalThemeColor bg; } FFTerminalThemeResult; -bool ffDetectTerminalTheme(FFTerminalThemeResult* result); +bool ffDetectTerminalTheme(FFTerminalThemeResult* result, bool forceEnv); diff --git a/src/fastfetch.h b/src/fastfetch.h index b7c136501..ebf44b50a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -43,6 +43,7 @@ typedef struct FFstate uint32_t logoWidth; uint32_t logoHeight; uint32_t keysHeight; + bool terminalLightTheme; FFPlatform platform; yyjson_doc* configDoc; diff --git a/src/modules/terminaltheme/terminaltheme.c b/src/modules/terminaltheme/terminaltheme.c index 21a06ec76..6444a0afd 100644 --- a/src/modules/terminaltheme/terminaltheme.c +++ b/src/modules/terminaltheme/terminaltheme.c @@ -13,7 +13,7 @@ void ffPrintTerminalTheme(FFTerminalThemeOptions* options) { FFTerminalThemeResult result = {}; - if(!ffDetectTerminalTheme(&result)) + if(!ffDetectTerminalTheme(&result, false)) { ffPrintError(FF_TERMINALTHEME_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Failed to detect terminal theme"); } @@ -81,7 +81,7 @@ void ffGenerateTerminalThemeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* option { FFTerminalThemeResult result = {}; - if(!ffDetectTerminalTheme(&result)) + if(!ffDetectTerminalTheme(&result, false)) { yyjson_mut_obj_add_str(doc, module, "error", "Failed to detect terminal theme"); return; diff --git a/src/options/display.c b/src/options/display.c index 09cfce649..bd9651801 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -364,7 +364,7 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) ffStrbufInit(&options->colorTitle); ffStrbufInit(&options->colorOutput); ffStrbufInit(&options->colorSeparator); - options->brightColor = true; + options->brightColor = !instance.state.terminalLightTheme; ffStrbufInitStatic(&options->keyValueSeparator, ": "); options->showErrors = false; @@ -387,8 +387,8 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) options->tempUnit = FF_TEMPERATURE_UNIT_CELSIUS; options->tempNdigits = 1; ffStrbufInitStatic(&options->tempColorGreen, FF_COLOR_FG_GREEN); - ffStrbufInitStatic(&options->tempColorYellow, FF_COLOR_FG_LIGHT_YELLOW); - ffStrbufInitStatic(&options->tempColorRed, FF_COLOR_FG_LIGHT_RED); + ffStrbufInitStatic(&options->tempColorYellow, instance.state.terminalLightTheme ? FF_COLOR_FG_YELLOW : FF_COLOR_FG_LIGHT_YELLOW); + ffStrbufInitStatic(&options->tempColorRed, instance.state.terminalLightTheme ? FF_COLOR_FG_RED : FF_COLOR_FG_LIGHT_RED); ffStrbufInitStatic(&options->barCharElapsed, "■"); ffStrbufInitStatic(&options->barCharTotal, "-"); @@ -397,8 +397,8 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) options->percentType = 9; options->percentNdigits = 0; ffStrbufInitStatic(&options->percentColorGreen, FF_COLOR_FG_GREEN); - ffStrbufInitStatic(&options->percentColorYellow, FF_COLOR_FG_LIGHT_YELLOW); - ffStrbufInitStatic(&options->percentColorRed, FF_COLOR_FG_LIGHT_RED); + ffStrbufInitStatic(&options->percentColorYellow, instance.state.terminalLightTheme ? FF_COLOR_FG_YELLOW : FF_COLOR_FG_LIGHT_YELLOW); + ffStrbufInitStatic(&options->percentColorRed, instance.state.terminalLightTheme ? FF_COLOR_FG_RED : FF_COLOR_FG_LIGHT_RED); options->tsVersion = true; }