mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 10:52:08 +02:00
92 lines
3.4 KiB
C
92 lines
3.4 KiB
C
#include "terminaltheme.h"
|
|
#include "common/io/io.h"
|
|
#include "util/stringUtils.h"
|
|
|
|
#include <inttypes.h>
|
|
|
|
static bool detectByEscapeCode(FFTerminalThemeResult* result)
|
|
{
|
|
int command = 0;
|
|
|
|
if (ffGetTerminalResponse("\e]10;?\e\\", "\e]%d;rgb:%" SCNx16 "/%" SCNx16 "/%" SCNx16 "\e\\", &command, &result->fg.r, &result->fg.g, &result->fg.b) == NULL)
|
|
{
|
|
if (command != 10)
|
|
return false;
|
|
if (result->fg.r > 0x0100 || result->fg.g > 0x0100 || result->fg.b > 0x0100)
|
|
result->fg.r /= 0x0100, result->fg.g /= 0x0100, result->fg.b /= 0x0100;
|
|
}
|
|
else
|
|
return false;
|
|
|
|
if (ffGetTerminalResponse("\e]11;?\e\\", "\e]%d;rgb:%" SCNx16 "/%" SCNx16 "/%" SCNx16 "\e\\", &command, &result->bg.r, &result->bg.g, &result->bg.b) == NULL)
|
|
{
|
|
if (command != 11)
|
|
return false;
|
|
if (result->bg.r > 0x0100 || result->bg.g > 0x0100 || result->bg.b > 0x0100)
|
|
result->bg.r /= 0x0100, result->bg.g /= 0x0100, result->bg.b /= 0x0100;
|
|
}
|
|
else
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
static FFTerminalThemeColor fgbgToColor(int num)
|
|
{
|
|
// https://github.com/dalance/termbg/blob/13c478a433fa182e65c401d26a1e7792a7f7f453/src/lib.rs#L251
|
|
switch (num)
|
|
{
|
|
case 0: return (FFTerminalThemeColor){ 0, 0, 0, false}; // black
|
|
case 1: return (FFTerminalThemeColor){205, 0, 0, false}; // red
|
|
case 2: return (FFTerminalThemeColor){ 0, 205, 0, false}; // green
|
|
case 3: return (FFTerminalThemeColor){205, 205, 0, false}; // yellow
|
|
case 4: return (FFTerminalThemeColor){ 0, 0, 238, false}; // blue
|
|
case 5: return (FFTerminalThemeColor){205, 0, 205, false}; // magenta
|
|
case 6: return (FFTerminalThemeColor){ 0, 205, 205, false}; // cyan
|
|
case 7: return (FFTerminalThemeColor){229, 229, 229, false}; // white
|
|
|
|
case 8: return (FFTerminalThemeColor){127, 127, 127, false}; // bright black
|
|
case 9: return (FFTerminalThemeColor){255, 0, 0, false}; // bright red
|
|
case 10: return (FFTerminalThemeColor){ 0, 255, 0, false}; // bright green
|
|
case 11: return (FFTerminalThemeColor){255, 255, 0, false}; // bright yellow
|
|
case 12: return (FFTerminalThemeColor){ 92, 92, 255, false}; // bright blue
|
|
case 13: return (FFTerminalThemeColor){255, 0, 255, false}; // bright magenta
|
|
case 14: return (FFTerminalThemeColor){ 0, 255, 255, false}; // bright cyan
|
|
case 15: return (FFTerminalThemeColor){255, 255, 255, false}; // bright white
|
|
|
|
default: return (FFTerminalThemeColor){ 0, 0, 0, false}; // invalid
|
|
}
|
|
}
|
|
|
|
static bool detectByEnv(FFTerminalThemeResult* result)
|
|
{
|
|
const char* color = getenv("COLORFGBG"); // 7;0
|
|
|
|
if (!ffStrSet(color))
|
|
return false;
|
|
|
|
int f, g;
|
|
if (sscanf(color, "%d;%d", &f, &g) != 2)
|
|
return false;
|
|
|
|
result->fg = fgbgToColor(f);
|
|
result->bg = fgbgToColor(g);
|
|
return true;
|
|
}
|
|
|
|
static inline bool detectColor(FFTerminalThemeResult* result)
|
|
{
|
|
if (detectByEscapeCode(result))
|
|
return true;
|
|
|
|
return detectByEnv(result);
|
|
}
|
|
|
|
bool ffDetectTerminalTheme(FFTerminalThemeResult* result)
|
|
{
|
|
if (!detectColor(result)) 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;
|
|
}
|